From 07a2787e09603e891f1a9bcc130b6c41b3896d6a Mon Sep 17 00:00:00 2001
From: Per Cederqvist <ceder@lysator.liu.se>
Date: Fri, 11 Jul 2014 09:33:40 +0200
Subject: [PATCH] Imported Bugzilla 2.16.

---
 .cvsignore                                    |     3 +-
 Attachment.pm                                 |    97 +
 Bug.pm                                        |    51 +-
 CGI.pl                                        |  1091 +-
 CVS/Entries                                   |   152 +-
 CVS/Entries.Log                               |    12 -
 CVS/Tag                                       |     2 +-
 RelationSet.pm                                |     6 +-
 Token.pm                                      |   186 +-
 UPGRADING-pre-2.8                             |     2 +-
 attachment.cgi                                |   788 +
 booleanchart.html                             |    79 -
 bug_form.pl                                   |   824 +-
 bug_status.html                               |    10 +-
 buglist.cgi                                   |  1624 +-
 bugwritinghelp.html                           |   673 +-
 bugzilla.dtd                                  |    38 +-
 changepassword.cgi                            |     4 +-
 checksetup.pl                                 |   808 +-
 colchange.cgi                                 |    71 +-
 collectstats.pl                               |     2 +-
 confirmhelp.html                              |    49 +-
 contrib/CVS/Entries                           |    25 +-
 contrib/CVS/Entries.Log                       |     2 -
 contrib/CVS/Tag                               |     2 +-
 contrib/bug_email.pl                          |    14 +-
 contrib/bugzilla_email_append.pl              |     2 +-
 contrib/cmdline/CVS/Entries                   |     4 +
 contrib/cmdline/CVS/Repository                |     1 +
 contrib/cmdline/CVS/Root                      |     1 +
 contrib/cmdline/CVS/Tag                       |     1 +
 contrib/cmdline/buglist                       |    94 +
 contrib/cmdline/bugs                          |    31 +
 contrib/cmdline/query.conf                    |    49 +
 contrib/gnats2bz.pl                           |   126 +-
 contrib/jb2bz.py                              |   303 +
 createaccount.cgi                             |    99 +-
 createattachment.cgi                          |   116 -
 css/CVS/Entries                               |     3 +
 css/CVS/Repository                            |     1 +
 css/CVS/Root                                  |     1 +
 css/CVS/Tag                                   |     1 +
 css/buglist.css                               |    38 +
 css/panel.css                                 |    37 +
 defparams.pl                                  |   290 +-
 describecomponents.cgi                        |   180 +-
 describekeywords.cgi                          |    72 +-
 docs/CVS/Entries                              |     4 +-
 docs/CVS/Tag                                  |     2 +-
 docs/README.docs                              |    52 +-
 docs/html/Bugzilla-Guide.html                 | 20150 ++++++----------
 docs/html/CVS/Entries                         |   116 +-
 docs/html/CVS/Tag                             |     2 +-
 docs/html/about.html                          |    55 +-
 docs/html/aboutthisguide.html                 |    57 +-
 docs/html/administration.html                 |   194 +-
 docs/html/bonsai.html                         |   154 -
 docs/html/bzhacking.html                      |   231 -
 docs/html/cmdline.html                        |   229 +-
 docs/html/contributors.html                   |   144 -
 docs/html/conventions.html                    |   234 +-
 docs/html/copyright.html                      |   518 +-
 docs/html/credits.html                        |    74 +-
 docs/html/cust-templates.html                 |   585 +
 docs/html/cvs.html                            |   168 -
 docs/html/database.html                       |    45 +-
 docs/html/dbdoc.html                          |   344 +-
 docs/html/dbschema.html                       |    33 +-
 docs/html/disclaimer.html                     |    48 +-
 docs/html/downloadlinks.html                  |   232 -
 docs/html/errata.html                         |   273 -
 docs/html/extraconfig.html                    |   726 +
 docs/html/faq.html                            |  2955 +--
 docs/html/feedback.html                       |   155 -
 docs/html/future.html                         |   740 -
 docs/html/geninstall.html                     |   421 -
 docs/html/gfdl.html                           |   211 -
 docs/html/gfdl_0.html                         |   159 -
 docs/html/gfdl_1.html                         |   200 -
 docs/html/gfdl_10.html                        |   156 -
 docs/html/gfdl_2.html                         |   150 -
 docs/html/gfdl_3.html                         |   174 -
 docs/html/gfdl_4.html                         |   280 -
 docs/html/gfdl_5.html                         |   159 -
 docs/html/gfdl_6.html                         |   149 -
 docs/html/gfdl_7.html                         |   153 -
 docs/html/gfdl_8.html                         |   148 -
 docs/html/gfdl_9.html                         |   145 -
 docs/html/gfdl_howto.html                     |   166 -
 docs/html/glossary.html                       |   634 +-
 docs/html/granttables.html                    |   344 -
 docs/html/groups.html                         |   276 +
 docs/html/hintsandtips.html                   |   308 +
 docs/html/how.html                            |  1254 +-
 docs/html/index.html                          |   879 +-
 docs/html/init4me.html                        |   459 -
 docs/html/installation.html                   |   262 +-
 docs/html/integration.html                    |   176 +-
 .../{bsdinstall.html => introduction.html}    |    76 +-
 docs/html/newversions.html                    |    65 +-
 docs/html/osx.html                            |   221 +-
 docs/html/parameters.html                     |   435 +
 docs/html/patches.html                        |    72 +-
 docs/html/postinstall-check.html              |   559 -
 docs/html/programadmin.html                   |  1088 +-
 docs/html/quicksearch.html                    |   191 -
 docs/html/rewrite.html                        |    88 +-
 docs/html/rhbugzilla.html                     |    50 +-
 docs/html/scm.html                            |   160 -
 docs/html/security.html                       |   357 +-
 docs/html/setperl.html                        |   308 -
 docs/html/stepbystep.html                     |  2417 +-
 docs/html/tinderbox.html                      |   138 -
 docs/html/translations.html                   |   150 -
 docs/html/troubleshooting.html                |   309 +
 docs/html/upgrading.html                      |   178 +
 docs/html/useradmin.html                      |   720 +-
 docs/html/userpreferences.html                |   240 +
 docs/html/using.html                          |   172 +-
 docs/html/usingbz-conc.html                   |   146 -
 ...ariant_fenris.html => variant-fenris.html} |    37 +-
 docs/html/variant-issuezilla.html             |   150 +
 ...nt_perforce.html => variant-perforce.html} |    50 +-
 ...ariant_scarab.html => variant-scarab.html} |    47 +-
 ...rceforge.html => variant-sourceforge.html} |    54 +-
 docs/html/variant_issuezilla.html             |   153 -
 docs/html/variants.html                       |    63 +-
 docs/html/voting.html                         |   195 +
 docs/html/whatis.html                         |   137 +-
 docs/html/why.html                            |   167 +-
 docs/html/win32.html                          |  1475 +-
 docs/images/CVS/Entries                       |    12 +-
 docs/images/CVS/Tag                           |     2 +-
 docs/images/caution.gif                       |   Bin 260 -> 134 bytes
 docs/images/tip.gif                           |   Bin 2432 -> 1229 bytes
 docs/images/warning.gif                       |   Bin 151 -> 140 bytes
 docs/rel_notes.txt                            |   356 +-
 docs/sgml/Bugzilla-Guide.sgml                 |   176 +-
 docs/sgml/CVS/Entries                         |    34 +-
 docs/sgml/CVS/Tag                             |     2 +-
 docs/sgml/about.sgml                          |   155 +-
 docs/sgml/administration.sgml                 |  2432 +-
 docs/sgml/conventions.sgml                    |   129 +-
 docs/sgml/database.sgml                       |   495 +-
 docs/sgml/dbschema.mysql                      |   308 -
 docs/sgml/faq.sgml                            |   860 +-
 docs/sgml/future.sgml                         |   619 -
 docs/sgml/gd-makefile.patch                   |    22 +
 docs/sgml/gfdl.sgml                           |   728 +-
 docs/sgml/glossary.sgml                       |   608 +-
 docs/sgml/index.sgml                          |     1 +
 docs/sgml/installation.sgml                   |  3731 +--
 docs/sgml/integration.sgml                    |   117 +-
 docs/sgml/introduction.sgml                   |   149 +
 docs/sgml/patches.sgml                        |   389 +-
 docs/sgml/requiredsoftware.sgml               |    86 -
 docs/sgml/using.sgml                          |  1410 +-
 docs/sgml/variants.sgml                       |   112 +-
 docs/txt/Bugzilla-Guide.txt                   |  7122 ++----
 docs/txt/CVS/Entries                          |     2 +-
 docs/txt/CVS/Tag                              |     2 +-
 doeditparams.cgi                              |     8 +-
 doeditvotes.cgi                               |   172 -
 duplicates.cgi                                |   384 +-
 editattachstatuses.cgi                        |   344 +
 editcomponents.cgi                            |    47 +-
 editgroups.cgi                                |    37 +-
 editkeywords.cgi                              |     4 +-
 editmilestones.cgi                            |     9 +-
 editparams.cgi                                |    10 +-
 editproducts.cgi                              |    75 +-
 editusers.cgi                                 |   260 +-
 editversions.cgi                              |     9 +-
 enter_bug.cgi                                 |   665 +-
 globals.pl                                    |   835 +-
 help.html                                     |     8 +-
 helpemailquery.html                           |    16 +-
 how_to_mail.html                              |     7 +
 importxml.pl                                  |    20 +-
 index.cgi                                     |    63 +
 index.html                                    |    98 -
 long_list.cgi                                 |   172 +-
 move.pl                                       |    17 +-
 new_comment.cgi                               |    59 -
 notargetmilestone.html                        |     6 +
 post_bug.cgi                                  |   298 +-
 process_bug.cgi                               |   751 +-
 processmail                                   |   137 +-
 query.cgi                                     |   979 +-
 queryhelp.cgi                                 |   210 +-
 quicksearch.html                              |    79 +-
 quicksearch.js                                |    20 +-
 quicksearchhack.html                          |    43 +-
 quips.cgi                                     |    76 +-
 relogin.cgi                                   |    48 +-
 reports.cgi                                   |    53 +-
 robots.txt                                    |     2 +-
 runtests.sh                                   |     2 +-
 sanitycheck.cgi                               |   265 +-
 show_activity.cgi                             |    26 +-
 show_bug.cgi                                  |    33 +-
 showattachment.cgi                            |    34 +-
 showdependencygraph.cgi                       |   269 +-
 showdependencytree.cgi                        |   214 +-
 showvotes.cgi                                 |   177 -
 sidebar.cgi                                   |    77 +
 syncshadowdb                                  |    95 +-
 t/001compile.t                                |    89 +-
 t/002goodperl.t                               |   119 +
 t/003safesys.t                                |    49 +-
 t/004template.t                               |   126 +
 t/005no_tabs.t                                |    54 +
 t/CVS/Entries                                 |     7 +-
 t/CVS/Tag                                     |     2 +-
 t/Support/CVS/Entries                         |     5 +-
 t/Support/CVS/Tag                             |     2 +-
 t/Support/Templates.pm                        |    92 +
 template/.cvsignore                           |     3 +
 template/CVS/Entries                          |     2 +
 template/CVS/Entries.Log                      |     2 +
 template/CVS/Repository                       |     1 +
 template/CVS/Root                             |     1 +
 template/CVS/Tag                              |     1 +
 template/en/.cvsignore                        |     2 +
 template/en/CVS/Entries                       |     2 +
 template/en/CVS/Repository                    |     1 +
 template/en/CVS/Root                          |     1 +
 template/en/CVS/Tag                           |     1 +
 template/en/default/CVS/Entries               |    10 +
 template/en/default/CVS/Entries.Log           |     2 +
 template/en/default/CVS/Repository            |     1 +
 template/en/default/CVS/Root                  |     1 +
 template/en/default/CVS/Tag                   |     1 +
 template/en/default/account/CVS/Entries       |     7 +
 template/en/default/account/CVS/Repository    |     1 +
 template/en/default/account/CVS/Root          |     1 +
 template/en/default/account/CVS/Tag           |     1 +
 .../en/default/account/cancel-token.txt.tmpl  |    39 +
 template/en/default/account/create.html.tmpl  |    58 +
 template/en/default/account/created.html.tmpl |    42 +
 template/en/default/account/email/CVS/Entries |     4 +
 .../en/default/account/email/CVS/Repository   |     1 +
 template/en/default/account/email/CVS/Root    |     1 +
 template/en/default/account/email/CVS/Tag     |     1 +
 .../default/account/email/change-new.txt.tmpl |    39 +
 .../default/account/email/change-old.txt.tmpl |    44 +
 .../default/account/email/confirm.html.tmpl   |    47 +
 template/en/default/account/exists.html.tmpl  |    38 +
 .../en/default/account/password/CVS/Entries   |     3 +
 .../default/account/password/CVS/Repository   |     1 +
 template/en/default/account/password/CVS/Root |     1 +
 template/en/default/account/password/CVS/Tag  |     1 +
 .../password/forgotten-password.txt.tmpl      |    38 +
 .../password/set-forgotten-password.html.tmpl |    55 +
 template/en/default/account/prefs/CVS/Entries |     6 +
 .../en/default/account/prefs/CVS/Repository   |     1 +
 template/en/default/account/prefs/CVS/Root    |     1 +
 template/en/default/account/prefs/CVS/Tag     |     1 +
 .../default/account/prefs/account.html.tmpl   |    99 +
 .../en/default/account/prefs/email.html.tmpl  |   162 +
 .../en/default/account/prefs/footer.html.tmpl |    76 +
 .../account/prefs/permissions.html.tmpl       |    57 +
 .../en/default/account/prefs/prefs.html.tmpl  |   123 +
 template/en/default/admin/CVS/Entries         |     1 +
 template/en/default/admin/CVS/Entries.Log     |     2 +
 template/en/default/admin/CVS/Repository      |     1 +
 template/en/default/admin/CVS/Root            |     1 +
 template/en/default/admin/CVS/Tag             |     1 +
 .../en/default/admin/attachstatus/CVS/Entries |     5 +
 .../default/admin/attachstatus/CVS/Repository |     1 +
 .../en/default/admin/attachstatus/CVS/Root    |     1 +
 .../en/default/admin/attachstatus/CVS/Tag     |     1 +
 .../admin/attachstatus/create.html.tmpl       |    77 +
 .../admin/attachstatus/delete.html.tmpl       |    55 +
 .../default/admin/attachstatus/edit.html.tmpl |    81 +
 .../default/admin/attachstatus/list.html.tmpl |    99 +
 template/en/default/attachment/CVS/Entries    |     8 +
 template/en/default/attachment/CVS/Repository |     1 +
 template/en/default/attachment/CVS/Root       |     1 +
 template/en/default/attachment/CVS/Tag        |     1 +
 .../attachment/content-types.html.tmpl        |    27 +
 .../en/default/attachment/create.html.tmpl    |   130 +
 .../en/default/attachment/created.html.tmpl   |    66 +
 template/en/default/attachment/edit.html.tmpl |   226 +
 template/en/default/attachment/list.html.tmpl |    81 +
 .../attachment/show-multiple.html.tmpl        |    98 +
 .../en/default/attachment/updated.html.tmpl   |    52 +
 template/en/default/bug/CVS/Entries           |    12 +
 template/en/default/bug/CVS/Repository        |     1 +
 template/en/default/bug/CVS/Root              |     1 +
 template/en/default/bug/CVS/Tag               |     1 +
 template/en/default/bug/activity/CVS/Entries  |     3 +
 .../en/default/bug/activity/CVS/Repository    |     1 +
 template/en/default/bug/activity/CVS/Root     |     1 +
 template/en/default/bug/activity/CVS/Tag      |     1 +
 .../en/default/bug/activity/show.html.tmpl    |    43 +
 .../en/default/bug/activity/table.html.tmpl   |    91 +
 template/en/default/bug/choose-xml.html.tmpl  |    51 +
 template/en/default/bug/choose.html.tmpl      |    36 +
 template/en/default/bug/comments.html.tmpl    |    53 +
 template/en/default/bug/create/CVS/Entries    |     6 +
 template/en/default/bug/create/CVS/Repository |     1 +
 template/en/default/bug/create/CVS/Root       |     1 +
 template/en/default/bug/create/CVS/Tag        |     1 +
 .../en/default/bug/create/comment.txt.tmpl    |    26 +
 .../en/default/bug/create/create.html.tmpl    |   260 +
 .../en/default/bug/create/created.html.tmpl   |    30 +
 .../bug/create/make-template.html.tmpl        |    33 +
 .../default/bug/create/user-message.html.tmpl |    34 +
 .../en/default/bug/dependency-graph.html.tmpl |   106 +
 .../en/default/bug/dependency-tree.html.tmpl  |   198 +
 template/en/default/bug/edit.html.tmpl        |   540 +
 template/en/default/bug/navigate.html.tmpl    |    54 +
 template/en/default/bug/process/CVS/Entries   |     6 +
 .../en/default/bug/process/CVS/Repository     |     1 +
 template/en/default/bug/process/CVS/Root      |     1 +
 template/en/default/bug/process/CVS/Tag       |     1 +
 .../bug/process/confirm-duplicate.html.tmpl   |    73 +
 .../en/default/bug/process/midair.html.tmpl   |    75 +
 .../en/default/bug/process/next.html.tmpl     |    32 +
 .../en/default/bug/process/results.html.tmpl  |    52 +
 .../bug/process/verify-new-product.html.tmpl  |   101 +
 .../en/default/bug/show-multiple.html.tmpl    |   156 +
 template/en/default/bug/votes/CVS/Entries     |     4 +
 template/en/default/bug/votes/CVS/Repository  |     1 +
 template/en/default/bug/votes/CVS/Root        |     1 +
 template/en/default/bug/votes/CVS/Tag         |     1 +
 .../en/default/bug/votes/delete-all.html.tmpl |    50 +
 .../default/bug/votes/list-for-bug.html.tmpl  |    57 +
 .../default/bug/votes/list-for-user.html.tmpl |   132 +
 template/en/default/global/CVS/Entries        |    11 +
 template/en/default/global/CVS/Repository     |     1 +
 template/en/default/global/CVS/Root           |     1 +
 template/en/default/global/CVS/Tag            |     1 +
 template/en/default/global/banner.html.tmpl   |    34 +
 .../default/global/choose-product.html.tmpl   |    48 +
 .../en/default/global/code-error.html.tmpl    |    64 +
 template/en/default/global/footer.html.tmpl   |    61 +
 template/en/default/global/header.html.tmpl   |   103 +
 .../en/default/global/hidden-fields.html.tmpl |    33 +
 template/en/default/global/message.html.tmpl  |    42 +
 .../en/default/global/select-menu.html.tmpl   |    56 +
 .../en/default/global/useful-links.html.tmpl  |   124 +
 .../en/default/global/user-error.html.tmpl    |    45 +
 template/en/default/index.html.tmpl           |    91 +
 template/en/default/list/CVS/Entries          |     9 +
 template/en/default/list/CVS/Repository       |     1 +
 template/en/default/list/CVS/Root             |     1 +
 template/en/default/list/CVS/Tag              |     1 +
 .../en/default/list/change-columns.html.tmpl  |    51 +
 .../en/default/list/edit-multiple.html.tmpl   |   316 +
 template/en/default/list/list-rdf.rdf.tmpl    |    54 +
 .../en/default/list/list-simple.html.tmpl     |    53 +
 template/en/default/list/list.html.tmpl       |   162 +
 template/en/default/list/quips.html.tmpl      |    72 +
 .../en/default/list/server-push.html.tmpl     |    41 +
 template/en/default/list/table.html.tmpl      |   150 +
 template/en/default/reports/CVS/Entries       |     6 +
 template/en/default/reports/CVS/Repository    |     1 +
 template/en/default/reports/CVS/Root          |     1 +
 template/en/default/reports/CVS/Tag           |     1 +
 .../en/default/reports/components.html.tmpl   |    97 +
 .../reports/duplicates-simple.html.tmpl       |    42 +
 .../reports/duplicates-table.html.tmpl        |   142 +
 .../en/default/reports/duplicates.html.tmpl   |   175 +
 .../en/default/reports/keywords.html.tmpl     |    75 +
 template/en/default/search/CVS/Entries        |     5 +
 template/en/default/search/CVS/Repository     |     1 +
 template/en/default/search/CVS/Root           |     1 +
 template/en/default/search/CVS/Tag            |     1 +
 .../default/search/boolean-charts.html.tmpl   |   118 +
 template/en/default/search/form.html.tmpl     |   672 +
 template/en/default/search/knob.html.tmpl     |    99 +
 template/en/default/search/search.html.tmpl   |    51 +
 template/en/default/sidebar.xul.tmpl          |   119 +
 token.cgi                                     |   215 +-
 userprefs.cgi                                 |   776 +-
 votehelp.html                                 |    38 +-
 votes.cgi                                     |   352 +
 whineatnews.pl                                |     5 +-
 xml.cgi                                       |    41 +-
 381 files changed, 42193 insertions(+), 49127 deletions(-)
 create mode 100644 Attachment.pm
 create mode 100755 attachment.cgi
 delete mode 100644 booleanchart.html
 delete mode 100644 contrib/CVS/Entries.Log
 create mode 100644 contrib/cmdline/CVS/Entries
 create mode 100644 contrib/cmdline/CVS/Repository
 create mode 100644 contrib/cmdline/CVS/Root
 create mode 100644 contrib/cmdline/CVS/Tag
 create mode 100755 contrib/cmdline/buglist
 create mode 100755 contrib/cmdline/bugs
 create mode 100644 contrib/cmdline/query.conf
 create mode 100644 contrib/jb2bz.py
 delete mode 100755 createattachment.cgi
 create mode 100644 css/CVS/Entries
 create mode 100644 css/CVS/Repository
 create mode 100644 css/CVS/Root
 create mode 100644 css/CVS/Tag
 create mode 100644 css/buglist.css
 create mode 100644 css/panel.css
 delete mode 100644 docs/html/bonsai.html
 delete mode 100644 docs/html/bzhacking.html
 delete mode 100644 docs/html/contributors.html
 create mode 100644 docs/html/cust-templates.html
 delete mode 100644 docs/html/cvs.html
 delete mode 100644 docs/html/downloadlinks.html
 delete mode 100644 docs/html/errata.html
 create mode 100644 docs/html/extraconfig.html
 delete mode 100644 docs/html/feedback.html
 delete mode 100644 docs/html/future.html
 delete mode 100644 docs/html/geninstall.html
 delete mode 100644 docs/html/gfdl.html
 delete mode 100644 docs/html/gfdl_0.html
 delete mode 100644 docs/html/gfdl_1.html
 delete mode 100644 docs/html/gfdl_10.html
 delete mode 100644 docs/html/gfdl_2.html
 delete mode 100644 docs/html/gfdl_3.html
 delete mode 100644 docs/html/gfdl_4.html
 delete mode 100644 docs/html/gfdl_5.html
 delete mode 100644 docs/html/gfdl_6.html
 delete mode 100644 docs/html/gfdl_7.html
 delete mode 100644 docs/html/gfdl_8.html
 delete mode 100644 docs/html/gfdl_9.html
 delete mode 100644 docs/html/gfdl_howto.html
 delete mode 100644 docs/html/granttables.html
 create mode 100644 docs/html/groups.html
 create mode 100644 docs/html/hintsandtips.html
 delete mode 100644 docs/html/init4me.html
 rename docs/html/{bsdinstall.html => introduction.html} (60%)
 create mode 100644 docs/html/parameters.html
 delete mode 100644 docs/html/postinstall-check.html
 delete mode 100644 docs/html/quicksearch.html
 delete mode 100644 docs/html/scm.html
 delete mode 100644 docs/html/setperl.html
 delete mode 100644 docs/html/tinderbox.html
 delete mode 100644 docs/html/translations.html
 create mode 100644 docs/html/troubleshooting.html
 create mode 100644 docs/html/upgrading.html
 create mode 100644 docs/html/userpreferences.html
 delete mode 100644 docs/html/usingbz-conc.html
 rename docs/html/{variant_fenris.html => variant-fenris.html} (68%)
 create mode 100644 docs/html/variant-issuezilla.html
 rename docs/html/{variant_perforce.html => variant-perforce.html} (65%)
 rename docs/html/{variant_scarab.html => variant-scarab.html} (67%)
 rename docs/html/{variant_sourceforge.html => variant-sourceforge.html} (63%)
 delete mode 100644 docs/html/variant_issuezilla.html
 create mode 100644 docs/html/voting.html
 delete mode 100644 docs/sgml/future.sgml
 create mode 100644 docs/sgml/gd-makefile.patch
 create mode 100644 docs/sgml/introduction.sgml
 delete mode 100644 docs/sgml/requiredsoftware.sgml
 delete mode 100755 doeditvotes.cgi
 create mode 100755 editattachstatuses.cgi
 create mode 100755 index.cgi
 delete mode 100644 index.html
 delete mode 100755 new_comment.cgi
 delete mode 100755 showvotes.cgi
 create mode 100755 sidebar.cgi
 create mode 100644 t/002goodperl.t
 create mode 100644 t/004template.t
 create mode 100644 t/005no_tabs.t
 create mode 100644 t/Support/Templates.pm
 create mode 100644 template/.cvsignore
 create mode 100644 template/CVS/Entries
 create mode 100644 template/CVS/Entries.Log
 create mode 100644 template/CVS/Repository
 create mode 100644 template/CVS/Root
 create mode 100644 template/CVS/Tag
 create mode 100644 template/en/.cvsignore
 create mode 100644 template/en/CVS/Entries
 create mode 100644 template/en/CVS/Repository
 create mode 100644 template/en/CVS/Root
 create mode 100644 template/en/CVS/Tag
 create mode 100644 template/en/default/CVS/Entries
 create mode 100644 template/en/default/CVS/Entries.Log
 create mode 100644 template/en/default/CVS/Repository
 create mode 100644 template/en/default/CVS/Root
 create mode 100644 template/en/default/CVS/Tag
 create mode 100644 template/en/default/account/CVS/Entries
 create mode 100644 template/en/default/account/CVS/Repository
 create mode 100644 template/en/default/account/CVS/Root
 create mode 100644 template/en/default/account/CVS/Tag
 create mode 100644 template/en/default/account/cancel-token.txt.tmpl
 create mode 100644 template/en/default/account/create.html.tmpl
 create mode 100644 template/en/default/account/created.html.tmpl
 create mode 100644 template/en/default/account/email/CVS/Entries
 create mode 100644 template/en/default/account/email/CVS/Repository
 create mode 100644 template/en/default/account/email/CVS/Root
 create mode 100644 template/en/default/account/email/CVS/Tag
 create mode 100644 template/en/default/account/email/change-new.txt.tmpl
 create mode 100644 template/en/default/account/email/change-old.txt.tmpl
 create mode 100644 template/en/default/account/email/confirm.html.tmpl
 create mode 100644 template/en/default/account/exists.html.tmpl
 create mode 100644 template/en/default/account/password/CVS/Entries
 create mode 100644 template/en/default/account/password/CVS/Repository
 create mode 100644 template/en/default/account/password/CVS/Root
 create mode 100644 template/en/default/account/password/CVS/Tag
 create mode 100644 template/en/default/account/password/forgotten-password.txt.tmpl
 create mode 100644 template/en/default/account/password/set-forgotten-password.html.tmpl
 create mode 100644 template/en/default/account/prefs/CVS/Entries
 create mode 100644 template/en/default/account/prefs/CVS/Repository
 create mode 100644 template/en/default/account/prefs/CVS/Root
 create mode 100644 template/en/default/account/prefs/CVS/Tag
 create mode 100644 template/en/default/account/prefs/account.html.tmpl
 create mode 100644 template/en/default/account/prefs/email.html.tmpl
 create mode 100644 template/en/default/account/prefs/footer.html.tmpl
 create mode 100644 template/en/default/account/prefs/permissions.html.tmpl
 create mode 100644 template/en/default/account/prefs/prefs.html.tmpl
 create mode 100644 template/en/default/admin/CVS/Entries
 create mode 100644 template/en/default/admin/CVS/Entries.Log
 create mode 100644 template/en/default/admin/CVS/Repository
 create mode 100644 template/en/default/admin/CVS/Root
 create mode 100644 template/en/default/admin/CVS/Tag
 create mode 100644 template/en/default/admin/attachstatus/CVS/Entries
 create mode 100644 template/en/default/admin/attachstatus/CVS/Repository
 create mode 100644 template/en/default/admin/attachstatus/CVS/Root
 create mode 100644 template/en/default/admin/attachstatus/CVS/Tag
 create mode 100644 template/en/default/admin/attachstatus/create.html.tmpl
 create mode 100644 template/en/default/admin/attachstatus/delete.html.tmpl
 create mode 100644 template/en/default/admin/attachstatus/edit.html.tmpl
 create mode 100644 template/en/default/admin/attachstatus/list.html.tmpl
 create mode 100644 template/en/default/attachment/CVS/Entries
 create mode 100644 template/en/default/attachment/CVS/Repository
 create mode 100644 template/en/default/attachment/CVS/Root
 create mode 100644 template/en/default/attachment/CVS/Tag
 create mode 100644 template/en/default/attachment/content-types.html.tmpl
 create mode 100644 template/en/default/attachment/create.html.tmpl
 create mode 100644 template/en/default/attachment/created.html.tmpl
 create mode 100644 template/en/default/attachment/edit.html.tmpl
 create mode 100644 template/en/default/attachment/list.html.tmpl
 create mode 100644 template/en/default/attachment/show-multiple.html.tmpl
 create mode 100644 template/en/default/attachment/updated.html.tmpl
 create mode 100644 template/en/default/bug/CVS/Entries
 create mode 100644 template/en/default/bug/CVS/Repository
 create mode 100644 template/en/default/bug/CVS/Root
 create mode 100644 template/en/default/bug/CVS/Tag
 create mode 100644 template/en/default/bug/activity/CVS/Entries
 create mode 100644 template/en/default/bug/activity/CVS/Repository
 create mode 100644 template/en/default/bug/activity/CVS/Root
 create mode 100644 template/en/default/bug/activity/CVS/Tag
 create mode 100644 template/en/default/bug/activity/show.html.tmpl
 create mode 100644 template/en/default/bug/activity/table.html.tmpl
 create mode 100644 template/en/default/bug/choose-xml.html.tmpl
 create mode 100644 template/en/default/bug/choose.html.tmpl
 create mode 100644 template/en/default/bug/comments.html.tmpl
 create mode 100644 template/en/default/bug/create/CVS/Entries
 create mode 100644 template/en/default/bug/create/CVS/Repository
 create mode 100644 template/en/default/bug/create/CVS/Root
 create mode 100644 template/en/default/bug/create/CVS/Tag
 create mode 100644 template/en/default/bug/create/comment.txt.tmpl
 create mode 100644 template/en/default/bug/create/create.html.tmpl
 create mode 100644 template/en/default/bug/create/created.html.tmpl
 create mode 100644 template/en/default/bug/create/make-template.html.tmpl
 create mode 100644 template/en/default/bug/create/user-message.html.tmpl
 create mode 100644 template/en/default/bug/dependency-graph.html.tmpl
 create mode 100644 template/en/default/bug/dependency-tree.html.tmpl
 create mode 100644 template/en/default/bug/edit.html.tmpl
 create mode 100644 template/en/default/bug/navigate.html.tmpl
 create mode 100644 template/en/default/bug/process/CVS/Entries
 create mode 100644 template/en/default/bug/process/CVS/Repository
 create mode 100644 template/en/default/bug/process/CVS/Root
 create mode 100644 template/en/default/bug/process/CVS/Tag
 create mode 100644 template/en/default/bug/process/confirm-duplicate.html.tmpl
 create mode 100644 template/en/default/bug/process/midair.html.tmpl
 create mode 100644 template/en/default/bug/process/next.html.tmpl
 create mode 100644 template/en/default/bug/process/results.html.tmpl
 create mode 100644 template/en/default/bug/process/verify-new-product.html.tmpl
 create mode 100644 template/en/default/bug/show-multiple.html.tmpl
 create mode 100644 template/en/default/bug/votes/CVS/Entries
 create mode 100644 template/en/default/bug/votes/CVS/Repository
 create mode 100644 template/en/default/bug/votes/CVS/Root
 create mode 100644 template/en/default/bug/votes/CVS/Tag
 create mode 100644 template/en/default/bug/votes/delete-all.html.tmpl
 create mode 100644 template/en/default/bug/votes/list-for-bug.html.tmpl
 create mode 100644 template/en/default/bug/votes/list-for-user.html.tmpl
 create mode 100644 template/en/default/global/CVS/Entries
 create mode 100644 template/en/default/global/CVS/Repository
 create mode 100644 template/en/default/global/CVS/Root
 create mode 100644 template/en/default/global/CVS/Tag
 create mode 100644 template/en/default/global/banner.html.tmpl
 create mode 100644 template/en/default/global/choose-product.html.tmpl
 create mode 100644 template/en/default/global/code-error.html.tmpl
 create mode 100644 template/en/default/global/footer.html.tmpl
 create mode 100644 template/en/default/global/header.html.tmpl
 create mode 100644 template/en/default/global/hidden-fields.html.tmpl
 create mode 100644 template/en/default/global/message.html.tmpl
 create mode 100644 template/en/default/global/select-menu.html.tmpl
 create mode 100644 template/en/default/global/useful-links.html.tmpl
 create mode 100644 template/en/default/global/user-error.html.tmpl
 create mode 100644 template/en/default/index.html.tmpl
 create mode 100644 template/en/default/list/CVS/Entries
 create mode 100644 template/en/default/list/CVS/Repository
 create mode 100644 template/en/default/list/CVS/Root
 create mode 100644 template/en/default/list/CVS/Tag
 create mode 100644 template/en/default/list/change-columns.html.tmpl
 create mode 100644 template/en/default/list/edit-multiple.html.tmpl
 create mode 100644 template/en/default/list/list-rdf.rdf.tmpl
 create mode 100644 template/en/default/list/list-simple.html.tmpl
 create mode 100644 template/en/default/list/list.html.tmpl
 create mode 100644 template/en/default/list/quips.html.tmpl
 create mode 100644 template/en/default/list/server-push.html.tmpl
 create mode 100644 template/en/default/list/table.html.tmpl
 create mode 100644 template/en/default/reports/CVS/Entries
 create mode 100644 template/en/default/reports/CVS/Repository
 create mode 100644 template/en/default/reports/CVS/Root
 create mode 100644 template/en/default/reports/CVS/Tag
 create mode 100644 template/en/default/reports/components.html.tmpl
 create mode 100644 template/en/default/reports/duplicates-simple.html.tmpl
 create mode 100644 template/en/default/reports/duplicates-table.html.tmpl
 create mode 100644 template/en/default/reports/duplicates.html.tmpl
 create mode 100644 template/en/default/reports/keywords.html.tmpl
 create mode 100644 template/en/default/search/CVS/Entries
 create mode 100644 template/en/default/search/CVS/Repository
 create mode 100644 template/en/default/search/CVS/Root
 create mode 100644 template/en/default/search/CVS/Tag
 create mode 100644 template/en/default/search/boolean-charts.html.tmpl
 create mode 100644 template/en/default/search/form.html.tmpl
 create mode 100644 template/en/default/search/knob.html.tmpl
 create mode 100644 template/en/default/search/search.html.tmpl
 create mode 100644 template/en/default/sidebar.xul.tmpl
 create mode 100644 votes.cgi

diff --git a/.cvsignore b/.cvsignore
index 64432ca1e..cba381bab 100644
--- a/.cvsignore
+++ b/.cvsignore
@@ -2,4 +2,5 @@
 graphs
 data
 localconfig
-shadow
+index.html
+old-params.txt
diff --git a/Attachment.pm b/Attachment.pm
new file mode 100644
index 000000000..23e634276
--- /dev/null
+++ b/Attachment.pm
@@ -0,0 +1,97 @@
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is the Bugzilla Bug Tracking System.
+#
+# The Initial Developer of the Original Code is Netscape Communications
+# Corporation. Portions created by Netscape are
+# Copyright (C) 1998 Netscape Communications Corporation. All
+# Rights Reserved.
+#
+# Contributor(s): Terry Weissman <terry@mozilla.org>
+#                 Myk Melez <myk@mozilla.org>
+
+############################################################################
+# Module Initialization
+############################################################################
+
+use diagnostics;
+use strict;
+
+package Attachment;
+
+# This module requires that its caller have said "require CGI.pl" to import
+# relevant functions from that script and its companion globals.pl.
+
+############################################################################
+# Functions
+############################################################################
+
+sub query
+{
+  # Retrieves and returns an array of attachment records for a given bug. 
+  # This data should be given to attachment/list.atml in an
+  # "attachments" variable.
+  my ($bugid) = @_;
+
+  my $in_editbugs = &::UserInGroup("editbugs");
+
+  # Retrieve a list of attachments for this bug and write them into an array
+  # of hashes in which each hash represents a single attachment.
+  &::SendSQL("
+              SELECT attach_id, creation_ts, mimetype, description, ispatch, 
+               isobsolete, submitter_id 
+              FROM attachments WHERE bug_id = $bugid ORDER BY attach_id
+            ");
+  my @attachments = ();
+  while (&::MoreSQLData()) {
+    my %a;
+    my $submitter_id;
+    ($a{'attachid'}, $a{'date'}, $a{'contenttype'}, $a{'description'},
+     $a{'ispatch'}, $a{'isobsolete'}, $submitter_id) = &::FetchSQLData();
+
+    # Format the attachment's creation/modification date into a standard
+    # format (YYYY-MM-DD HH:MM)
+    if ($a{'date'} =~ /^(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/) {
+        $a{'date'} = "$1-$2-$3 $4:$5";
+    }
+
+    # Retrieve a list of status flags that have been set on the attachment.
+    &::PushGlobalSQLState();
+    &::SendSQL(" 
+                SELECT   name 
+                FROM     attachstatuses, attachstatusdefs 
+                WHERE    attach_id = $a{'attachid'} 
+                AND      attachstatuses.statusid = attachstatusdefs.id
+                ORDER BY sortkey
+              ");
+    my @statuses = ();
+    while (&::MoreSQLData()) { 
+      my ($status) = &::FetchSQLData(); 
+      push @statuses , $status;
+    }
+    $a{'statuses'} = \@statuses;
+    &::PopGlobalSQLState();
+
+    # We will display the edit link if the user can edit the attachment;
+    # ie the are the submitter, or they have canedit.
+    # Also show the link if the user is not logged in - in that cae,
+    # They'll be prompted later
+    $a{'canedit'} = ($::userid == 0 || $submitter_id == $::userid ||
+                     $in_editbugs);
+    push @attachments, \%a;
+  }
+  
+  return \@attachments;  
+}
+
+1;
diff --git a/Bug.pm b/Bug.pm
index 6c230ad5d..7ac2bd101 100755
--- a/Bug.pm
+++ b/Bug.pm
@@ -1,4 +1,3 @@
-#!/usr/bonsaitools/bin/perl -w
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -27,15 +26,13 @@ use strict;
 
 use DBI;
 use RelationSet;
+use vars qw($unconfirmedstate $legal_keywords);
 require "globals.pl";
 require "CGI.pl";
 package Bug;
 use CGI::Carp qw(fatalsToBrowser);
 my %ok_field;
 
-@::legal_keywords = @::legal_keywords; # kill "used only once" warning
-$::unconfirmedstate = $::unconfirmedstate;
-
 for my $key (qw (bug_id product version rep_platform op_sys bug_status 
                 resolution priority bug_severity component assigned_to
                 reporter bug_file_loc short_desc target_milestone 
@@ -77,10 +74,12 @@ sub initBug  {
   my $self = shift();
   my ($bug_id, $user_id) = (@_);
 
-
-  if ( (! defined $bug_id) || (!$bug_id) ) {
-    # no bug number given
-    return {};
+  my $old_bug_id = $bug_id;
+  if ((! defined $bug_id) || (!$bug_id) || (!&::detaint_natural($bug_id))) {
+      # no bug number given
+      $self->{'bug_id'} = $old_bug_id;
+      $self->{'error'} = "InvalidBugId";
+      return $self;
   }
 
 # default userid 0, or get DBID if you used an email address
@@ -89,7 +88,7 @@ sub initBug  {
   }
   else {
      if ($user_id =~ /^\@/) {
-	$user_id = &::DBname_to_id($user_id); 
+        $user_id = &::DBname_to_id($user_id); 
      }
   }
      
@@ -116,10 +115,9 @@ sub initBug  {
       groupset, delta_ts, sum(votes.count)
     from bugs left join votes using(bug_id)
     where bugs.bug_id = $bug_id
-    and bugs.groupset & $usergroupset = bugs.groupset
     group by bugs.bug_id";
 
-  &::SendSQL($query);
+  &::SendSQL(&::SelectVisible($query, $user_id, $usergroupset));
   my @row;
 
   if (@row = &::FetchSQLData()) {
@@ -131,11 +129,11 @@ sub initBug  {
                        "bug_file_loc", "short_desc", "target_milestone",
                        "qa_contact", "status_whiteboard", "creation_ts",
                        "groupset", "delta_ts", "votes") {
-	$fields{$field} = shift @row;
-	if ($fields{$field}) {
-	    $self->{$field} = $fields{$field};
-	}
-	$count++;
+        $fields{$field} = shift @row;
+        if ($fields{$field}) {
+            $self->{$field} = $fields{$field};
+        }
+        $count++;
     }
   } else {
     &::SendSQL("select groupset from bugs where bug_id = $bug_id");
@@ -150,14 +148,6 @@ sub initBug  {
     }
   }
 
-  if ($self->{'short_desc'}) {
-    $self->{'short_desc'} = QuoteXMLChars( $self->{'short_desc'} );
-  }
-
-  if (defined $self->{'status_whiteboard'}) {
-    $self->{'status_whiteboard'} = QuoteXMLChars($self->{'status_whiteboard'});
-  }
-
   $self->{'assigned_to'} = &::DBID_to_name($self->{'assigned_to'});
   $self->{'reporter'} = &::DBID_to_name($self->{'reporter'});
 
@@ -186,7 +176,7 @@ sub initBug  {
         push(@list, &::FetchOneColumn());
     }
     if (@list) {
-      $self->{'keywords'} = &::html_quote(join(', ', @list));
+      $self->{'keywords'} = join(', ', @list);
     }
   }
 
@@ -201,7 +191,7 @@ sub initBug  {
       my %attach;
       $attach{'attachid'} = $attachid;
       $attach{'date'} = $date;
-      $attach{'desc'} = &::html_quote($desc);
+      $attach{'desc'} = $desc;
       push @attachments, \%attach;
     }
   }
@@ -218,7 +208,7 @@ sub initBug  {
     my %longdesc;
     $longdesc{'who'} = $who;
     $longdesc{'bug_when'} = $bug_when;
-    $longdesc{'thetext'} = &::html_quote($thetext);
+    $longdesc{'thetext'} = $thetext;
     push @longdescs, \%longdesc;
   }
   if (@longdescs) {
@@ -258,7 +248,7 @@ sub emitXML {
 
   $xml .= "<bug>\n";
 
-  foreach my $field ("bug_id", "urlbase", "bug_status", "product",
+  foreach my $field ("bug_id", "bug_status", "product",
       "priority", "version", "rep_platform", "assigned_to", "delta_ts", 
       "component", "reporter", "target_milestone", "bug_severity", 
       "creation_ts", "qa_contact", "op_sys", "resolution", "bug_file_loc",
@@ -322,11 +312,11 @@ sub EmitDependList {
 }
 
 sub QuoteXMLChars {
+  $_[0] =~ s/&/&amp;/g;
   $_[0] =~ s/</&lt;/g;
   $_[0] =~ s/>/&gt;/g;
   $_[0] =~ s/'/&apos;/g;
   $_[0] =~ s/"/&quot;/g;
-  $_[0] =~ s/&/&amp;/g;
 # $_[0] =~ s/([\x80-\xFF])/&XmlUtf8Encode(ord($1))/ge;
   return($_[0]);
 }
@@ -335,7 +325,7 @@ sub XML_Header {
   my ($urlbase, $version, $maintainer, $exporter) = (@_);
 
   my $xml;
-  $xml = "<?xml version=\"1.0\" standalone=\"no\"?>\n";
+  $xml = "<?xml version=\"1.0\" standalone=\"yes\"?>\n";
   $xml .= "<!DOCTYPE bugzilla SYSTEM \"$urlbase";
   if (! ($urlbase =~ /.+\/$/)) {
     $xml .= "/";
@@ -448,6 +438,7 @@ sub Collision {
     my $write = "WRITE";        # Might want to make a param to control
                                 # whether we do LOW_PRIORITY ...
     &::SendSQL("LOCK TABLES bugs $write, bugs_activity $write, cc $write, " .
+               "cc AS selectVisible_cc $write, " .
             "profiles $write, dependencies $write, votes $write, " .
             "keywords $write, longdescs $write, fielddefs $write, " .
             "keyworddefs READ, groups READ, attachments READ, products READ");
diff --git a/CGI.pl b/CGI.pl
index 6dd9e7ee7..a6d3e2244 100644
--- a/CGI.pl
+++ b/CGI.pl
@@ -22,14 +22,16 @@
 #                 Joe Robins <jmrobins@tgix.com>
 #                 Dave Miller <justdave@syndicomm.com>
 #                 Christopher Aillon <christopher@aillon.com>
+#                 Gervase Markham <gerv@gerv.net>
+#                 Christian Reis <kiko@async.com.br>
 
 # Contains some global routines used throughout the CGI scripts of Bugzilla.
 
 use diagnostics;
 use strict;
+use lib ".";
+
 # use Carp;                       # for confess
-# Shut up misguided -w warnings about "used only once".  For some reason,
-# "use vars" chokes on me when I try it here.
 
 # commented out the following snippet of code. this tosses errors into the
 # CGI if you are perl 5.6, and doesn't if you have perl 5.003. 
@@ -37,10 +39,11 @@ use strict;
 # eval "use Mozilla::LDAP::Conn";
 # my $have_ldap = $@ ? 0 : 1;
 
+# Shut up misguided -w warnings about "used only once".  For some reason,
+# "use vars" chokes on me when I try it here.
 
 sub CGI_pl_sillyness {
     my $zz;
-    $zz = %::FILENAME;
     $zz = %::MFORM;
     $zz = %::dontchange;
 }
@@ -49,29 +52,31 @@ use CGI::Carp qw(fatalsToBrowser);
 
 require 'globals.pl';
 
-sub GeneratePersonInput {
-    my ($field, $required, $def_value, $extraJavaScript) = (@_);
-    $extraJavaScript ||= "";
-    if ($extraJavaScript ne "") {
-        $extraJavaScript = "onChange=\"$extraJavaScript\"";
-    }
-    return "<INPUT NAME=\"$field\" SIZE=32 $extraJavaScript VALUE=\"$def_value\">";
-}
-
-sub GeneratePeopleInput {
-    my ($field, $def_value) = (@_);
-    return "<INPUT NAME=\"$field\" SIZE=45 VALUE=\"$def_value\">";
+use vars qw($template $vars);
+
+# If Bugzilla is shut down, do not go any further, just display a message
+# to the user about the downtime.  (do)editparams.cgi is exempted from
+# this message, of course, since it needs to be available in order for
+# the administrator to open Bugzilla back up.
+if (Param("shutdownhtml") && $0 !~ m:[\\/](do)?editparams.cgi$:) {
+    # The shut down message we are going to display to the user.
+    $::vars->{'title'} = "Bugzilla is Down";
+    $::vars->{'h1'} = "Bugzilla is Down";
+    $::vars->{'message'} = Param("shutdownhtml");
+    
+    # Return the appropriate HTTP response headers.
+    print "Content-Type: text/html\n\n";
+    
+    # Generate and return an HTML message about the downtime.
+    $::template->process("global/message.html.tmpl", $::vars)
+      || ThrowTemplateError($::template->error());
+    exit;
 }
 
-
-
-
 # Implementations of several of the below were blatently stolen from CGI.pm,
 # by Lincoln D. Stein.
 
-
 # Get rid of all the %xx encoding and the like from the given URL.
-
 sub url_decode {
     my ($todecode) = (@_);
     $todecode =~ tr/+/ /;       # pluses become spaces
@@ -79,51 +84,42 @@ sub url_decode {
     return $todecode;
 }
 
-
 # Quotify a string, suitable for putting into a URL.
-
 sub url_quote {
     my($toencode) = (@_);
     $toencode=~s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;
     return $toencode;
 }
 
-
 sub ParseUrlString {
     my ($buffer, $f, $m) = (@_);
     undef %$f;
     undef %$m;
 
     my %isnull;
-    my $remaining = $buffer;
-    while ($remaining ne "") {
-	my $item;
-	if ($remaining =~ /^([^&]*)&(.*)$/) {
-	    $item = $1;
-	    $remaining = $2;
-	} else {
-	    $item = $remaining;
-	    $remaining = "";
-	}
-
-	my $name;
-	my $value;
-	if ($item =~ /^([^=]*)=(.*)$/) {
-	    $name = url_decode($1);
-	    $value = url_decode($2);
-	} else {
-	    $name = url_decode($item);
-	    $value = "";
-	}
-	if ($value ne "") {
-	    if (defined $f->{$name}) {
-		$f->{$name} .= $value;
-		my $ref = $m->{$name};
-		push @$ref, $value;
-	    } else {
-		$f->{$name} = $value;
-		$m->{$name} = [$value];
-	    }
+
+    # We must make sure that the CGI params remain tainted.
+    # This means that if for some reason you want to make this code
+    # use a regexp and $1, $2, ... (or use a helper function which does so)
+    # you must |use re 'taint'| _and_ make sure that you don't run into
+    # http://bugs.perl.org/perlbug.cgi?req=bug_id&bug_id=20020704.001
+    my @args = split('&', $buffer);
+    foreach my $arg (@args) {
+        my ($name, $value) = split('=', $arg, 2);
+        $value = '' if not defined $value;
+
+        $name = url_decode($name);
+        $value = url_decode($value);
+
+        if ($value ne "") {
+            if (defined $f->{$name}) {
+                $f->{$name} .= $value;
+                my $ref = $m->{$name};
+                push @$ref, $value;
+            } else {
+                $f->{$name} = $value;
+                $m->{$name} = [$value];
+            }
         } else {
             $isnull{$name} = 1;
         }
@@ -138,63 +134,76 @@ sub ParseUrlString {
     }
 }
 
-
 sub ProcessFormFields {
     my ($buffer) = (@_);
     return ParseUrlString($buffer, \%::FORM, \%::MFORM);
 }
 
-
 sub ProcessMultipartFormFields {
-    my ($boundary) = (@_);
-    $boundary =~ s/^-*//;
-    my $remaining = $ENV{"CONTENT_LENGTH"};
+    my ($boundary) = @_;
+
+    # Initialize variables that store whether or not we are parsing a header,
+    # the name of the part we are parsing, and its value (which is incomplete
+    # until we finish parsing the part).
     my $inheader = 1;
-    my $itemname = "";
-#    open(DEBUG, ">debug") || die "Can't open debugging thing";
-#    print DEBUG "Boundary is '$boundary'\n";
+    my $fieldname = "";
+    my $fieldvalue = "";
+
+    # Read the input stream line by line and parse it into a series of parts,
+    # each one containing a single form field and its value and each one
+    # separated from the next by the value of $boundary.
+    my $remaining = $ENV{"CONTENT_LENGTH"};
     while ($remaining > 0 && ($_ = <STDIN>)) {
         $remaining -= length($_);
-#        print DEBUG "< $_";
-        if ($_ =~ m/^-*$boundary/) {
-#            print DEBUG "Entered header\n";
-            $inheader = 1;
-            $itemname = "";
-            next;
-        }
 
-        if ($inheader) {
+        # If the current input line is a boundary line, save the previous
+        # form value and reset the storage variables.
+        if ($_ =~ m/^-*\Q$boundary\E/) {
+            if ( $fieldname ) {
+                chomp($fieldvalue);
+                $fieldvalue =~ s/\r$//;
+                if ( defined $::FORM{$fieldname} ) {
+                    $::FORM{$fieldname} .= $fieldvalue;
+                    push @{$::MFORM{$fieldname}}, $fieldvalue;
+                } else {
+                    $::FORM{$fieldname} = $fieldvalue;
+                    $::MFORM{$fieldname} = [$fieldvalue];
+                }
+            }
+
+            $inheader = 1;
+            $fieldname = "";
+            $fieldvalue = "";
+
+        # If the current input line is a header line, look for a blank line
+        # (meaning the end of the headers), a Content-Disposition header
+        # (containing the field name and, for uploaded file parts, the file 
+        # name), or a Content-Type header (containing the content type for 
+        # file parts).
+        } elsif ( $inheader ) {
             if (m/^\s*$/) {
                 $inheader = 0;
-#                print DEBUG "left header\n";
-                $::FORM{$itemname} = "";
-            }
-            if (m/^Content-Disposition:\s*form-data\s*;\s*name\s*=\s*"([^\"]+)"/i) {
-                $itemname = $1;
-#                print DEBUG "Found itemname $itemname\n";
+            } elsif (m/^Content-Disposition:\s*form-data\s*;\s*name\s*=\s*"([^\"]+)"/i) {
+                $fieldname = $1;
                 if (m/;\s*filename\s*=\s*"([^\"]+)"/i) {
-                    $::FILENAME{$itemname} = $1;
+                    $::FILE{$fieldname}->{'filename'} = $1;
                 }
+            } elsif ( m|^Content-Type:\s*([^/]+/[^\s;]+)|i ) {
+                $::FILE{$fieldname}->{'contenttype'} = $1;
             }
-            
-            next;
+
+        # If the current input line is neither a boundary line nor a header,
+        # it must be part of the field value, so append it to the value.
+        } else {
+          $fieldvalue .= $_;
         }
-        $::FORM{$itemname} .= $_;
-    }
-    delete $::FORM{""};
-    # Get rid of trailing newlines.
-    foreach my $i (keys %::FORM) {
-        chomp($::FORM{$i});
-        $::FORM{$i} =~ s/\r$//;
     }
 }
 
-
 # check and see if a given field exists, is non-empty, and is set to a 
 # legal value.  assume a browser bug and abort appropriately if not.
 # if $legalsRef is not passed, just check to make sure the value exists and 
 # is non-NULL
-# 
 sub CheckFormField (\%$;\@) {
     my ($formRef,                # a reference to the form to check (a hash)
         $fieldname,              # the fieldname to check
@@ -206,25 +215,26 @@ sub CheckFormField (\%$;\@) {
          (defined($legalsRef) && 
           lsearch($legalsRef, $formRef->{$fieldname})<0) ){
 
-        print "A legal $fieldname was not set; ";
-        print Param("browserbugmessage");
-        PutFooter();
-        exit 0;
+        SendSQL("SELECT description FROM fielddefs WHERE name=" . SqlQuote($fieldname));
+        my $result = FetchOneColumn();
+        if ($result) {
+            ThrowCodeError("A legal $result was not set.", undef, "abort");
+        }
+        else {
+            ThrowCodeError("A legal $fieldname was not set.", undef, "abort");
+        }
       }
 }
 
 # check and see if a given field is defined, and abort if not
-# 
 sub CheckFormFieldDefined (\%$) {
     my ($formRef,                # a reference to the form to check (a hash)
         $fieldname,              # the fieldname to check
        ) = @_;
 
-    if ( !defined $formRef->{$fieldname} ) {
-        print "$fieldname was not defined; ";
-        print Param("browserbugmessage");
-        PutFooter();
-        exit 0;
+    if (!defined $formRef->{$fieldname}) {
+          ThrowCodeError("$fieldname was not defined; " . 
+                                                    Param("browserbugmessage"));
       }
 }
 
@@ -232,107 +242,42 @@ sub ValidateBugID {
     # Validates and verifies a bug ID, making sure the number is a 
     # positive integer, that it represents an existing bug in the
     # database, and that the user is authorized to access that bug.
+    # We detaint the number here, too
+
+    $_[0] = trim($_[0]); # Allow whitespace arround the number
+    detaint_natural($_[0])
+      || DisplayError("The bug number is invalid. If you are trying to use " .
+                      "QuickSearch, you need to enable JavaScript in your " .
+                      "browser. To help us fix this limitation, look " .
+                      "<a href=\"http://bugzilla.mozilla.org/show_bug.cgi?id=70907\">here</a>.") 
+      && exit;
 
     my ($id) = @_;
 
-    # Make sure the bug number is a positive integer.
-    # Whitespace can be ignored because the SQL server will ignore it.
-    $id =~ /^\s*([1-9][0-9]*)\s*$/
-      || DisplayError("The bug number is invalid.") 
-      && exit;
-
     # Get the values of the usergroupset and userid global variables
     # and write them to local variables for use within this function,
     # setting those local variables to the default value of zero if
     # the global variables are undefined.
 
-    # "usergroupset" stores the set of groups the user is a member of,
-    # while "userid" stores the user's unique ID.  These variables are
-    # set globally by either confirm_login() or quietly_check_login(),
-    # one of which should be run before calling this function; otherwise
-    # this function will treat the user as if they were not logged in
-    # and throw an error if they try to access a bug that requires
-    # permissions/authorization to access.
-    my $usergroupset = $::usergroupset || 0;
-    my $userid = $::userid || 0;
-
-    # Query the database for the bug, retrieving a boolean value that
-    # represents whether or not the user is authorized to access the bug.  
-
-    # Users are authorized to access bugs if they are a member of all 
-    # groups to which the bug is restricted.  User group membership and 
-    # bug restrictions are stored as bits within bitsets, so authorization
-    # can be determined by comparing the intersection of the user's
-    # bitset with the bug's bitset.  If the result matches the bug's bitset
-    # the user is a member of all groups to which the bug is restricted
-    # and is authorized to access the bug.
-
-    # A user is also authorized to access a bug if she is the reporter, 
-    # assignee, QA contact, or member of the cc: list of the bug and the bug 
-    # allows users in those roles to see the bug.  The boolean fields 
-    # reporter_accessible, assignee_accessible, qacontact_accessible, and 
-    # cclist_accessible identify whether or not those roles can see the bug.
-
-    # Bit arithmetic is performed by MySQL instead of Perl because bitset
-    # fields in the database are 64 bits wide (BIGINT), and Perl installations
-    # may or may not support integers larger than 32 bits.  Using bitsets
-    # and doing bitset arithmetic is probably not cross-database compatible,
-    # however, so these mechanisms are likely to change in the future.
-
-    # Get data from the database about whether or not the user belongs to
-    # all groups the bug is in, and who are the bug's reporter and qa_contact
-    # along with which roles can always access the bug.
-    SendSQL("SELECT ((groupset & $usergroupset) = groupset) , reporter , assigned_to , qa_contact , 
-                    reporter_accessible , assignee_accessible , qacontact_accessible , cclist_accessible 
-             FROM   bugs 
-             WHERE  bug_id = $id");
-
-    # Make sure the bug exists in the database.
-    MoreSQLData()
-      || DisplayError("Bug #$id does not exist.")
-      && exit;
-
-    my ($isauthorized, $reporter, $assignee, $qacontact, $reporter_accessible, 
-        $assignee_accessible, $qacontact_accessible, $cclist_accessible) = FetchSQLData();
+    # First check that the bug exists
+    SendSQL("SELECT bug_id FROM bugs WHERE bug_id = $id");
 
-    # Finish validation and return if the user is a member of all groups to which the bug belongs.
-    return if $isauthorized;
-
-    # Finish validation and return if the user is in a role that has access to the bug.
-    if ($userid) {
-        return 
-	  if ($reporter_accessible && $reporter == $userid)
-            || ($assignee_accessible && $assignee == $userid)
-              || ($qacontact_accessible && $qacontact == $userid);
-    }
-
-    # Try to authorize the user one more time by seeing if they are on 
-    # the cc: list.  If so, finish validation and return.
-    if ( $cclist_accessible ) {
-        my @cclist;
-        SendSQL("SELECT cc.who 
-                 FROM   bugs , cc
-                 WHERE  bugs.bug_id = $id
-                 AND    cc.bug_id = bugs.bug_id
-                ");
-        while (my ($ccwho) = FetchSQLData()) {
-            # more efficient to just check the var here instead of
-            # creating a potentially huge array to grep against
-            return if ($userid == $ccwho);
-        }
+    FetchOneColumn()
+      || DisplayError("Bug #$id does not exist.")
+        && exit;
 
-    }
+    return if CanSeeBug($id, $::userid, $::usergroupset);
 
     # The user did not pass any of the authorization tests, which means they
     # are not authorized to see the bug.  Display an error and stop execution.
     # The error the user sees depends on whether or not they are logged in
-    # (i.e. $userid contains the user's positive integer ID).
-    if ($userid) {
+    # (i.e. $::userid contains the user's positive integer ID).
+    if ($::userid) {
         DisplayError("You are not authorized to access bug #$id.");
     } else {
         DisplayError(
           qq|You are not authorized to access bug #$id.  To see this bug, you
-          must first <a href="show_bug.cgi?id=$id&GoAheadAndLogIn=1">log in 
+          must first <a href="show_bug.cgi?id=$id&amp;GoAheadAndLogIn=1">log in 
           to an account</a> with the appropriate permissions.|
         );
     }
@@ -340,23 +285,15 @@ sub ValidateBugID {
 
 }
 
-# check and see if a given string actually represents a positive
-# integer, and abort if not.
-# 
-sub CheckPosInt($) {
-    my ($number) = @_;              # the fieldname to check
-
-    if ( $number !~ /^[1-9][0-9]*$/ ) {
-        print "Received string \"$number\" when positive integer expected; ";
-        print Param("browserbugmessage");
-        PutFooter();
-        exit 0;
-      }
-}
-
-sub FormData {
-    my ($field) = (@_);
-    return $::FORM{$field};
+sub ValidateComment {
+    # Make sure a comment is not too large (greater than 64K).
+    
+    my ($comment) = @_;
+    
+    if (defined($comment) && length($comment) > 65535) {
+        DisplayError("Comments cannot be longer than 65,535 characters.");
+        exit;
+    }
 }
 
 sub html_quote {
@@ -364,6 +301,7 @@ sub html_quote {
     $var =~ s/\&/\&amp;/g;
     $var =~ s/</\&lt;/g;
     $var =~ s/>/\&gt;/g;
+    $var =~ s/"/\&quot;/g;
     return $var;
 }
 
@@ -383,170 +321,52 @@ sub value_quote {
     return $var;
 }
 
-sub navigation_header {
-    if (defined $::COOKIE{"BUGLIST"} && $::COOKIE{"BUGLIST"} ne "" &&
-        defined $::FORM{'id'}) {
-	my @bugs = split(/:/, $::COOKIE{"BUGLIST"});
-	my $cur = lsearch(\@bugs, $::FORM{"id"});
-	print "<B>Bug List:</B> (@{[$cur + 1]} of @{[$#bugs + 1]})\n";
-	print "<A HREF=\"show_bug.cgi?id=$bugs[0]\">First</A>\n";
-	print "<A HREF=\"show_bug.cgi?id=$bugs[$#bugs]\">Last</A>\n";
-	if ($cur > 0) {
-	    print "<A HREF=\"show_bug.cgi?id=$bugs[$cur - 1]\">Prev</A>\n";
-	} else {
-	    print "<I><FONT COLOR=\#777777>Prev</FONT></I>\n";
-	}
-	if ($cur < $#bugs) {
-	    $::next_bug = $bugs[$cur + 1];
-	    print "<A HREF=\"show_bug.cgi?id=$::next_bug\">Next</A>\n";
-	} else {
-	    print "<I><FONT COLOR=\#777777>Next</FONT></I>\n";
-	}
-        print qq{&nbsp;&nbsp;<A HREF="buglist.cgi?regetlastlist=1">Show list</A>\n};
-    }
-    print "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A HREF=query.cgi>Query page</A>\n";
-    print "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A HREF=enter_bug.cgi>Enter new bug</A>\n"
-}
-
-sub make_checkboxes {
-    my ($src,$default,$isregexp,$name) = (@_);
-    my $last = "";
-    my $capitalized = "";
-    my $popup = "";
-    my $found = 0;
-    $default = "" if !defined $default;
-
-    if ($src) {
-        foreach my $item (@$src) {
-            if ($item eq "-blank-" || $item ne $last) {
-                if ($item eq "-blank-") {
-                    $item = "";
-                }
-                $last = $item;
-                $capitalized = $item;
-                $capitalized =~ tr/A-Z/a-z/;
-                $capitalized =~ s/^(.?)(.*)/\u$1$2/;
-                if ($isregexp ? $item =~ $default : $default eq $item) {
-                    $popup .= "<INPUT NAME=$name TYPE=CHECKBOX VALUE=\"$item\" CHECKED>$capitalized<br>";
-                    $found = 1;
-                } else {
-                    $popup .= "<INPUT NAME=$name TYPE=CHECKBOX VALUE=\"$item\">$capitalized<br>";
-                }
+# Adds <link> elements for bug lists. These can be inserted into the header by
+# using the "header_html" parameter to PutHeader, which inserts an arbitrary
+# string into the header. This function is currently used only in
+# template/en/default/bug/edit.html.tmpl.
+sub navigation_links($) {
+    my ($buglist) = @_;
+    
+    my $retval = "";
+    
+    # We need to be able to pass in a buglist because when you sort on a column
+    # the bugs in the cookie you are given will still be in the old order.
+    # If a buglist isn't passed, we just use the cookie.
+    $buglist ||= $::COOKIE{"BUGLIST"};
+    
+    if (defined $buglist && $buglist ne "") {
+    my @bugs = split(/:/, $buglist);
+        
+        if (defined $::FORM{'id'}) {
+            # We are on an individual bug
+            my $cur = lsearch(\@bugs, $::FORM{"id"});
+
+            if ($cur > 0) {
+                $retval .= "<link rel=\"First\" href=\"show_bug.cgi?id=$bugs[0]\" />\n";
+                $retval .= "<link rel=\"Prev\" href=\"show_bug.cgi?id=$bugs[$cur - 1]\" />\n";
+            } 
+            if ($cur < $#bugs) {
+                $retval .= "<link rel=\"Next\" href=\"show_bug.cgi?id=$bugs[$cur + 1]\" />\n";
+                $retval .= "<link rel=\"Last\" href=\"show_bug.cgi?id=$bugs[$#bugs]\" />\n";
             }
-        }
-    }
-    if (!$found && $default ne "") {
-	$popup .= "<INPUT NAME=$name TYPE=CHECKBOX CHECKED>$default";
-    }
-    return $popup;
-}
 
-#
-# make_selection_widget: creates an HTML selection widget from a list of text strings.
-# $groupname is the name of the setting (form value) that this widget will control
-# $src is the list of options
-# you can specify a $default value which is either a string or a regex pattern to match to
-#    identify the default value
-# $capitalize lets you optionally capitalize the option strings; the default is the value
-#    of Param("capitalizelists")
-# $multiple is 1 if several options are selectable (default), 0 otherwise.
-# $size is used for lists to control how many items are shown. The default is 7. A list of
-#    size 1 becomes a popup menu.
-# $preferLists is 1 if selection lists should be used in favor of radio buttons and
-#    checkboxes, and 0 otherwise. The default is the value of Param("preferlists").
-#
-# The actual widget generated depends on the parameter settings:
-# 
-#        MULTIPLE     PREFERLISTS    SIZE     RESULT
-#       0 (single)        0           =1      Popup Menu (normal for list of size 1)
-#       0 (single)        0           >1      Radio buttons
-#       0 (single)        1           =1      Popup Menu (normal for list of size 1)
-#       0 (single)        1           n>1     List of size n, single selection
-#       1 (multi)         0           n/a     Check boxes; size ignored
-#       1 (multi)         1           n/a     List of size n, multiple selection, of size n
-#
-sub make_selection_widget {
-    my ($groupname,$src,$default,$isregexp,$multiple, $size, $capitalize, $preferLists) = (@_);
-    my $last = "";
-    my $popup = "";
-    my $found = 0;
-    my $displaytext = "";
-    $groupname = "" if !defined $groupname;
-    $default = "" if !defined $default;
-    $capitalize = Param("capitalizelists") if !defined $capitalize;
-    $multiple = 1 if !defined $multiple;
-    $preferLists = Param("preferlists") if !defined $preferLists;
-    $size = 7 if !defined $size;
-    my $type = "LIST";
-    if (!$preferLists) {
-        if ($multiple) {
-            $type = "CHECKBOX";
+            $retval .= "<link rel=\"Up\" href=\"buglist.cgi?regetlastlist=1\" />\n";
+            $retval .= "<link rel=\"Contents\" href=\"buglist.cgi?regetlastlist=1\" />\n";
         } else {
-            if ($size > 1) {
-                $type = "RADIO";
-            }
+            # We are on a bug list
+            $retval .= "<link rel=\"First\" href=\"show_bug.cgi?id=$bugs[0]\" />\n";
+            $retval .= "<link rel=\"Next\" href=\"show_bug.cgi?id=$bugs[0]\" />\n";
+            $retval .= "<link rel=\"Last\" href=\"show_bug.cgi?id=$bugs[$#bugs]\" />\n";
         }
     }
-
-    if ($type eq "LIST") {
-        $popup .= "<SELECT NAME=\"$groupname\"";
-        if ($multiple) {
-            $popup .= " MULTIPLE";
-        }
-        $popup .= " SIZE=$size>\n";
-    }
-    if ($src) {
-        foreach my $item (@$src) {
-            if ($item eq "-blank-" || $item ne $last) {
-                if ($item eq "-blank-") {
-                    $item = "";
-                }
-                $last = $item;
-                $displaytext = $item;
-                if ($capitalize) {
-                    $displaytext =~ tr/A-Z/a-z/;
-                    $displaytext =~ s/^(.?)(.*)/\u$1$2/;
-                }   
-
-                if ($isregexp ? $item =~ $default : $default eq $item) {
-                    if ($type eq "CHECKBOX") {
-                        $popup .= "<INPUT NAME=$groupname type=checkbox VALUE=\"$item\" CHECKED>$displaytext<br>";
-                    } elsif ($type eq "RADIO") {
-                        $popup .= "<INPUT NAME=$groupname type=radio VALUE=\"$item\" check>$displaytext<br>";
-                    } else {
-                        $popup .= "<OPTION SELECTED VALUE=\"$item\">$displaytext";
-                    }
-                    $found = 1;
-                } else {
-                    if ($type eq "CHECKBOX") {
-                        $popup .= "<INPUT NAME=$groupname type=checkbox VALUE=\"$item\">$displaytext<br>";
-                    } elsif ($type eq "RADIO") {
-                        $popup .= "<INPUT NAME=$groupname type=radio VALUE=\"$item\">$displaytext<br>";
-                    } else {
-                        $popup .= "<OPTION VALUE=\"$item\">$displaytext";
-                    }
-                }
-            }
-        }
-    }
-    if (!$found && $default ne "") {
-        if ($type eq "CHECKBOX") {
-            $popup .= "<INPUT NAME=$groupname type=checkbox CHECKED>$default";
-        } elsif ($type eq "RADIO") {
-            $popup .= "<INPUT NAME=$groupname type=radio checked>$default";
-        } else {
-            $popup .= "<OPTION SELECTED>$default";
-        }
-    }
-    if ($type eq "LIST") {
-        $popup .= "</SELECT>";
-    }
-    return $popup;
-}
-
+    
+    return $retval;
+} 
 
 $::CheckOptionValues = 1;
 
+# This sub is still used in reports.cgi.
 sub make_options {
     my ($src,$default,$isregexp) = (@_);
     my $last = "";
@@ -562,16 +382,16 @@ sub make_options {
                 }
                 $last = $item;
                 if ($isregexp ? $item =~ $default : $default eq $item) {
-                    $popup .= "<OPTION SELECTED VALUE=\"$item\">$item";
+                    $popup .= "<OPTION SELECTED VALUE=\"$item\">$item\n";
                     $found = 1;
                 } else {
-                    $popup .= "<OPTION VALUE=\"$item\">$item";
+                    $popup .= "<OPTION VALUE=\"$item\">$item\n";
                 }
             }
         }
     }
     if (!$found && $default ne "") {
-      if ( Param("strictvaluechecks") && $::CheckOptionValues &&
+      if ( $::CheckOptionValues &&
            ($default ne $::dontchange) && ($default ne "-All-") &&
            ($default ne "DUPLICATE") ) {
         print "Possible bug database corruption has been detected.  " .
@@ -588,58 +408,16 @@ sub make_options {
         exit 0;
               
       } else {
-	$popup .= "<OPTION SELECTED>$default";
+        $popup .= "<OPTION SELECTED>$default\n";
       }
     }
     return $popup;
 }
 
-
-sub make_popup {
-    my ($name,$src,$default,$listtype,$onchange) = (@_);
-    my $popup = "<SELECT NAME=$name";
-    if ($listtype > 0) {
-        $popup .= " SIZE=5";
-        if ($listtype == 2) {
-            $popup .= " MULTIPLE";
-        }
-    }
-    if (defined $onchange && $onchange ne "") {
-        $popup .= " onchange=$onchange";
-    }
-    $popup .= ">" . make_options($src, $default,
-                                 ($listtype == 2 && $default ne ""));
-    $popup .= "</SELECT>";
-    return $popup;
-}
-
-
-sub BuildPulldown {
-    my ($name, $valuelist, $default) = (@_);
-
-    my $entry = qq{<SELECT NAME="$name">};
-    foreach my $i (@$valuelist) {
-        my ($tag, $desc) = (@$i);
-        my $selectpart = "";
-        if ($tag eq $default) {
-            $selectpart = " SELECTED";
-        }
-        if (!defined $desc) {
-            $desc = $tag;
-        }
-        $entry .= qq{<OPTION$selectpart VALUE="$tag">$desc\n};
-    }
-    $entry .= qq{</SELECT>};
-    return $entry;
-}
-
-
-
-
 sub PasswordForLogin {
     my ($login) = (@_);
     SendSQL("select cryptpassword from profiles where login_name = " .
-	    SqlQuote($login));
+            SqlQuote($login));
     my $result = FetchOneColumn();
     if (!defined $result) {
         $result = "";
@@ -647,26 +425,24 @@ sub PasswordForLogin {
     return $result;
 }
 
-
 sub quietly_check_login() {
     $::usergroupset = '0';
     my $loginok = 0;
     $::disabledreason = '';
     $::userid = 0;
     if (defined $::COOKIE{"Bugzilla_login"} &&
-	defined $::COOKIE{"Bugzilla_logincookie"}) {
+        defined $::COOKIE{"Bugzilla_logincookie"}) {
         ConnectToDatabase();
         SendSQL("SELECT profiles.userid, profiles.groupset, " .
                 "profiles.login_name, " .
                 "profiles.login_name = " .
-		SqlQuote($::COOKIE{"Bugzilla_login"}) .
-		" AND profiles.cryptpassword = logincookies.cryptpassword " .
-		" AND logincookies.ipaddr = " .
-		SqlQuote($ENV{"REMOTE_ADDR"}) .
+                SqlQuote($::COOKIE{"Bugzilla_login"}) .
+                " AND logincookies.ipaddr = " .
+                SqlQuote($ENV{"REMOTE_ADDR"}) .
                 ", profiles.disabledtext " .
-		" FROM profiles, logincookies WHERE logincookies.cookie = " .
-		SqlQuote($::COOKIE{"Bugzilla_logincookie"}) .
-		" AND profiles.userid = logincookies.userid");
+                " FROM profiles, logincookies WHERE logincookies.cookie = " .
+                SqlQuote($::COOKIE{"Bugzilla_logincookie"}) .
+                " AND profiles.userid = logincookies.userid");
         my @row;
         if (@row = FetchSQLData()) {
             my ($userid, $groupset, $loginname, $ok, $disabledtext) = (@row);
@@ -678,6 +454,8 @@ sub quietly_check_login() {
                     $::COOKIE{"Bugzilla_login"} = $loginname; # Makes sure case
                                                               # is in
                                                               # canonical form.
+                    # We've just verified that this is ok
+                    detaint_natural($::COOKIE{"Bugzilla_logincookie"});
                 } else {
                     $::disabledreason = $disabledtext;
                 }
@@ -692,37 +470,65 @@ sub quietly_check_login() {
     if (!$loginok) {
         delete $::COOKIE{"Bugzilla_login"};
     }
+                    
+    $vars->{'user'} = GetUserInfo($::userid);
+    
     return $loginok;
 }
 
+# Populate a hash with information about this user. 
+sub GetUserInfo {
+    my ($userid) = (@_);
+    my %user;
+    my @queries;
+    my %groups;
+    
+    # No info if not logged in
+    return \%user if ($userid == 0);
+    
+    $user{'login'} = $::COOKIE{"Bugzilla_login"};
+    $user{'userid'} = $userid;
+    
+    SendSQL("SELECT mybugslink, realname, groupset, blessgroupset " . 
+            "FROM profiles WHERE userid = $userid");
+    ($user{'showmybugslink'}, $user{'realname'}, $user{'groupset'},
+                                       $user{'blessgroupset'}) = FetchSQLData();
+
+    SendSQL("SELECT name, query, linkinfooter FROM namedqueries " .
+            "WHERE userid = $userid");
+    while (MoreSQLData()) {
+        my %query;
+        ($query{'name'}, $query{'query'}, $query{'linkinfooter'}) = 
+                                                                 FetchSQLData();
+        push(@queries, \%query);    
+    }
 
+    $user{'queries'} = \@queries;
 
+    SendSQL("select name, (bit & $user{'groupset'}) != 0 from groups");
+    while (MoreSQLData()) {
+        my ($name, $bit) = FetchSQLData();    
+        $groups{$name} = $bit;
+    }
+
+    $user{'groups'} = \%groups;
+
+    return \%user;
+}
 
 sub CheckEmailSyntax {
     my ($addr) = (@_);
     my $match = Param('emailregexp');
     if ($addr !~ /$match/ || $addr =~ /[\\\(\)<>&,;:"\[\] \t\r\n]/) {
-        print "Content-type: text/html\n\n";
-
-        # For security, escape HTML special characters.
-        $addr = html_quote($addr);
-
-        PutHeader("Check e-mail syntax");
-        print "The e-mail address you entered\n";
-        print "(<b>$addr</b>) didn't match our minimal\n";
-        print "syntax checking for a legal email address.\n";
-        print Param('emailregexpdesc') . "\n";
-        print "It must also not contain any of these special characters: " .
-              "<tt>\\ ( ) &amp; &lt; &gt; , ; : \" [ ]</tt> " .
-              "or any whitespace.\n";
-        print "<p>Please click <b>Back</b> and try again.\n";
-        PutFooter();
-        exit;
+        ThrowUserError("The e-mail address you entered(<b>" .
+        html_quote($addr) . "</b>) didn't pass our syntax checking 
+        for a legal email address. " . Param('emailregexpdesc') .
+        ' It must also not contain any of these special characters:
+        <tt>\ ( ) &amp; &lt; &gt; , ; : " [ ]</tt>, or any whitespace.', 
+        "Check e-mail address syntax");
     }
 }
 
-
-
 sub MailPassword {
     my ($login, $password) = (@_);
     my $urlbase = Param("urlbase");
@@ -732,17 +538,11 @@ sub MailPassword {
                              "login" => $login,
                              "password" => $password});
 
-    open SENDMAIL, "|/usr/lib/sendmail -t";
+    open SENDMAIL, "|/usr/lib/sendmail -t -i";
     print SENDMAIL $msg;
     close SENDMAIL;
-
-    print "The password for the e-mail address\n";
-    print "$login has been e-mailed to that address.\n";
-    print "<p>When the e-mail arrives, you can click <b>Back</b>\n";
-    print "and enter your password in the form there.\n";
 }
 
-
 sub confirm_login {
     my ($nexturl) = (@_);
 
@@ -778,12 +578,19 @@ sub confirm_login {
         # If this is a new user, generate a password, insert a record
         # into the database, and email their password to them.
         if ( defined $::FORM{"PleaseMailAPassword"} && !$userid ) {
+            # Ensure the new login is valid
+            if(!ValidateNewUser($enteredlogin)) {
+                ThrowUserError("That account already exists.");
+            }
+
             my $password = InsertNewUser($enteredlogin, "");
-            print "Content-Type: text/html\n\n";
-            PutHeader("Account Created");
             MailPassword($enteredlogin, $password);
-            PutFooter();
-            exit;
+            
+            $vars->{'login'} = $enteredlogin;
+            
+            print "Content-Type: text/html\n\n";
+            $template->process("account/created.html.tmpl", $vars)
+              || ThrowTemplateError($template->error());                 
         }
 
         # Otherwise, authenticate the user.
@@ -942,39 +749,30 @@ sub confirm_login {
      # the cookies.
      if($enteredlogin ne "") {
        $::COOKIE{"Bugzilla_login"} = $enteredlogin;
-       SendSQL("insert into logincookies (userid,cryptpassword,ipaddr) values (@{[DBNameToIdAndCheck($enteredlogin)]}, @{[SqlQuote($realcryptpwd)]}, @{[SqlQuote($ENV{'REMOTE_ADDR'})]})");
+       SendSQL("insert into logincookies (userid,ipaddr) values (@{[DBNameToIdAndCheck($enteredlogin)]}, @{[SqlQuote($ENV{'REMOTE_ADDR'})]})");
        SendSQL("select LAST_INSERT_ID()");
        my $logincookie = FetchOneColumn();
 
        $::COOKIE{"Bugzilla_logincookie"} = $logincookie;
-       print "Set-Cookie: Bugzilla_login=$enteredlogin ; path=/; expires=Sun, 30-Jun-2029 00:00:00 GMT\n";
-       print "Set-Cookie: Bugzilla_logincookie=$logincookie ; path=/; expires=Sun, 30-Jun-2029 00:00:00 GMT\n";
-
-       # This next one just cleans out any old bugzilla passwords that may
-       # be sitting around in the cookie files, from the bad old days when
-       # we actually stored the password there.
-       print "Set-Cookie: Bugzilla_password= ; path=/; expires=Sun, 30-Jun-80 00:00:00 GMT\n";
+       my $cookiepath = Param("cookiepath");
+       print "Set-Cookie: Bugzilla_login=$enteredlogin ; path=$cookiepath; expires=Sun, 30-Jun-2029 00:00:00 GMT\n";
+       print "Set-Cookie: Bugzilla_logincookie=$logincookie ; path=$cookiepath; expires=Sun, 30-Jun-2029 00:00:00 GMT\n";
     }
 
-
     my $loginok = quietly_check_login();
 
     if ($loginok != 1) {
         if ($::disabledreason) {
-            print "Set-Cookie: Bugzilla_login= ; path=/; expires=Sun, 30-Jun-80 00:00:00 GMT
-Set-Cookie: Bugzilla_logincookie= ; path=/; expires=Sun, 30-Jun-80 00:00:00 GMT
-Set-Cookie: Bugzilla_password= ; path=/; expires=Sun, 30-Jun-80 00:00:00 GMT
+            my $cookiepath = Param("cookiepath");
+            print "Set-Cookie: Bugzilla_login= ; path=$cookiepath; expires=Sun, 30-Jun-80 00:00:00 GMT
+Set-Cookie: Bugzilla_logincookie= ; path=$cookiepath; expires=Sun, 30-Jun-80 00:00:00 GMT
 Content-type: text/html
 
 ";
-            PutHeader("Your account has been disabled");
-            print $::disabledreason;
-            print "<HR>\n";
-            print "If you believe your account should be restored, please\n";
-            print "send email to " . Param("maintainer") . " explaining\n";
-            print "why.\n";
-            PutFooter();
-            exit();
+            ThrowUserError($::disabledreason . "<hr>" .
+            "If you believe your account should be restored, please " .
+            "send email to " . Param("maintainer") . " explaining why.",
+            "Your account has been disabled");
         }
         print "Content-type: text/html\n\n";
         PutHeader("Login");
@@ -984,10 +782,10 @@ Content-type: text/html
           print "I need a legitimate e-mail address and password to continue.\n";
         }
         if (!defined $nexturl || $nexturl eq "") {
-	    # Sets nexturl to be argv0, stripping everything up to and
-	    # including the last slash (or backslash on Windows).
-	    $0 =~ m:[^/\\]*$:;
-	    $nexturl = $&;
+            # Sets nexturl to be argv0, stripping everything up to and
+            # including the last slash (or backslash on Windows).
+            $0 =~ m:[^/\\]*$:;
+            $nexturl = $&;
         }
         my $method = "POST";
 # We always want to use POST here, because we're submitting a password and don't
@@ -1027,7 +825,15 @@ Content-type: text/html
         # (except for Bugzilla_login and Bugzilla_password which we
         # already added as text fields above).
         foreach my $i ( grep( $_ !~ /^Bugzilla_/ , keys %::FORM ) ) {
+          if (defined $::MFORM{$i} && scalar(@{$::MFORM{$i}}) > 1) {
+            # This field has multiple values; add each one separately.
+            foreach my $val (@{$::MFORM{$i}}) {
+              print qq|<input type="hidden" name="$i" value="@{[value_quote($val)]}">\n|;
+            }
+          } else {
+            # This field has a single value; add it.
             print qq|<input type="hidden" name="$i" value="@{[value_quote($::FORM{$i})]}">\n|;
+          }
         }
 
         print qq|
@@ -1040,16 +846,17 @@ Content-type: text/html
         unless( Param("useLDAP") ) {
             print qq|
               <hr>
+              <p>If you don't have a Bugzilla account, you can 
+              <a href="createaccount.cgi">create a new account</a>.</p>
               <form method="get" action="token.cgi">
                 <input type="hidden" name="a" value="reqpw">
-                If you have forgotten your password,
+                If you have an account, but have forgotten your password,
                 enter your login name below and submit a request 
                 to change your password.<br>
                 <input size="35" name="loginname">
                 <input type="submit" value="Submit Request">
               </form>
               <hr>
-              If you don't have a Bugzilla account, you can <a href="createaccount.cgi">create a new account</a>.
             |;
         }
 
@@ -1074,93 +881,102 @@ Content-type: text/html
     return $::userid;
 }
 
-
 sub PutHeader {
-    my ($title, $h1, $h2, $extra, $jscript) = (@_);
-
-    if (!defined $h1) {
-	$h1 = $title;
-    }
-    if (!defined $h2) {
-	$h2 = "";
-    }
-    if (!defined $extra) {
-	$extra = "";
-    }
-    $jscript ||= "";
-    # If we are shutdown, we want a very basic page to give that
-    # information.  Also, the page title should indicate that
-    # we are down.  
-    if (Param('shutdownhtml')) {
-        $title = "Bugzilla is Down";
-        $h1 = "Bugzilla is currently down";
-        $h2 = "";
-        $extra = "";
-        $jscript = "";
-    }
-
-    print "<HTML><HEAD>\n<TITLE>$title</TITLE>\n";
-    print Param("headerhtml") . "\n$jscript\n</HEAD>\n";
-    print "<BODY " . Param("bodyhtml") . " $extra>\n";
-
-    print PerformSubsts(Param("bannerhtml"), undef);
-
-    print "<TABLE BORDER=0 CELLSPACING=0 WIDTH=\"100%\">\n";
-    print " <TR>\n";
-    print "  <TD WIDTH=10% VALIGN=TOP ALIGN=LEFT>\n";
-    print "   <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=2>\n";
-    print "    <TR><TD VALIGN=TOP ALIGN=LEFT NOWRAP>\n";
-    print "     <FONT SIZE=+1><B>$h1</B></FONT>";
-    print "    </TD></TR>\n";
-    print "   </TABLE>\n";
-    print "  </TD>\n";
-    print "  <TD VALIGN=CENTER>&nbsp;</TD>\n";
-    print "  <TD VALIGN=CENTER ALIGN=LEFT>\n";
-
-    print "$h2\n";
-    print "</TD></TR></TABLE>\n";
-
-    if (Param("shutdownhtml")) {
-        # If we are dealing with the params page, we want
-        # to ignore shutdownhtml
-        if ($0 !~ m:[\\/](do)?editparams.cgi$:) {
-            print "<p>\n";
-            print Param("shutdownhtml");
-            exit;
-        }
-    }
+    ($vars->{'title'}, $vars->{'h1'}, $vars->{'h2'}) = (@_);
+     
+    $::template->process("global/header.html.tmpl", $::vars)
+      || ThrowTemplateError($::template->error());
 }
 
-
 sub PutFooter {
-    print PerformSubsts(Param("footerhtml"));
-    SyncAnyPendingShadowChanges();
+    $::template->process("global/footer.html.tmpl", $::vars)
+      || ThrowTemplateError($::template->error());
 }
 
+###############################################################################
+# Error handling
+#
+# If you are doing incremental output, set $vars->{'header_done'} once you've
+# done the header.
+###############################################################################
 
+# DisplayError is deprecated. Use ThrowCodeError, ThrowUserError or 
+# ThrowTemplateError instead.
 sub DisplayError {
-  my ($message, $title) = (@_);
-  $title ||= "Error";
-
-  print "Content-type: text/html\n\n";
-  PutHeader($title);
+  ($vars->{'error'}, $vars->{'title'}) = (@_);
+  $vars->{'title'} ||= "Error";
 
-  print PerformSubsts( Param("errorhtml") , {errormsg => $message} );
-
-  PutFooter();
+  print "Content-type: text/html\n\n" if !$vars->{'header_done'};
+  $template->process("global/user-error.html.tmpl", $vars)
+    || ThrowTemplateError($template->error());   
 
   return 1;
 }
 
-sub PuntTryAgain ($) {
-    my ($str) = (@_);
-    print PerformSubsts(Param("errorhtml"),
-                        {errormsg => $str});
-    SendSQL("UNLOCK TABLES");
-    PutFooter();
-    exit;
+# For "this shouldn't happen"-type places in the code.
+# $vars->{'variables'} is a reference to a hash of useful debugging info.
+sub ThrowCodeError {
+  ($vars->{'error'}, $vars->{'variables'}, my $unlock_tables) = (@_);
+  $vars->{'title'} = "Code Error";
+
+  SendSQL("UNLOCK TABLES") if $unlock_tables;
+  
+  # We may optionally log something to file here.
+  
+  print "Content-type: text/html\n\n" if !$vars->{'header_done'};
+  $template->process("global/code-error.html.tmpl", $vars)
+    || ThrowTemplateError($template->error());
+    
+  exit;
 }
 
+# For errors made by the user.
+sub ThrowUserError {
+  ($vars->{'error'}, $vars->{'title'}, my $unlock_tables) = (@_);
+  $vars->{'title'} ||= "Error";
+
+  SendSQL("UNLOCK TABLES") if $unlock_tables;
+  
+  print "Content-type: text/html\n\n" if !$vars->{'header_done'};
+  $template->process("global/user-error.html.tmpl", $vars)
+    || ThrowTemplateError($template->error());
+    
+  exit;
+}
+
+# If the template system isn't working, we can't use a template.
+# This should only be called if a template->process() fails.
+# The Content-Type will already have been printed.
+sub ThrowTemplateError {
+    ($vars->{'error'}) = (@_);
+    $vars->{'title'} = "Template Error";
+    
+    # Try a template first; but if this one fails too, fall back
+    # on plain old print statements.
+    if (!$template->process("global/code-error.html.tmpl", $vars)) {
+        my $maintainer = Param('maintainer');
+        my $error = html_quote($vars->{'error'});
+        my $error2 = html_quote($template->error());
+        print <<END;
+        <tt>
+          <p>
+            Bugzilla has suffered an internal error. Please save this page and 
+            send it to $maintainer with details of what you were doing at the 
+            time this message appeared.
+          </p>
+          <script> <!--
+            document.write("<p>URL: " + document.location + "</p>");
+          // -->
+          </script>
+          <p>Template->process() failed twice.<br>
+          First error: $error<br>
+          Second error: $error2</p>
+        </tt>
+END
+    }
+    
+    exit;  
+}
 
 sub CheckIfVotedConfirmed {
     my ($id, $who) = (@_);
@@ -1182,28 +998,36 @@ sub CheckIfVotedConfirmed {
                     "(bug_id,who,bug_when,fieldid,removed,added) VALUES " .
                     "($id,$who,now(),$fieldid,'0','1')");
         }
+        
         AppendComment($id, DBID_to_name($who),
                       "*** This bug has been confirmed by popular vote. ***");
-        print "<TABLE BORDER=1><TD><H2>Bug $id has been confirmed by votes.</H2>\n";
-        system("./processmail", $id);
-        print "<TD><A HREF=\"show_bug.cgi?id=$id\">Go To BUG# $id</A></TABLE>\n";
+                      
+        $vars->{'type'} = "votes";
+        $vars->{'id'} = $id;
+        $vars->{'mail'} = "";
+        open(PMAIL, "-|") or exec('./processmail', $id);
+        $vars->{'mail'} .= $_ while <PMAIL>;
+        close(PMAIL);
+        
+        $template->process("bug/process/results.html.tmpl", $vars)
+          || ThrowTemplateError($template->error());
     }
 
 }
 
-
-
-sub DumpBugActivity {
+sub GetBugActivity {
     my ($id, $starttime) = (@_);
     my $datepart = "";
 
     die "Invalid id: $id" unless $id=~/^\s*\d+\s*$/;
 
     if (defined $starttime) {
-        $datepart = "and bugs_activity.bug_when >= $starttime";
+        $datepart = "and bugs_activity.bug_when > " . SqlQuote($starttime);
     }
+    
     my $query = "
-        SELECT IFNULL(fielddefs.name, bugs_activity.fieldid),
+        SELECT IFNULL(fielddefs.description, bugs_activity.fieldid),
+                bugs_activity.attach_id,
                 bugs_activity.bug_when,
                 bugs_activity.removed, bugs_activity.added,
                 profiles.login_name
@@ -1216,138 +1040,58 @@ sub DumpBugActivity {
 
     SendSQL($query);
     
-    # Instead of outright printing this, we are going to store it in a $html
-    # variable and print it and the end.  This is so we can explain ? (if nesc.)
-    # at the top of the activity table rather than the botom.
-    my $html = "";
-    $html .= "<table border cellpadding=4>\n";
-    $html .= "<tr>\n";
-    $html .= "    <th>Who</th><th>What</th><th>Removed</th><th>Added</th><th>When</th>\n";
-    $html .= "</tr>\n";
-    
-    my @row;
+    my @operations;
+    my $operation = {};
+    my $changes = [];
     my $incomplete_data = 0;
-    while (@row = FetchSQLData()) {
-        my ($field,$when,$removed,$added,$who) = (@row);
-        $removed = html_quote($removed);
-        $added = html_quote($added);
-        $removed = "&nbsp;" if $removed eq "";
-        $added = "&nbsp;" if $added eq "";
-        if ($added =~ /^\?/ || $removed =~ /^\?/) {
-            $incomplete_data = 1;
-        }
-        $html .= "<tr>\n";
-        $html .= "<td>$who</td>\n";
-        $html .= "<td>$field</td>\n";
-        $html .= "<td>$removed</td>\n";
-        $html .= "<td>$added</td>\n";
-        $html .= "<td>$when</td>\n";
-        $html .= "</tr>\n";
-    }
-    $html .= "</table>\n";
-    if ($incomplete_data) {
-        print "There was a bug in older versions of Bugzilla which caused activity data \n";
-        print "to be lost if there was a large number of cc's or dependencies.  That \n";
-        print "has been fixed, however, there was some data already lost on this bug \n";
-        print "that could not be regenerated.  The changes that the script could not \n";
-        print "reliably determine are prefixed by '?'\n";
-        print "<p>\n";
-    }
-    print $html;
-}
-
-
-sub GetCommandMenu {
-    my $loggedin = quietly_check_login();
-    my $html = "";
-    $html .= <<"--endquote--";
-<FORM METHOD=GET ACTION="show_bug.cgi">
-<TABLE width="100%"><TR><TD>
-Actions:
-</TD><TD VALIGN="middle" NOWRAP>
-<a href='enter_bug.cgi'>New</a> | <a href='query.cgi'>Query</a> |
---endquote--
-
-    if (-e "query2.cgi") {
-        $html .= "[<a href='query2.cgi'>beta</a>]";
-    }
     
-    $html .=
-        qq{ <INPUT TYPE=SUBMIT VALUE="Find"> bug \# <INPUT NAME=id SIZE=6>};
+    while (my ($field, $attachid, $when, $removed, $added, $who) 
+                                                               = FetchSQLData())
+    {
+        my %change;
+        
+        # This gets replaced with a hyperlink in the template.
+        $field =~ s/^Attachment// if $attachid;
 
-    $html .= " | <a href='reports.cgi'>Reports</a>"; 
-    if ($loggedin) {
-        if ($::anyvotesallowed) {
-            $html .= " | <A HREF=\"showvotes.cgi\">My votes</A>";
-        }
-    }
-    if ($loggedin) {
-    	#a little mandatory SQL, used later on
-        SendSQL("SELECT mybugslink, userid, blessgroupset FROM profiles " .
-                "WHERE login_name = " . SqlQuote($::COOKIE{'Bugzilla_login'}));
-        my ($mybugslink, $userid, $blessgroupset) = (FetchSQLData());
+        # Check for the results of an old Bugzilla data corruption bug
+        $incomplete_data = 1 if ($added =~ /^\?/ || $removed =~ /^\?/);
         
-        #Begin settings
-        $html .= "</TD><TD>&nbsp;</TD><TD VALIGN=middle><NOBR>Edit <a href='userprefs.cgi'>prefs</a></NOBR>";
-        if (UserInGroup("tweakparams")) {
-            $html .= ", <a href=editparams.cgi>parameters</a>";
-            $html .= ", <a href=sanitycheck.cgi><NOBR>sanity check</NOBR></a>";
-        }
-        if (UserInGroup("editusers") || $blessgroupset) {
-            $html .= ", <a href=editusers.cgi>users</a>";
-        }
-        if (UserInGroup("editcomponents")) {
-            $html .= ", <a href=editproducts.cgi>components</a>";
-        }
-        if (UserInGroup("creategroups")) {
-            $html .= ", <a href=editgroups.cgi>groups</a>";
-        }
-        if (UserInGroup("editkeywords")) {
-            $html .= ", <a href=editkeywords.cgi>keywords</a>";
-        }
-        $html .= " | <NOBR><a href=relogin.cgi>Log out</a> $::COOKIE{'Bugzilla_login'}</NOBR>";
-        $html .= "</TD></TR>";
+        # An operation, done by 'who' at time 'when', has a number of
+        # 'changes' associated with it.
+        # If this is the start of a new operation, store the data from the
+        # previous one, and set up the new one.
+        if ($operation->{'who'} 
+            && ($who ne $operation->{'who'} 
+                || $when ne $operation->{'when'})) 
+        {
+            $operation->{'changes'} = $changes;
+            push (@operations, $operation);
+            
+            # Create new empty anonymous data structures.
+            $operation = {};
+            $changes = [];
+        }  
         
-		#begin preset queries
-        my $mybugstemplate = Param("mybugstemplate");
-        my %substs;
-        $substs{'userid'} = url_quote($::COOKIE{"Bugzilla_login"});
-        if (!defined $::anyvotesallowed) {
-            GetVersionTable();
-        }
-        $html .= "</TR><TR>";
-        $html .= "<TD>Preset Queries: </TD>";
-        $html .= "<TD colspan=3>\n";
-        if ($mybugslink) {
-            my $mybugsurl = PerformSubsts($mybugstemplate, \%substs);
-            $html = $html . "<A HREF='$mybugsurl'><NOBR>My bugs</NOBR></A>";
-        }
-        SendSQL("SELECT name FROM namedqueries " .
-                "WHERE userid = $userid AND linkinfooter");
-        my $anynamedqueries = 0;
-        while (MoreSQLData()) {
-            my ($name) = (FetchSQLData());
-            if ($anynamedqueries || $mybugslink) { $html .= " | " }
-            $anynamedqueries = 1;
-            $html .= "<A HREF=\"buglist.cgi?&cmdtype=runnamed&namedcmd=" .
-                     url_quote($name) . "\"><NOBR>$name</NOBR></A>";
-        }
-        $html .= "</TR>\n<TR>";
-    } else {
-    $html .= "</TD><TD>&nbsp;</TD><TD valign=middle align=right>\n";
-        $html .=
-            " <a href=\"createaccount.cgi\"><NOBR>New account</NOBR></a>\n";
-        $html .=
-            " | <NOBR><a href=query.cgi?GoAheadAndLogIn=1>Log in</a></NOBR>";
-        $html .= "</TD></TR>";
+        $operation->{'who'} = $who;
+        $operation->{'when'} = $when;            
+        
+        $change{'field'} = $field;
+        $change{'attachid'} = $attachid;
+        $change{'removed'} = $removed;
+        $change{'added'} = $added;
+        push (@$changes, \%change);
+    }
+    
+    if ($operation->{'who'}) {
+        $operation->{'changes'} = $changes;
+        push (@operations, $operation);
     }
-    $html .= "</FORM>\n";
-    $html .= "</TABLE>";                
-    return $html;
+    
+    return(\@operations, $incomplete_data);
 }
 
-############# Live code below here (that is, not subroutine defs) #############
 
+############# Live code below here (that is, not subroutine defs) #############
 
 $| = 1;
 
@@ -1379,15 +1123,16 @@ if (defined $ENV{"REQUEST_METHOD"}) {
     }
 }
 
-
 if (defined $ENV{"HTTP_COOKIE"}) {
+    # Don't trust anything which came in as a cookie
+    use re 'taint';
     foreach my $pair (split(/;/, $ENV{"HTTP_COOKIE"})) {
-	$pair = trim($pair);
-	if ($pair =~ /^([^=]*)=(.*)$/) {
-	    $::COOKIE{$1} = $2;
-	} else {
-	    $::COOKIE{$pair} = "";
-	}
+        $pair = trim($pair);
+        if ($pair =~ /^([^=]*)=(.*)$/) {
+            $::COOKIE{$1} = $2;
+        } else {
+            $::COOKIE{$pair} = "";
+        }
     }
 }
 
diff --git a/CVS/Entries b/CVS/Entries
index c03a98f8b..f5474f422 100644
--- a/CVS/Entries
+++ b/CVS/Entries
@@ -1,78 +1,80 @@
-/.cvsignore/1.4/Wed Jul 25 07:26:42 2001//TBUGZILLA-2_14_5
-/1x1.gif/1.1/Wed Aug 26 06:14:15 1998/-kb/TBUGZILLA-2_14_5
-/Bug.pm/1.6.6.1/Sat Nov 17 07:41:52 2001//TBUGZILLA-2_14_5
-/CGI.pl/1.100.2.3/Mon Jun  3 23:04:44 2002//TBUGZILLA-2_14_5
-/README/1.50/Sat Aug 11 19:56:40 2001//TBUGZILLA-2_14_5
-/RelationSet.pm/1.5/Fri Jun  1 02:14:23 2001//TBUGZILLA-2_14_5
-/Token.pm/1.3/Fri Aug 17 08:38:54 2001//TBUGZILLA-2_14_5
-/UPGRADING/1.1/Fri Aug 10 22:35:21 2001//TBUGZILLA-2_14_5
-/UPGRADING-pre-2.8/1.1/Fri Aug 10 22:35:22 2001//TBUGZILLA-2_14_5
-/ant.jpg/1.2/Wed Aug 26 22:36:05 1998/-kb/TBUGZILLA-2_14_5
-/booleanchart.html/1.3/Wed Aug 16 23:07:37 2000//TBUGZILLA-2_14_5
-/bug_form.pl/1.70.2.4/Tue May 28 04:01:20 2002//TBUGZILLA-2_14_5
-/bug_status.html/1.11/Mon Aug 28 17:48:56 2000//TBUGZILLA-2_14_5
-/buglist.cgi/1.139.2.4/Sat Jun 29 01:59:21 2002//TBUGZILLA-2_14_5
-/bugwritinghelp.html/1.1/Tue Mar  7 17:59:38 2000//TBUGZILLA-2_14_5
-/bugzilla.dtd/1.2/Fri May 26 06:34:45 2000//TBUGZILLA-2_14_5
-/changepassword.cgi/1.19/Tue Jan 25 07:53:29 2000//TBUGZILLA-2_14_5
-/checksetup.pl/1.99.2.4/Mon Dec 23 01:52:11 2002//TBUGZILLA-2_14_5
-/colchange.cgi/1.17/Fri Jun  1 02:07:28 2001//TBUGZILLA-2_14_5
-/collectstats.pl/1.20.10.1/Fri Dec 13 11:03:14 2002//TBUGZILLA-2_14_5
-/confirmhelp.html/1.2/Mon Aug 28 17:48:58 2000//TBUGZILLA-2_14_5
-/createaccount.cgi/1.11/Wed Jul 11 05:29:18 2001//TBUGZILLA-2_14_5
-/createattachment.cgi/1.13/Tue Apr  3 20:42:58 2001//TBUGZILLA-2_14_5
-/defparams.pl/1.56.2.1/Sat May 25 20:43:49 2002//TBUGZILLA-2_14_5
-/describecomponents.cgi/1.6/Wed Jun  6 04:32:45 2001//TBUGZILLA-2_14_5
-/describekeywords.cgi/1.4/Sat Jan 22 16:51:49 2000//TBUGZILLA-2_14_5
-/doeditparams.cgi/1.15/Mon Aug 13 19:11:33 2001//TBUGZILLA-2_14_5
-/doeditvotes.cgi/1.12.2.1/Mon Nov 26 04:53:28 2001//TBUGZILLA-2_14_5
-/duplicates.cgi/1.13/Tue Aug 21 00:36:54 2001//TBUGZILLA-2_14_5
-/editcomponents.cgi/1.17/Sat Jun 16 14:51:15 2001//TBUGZILLA-2_14_5
-/editgroups.cgi/1.12/Wed Jun  6 03:16:49 2001//TBUGZILLA-2_14_5
-/editkeywords.cgi/1.7/Mon Feb 26 23:25:22 2001//TBUGZILLA-2_14_5
-/editmilestones.cgi/1.5/Sat Jun 16 14:51:16 2001//TBUGZILLA-2_14_5
-/editparams.cgi/1.12/Mon Aug 13 19:11:33 2001//TBUGZILLA-2_14_5
-/editproducts.cgi/1.18.2.1/Sun Sep 22 17:51:54 2002//TBUGZILLA-2_14_5
-/editusers.cgi/1.23.2.3/Wed May 29 18:13:34 2002//TBUGZILLA-2_14_5
-/editversions.cgi/1.8/Tue Jun 19 01:37:02 2001//TBUGZILLA-2_14_5
-/enter_bug.cgi/1.50/Sun Jul  1 02:00:56 2001//TBUGZILLA-2_14_5
-/globals.pl/1.110.2.10/Fri Dec 13 11:31:34 2002//TBUGZILLA-2_14_5
-/help.html/1.4/Fri Jan 21 22:01:11 2000//TBUGZILLA-2_14_5
-/helpemailquery.html/1.1/Tue Jan 19 00:07:45 1999//TBUGZILLA-2_14_5
-/how_to_mail.html/1.2/Mon Nov  1 23:33:16 1999//TBUGZILLA-2_14_5
-/importxml.pl/1.18.2.1/Sat May 25 20:43:51 2002//TBUGZILLA-2_14_5
-/index.html/1.12/Wed Feb 28 23:07:24 2001//TBUGZILLA-2_14_5
-/localconfig.js/1.1/Wed Feb 28 23:07:25 2001//TBUGZILLA-2_14_5
-/long_list.cgi/1.15.2.1/Sat Nov 17 08:34:46 2001//TBUGZILLA-2_14_5
-/move.pl/1.6.10.1/Sat May 25 20:43:51 2002//TBUGZILLA-2_14_5
-/new_comment.cgi/1.5/Thu Jul 27 20:10:16 2000//TBUGZILLA-2_14_5
-/notargetmilestone.html/1.2/Mon Aug 28 17:48:59 2000//TBUGZILLA-2_14_5
-/post_bug.cgi/1.34.2.1/Sat Nov 17 08:01:54 2001//TBUGZILLA-2_14_5
-/process_bug.cgi/1.96.2.2/Tue May 28 04:32:38 2002//TBUGZILLA-2_14_5
-/processmail/1.68/Mon Aug 13 17:06:38 2001//TBUGZILLA-2_14_5
-/query.cgi/1.85/Mon Aug 13 19:11:35 2001//TBUGZILLA-2_14_5
-/queryhelp.cgi/1.4.2.1/Sat May 11 10:01:29 2002//TBUGZILLA-2_14_5
-/quicksearch.html/1.1/Wed Feb 28 23:07:26 2001//TBUGZILLA-2_14_5
-/quicksearch.js/1.7/Fri Jul 20 08:25:30 2001//TBUGZILLA-2_14_5
-/quicksearchhack.html/1.2/Wed Feb 28 23:08:52 2001//TBUGZILLA-2_14_5
-/quips.cgi/1.1.2.1/Tue Nov 26 20:15:01 2002//TBUGZILLA-2_14_5
-/relogin.cgi/1.10/Tue Jan 18 14:41:00 2000//TBUGZILLA-2_14_5
-/reports.cgi/1.47/Sun Jul  1 19:09:29 2001//TBUGZILLA-2_14_5
-/robots.txt/1.1/Fri Jul 28 21:28:39 2000//TBUGZILLA-2_14_5
-/runtests.sh/1.4.6.1/Sat Nov 17 07:41:52 2001//TBUGZILLA-2_14_5
-/sanitycheck.cgi/1.33/Wed Jul 11 05:29:20 2001//TBUGZILLA-2_14_5
-/show_activity.cgi/1.6/Fri Jun  1 13:38:01 2001//TBUGZILLA-2_14_5
-/show_bug.cgi/1.15/Sat Jun  2 22:02:02 2001//TBUGZILLA-2_14_5
-/showattachment.cgi/1.7/Wed Jun  6 18:36:25 2001//TBUGZILLA-2_14_5
-/showdependencygraph.cgi/1.10/Thu May 31 15:52:24 2001//TBUGZILLA-2_14_5
-/showdependencytree.cgi/1.8/Thu May 31 15:52:24 2001//TBUGZILLA-2_14_5
-/showvotes.cgi/1.9/Thu May 31 15:52:25 2001//TBUGZILLA-2_14_5
-/syncshadowdb/1.12/Sun Jun 10 17:38:15 2001//TBUGZILLA-2_14_5
-/token.cgi/1.2/Fri Aug 17 12:42:34 2001//TBUGZILLA-2_14_5
-/userprefs.cgi/1.20.2.1/Sat Nov 17 08:24:08 2001//TBUGZILLA-2_14_5
-/votehelp.html/1.5/Thu Jan 25 04:56:14 2001//TBUGZILLA-2_14_5
-/whineatnews.pl/1.4/Mon Nov  1 23:33:22 1999//TBUGZILLA-2_14_5
-/xml.cgi/1.2/Mon Jun 12 06:52:41 2000//TBUGZILLA-2_14_5
+/.cvsignore/1.5.2.1/Mon May 13 22:31:47 2002//TBUGZILLA-2_16
+/1x1.gif/1.1/Wed Aug 26 06:14:15 1998/-kb/TBUGZILLA-2_16
+/Attachment.pm/1.8/Sat Mar 23 17:58:36 2002//TBUGZILLA-2_16
+/Bug.pm/1.12/Sat Apr 27 06:25:41 2002//TBUGZILLA-2_16
+/CGI.pl/1.153.2.3/Wed Jul 10 06:27:15 2002//TBUGZILLA-2_16
+/README/1.50/Sat Aug 11 19:56:40 2001//TBUGZILLA-2_16
+/RelationSet.pm/1.7/Sat Nov  3 02:05:43 2001//TBUGZILLA-2_16
+/Token.pm/1.12.2.1/Tue Jul  9 02:17:28 2002//TBUGZILLA-2_16
+/UPGRADING/1.1/Fri Aug 10 22:35:21 2001//TBUGZILLA-2_16
+/UPGRADING-pre-2.8/1.2/Sun Dec 23 23:23:22 2001//TBUGZILLA-2_16
+/ant.jpg/1.2/Wed Aug 26 22:36:05 1998/-kb/TBUGZILLA-2_16
+/attachment.cgi/1.14/Wed Apr 24 07:24:43 2002//TBUGZILLA-2_16
+/bug_form.pl/1.93.2.3/Wed Jul 10 00:05:51 2002//TBUGZILLA-2_16
+/bug_status.html/1.13/Mon Apr 15 02:47:52 2002//TBUGZILLA-2_16
+/buglist.cgi/1.169.2.10/Wed Jun 19 22:53:25 2002//TBUGZILLA-2_16
+/bugwritinghelp.html/1.3/Mon Apr 15 02:47:53 2002//TBUGZILLA-2_16
+/bugzilla.dtd/1.5/Thu Apr  4 04:19:58 2002//TBUGZILLA-2_16
+/changepassword.cgi/1.21/Sun Jan 20 01:44:37 2002//TBUGZILLA-2_16
+/checksetup.pl/1.149.2.10/Fri Jul 19 14:04:08 2002//TBUGZILLA-2_16
+/colchange.cgi/1.24.2.2/Mon Jun 17 09:39:35 2002//TBUGZILLA-2_16
+/collectstats.pl/1.20/Wed Jun  6 21:17:40 2001//TBUGZILLA-2_16
+/confirmhelp.html/1.3/Mon Apr 15 02:47:53 2002//TBUGZILLA-2_16
+/createaccount.cgi/1.21.2.2/Thu Jul 11 19:25:29 2002//TBUGZILLA-2_16
+/defparams.pl/1.73.2.2/Wed Jul 10 00:05:52 2002//TBUGZILLA-2_16
+/describecomponents.cgi/1.11.2.2/Mon Jun 17 09:39:40 2002//TBUGZILLA-2_16
+/describekeywords.cgi/1.8/Wed Apr 24 07:24:45 2002//TBUGZILLA-2_16
+/doeditparams.cgi/1.17.2.1/Mon Jun 17 09:39:40 2002//TBUGZILLA-2_16
+/duplicates.cgi/1.19/Fri Apr 26 23:18:57 2002//TBUGZILLA-2_16
+/editattachstatuses.cgi/1.7/Mon Apr 29 19:32:27 2002//TBUGZILLA-2_16
+/editcomponents.cgi/1.22.2.2/Mon Jun 17 09:39:41 2002//TBUGZILLA-2_16
+/editgroups.cgi/1.16.2.1/Mon Jun 17 09:39:41 2002//TBUGZILLA-2_16
+/editkeywords.cgi/1.9.2.1/Mon Jun 17 09:39:42 2002//TBUGZILLA-2_16
+/editmilestones.cgi/1.8.2.1/Mon Jun 17 09:39:42 2002//TBUGZILLA-2_16
+/editparams.cgi/1.14.2.1/Mon Jun 17 09:39:42 2002//TBUGZILLA-2_16
+/editproducts.cgi/1.24.2.1/Mon Jun 17 09:39:42 2002//TBUGZILLA-2_16
+/editusers.cgi/1.35.2.2/Mon Jun 17 09:39:44 2002//TBUGZILLA-2_16
+/editversions.cgi/1.11.2.1/Mon Jun 17 09:39:44 2002//TBUGZILLA-2_16
+/enter_bug.cgi/1.66.2.3/Tue Jun 11 13:33:45 2002//TBUGZILLA-2_16
+/globals.pl/1.169.2.9/Sun Jul 28 00:54:28 2002//TBUGZILLA-2_16
+/help.html/1.5/Mon Apr 15 02:47:55 2002//TBUGZILLA-2_16
+/helpemailquery.html/1.2/Mon Apr 15 02:47:55 2002//TBUGZILLA-2_16
+/how_to_mail.html/1.3/Mon Apr 15 02:47:55 2002//TBUGZILLA-2_16
+/importxml.pl/1.23/Sun Apr  7 03:56:46 2002//TBUGZILLA-2_16
+/index.cgi/1.4.2.1/Sun Jun 23 17:36:00 2002//TBUGZILLA-2_16
+/localconfig.js/1.1/Wed Feb 28 23:07:25 2001//TBUGZILLA-2_16
+/long_list.cgi/1.26/Wed Apr 24 07:24:46 2002//TBUGZILLA-2_16
+/move.pl/1.11.2.1/Mon Jun 17 09:39:48 2002//TBUGZILLA-2_16
+/notargetmilestone.html/1.3/Mon Apr 15 02:47:55 2002//TBUGZILLA-2_16
+/post_bug.cgi/1.52.2.5/Wed Jun 26 12:17:25 2002//TBUGZILLA-2_16
+/process_bug.cgi/1.125.2.5/Fri Jul 19 14:04:10 2002//TBUGZILLA-2_16
+/processmail/1.81/Sun Apr 14 04:43:55 2002//TBUGZILLA-2_16
+/query.cgi/1.98.2.1/Mon Jun  3 01:42:15 2002//TBUGZILLA-2_16
+/queryhelp.cgi/1.11.2.2/Mon Jun 17 09:39:45 2002//TBUGZILLA-2_16
+/quicksearch.html/1.3/Mon Apr 15 02:47:55 2002//TBUGZILLA-2_16
+/quicksearch.js/1.9/Mon Dec 24 22:24:35 2001//TBUGZILLA-2_16
+/quicksearchhack.html/1.4/Mon Apr 15 02:47:55 2002//TBUGZILLA-2_16
+/quips.cgi/1.6.2.1/Mon Jun 17 09:39:46 2002//TBUGZILLA-2_16
+/relogin.cgi/1.18/Wed May  8 04:40:35 2002//TBUGZILLA-2_16
+/reports.cgi/1.54/Fri Apr 26 21:09:50 2002//TBUGZILLA-2_16
+/robots.txt/1.2/Wed Apr 24 18:11:00 2002//TBUGZILLA-2_16
+/runtests.sh/1.5/Fri Apr 12 21:15:45 2002//TBUGZILLA-2_16
+/sanitycheck.cgi/1.42/Thu Apr  4 04:19:58 2002//TBUGZILLA-2_16
+/show_activity.cgi/1.9/Wed Apr 24 07:24:49 2002//TBUGZILLA-2_16
+/show_bug.cgi/1.18/Sat Mar 23 17:58:36 2002//TBUGZILLA-2_16
+/showattachment.cgi/1.10/Wed Jan 30 14:14:12 2002//TBUGZILLA-2_16
+/showdependencygraph.cgi/1.18.2.1/Tue Jul  9 23:40:41 2002//TBUGZILLA-2_16
+/showdependencytree.cgi/1.17.2.1/Tue May 21 14:18:00 2002//TBUGZILLA-2_16
+/sidebar.cgi/1.4.2.2/Wed Jul 10 00:05:54 2002//TBUGZILLA-2_16
+/syncshadowdb/1.14/Sun Dec 23 23:23:22 2001//TBUGZILLA-2_16
+/token.cgi/1.7.2.1/Mon Jun 17 09:39:46 2002//TBUGZILLA-2_16
+/userprefs.cgi/1.35.2.1/Mon Jun 17 09:39:47 2002//TBUGZILLA-2_16
+/votehelp.html/1.10/Mon Apr 15 02:47:56 2002//TBUGZILLA-2_16
+/votes.cgi/1.3/Tue May  7 21:28:41 2002//TBUGZILLA-2_16
+/whineatnews.pl/1.7/Sun Feb 17 08:22:31 2002//TBUGZILLA-2_16
+/xml.cgi/1.6.2.1/Mon Jun 17 09:39:48 2002//TBUGZILLA-2_16
 D/contrib////
+D/css////
 D/docs////
 D/t////
+D/template////
diff --git a/CVS/Entries.Log b/CVS/Entries.Log
index e8c5f38d7..9e28d4fb7 100644
--- a/CVS/Entries.Log
+++ b/CVS/Entries.Log
@@ -1,16 +1,4 @@
-A D/Bugzilla////
 A D/Conf////
-A D/DiffPrinter////
-A D/PatchIterator////
-A D/css////
-A D/js////
 A D/oracle////
-A D/template////
-R D/template////
 R D/oracle////
-R D/js////
-R D/css////
-R D/PatchIterator////
-R D/DiffPrinter////
 R D/Conf////
-R D/Bugzilla////
diff --git a/CVS/Tag b/CVS/Tag
index cc64cc0c3..f2ec6389c 100644
--- a/CVS/Tag
+++ b/CVS/Tag
@@ -1 +1 @@
-NBUGZILLA-2_14_5
+NBUGZILLA-2_16
diff --git a/RelationSet.pm b/RelationSet.pm
index 4b778a6fd..8668519b9 100644
--- a/RelationSet.pm
+++ b/RelationSet.pm
@@ -103,8 +103,8 @@ sub generateSqlDeltas {
   if ( $#insertList > -1 ) {
     $sqlInsert = "INSERT INTO $table ($invariantName, $columnName) VALUES " .
       join (",", 
-	    map ( "($invariantValue, $_)" , @insertList ) 
-	   );
+            map ( "($invariantValue, $_)" , @insertList ) 
+           );
   }
      
   # construct the delete list by seeing which relations exist in the
@@ -248,7 +248,7 @@ sub toArrayOfStrings {
     push @result, &::DBID_to_name($i);
   }
 
-  return sort(@result);
+  return sort { lc($a) cmp lc($b) } @result;
 }  
 
 # return this set in string form (comma-separated and sorted)
diff --git a/Token.pm b/Token.pm
index 185884c98..78eef9335 100644
--- a/Token.pm
+++ b/Token.pm
@@ -1,4 +1,3 @@
-#!/usr/bonsaitools/bin/perl -w
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -31,13 +30,82 @@ use strict;
 # Bundle the functions in this file together into the "Token" package.
 package Token;
 
+use Date::Format;
+
 # This module requires that its caller have said "require CGI.pl" to import
 # relevant functions from that script and its companion globals.pl.
 
+################################################################################
+# Constants
+################################################################################
+
+# The maximum number of days a token will remain valid.
+my $maxtokenage = 3;
+
 ################################################################################
 # Functions
 ################################################################################
 
+sub IssueEmailChangeToken {
+    my ($userid, $old_email, $new_email) = @_;
+
+    my $token_ts = time();
+    my $issuedate = time2str("%Y-%m-%d %H:%M", $token_ts);
+
+    # Generate a unique token and insert it into the tokens table.
+    # We have to lock the tokens table before generating the token, 
+    # since the database must be queried for token uniqueness.
+    &::SendSQL("LOCK TABLES tokens WRITE");
+    my $token = GenerateUniqueToken();
+    my $quotedtoken = &::SqlQuote($token);
+    my $quoted_emails = &::SqlQuote($old_email . ":" . $new_email);
+    &::SendSQL("INSERT INTO tokens ( userid , issuedate , token , 
+                                     tokentype , eventdata )
+                VALUES             ( $userid , '$issuedate' , $quotedtoken , 
+                                     'emailold' , $quoted_emails )");
+    my $newtoken = GenerateUniqueToken();
+    $quotedtoken = &::SqlQuote($newtoken);
+    &::SendSQL("INSERT INTO tokens ( userid , issuedate , token , 
+                                     tokentype , eventdata )
+                VALUES             ( $userid , '$issuedate' , $quotedtoken , 
+                                     'emailnew' , $quoted_emails )");
+    &::SendSQL("UNLOCK TABLES");
+
+    # Mail the user the token along with instructions for using it.
+
+    my $template = $::template;
+    my $vars = $::vars;
+
+    $vars->{'oldemailaddress'} = $old_email . &::Param('emailsuffix');
+    $vars->{'newemailaddress'} = $new_email . &::Param('emailsuffix');
+    
+    $vars->{'max_token_age'} = $maxtokenage;
+    $vars->{'token_ts'} = $token_ts;
+
+    $vars->{'token'} = $token;
+    $vars->{'emailaddress'} = $old_email . &::Param('emailsuffix');
+
+    my $message;
+    $template->process("account/email/change-old.txt.tmpl", $vars, \$message)
+      || &::ThrowTemplateError($template->error());
+
+    open SENDMAIL, "|/usr/lib/sendmail -t -i";
+    print SENDMAIL $message;
+    close SENDMAIL;
+
+    $vars->{'token'} = $newtoken;
+    $vars->{'emailaddress'} = $new_email . &::Param('emailsuffix');
+
+    $message = "";
+    $template->process("account/email/change-new.txt.tmpl", $vars, \$message)
+      || &::ThrowTemplateError($template->error());
+
+    open SENDMAIL, "|/usr/lib/sendmail -t -i";
+    print SENDMAIL $message;
+    close SENDMAIL;
+
+}
+
 sub IssuePasswordToken {
     # Generates a random token, adds it to the tokens table, and sends it
     # to the user with instructions for using it to change their password.
@@ -49,6 +117,9 @@ sub IssuePasswordToken {
     &::SendSQL("SELECT userid FROM profiles WHERE login_name = $quotedloginname");
     my ($userid) = &::FetchSQLData();
 
+    my $token_ts = time();
+    my $issuedate = time2str("%Y-%m-%d %H:%M", $token_ts);
+
     # Generate a unique token and insert it into the tokens table.
     # We have to lock the tokens table before generating the token, 
     # since the database must be queried for token uniqueness.
@@ -57,12 +128,37 @@ sub IssuePasswordToken {
     my $quotedtoken = &::SqlQuote($token);
     my $quotedipaddr = &::SqlQuote($::ENV{'REMOTE_ADDR'});
     &::SendSQL("INSERT INTO tokens ( userid , issuedate , token , tokentype , eventdata )
-                VALUES      ( $userid , NOW() , $quotedtoken , 'password' , $quotedipaddr )");
+                VALUES      ( $userid , '$issuedate' , $quotedtoken , 'password' , $quotedipaddr )");
     &::SendSQL("UNLOCK TABLES");
 
     # Mail the user the token along with instructions for using it.
-    MailPasswordToken($loginname, $token);
+    
+    my $template = $::template;
+    my $vars = $::vars;
+
+    $vars->{'token'} = $token;
+    $vars->{'emailaddress'} = $loginname . &::Param('emailsuffix');
 
+    $vars->{'max_token_age'} = $maxtokenage;
+    $vars->{'token_ts'} = $token_ts;
+
+    my $message = "";
+    $template->process("account/password/forgotten-password.txt.tmpl", 
+                                                               $vars, \$message)
+      || &::ThrowTemplateError($template->error());
+
+    open SENDMAIL, "|/usr/lib/sendmail -t -i";
+    print SENDMAIL $message;
+    close SENDMAIL;
+
+}
+
+
+sub CleanTokenTable {
+    &::SendSQL("LOCK TABLES tokens WRITE");
+    &::SendSQL("DELETE FROM tokens 
+                WHERE TO_DAYS(NOW()) - TO_DAYS(issuedate) >= " . $maxtokenage);
+    &::SendSQL("UNLOCK TABLES");
 }
 
 
@@ -92,34 +188,6 @@ sub GenerateUniqueToken {
 
 }
 
-sub MailPasswordToken {
-    # Emails a password token to a user along with instructions for its use.
-    # Called exclusively from &IssuePasswordToken.
-
-    my ($emailaddress, $token) = @_;
-
-    my $urlbase = &::Param("urlbase");
-    my $emailsuffix = &::Param('emailsuffix');
-    $token = &::url_quote($token);
-
-    open SENDMAIL, "|/usr/lib/sendmail -t";
-
-    print SENDMAIL qq|From: bugzilla-daemon
-To: $emailaddress$emailsuffix
-Subject: Bugzilla Change Password Request
-
-You or someone impersonating you has requested to change your Bugzilla
-password.  To change your password, visit the following link:
-
-${urlbase}token.cgi?a=cfmpw&t=$token
-
-If you are not the person who made this request, or you wish to cancel
-this request, visit the following link:
-
-${urlbase}token.cgi?a=cxlpw&t=$token
-|;
-    close SENDMAIL;
-}
 
 sub Cancel {
     # Cancels a previously issued token and notifies the system administrator.
@@ -144,25 +212,26 @@ sub Cancel {
     # Format the user's real name and email address into a single string.
     my $username = $realname ? $realname . " <" . $loginname . ">" : $loginname;
 
+    my $template = $::template;
+    my $vars = $::vars;
+
+    $vars->{'emailaddress'} = $username;
+    $vars->{'maintainer'} = $maintainer;
+    $vars->{'remoteaddress'} = $::ENV{'REMOTE_ADDR'};
+    $vars->{'token'} = $token;
+    $vars->{'tokentype'} = $tokentype;
+    $vars->{'issuedate'} = $issuedate;
+    $vars->{'eventdata'} = $eventdata;
+    $vars->{'cancelaction'} = $cancelaction;
+
     # Notify the user via email about the cancellation.
-    open SENDMAIL, "|/usr/lib/sendmail -t";
-    print SENDMAIL qq|From: bugzilla-daemon
-To: $username
-Subject: "$tokentype" token cancelled
-
-A token was cancelled from $::ENV{'REMOTE_ADDR'}.  This is either 
-an honest mistake or the result of a malicious hack attempt.  
-Take a look at the information below and forward this email 
-to $maintainer if you suspect foul play.
-
-            Token: $token
-       Token Type: $tokentype
-             User: $username
-       Issue Date: $issuedate
-       Event Data: $eventdata
-
-Cancelled Because: $cancelaction
-|;
+
+    my $message;
+    $template->process("account/cancel-token.txt.tmpl", $vars, \$message)
+      || &::ThrowTemplateError($template->error());
+
+    open SENDMAIL, "|/usr/lib/sendmail -t -i";
+    print SENDMAIL $message;
     close SENDMAIL;
 
     # Delete the token from the database.
@@ -172,14 +241,29 @@ Cancelled Because: $cancelaction
 }
 
 sub HasPasswordToken {
-    # Returns a password token if the user has one.  Otherwise returns 0 (false).
+    # Returns a password token if the user has one.
+    
+    my ($userid) = @_;
+    
+    &::SendSQL("SELECT token FROM tokens 
+                WHERE userid = $userid AND tokentype = 'password' LIMIT 1");
+    my ($token) = &::FetchSQLData();
+    
+    return $token;
+}
+
+sub HasEmailChangeToken {
+    # Returns an email change token if the user has one. 
     
     my ($userid) = @_;
     
-    &::SendSQL("SELECT token FROM tokens WHERE userid = $userid LIMIT 1");
+    &::SendSQL("SELECT token FROM tokens WHERE userid = $userid " . 
+               "AND (tokentype = 'emailnew' OR tokentype = 'emailold') " . 
+               "LIMIT 1");
     my ($token) = &::FetchSQLData();
     
     return $token;
 }
 
+
 1;
diff --git a/UPGRADING-pre-2.8 b/UPGRADING-pre-2.8
index 3c98c2c36..b01d98269 100644
--- a/UPGRADING-pre-2.8
+++ b/UPGRADING-pre-2.8
@@ -255,7 +255,7 @@ column, but you might as well be safe and add it anyway:
 	alter table products add column milestoneurl tinytext not null;
 
 
-1/29/99 Whoops; had a mispelled op_sys.  It was "Mac System 7.1.6"; it should
+1/29/99 Whoops; had a misspelled op_sys.  It was "Mac System 7.1.6"; it should
 be "Mac System 7.6.1".  It turns out I had no bugs with this value set, so I
 could just do the below simple command.  If you have bugs with this value, you
 may need to do something more complicated.
diff --git a/attachment.cgi b/attachment.cgi
new file mode 100755
index 000000000..f45b4efd3
--- /dev/null
+++ b/attachment.cgi
@@ -0,0 +1,788 @@
+#!/usr/bonsaitools/bin/perl -wT
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is the Bugzilla Bug Tracking System.
+#
+# The Initial Developer of the Original Code is Netscape Communications
+# Corporation. Portions created by Netscape are
+# Copyright (C) 1998 Netscape Communications Corporation. All
+# Rights Reserved.
+#
+# Contributor(s): Terry Weissman <terry@mozilla.org>
+#                 Myk Melez <myk@mozilla.org>
+
+################################################################################
+# Script Initialization
+################################################################################
+
+# Make it harder for us to do dangerous things in Perl.
+use diagnostics;
+use strict;
+
+use lib qw(.);
+
+use vars qw(
+  $template
+  $vars
+);
+
+# Include the Bugzilla CGI and general utility library.
+require "CGI.pl";
+
+# Establish a connection to the database backend.
+ConnectToDatabase();
+
+# Check whether or not the user is logged in and, if so, set the $::userid 
+# and $::usergroupset variables.
+quietly_check_login();
+
+################################################################################
+# Main Body Execution
+################################################################################
+
+# All calls to this script should contain an "action" variable whose value
+# determines what the user wants to do.  The code below checks the value of
+# that variable and runs the appropriate code.
+
+# Determine whether to use the action specified by the user or the default.
+my $action = $::FORM{'action'} || 'view';
+
+if ($action eq "view")  
+{ 
+  validateID();
+  view(); 
+}
+elsif ($action eq "viewall") 
+{ 
+  ValidateBugID($::FORM{'bugid'});
+  viewall(); 
+}
+elsif ($action eq "enter") 
+{ 
+  confirm_login();
+  ValidateBugID($::FORM{'bugid'});
+  enter(); 
+}
+elsif ($action eq "insert")
+{
+  confirm_login();
+  ValidateBugID($::FORM{'bugid'});
+  ValidateComment($::FORM{'comment'});
+  validateFilename();
+  validateData();
+  validateDescription();
+  validateIsPatch();
+  validateContentType() unless $::FORM{'ispatch'};
+  validateObsolete() if $::FORM{'obsolete'};
+  insert();
+}
+elsif ($action eq "edit") 
+{ 
+  quietly_check_login();
+  validateID();
+  validateCanEdit($::FORM{'id'});
+  edit(); 
+}
+elsif ($action eq "update") 
+{ 
+  confirm_login();
+  ValidateComment($::FORM{'comment'});
+  validateID();
+  validateCanEdit($::FORM{'id'});
+  validateDescription();
+  validateIsPatch();
+  validateContentType() unless $::FORM{'ispatch'};
+  validateIsObsolete();
+  validateStatuses();
+  update();
+}
+else 
+{ 
+  DisplayError("I could not figure out what you wanted to do.")
+}
+
+exit;
+
+################################################################################
+# Data Validation / Security Authorization
+################################################################################
+
+sub validateID
+{
+  # Validate the value of the "id" form field, which must contain an
+  # integer that is the ID of an existing attachment.
+
+  detaint_natural($::FORM{'id'})
+    || DisplayError("You did not enter a valid attachment number.") 
+      && exit;
+  
+  # Make sure the attachment exists in the database.
+  SendSQL("SELECT bug_id FROM attachments WHERE attach_id = $::FORM{'id'}");
+  MoreSQLData()
+    || DisplayError("Attachment #$::FORM{'id'} does not exist.") 
+    && exit;
+
+  # Make sure the user is authorized to access this attachment's bug.
+  my ($bugid) = FetchSQLData();
+  ValidateBugID($bugid);
+}
+
+sub validateCanEdit
+{
+    my ($attach_id) = (@_);
+
+    # If the user is not logged in, claim that they can edit. This allows
+    # the edit scrren to be displayed to people who aren't logged in.
+    # People not logged in can't actually commit changes, because that code
+    # calls confirm_login, not quietly_check_login, before calling this sub
+    return if $::userid == 0;
+
+    # People in editbugs can edit all attachments
+    return if UserInGroup("editbugs");
+
+    # Bug 97729 - the submitter can edit their attachments
+    SendSQL("SELECT attach_id FROM attachments WHERE " .
+            "attach_id = $attach_id AND submitter_id = $::userid");
+
+    FetchSQLData()
+      || DisplayError("You are not authorised to edit attachment #$attach_id")
+      && exit;
+}
+
+sub validateDescription
+{
+  $::FORM{'description'}
+    || DisplayError("You must enter a description for the attachment.")
+      && exit;
+}
+
+sub validateIsPatch
+{
+  # Set the ispatch flag to zero if it is undefined, since the UI uses
+  # an HTML checkbox to represent this flag, and unchecked HTML checkboxes
+  # do not get sent in HTML requests.
+  $::FORM{'ispatch'} = $::FORM{'ispatch'} ? 1 : 0;
+
+  # Set the content type to text/plain if the attachment is a patch.
+  $::FORM{'contenttype'} = "text/plain" if $::FORM{'ispatch'};
+}
+
+sub validateContentType
+{
+  if (!$::FORM{'contenttypemethod'})
+  {
+    DisplayError("You must choose a method for determining the content type,
+      either <em>auto-detect</em>, <em>select from list</em>, or <em>enter 
+      manually</em>.");
+    exit;
+  }
+  elsif ($::FORM{'contenttypemethod'} eq 'autodetect')
+  {
+    # The user asked us to auto-detect the content type, so use the type
+    # specified in the HTTP request headers.
+    if ( !$::FILE{'data'}->{'contenttype'} )
+    {
+      DisplayError("You asked Bugzilla to auto-detect the content type, but
+        your browser did not specify a content type when uploading the file, 
+        so you must enter a content type manually.");
+      exit;
+    }
+    $::FORM{'contenttype'} = $::FILE{'data'}->{'contenttype'};
+  }
+  elsif ($::FORM{'contenttypemethod'} eq 'list')
+  {
+    # The user selected a content type from the list, so use their selection.
+    $::FORM{'contenttype'} = $::FORM{'contenttypeselection'};
+  }
+  elsif ($::FORM{'contenttypemethod'} eq 'manual')
+  {
+    # The user entered a content type manually, so use their entry.
+    $::FORM{'contenttype'} = $::FORM{'contenttypeentry'};
+  }
+  else
+  {
+    my $htmlcontenttypemethod = html_quote($::FORM{'contenttypemethod'});
+    DisplayError("Your form submission got corrupted somehow.  The <em>content
+      method</em> field, which specifies how the content type gets determined,
+      should have been either <em>autodetect</em>, <em>list</em>, 
+      or <em>manual</em>, but was instead <em>$htmlcontenttypemethod</em>.");
+    exit;
+  }
+
+  if ( $::FORM{'contenttype'} !~ /^(application|audio|image|message|model|multipart|text|video)\/.+$/ )
+  {
+    my $htmlcontenttype = html_quote($::FORM{'contenttype'});
+    DisplayError("The content type <em>$htmlcontenttype</em> is invalid.
+      Valid types must be of the form <em>foo/bar</em> where <em>foo</em> 
+      is either <em>application, audio, image, message, model, multipart, 
+      text,</em> or <em>video</em>.");
+    exit;
+  }
+}
+
+sub validateIsObsolete
+{
+  # Set the isobsolete flag to zero if it is undefined, since the UI uses
+  # an HTML checkbox to represent this flag, and unchecked HTML checkboxes
+  # do not get sent in HTML requests.
+  $::FORM{'isobsolete'} = $::FORM{'isobsolete'} ? 1 : 0;
+}
+
+sub validateStatuses
+{
+  # Get a list of attachment statuses that are valid for this attachment.
+  PushGlobalSQLState();
+  SendSQL("SELECT  attachstatusdefs.id
+           FROM    attachments, bugs, attachstatusdefs
+           WHERE   attachments.attach_id = $::FORM{'id'}
+           AND     attachments.bug_id = bugs.bug_id
+           AND     attachstatusdefs.product = bugs.product");
+  my @statusdefs;
+  push(@statusdefs, FetchSQLData()) while MoreSQLData();
+  PopGlobalSQLState();
+  
+  foreach my $status (@{$::MFORM{'status'}})
+  {
+    grep($_ == $status, @statusdefs)
+      || DisplayError("One of the statuses you entered is not a valid status
+                       for this attachment.")
+        && exit;
+    # We have tested that the status is valid, so it can be detainted
+    detaint_natural($status);
+  }
+}
+
+sub validateData
+{
+  $::FORM{'data'}
+    || DisplayError("The file you are trying to attach is empty!")
+      && exit;
+
+  my $len = length($::FORM{'data'});
+
+  my $maxpatchsize = Param('maxpatchsize');
+  my $maxattachmentsize = Param('maxattachmentsize');
+  
+  # Makes sure the attachment does not exceed either the "maxpatchsize" or 
+  # the "maxattachmentsize" parameter.
+  if ( $::FORM{'ispatch'} && $maxpatchsize && $len > $maxpatchsize*1024 )
+  {
+    my $lenkb = sprintf("%.0f", $len/1024);
+    DisplayError("The file you are trying to attach is ${lenkb} kilobytes (KB) in size.  
+                  Patches cannot be more than ${maxpatchsize}KB in size.
+                  Try breaking your patch into several pieces.");
+    exit;
+  } elsif ( !$::FORM{'ispatch'} && $maxattachmentsize && $len > $maxattachmentsize*1024 ) {
+    my $lenkb = sprintf("%.0f", $len/1024);
+    DisplayError("The file you are trying to attach is ${lenkb} kilobytes (KB) in size.  
+                  Non-patch attachments cannot be more than ${maxattachmentsize}KB.
+                  If your attachment is an image, try converting it to a compressable
+                  format like JPG or PNG, or put it elsewhere on the web and
+                  link to it from the bug's URL field or in a comment on the bug.");
+    exit;
+  }
+}
+
+sub validateFilename
+{
+  defined $::FILE{'data'}
+    || DisplayError("You did not specify a file to attach.")
+      && exit;
+}
+
+sub validateObsolete
+{
+  # Make sure the attachment id is valid and the user has permissions to view
+  # the bug to which it is attached.
+  foreach my $attachid (@{$::MFORM{'obsolete'}}) {
+    detaint_natural($attachid)
+      || DisplayError("The attachment number of one of the attachments 
+           you wanted to obsolete is invalid.") 
+        && exit;
+  
+    SendSQL("SELECT bug_id, isobsolete, description 
+             FROM attachments WHERE attach_id = $attachid");
+
+    # Make sure the attachment exists in the database.
+    MoreSQLData()
+      || DisplayError("Attachment #$attachid does not exist.") 
+        && exit;
+
+    my ($bugid, $isobsolete, $description) = FetchSQLData();
+
+    if ($bugid != $::FORM{'bugid'})
+    {
+      $description = html_quote($description);
+      DisplayError("Attachment #$attachid ($description) is attached 
+        to bug #$bugid, but you tried to flag it as obsolete while
+        creating a new attachment to bug #$::FORM{'bugid'}.");
+      exit;
+    }
+
+    if ( $isobsolete )
+    {
+      $description = html_quote($description);
+      DisplayError("Attachment #$attachid ($description) is already obsolete.");
+      exit;
+    }
+
+    # Check that the user can modify this attachment
+    validateCanEdit($attachid);
+  }
+
+}
+
+################################################################################
+# Functions
+################################################################################
+
+sub view
+{
+  # Display an attachment.
+
+  # Retrieve the attachment content and its content type from the database.
+  SendSQL("SELECT mimetype, thedata FROM attachments WHERE attach_id = $::FORM{'id'}");
+  my ($contenttype, $thedata) = FetchSQLData();
+    
+  # Return the appropriate HTTP response headers.
+  print "Content-Type: $contenttype\n\n";
+
+  print $thedata;
+}
+
+
+sub viewall
+{
+  # Display all attachments for a given bug in a series of IFRAMEs within one HTML page.
+
+  # Retrieve the attachments from the database and write them into an array
+  # of hashes where each hash represents one attachment.
+  SendSQL("SELECT attach_id, creation_ts, mimetype, description, ispatch, isobsolete 
+           FROM attachments WHERE bug_id = $::FORM{'bugid'} ORDER BY attach_id");
+  my @attachments; # the attachments array
+  while (MoreSQLData())
+  {
+    my %a; # the attachment hash
+    ($a{'attachid'}, $a{'date'}, $a{'contenttype'}, 
+     $a{'description'}, $a{'ispatch'}, $a{'isobsolete'}) = FetchSQLData();
+
+    # Format the attachment's creation/modification date into something readable.
+    if ($a{'date'} =~ /^(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/) {
+        $a{'date'} = "$3/$4/$2&nbsp;$5:$6";
+    }
+
+    # Flag attachments as to whether or not they can be viewed (as opposed to
+    # being downloaded).  Currently I decide they are viewable if their MIME type 
+    # is either text/*, image/*, or application/vnd.mozilla.*.
+    # !!! Yuck, what an ugly hack.  Fix it!
+    $a{'isviewable'} = ( $a{'contenttype'} =~ /^(text|image|application\/vnd\.mozilla\.)/ );
+
+    # Retrieve a list of status flags that have been set on the attachment.
+    PushGlobalSQLState();
+    SendSQL("SELECT    name 
+             FROM      attachstatuses, attachstatusdefs 
+             WHERE     attach_id = $a{'attachid'} 
+             AND       attachstatuses.statusid = attachstatusdefs.id
+             ORDER BY  sortkey");
+    my @statuses;
+    push(@statuses, FetchSQLData()) while MoreSQLData();
+    $a{'statuses'} = \@statuses;
+    PopGlobalSQLState();
+
+    # Add the hash representing the attachment to the array of attachments.
+    push @attachments, \%a;
+  }
+
+  # Retrieve the bug summary for displaying on screen.
+  SendSQL("SELECT short_desc FROM bugs WHERE bug_id = $::FORM{'bugid'}");
+  my ($bugsummary) = FetchSQLData();
+
+  # Define the variables and functions that will be passed to the UI template.
+  $vars->{'bugid'} = $::FORM{'bugid'};
+  $vars->{'bugsummary'} = $bugsummary;
+  $vars->{'attachments'} = \@attachments;
+
+  # Return the appropriate HTTP response headers.
+  print "Content-Type: text/html\n\n";
+
+  # Generate and return the UI (HTML page) from the appropriate template.
+  $template->process("attachment/show-multiple.html.tmpl", $vars)
+    || ThrowTemplateError($template->error());
+}
+
+
+sub enter
+{
+  # Display a form for entering a new attachment.
+
+  # Retrieve the attachments the user can edit from the database and write
+  # them into an array of hashes where each hash represents one attachment.
+  my $canEdit = "";
+  if (!UserInGroup("editbugs")) {
+      $canEdit = "AND submitter_id = $::userid";
+  }
+  SendSQL("SELECT attach_id, description 
+           FROM attachments
+           WHERE bug_id = $::FORM{'bugid'}
+           AND isobsolete = 0 $canEdit
+           ORDER BY attach_id");
+  my @attachments; # the attachments array
+  while ( MoreSQLData() ) {
+    my %a; # the attachment hash
+    ($a{'id'}, $a{'description'}) = FetchSQLData();
+
+    # Add the hash representing the attachment to the array of attachments.
+    push @attachments, \%a;
+  }
+
+  # Retrieve the bug summary for displaying on screen.
+  SendSQL("SELECT short_desc FROM bugs WHERE bug_id = $::FORM{'bugid'}");
+  my ($bugsummary) = FetchSQLData();
+
+  # Define the variables and functions that will be passed to the UI template.
+  $vars->{'bugid'} = $::FORM{'bugid'};
+  $vars->{'bugsummary'} = $bugsummary;
+  $vars->{'attachments'} = \@attachments;
+
+  # Return the appropriate HTTP response headers.
+  print "Content-Type: text/html\n\n";
+
+  # Generate and return the UI (HTML page) from the appropriate template.
+  $template->process("attachment/create.html.tmpl", $vars)
+    || ThrowTemplateError($template->error());
+}
+
+
+sub insert
+{
+  # Insert a new attachment into the database.
+
+  # Escape characters in strings that will be used in SQL statements.
+  my $filename = SqlQuote($::FILE{'data'}->{'filename'});
+  my $description = SqlQuote($::FORM{'description'});
+  my $contenttype = SqlQuote($::FORM{'contenttype'});
+  my $thedata = SqlQuote($::FORM{'data'});
+
+  # Insert the attachment into the database.
+  SendSQL("INSERT INTO attachments (bug_id, filename, description, mimetype, ispatch, submitter_id, thedata) 
+           VALUES ($::FORM{'bugid'}, $filename, $description, $contenttype, $::FORM{'ispatch'}, $::userid, $thedata)");
+
+  # Retrieve the ID of the newly created attachment record.
+  SendSQL("SELECT LAST_INSERT_ID()");
+  my $attachid = FetchOneColumn();
+
+  # Insert a comment about the new attachment into the database.
+  my $comment = "Created an attachment (id=$attachid)\n$::FORM{'description'}\n";
+  $comment .= ("\n" . $::FORM{'comment'}) if $::FORM{'comment'};
+
+  use Text::Wrap;
+  $Text::Wrap::columns = 80;
+  $Text::Wrap::huge = 'overflow';
+  $comment = Text::Wrap::wrap('', '', $comment);
+
+  AppendComment($::FORM{'bugid'}, 
+                $::COOKIE{"Bugzilla_login"},
+                $comment);
+
+  # Make existing attachments obsolete.
+  my $fieldid = GetFieldID('attachments.isobsolete');
+  foreach my $attachid (@{$::MFORM{'obsolete'}}) {
+    SendSQL("UPDATE attachments SET isobsolete = 1 WHERE attach_id = $attachid");
+    SendSQL("INSERT INTO bugs_activity (bug_id, attach_id, who, bug_when, fieldid, removed, added) 
+             VALUES ($::FORM{'bugid'}, $attachid, $::userid, NOW(), $fieldid, '0', '1')");
+  }
+
+  # Send mail to let people know the attachment has been created.  Uses a 
+  # special syntax of the "open" and "exec" commands to capture the output of 
+  # "processmail", which "system" doesn't allow, without running the command 
+  # through a shell, which backticks (``) do.
+  #system ("./processmail", $bugid , $::userid);
+  #my $mailresults = `./processmail $bugid $::userid`;
+  my $mailresults = '';
+  open(PMAIL, "-|") or exec('./processmail', $::FORM{'bugid'}, $::COOKIE{'Bugzilla_login'});
+  $mailresults .= $_ while <PMAIL>;
+  close(PMAIL);
+ 
+  # Define the variables and functions that will be passed to the UI template.
+  $vars->{'bugid'} = $::FORM{'bugid'};
+  $vars->{'attachid'} = $attachid;
+  $vars->{'description'} = $description;
+  $vars->{'mailresults'} = $mailresults;
+  $vars->{'contenttypemethod'} = $::FORM{'contenttypemethod'};
+  $vars->{'contenttype'} = $::FORM{'contenttype'};
+
+  # Return the appropriate HTTP response headers.
+  print "Content-Type: text/html\n\n";
+
+  # Generate and return the UI (HTML page) from the appropriate template.
+  $template->process("attachment/created.html.tmpl", $vars)
+    || ThrowTemplateError($template->error());
+}
+
+
+sub edit
+{
+  # Edit an attachment record.  Users with "editbugs" privileges, (or the 
+  # original attachment's submitter) can edit the attachment's description,
+  # content type, ispatch and isobsolete flags, and statuses, and they can
+  # also submit a comment that appears in the bug.
+  # Users cannot edit the content of the attachment itself.
+
+  # Retrieve the attachment from the database.
+  SendSQL("SELECT description, mimetype, bug_id, ispatch, isobsolete 
+           FROM attachments WHERE attach_id = $::FORM{'id'}");
+  my ($description, $contenttype, $bugid, $ispatch, $isobsolete) = FetchSQLData();
+
+  # Flag attachment as to whether or not it can be viewed (as opposed to
+  # being downloaded).  Currently I decide it is viewable if its content
+  # type is either text/.* or application/vnd.mozilla.*.
+  # !!! Yuck, what an ugly hack.  Fix it!
+  my $isviewable = ( $contenttype =~ /^(text|image|application\/vnd\.mozilla\.)/ );
+
+  # Retrieve a list of status flags that have been set on the attachment.
+  my %statuses;
+  SendSQL("SELECT  id, name 
+           FROM    attachstatuses JOIN attachstatusdefs 
+           WHERE   attachstatuses.statusid = attachstatusdefs.id 
+           AND     attach_id = $::FORM{'id'}");
+  while ( my ($id, $name) = FetchSQLData() )
+  {
+    $statuses{$id} = $name;
+  }
+
+  # Retrieve a list of statuses for this bug's product, and build an array 
+  # of hashes in which each hash is a status flag record.
+  # ???: Move this into versioncache or its own routine?
+  my @statusdefs;
+  SendSQL("SELECT   id, name 
+           FROM     attachstatusdefs, bugs 
+           WHERE    bug_id = $bugid 
+           AND      attachstatusdefs.product = bugs.product 
+           ORDER BY sortkey");
+  while ( MoreSQLData() )
+  {
+    my ($id, $name) = FetchSQLData();
+    push @statusdefs, { 'id' => $id , 'name' => $name };
+  }
+
+  # Retrieve a list of attachments for this bug as well as a summary of the bug
+  # to use in a navigation bar across the top of the screen.
+  SendSQL("SELECT attach_id FROM attachments WHERE bug_id = $bugid ORDER BY attach_id");
+  my @bugattachments;
+  push(@bugattachments, FetchSQLData()) while (MoreSQLData());
+  SendSQL("SELECT short_desc FROM bugs WHERE bug_id = $bugid");
+  my ($bugsummary) = FetchSQLData();
+
+  # Define the variables and functions that will be passed to the UI template.
+  $vars->{'attachid'} = $::FORM{'id'}; 
+  $vars->{'description'} = $description; 
+  $vars->{'contenttype'} = $contenttype; 
+  $vars->{'bugid'} = $bugid; 
+  $vars->{'bugsummary'} = $bugsummary; 
+  $vars->{'ispatch'} = $ispatch; 
+  $vars->{'isobsolete'} = $isobsolete; 
+  $vars->{'isviewable'} = $isviewable; 
+  $vars->{'statuses'} = \%statuses; 
+  $vars->{'statusdefs'} = \@statusdefs; 
+  $vars->{'attachments'} = \@bugattachments; 
+
+  # Return the appropriate HTTP response headers.
+  print "Content-Type: text/html\n\n";
+
+  # Generate and return the UI (HTML page) from the appropriate template.
+  $template->process("attachment/edit.html.tmpl", $vars)
+    || ThrowTemplateError($template->error());
+}
+
+
+sub update
+{
+  # Update an attachment record.
+
+  # Get the bug ID for the bug to which this attachment is attached.
+  SendSQL("SELECT bug_id FROM attachments WHERE attach_id = $::FORM{'id'}");
+  my $bugid = FetchSQLData() 
+    || DisplayError("Cannot figure out bug number.")
+    && exit;
+
+  # Lock database tables in preparation for updating the attachment.
+  SendSQL("LOCK TABLES attachments WRITE , attachstatuses WRITE , 
+           attachstatusdefs READ , fielddefs READ , bugs_activity WRITE");
+
+  # Get a copy of the attachment record before we make changes
+  # so we can record those changes in the activity table.
+  SendSQL("SELECT description, mimetype, ispatch, isobsolete 
+           FROM attachments WHERE attach_id = $::FORM{'id'}");
+  my ($olddescription, $oldcontenttype, $oldispatch, $oldisobsolete) = FetchSQLData();
+
+  # Get the list of old status flags.
+  SendSQL("SELECT    attachstatusdefs.name 
+           FROM      attachments, attachstatuses, attachstatusdefs
+           WHERE     attachments.attach_id = $::FORM{'id'}
+           AND       attachments.attach_id = attachstatuses.attach_id
+           AND       attachstatuses.statusid = attachstatusdefs.id
+           ORDER BY  attachstatusdefs.sortkey
+          ");
+  my @oldstatuses;
+  while (MoreSQLData()) {
+    push(@oldstatuses, FetchSQLData());
+  }
+  my $oldstatuslist = join(', ', @oldstatuses);
+
+  # Update the database with the new status flags.
+  SendSQL("DELETE FROM attachstatuses WHERE attach_id = $::FORM{'id'}");
+  foreach my $statusid (@{$::MFORM{'status'}}) 
+  {
+    SendSQL("INSERT INTO attachstatuses (attach_id, statusid) VALUES ($::FORM{'id'}, $statusid)");
+  }
+
+  # Get the list of new status flags.
+  SendSQL("SELECT    attachstatusdefs.name 
+           FROM      attachments, attachstatuses, attachstatusdefs
+           WHERE     attachments.attach_id = $::FORM{'id'}
+           AND       attachments.attach_id = attachstatuses.attach_id
+           AND       attachstatuses.statusid = attachstatusdefs.id
+           ORDER BY  attachstatusdefs.sortkey
+          ");
+  my @newstatuses;
+  while (MoreSQLData()) {
+    push(@newstatuses, FetchSQLData());
+  }
+  my $newstatuslist = join(', ', @newstatuses);
+
+  # Quote the description and content type for use in the SQL UPDATE statement.
+  my $quoteddescription = SqlQuote($::FORM{'description'});
+  my $quotedcontenttype = SqlQuote($::FORM{'contenttype'});
+
+  # Update the attachment record in the database.
+  # Sets the creation timestamp to itself to avoid it being updated automatically.
+  SendSQL("UPDATE  attachments 
+           SET     description = $quoteddescription , 
+                   mimetype = $quotedcontenttype , 
+                   ispatch = $::FORM{'ispatch'} , 
+                   isobsolete = $::FORM{'isobsolete'} , 
+                   creation_ts = creation_ts
+           WHERE   attach_id = $::FORM{'id'}
+         ");
+
+  # Record changes in the activity table.
+  if ($olddescription ne $::FORM{'description'}) {
+    my $quotedolddescription = SqlQuote($olddescription);
+    my $fieldid = GetFieldID('attachments.description');
+    SendSQL("INSERT INTO bugs_activity (bug_id, attach_id, who, bug_when, fieldid, removed, added) 
+             VALUES ($bugid, $::FORM{'id'}, $::userid, NOW(), $fieldid, $quotedolddescription, $quoteddescription)");
+  }
+  if ($oldcontenttype ne $::FORM{'contenttype'}) {
+    my $quotedoldcontenttype = SqlQuote($oldcontenttype);
+    my $fieldid = GetFieldID('attachments.mimetype');
+    SendSQL("INSERT INTO bugs_activity (bug_id, attach_id, who, bug_when, fieldid, removed, added) 
+             VALUES ($bugid, $::FORM{'id'}, $::userid, NOW(), $fieldid, $quotedoldcontenttype, $quotedcontenttype)");
+  }
+  if ($oldispatch ne $::FORM{'ispatch'}) {
+    my $fieldid = GetFieldID('attachments.ispatch');
+    SendSQL("INSERT INTO bugs_activity (bug_id, attach_id, who, bug_when, fieldid, removed, added) 
+             VALUES ($bugid, $::FORM{'id'}, $::userid, NOW(), $fieldid, $oldispatch, $::FORM{'ispatch'})");
+  }
+  if ($oldisobsolete ne $::FORM{'isobsolete'}) {
+    my $fieldid = GetFieldID('attachments.isobsolete');
+    SendSQL("INSERT INTO bugs_activity (bug_id, attach_id, who, bug_when, fieldid, removed, added) 
+             VALUES ($bugid, $::FORM{'id'}, $::userid, NOW(), $fieldid, $oldisobsolete, $::FORM{'isobsolete'})");
+  }
+  if ($oldstatuslist ne $newstatuslist) {
+    my ($removed, $added) = DiffStrings($oldstatuslist, $newstatuslist);
+    my $quotedremoved = SqlQuote($removed);
+    my $quotedadded = SqlQuote($added);
+    my $fieldid = GetFieldID('attachstatusdefs.name');
+    SendSQL("INSERT INTO bugs_activity (bug_id, attach_id, who, bug_when, fieldid, removed, added) 
+             VALUES ($bugid, $::FORM{'id'}, $::userid, NOW(), $fieldid, $quotedremoved, $quotedadded)");
+  }
+
+  # Unlock all database tables now that we are finished updating the database.
+  SendSQL("UNLOCK TABLES");
+
+  # If this installation has enabled the request manager, let the manager know
+  # an attachment was updated so it can check for requests on that attachment
+  # and fulfill them.  The request manager allows users to request database
+  # changes of other users and tracks the fulfillment of those requests.  When
+  # an attachment record is updated and the request manager is called, it will
+  # fulfill those requests that were requested of the user performing the update
+  # which are requests for the attachment being updated.
+  #my $requests;
+  #if (Param('userequestmanager'))
+  #{
+  #  use Request;
+  #  # Specify the fieldnames that have been updated.
+  #  my @fieldnames = ('description', 'mimetype', 'status', 'ispatch', 'isobsolete');
+  #  # Fulfill pending requests.
+  #  $requests = Request::fulfillRequest('attachment', $::FORM{'id'}, @fieldnames);
+  #  $vars->{'requests'} = $requests; 
+  #}
+
+  # If the user submitted a comment while editing the attachment, 
+  # add the comment to the bug.
+  if ( $::FORM{'comment'} )
+  {
+    use Text::Wrap;
+    $Text::Wrap::columns = 80;
+    $Text::Wrap::huge = 'wrap';
+
+    # Append a string to the comment to let users know that the comment came from
+    # the "edit attachment" screen.
+    my $comment = qq|(From update of attachment $::FORM{'id'})\n| . $::FORM{'comment'};
+
+    my $wrappedcomment = "";
+    foreach my $line (split(/\r\n|\r|\n/, $comment))
+    {
+      if ( $line =~ /^>/ )
+      {
+        $wrappedcomment .= $line . "\n";
+      }
+      else
+      {
+        $wrappedcomment .= wrap('', '', $line) . "\n";
+      }
+    }
+
+    # Get the user's login name since the AppendComment function needs it.
+    my $who = DBID_to_name($::userid);
+    # Mention $::userid again so Perl doesn't give me a warning about it.
+    my $neverused = $::userid;
+
+    # Append the comment to the list of comments in the database.
+    AppendComment($bugid, $who, $wrappedcomment);
+
+  }
+
+  # Send mail to let people know the bug has changed.  Uses a special syntax
+  # of the "open" and "exec" commands to capture the output of "processmail",
+  # which "system" doesn't allow, without running the command through a shell,
+  # which backticks (``) do.
+  #system ("./processmail", $bugid , $::userid);
+  #my $mailresults = `./processmail $bugid $::userid`;
+  my $mailresults = '';
+  open(PMAIL, "-|") or exec('./processmail', $bugid, DBID_to_name($::userid));
+  $mailresults .= $_ while <PMAIL>;
+  close(PMAIL);
+ 
+  # Define the variables and functions that will be passed to the UI template.
+  $vars->{'attachid'} = $::FORM{'id'}; 
+  $vars->{'bugid'} = $bugid; 
+  $vars->{'mailresults'} = $mailresults; 
+
+  # Return the appropriate HTTP response headers.
+  print "Content-Type: text/html\n\n";
+
+  # Generate and return the UI (HTML page) from the appropriate template.
+  $template->process("attachment/updated.html.tmpl", $vars)
+    || ThrowTemplateError($template->error());
+}
diff --git a/booleanchart.html b/booleanchart.html
deleted file mode 100644
index 9c136b98a..000000000
--- a/booleanchart.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<html> <head>
-<title>The "boolean chart" section of the query page</title>
-</head>
-
-<body>
-<h1>The "boolean chart" section of the query page</h1>
-
-("Boolean chart" is a terrible term; anyone got a better one I can use
-instead?)
-
-<p>
-
-The Bugzilla query page is designed to be reasonably easy to use.
-But, with such ease of use always comes some lack of power.  The
-"boolean chart" section is designed to let you do very powerful
-queries, but it's not the easiest thing to learn (or explain).
-<p>
-So.
-<p>
-
-The boolean chart starts with a single "term".  A term is a
-combination of two pulldown menus and a text field.
-You choose items from the menus, specifying "what kind of thing
-am I searching for" and "what kind of matching do I want", and type in
-a value on the text field, specifying "what should it match".
-
-<p>
-
-The real fun starts when you click on the "Or" or "And" buttons.  If
-you bonk on the "Or" button, then you get a second term to the right
-of the first one.  You can then configure that term, and the result of
-the query will be anything that matches either of the terms.
-
-<p>
-
-Or, you can bonk the "And" button, and get a new term below the
-original one, and now the result of the query will be anything that
-matches both of the terms.
-
-<p>
-
-And you can keep clicking "And" and "Or", and get a page with tons of
-terms.  "Or" has higher precedence than "And".  (In other words, you
-can think of each line of "Or" stuff as having parenthesis around it.)
-
-<p>
-
-The most subtle thing is this "Add another boolean chart" button.
-This is almost the same thing as the "And" button.  The difference is
-if you use one of the fields where several items can be associated
-with a single bug.  This includes "Comments", "CC", and all the
-"changed [something]" entries.  Now, if you have multiple terms that
-all talk about one of these fields, it's ambiguous whether they are
-allowed to be talking about different instances of that field.  So,
-to let you have it both ways, they always mean the same instance,
-unless the terms appear on different charts.
-
-<p>
-
-For example: if you search for "priority changed to P5" and
-"priority changed by person@addr", it will only find bugs where the
-given person at some time changed the priority to P5.  However, if
-what you really want is to find all bugs where the milestone was
-changed at some time by the person, and someone (possibly someone
-else) at some time changed the milestone to P5, then you would put
-the two terms in two different charts.
-
-<p>
-
-Clear as mud?  Please, I beg you, rewrite this document to make
-everything crystal clear, and send the improved version to <a
-href="mailto:tara@tequilarista.org">Tara</a>.
-
-<hr>
-
-<!-- hhmts start -->
-Last modified: Wed Aug 16 16:06:36 2000
-<!-- hhmts end -->
-</body> </html>
diff --git a/bug_form.pl b/bug_form.pl
index 1100ba9b0..14e9147ba 100644
--- a/bug_form.pl
+++ b/bug_form.pl
@@ -25,594 +25,302 @@ use strict;
 
 use RelationSet;
 
-# Shut up misguided -w warnings about "used only once".  For some reason,
-# "use vars" chokes on me when I try it here.
-
-sub bug_form_pl_sillyness {
-    my $zz;
-    $zz = %::FORM;
-    $zz = %::components;
-    $zz = %::proddesc;
-    $zz = %::prodmaxvotes;
-    $zz = %::versions;
-    $zz = @::legal_keywords;
-    $zz = @::legal_opsys;
-    $zz = @::legal_platform;
-    $zz = @::legal_priority;
-    $zz = @::settable_resolution;
-    $zz = @::legal_severity;
-    $zz = %::target_milestone;
-}
-
-my $loginok = quietly_check_login();
-
-my $id = $::FORM{'id'};
-
-my $query = "
-select
-        bugs.bug_id,
-        product,
-        version,
-        rep_platform,
-        op_sys,
-        bug_status,
-        resolution,
-        priority,
-        bug_severity,
-        component,
-        assigned_to,
-        reporter,
-        bug_file_loc,
-        short_desc,
-	target_milestone,
-	qa_contact,
-	status_whiteboard,
-        date_format(creation_ts,'%Y-%m-%d %H:%i'),
-        groupset,
-	delta_ts,
-	sum(votes.count)
-from bugs left join votes using(bug_id)
-where bugs.bug_id = $id
-group by bugs.bug_id";
-
-SendSQL($query);
-my %bug;
-my @row;
-@row = FetchSQLData();
-my $count = 0;
-foreach my $field ("bug_id", "product", "version", "rep_platform",
-                   "op_sys", "bug_status", "resolution", "priority",
-                   "bug_severity", "component", "assigned_to", "reporter",
-                   "bug_file_loc", "short_desc", "target_milestone",
-                   "qa_contact", "status_whiteboard", "creation_ts",
-                   "groupset", "delta_ts", "votes") {
-    $bug{$field} = shift @row;
-    if (!defined $bug{$field}) {
-        $bug{$field} = "";
+# Use the Attachment module to display attachments for the bug.
+use Attachment;
+
+sub show_bug {    
+    # Shut up misguided -w warnings about "used only once".  For some reason,
+    # "use vars" chokes on me when I try it here.
+    sub bug_form_pl_sillyness {
+        my $zz;
+        $zz = %::FORM;
+        $zz = %::proddesc;
+        $zz = %::prodmaxvotes;
+        $zz = @::enterable_products;                                            
+        $zz = @::settable_resolution;
+        $zz = $::unconfirmedstate;
+        $zz = $::milestoneurl;
+        $zz = $::template;
+        $zz = $::vars;
+        $zz = @::legal_priority;
+        $zz = @::legal_platform;
+        $zz = @::legal_severity;
+        $zz = @::legal_bug_status;
+        $zz = @::target_milestone;
+        $zz = @::components;
+        $zz = @::legal_keywords;
+        $zz = @::versions;
+        $zz = @::legal_opsys;
     }
-    $count++;
-}
-
-my $assignedtoid = $bug{'assigned_to'};
-my $reporterid = $bug{'reporter'};
-my $qacontactid =  $bug{'qa_contact'};
-
-$bug{'assigned_to_email'} = DBID_to_name($assignedtoid);
-$bug{'assigned_to'} = DBID_to_real_or_loginname($bug{'assigned_to'});
-$bug{'reporter'} = DBID_to_real_or_loginname($bug{'reporter'});
-
-print qq{<FORM NAME="changeform" METHOD="POST" ACTION="process_bug.cgi">\n};
-
-#  foreach my $i (sort(keys(%bug))) {
-#      my $q = value_quote($bug{$i});
-#      print qq{<INPUT TYPE="HIDDEN" NAME="orig-$i" VALUE="$q">\n};
-#  }
-
-$bug{'long_desc'} = GetLongDescriptionAsHTML($id);
-my $longdesclength = length($bug{'long_desc'});
-
-GetVersionTable();
-
 
-
-#
-# These should be read from the database ...
-#
-
-my $platform_popup = make_options(\@::legal_platform, $bug{'rep_platform'});
-my $priority_popup = make_options(\@::legal_priority, $bug{'priority'});
-my $sev_popup = make_options(\@::legal_severity, $bug{'bug_severity'});
-
-
-my $component_popup = make_options($::components{$bug{'product'}},
-				   $bug{'component'});
-
-my $ccSet = new RelationSet;
-$ccSet->mergeFromDB("select who from cc where bug_id=$id");
-my @ccList = $ccSet->toArrayOfStrings();
-my $cc_element = "<INPUT TYPE=HIDDEN NAME=cc VALUE=\"\">";
-if (scalar(@ccList) > 0) {
-  $cc_element = "<SELECT NAME=cc MULTIPLE SIZE=5>\n";
-  foreach my $ccName ( @ccList ) {
-    $cc_element .= "<OPTION VALUE=\"$ccName\">$ccName\n";
-  }
-  $cc_element .= "</SELECT><BR>\n" .
-        "<INPUT TYPE=CHECKBOX NAME=removecc>Remove selected CCs<br>\n";
-}
-
-my $URL = value_quote($bug{'bug_file_loc'});
-
-if (defined $URL && $URL ne "none" && $URL ne "NULL" && $URL ne "") {
-    $URL = "<B><A HREF=\"$URL\">URL:</A></B>";
-} else {
-    $URL = "<B>URL:</B>";
-}
-
-#
-# Make a list of products the user has access to
-#
-
-my (@prodlist, $product_popup);
-foreach my $p (sort(keys %::versions)) {
-    if ($p eq $bug{'product'}) {
-        # if it's the product the bug is already in, it's ALWAYS in
-        # the popup, period, whether the user can see it or not, and
-        # regardless of the disallownew setting.
-        push(@prodlist, $p);
-        next;
-    }
-    if (defined $::proddesc{$p} && $::proddesc{$p} eq '0') {
-        # Special hack.  If we stuffed a "0" into proddesc, that means
-        # that disallownew was set for this bug, and so we don't want
-        # to allow people to specify that product here.
-        next;
+    # Use templates
+    my $template = $::template;
+    my $vars = $::vars;
+    
+    $vars->{'GetBugLink'} = \&GetBugLink;
+    $vars->{'quoteUrls'} = \&quoteUrls,
+    $vars->{'lsearch'} = \&lsearch,
+    $vars->{'header_done'} = (@_),
+
+    quietly_check_login();
+
+    my $id = $::FORM{'id'};
+    
+    if (!defined($id)) {
+      $template->process("bug/choose.html.tmpl", $vars)
+        || ThrowTemplateError($template->error());
+      exit;
     }
-    if(Param("usebuggroupsentry")
-        && GroupExists($p)
-        && !UserInGroup($p))
+    
+    my %user = %{$vars->{'user'}};
+    my %bug;
+
+    # Populate the bug hash with the info we get directly from the DB.
+    my $query = "
+    SELECT bugs.bug_id, product, version, rep_platform, 
+        op_sys, bug_status, resolution, priority, 
+        bug_severity, component, assigned_to, reporter, 
+        bug_file_loc, short_desc, target_milestone, 
+        qa_contact, status_whiteboard, 
+        date_format(creation_ts,'%Y-%m-%d %H:%i'),
+        groupset, delta_ts, sum(votes.count)
+    FROM bugs LEFT JOIN votes USING(bug_id)
+    WHERE bugs.bug_id = $id
+    GROUP BY bugs.bug_id";
+
+    SendSQL($query);
+
+    my $value;
+    my @row = FetchSQLData();
+    foreach my $field ("bug_id", "product", "version", "rep_platform",
+                       "op_sys", "bug_status", "resolution", "priority",
+                       "bug_severity", "component", "assigned_to", "reporter",
+                       "bug_file_loc", "short_desc", "target_milestone",
+                       "qa_contact", "status_whiteboard", "creation_ts",
+                       "groupset", "delta_ts", "votes") 
     {
-        # If we're using bug groups to restrict entry on products, and
-        # this product has a bug group, and the user is not in that
-        # group, we don't want to include that product in this list.
-        next;
+        $value = shift(@row);
+        $bug{$field} = defined($value) ? $value : "";
     }
-    push(@prodlist, $p);
-}
 
-# If the user has access to multiple products, display a popup, otherwise 
-# display the current product.
+    # General arrays of info about the database state
+    GetVersionTable();
+
+    # Fiddle the product list.
+    my $seen_curr_prod;
+    my @prodlist;
+    
+    foreach my $product (@::enterable_products) {
+        if ($product eq $bug{'product'}) {
+            # if it's the product the bug is already in, it's ALWAYS in
+            # the popup, period, whether the user can see it or not, and
+            # regardless of the disallownew setting.
+            $seen_curr_prod = 1;
+            push(@prodlist, $product);
+            next;
+        }
 
-if (1 < @prodlist) {
-    $product_popup = "<SELECT NAME=product>" .
-        make_options(\@prodlist, $bug{'product'}) .
-        "</SELECT>";
-}
-else {
-    $product_popup = $bug{'product'} .
-        "<INPUT TYPE=\"HIDDEN\" NAME=\"product\" VALUE=\"$bug{'product'}\">";
-}
+        if (Param("usebuggroupsentry")
+          && GroupExists($product)
+          && !UserInGroup($product))
+        {
+            # If we're using bug groups to restrict entry on products, and
+            # this product has a bug group, and the user is not in that
+            # group, we don't want to include that product in this list.
+            next;
+        }
 
-print "
-<INPUT TYPE=HIDDEN NAME=\"delta_ts\" VALUE=\"$bug{'delta_ts'}\">
-<INPUT TYPE=HIDDEN NAME=\"longdesclength\" VALUE=\"$longdesclength\">
-<INPUT TYPE=HIDDEN NAME=\"id\" VALUE=$id>
-  <TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0><TR>
-    <TD ALIGN=RIGHT><B>Bug#:</B></TD><TD><A HREF=\"" . Param('urlbase') . "show_bug.cgi?id=$bug{'bug_id'}\">$bug{'bug_id'}</A></TD>
-  <TD>&nbsp;</TD>
-    <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#rep_platform\">Platform:</A></B></TD>
-    <TD><SELECT NAME=rep_platform>$platform_popup</SELECT></TD>
-  <TD>&nbsp;</TD>
-    <TD ALIGN=RIGHT><B>Reporter:</B></TD><TD>" . html_quote($bug{'reporter'}) . "</TD>
-</TR><TR>
-    <TD ALIGN=RIGHT><B>Product:</B></TD>
-    <TD>$product_popup</TD>
-  <TD>&nbsp;</TD>
-    <TD ALIGN=RIGHT><B>OS:</B></TD>
-    <TD><SELECT NAME=op_sys>" .
-    make_options(\@::legal_opsys, $bug{'op_sys'}) .
-    "</SELECT></TD>
-  <TD>&nbsp;</TD>
-    <TD ALIGN=RIGHT NOWRAP><b>Add CC:</b></TD>
-    <TD><INPUT NAME=newcc SIZE=30 VALUE=\"\"></TD>
-</TR><TR>
-    <TD ALIGN=RIGHT><B><A HREF=\"describecomponents.cgi?product=" .
-    url_quote($bug{'product'}) . "\">Component:</A></B></TD>
-      <TD><SELECT NAME=component>$component_popup</SELECT></TD>
-  <TD>&nbsp;</TD>
-    <TD ALIGN=RIGHT><B>Version:</B></TD>
-    <TD><SELECT NAME=version>" .
-    make_options($::versions{$bug{'product'}}, $bug{'version'}) .
-    "</SELECT></TD>
-  <TD>&nbsp;</TD>
-    <TD ROWSPAN=4 ALIGN=RIGHT VALIGN=TOP><B>CC:</B></TD>
-    <TD ROWSPAN=4 VALIGN=TOP> $cc_element </TD>
-</TR><TR>
-    <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html\">Status:</A></B></TD>
-      <TD>$bug{'bug_status'}</TD>
-  <TD>&nbsp;</TD>
-    <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#priority\">Priority:</A></B></TD>
-      <TD><SELECT NAME=priority>$priority_popup</SELECT></TD>
-  <TD>&nbsp;</TD>
-</TR><TR>
-    <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html\">Resolution:</A></B></TD>
-      <TD>$bug{'resolution'}</TD>
-  <TD>&nbsp;</TD>
-    <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#severity\">Severity:</A></B></TD>
-      <TD><SELECT NAME=bug_severity>$sev_popup</SELECT></TD>
-  <TD>&nbsp;</TD>
-</TR><TR>
-    <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#assigned_to\">Assigned&nbsp;To:
-        </A></B></TD>
-      <TD>" . html_quote($bug{'assigned_to'}) . "</TD>
-  <TD>&nbsp;</TD>";
-
-if (Param("usetargetmilestone")) {
-    my $url = "";
-    if (defined $::milestoneurl{$bug{'product'}}) {
-        $url = $::milestoneurl{$bug{'product'}};
-    }
-    if ($url eq "") {
-        $url = "notargetmilestone.html";
+        push(@prodlist, $product);
     }
-    if ($bug{'target_milestone'} eq "") {
-        $bug{'target_milestone'} = " ";
-    }
-    print "
-<TD ALIGN=RIGHT><A href=\"$url\"><B>Target Milestone:</B></A></TD>
-<TD><SELECT NAME=target_milestone>" .
-    make_options($::target_milestone{$bug{'product'}},
-                 $bug{'target_milestone'}) .
-                     "</SELECT></TD>
-  <TD>&nbsp;</TD>";
-} else { print "<TD></TD><TD></TD><TD>&nbsp;</TD>"; }
-
-print "
-</TR>";
-
-if (Param("useqacontact")) {
-    my $name = $bug{'qa_contact'} > 0 ? DBID_to_name($bug{'qa_contact'}) : "";
-    print "
-  <TR>
-    <TD ALIGN=\"RIGHT\"><B>QA Contact:</B>
-    <TD COLSPAN=7>
-      <INPUT NAME=qa_contact VALUE=\"" .
-    value_quote($name) .
-    "\" SIZE=60></TD>
-  </TR>";
-}
-
-
-print "
-  <TR>
-    <TD ALIGN=\"RIGHT\">$URL
-    <TD COLSPAN=7>
-      <INPUT NAME=bug_file_loc VALUE=\"" . value_quote($bug{'bug_file_loc'}) . "\" SIZE=60></TD>
-  </TR><TR>
-    <TD ALIGN=\"RIGHT\"><B>Summary:</B>
-    <TD COLSPAN=7>
-      <INPUT NAME=short_desc VALUE=\"" .
-    value_quote($bug{'short_desc'}) .
-    "\" SIZE=60></TD>
-  </TR>";
-
-if (Param("usestatuswhiteboard")) {
-    print "
-  <TR>
-    <TD ALIGN=\"RIGHT\"><B>Status Whiteboard:</B>
-    <TD COLSPAN=7>
-      <INPUT NAME=status_whiteboard VALUE=\"" .
-    value_quote($bug{'status_whiteboard'}) .
-    "\" SIZE=60></TD>
-  </TR>";
-}
 
-if (@::legal_keywords) {
-    SendSQL("SELECT keyworddefs.name 
-             FROM keyworddefs, keywords
-             WHERE keywords.bug_id = $id AND keyworddefs.id = keywords.keywordid
-             ORDER BY keyworddefs.name");
-    my @list;
-    while (MoreSQLData()) {
-        push(@list, FetchOneColumn());
+    # The current product is part of the popup, even if new bugs are no longer
+    # allowed for that product
+    if (!$seen_curr_prod) {
+        push (@prodlist, $bug{'product'});
+        @prodlist = sort @prodlist;
     }
-    my $value = value_quote(join(', ', @list));
-    print qq{
-<TR>
-<TD ALIGN=right><B><A HREF="describekeywords.cgi">Keywords:</A></B>
-<TD COLSPAN=7><INPUT NAME="keywords" VALUE="$value" SIZE=60></TD>
-</TR>
-};
-}
 
-print "<tr><td align=right><B>Attachments:</b></td>\n";
-SendSQL("select attach_id, creation_ts, mimetype, description from attachments where bug_id = $id");
-while (MoreSQLData()) {
-    my ($attachid, $date, $mimetype, $desc) = (FetchSQLData());
-    if ($date =~ /^(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/) {
-        $date = "$3/$4/$2 $5:$6";
-    }
-    my $link = "showattachment.cgi?attach_id=$attachid";
-    $desc = value_quote($desc);
-    print qq{<td><a href="$link">$date</a></td><td colspan=6>$desc&nbsp;&nbsp;&nbsp;($mimetype)</td></tr><tr><td></td>};
-}
-print "<td colspan=7><a href=\"createattachment.cgi?id=$id\">Create a new attachment</a> (proposed patch, testcase, etc.)</td></tr></table>\n";
+    $vars->{'product'} = \@prodlist;
+    $vars->{'rep_platform'} = \@::legal_platform;
+    $vars->{'priority'} = \@::legal_priority;
+    $vars->{'bug_severity'} = \@::legal_severity;
+    $vars->{'op_sys'} = \@::legal_opsys;
+    $vars->{'bug_status'} = \@::legal_bug_status;
+
+    # Hack - this array contains "" for some reason. See bug 106589.
+    shift @::settable_resolution; 
+    $vars->{'resolution'} = \@::settable_resolution;
+
+    $vars->{'component_'} = $::components{$bug{'product'}};
+    $vars->{'version'} = $::versions{$bug{'product'}};
+    $vars->{'target_milestone'} = $::target_milestone{$bug{'product'}};
+    $bug{'milestoneurl'} = $::milestoneurl{$bug{'product'}} || 
+                           "notargetmilestone.html";
+
+    $vars->{'use_votes'} = Param('usevotes')
+                           && $::prodmaxvotes{$bug{'product'}} > 0;
+
+    # Add additional, calculated fields to the bug hash
+    if (@::legal_keywords) {
+        $vars->{'use_keywords'} = 1;
+
+        SendSQL("SELECT keyworddefs.name 
+                 FROM keyworddefs, keywords
+                 WHERE keywords.bug_id = $id 
+                 AND keyworddefs.id = keywords.keywordid
+                 ORDER BY keyworddefs.name");
+        my @keywords;
+        while (MoreSQLData()) {
+            push(@keywords, FetchOneColumn());
+        }
+
+        $bug{'keywords'} = \@keywords;
+    }    
 
+    # Attachments
+    $bug{'attachments'} = Attachment::query($id);
 
-sub EmitDependList {
-    my ($desc, $myfield, $targetfield) = (@_);
-    print "<th align=right>$desc:</th><td>";
+    # Dependencies
     my @list;
-    SendSQL("select $targetfield from dependencies where  
-             $myfield = $id order by $targetfield");
+    SendSQL("SELECT dependson FROM dependencies WHERE  
+             blocked = $id ORDER BY dependson");
     while (MoreSQLData()) {
-        my ($i) = (FetchSQLData());
+        my ($i) = FetchSQLData();
         push(@list, $i);
-        print GetBugLink($i, $i);
-        print " ";
-    }
-    print "</td><td><input name=$targetfield value=\"" .
-        join(',', @list) . "\"></td>\n";
-}
-
-if (Param("usedependencies")) {
-    print "<table><tr>\n";
-    EmitDependList("Bug $id depends on", "blocked", "dependson");
-    print qq{
-<td rowspan=2><a href="showdependencytree.cgi?id=$id">Show dependency tree</a>
-};
-    if (Param("webdotbase") ne "") {
-        print qq{
-<br><a href="showdependencygraph.cgi?id=$id">Show dependency graph</a>
-};
     }
-    print "</td></tr><tr>";
-    EmitDependList("Bug $id blocks", "dependson", "blocked");
-    print "</tr></table>\n";
-}
 
-if ($::prodmaxvotes{$bug{'product'}}) {
-    print qq{
-<table><tr>
-<th><a href="votehelp.html">Votes</a> for bug $id:</th><td>
-<a href="showvotes.cgi?bug_id=$id">$bug{'votes'}</a>
-&nbsp;&nbsp;&nbsp;<a href="showvotes.cgi?voteon=$id">Vote for this bug</a>
-</td></tr></table>
-};
-}
+    $bug{'dependson'} = \@list;
 
-print "
-<br>
-<B>Additional Comments:</B>
-<BR>
-<TEXTAREA WRAP=HARD NAME=comment ROWS=10 COLS=80></TEXTAREA><BR>";
-
-
-if ($::usergroupset ne '0') {
-    SendSQL("select bit, name, description, (bit & $bug{'groupset'} != 0) " .
-	    "from groups where bit & $::usergroupset != 0 " .
-	    "and isbuggroup != 0 " . 
-            # Include active groups as well as inactive groups to which
-            # the bug already belongs.  This way the bug can be removed
-            # from an inactive group but can only be added to active ones.
-            "and (isactive = 1 or (bit & $bug{'groupset'} != 0)) " . 
-	    "order by description");
-    # We only print out a header bit for this section if there are any
-    # results.
-    my $groupFound = 0;
+    my @list2;
+    SendSQL("SELECT blocked FROM dependencies WHERE  
+             dependson = $id ORDER BY blocked");
     while (MoreSQLData()) {
-      my ($bit, $name, $description, $ison) = (FetchSQLData());
-      # For product groups, we only want to display the checkbox if either
-      # (1) The bit is already set, or
-      # (2) It's the group for this product.
-      # All other product groups will be skipped.  Non-product bug groups
-      # will still be displayed.
-      if($ison || ($name eq $bug{'product'}) || (!defined $::proddesc{$name})) {
-        if(!$groupFound) {
-          print "<br><b>Only users in the selected groups can view this bug:</b><br>\n";
-          print "<font size=\"-1\">(Leave all boxes unchecked to make this a public bug.)</font><br><br>\n";
-          $groupFound = 1;
-        }
-        # Modifying this to use checkboxes instead
-        my $checked = $ison ? " CHECKED" : "";
-        # indent these a bit
-        print "&nbsp;&nbsp;&nbsp;&nbsp;";
-        print "<input type=checkbox name=\"bit-$bit\" value=1$checked>\n";
-        print "$description<br>\n";
-      }
-    }
-
-    # If the bug is restricted to a group, display checkboxes that allow
-    # the user to set whether or not the reporter, assignee, QA contact, 
-    # and cc list can see the bug even if they are not members of all 
-    # groups to which the bug is restricted.
-    if ( $bug{'groupset'} != 0 ) {
-        # Determine whether or not the bug is always accessible by the reporter,
-        # QA contact, and/or users on the cc: list.
-        SendSQL("SELECT  reporter_accessible , assignee_accessible , 
-                         qacontact_accessible , cclist_accessible
-                 FROM    bugs
-                 WHERE   bug_id = $id
-                ");
-        my ($reporter_accessible, $assignee_accessible, $qacontact_accessible, $cclist_accessible) = FetchSQLData();
-
-        # Convert boolean data about which roles always have access to the bug
-        # into "checked" attributes for the HTML checkboxes by which users
-        # set and change these values.
-        my $reporter_checked = $reporter_accessible ? " checked" : "";
-        my $assignee_checked = $assignee_accessible ? " checked" : "";
-        my $qacontact_checked = $qacontact_accessible ? " checked" : "";
-        my $cclist_checked = $cclist_accessible ? " checked" : "";
-
-        # Display interface for changing the values.
-        print qq|
-            <p>
-            <b>But users in the roles selected below can always view this bug:</b><br>
-            <small>(Does not take effect unless the bug is restricted to at least one group.)</small>
-            </p>
-
-            <p>
-            <input type="checkbox" name="reporter_accessible" value="1" $reporter_checked>Reporter
-            <input type="checkbox" name="assignee_accessible" value="1" $assignee_checked>Assignee
-            <input type="checkbox" name="qacontact_accessible" value="1" $qacontact_checked>QA Contact
-            <input type="checkbox" name="cclist_accessible" value="1" $cclist_checked>CC List
-            </p>
-        |;
-    }
-}
-
-
-
-
-
-print "<br>
-<INPUT TYPE=radio NAME=knob VALUE=none CHECKED>
-        Leave as <b>$bug{'bug_status'} $bug{'resolution'}</b><br>";
-
-
-# knum is which knob number we're generating, in javascript terms.
-
-my $knum = 1;
-
-my $status = $bug{'bug_status'};
-
-# In the below, if the person hasn't logged in ($::userid == 0), then
-# we treat them as if they can do anything.  That's because we don't
-# know why they haven't logged in; it may just be because they don't
-# use cookies.  Display everything as if they have all the permissions
-# in the world; their permissions will get checked when they log in
-# and actually try to make the change.
-
-my $canedit = UserInGroup("editbugs") || ($::userid == 0);
-my $canconfirm;
-
-if ($status eq $::unconfirmedstate) {
-    $canconfirm = UserInGroup("canconfirm") || ($::userid == 0);
-    if ($canedit || $canconfirm) {
-        print "<INPUT TYPE=radio NAME=knob VALUE=confirm>";
-	print "Confirm bug (change status to <b>NEW</b>)<br>";
-        $knum++;
+        my ($i) = FetchSQLData();
+        push(@list2, $i);
     }
-}
 
-my $movers = Param("movers");
-$movers =~ s/\s?,\s?/|/g;
-$movers =~ s/@/\@/g;
-
-if ($canedit || $::userid == $assignedtoid ||
-      $::userid == $reporterid || $::userid == $qacontactid) {
-    if (IsOpenedState($status)) {
-        if ($status ne "ASSIGNED") {
-            print "<INPUT TYPE=radio NAME=knob VALUE=accept>";
-            my $extra = "";
-            if ($status eq $::unconfirmedstate && ($canconfirm || $canedit)) {
-                $extra = "confirm bug, ";
+    $bug{'blocked'} = \@list2;
+
+    # Groups
+    my @groups;
+    if ($::usergroupset ne '0' || $bug{'groupset'} ne '0') {      
+        my $bug_groupset = $bug{'groupset'};
+
+        SendSQL("SELECT bit, name, description, (bit & $bug_groupset != 0),
+                 (bit & $::usergroupset != 0) FROM groups 
+                 WHERE isbuggroup != 0 " .
+                 # Include active groups as well as inactive groups to which
+                 # the bug already belongs.  This way the bug can be removed
+                 # from an inactive group but can only be added to active ones.
+                "AND ((isactive = 1 AND (bit & $::usergroupset != 0)) OR
+                 (bit & $bug_groupset != 0))");
+
+        $user{'inallgroups'} = 1;
+
+        while (MoreSQLData()) {
+            my ($bit, $name, $description, $ison, $ingroup) = FetchSQLData();
+            # For product groups, we only want to display the checkbox if either
+            # (1) The bit is already set, or
+            # (2) The user is in the group, but either:
+            #     (a) The group is a product group for the current product, or
+            #     (b) The group name isn't a product name
+            # This means that all product groups will be skipped, but 
+            # non-product bug groups will still be displayed.
+            if($ison || 
+               ($ingroup && (($name eq $bug{'product'}) ||
+                             (!defined $::proddesc{$name}))))
+            {
+                $user{'inallgroups'} &= $ingroup;
+
+                push (@groups, { "bit" => $bit,
+                                 "ison" => $ison,
+                                 "ingroup" => $ingroup,
+                                 "description" => $description });            
             }
-            print "Accept bug (${extra}change status to <b>ASSIGNED</b>)<br>";
-            $knum++;
-        }
-        if ($bug{'resolution'} ne "") {
-            print "<INPUT TYPE=radio NAME=knob VALUE=clearresolution>\n";
-            print "Clear the resolution (remove the current resolution of\n";
-            print "<b>$bug{'resolution'}</b>)<br>\n";
-            $knum++;
-        }
-        my $resolution_popup = make_options(\@::settable_resolution,
-                                            $bug{'resolution'});
-        print "<INPUT TYPE=radio NAME=knob VALUE=resolve>
-        Resolve bug, changing <A HREF=\"bug_status.html\">resolution</A> to
-        <SELECT NAME=resolution
-          ONCHANGE=\"document.changeform.knob\[$knum\].checked=true\">
-          $resolution_popup</SELECT><br>\n";
-        $knum++;
-        print "<INPUT TYPE=radio NAME=knob VALUE=duplicate>
-        Resolve bug, mark it as duplicate of bug # 
-        <INPUT NAME=dup_id SIZE=6 ONCHANGE=\"document.changeform.knob\[$knum\].checked=true\"><br>\n";
-        $knum++;
-        my $assign_element = "<INPUT NAME=\"assigned_to\" SIZE=32 ONCHANGE=\"document.changeform.knob\[$knum\].checked=true\" VALUE=\"$bug{'assigned_to_email'}\">";
-
-        print "<INPUT TYPE=radio NAME=knob VALUE=reassign> 
-          <A HREF=\"bug_status.html#assigned_to\">Reassign</A> bug to
-          $assign_element
-        <br>\n";
-        if ($status eq $::unconfirmedstate && ($canconfirm || $canedit)) {
-            print "&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE=checkbox NAME=andconfirm> and confirm bug (change status to <b>NEW</b>)<BR>";
-        }
-        $knum++;
-        print "<INPUT TYPE=radio NAME=knob VALUE=reassignbycomponent>
-          Reassign bug to owner ";
-        if (Param("useqacontact")) { print "and QA contact "; }
-        print "of selected component<br>\n";
-        if ($status eq $::unconfirmedstate && ($canconfirm || $canedit)) {
-            print "&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE=checkbox NAME=compconfirm> and confirm bug (change status to <b>NEW</b>)<BR>";
-        }
-        $knum++;
-    } elsif ( Param("move-enabled") && ($bug{'resolution'} eq "MOVED") ) {
-        if ( (defined $::COOKIE{"Bugzilla_login"}) 
-             && ($::COOKIE{"Bugzilla_login"} =~ /($movers)/) ){
-          print "<INPUT TYPE=radio NAME=knob VALUE=reopen> Reopen bug<br>\n";
-          $knum++;
-          if ($status eq "RESOLVED") {
-              print "<INPUT TYPE=radio NAME=knob VALUE=verify>
-          Mark bug as <b>VERIFIED</b><br>\n";
-              $knum++;
-          }
-          if ($status ne "CLOSED") {
-              print "<INPUT TYPE=radio NAME=knob VALUE=close>
-          Mark bug as <b>CLOSED</b><br>\n";
-              $knum++;
-          }
-        }
-    } else {
-        print "<INPUT TYPE=radio NAME=knob VALUE=reopen> Reopen bug<br>\n";
-        $knum++;
-        if ($status eq "RESOLVED") {
-            print "<INPUT TYPE=radio NAME=knob VALUE=verify>
-        Mark bug as <b>VERIFIED</b><br>\n";
-            $knum++;
         }
-        if ($status ne "CLOSED") {
-            print "<INPUT TYPE=radio NAME=knob VALUE=close>
-        Mark bug as <b>CLOSED</b><br>\n";
-            $knum++;
+
+        # If the bug is restricted to a group, display checkboxes that allow
+        # the user to set whether or not the reporter 
+        # and cc list can see the bug even if they are not members of all 
+        # groups to which the bug is restricted.
+        if ($bug{'groupset'} != 0) {
+            $bug{'inagroup'} = 1;
+
+            # Determine whether or not the bug is always accessible by the
+            # reporter, QA contact, and/or users on the cc: list.
+            SendSQL("SELECT reporter_accessible, cclist_accessible
+                     FROM   bugs
+                     WHERE  bug_id = $id
+                    ");
+            ($bug{'reporter_accessible'}, 
+             $bug{'cclist_accessible'}) = FetchSQLData();        
         }
     }
-}
- 
-print "
-<INPUT TYPE=\"submit\" VALUE=\"Commit\">
-<INPUT TYPE=\"reset\" VALUE=\"Reset\">
-<INPUT TYPE=\"hidden\" name=\"form_name\" VALUE=\"process_bug\">
-<P>
-<FONT size=\"+1\"><B>
- <A HREF=\"show_activity.cgi?id=$id\">View Bug Activity</A>
- &nbsp; | &nbsp;
- <A HREF=\"long_list.cgi?buglist=$id\">Format For Printing</A>
-</B></FONT>
-";
-
-if ( Param("move-enabled") && (defined $::COOKIE{"Bugzilla_login"}) && ($::COOKIE{"Bugzilla_login"} =~ /($movers)/) ){
-  print "&nbsp; <FONT size=\"+1\"><B> | </B></FONT> &nbsp;"
-       ."<INPUT TYPE=\"SUBMIT\" NAME=\"action\" VALUE=\"" 
-       . Param("move-button-text") . "\">\n";
-}
-
-print "<BR></FORM>";
+    $vars->{'groups'} = \@groups;
+
+    my $movers = Param("movers");
+    $user{'canmove'} = Param("move-enabled") 
+                       && (defined $::COOKIE{"Bugzilla_login"}) 
+                       && ($::COOKIE{"Bugzilla_login"} =~ /\Q$movers\E/);
+
+    # User permissions
+
+    # In the below, if the person hasn't logged in ($::userid == 0), then
+    # we treat them as if they can do anything.  That's because we don't
+    # know why they haven't logged in; it may just be because they don't
+    # use cookies.  Display everything as if they have all the permissions
+    # in the world; their permissions will get checked when they log in
+    # and actually try to make the change.
+    $user{'canedit'} = $::userid == 0
+                       || $::userid == $bug{'reporter'}
+                       || $::userid == $bug{'qa_contact'}
+                       || $::userid == $bug{'assigned_to'}
+                       || UserInGroup("editbugs");
+    $user{'canconfirm'} = ($::userid == 0)
+                          || UserInGroup("canconfirm")
+                          || UserInGroup("editbugs");
+
+    # Bug states
+    $bug{'isunconfirmed'} = ($bug{'bug_status'} eq $::unconfirmedstate);
+    $bug{'isopened'} = IsOpenedState($bug{'bug_status'});
+
+    # People involved with the bug
+    $bug{'assigned_to_email'} = DBID_to_name($bug{'assigned_to'});
+    $bug{'assigned_to'} = DBID_to_real_or_loginname($bug{'assigned_to'});
+    $bug{'reporter'} = DBID_to_real_or_loginname($bug{'reporter'});
+    $bug{'qa_contact'} = $bug{'qa_contact'} > 0 ? 
+                                          DBID_to_name($bug{'qa_contact'}) : "";
+
+    my $ccset = new RelationSet;
+    $ccset->mergeFromDB("SELECT who FROM cc WHERE bug_id=$id");
+    
+    my @cc = $ccset->toArrayOfStrings();
+    $bug{'cc'} = \@cc if $cc[0];
+
+    # Next bug in list (if there is one)
+    my @bug_list;
+    if ($::COOKIE{"BUGLIST"} && $id) 
+    {
+        @bug_list = split(/:/, $::COOKIE{"BUGLIST"});
+    }
+    $vars->{'bug_list'} = \@bug_list;
 
-print "
-<table><tr><td align=left><B>Description:</B></td>
-<td align=right width=100%>Opened: $bug{'creation_ts'}</td></tr></table>
-<HR>
-";
-print $bug{'long_desc'};
-print "
-<HR>\n";
+    $bug{'comments'} = GetComments($bug{'bug_id'});
 
-# To add back option of editing the long description, insert after the above
-# long_list.cgi line:
-#  <A HREF=\"edit_desc.cgi?id=$id\">Edit Long Description</A>
+    # This is length in number of comments
+    $bug{'longdesclength'} = scalar(@{$bug{'comments'}});
 
-navigation_header();
+    # Add the bug and user hashes to the variables
+    $vars->{'bug'} = \%bug;
+    $vars->{'user'} = \%user;
 
-PutFooter();
+    # Create the <link> elements for browsing bug lists
+    $vars->{'navigation_links'} = navigation_links(join(':',@bug_list));
 
+    # Generate and return the UI (HTML page) from the appropriate template.
+    $template->process("bug/edit.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
+}
+ 
 1;
+
diff --git a/bug_status.html b/bug_status.html
index 2b052786d..1b1c44ebb 100755
--- a/bug_status.html
+++ b/bug_status.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <HTML>
 
 <!--
@@ -24,7 +24,11 @@
      Contributor(s): Terry Weissman <terry@mozilla.org>
 -->
 
+<head>
 <TITLE>A Bug's Life Cycle</TITLE>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
 
 <h1 ALIGN=CENTER>A Bug's Life Cycle</h1>
 
@@ -142,7 +146,7 @@ This field describes the impact of a bug.
 
 This field describes the importance and order in which a bug should be
 fixed.  This field is utilized by the programmers/engineers to
-prioritized their work to be done.  The available priorities are:
+prioritize their work to be done.  The available priorities are:
 
 <p>
 <p>
@@ -197,6 +201,6 @@ status field appropriately.
 
 <hr>
 <!-- hhmts start -->
-Last modified: Wed Feb 16 20:41:24 2000
+Last modified: Sun Apr 14 12:51:23 EST 2002
 <!-- hhmts end -->
 </body> </html>
diff --git a/buglist.cgi b/buglist.cgi
index 4e34ae511..f4cc0e723 100755
--- a/buglist.cgi
+++ b/buglist.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -22,74 +22,166 @@
 #                 Dan Mosedale <dmose@mozilla.org>
 #                 Stephan Niemz  <st.n@gmx.net>
 #                 Andreas Franke <afranke@mathweb.org>
+#                 Myk Melez <myk@mozilla.org>
 
+################################################################################
+# Script Initialization
+################################################################################
+
+# Make it harder for us to do dangerous things in Perl.
 use diagnostics;
 use strict;
 
+use lib qw(.);
+
+use vars qw( $template $vars );
+
+# Include the Bugzilla CGI and general utility library.
 require "CGI.pl";
-use Date::Parse;
 
 # Shut up misguided -w warnings about "used only once".  "use vars" just
 # doesn't work for me.
-
 sub sillyness {
     my $zz;
     $zz = $::db_name;
-    $zz = $::defaultqueryname;
-    $zz = $::unconfirmedstate;
     $zz = @::components;
     $zz = @::default_column_list;
+    $zz = $::defaultqueryname;
+    $zz = @::dontchange;
     $zz = @::legal_keywords;
     $zz = @::legal_platform;
     $zz = @::legal_priority;
     $zz = @::legal_product;
-    $zz = @::settable_resolution;
     $zz = @::legal_severity;
-    $zz = @::versions;
+    $zz = @::settable_resolution;
     $zz = @::target_milestone;
-    $zz = %::proddesc;
+    $zz = $::unconfirmedstate;
+    $zz = $::userid;
+    $zz = @::versions;
 };
 
-my $serverpush = 0;
-
 ConnectToDatabase();
 
-#print "Content-type: text/plain\n\n";    # Handy for debugging.
-#$::FORM{'debug'} = 1;
-
+################################################################################
+# Data and Security Validation
+################################################################################
 
-if (grep(/^cmd-/, keys(%::FORM))) {
-    my $url = "query.cgi?$::buffer#chart";
-    print qq{Refresh: 0; URL=$url
-Content-type: text/html
+# Whether or not the user wants to change multiple bugs.
+my $dotweak = $::FORM{'tweak'} ? 1 : 0;
 
-Adding field to query page...
-<P>
-<A HREF="$url">Click here if page doesn't redisplay automatically.</A>
-};
-    exit();
+# Log the user in
+if ($dotweak) {
+    confirm_login();
+    if (!UserInGroup("editbugs")) {
+        DisplayError("Sorry, you do not have sufficient privileges to edit
+                      multiple bugs.");
+        exit;
+    }
+    GetVersionTable();
+}
+else {
+    quietly_check_login();
 }
 
+# Determine the format in which the user would like to receive the output.
+# Uses the default format if the user did not specify an output format;
+# otherwise validates the user's choice against the list of available formats.
+my $format = ValidateOutputFormat($::FORM{'format'}, "list");
 
+# Use server push to display a "Please wait..." message for the user while
+# executing their query if their browser supports it and they are viewing
+# the bug list as HTML and they have not disabled it by adding &serverpush=0
+# to the URL.
+#
+# Server push is a Netscape 3+ hack incompatible with MSIE, Lynx, and others. 
+# Even Communicator 4.51 has bugs with it, especially during page reload.
+# http://www.browsercaps.org used as source of compatible browsers.
+#
+my $serverpush =
+  exists $ENV{'HTTP_USER_AGENT'} 
+    && $ENV{'HTTP_USER_AGENT'} =~ /Mozilla.[3-9]/ 
+      && $ENV{'HTTP_USER_AGENT'} !~ /[Cc]ompatible/
+        && $format->{'extension'} eq "html"
+          && !defined($::FORM{'serverpush'})
+            || $::FORM{'serverpush'};
+
+my $order = $::FORM{'order'} || "";
+my $order_from_cookie = 0;  # True if $order set using $::COOKIE{'LASTORDER'}
+
+# If the user is retrieving the last bug list they looked at, hack the buffer
+# storing the query string so that it looks like a query retrieving those bugs.
+if ($::FORM{'regetlastlist'}) {
+    if (!$::COOKIE{'BUGLIST'}) {
+        DisplayError(qq|Sorry, I seem to have lost the cookie that recorded
+                        the results of your last query.  You will have to start
+                        over at the <a href="query.cgi">query page</a>.|);
+        exit;
+    }
+    $::FORM{'bug_id'} = join(",", split(/:/, $::COOKIE{'BUGLIST'}));
+    $order = "reuse last sort" unless $order;
+    $::buffer = "bug_id=$::FORM{'bug_id'}&order=" . url_quote($order);
+}
 
-if (!defined $::FORM{'cmdtype'}) {
-    # This can happen if there's an old bookmark to a query...
-    $::FORM{'cmdtype'} = 'doit';
+if ($::buffer =~ /&cmd-/) {
+    my $url = "query.cgi?$::buffer#chart";
+    print "Refresh: 0; URL=$url\n";
+    print "Content-Type: text/html\n\n";
+    # Generate and return the UI (HTML page) from the appropriate template.
+    $vars->{'title'} = "Adding field to query page...";
+    $vars->{'url'} = $url;
+    $vars->{'link'} = "Click here if the page does not redisplay automatically.";
+    $template->process("global/message.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
+    exit;
 }
 
+# Generate a reasonable filename for the user agent to suggest to the user
+# when the user saves the bug list.  Uses the name of the remembered query
+# if available.  We have to do this now, even though we return HTTP headers 
+# at the end, because the fact that there is a remembered query gets 
+# forgotten in the process of retrieving it.
+my @time = localtime(time());
+my $date = sprintf "%04d-%02d-%02d", 1900+$time[5],$time[4]+1,$time[3];
+my $filename = "bugs-$date.$format->{extension}";
+$::FORM{'cmdtype'} ||= "";
+if ($::FORM{'cmdtype'} eq 'runnamed') {
+    $filename = "$::FORM{'namedcmd'}-$date.$format->{extension}";
+    # Remove white-space from the filename so the user cannot tamper
+    # with the HTTP headers.
+    $filename =~ s/\s//;
+}
+
+################################################################################
+# Utilities
+################################################################################
 
 sub SqlifyDate {
-    my ($str) = (@_);
-    if (!defined $str) {
-        $str = "";
-    }
+    my ($str) = @_;
+    $str = "" if !defined $str;
     my $date = str2time($str);
-    if (!defined $date) {
-        PuntTryAgain("The string '<tt>".html_quote($str)."</tt>' is not a legal date.");
+    if (!defined($date)) {
+        my $htmlstr = html_quote($str);
+        DisplayError("The string <tt>$htmlstr</tt> is not a legal date.");
+        exit;
     }
-    return time2str("%Y/%m/%d %H:%M:%S", $date);
+    return time2str("%Y-%m-%d %H:%M:%S", $date);
 }
 
+my @weekday= qw( Sun Mon Tue Wed Thu Fri Sat );
+sub DiffDate {
+    my ($datestr) = @_;
+    my $date = str2time($datestr);
+    my $age = time() - $date;
+    my ($s,$m,$h,$d,$mo,$y,$wd)= localtime $date;
+    if( $age < 18*60*60 ) {
+        $date = sprintf "%02d:%02d:%02d", $h,$m,$s;
+    } elsif( $age < 6*24*60*60 ) {
+        $date = sprintf "%s %02d:%02d", $weekday[$wd],$h,$m;
+    } else {
+        $date = sprintf "%04d-%02d-%02d", 1900+$y,$mo+1,$d;
+    }
+    return $date;
+}
 
 sub GetByWordList {
     my ($field, $strs) = (@_);
@@ -126,28 +218,75 @@ sub GetByWordListSubstr {
     return \@list;
 }
 
+sub LookupNamedQuery {
+    my ($name) = @_;
+    confirm_login();
+    my $userid = DBNameToIdAndCheck($::COOKIE{"Bugzilla_login"});
+    my $qname = SqlQuote($name);
+    SendSQL("SELECT query FROM namedqueries WHERE userid = $userid AND name = $qname");
+    my $result = FetchOneColumn();
+    if (!$result) {
+        my $qname = html_quote($name);
+        DisplayError("The query named <em>$qname</em> seems to no longer exist.");
+        exit;
+    }
+    return $result;
+}
+
+sub GetQuip {
+    return if !Param('usequip');
 
-sub Error {
-    my ($str) = (@_);
-    if (!$serverpush) {
-        print "Content-type: text/html\n\n";
+    my $quip;
+
+    # This is stupid.  We really really need to move the quip list into the DB!
+    if (open(COMMENTS, "<data/comments")) {
+        my @cdata;
+        push(@cdata, $_) while <COMMENTS>;
+        close COMMENTS;
+        $quip = $cdata[int(rand($#cdata + 1))];
     }
-    PuntTryAgain($str);
+    $quip ||= "Bugzilla would like to put a random quip here, but nobody has entered any.";
+
+    return $quip;
 }
 
+sub GetGroupsByGroupSet {
+    my ($groupset) = @_;
+
+    return if !$groupset;
+
+    SendSQL("
+        SELECT  bit, name, description, isactive
+          FROM  groups
+         WHERE  (bit & $groupset) != 0
+           AND  isbuggroup != 0
+      ORDER BY  description ");
 
+    my @groups;
 
+    while (MoreSQLData()) {
+        my $group = {};
+        ($group->{'bit'}, $group->{'name'},
+         $group->{'description'}, $group->{'isactive'}) = FetchSQLData();
+        push(@groups, $group);
+    }
+
+    return \@groups;
+}
 
 
+
+################################################################################
+# Query Generation
+################################################################################
+
 sub GenerateSQL {
     my $debug = 0;
-    my ($fieldsref, $supptablesref, $wherepartref, $urlstr) = (@_);
+    my ($fieldsref, $urlstr) = (@_);
     my @fields;
     my @supptables;
     my @wherepart;
     @fields = @$fieldsref if $fieldsref;
-    @supptables = @$supptablesref if $supptablesref;
-    @wherepart = @$wherepartref if $wherepartref;
     my %F;
     my %M;
     ParseUrlString($urlstr, \%F, \%M);
@@ -162,19 +301,18 @@ sub GenerateSQL {
              "LEFT JOIN profiles map_qa_contact ON bugs.qa_contact = map_qa_contact.userid"));
     unshift(@wherepart,
             ("bugs.assigned_to = map_assigned_to.userid",
-             "bugs.reporter = map_reporter.userid",
-             "bugs.groupset & $::usergroupset = bugs.groupset"));
-
+             "bugs.reporter = map_reporter.userid"));
 
     my $minvotes;
     if (defined $F{'votes'}) {
         my $c = trim($F{'votes'});
         if ($c ne "") {
             if ($c !~ /^[0-9]*$/) {
-                return Error("The 'At least ___ votes' field must be a\n" .
-                             "simple number. You entered \"" .
-                             html_quote($c) . "\", which\n" .
-                             "doesn't cut it.");
+                my $htmlc = html_quote($c);
+                DisplayError("The <em>At least ___ votes</em> field must be
+                              a simple number.  You entered <kbd>$htmlc</kbd>,
+                              which doesn't cut it.");
+                exit;
             }
             push(@specialchart, ["votes", "greaterthan", $c - 1]);
         }
@@ -254,9 +392,10 @@ sub GenerateSQL {
         if (@clist) {
             push(@specialchart, \@clist);
         } else {
-            return Error("You must specify one or more fields in which to\n" .
-                         "search for <tt>" .
-                         html_quote($email) . "</tt>.\n");
+            my $htmlemail = html_quote($email);
+            DisplayError("You must specify one or more fields in which
+                          to search for <tt>$htmlemail</tt>.");
+            exit;
         }
     }
 
@@ -265,10 +404,11 @@ sub GenerateSQL {
         my $c = trim($F{'changedin'});
         if ($c ne "") {
             if ($c !~ /^[0-9]*$/) {
-                return Error("The 'changed in last ___ days' field must be\n" .
-                             "a simple number. You entered \"" .
-                             html_quote($c) . "\", which\n" .
-                             "doesn't cut it.");
+                my $htmlc = html_quote($c);
+                DisplayError("The <em>changed in last ___ days</em> field
+                              must be a simple number.  You entered
+                              <kbd>$htmlc</kbd>, which doesn't cut it.");
+                exit;
             }
             push(@specialchart, ["changedin",
                                  "lessthan", $c + 1]);
@@ -340,6 +480,8 @@ sub GenerateSQL {
     }
 
     my $chartid;
+    # $statusid is used by the code that queries for attachment statuses.
+    my $statusid = 0;
     my $f;
     my $ff;
     my $t;
@@ -361,9 +503,10 @@ sub GenerateSQL {
          },
 
          "^cc," => sub {
-            push(@supptables,                                                  
-              ("LEFT JOIN cc cc_$chartid ON bugs.bug_id = cc_$chartid.bug_id LEFT JOIN profiles map_cc_$chartid ON cc_$chartid.who = map_cc_$chartid.userid"));
-            $f = "map_cc_$chartid.login_name";  
+            push(@supptables, "LEFT JOIN cc cc_$chartid ON bugs.bug_id = cc_$chartid.bug_id");
+
+            push(@supptables, "LEFT JOIN profiles map_cc_$chartid ON cc_$chartid.who = map_cc_$chartid.userid");
+            $f = "map_cc_$chartid.login_name";
          },
 
          "^long_?desc,changedby" => sub {
@@ -393,7 +536,8 @@ sub GenerateSQL {
          },
          "^attachments\..*," => sub {
              my $table = "attachments_$chartid";
-             push(@supptables, "LEFT JOIN attachments $table ON bugs.bug_id = $table.bug_id");
+             push(@supptables, "attachments $table");
+             push(@wherepart, "bugs.bug_id = $table.bug_id");
              $f =~ m/^attachments\.(.*)$/;
              my $field = $1;
              if ($t eq "changedby") {
@@ -412,13 +556,81 @@ sub GenerateSQL {
                  $field = "creation_ts";
                  $t = "greaterthan";
              }
-             if ($field eq "ispatch") {
-                 if ($v ne "0" && $v ne "1") {
-                     return Error("The only legal values for the 'Attachment is patch' field is 0 or 1.");
-                 }
+             if ($field eq "ispatch" && $v ne "0" && $v ne "1") {
+                 DisplayError("The only legal values for the <em>Attachment is
+                               patch</em> field are 0 and 1.");
+                 exit;
+             }
+             if ($field eq "isobsolete" && $v ne "0" && $v ne "1") {
+                 DisplayError("The only legal values for the <em>Attachment is
+                               obsolete</em> field are 0 and 1.");
+                 exit;
              }
              $f = "$table.$field";
          },
+         "^attachstatusdefs.name," => sub {
+             # The below has Fun with the names for attachment statuses. This
+             # isn't needed for changed* queries, so exclude those - the
+             # generic stuff will cope
+             return if ($t =~ m/^changed/);
+
+             # Searching for "status != 'bar'" wants us to look for an
+             # attachment without the 'bar' status, not for an attachment with
+             # a status not equal to 'bar' (Which would pick up an attachment
+             # with more than one status). We do this by LEFT JOINS, after
+             # grabbing the matching attachment status ids.
+             # Note that this still won't find bugs with no attachments, since
+             # that isn't really what people would expect.
+
+             # First, get the attachment status ids, using the other funcs
+             # to match the WHERE term.
+             # Note that we need to reverse the negated bits for this to work
+             # This somewhat abuses the definitions of the various terms -
+             # eg, does 'contains all' mean that the status has to contain all
+             # those words, or that all those words must be exact matches to
+             # statuses, which must all be on a single attachment, or should
+             # the match on the status descriptions be a contains match, too?
+
+             my $inverted = 0;
+             if ($t =~ m/not(.*)/) {
+                 $t = $1;
+                 $inverted = 1;
+             }
+
+             $ref = $funcsbykey{",$t"};
+             &$ref;
+             SendSQL("SELECT id FROM attachstatusdefs WHERE $term");
+
+             my @as_ids;
+             while (MoreSQLData()) {
+                 push @as_ids, FetchOneColumn();
+             }
+
+             # When searching for multiple statuses within a single boolean chart,
+             # we want to match each status record separately.  In other words,
+             # "status = 'foo' AND status = 'bar'" should match attachments with
+             # one status record equal to "foo" and another one equal to "bar",
+             # not attachments where the same status record equals both "foo" and
+             # "bar" (which is nonsensical).  In order to do this we must add an
+             # additional counter to the end of the "attachstatuses" table
+             # reference.
+             ++$statusid;
+
+             my $attachtable = "attachments_$chartid";
+             my $statustable = "attachstatuses_${chartid}_$statusid";
+
+             push(@supptables, "attachments $attachtable");
+             my $join = "LEFT JOIN attachstatuses $statustable ON ".
+               "($attachtable.attach_id = $statustable.attach_id AND " .
+                "$statustable.statusid IN (" . join(",", @as_ids) . "))";
+             push(@supptables, $join);
+             push(@wherepart, "bugs.bug_id = $attachtable.bug_id");
+             if ($inverted) {
+                 $term = "$statustable.statusid IS NULL";
+             } else {
+                 $term = "$statustable.statusid IS NOT NULL";
+             }
+         },
          "^changedin," => sub {
              $f = "(to_days(now()) - to_days(bugs.delta_ts))";
          },
@@ -434,12 +646,13 @@ sub GenerateSQL {
                  my $id = GetKeywordIdFromName($value);
                  if ($id) {
                      push(@list, "$table.keywordid = $id");
-                 } else {
-                     return Error("Unknown keyword named <code>" .
-                                  html_quote($v) . "</code>.\n" .
-                                  "<P>The legal keyword names are\n" .
-                                  "<A HREF=describekeywords.cgi>" .
-                                  "listed here</A>.\n");
+                 }
+                 else {
+                     my $htmlv = html_quote($v);
+                     DisplayError(qq|There is no keyword named <code>$htmlv</code>.
+                                     To search for keywords, consult the
+                                    <a href="describekeywords.cgi">list of legal keywords</a>.|);
+                     exit;
                  }
              }
              my $haveawordterm;
@@ -461,23 +674,23 @@ sub GenerateSQL {
              }
          },
 
-	 "^dependson," => sub {
+         "^dependson," => sub {
                 my $table = "dependson_" . $chartid;
-		push(@supptables, "dependencies $table");
-		$ff = "$table.$f";
-		$ref = $funcsbykey{",$t"};
-		&$ref;
+                push(@supptables, "dependencies $table");
+                $ff = "$table.$f";
+                $ref = $funcsbykey{",$t"};
+                &$ref;
                 push(@wherepart, "$table.blocked = bugs.bug_id");
-	 },
+         },
 
-	 "^blocked," => sub {
+         "^blocked," => sub {
                 my $table = "blocked_" . $chartid;
-		push(@supptables, "dependencies $table");
-		$ff = "$table.$f";
-		$ref = $funcsbykey{",$t"};
-		&$ref;
+                push(@supptables, "dependencies $table");
+                $ff = "$table.$f";
+                $ref = $funcsbykey{",$t"};
+                &$ref;
                 push(@wherepart, "$table.dependson = bugs.bug_id");
-	 },
+         },
 
 
          ",equals" => sub {
@@ -559,6 +772,15 @@ sub GenerateSQL {
              push(@wherepart, "$table.fieldid = $ftable.fieldid");
              $term = "($ftable.name = '$f' AND $table.bug_when > $q)";
          },
+         ",changedfrom" => sub {
+             my $table = "act_$chartid";
+             my $ftable = "fielddefs_$chartid";
+             push(@supptables, "bugs_activity $table");
+             push(@supptables, "fielddefs $ftable");
+             push(@wherepart, "$table.bug_id = bugs.bug_id");
+             push(@wherepart, "$table.fieldid = $ftable.fieldid");
+             $term = "($ftable.name = '$f' AND $table.removed = $q)";
+         },
          ",changedto" => sub {
              my $table = "act_$chartid";
              my $ftable = "fielddefs_$chartid";
@@ -593,6 +815,13 @@ sub GenerateSQL {
         push(@funcnames, $key);
     }
 
+    if ($debug) {
+        # If we're going to be printing debug stuff, we need the content
+        # type. This doesn't affect later stuff, because we call exit, and
+        # never return from this sub
+        print "Content-Type: text/html\n\n";
+    }
+
     # first we delete any sign of "Chart #-1" from the HTML form hash
     # since we want to guarantee the user didn't hide something here
     my @badcharts = grep /^(field|type|value)-1-/, (keys %F);
@@ -619,16 +848,16 @@ sub GenerateSQL {
     }
 
 
-# A boolean chart is a way of representing the terms in a logical 
+# A boolean chart is a way of representing the terms in a logical
 # expression.  Bugzilla builds SQL queries depending on how you enter
-# terms into the boolean chart. Boolean charts are represented in 
-# urls as tree-tuples of (chart id, row, column). The query form 
+# terms into the boolean chart. Boolean charts are represented in
+# urls as tree-tuples of (chart id, row, column). The query form
 # (query.cgi) may contain an arbitrary number of boolean charts where
-# each chart represents a clause in a SQL query. 
+# each chart represents a clause in a SQL query.
 #
 # The query form starts out with one boolean chart containing one
-# row and one column.  Extra rows can be created by pressing the 
-# AND button at the bottom of the chart.  Extra columns are created 
+# row and one column.  Extra rows can be created by pressing the
+# AND button at the bottom of the chart.  Extra columns are created
 # by pressing the OR button at the right end of the chart. Extra
 # charts are created by pressing "Add another boolean chart".
 #
@@ -657,11 +886,11 @@ sub GenerateSQL {
 # SELECT blah FROM blah WHERE ( (a1 OR a2)AND(b1 OR b2 OR b3)AND(c1)) AND (d1)
 #
 # The terms within a single row of a boolean chart are all constraints
-# on a single piece of data.  If you're looking for a bug that has two 
-# different people cc'd on it, then you need to use two boolean charts. 
-# This will find bugs with one CC mathing 'foo@blah.org' and and another 
-# CC matching 'bar@blah.org'. 
-# 
+# on a single piece of data.  If you're looking for a bug that has two
+# different people cc'd on it, then you need to use two boolean charts.
+# This will find bugs with one CC mathing 'foo@blah.org' and and another
+# CC matching 'bar@blah.org'.
+#
 # --------------------------------------------------------------
 # CC    | equal to
 # foo@blah.org
@@ -669,7 +898,7 @@ sub GenerateSQL {
 # CC    | equal to
 # bar@blah.org
 #
-# If you try to do this query by pressing the AND button in the 
+# If you try to do this query by pressing the AND button in the
 # original boolean chart then what you'll get is an expression that
 # looks for a single CC where the login name is both "foo@blah.org",
 # and "bar@blah.org". This is impossible.
@@ -692,7 +921,7 @@ sub GenerateSQL {
 # $ff = qualified field name (field name prefixed by table)
 #       e.g. bugs_activity.bug_id
 # $t  = type of query. e.g. "equal to", "changed after", case sensitive substr"
-# $v  = value - value the user typed in to the form 
+# $v  = value - value the user typed in to the form
 # $q  = sanitized version of user input (SqlQuote($v))
 # @supptables = Tables and/or table aliases used in query
 # %suppseen   = A hash used to store all the tables in supptables to weed
@@ -737,6 +966,11 @@ sub GenerateSQL {
                     die "Internal error: $errstr" if $chart < 0;
                     return Error($errstr);
                 }
+
+                # This is either from the internal chart (in which case we
+                # already know about it), or it was in %chartfields, so it is
+                # a valid field name, which means that its ok.
+                trick_taint($f);
                 $q = SqlQuote($v);
                 my $func;
                 $term = undef;
@@ -761,13 +995,13 @@ sub GenerateSQL {
                 }
                 if ($term) {
                     push(@orlist, $term);
-                } else {
-                    my $errstr = "Can't seem to handle " .
-                        qq{'<code>$F{"field$chart-$row-$col"}</code>' and } .
-                            qq{'<code>$F{"type$chart-$row-$col"}</code>' } .
-                                "together";
-                    die "Internal error: $errstr" if $chart < 0;
-                    return Error($errstr);
+                }
+                else {
+                    my $errstr =
+                      qq|Cannot seem to handle <code>$F{"field$chart-$row-$col"}</code>
+                         and <code>$F{"type$chart-$row-$col"}</code> together|;
+                    $chart < 0 ? die "Internal error: $errstr"
+                               : DisplayError($errstr) && exit;
                 }
             }
             if (@orlist) {
@@ -786,905 +1020,591 @@ sub GenerateSQL {
             $suppseen{$str} = 1;
         }
     }
-    my $query =  ("SELECT " . join(', ', @fields) .
+    my $query =  ("SELECT DISTINCT " . join(', ', @fields) .
                   " FROM $suppstring" .
-                  " WHERE " . join(' AND ', (@wherepart, @andlist)) .
-                  " GROUP BY bugs.bug_id");
-    if ($debug) {
-        print "<P><CODE>" . value_quote($query) . "</CODE><P>\n";
-        exit();
-    }
-    return $query;
-}
+                  " WHERE " . join(' AND ', (@wherepart, @andlist)));
 
+    $query = SelectVisible($query, $::userid, $::usergroupset);
 
-
-sub LookupNamedQuery {
-    my ($name) = (@_);
-    confirm_login();
-    my $userid = DBNameToIdAndCheck($::COOKIE{"Bugzilla_login"});
-    SendSQL("SELECT query FROM namedqueries " .
-            "WHERE userid = $userid AND name = " . SqlQuote($name));
-    my $result = FetchOneColumn();
-    if (!defined $result) {
-        print "Content-type: text/html\n\n";
-        PutHeader("Something weird happened");
-        print qq{The named query $name seems to no longer exist.};
-        PutFooter();
+    if ($debug) {
+        print "<P><CODE>" . value_quote($query) . "</CODE><P>\n";
         exit;
     }
-    return $result;
+    return $query;
 }
 
 
 
-$::querytitle = "Bug List";
+################################################################################
+# Command Execution
+################################################################################
 
+# Figure out if the user wanted to do anything besides just running the query
+# they defined on the query page, and take appropriate action.
 CMD: for ($::FORM{'cmdtype'}) {
     /^runnamed$/ && do {
         $::buffer = LookupNamedQuery($::FORM{"namedcmd"});
-        $::querytitle = "Bug List: $::FORM{'namedcmd'}";
+        $vars->{'title'} = "Bug List: $::FORM{'namedcmd'}";
         ProcessFormFields($::buffer);
+        $order = $::FORM{'order'} || $order;
         last CMD;
     };
-    /^editnamed$/ && do {
-	my $url = "query.cgi?" . LookupNamedQuery($::FORM{"namedcmd"});
-        print qq{Content-type: text/html
-Refresh: 0; URL=$url
 
-<TITLE>What a hack.</TITLE>
-<A HREF="$url">Loading your query named <B>$::FORM{'namedcmd'}</B>...</A>
-};
+    /^editnamed$/ && do {
+        my $url = "query.cgi?" . LookupNamedQuery($::FORM{"namedcmd"});
+        print "Refresh: 0; URL=$url\n";
+        print "Content-Type: text/html\n\n";
+        # Generate and return the UI (HTML page) from the appropriate template.
+        $vars->{'title'} = "Loading your query named $::FORM{'namedcmd'}";
+        $vars->{'url'} = $url;
+        $vars->{'link'} = "Click here if the page does not redisplay automatically.";
+        $template->process("global/message.html.tmpl", $vars)
+          || ThrowTemplateError($template->error());
         exit;
     };
+
     /^forgetnamed$/ && do {
         confirm_login();
         my $userid = DBNameToIdAndCheck($::COOKIE{"Bugzilla_login"});
-        SendSQL("DELETE FROM namedqueries WHERE userid = $userid " .
-                "AND name = " . SqlQuote($::FORM{'namedcmd'}));
-
-        print "Content-type: text/html\n\n";
-        PutHeader("Query is gone", "");
+        my $qname = SqlQuote($::FORM{'namedcmd'});
+        SendSQL("DELETE FROM namedqueries WHERE userid = $userid AND name = $qname");
+        # Now remove this query from the footer
+        my $count = 0;
+        foreach my $q (@{$::vars->{'user'}{'queries'}}) {
+            if ($q->{'name'} eq $::FORM{'namedcmd'}) {
+                splice(@{$::vars->{'user'}{'queries'}}, $count, 1);
+                last;
+            }
+            $count++;
+        }
 
-        print qq{
-OK, the <B>$::FORM{'namedcmd'}</B> query is gone.
-<P>
-<A HREF="query.cgi">Go back to the query page.</A>
-};
-        PutFooter();
+        print "Content-Type: text/html\n\n";
+        # Generate and return the UI (HTML page) from the appropriate template.
+        $vars->{'title'} = "Query is gone";
+        $vars->{'message'} = "OK, the <b>$::FORM{'namedcmd'}</b> query is gone.";
+        $vars->{'url'} = "query.cgi";
+        $vars->{'link'} = "Go back to the query page.";
+        $template->process("global/message.html.tmpl", $vars)
+          || ThrowTemplateError($template->error());
         exit;
     };
+
     /^asdefault$/ && do {
         confirm_login();
         my $userid = DBNameToIdAndCheck($::COOKIE{"Bugzilla_login"});
-        print "Content-type: text/html\n\n";
-        SendSQL("REPLACE INTO namedqueries (userid, name, query) VALUES " .
-                "($userid, '$::defaultqueryname'," .
-                SqlQuote($::buffer) . ")");
-        PutHeader("OK, default is set");
-        print qq{
-OK, you now have a new default query.  You may also bookmark the result of any
-individual query.
-
-<P><A HREF="query.cgi">Go back to the query page, using the new default.</A>
-};
-        PutFooter();
-        exit();
+        my $qname = SqlQuote($::defaultqueryname);
+        my $qbuffer = SqlQuote($::buffer);
+        SendSQL("REPLACE INTO namedqueries (userid, name, query)
+                 VALUES ($userid, $qname, $qbuffer)");
+        print "Content-Type: text/html\n\n";
+        # Generate and return the UI (HTML page) from the appropriate template.
+        $vars->{'title'} = "OK, default is set";
+        $vars->{'message'} = "OK, you now have a new default query.  You may
+                              also bookmark the result of any individual query.";
+        $vars->{'url'} = "query.cgi";
+        $vars->{'link'} = "Go back to the query page, using the new default.";
+        $template->process("global/message.html.tmpl", $vars)
+          || ThrowTemplateError($template->error());
+        exit;
     };
+
     /^asnamed$/ && do {
         confirm_login();
         my $userid = DBNameToIdAndCheck($::COOKIE{"Bugzilla_login"});
-        print "Content-type: text/html\n\n";
+
         my $name = trim($::FORM{'newqueryname'});
-        if ($name eq "" || $name =~ /[<>&]/) {
-            PutHeader("Please pick a valid name for your new query");
-            print "Click the <B>Back</B> button and type in a valid name\n";
-            print "for this query.  (Query names should not contain unusual\n";
-            print "characters.)\n";
-            PutFooter();
-            exit();
-        }
-        $::buffer =~ s/[\&\?]cmdtype=[a-z]+//;
+        $name
+          || DisplayError("You must enter a name for your query.")
+            && exit;
+        $name =~ /[<>&]/
+          && DisplayError("The name of your query cannot contain any
+                           of the following characters: &lt;, &gt;, &amp;.")
+            && exit;
         my $qname = SqlQuote($name);
-       my $tofooter= ( $::FORM{'tofooter'} ? 1 : 0 );
-        SendSQL("SELECT query FROM namedqueries " .
-                "WHERE userid = $userid AND name = $qname");
-        if (!FetchOneColumn()) {
-            SendSQL("REPLACE INTO namedqueries (userid, name, query, linkinfooter) " .
-                    "VALUES ($userid, $qname, ". SqlQuote($::buffer) .", ". $tofooter .")");
-        } else {
-            SendSQL("UPDATE namedqueries SET query = " . SqlQuote($::buffer) . "," .
-                   " linkinfooter = " . $tofooter .
-                    " WHERE userid = $userid AND name = $qname");
+
+        $::buffer =~ s/[\&\?]cmdtype=[a-z]+//;
+        my $qbuffer = SqlQuote($::buffer);
+
+        my $tofooter= $::FORM{'tofooter'} ? 1 : 0;
+
+        SendSQL("SELECT query FROM namedqueries WHERE userid = $userid AND name = $qname");
+        if (FetchOneColumn()) {
+            SendSQL("UPDATE  namedqueries
+                        SET  query = $qbuffer , linkinfooter = $tofooter
+                      WHERE  userid = $userid AND name = $qname");
         }
-        PutHeader("OK, query saved.");
-        print qq{
-OK, you have a new query named <code>$name</code>
-<P>
-<BR><A HREF="query.cgi">Go back to the query page</A>
-};
-        PutFooter();
+        else {
+            SendSQL("REPLACE INTO namedqueries (userid, name, query, linkinfooter)
+                     VALUES ($userid, $qname, $qbuffer, $tofooter)");
+        }
+        
+        my $new_in_footer = $tofooter;
+        
+        # Don't add it to the list if they are reusing an existing query name.
+        foreach my $query (@{$vars->{'user'}{'queries'}}) {
+            if ($query->{'name'} eq $name && $query->{'linkinfooter'} == 1) {
+                $new_in_footer = 0;
+            }
+        }        
+        
+        print "Content-Type: text/html\n\n";
+        # Generate and return the UI (HTML page) from the appropriate template.        
+        if ($new_in_footer) {
+            my %query = (name => $name,
+                         query => $::buffer, 
+                         linkinfooter => $tofooter);
+            push(@{$vars->{'user'}{'queries'}}, \%query);
+        }
+        
+        $vars->{'title'} = "OK, query saved.";
+        $vars->{'message'} = "OK, you have a new query named <code>$name</code>";
+        $vars->{'url'} = "query.cgi";
+        $vars->{'link'} = "Go back to the query page.";
+        $template->process("global/message.html.tmpl", $vars)
+          || ThrowTemplateError($template->error());
         exit;
     };
 }
 
 
-if (exists $ENV{'HTTP_USER_AGENT'} && $ENV{'HTTP_USER_AGENT'} =~ /Mozilla.[3-9]/ && $ENV{'HTTP_USER_AGENT'} !~ /[Cc]ompatible/ ) {
-    # Search for real Netscape 3 and up.  http://www.browsercaps.org used as source of
-    # browsers compatbile with server-push.  It's a Netscape hack, incompatbile
-    # with MSIE and Lynx (at least).  Even Communicator 4.51 has bugs with it,
-    # especially during page reload.
-    $serverpush = 1;
-
-    print qq{Content-type: multipart/x-mixed-replace;boundary=thisrandomstring\n
---thisrandomstring
-Content-type: text/html\n
-<html><head><title>Bugzilla is pondering your query</title>
-<style type="text/css">
-    .psb { margin-top: 20%; text-align: center; }
-</style></head><body>
-<h1 class="psb">Please stand by ...</h1></body></html>
-    };
-    # Note! HTML header is complete!
-} else {
-    print "Content-type: text/html\n";
-    #Changing attachment to inline to resolve 46897
-    #zach@zachlipton.com
-    print "Content-disposition: inline; filename=bugzilla_bug_list.html\n";
-    # Note! Don't finish HTML header yet!  Only one newline so far!
+################################################################################
+# Column Definition
+################################################################################
+
+# Define the columns that can be selected in a query and/or displayed in a bug
+# list.  Column records include the following fields:
+#
+# 1. ID: a unique identifier by which the column is referred in code;
+#
+# 2. Name: The name of the column in the database (may also be an expression
+#          that returns the value of the column);
+#
+# 3. Title: The title of the column as displayed to users.
+# 
+# Note: There are a few hacks in the code that deviate from these definitions.
+#       In particular, when the list is sorted by the "votes" field the word 
+#       "DESC" is added to the end of the field to sort in descending order, 
+#       and the redundant summaryfull column is removed when the client
+#       requests "all" columns.
+
+my $columns = {};
+sub DefineColumn {
+    my ($id, $name, $title) = @_;
+    $columns->{$id} = { 'name' => $name , 'title' => $title };
 }
-sub DefCol {
-    my ($name, $k, $t, $s, $q) = (@_);
 
-    $::key{$name} = $k;
-    $::title{$name} = $t;
-    if (defined $s && $s ne "") {
-        $::sortkey{$name} = $s;
+# Column:     ID                    Name                           Title
+DefineColumn("id"                , "bugs.bug_id"                , "ID"               );
+DefineColumn("groupset"          , "bugs.groupset"              , "Groupset"         );
+DefineColumn("opendate"          , "bugs.creation_ts"           , "Opened"           );
+DefineColumn("changeddate"       , "bugs.delta_ts"              , "Changed"          );
+DefineColumn("severity"          , "bugs.bug_severity"          , "Severity"         );
+DefineColumn("priority"          , "bugs.priority"              , "Priority"         );
+DefineColumn("platform"          , "bugs.rep_platform"          , "Platform"         );
+DefineColumn("owner"             , "map_assigned_to.login_name" , "Owner"            );
+DefineColumn("reporter"          , "map_reporter.login_name"    , "Reporter"         );
+DefineColumn("qa_contact"        , "map_qa_contact.login_name"  , "QA Contact"       );
+DefineColumn("status"            , "bugs.bug_status"            , "State"            );
+DefineColumn("resolution"        , "bugs.resolution"            , "Result"           );
+DefineColumn("summary"           , "bugs.short_desc"            , "Summary"          );
+DefineColumn("summaryfull"       , "bugs.short_desc"            , "Summary"          );
+DefineColumn("status_whiteboard" , "bugs.status_whiteboard"     , "Status Summary"   );
+DefineColumn("component"         , "bugs.component"             , "Component"        );
+DefineColumn("product"           , "bugs.product"               , "Product"          );
+DefineColumn("version"           , "bugs.version"               , "Version"          );
+DefineColumn("os"                , "bugs.op_sys"                , "OS"               );
+DefineColumn("target_milestone"  , "bugs.target_milestone"      , "Target Milestone" );
+DefineColumn("votes"             , "bugs.votes"                 , "Votes"            );
+DefineColumn("keywords"          , "bugs.keywords"              , "Keywords"         );
+
+
+################################################################################
+# Display Column Determination
+################################################################################
+
+# Determine the columns that will be displayed in the bug list via the 
+# columnlist CGI parameter, the user's preferences, or the default.
+my @displaycolumns = ();
+if (defined $::FORM{'columnlist'}) {
+    if ($::FORM{'columnlist'} eq "all") {
+        # If the value of the CGI parameter is "all", display all columns,
+        # but remove the redundant "summaryfull" column.
+        @displaycolumns = grep($_ ne 'summaryfull', keys(%$columns));
     }
-    if (!defined $q || $q eq "") {
-        $q = 0;
+    else {
+        @displaycolumns = split(/[ ,]+/, $::FORM{'columnlist'});
     }
-    $::needquote{$name} = $q;
 }
-
-DefCol("opendate", "unix_timestamp(bugs.creation_ts)", "Opened",
-       "bugs.creation_ts");
-DefCol("changeddate", "unix_timestamp(bugs.delta_ts)", "Changed",
-       "bugs.delta_ts");
-DefCol("severity", "substring(bugs.bug_severity, 1, 3)", "Sev",
-       "bugs.bug_severity");
-DefCol("priority", "substring(bugs.priority, 1, 3)", "Pri", "bugs.priority");
-DefCol("platform", "substring(bugs.rep_platform, 1, 3)", "Plt",
-       "bugs.rep_platform");
-DefCol("owner", "map_assigned_to.login_name", "Owner",
-       "map_assigned_to.login_name");
-DefCol("reporter", "map_reporter.login_name", "Reporter",
-       "map_reporter.login_name");
-DefCol("qa_contact", "map_qa_contact.login_name", "QAContact", "map_qa_contact.login_name");
-DefCol("status", "substring(bugs.bug_status,1,4)", "State", "bugs.bug_status");
-DefCol("resolution", "substring(bugs.resolution,1,4)", "Result",
-       "bugs.resolution");
-DefCol("summary", "substring(bugs.short_desc, 1, 60)", "Summary", "bugs.short_desc", 1);
-DefCol("summaryfull", "bugs.short_desc", "Summary", "bugs.short_desc", 1);
-DefCol("status_whiteboard", "bugs.status_whiteboard", "StatusSummary", "bugs.status_whiteboard", 1);
-DefCol("component", "substring(bugs.component, 1, 8)", "Comp",
-	"bugs.component");
-DefCol("product", "substring(bugs.product, 1, 8)", "Product", "bugs.product");
-DefCol("version", "substring(bugs.version, 1, 5)", "Vers", "bugs.version");
-DefCol("os", "substring(bugs.op_sys, 1, 4)", "OS", "bugs.op_sys");
-DefCol("target_milestone", "bugs.target_milestone", "TargetM",
-       "bugs.target_milestone");
-DefCol("votes", "bugs.votes", "Votes", "bugs.votes desc");
-DefCol("keywords", "bugs.keywords", "Keywords", "bugs.keywords", 5);
-
-my @collist;
-if (defined $::COOKIE{'COLUMNLIST'}) {
-    @collist = split(/ /, $::COOKIE{'COLUMNLIST'});
-} else {
-    @collist = @::default_column_list;
+elsif (defined $::COOKIE{'COLUMNLIST'}) {
+    # Use the columns listed in the user's preferences.
+    @displaycolumns = split(/ /, $::COOKIE{'COLUMNLIST'});
 }
-
-my $minvotes;
-if (defined $::FORM{'votes'}) {
-    if (trim($::FORM{'votes'}) ne "") {
-        if (! (grep {/^votes$/} @collist)) {
-            push(@collist, 'votes');
-        }
-    }
+else {
+    # Use the default list of columns.
+    @displaycolumns = @::default_column_list;
 }
 
+# Weed out columns that don't actually exist to prevent the user 
+# from hacking their column list cookie to grab data to which they 
+# should not have access.  Detaint the data along the way.
+@displaycolumns = grep($columns->{$_} && trick_taint($_), @displaycolumns);
 
-my $dotweak = defined $::FORM{'tweak'};
-
-if ($dotweak) {
-    confirm_login();
-    if (!UserInGroup("editbugs")) {
-        print qq{
-Sorry; you do not have sufficient privileges to edit a bunch of bugs
-at once.
-};
-        PutFooter();
-        exit();
-    }
-} else {
-    quietly_check_login();
-}
+# Remove the "ID" column from the list because bug IDs are always displayed
+# and are hard-coded into the display templates.
+@displaycolumns = grep($_ ne 'id', @displaycolumns);
 
+# IMPORTANT! Never allow the groupset column to be displayed!
+@displaycolumns = grep($_ ne 'groupset', @displaycolumns);
 
-my @fields = ("bugs.bug_id", "bugs.groupset");
+# Add the votes column to the list of columns to be displayed
+# in the bug list if the user is searching for bugs with a certain
+# number of votes and the votes column is not already on the list.
 
-foreach my $c (@collist) {
-    if (exists $::needquote{$c}) {
-        push(@fields, "$::key{$c}");
-    }
+# Some versions of perl will taint 'votes' if this is done as a single
+# statement, because $::FORM{'votes'} is tainted at this point
+$::FORM{'votes'} ||= "";
+if (trim($::FORM{'votes'}) && !grep($_ eq 'votes', @displaycolumns)) {
+    push(@displaycolumns, 'votes');
 }
 
 
-if ($dotweak) {
-    push(@fields, "bugs.product", "bugs.bug_status");
-}
+################################################################################
+# Select Column Determination
+################################################################################
 
+# Generate the list of columns that will be selected in the SQL query.
 
+# The bug ID and groupset are always selected because bug IDs are always
+# displayed and we need the groupset to determine whether or not the bug
+# is visible to the user.
+my @selectcolumns = ("id", "groupset");
 
-if ($::FORM{'regetlastlist'}) {
-    if (!$::COOKIE{'BUGLIST'}) {
-        print qq{
-Sorry, I seem to have lost the cookie that recorded the results of your last
-query.  You will have to start over at the <A HREF="query.cgi">query page</A>.
-};
-        PutFooter();
-        exit;
-    }
-    my @list = split(/:/, $::COOKIE{'BUGLIST'});
-    $::FORM{'bug_id'} = join(',', @list);
-    if (!$::FORM{'order'}) {
-        $::FORM{'order'} = 'reuse last sort';
-    }
-    $::buffer = "bug_id=" . $::FORM{'bug_id'} . "&order=" .
-        url_quote($::FORM{'order'});
+# Display columns are selected because otherwise we could not display them.
+push (@selectcolumns, @displaycolumns);
+
+# If the user is editing multiple bugs, we also make sure to select the product
+# and status because the values of those fields determine what options the user
+# has for modifying the bugs.
+if ($dotweak) {
+    push(@selectcolumns, "product") if !grep($_ eq 'product', @selectcolumns);
+    push(@selectcolumns, "status") if !grep($_ eq 'status', @selectcolumns);
 }
 
 
+################################################################################
+# Query Generation
+################################################################################
 
-ReconnectToShadowDatabase();
+# Convert the list of columns being selected into a list of column names.
+my @selectnames = map($columns->{$_}->{'name'}, @selectcolumns);
 
-my $query = GenerateSQL(\@fields, undef, undef, $::buffer);
+# Generate the basic SQL query that will be used to generate the bug list.
+my $query = GenerateSQL(\@selectnames, $::buffer);
 
 
-my $order_from_cookie = 0;
-if ($::COOKIE{'LASTORDER'}) {
-    if ((!$::FORM{'order'}) || $::FORM{'order'} =~ /^reuse/i) {
-        $::FORM{'order'} = url_decode($::COOKIE{'LASTORDER'});
-        $order_from_cookie = 1;
-    }
-}
+################################################################################
+# Sort Order Determination
+################################################################################
 
+# Add to the query some instructions for sorting the bug list.
+if ($::COOKIE{'LASTORDER'} && (!$order || $order =~ /^reuse/i)) {
+    $order = url_decode($::COOKIE{'LASTORDER'});
+    $order_from_cookie = 1;
+}
 
-if (defined $::FORM{'order'} && $::FORM{'order'} ne "") {
-    $query .= " ORDER BY ";
-    $::FORM{'order'} =~ s/votesum/bugs.votes/; # Silly backwards compatability
-                                               # hack.
-    $::FORM{'order'} =~ s/assign\.login_name/map_assigned_to.login_name/g;
-                                # Another backwards compatability hack.
+if ($order) {
+    my $db_order;  # Modified version of $order for use with SQL query
 
-    ORDER: for ($::FORM{'order'}) {
+    # Convert the value of the "order" form field into a list of columns
+    # by which to sort the results.
+    ORDER: for ($order) {
         /\./ && do {
+            my @columnnames = map($columns->{lc($_)}->{'name'}, keys(%$columns));
             # A custom list of columns.  Make sure each column is valid.
-            foreach my $fragment (split(/,/, $::FORM{'order'})) {
-                my $ident_iregexp = "[a-z_][0-9a-z_]*";
-                if ($fragment !~ /^\s*${ident_iregexp}\.${ident_iregexp}(\s+(asc|desc))?\s*$/i) {
+            foreach my $fragment (split(/,/, $order)) {
+                $fragment = trim($fragment);
+                # Accept an order fragment matching a column name, with
+                # asc|desc optionally following (to specify the direction)
+                if (!grep($fragment =~ /^\Q$_\E(\s+(asc|desc))?$/, @columnnames)) {
                     my $qfragment = html_quote($fragment);
                     my $error = "The custom sort order you specified in your "
                               . "form submission contains an invalid column "
-                              . "descriptor <em>$qfragment</em>.";
+                              . "name <em>$qfragment</em>.";
                     if ($order_from_cookie) {
+                        my $cookiepath = Param("cookiepath");
+                        print "Set-Cookie: LASTORDER= ; path=$cookiepath; expires=Sun, 30-Jun-80 00:00:00 GMT\n";
                         $error =~ s/form submission/cookie/;
+                        $error .= "  The cookie has been cleared.";
                     }
                     DisplayError($error);
                     exit;
                 }
             }
+            # Now that we have checked that all columns in the order are valid,
+            # detaint the order string.
+            trick_taint($order);
             last ORDER;
         };
         /Number/ && do {
-            $::FORM{'order'} = "bugs.bug_id";
+            $order = "bugs.bug_id";
             last ORDER;
         };
         /Import/ && do {
-            $::FORM{'order'} = "bugs.priority, bugs.bug_severity";
+            $order = "bugs.priority, bugs.bug_severity";
             last ORDER;
         };
         /Assign/ && do {
-            $::FORM{'order'} = "map_assigned_to.login_name, bugs.bug_status, bugs.priority, bugs.bug_id";
+            $order = "map_assigned_to.login_name, bugs.bug_status, bugs.priority, bugs.bug_id";
+            last ORDER;
+        };
+        /Changed/ && do {
+            $order = "bugs.delta_ts, bugs.bug_status, bugs.priority, map_assigned_to.login_name, bugs.bug_id";
             last ORDER;
         };
         # DEFAULT
-        $::FORM{'order'} = "bugs.bug_status, bugs.priority, map_assigned_to.login_name, bugs.bug_id";
+        $order = "bugs.bug_status, bugs.priority, map_assigned_to.login_name, bugs.bug_id";
     }
-    die "Invalid order: $::FORM{'order'}" unless
-        $::FORM{'order'} =~ /^([a-zA-Z0-9_., ]+)$/;
+
+    $db_order = $order;  # Copy $order into $db_order for use with SQL query
 
     # Extra special disgusting hack: if we are ordering by target_milestone,
     # change it to order by the sortkey of the target_milestone first.
-    my $order = $::FORM{'order'};
-    if ($order =~ /bugs.target_milestone/) {
-        $query =~ s/ WHERE / LEFT JOIN milestones ms_order ON ms_order.value = bugs.target_milestone AND ms_order.product = bugs.product WHERE /;
-        $order =~ s/bugs.target_milestone/ms_order.sortkey,ms_order.value/;
+    if ($db_order =~ /bugs.target_milestone/) {
+        $db_order =~ s/bugs.target_milestone/ms_order.sortkey,ms_order.value/;
+        $query =~ s/\sWHERE\s/ LEFT JOIN milestones ms_order ON ms_order.value = bugs.target_milestone AND ms_order.product = bugs.product WHERE /;
     }
 
-    $query .= $order;
-}
-
-
-if ($::FORM{'debug'} && $serverpush) {
-    print "<P><CODE>" . value_quote($query) . "</CODE><P>\n";
-}
-
-
-if (Param('expectbigqueries')) {
-    SendSQL("set option SQL_BIG_TABLES=1");
-}
-SendSQL($query);
+    # If we are sorting by votes, sort in descending order if no explicit
+    # sort order was given
+    $db_order =~ s/bugs.votes\s*(,|$)/bugs.votes desc$1/i;
 
-my $count = 0;
-$::bugl = "";
-sub pnl {
-    my ($str) = (@_);
-    $::bugl  .= $str;
+    $query .= " ORDER BY $db_order ";
 }
 
-my $fields = $::buffer;
-$fields =~ s/[&?]order=[^&]*//g;
-$fields =~ s/[&?]cmdtype=[^&]*//g;
 
+################################################################################
+# Query Execution
+################################################################################
 
-my $orderpart;
-my $oldorder;
-
-if (defined $::FORM{'order'} && trim($::FORM{'order'}) ne "") {
-    $orderpart = "&order=" . url_quote("$::FORM{'order'}");
-    $oldorder = url_quote(", $::FORM{'order'}");
-} else {
-    $orderpart = "";
-    $oldorder = "";
-}
-
-if ($dotweak) {
-    pnl "<FORM NAME=changeform METHOD=POST ACTION=\"process_bug.cgi\">";
-}
-
+# Time to use server push to display an interim message to the user until
+# the query completes and we can display the bug list.
+if ($serverpush) {
+    # Generate HTTP headers.
+    print "Content-Disposition: inline; filename=$filename\n";
+    print "Content-Type: multipart/x-mixed-replace;boundary=thisrandomstring\n\n";
+    print "--thisrandomstring\n";
+    print "Content-Type: text/html\n\n";
 
-my @th;
-foreach my $c (@collist) {
-    if (exists $::needquote{$c}) {
-        my $h = "<TH>";
-        if (defined $::sortkey{$c}) {
-            $h .= "<A HREF=\"buglist.cgi?$fields&order=" . url_quote($::sortkey{$c}) . "$oldorder\">$::title{$c}</A>";
-        } else {
-            $h .= $::title{$c};
-        }
-        $h .= "</TH>";
-        push(@th, $h);
-    }
+    # Generate and return the UI (HTML page) from the appropriate template.
+    $template->process("list/server-push.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
 }
 
-my $tablestart = "<TABLE CELLSPACING=0 CELLPADDING=4 WIDTH=100%>
-<TR ALIGN=LEFT><TH>
-<A HREF=\"buglist.cgi?$fields&order=bugs.bug_id\">ID</A>";
+# Connect to the shadow database if this installation is using one to improve
+# query performance.
+ReconnectToShadowDatabase();
 
-my $splitheader = 0;
-if ($::COOKIE{'SPLITHEADER'}) {
-    $splitheader = 1;
-}
+# Tell MySQL to store temporary tables on the hard drive instead of memory
+# to avoid "table out of space" errors on MySQL versions less than 3.23.2.
+SendSQL("SET OPTION SQL_BIG_TABLES=1") if Param('expectbigqueries');
 
-if ($splitheader) {
-    $tablestart =~ s/<TH/<TH COLSPAN="2"/;
-    for (my $pass=0 ; $pass<2 ; $pass++) {
-        if ($pass == 1) {
-            $tablestart .= "</TR>\n<TR><TD></TD>";
-        }
-        for (my $i=1-$pass ; $i<@th ; $i += 2) {
-            my $h = $th[$i];
-            $h =~ s/TH/TH COLSPAN="2" ALIGN="left"/;
-            $tablestart .= $h;
-        }
-    }
-} else {
-    $tablestart .= join("", @th);
-}
+# Normally, we ignore SIGTERM and SIGPIPE (see globals.pl) but we need to
+# respond to them here to prevent someone DOSing us by reloading a query
+# a large number of times.
+$::SIG{TERM} = 'DEFAULT';
+$::SIG{PIPE} = 'DEFAULT';
 
+# Execute the query.
+SendSQL($query);
 
-$tablestart .= "\n";
 
+################################################################################
+# Results Retrieval
+################################################################################
 
-my @row;
-my %seen;
-my @bugarray;
-my %prodhash;
-my %statushash;
-my %ownerhash;
+# Retrieve the query results one row at a time and write the data into a list
+# of Perl records.
 
-my $pricol = -1;
-my $sevcol = -1;
-for (my $colcount = 0 ; $colcount < @collist ; $colcount++) {
-    my $colname = $collist[$colcount];
-    if ($colname eq "priority") {
-        $pricol = $colcount;
-    }
-    if ($colname eq "severity") {
-        $sevcol = $colcount;
-    }
-}
+my $bugowners = {};
+my $bugproducts = {};
+my $bugstatuses = {};
 
-my @weekday= qw( Sun Mon Tue Wed Thu Fri Sat );
+my @bugs; # the list of records
 
-while (@row = FetchSQLData()) {
-    my $bug_id = shift @row;
-    my $g = shift @row;         # Bug's group set.
-    if (!defined $seen{$bug_id}) {
-        $seen{$bug_id} = 1;
-        $count++;
-        if ($count % 200 == 0) {
-            # Too big tables take too much browser memory...
-            pnl "</TABLE>$tablestart";
-        }
-        push @bugarray, $bug_id;
-
-        # retrieve this bug's priority and severity, if available,
-        # by looping through all column names -- gross but functional
-        my $priority = "unknown";
-        my $severity;
-        if ($pricol >= 0) {
-            $priority = $row[$pricol];
-        }
-        if ($sevcol >= 0) {
-            $severity = $row[$sevcol];
-        }
-        my $customstyle = "";
-        if ($severity) {
-            if ($severity eq "enhan") {
-                $customstyle = "style='font-style:italic ! important'";
-            }
-            if ($severity eq "block") {
-                $customstyle = "style='color:red ! important; font-weight:bold ! important'";
-            }
-            if ($severity eq "criti") {
-                $customstyle = "style='color:red; ! important'";
-            }
-        }
-        pnl "<TR VALIGN=TOP ALIGN=LEFT CLASS=$priority $customstyle><TD>";
-        if ($dotweak) {
-            pnl "<input type=checkbox name=id_$bug_id>";
-        }
-        pnl "<A HREF=\"show_bug.cgi?id=$bug_id\">";
-        pnl "$bug_id</A>";
-        if ($g != "0") { pnl "*"; }
-        pnl " ";
-        foreach my $c (@collist) {
-            if (exists $::needquote{$c}) {
-                my $value = shift @row;
-                if (!defined $value) {
-                    pnl "<TD>";
-                    next;
-                }
-                if ($c eq "owner") {
-                    $ownerhash{$value} = 1;
-		}elsif( $c eq 'changeddate' or $c eq 'opendate' ) {
-		    my $age= time() - $value;
-		    my ($s,$m,$h,$d,$mo,$y,$wd)= localtime $value;
-		    if( $age < 18*60*60 ) {
-			$value= sprintf "%02d:%02d:%02d", $h,$m,$s;
-		    }elsif( $age < 6*24*60*60 ) {
-			$value= sprintf "%s %02d:%02d", $weekday[$wd],$h,$m;
-		    }else {
-			$value= sprintf "%04d-%02d-%02d", 1900+$y,$mo+1,$d;
-		    }
-		}
-                if ($::needquote{$c} || $::needquote{$c} == 5) {
-                    $value = html_quote($value);
-                } else {
-                    $value = "<nobr>$value</nobr>";
-                }
+while (my @row = FetchSQLData()) {
+    my $bug = {}; # a record
 
-                pnl "<td class=$c>$value";
-            }
-        }
-        if ($dotweak) {
-            my $value = shift @row;
-            $prodhash{$value} = 1;
-            $value = shift @row;
-            $statushash{$value} = 1;
-        }
-        pnl "\n";
+    # Slurp the row of data into the record.
+    foreach my $column (@selectcolumns) {
+        $bug->{$column} = shift @row;
     }
-}
-my $buglist = join(":", @bugarray);
 
-
-# This is stupid.  We really really need to move the quip list into the DB!
-my $quip;
-if (Param('usequip')){
-  if (open (COMMENTS, "<data/comments")) {
-    my @cdata;
-    while (<COMMENTS>) {
-      push @cdata, $_;
+    # Process certain values further (i.e. date format conversion).
+    if ($bug->{'changeddate'}) {
+        $bug->{'changeddate'} =~ 
+          s/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/$1-$2-$3 $4:$5:$6/;
+        $bug->{'changeddate'} = DiffDate($bug->{'changeddate'});
     }
-    close COMMENTS;
-    $quip = $cdata[int(rand($#cdata + 1))];
-  }
-  $quip ||= "Bugzilla would like to put a random quip here, but nobody has entered any.";
-}
+    ($bug->{'opendate'} = DiffDate($bug->{'opendate'})) if $bug->{'opendate'};
 
+    # Record the owner, product, and status in the big hashes of those things.
+    $bugowners->{$bug->{'owner'}} = 1 if $bug->{'owner'};
+    $bugproducts->{$bug->{'product'}} = 1 if $bug->{'product'};
+    $bugstatuses->{$bug->{'status'}} = 1 if $bug->{'status'};
 
-# We've done all we can without any output.  If we can server push it is time
-# take down the waiting page and put up the real one.
-if ($serverpush) {
-    print "\n";
-    print "--thisrandomstring\n";
-    print "Content-type: text/html\n";
-    print "Content-disposition: inline; filename=bugzilla_bug_list.html\n";
-    # Note! HTML header not yet closed
-}
-my $toolong = 0;
-if ($::FORM{'order'}) {
-    my $q = url_quote($::FORM{'order'});
-    print "Set-Cookie: LASTORDER=$q ; path=/; expires=Sun, 30-Jun-2029 00:00:00 GMT\n";
-}
-if (length($buglist) < 4000) {
-    print "Set-Cookie: BUGLIST=$buglist\n\n";
-} else {
-    print "Set-Cookie: BUGLIST=\n\n";
-    $toolong = 1;
+    # Add the record to the list.
+    push(@bugs, $bug);
 }
-PutHeader($::querytitle);
 
+# Switch back from the shadow database to the regular database so PutFooter()
+# can determine the current user even if the "logincookies" table is corrupted
+# in the shadow database.
+SendSQL("USE $::db_name");
 
-print "
-<CENTER>
-<B>" .  time2str("%a %b %e %T %Z %Y", time()) . "</B>";
 
-if (Param('usebuggroups')) {
-   print "<BR>* next to a bug number notes a bug not visible to everyone.<BR>";
+################################################################################
+# Template Variable Definition
+################################################################################
+
+# Define the variables and functions that will be passed to the UI template.
+
+$vars->{'bugs'} = \@bugs;
+$vars->{'buglist'} = join(',', map($_->{id}, @bugs));
+$vars->{'columns'} = $columns;
+$vars->{'displaycolumns'} = \@displaycolumns;
+
+my @openstates = OpenStates();
+$vars->{'openstates'} = \@openstates;
+$vars->{'closedstates'} = ['CLOSED', 'VERIFIED', 'RESOLVED'];
+
+# The list of query fields in URL query string format, used when creating
+# URLs to the same query results page with different parameters (such as
+# a different sort order or when taking some action on the set of query
+# results).  To get this string, we start with the raw URL query string
+# buffer that was created when we initially parsed the URL on script startup,
+# then we remove all non-query fields from it, f.e. the sort order (order)
+# and command type (cmdtype) fields.
+$vars->{'urlquerypart'} = $::buffer;
+$vars->{'urlquerypart'} =~ s/[&?](order|cmdtype)=[^&]*//g;
+$vars->{'order'} = $order;
+
+# The user's login account name (i.e. email address).
+my $login = $::COOKIE{'Bugzilla_login'};
+
+$vars->{'caneditbugs'} = UserInGroup('editbugs');
+$vars->{'usebuggroups'} = Param('usebuggroups');
+
+# Whether or not this user is authorized to move bugs to another installation.
+$vars->{'ismover'} = 1
+  if Param('move-enabled')
+    && defined($login)
+      && Param('movers') =~ /^(\Q$login\E[,\s])|([,\s]\Q$login\E[,\s]+)/;
+
+my @bugowners = keys %$bugowners;
+if (scalar(@bugowners) > 1 && UserInGroup('editbugs')) {
+    my $suffix = Param('emailsuffix');
+    map(s/$/$suffix/, @bugowners) if $suffix;
+    my $bugowners = join(",", @bugowners);
+    $vars->{'bugowners'} = $bugowners;
 }
 
-if (defined $::FORM{'debug'}) {
-    print "<P><CODE>" . value_quote($query) . "</CODE><P>\n";
+if ($::FORM{'debug'}) {
+    $vars->{'debug'} = 1;
+    $vars->{'query'} = $query;
 }
 
-if ($toolong) {
-    print "<h2>This list is too long for bugzilla's little mind; the\n";
-    print "Next/Prev/First/Last buttons won't appear.</h2>\n";
-}
+# Whether or not to split the column titles across two rows to make
+# the list more compact.
+$vars->{'splitheader'} = $::COOKIE{'SPLITHEADER'} ? 1 : 0;
 
-if (Param('usequip')){
-  print "<HR><A HREF=quips.cgi><I>$quip</I></A></CENTER>\n";
-}
-print "<HR SIZE=10>";
-print "$count bugs found." if $count > 9;
-print $tablestart, "\n";
-print $::bugl;
-print "</TABLE>\n";
-
-if ($count == 0) {
-    print "Zarro Boogs found.\n";
-    # I've been asked to explain this ... way back when, when Netscape released
-    # version 4.0 of its browser, we had a release party.  Naturally, there
-    # had been a big push to try and fix every known bug before the release.
-    # Naturally, that hadn't actually happened.  (This is not unique to
-    # Netscape or to 4.0; the same thing has happened with every software
-    # project I've ever seen.)  Anyway, at the release party, T-shirts were
-    # handed out that said something like "Netscape 4.0: Zarro Boogs".
-    # Just like the software, the T-shirt had no known bugs.  Uh-huh.
-    #
-    # So, when you query for a list of bugs, and it gets no results, you
-    # can think of this as a friendly reminder.  Of *course* there are bugs
-    # matching your query, they just aren't in the bugsystem yet...
-
-    print qq{<p><A HREF="query.cgi">Query Page</A>\n};
-    print qq{&nbsp;&nbsp;<A HREF="enter_bug.cgi">Enter New Bug</A>\n};
-    print qq{<NOBR><A HREF="query.cgi?$::buffer">Edit this query</A></NOBR>\n};
-} elsif ($count == 1) {
-    print "One bug found.\n";
-} else {
-    print "$count bugs found.\n";
-}
+$vars->{'quip'} = GetQuip() if Param('usequip');
+$vars->{'currenttime'} = time2str("%a %b %e %T %Z %Y", time());
 
+# The following variables are used when the user is making changes to multiple bugs.
 if ($dotweak) {
-    GetVersionTable();
-    print "
-<SCRIPT>
-numelements = document.changeform.elements.length;
-function SetCheckboxes(value) {
-    var item;
-    for (var i=0 ; i<numelements ; i++) {
-        item = document.changeform.elements\[i\];
-        item.checked = value;
+    $vars->{'dotweak'} = 1;
+    $vars->{'use_keywords'} = 1 if @::legal_keywords;
+
+    $vars->{'products'} = \@::legal_product;
+    $vars->{'platforms'} = \@::legal_platform;
+    $vars->{'priorities'} = \@::legal_priority;
+    $vars->{'severities'} = \@::legal_severity;
+    $vars->{'resolutions'} = \@::settable_resolution;
+
+    # The value that represents "don't change the value of this field".
+    $vars->{'dontchange'} = $::dontchange;
+
+    $vars->{'unconfirmedstate'} = $::unconfirmedstate;
+
+    $vars->{'bugstatuses'} = [ keys %$bugstatuses ];
+
+    # The groups to which the user belongs.
+    $vars->{'groups'} = GetGroupsByGroupSet($::usergroupset) if $::usergroupset ne '0';
+
+    # If all bugs being changed are in the same product, the user can change
+    # their version and component, so generate a list of products, a list of
+    # versions for the product (if there is only one product on the list of
+    # products), and a list of components for the product.
+    $vars->{'bugproducts'} = [ keys %$bugproducts ];
+    if (scalar(@{$vars->{'bugproducts'}}) == 1) {
+        my $product = $vars->{'bugproducts'}->[0];
+        $vars->{'versions'} = $::versions{$product};
+        $vars->{'components'} = $::components{$product};
+        $vars->{'targetmilestones'} = $::target_milestone{$product} if Param('usetargetmilestone');
     }
 }
-document.write(\" <input type=button value=\\\"Uncheck All\\\" onclick=\\\"SetCheckboxes(false);\\\"> <input type=button value=\\\"Check All\\\" onclick=\\\"SetCheckboxes(true);\\\">\");
-</SCRIPT>";
-
-    my $resolution_popup = make_options(\@::settable_resolution, "FIXED");
-    my @prod_list = keys %prodhash;
-    my @list = @prod_list;
-    my @legal_versions;
-    my @legal_component;
-    if (1 == @prod_list) {
-        @legal_versions = @{$::versions{$prod_list[0]}};
-        @legal_component = @{$::components{$prod_list[0]}};
-    }
 
-    my $version_popup = make_options(\@legal_versions, $::dontchange);
-    my $platform_popup = make_options(\@::legal_platform, $::dontchange);
-    my $priority_popup = make_options(\@::legal_priority, $::dontchange);
-    my $sev_popup = make_options(\@::legal_severity, $::dontchange);
-    my $component_popup = make_options(\@legal_component, $::dontchange);
-    my $product_popup = make_options(\@::legal_product, $::dontchange);
-
-
-    print "
-<hr>
-<TABLE>
-<TR>
-    <TD ALIGN=RIGHT><B>Product:</B></TD>
-    <TD><SELECT NAME=product>$product_popup</SELECT></TD>
-    <TD ALIGN=RIGHT><B>Version:</B></TD>
-    <TD><SELECT NAME=version>$version_popup</SELECT></TD>
-<TR>
-    <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#rep_platform\">Platform:</A></B></TD>
-    <TD><SELECT NAME=rep_platform>$platform_popup</SELECT></TD>
-    <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#priority\">Priority:</A></B></TD>
-    <TD><SELECT NAME=priority>$priority_popup</SELECT></TD>
-</TR>
-<TR>
-    <TD ALIGN=RIGHT><B>Component:</B></TD>
-    <TD><SELECT NAME=component>$component_popup</SELECT></TD>
-    <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#severity\">Severity:</A></B></TD>
-    <TD><SELECT NAME=bug_severity>$sev_popup</SELECT></TD>
-</TR>";
-
-    if (Param("usetargetmilestone")) {
-        my @legal_milestone;
-        if(1 == @prod_list) {
-            @legal_milestone = @{$::target_milestone{$prod_list[0]}};
-        }
-        my $tfm_popup = make_options(\@legal_milestone, $::dontchange);
-        print "
-    <TR>
-    <TD ALIGN=RIGHT><B>Target milestone:</B></TD>
-    <TD><SELECT NAME=target_milestone>$tfm_popup</SELECT></TD>
-    </TR>";
-    }
 
-    if (Param("useqacontact")) {
-        print "
-<TR>
-<TD><B>QA Contact:</B></TD>
-<TD COLSPAN=3><INPUT NAME=qa_contact SIZE=32 VALUE=\"" .
-            value_quote($::dontchange) . "\"></TD>
-</TR>";
-    }
-
-   print qq{
-<TR><TD ALIGN="RIGHT"><B>CC List:</B></TD>
-<TD COLSPAN=3><INPUT NAME="masscc" SIZE=32 VALUE="">
-<SELECT NAME="ccaction">
-<OPTION VALUE="add">Add these to the CC List
-<OPTION VALUE="remove">Remove these from the CC List
-</SELECT>
-</TD>
-</TR>
-};
-
-    if (@::legal_keywords) {
-        print qq{
-<TR><TD><B><A HREF="describekeywords.cgi">Keywords</A>:</TD>
-<TD COLSPAN=3><INPUT NAME=keywords SIZE=32 VALUE="">
-<SELECT NAME="keywordaction">
-<OPTION VALUE="add">Add these keywords
-<OPTION VALUE="delete">Delete these keywords
-<OPTION VALUE="makeexact">Make the keywords be exactly this list
-</SELECT>
-</TD>
-</TR>
-};
-    }
+################################################################################
+# HTTP Header Generation
+################################################################################
 
+# If we are doing server push, output a separator string.
+print "\n--thisrandomstring\n" if $serverpush;
+    
+# Generate HTTP headers
 
-    print "</TABLE>
+# Suggest a name for the bug list if the user wants to save it as a file.
+# If we are doing server push, then we did this already in the HTTP headers
+# that started the server push, so we don't have to do it again here.
+print "Content-Disposition: inline; filename=$filename\n" unless $serverpush;
 
-<INPUT NAME=multiupdate value=Y TYPE=hidden>
+if ($format->{'extension'} eq "html") {
+    my $cookiepath = Param("cookiepath");
+    print "Content-Type: text/html\n";
 
-<B>Additional Comments:</B>
-<BR>
-<TEXTAREA WRAP=HARD NAME=comment ROWS=5 COLS=80></TEXTAREA><BR>";
-
-if($::usergroupset ne '0') {
-    SendSQL("select bit, name, description, isactive ".
-            "from groups where bit & $::usergroupset != 0 ".
-            "and isbuggroup != 0 ".
-            "order by description");
-    # We only print out a header bit for this section if there are any
-    # results.
-    my $groupFound = 0;
-    my $inactiveFound = 0;
-    while (MoreSQLData()) {
-        my ($bit, $groupname, $description, $isactive) = (FetchSQLData());
-        if(($prodhash{$groupname}) || (!defined($::proddesc{$groupname}))) {
-          if(!$groupFound) {
-            print "<B>Groupset:</B><BR>\n";
-            print "<TABLE BORDER=1><TR>\n";
-            print "<TH ALIGN=center VALIGN=middle>Don't<br>change<br>this group<br>restriction</TD>\n";
-            print "<TH ALIGN=center VALIGN=middle>Remove<br>bugs<br>from this<br>group</TD>\n";
-            print "<TH ALIGN=center VALIGN=middle>Add<br>bugs<br>to this<br>group</TD>\n";
-            print "<TH ALIGN=left VALIGN=middle>Group name:</TD></TR>\n";
-            $groupFound = 1;
-          }
-          # Modifying this to use radio buttons instead
-          print "<TR>";
-          print "<TD ALIGN=center><input type=radio name=\"bit-$bit\" value=\"-1\" checked></TD>\n";
-          print "<TD ALIGN=center><input type=radio name=\"bit-$bit\" value=\"0\"></TD>\n";
-          if ($isactive) {
-            print "<TD ALIGN=center><input type=radio name=\"bit-$bit\" value=\"1\"></TD>\n";
-          } else {
-            $inactiveFound = 1;
-            print "<TD>&nbsp;</TD>\n";
-          }
-          print "<TD>";
-          if(!$isactive) {
-            print "<I>";
-          }
-          print "$description";
-          if(!$isactive) {
-            print "</I>";
-          }
-          print "</TD></TR>\n";
-        }
-    }
-    # Add in some blank space for legibility
-    if($groupFound) {
-      print "</TABLE>\n";
-      if ($inactiveFound) {
-        print "<FONT SIZE=\"-1\">(Note: Bugs may not be added to inactive groups (<I>italicized</I>), only removed)</FONT><BR>\n";
-      }
-      print "<BR><BR>\n";
+    if ($order) {
+        my $qorder = url_quote($order);
+        print "Set-Cookie: LASTORDER=$qorder ; path=$cookiepath; expires=Sun, 30-Jun-2029 00:00:00 GMT\n";
     }
-}
-
-
-
-
-    # knum is which knob number we're generating, in javascript terms.
-
-    my $knum = 0;
-    print "
-<INPUT TYPE=radio NAME=knob VALUE=none CHECKED>
-        Do nothing else<br>";
-    $knum++;
-    if ($statushash{$::unconfirmedstate} && 1 == scalar(keys(%statushash))) {
-        print "
-<INPUT TYPE=radio NAME=knob VALUE=confirm>
-        Confirm bugs (change status to <b>NEW</b>)<br>";
+    my $bugids = join(":", map( $_->{'id'}, @bugs));
+    # See also Bug 111999
+    if (length($bugids) < 4000) {
+        print "Set-Cookie: BUGLIST=$bugids ; path=$cookiepath; expires=Sun, 30-Jun-2029 00:00:00 GMT\n";
     }
-    $knum++;
-    print "
-<INPUT TYPE=radio NAME=knob VALUE=accept>
-        Accept bugs (change status to <b>ASSIGNED</b>)<br>";
-    $knum++;
-    if (!defined $statushash{'CLOSED'} &&
-        !defined $statushash{'VERIFIED'} &&
-        !defined $statushash{'RESOLVED'}) {
-        print "
-<INPUT TYPE=radio NAME=knob VALUE=clearresolution>
-        Clear the resolution<br>";
-        $knum++;
-        print "
-<INPUT TYPE=radio NAME=knob VALUE=resolve>
-        Resolve bugs, changing <A HREF=\"bug_status.html\">resolution</A> to
-        <SELECT NAME=resolution
-          ONCHANGE=\"document.changeform.knob\[$knum\].checked=true\">
-          $resolution_popup</SELECT><br>";
-        $knum++;
+    else {
+        print "Set-Cookie: BUGLIST= ; path=$cookiepath; expires=Sun, 30-Jun-2029 00:00:00 GMT\n";
+        $vars->{'toolong'} = 1;
     }
-    if (!defined $statushash{'NEW'} &&
-        !defined $statushash{'ASSIGNED'} &&
-        !defined $statushash{'REOPENED'}) {
-        print "
-<INPUT TYPE=radio NAME=knob VALUE=reopen> Reopen bugs<br>";
-        $knum++;
-    }
-    my @statuskeys = keys %statushash;
-    if (1 == @statuskeys) {
-        if (defined $statushash{'RESOLVED'}) {
-            print "
-<INPUT TYPE=radio NAME=knob VALUE=verify>
-        Mark bugs as <b>VERIFIED</b><br>";
-            $knum++;
-        }
-        if (defined $statushash{'VERIFIED'}) {
-            print "
-<INPUT TYPE=radio NAME=knob VALUE=close>
-        Mark bugs as <b>CLOSED</b><br>";
-            $knum++;
-        }
-    }
-    print "
-<INPUT TYPE=radio NAME=knob VALUE=reassign>
-        <A HREF=\"bug_status.html#assigned_to\">Reassign</A> bugs to
-        <INPUT NAME=assigned_to SIZE=32
-          ONCHANGE=\"document.changeform.knob\[$knum\].checked=true\"
-          VALUE=\"$::COOKIE{'Bugzilla_login'}\"><br>";
-    $knum++;
-    print "<INPUT TYPE=radio NAME=knob VALUE=reassignbycomponent>
-          Reassign bugs to owner of selected component<br>";
-    $knum++;
-
-    print "
-<p>
-<font size=-1>
-To make changes to a bunch of bugs at once:
-<ol>
-<li> Put check boxes next to the bugs you want to change.
-<li> Adjust above form elements.  (If the change you are making requires
-       an explanation, include it in the comments box).
-<li> Click the below \"Commit\" button.
-</ol></font>
-<INPUT TYPE=SUBMIT VALUE=Commit>";
-
-    my $movers = Param("movers");
-    $movers =~ s/\s?,\s?/|/g;
-    $movers =~ s/@/\@/g;
-
-    if ( Param("move-enabled")
-         && (defined $::COOKIE{"Bugzilla_login"})
-         && ($::COOKIE{"Bugzilla_login"} =~ /($movers)/) ){
-      print "<P>";
-      print "<INPUT TYPE=\"SUBMIT\" NAME=\"action\" VALUE=\"";
-      print Param("move-button-text") . "\">";
-    }
-
-    print "</FORM><hr>\n";
+}
+else {
+    print "Content-Type: $format->{'contenttype'}\n";
 }
 
+print "\n"; # end HTTP headers
 
-if ($count > 0) {
-    print "<FORM METHOD=POST ACTION=\"long_list.cgi\">
-<INPUT TYPE=HIDDEN NAME=buglist VALUE=$buglist>
-<INPUT TYPE=SUBMIT VALUE=\"Long Format\">
-<NOBR><A HREF=\"query.cgi\">Query Page</A></NOBR>
-&nbsp;&nbsp;
-<NOBR><A HREF=\"enter_bug.cgi\">Enter New Bug</A></NOBR>
-&nbsp;&nbsp;
-<NOBR><A HREF=\"colchange.cgi?$::buffer\">Change columns</A></NOBR>";
-    if (!$dotweak && $count > 1 && UserInGroup("editbugs")) {
-        print "&nbsp;&nbsp;\n";
-        print "<NOBR><A HREF=\"buglist.cgi?$fields$orderpart&tweak=1\">";
-        print "Change several bugs at once</A></NOBR>\n";
-    }
-    my @owners = sort(keys(%ownerhash));
-    if (@owners > 1 && UserInGroup("editbugs")) {
-        my $suffix = Param('emailsuffix');
-        if ($suffix ne "") {
-            map(s/$/$suffix/, @owners);
-        }
-        my $list = join(',', @owners);
-        print qq{&nbsp;&nbsp;\n};
-        print qq{<NOBR><A HREF="mailto:$list">Send mail to bug owners</A></NOBR>\n};
-    }
-    print qq{&nbsp;&nbsp;\n};
-    print qq{<NOBR><A HREF="query.cgi?$::buffer">Edit this query</A></NOBR>\n};
 
-    print "</FORM>\n";
-}
+################################################################################
+# Content Generation
+################################################################################
 
-# 2001-06-20, myk@mozilla.org, bug 47914:
-# Switch back from the shadow database to the regular database 
-# so that PutFooter() can determine the current user even if
-# the "logincookies" table is corrupted in the shadow database.
-SendSQL("USE $::db_name");
+# Generate and return the UI (HTML page) from the appropriate template.
+$template->process("list/$format->{'template'}", $vars)
+  || ThrowTemplateError($template->error());
 
-PutFooter();
 
-if ($serverpush) {
-    print "\n--thisrandomstring--\n";
-}
+################################################################################
+# Script Conclusion
+################################################################################
+
+print "\n--thisrandomstring--\n" if $serverpush;
diff --git a/bugwritinghelp.html b/bugwritinghelp.html
index 11bb7f3f5..46bddcb24 100644
--- a/bugwritinghelp.html
+++ b/bugwritinghelp.html
@@ -1,281 +1,392 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
-<HTML>
-
-<HEAD>
-	<META NAME="GENERATOR" Content="Symantec Visual Page 1.0">
-	<META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=iso-8859-1">
-	<TITLE>Bug Writing Guidelines</TITLE>
-</HEAD>
-
-<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000">
-
-<H1 ALIGN="CENTER">bug writing guidelines</H1>
-<P ALIGN="CENTER"><FONT SIZE="2"><B>(Please send feedback/update requests to </B></FONT><A
-HREF="mailto:eli@prometheus-music.com"><FONT SIZE="2"><B>Eli Goldberg</B></FONT></A><FONT
-SIZE="2"><B>)</B></FONT></P>
-<P><FONT SIZE="4"><B><BR>
-Why You Should Read This</B></FONT>
-
-
-<BLOCKQUOTE>
-	<P>Simply put, the more effectively you report a bug, the more likely an engineer
-	will actually fix it. <BR>
-	<A HREF="http://bugzilla.mozilla.org"><BR>
-	</A>These bug writing guidelines are an attempt at a general tutorial on writing
-	effective bug reports for novice bug writers; not every sentence may precisely apply
-	to your software project.
-
-</BLOCKQUOTE>
-
-<P><FONT SIZE="4"><B><BR>
-How to Write a Useful Bug Report</B></FONT>
-
-
-<BLOCKQUOTE>
-	<P>Useful bug reports are ones that get bugs fixed. A useful bug report normally
-	has two qualities:
-
-	<OL>
-	<LI><B>Reproducible.</B> If an engineer can't see it or conclusively prove that it
-	exists, the engineer will probably stamp it &quot;WORKSFORME&quot; or &quot;INVALID&quot;,
-	and move on to the next bug. Every detail you can provide helps. <BR>
-	<BR>
-	
-	<LI><B>Specific.</B> The quicker the engineer can isolate the issue to a specific
-	problem, the more likely it'll be expediently fixed.<B> </B>(If a programmer or tester
-	has to decypher a bug, they spend more time cursing the submitter than fixing or
-	testing the problem.)
-	</OL>
-
-	<P>Let's say the application you're testing is a web browser. You crash at foo.com,
-	and want to write up a bug report:
-
-	<BLOCKQUOTE>
-		<P><B>BAD:</B> &quot;My browser crashed. I think I was on foo.com. My computer uses
-		Windows. I think that this is a really bad problem and you should fix it now. By
-		the way, your icons really suck. Nobody will use your software if you keep those
-		ugly icons. Oh, and my grandmother's home page doesn't look right, either, it's all
-		messed up. Good luck.&quot;<BR>
-		<BR>
-		<B>GOOD: </B>&quot;I crashed each time when I went to foo.com, using the 10.28.99
-		build on a Win NT 4.0 (Service Pack 5) system. I also rebooted into Linux, and reproduced
-		this problem using the 10.28.99 Linux build.<BR>
-		<BR>
-		It again crashed each time upon drawing the Foo banner at the top of the page. I
-		broke apart the page, and discovered that the following image link will crash the
-		application reproducibly, unless you remove the &quot;border=0&quot; attribute:<BR>
-		<BR>
-		<FONT SIZE="2"><TT>&lt;IMG SRC=&quot;http://foo.com/images/topics/topicfoos.gif&quot;
-		width=34 height=44 border=0 alt=&quot;News&quot;&gt;</TT>&quot;</FONT>
-
-	</BLOCKQUOTE>
-
-</BLOCKQUOTE>
-
-<P><FONT SIZE="4"><B><BR>
-<BR>
-How to Enter your Useful Bug Report into Bugzilla</B>:</FONT>
-
-
-<BLOCKQUOTE>
-	<P>Before you enter your bug, use the Bugzilla Query Page to determine whether the
-	defect you've discovered is a known bug, and has already been reported. (If your
-	bug is the 37th duplicate of a known issue, you're more likely to annoy the engineer.
-	Annoyed engineers fix fewer bugs.)<BR>
-	<BR>
-	Next, be sure that you've reproduced your bug using a recent build. (Engineers tend
-	to be most interested in problems afflicting the code base that they're actively
-	working on, rather than those in a code base that's hundreds of bug fixes obsolete.)<BR>
-	<BR>
-	If you've discovered a new bug using a current build, report it in Bugzilla:
-
-</BLOCKQUOTE>
-
-
-<OL>
-	<OL>
-		<LI>From your Bugzilla main page, choose &quot;Enter a new bug&quot;.
-		<LI>Select the product that you've found a bug in.
-		<LI>Enter your E-mail address, Password, and press the &quot;Login&quot; button.
-		(If you don't yet have a password, leave the password text box empty, and press the
-		&quot;E-mail me a password&quot; button instead. You'll receive an E-mail message
-		with your password shortly.)
-	</OL>
-	<P>Now, fill out the form. Here's what it all means:
-</OL>
-
-
-
-<BLOCKQUOTE>
-	<P><B>Where did you find the bug?</B>
-
-	<BLOCKQUOTE>
-		<P><B>Product: In which product did you find the bug?</B><BR>
-		You just filled this out on the last page.</P>
-		<P><B>Version: In which product version did you find the bug?</B><BR>
-		If applicable.</P>
-		<P><B>Component: In which component does the bug exist?</B><BR>
-		Bugzilla requires that you select a component to enter a bug. (If they all look meaningless,
-		click on the Component link, which links to descriptions of each component, to help
-		you make the best choice.)</P>
-		<P><B>Platform:&#160;On which hardware platform did you find this bug?</B><FONT SIZE="2"><B>
-		</B>(e.g. Macintosh, SGI, Sun, PC.) </FONT><BR>
-		If you know the bug happens on all hardware platforms, choose 'All'. Otherwise, select
-		the platform that you found the bug on, or &quot;Other&quot; if your platform isn't
-		listed.</P>
-		<P><B>OS: On which Operating System (OS) did you find this bug?</B> <FONT SIZE="2">(e.g.
-		Linux, Windows NT, Mac OS 8.5.)</FONT><BR>
-		If you know the bug happens on all OSs, choose 'All'. Otherwise, select the OS that
-		you found the bug on, or &quot;Other&quot; if your OS isn't listed.</P>
-
-	</BLOCKQUOTE>
-	<P><B><BR>
-	How important is the bug?</B>
-
-	<BLOCKQUOTE>
-		<P><B>Severity: How damaging is the bug?</B><BR>
-		This item defaults to 'normal'. (To determine the most appropriate severity for a
-		particular bug, click on the Severity link for a full explanation of each choice,
-		from Critical to Enhancement.)
-
-	</BLOCKQUOTE>
-	<P><B><BR>
-	Who will be following up on the bug?</B>
-
-	<BLOCKQUOTE>
-		<P><B>Assigned To: Which engineer should be responsible for fixing this bug?</B><BR>
-		Bugzilla will automatically assign the bug to a default engineer upon submitting
-		a bug report; the text box exists to allow you to manually assign it to a different
-		engineer. (To see the list of default engineers for each component, click on the
-		Component link.)</P>
-		<P><B>Cc: Who else should receive e-mail updates on changes to this bug? </B><BR>
-		List the full e-mail addresses of other individuals who should receive an e-mail
-		update upon every change to the bug report. You can enter as many e-mail addresses
-		as you'd like; e-mail addresses must be separated by commas, with no spaces between
-		the addresses.
-
-	</BLOCKQUOTE>
-	<P><B><BR>
-	What else can you tell the engineer about the bug?</B></P>
-
-	<BLOCKQUOTE>
-		<P><B>URL: On what URL did you discover this bug?</B><BR>
-		If you encountered the bug on a particular URL, please provide it (or, them) here.
-		If you've isolated the bug to a specific HTML snippet, please also provide a URL
-		for that, too.</P>
-
-		<P><B>Summary:</B> <B>How would you describe the bug, in approximately 60 or fewer
-		characters?</B><BR>
-		A good summary should <U>quickly and uniquely identify a bug report</U>. Otherwise,
-		developers cannot meaningfully query by bug summary, and will often fail to pay attention
-		to your bug report when reviewing a 10 page bug list.<BR>
-		<BR>
-		A summary of &quot;PCMCIA install fails on Tosh Tecra 780DVD w/ 3c589C&quot; is a
-		useful title. &quot;Software fails&quot; or &quot;install problem&quot; would be
-		examples of a bad title.</P>
-
-		<P><BR>
-		<B>Description: What else can you tell the engineer about this bug? </B><BR>
-		Please provide as detailed of a problem diagnosis in this field as possible. <BR>
-		<BR>
-		Where applicable, using the following bug report template will help ensure that all
-		relevant information comes through:
-
-		<BLOCKQUOTE>
-			<P><B>Overview Description:</B> More detailed expansion of summary.
-
-			<BLOCKQUOTE>
-				<PRE><FONT SIZE="2">Drag-selecting any page crashes Mac builds in NSGetFactory</FONT></PRE>
-
-			</BLOCKQUOTE>
-			<P><B>Steps to Reproduce: </B>The minimal set of steps necessary to trigger the bug.
-			Include any special setup steps. 
-
-			<BLOCKQUOTE>
-				<PRE><FONT SIZE="2">1) View any web page. (I used the default sample page, 
-   resource:/res/samples/test0.html)
-2) Drag-select the page. (Specifically, while holding down the 
-   mouse button, drag the mouse pointer downwards from any point in 
-   the browser's content region to the bottom of the browser's 
-   content region.)</FONT></PRE>
-
-			</BLOCKQUOTE>
-			<P><B>Actual Results:</B> What the application did after performing the above steps.
-
-			<BLOCKQUOTE>
-				<PRE><FONT SIZE="2">The application crashed. Stack crawl appended below from MacsBug.</FONT></PRE>
-
-			</BLOCKQUOTE>
-			<P><B>Expected Results:</B> What the application should have done, were the bug not
-			present.
-
-			<BLOCKQUOTE>
-				<PRE><FONT SIZE="2">The window should scroll downwards. Scrolled content should 
-be selected. (Or, at least, the application should not crash.)</FONT></PRE>
-
-			</BLOCKQUOTE>
-			<P><B>Build Date &amp; Platform:</B> Date and platform of the build that you first
-			encountered the bug in.
-
-			<BLOCKQUOTE>
-				<PRE><FONT SIZE="2">11/2/99 build on Mac OS (Checked Viewer &amp; Apprunner)</FONT></PRE>
-
-			</BLOCKQUOTE>
-			<P><B>Additional Builds and Platforms:</B> Whether or not the bug takes place on
-			other platforms or browsers.
-
-			<BLOCKQUOTE>
-				<PRE><FONT SIZE="2"> - Occurs On
-        Seamonkey (11/2/99 build on Windows NT 4.0)
-
- - Doesn't Occur On
-        Seamonkey (11/4/99 build on Red Hat Linux; feature not supported)
-        Internet Explorer 5.0 (RTM build on Windows NT 4.0)
-        Netscape Communicator 4.5 (RTM build on Mac OS)</FONT>
-</PRE>
-
-			</BLOCKQUOTE>
-			<P><B>Additional Information:</B> Any other debugging information. For crashing bugs:
-
-			<UL>
-	<LI><B>Win32:</B> if you receive a Dr. Watson error, please note the type of the
-	crash, and the module that the application crashed in. (e.g. access violation in
-	apprunner.exe)
-	<LI><B>Mac OS:</B> if you're running MacsBug, please provide the results of a <B><TT>how</TT></B>
-	and an <B><TT>sc</TT></B>.
-	<LI><B>Unix: </B>please provide a minimized stack trace, which can be generated by
-	typing <B><TT>gdb apprunner core</TT></B> into a shell prompt.
-			</UL>
-
-
-			<BLOCKQUOTE>
-				<P>
-				<PRE><FONT SIZE="2">*** MACSBUG STACK CRAWL OF CRASH (Mac OS)
-
-Calling chain using A6/R1 links
- Back chain  ISA  Caller
- 00000000    PPC  0BA85E74  
- 03AEFD80    PPC  0B742248  
- 03AEFD30    PPC  0B50FDDC  NSGetFactory+027FC
-PowerPC unmapped memory exception at 0B512BD0 NSGetFactory+055F0</FONT></PRE>
-
-			</BLOCKQUOTE>
-
-		</BLOCKQUOTE>
-
-	</BLOCKQUOTE>
-	<P>You're done! <BR>
-	<BR>
-	After double-checking your entries for any possible errors, press the &quot;Commit&quot;
-	button, and your bug report will now be in the Bugzilla database.<BR>
-	<I><BR>
-	<BR>
-	</I><FONT SIZE="2">(Thanks to Claudius Gayle, Peter Mock, Chris Pratt, Tom Schutter,
-	and Chris Yeh for contributing to this document. Constructive </FONT><A HREF="mailto:eli@prometheus-music.com"><FONT
-	SIZE="2">suggestions</FONT></A><FONT SIZE="2"> welcome.)</FONT>
-	</BLOCKQUOTE>
-
-
-</BODY>
-
-</HTML>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Bug Writing Guidelines</title>
+</head>
+<body>
+<center>
+<h1>Bug Writing Guidelines</h1>
+</center>
+
+<h3>Why You Should Read This</h3>
+
+<blockquote>
+<p>Simply put, the more effectively you report a bug, the more
+likely an engineer will actually fix it.</p>
+
+<p>These guidelines are a general
+tutorial to teach novice and intermediate bug reporters how to compose effective bug reports. Not every sentence may precisely apply to
+your software project.</p>
+</blockquote>
+
+<h3>How to Write a Useful Bug Report</h3>
+
+<blockquote>
+<p>Useful bug reports are ones that get bugs fixed. A useful bug
+report normally has two qualities:</p>
+
+<ol>
+<li><b>Reproducible.</b> If an engineer can't see the bug herself to prove that it exists, she'll probably stamp your bug report "WORKSFORME" or "INVALID" and move on to the next bug. Every detail you can provide helps.<br>
+<br>
+</li>
+
+<li><b>Specific.</b> The quicker the engineer can isolate the bug
+to a specific area, the more likely she'll expediently fix it. 
+(If a programmer or tester has to decypher a bug, they may spend
+more time cursing the submitter than solving the problem.)
+<br>
+<br>
+[ <a href="#tips" name="Anchor">Tell Me More</a> ]
+</li>
+</ol>
+
+<p>Let's say the application you're testing is a web browser. You
+crash at foo.com, and want to write up a bug report:</p>
+
+<blockquote>
+<p><b>BAD:</b> "My browser crashed. I think I was on www.foo.com. I play golf with Bill Gates, so you better fix this problem, or I'll report you to him. By the way, your Back icon looks like a squashed rodent. UGGGLY. And my grandmother's home page is all messed up in your browser. Thx 4 UR help."
+</p>
+
+<p>
+ <b>GOOD:</b> "I crashed each time I went to www.foo.com, using
+the 2002-02-25 build on a Windows 2000 system. I also
+rebooted into Linux, and reproduced this problem using the 2002-02-24
+Linux build.
+</p>
+
+<p>
+ It again crashed each time upon drawing the Foo banner at the top
+of the page. I broke apart the page, and discovered that the
+following image link will crash the application reproducibly,
+unless you remove the "border=0" attribute:
+</p>
+
+<p>
+ <tt>&lt;IMG SRC="http://www.foo.com/images/topics/topicfoos.gif"
+width="34" height="44" border="0" alt="News"&gt;</tt>
+</p>
+</blockquote>
+</blockquote>
+
+<h3>How to Enter your Useful Bug Report into Bugzilla:</h3>
+
+<blockquote>
+<p>Before you enter your bug, use Bugzilla's 
+<a href="query.cgi">search page</a> to determine whether the defect you've discovered is a known, already-reported bug. If your bug is the 37th duplicate of a known issue, you're more likely to annoy the engineer. (Annoyed
+engineers fix fewer bugs.)
+</p>
+
+<p>
+Next, be sure to reproduce your bug using a recent
+build. Engineers tend to be most interested in problems affecting
+the code base that they're actively working on. After all, the bug you're reporting
+may already be fixed.
+
+</p>
+
+<p>
+ If you've discovered a new bug using a current build, report it in
+Bugzilla:
+</p>
+
+<ol>
+<li>From your Bugzilla main page, choose 
+"<a href="enter_bug.cgi">Enter a new bug</a>".</li>
+
+<li>Select the product that you've found a bug in.</li>
+
+<li>Enter your e-mail address, password, and press the "Login"
+button. (If you don't yet have a password, leave the password field empty, 
+and press the "E-mail me a password" button instead.
+You'll quickly receive an e-mail message with your password.)</li>
+</ol>
+
+<p>Now, fill out the form. Here's what it all means:</p>
+
+<p><b>Where did you find the bug?</b></p>
+
+<blockquote>
+<p><b>Product: In which product did you find the bug?</b><br>
+ You just specified this on the last page, so you can't edit it here.</p>
+
+<p><b>Version: In which product version did you find the
+bug?</b><br>
+ (If applicable)</p>
+
+<p><b>Component: In which component does the bug exist?</b><br>
+Bugzilla requires that you select a component to enter a bug. (Not sure which to choose? 
+Click on the Component link. You'll see a description of each component, to help you make the best choice.)</p>
+
+<p><b>OS: On which Operating System (OS) did you find this bug?</b>
+(e.g. Linux, Windows 2000, Mac OS 9.)<br>
+ If you know the bug happens on all OSs, choose 'All'. Otherwise,
+select the OS that you found the bug on, or "Other" if your OS
+isn't listed.</p>
+</blockquote>
+
+<p><b>How important is the bug?</b></p>
+
+<blockquote>
+<p><b>Severity: How damaging is the bug?</b><br>
+ This item defaults to 'normal'. If you're not sure what severity your bug deserves, click on the Severity link.
+ You'll see a description of each severity rating. <br>
+</p>
+</blockquote>
+
+<p><b>Who will be following up on the bug?</b></p>
+
+<blockquote>
+<p><b>Assigned To: Which engineer should be responsible for fixing
+this bug?</b><br>
+ Bugzilla will automatically assign the bug to a default engineer
+upon submitting a bug report. If you'd prefer to directly assign the bug to
+someone else, enter their e-mail address into this field. (To see the list of
+default engineers for each component, click on the Component
+link.)</p>
+
+<p><b>Cc: Who else should receive e-mail updates on changes to this
+bug?</b><br>
+ List the full e-mail addresses of other individuals who should
+receive an e-mail update upon every change to the bug report. You
+can enter as many e-mail addresses as you'd like, separated by spaces or commas, as long as those
+people have Bugzilla accounts.</p>
+</blockquote>
+
+<p><b>What else can you tell the engineer about the bug?</b></p>
+
+<blockquote>
+
+<p><b>Summary:</b> <b>How would you describe the bug, in
+approximately 60 or fewer characters?</b><br>
+ A good summary should <b>quickly and uniquely identify a bug
+report</b>. Otherwise, an engineer cannot meaningfully identify
+your bug by its summary, and will often fail to pay attention to
+your bug report when skimming through a 10 page bug list.<br>
+<br>
+ A useful summary might be 
+ "<tt>PCMCIA install fails on Tosh Tecra 780DVD w/ 3c589C</tt>". 
+ "<tt>Software fails</tt>" or "<tt>install problem</tt>" would be
+examples of a bad summary.<br>
+<br>
+ [ <a href="#summary">Tell Me More</a> ]<br>
+<br>
+ <b>Description: </b><br>
+ Please provide a detailed problem report in this field.
+Your bug's recipients will most likely expect the following information:</p>
+
+<blockquote>
+<p><b>Overview Description:</b> More detailed expansion of
+summary.</p>
+
+<blockquote>
+<pre>
+Drag-selecting any page crashes Mac builds in NSGetFactory
+</pre>
+</blockquote>
+
+<p><b>Steps to Reproduce:</b> Minimized, easy-to-follow steps that will
+trigger the bug. Include any special setup steps.</p>
+
+<blockquote>
+<pre>
+1) View any web page. (I used the default sample page,
+resource:/res/samples/test0.html)
+                          
+2) Drag-select the page. (Specifically, while holding down 
+the mouse button, drag the mouse pointer downwards from any 
+point in the browser's content region to the bottom of the 
+browser's content region.)                   
+</pre>
+</blockquote>
+
+<p>
+ <b>Actual Results:</b> What the application did after performing
+the above steps. 
+</p>
+
+<blockquote>
+<pre>
+The application crashed. Stack crawl appended below from MacsBug.
+</pre>
+</blockquote>
+
+<p><b>Expected Results:</b> What the application should have done,
+were the bug not present.</p>
+
+<blockquote>
+<pre>
+The window should scroll downwards. Scrolled content should be selected. 
+(Or, at least, the application should not crash.)
+</pre>
+</blockquote>
+
+<p><b>Build Date &amp; Platform:</b> Date and platform of the build
+that you first encountered the bug in.</p>
+
+<blockquote>
+<pre>
+Build 2002-03-15 on Mac OS 9.0
+</pre>
+</blockquote>
+
+<p><b>Additional Builds and Platforms:</b> Whether or not the bug
+takes place on other platforms (or browsers, if applicable).</p>
+
+<blockquote>
+<pre>
+- Also Occurs On        
+    Mozilla (2002-03-15 build on Windows NT 4.0) 
+                                    
+- Doesn't Occur On        
+    Mozilla (2002-03-15 build on Red Hat Linux; feature not supported)        
+    Internet Explorer 5.0 (shipping build on Windows NT 4.0)        
+    Netscape Communicator 4.5 (shipping build on Mac OS 9.0)
+</pre>
+</blockquote>
+
+<p><b>Additional Information:</b> Any other debugging information.
+For crashing bugs:</p>
+
+<ul>
+<li><b>Win32:</b> if you receive a Dr. Watson error, please note
+the type of the crash, and the module that the application crashed
+in. (e.g. access violation in apprunner.exe)</li>
+
+<li><b>Mac OS:</b> if you're running MacsBug, please provide the
+results of a <b>how</b> and an <b>sc</b>:</li>
+</ul>
+
+<blockquote>
+<pre>
+*** MACSBUG STACK CRAWL OF CRASH (Mac OS)
+Calling chain using A6/R1 links 
+    Back chain  ISA  Caller 
+    00000000    PPC  0BA85E74   
+    03AEFD80    PPC  0B742248   
+    03AEFD30    PPC  0B50FDDC  NSGetFactory+027FC
+PowerPC unmapped memory exception at 0B512BD0 NSGetFactory+055F0
+</pre>
+</blockquote>
+</blockquote>
+</blockquote>
+
+<p>You're done!<br>
+<br>
+ After double-checking your entries for any possible errors, press
+the "Commit" button, and your bug report will now be in the
+Bugzilla database.<br>
+</p>
+</blockquote>
+
+<hr>
+<h3>More Information on Writing Good Bugs</h3>
+
+<blockquote>
+<p><b><a name="tips"></a> 1. General Tips for a Useful Bug
+Report</b>
+</p>
+
+<blockquote>
+<p>
+ <b>Use an explicit structure, so your bug reports are easy to
+skim.</b> Bug report users often need immediate access to specific
+sections of your bug. If your Bugzilla installation supports the
+Bugzilla Helper, use it.
+</p>
+
+<p>
+ <b>Avoid cuteness if it costs clarity.</b> Nobody will be laughing
+at your funny bug title at 3:00 AM when they can't remember how to
+find your bug.
+</p>
+
+<p>
+ <b>One bug per report.</b> Completely different people typically
+fix, verify, and prioritize different bugs. If you mix a handful of
+bugs into a single report, the right people probably won't discover
+your bugs in a timely fashion, or at all. Certain bugs are also
+more important than others. It's impossible to prioritize a bug
+report when it contains four different issues, all of differing
+importance.
+</p>
+
+<p>
+ <b>No bug is too trivial to report.</b> Unless you're reading the
+source code, you can't see actual software bugs, like a dangling
+pointer -- you'll see their visible manifestations, such as the
+segfault when the application finally crashes. Severe software
+problems can manifest themselves in superficially trivial ways.
+File them anyway.<br>
+</p>
+</blockquote>
+
+<p><b><a name="summary"></a>2. How and Why to Write Good Bug Summaries</b>
+</p>
+
+<blockquote>
+<p><b>You want to make a good first impression on the bug
+recipient.</b> Just like a New York Times headline guides readers
+towards a relevant article from dozens of choices, will your bug summary
+suggest that your bug report is worth reading from dozens or hundreds of
+choices?
+</p>
+
+<p>
+ Conversely, a vague bug summary like <tt>install problem</tt> forces anyone
+reviewing installation bugs to waste time opening up your bug to
+determine whether it matters.
+</p>
+
+<p>
+ <b>Your bug will often be searched by its summary.</b> Just as
+you'd find web pages with Google by searching by keywords through
+intuition, so will other people locate your bugs. Descriptive bug
+summaries are naturally keyword-rich, and easier to find.
+</p>
+
+<p>
+ For example, you'll find a bug titled "<tt>Dragging icons from List View to
+gnome-terminal doesn't paste path</tt>" if you search on "List",
+"terminal", or "path". Those search keywords wouldn't have found a
+bug titled "<tt>Dragging icons
+doesn't paste</tt>".
+</p>
+
+<p>
+ Ask yourself, "Would someone understand my bug from just this
+summary?" If so, you've written a fine summary.
+</p>
+
+<p><b>Don't write titles like these:</b></p>
+
+<ol>
+ <li>"Can't install" - Why can't you install? What happens when you
+try to install?</li>
+<li>"Severe Performance Problems" - ...and they occur when you do
+what?</li>
+<li>"back button does not work" - Ever? At all?</li>
+</ol>
+
+<p><b>Good bug titles:</b></p>
+<ol>
+<li>"1.0 upgrade installation fails if Mozilla M18 package present"
+- Explains problem and the context.</li>
+<li>"RPM 4 installer crashes if launched on Red Hat 6.2 (RPM 3)
+system" - Explains what happens, and the context.</li>
+</ol>
+
+
+
+</blockquote>
+</blockquote>
+
+<p>(Written and maintained by 
+<a href="http://www.prometheus-music.com/eli">Eli Goldberg</a>. Claudius
+Gayle, Gervase Markham, Peter Mock, Chris Pratt, Tom Schutter and Chris Yeh also
+contributed significant changes. Constructive 
+<a href="mailto:eli@prometheus-music.com">suggestions</a> welcome.)</p>
+
+</body>
+</html>
+
diff --git a/bugzilla.dtd b/bugzilla.dtd
index a443a953a..459755ccd 100644
--- a/bugzilla.dtd
+++ b/bugzilla.dtd
@@ -1,23 +1,21 @@
 <!ELEMENT bugzilla (bug+)>
-<!ATTLIST bugzilla version CDATA #REQUIRED>
-<!ATTLIST bugzilla urlbase CDATA #REQUIRED>
-<!ATTLIST bugzilla maintainer CDATA #REQUIRED>
-<!ATTLIST bugzilla exporter CDATA #IMPLIED>
-<!ELEMENT bug (bug_id, exporter, urlbase, bug_status, resolution?, product, 
-priority, version, rep_platform, assigned_to, delta_ts, component, 
-reporter, target_milestone?, bug_severity, creation_ts, qa_contact?, 
-status_whiteboard?, op_sys, short_desc?, keywords*, dependson*, 
-blocks*, cc*, long_desc?, attachment*)>
-<!ATTLIST bug error (NotFound|NotPermitted) #IMPLIED>
+<!ATTLIST bugzilla
+	version CDATA #REQUIRED
+	urlbase CDATA #REQUIRED
+	maintainer CDATA #REQUIRED
+	exporter CDATA #IMPLIED
+>
+<!ELEMENT bug (bug_id, (bug_status, product, priority, version, rep_platform, assigned_to, delta_ts, component, reporter, target_milestone?, bug_severity, creation_ts, qa_contact?, op_sys, resolution?, bug_file_loc?, short_desc?, keywords*, status_whiteboard?, dependson*, blocks*, cc*, long_desc*, attachment*)?)>
+<!ATTLIST bug
+	error (NotFound | NotPermitted | InvalidBugId) #IMPLIED
+>
 <!ELEMENT bug_id (#PCDATA)>
-<!ELEMENT short_desc (#PCDATA)>
+<!ELEMENT exporter (#PCDATA)>
+<!ELEMENT urlbase (#PCDATA)>
 <!ELEMENT bug_status (#PCDATA)>
-<!ELEMENT dependson (#PCDATA)>
-<!ELEMENT blocks (#PCDATA)>
 <!ELEMENT product (#PCDATA)>
 <!ELEMENT priority (#PCDATA)>
 <!ELEMENT version (#PCDATA)>
-<!ELEMENT cc (#PCDATA)>
 <!ELEMENT rep_platform (#PCDATA)>
 <!ELEMENT assigned_to (#PCDATA)>
 <!ELEMENT delta_ts (#PCDATA)>
@@ -27,15 +25,21 @@ blocks*, cc*, long_desc?, attachment*)>
 <!ELEMENT bug_severity (#PCDATA)>
 <!ELEMENT creation_ts (#PCDATA)>
 <!ELEMENT qa_contact (#PCDATA)>
+<!ELEMENT status_whiteboard (#PCDATA)>
 <!ELEMENT op_sys (#PCDATA)>
+<!ELEMENT resolution (#PCDATA)>
+<!ELEMENT bug_file_loc (#PCDATA)>
+<!ELEMENT short_desc (#PCDATA)>
 <!ELEMENT keywords (#PCDATA)>
-<!ELEMENT status_whiteboard (#PCDATA)>
+<!ELEMENT dependson (#PCDATA)>
+<!ELEMENT blocks (#PCDATA)>
+<!ELEMENT cc (#PCDATA)>
 <!ELEMENT long_desc (who, bug_when, thetext)>
 <!ELEMENT who (#PCDATA)>
 <!ELEMENT bug_when (#PCDATA)>
 <!ELEMENT thetext (#PCDATA)>
-<!ELEMENT attachment (id, date, attach_desc, type, data)>
-<!ELEMENT id (#PCDATA)>
+<!ELEMENT attachment (attachid, date, desc, type?, data?)>
+<!ELEMENT attachid (#PCDATA)>
 <!ELEMENT date (#PCDATA)>
 <!ELEMENT desc (#PCDATA)>
 <!ELEMENT type (#PCDATA)>
diff --git a/changepassword.cgi b/changepassword.cgi
index 873ababda..dafe5c1ae 100755
--- a/changepassword.cgi
+++ b/changepassword.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -20,6 +20,8 @@
 #
 # Contributor(s): Terry Weissman <terry@mozilla.org>
 
+use strict;
+
 print q{Content-type: text/html
 
 <HTML>
diff --git a/checksetup.pl b/checksetup.pl
index b5b414859..8c5b7ea1f 100755
--- a/checksetup.pl
+++ b/checksetup.pl
@@ -22,6 +22,7 @@
 #                 Terry Weissman <terry@mozilla.org>
 #                 Dan Mosedale <dmose@mozilla.org>
 #                 Dave Miller <justdave@syndicomm.com>
+#                 Zach Lipton  <zach@zachlipton.com>
 #
 #
 # Direct any questions on this source code to
@@ -79,7 +80,7 @@
 #     add more MySQL-related checks                    --MYSQL--
 #     change table definitions                         --TABLE--
 #     add more groups                                  --GROUPS--
-#     create initial administrator account            --ADMIN--
+#     create initial administrator account             --ADMIN--
 #
 # Note: sometimes those special comments occur more then once. For
 # example, --LOCAL-- is at least 3 times in this code!  --TABLE--
@@ -94,25 +95,12 @@
 use diagnostics;
 use strict;
 
-#
-# This are the --LOCAL-- variables defined in 'localconfig'
-# 
 # 12/17/00 justdave@syndicomm.com - removed declarations of the localconfig
 # variables from this location.  We don't want these declared here.  They'll
 # automatically get declared in the process of reading in localconfig, and
 # this way we can look in the symbol table to see if they've been declared
 # yet or not.
 
-# Trim whitespace from front and back.
-
-sub trim {
-    ($_) = (@_);
-    s/^\s+//g;
-    s/\s+$//g;
-    return $_;
-}
-
-
 
 ###########################################################################
 # Check required module
@@ -123,8 +111,8 @@ sub trim {
 #
 
 print "\nChecking perl modules ...\n";
-unless (eval "require 5.004") {
-    die "Sorry, you need at least Perl 5.004\n";
+unless (eval "require 5.005") {
+    die "Sorry, you need at least Perl 5.005\n";
 }
 
 # vers_cmp is adapted from Sort::Versions 1.3 1996/07/11 13:37:00 kjahds,
@@ -170,10 +158,10 @@ sub have_vers {
   $vnum = ${"${pkg}::VERSION"} || ${"${pkg}::Version"} || 0;
   $vnum = -1 if $@;
 
-  if ($vnum < 0) {
+  if ($vnum eq "-1") { # string compare just in case it's non-numeric
     $vstr = "not found";
   }
-  elsif ($vnum > 0) {
+  elsif (vers_cmp($vnum,"0") > -1) {
     $vstr = "found v$vnum";
   }
   else {
@@ -186,19 +174,58 @@ sub have_vers {
 }
 
 # Check versions of dependencies.  0 for version = any version acceptible
+my $modules = [ 
+    { 
+        name => 'AppConfig',  
+        version => '1.52' 
+    }, 
+    { 
+        name => 'CGI::Carp', 
+        version => '0' 
+    }, 
+    {
+        name => 'Data::Dumper', 
+        version => '0' 
+    }, 
+    {        
+        name => 'Date::Parse', 
+        version => '0' 
+    }, 
+    { 
+        name => 'DBI', 
+        version => '1.13' 
+    }, 
+    { 
+        name => 'DBD::mysql', 
+        version => '1.2209' 
+    }, 
+    { 
+        name => 'File::Spec', 
+        version => '0.82' 
+    }, 
+    { 
+        name => 'Template', 
+        version => '2.07' 
+    }, 
+    { 
+        name => 'Text::Wrap', 
+        version => '2001.0131' 
+    } 
+];
 
-my @missing = ();
-unless (have_vers("DBI","1.13"))          { push @missing,"DBI" }
-unless (have_vers("Data::Dumper",0))      { push @missing,"Data::Dumper" }
-unless (have_vers("DBD::mysql","1.2209")) { push @missing,"DBD::mysql" }
-unless (have_vers("Date::Parse",0))       { push @missing,"Date::Parse" }
+my %missing = ();
+foreach my $module (@{$modules}) {
+    unless (have_vers($module->{name}, $module->{version})) { 
+        $missing{$module->{name}} = $module->{version};
+    }
+}
 
 # If CGI::Carp was loaded successfully for version checking, it changes the
 # die and warn handlers, we don't want them changed, so we need to stash the
 # original ones and set them back afterwards -- justdave@syndicomm.com
 my $saved_die_handler = $::SIG{__DIE__};
 my $saved_warn_handler = $::SIG{__WARN__};
-unless (have_vers("CGI::Carp",0))    { push @missing,"CGI::Carp" }
+unless (have_vers("CGI::Carp",0))    { $missing{'CGI::Carp'} = 0 }
 $::SIG{__DIE__} = $saved_die_handler;
 $::SIG{__WARN__} = $saved_warn_handler;
 
@@ -222,12 +249,16 @@ if (!$xmlparser) {
     "running (as root)\n\n",
     "   perl -MCPAN -e'install \"XML::Parser\"'\n\n";
 }
-if (@missing > 0) {
+if (%missing) {
     print "\n\n";
-    print "You are missing some Perl modules which are required by Bugzilla.\n";
-    print "They can be installed by running (as root) the following:\n";
-    foreach my $module (@missing) {
+    print "Bugzilla requires some Perl modules which are either missing from your\n",
+    "system, or the version on your system is too old.\n",
+    "They can be installed by running (as root) the following:\n";
+    foreach my $module (keys %missing) {
         print "   perl -MCPAN -e 'install \"$module\"'\n";
+        if ($missing{$module} > 0) {
+            print "   Minimum version required: $missing{$module}\n";
+        }
     }
     print "\n";
     exit;
@@ -264,7 +295,26 @@ if (@missing > 0) {
 #
 
 print "Checking user setup ...\n";
+$@ = undef;
 do 'localconfig';
+if ($@) { # capture errors in localconfig, bug 97290
+   print STDERR <<EOT;
+An error has occurred while reading your 
+'localconfig' file.  The text of the error message is:
+
+$@
+
+Please fix the error in your 'localconfig' file.  
+Alternately rename your 'localconfig' file, rerun 
+checksetup.pl, and re-enter your answers.
+
+  \$ mv -f localconfig localconfig.old
+  \$ ./checksetup.pl
+
+
+EOT
+    die "Syntax error in localconfig";
+}
 my $newstuff = "";
 sub LocalVar ($$)
 {
@@ -282,6 +332,40 @@ sub LocalVar ($$)
 # Set up the defaults for the --LOCAL-- variables below:
 #
 
+LocalVar('index_html', <<'END');
+#
+# With the introduction of a configurable index page using the
+# template toolkit, Bugzilla's main index page is now index.cgi.
+# Most web servers will allow you to use index.cgi as a directory
+# index and many come preconfigured that way, however if yours
+# doesn't you'll need an index.html file that provides redirection
+# to index.cgi. Setting $index_html to 1 below will allow
+# checksetup.pl to create one for you if it doesn't exist.
+# NOTE: checksetup.pl will not replace an existing file, so if you
+#       wish to have checksetup.pl create one for you, you must
+#       make sure that there isn't already an index.html
+$index_html = 0;
+END
+
+my $mysql_binaries = `which mysql`;
+if ($mysql_binaries =~ /no mysql/) {
+    # If which didn't find it, just provide a reasonable default
+    $mysql_binaries = "/usr/bin";
+} else {
+    $mysql_binaries =~ s:/mysql\n$::;
+}
+
+LocalVar('mysqlpath', <<"END");
+#
+# In order to do certain functions in Bugzilla (such as sync the shadow
+# database), we require the MySQL Binaries (mysql, mysqldump, and mysqladmin).
+# Because it's possible that these files aren't in your path, you can specify
+# their location here.
+# Please specify only the directory name, with no trailing slash.
+\$mysqlpath = "$mysql_binaries";
+END
+
+
 LocalVar('create_htaccess', <<'END');
 #
 # If you are using Apache for your web server, Bugzilla can create .htaccess
@@ -291,6 +375,8 @@ LocalVar('create_htaccess', <<'END');
 # installation is in must be within the jurisdiction of a <Directory> block
 # in the httpd.conf file that has 'AllowOverride Limit' in it.  If it has
 # 'AllowOverride All' or other options with Limit, that's fine.
+# (Older Apache installations may use an access.conf file to store these
+# <Directory> blocks.)
 # If this is set to 1, Bugzilla will create these files if they don't exist.
 # If this is set to 0, Bugzilla will not create these files.
 $create_htaccess = 1;
@@ -301,10 +387,14 @@ LocalVar('webservergroup', '
 #
 # This is the group your web server runs on.
 # If you have a windows box, ignore this setting.
-# If you do not wish for checksetup to adjust the permissions of anything,
-# set this to "".
+# If you do not have access to the group your web server runs under,
+# set this to "". If you do set this to "", then your Bugzilla installation
+# will be _VERY_ insecure, because some files will be world readable/writable,
+# and so anyone who can get local access to your machine can do whatever they
+# want. You should only have this set to "" if this is a testing installation
+# and you cannot set this up any other way. YOU HAVE BEEN WARNED.
 # If you set this to anything besides "", you will need to run checksetup.pl
-# as root.
+# as root, or as a user who is a member of the specified group.
 $webservergroup = "nobody";
 ');
 
@@ -321,9 +411,12 @@ $db_user = "bugs";              # user to attach to the MySQL database
 ');
 LocalVar('db_pass', '
 #
-# Some people actually use passwords with their MySQL database ...
+# Enter your database password here. It\'s normally advisable to specify
+# a password for your bugzilla database user.
+# If you use apostrophe (\') or a backslash (\\) in your password, you\'ll
+# need to escape it by preceding it with a \\ character. (\\\') or (\\\\)
 #
-$db_pass = "";
+$db_pass = \'\';
 ');
 
 
@@ -379,15 +472,17 @@ LocalVar('opsys', '
         "Windows 95",
         "Windows 98",
         "Windows ME",  # Millenium Edition (upgrade of 98)
-	"Windows 2000",
+        "Windows 2000",
         "Windows NT",
+        "Windows XP",
         "Mac System 7",
         "Mac System 7.5",
         "Mac System 7.6.1",
         "Mac System 8.0",
         "Mac System 8.5",
         "Mac System 8.6",
-	"Mac System 9.0",
+        "Mac System 9.x",
+        "MacOS X",
         "Linux",
         "BSDI",
         "FreeBSD",
@@ -428,6 +523,21 @@ LocalVar('platforms', '
 
 
 
+LocalVar('contenttypes', '
+#
+# The types of content that template files can generate, indexed by file extension.
+#
+$contenttypes = {
+  "html" => "text/html" , 
+   "rdf" => "application/xml" , 
+   "xml" => "text/xml" , 
+    "js" => "application/x-javascript" , 
+};
+');
+
+
+
+
 if ($newstuff ne "") {
     print "\nThis version of Bugzilla contains some variables that you may want\n",
           "to change and adapt to your local settings. Please edit the file\n",
@@ -449,6 +559,7 @@ my $my_db_port = ${*{$main::{'db_port'}}{SCALAR}};
 my $my_db_name = ${*{$main::{'db_name'}}{SCALAR}};
 my $my_db_user = ${*{$main::{'db_user'}}{SCALAR}};
 my $my_db_pass = ${*{$main::{'db_pass'}}{SCALAR}};
+my $my_index_html = ${*{$main::{'index_html'}}{SCALAR}};
 my $my_create_htaccess = ${*{$main::{'create_htaccess'}}{SCALAR}};
 my $my_webservergroup = ${*{$main::{'webservergroup'}}{SCALAR}};
 my @my_severities = @{*{$main::{'severities'}}{ARRAY}};
@@ -456,6 +567,66 @@ my @my_priorities = @{*{$main::{'priorities'}}{ARRAY}};
 my @my_platforms = @{*{$main::{'platforms'}}{ARRAY}};
 my @my_opsys = @{*{$main::{'opsys'}}{ARRAY}};
 
+if ($my_webservergroup) {
+    if ($< != 0) { # zach: if not root, yell at them, bug 87398 
+        print <<EOF;
+
+Warning: you have entered a value for the "webservergroup" parameter
+in localconfig, but you are not running this script as root.
+This can cause permissions problems and decreased security.  If you
+experience problems running Bugzilla scripts, log in as root and re-run
+this script, or remove the value of the "webservergroup" parameter.
+Note that any warnings about "uninitialized values" that you may
+see below are caused by this.
+
+EOF
+    }
+} else {
+    # Theres no webservergroup, this is very very very very bad.
+    # However, if we're being run on windows, then this option doesn't
+    # really make sense. Doesn't make it any more secure either, though,
+    # but don't print the message, since they can't do anything about it.
+    if ($^O !~ /MSWin32/i) {
+        print <<EOF;
+
+********************************************************************************
+WARNING! You have not entered a value for the "webservergroup" parameter
+in localconfig. This means that certain files and directories which need
+to be editable by both you and the webserver must be world writable, and
+other files (including the localconfig file which stores your database
+password) must be world readable. This means that _anyone_ who can obtain
+local access to this machine can do whatever they want to your Bugzilla
+installation, and is probably also able to run arbitrary Perl code as the
+user that the webserver runs as.
+
+You really, really, really need to change this setting.
+********************************************************************************
+
+EOF
+    }
+}
+
+###########################################################################
+# Global Utility Library
+###########################################################################
+
+# globals.pl clears the PATH, but File::Find uses Cwd::cwd() instead of
+# Cwd::getcwd(), which we need to do because `pwd` isn't in the path - see
+# http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2001-09/msg00115.html
+# As a workaround, since we only use File::Find in checksetup, which doesn't
+# run in taint mode anyway, preserve the path...
+my $origPath = $::ENV{'PATH'};
+
+# Use the Bugzilla utility library for various functions.  We do this
+# here rather than at the top of the file so globals.pl doesn't define
+# localconfig variables for us before we get a chance to check for
+# their existence and create them if they don't exist.  Also, globals.pl
+# removes $ENV{'path'}, which we need in order to run `which mysql` above.
+require "globals.pl";
+
+# ...and restore it. This doesn't change tainting, so this will still cause
+# errors if this script ever does run with -T.
+$::ENV{'PATH'} = $origPath;
 
 ###########################################################################
 # Check data directory
@@ -465,11 +636,16 @@ my @my_opsys = @{*{$main::{'opsys'}}{ARRAY}};
 # Create initial --DATA-- directory and make the initial empty files there:
 #
 
-unless (-d 'data') {
+# The |require "globals.pl"| above ends up creating a template object with
+# a COMPILE_DIR of 'data'. This means that TT creates the directory for us,
+# so this code wouldn't run if we just checked for the existance of the
+# directory. Instead, check for the existance of 'data/nomail', which is
+# created in this block
+unless (-d 'data' && -e 'data/nomail') {
     print "Creating data directory ...\n";
-	# permissions for non-webservergroup are fixed later on
-    mkdir 'data', 0770; 
-    mkdir 'data/mimedump-tmp', 01777; 
+    # permissions for non-webservergroup are fixed later on
+    mkdir 'data', 0770;
+    mkdir 'data/mimedump-tmp', 01777;
     open FILE, '>>data/comments'; close FILE;
     open FILE, '>>data/nomail'; close FILE;
     open FILE, '>>data/mail'; close FILE;
@@ -481,7 +657,7 @@ unless (-d 'data') {
 # a Bugzilla with the old data format, and so upgrade their data files.
 unless (-d 'graphs') {
     print "Creating graphs directory...\n";
-	# permissions for non-webservergroup are fixed later on
+    # permissions for non-webservergroup are fixed later on
     mkdir 'graphs', 0770; 
     # Upgrade data format
     foreach my $in_file (glob("data/mining/*"))
@@ -554,7 +730,16 @@ unless (-d 'graphs') {
 
         close(IN);
         close(OUT);
-    }    
+    }
+}
+
+unless (-d 'data/mining') {
+    mkdir 'data/mining', 0700;
+}
+
+unless (-d 'data/webdot') {
+    # perms/ownership are fixed up later
+    mkdir 'data/webdot', 0700;
 }
 
 if ($my_create_htaccess) {
@@ -569,35 +754,12 @@ if ($my_create_htaccess) {
     open HTACCESS, ">.htaccess";
     print HTACCESS <<'END';
 # don't allow people to retrieve non-cgi executable files or our private data
-<FilesMatch ^(.*\.pl|.*localconfig.*|processmail|syncshadowdb)$>
+<FilesMatch ^(.*\.pl|localconfig|processmail|syncshadowdb|runtests.sh)$>
   deny from all
 </FilesMatch>
-<FilesMatch ^(localconfig.js|localconfig.rdf)$>
-  allow from all
-</FilesMatch>
 END
     close HTACCESS;
     chmod $fileperm, ".htaccess";
-  } else {
-    # 2002-12-21 Bug 186383
-    open HTACCESS, ".htaccess";
-    my $oldaccess = "";
-    while (<HTACCESS>) {
-      $oldaccess .= $_;
-    }
-    close HTACCESS;
-    if ($oldaccess =~ s/\|localconfig\|/\|.*localconfig.*\|/) {
-      print "Repairing .htaccess...\n";
-      open HTACCESS, ">.htaccess";
-      print HTACCESS $oldaccess;
-      print HTACCESS <<'END';
-<FilesMatch ^(localconfig.js|localconfig.rdf)$>
-  allow from all
-</FilesMatch>
-END
-      close HTACCESS;
-    }
-
   }
   if (!-e "data/.htaccess") {
     print "Creating data/.htaccess...\n";
@@ -610,16 +772,22 @@ END
     close HTACCESS;
     chmod $fileperm, "data/.htaccess";
   }
+  if (!-e "template/.htaccess") {
+    print "Creating template/.htaccess...\n";
+    open HTACCESS, ">template/.htaccess";
+    print HTACCESS <<'END';
+# nothing in this directory is retrievable unless overriden by an .htaccess
+# in a subdirectory
+deny from all
+END
+    close HTACCESS;
+    chmod $fileperm, "template/.htaccess";
+  }
   if (!-e "data/webdot/.htaccess") {
-    if (!-d "data/webdot") {
-      mkdir "data/webdot", $dirperm;
-      chmod $dirperm, "data/webdot"; # the perms on mkdir don't seem to apply for some reason...
-    }
     print "Creating data/webdot/.htaccess...\n";
     open HTACCESS, ">data/webdot/.htaccess";
     print HTACCESS <<'END';
-# Allow access to nothing in this directory except for .dot files
-# and don't allow access to those to anyone except research.att.com
+# Restrict access to .dot files to the public webdot server at research.att.com 
 # if research.att.com ever changed their IP, or if you use a different
 # webdot server, you'll need to edit this
 <FilesMatch ^[0-9]+\.dot$>
@@ -627,6 +795,12 @@ END
   Deny from all
 </FilesMatch>
 
+# Allow access by a local copy of 'dot' to .png, .gif, .jpg, and
+# .map files
+<FilesMatch ^[0-9]+\.(png|gif|jpg|map)$>
+  Allow from all
+</FilesMatch>
+
 # And no directory listings, either.
 Deny from all
 END
@@ -636,12 +810,175 @@ END
 
 }
 
+if ($my_index_html) {
+    if (!-e "index.html") {
+        print "Creating index.html...\n";
+        open HTML, ">index.html";
+        print HTML <<'END';
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<HTML>
+<HEAD>
+<META HTTP-EQUIV="REFRESH" CONTENT="0; URL=index.cgi">
+</HEAD>
+<BODY>
+<H1>I think you are looking for <a href="index.cgi">index.cgi</a></H1>
+</BODY>
+</HTML>
+END
+        close HTML;
+    }
+    else {
+        open HTML, "index.html";
+        if (! grep /index\.cgi/, <HTML>) {
+            print "\n\n";
+            print "*** It appears that you still have an old index.html hanging\n";
+            print "    around.  The contents of this file should be moved into a\n";
+            print "    template and placed in the 'template/en/custom' directory.\n\n";
+        }
+        close HTML;
+    }
+}
 
-# Just to be sure ...
-unlink "data/versioncache";
+{
+    eval("use Date::Parse");
+    # Templates will be recompiled if the source changes, but not if the
+    # settings in globals.pl change, so we need to be able to force a rebuild
+    # if that happens
+
+    # The last time the global template params were changed. Keep in UTC,
+    # YYYY-MM-DD
+    my $lastTemplateParamChange = str2time("2002-04-27", "UTC");
+    if (-e 'data/template') {
+        unless (-d 'data/template' && -e 'data/template/.lastRebuild' &&
+                (stat('data/template/.lastRebuild'))[9] >= $lastTemplateParamChange) {
+            print "Removing existing compiled templates ...\n";
+
+            # If File::Path::rmtree reported errors, then I'd use that
+            use File::Find;
+            sub remove {
+                return if $_ eq ".";
+                if (-d $_) {
+                    rmdir $_ || die "Couldn't rmdir $_: $!\n";
+                } else {
+                    unlink $_ || die "Couldn't unlink $_: $!\n";
+                }
+            }
+            finddepth(\&remove, 'data/template');
+        }
+    }
+
+    # Precompile stuff. This speeds up initial access (so the template isn't
+    # compiled multiple times simulataneously by different servers), and helps
+    # to get the permissions right.
+    eval("use Template");
+    my $redir = ($^O =~ /MSWin32/i) ? "NUL" : "/dev/null";
+    my $template = Template->new(
+      {
+        # Output to /dev/null here
+        OUTPUT => $redir,
+
+        # Colon-separated list of directories containing templates.
+        INCLUDE_PATH => "template/en/custom:template/en/default",
+
+        PRE_CHOMP => 1 ,
+        TRIM => 1 ,
+
+        COMPILE_DIR => 'data/', # becomes data/template/en/{custom,default}
 
+        # These don't actually need to do anything here, just exist
+        FILTERS =>
+        {
+         strike => sub { return $_; } ,
+         js => sub { return $_; },
+         html => sub { return $_; },
+         html_linebreak => sub { return $_; },
+         url_quote => sub { return $_; },
+        },
+      }) || die ("Could not create Template: " . Template->error() . "\n");
+
+    sub compile {
+        # no_chdir doesn't work on perl 5.005
+
+        my $origDir = $File::Find::dir;
+        my $name = $File::Find::name;
+
+        return if (-d $name);
+        return if ($name =~ /\/CVS\//);
+        return if ($name !~ /\.tmpl$/);
+        $name =~ s!template/en/default/!!; # trim the bit we don't pass to TT
+
+        chdir($::baseDir);
+
+        $template->process($name, {})
+          || die "Could not compile $name:" . $template->error() . "\n";
+
+        chdir($origDir);
+    }
+
+    {
+        print "Precompiling templates ...\n";
+
+        use File::Find;
+
+        use Cwd;
 
+        $::baseDir = getcwd();
 
+        # Don't hang on templates which use the CGI library
+        eval("use CGI qw(-no_debug)");
+
+        # Disable warnings which come from running the compiled templates
+        # This way is OK, because they're all runtime warnings.
+        # The reason we get these warnings here is that none of the required
+        # vars will be present.
+        local ($^W) = 0;
+
+        # Traverse the default hierachy. Custom templates will be picked up
+        # via the INCLUDE_PATH, but we know that bugzilla will only be
+        # calling stuff which exists in en/default
+        # FIXME - if we start doing dynamic INCLUDE_PATH we may have to
+        # recurse all of template/, changing the INCLUDE_PATH each time
+
+        find(\&compile, "template/en/default");
+    }
+
+    # update the time on the stamp file
+    open FILE, '>data/template/.lastRebuild'; close FILE;
+    utime $lastTemplateParamChange, $lastTemplateParamChange, ('data/template/.lastRebuild');
+}
+
+# Just to be sure ...
+unlink "data/versioncache";
+
+# Remove parameters from the data/params file that no longer exist in Bugzilla.
+if (-e "data/params") {
+    require "data/params";
+    require "defparams.pl";
+    use vars @::param_list;
+    my @oldparams;
+    
+    open(PARAMFILE, ">>old-params.txt") 
+      || die "$0: Can't open old-params.txt for writing: $!\n";
+      
+    foreach my $item (keys %::param) {
+        if (!grep($_ eq $item, @::param_list) && $item ne "version") {
+            push (@oldparams, $item);
+            print PARAMFILE "\n\n$item:\n$::param{$item}\n";
+                
+            delete $::param{$item};
+        }
+    }
+    
+    if (@oldparams) {
+        print "The following parameters are no longer used in Bugzilla, " .
+              "and so have been\nremoved from your parameters file and " .
+              "appended to old-params.txt:\n";
+        print join(", ", @oldparams) . "\n\n";               
+    }
+    
+    close PARAMFILE;
+    WriteParams();
+}
 
 
 ###########################################################################
@@ -684,7 +1021,7 @@ unlink "data/versioncache";
 
 # These are the files which need to be marked executable
 my @executable_files = ('processmail', 'whineatnews.pl', 'collectstats.pl',
-   'checksetup.pl', 'syncshadowdb', 'importxml.pl');
+   'checksetup.pl', 'syncshadowdb', 'importxml.pl', 'runtests.sh');
 
 # tell me if a file is executable.  All CGI files and those in @executable_files
 # are executable
@@ -705,22 +1042,36 @@ sub isExecutableFile {
 
 # fix file (or files - wildcards ok) permissions 
 sub fixPerms {
-    my $file;
-    my @files = glob($_[0]);
-    my $exeperm = 0777 & ~ $_[1];
-    my $normperm = 0666 & ~ $_[1];
-    foreach $file (@files) {
-      # do not change permissions on directories here
-      if (!(-d $file)) {
-        # check if the file is executable.
-        if (isExecutableFile($file)) {
-	  #printf ("Changing $file to %o",$exeperm);
-          chmod $exeperm, $file;
-        } else {
-	  #print ("Changing $file to %o", $normperm);
-          chmod $normperm, $file;
+    my ($file_pattern, $owner, $group, $umask, $do_dirs) = @_;
+    my @files = glob($file_pattern);
+    my $execperm = 0777 & ~ $umask;
+    my $normperm = 0666 & ~ $umask;
+    foreach my $file (@files) {
+        next if (!-e $file);
+        # do not change permissions on directories here unless $do_dirs is set
+        if (!(-d $file)) {
+            chown $owner, $group, $file;
+            # check if the file is executable.
+            if (isExecutableFile($file)) {
+                #printf ("Changing $file to %o\n", $execperm);
+                chmod $execperm, $file;
+            } else {
+                #printf ("Changing $file to %o\n", $normperm);
+                chmod $normperm, $file;
+            }
+        }
+        elsif ($do_dirs) {
+            chown $owner, $group, $file;
+            if ($file =~ /CVS$/) {
+                chmod 0700, $file;
+            }
+            else {
+                #printf ("Changing $file to %o\n", $execperm);
+                chmod $execperm, $file;
+                fixPerms("$file/.htaccess", $owner, $group, $umask, $do_dirs);
+                fixPerms("$file/*", $owner, $group, $umask, $do_dirs); # do the contents of the directory
+            }
         }
-      }
     }
 }
 
@@ -730,21 +1081,48 @@ if ($my_webservergroup) {
     # chown needs to be called with a valid uid, not 0.  $< returns the
     # caller's uid.  Maybe there should be a $bugzillauid, and call with that
     # userid.
-    chown $<, $webservergid, glob('*');
-    if (-e ".htaccess") { chown $<, $webservergid, ".htaccess" } # glob('*') doesn't catch dotfiles
-    if (-e "data/.htaccess") { chown $<, $webservergid, "data/.htaccess" }
-    if (-e "data/webdot/.htaccess") { chown $<, $webservergid, "data/webdot/.htaccess" }
-    fixPerms('*',027);
+    fixPerms('.htaccess', $<, $webservergid, 027); # glob('*') doesn't catch dotfiles
+    fixPerms('data/.htaccess', $<, $webservergid, 027);
+    fixPerms('data/duplicates', $<, $webservergid, 027, 1);
+    fixPerms('data/mining', $<, $webservergid, 027, 1);
+    fixPerms('data/template', $<, $webservergid, 007, 1); # webserver will write to these
+    fixPerms('data/webdot', $<, $webservergid, 007, 1);
+    fixPerms('data/webdot/.htaccess', $<, $webservergid, 027);
+    fixPerms('data/params', $<, $webservergid, 017);
+    fixPerms('*', $<, $webservergid, 027);
+    fixPerms('template', $<, $webservergid, 027, 1);
+    fixPerms('css', $<, $webservergid, 027, 1);
     chmod 0644, 'globals.pl';
     chmod 0644, 'RelationSet.pm';
+
+    # Don't use fixPerms here, because it won't change perms on the directory
+    # unless its using recursion
+    chown $<, $webservergid, 'data';
     chmod 0771, 'data';
+    chown $<, $webservergid, 'graphs';
     chmod 0770, 'graphs';
 } else {
     # get current gid from $( list
     my $gid = (split " ", $()[0];
-    chown $<, $gid, glob('*');
-    fixPerms('*',022);
-    chmod 01777, 'data', 'graphs';
+    fixPerms('.htaccess', $<, $gid, 022); # glob('*') doesn't catch dotfiles
+    fixPerms('data/.htaccess', $<, $gid, 022);
+    fixPerms('data/duplicates', $<, $gid, 022, 1);
+    fixPerms('data/mining', $<, $gid, 022, 1);
+    fixPerms('data/template', $<, $gid, 000, 1); # webserver will write to these
+    fixPerms('data/webdot', $<, $gid, 000, 1);
+    chmod 01777, 'data/webdot';
+    fixPerms('data/webdot/.htaccess', $<, $gid, 022);
+    fixPerms('data/params', $<, $gid, 011);
+    fixPerms('*', $<, $gid, 022);
+    fixPerms('template', $<, $gid, 022, 1);
+    fixPerms('css', $<, $gid, 022, 1);
+
+    # Don't use fixPerms here, because it won't change perms on the directory
+    # unless its using recursion
+    chown $<, $gid, 'data';
+    chmod 0777, 'data';
+    chown $<, $gid, 'graphs';
+    chmod 01777, 'graphs';
 }
 
 
@@ -794,7 +1172,7 @@ if ($my_db_check) {
     # Check what version of MySQL is installed and let the user know
     # if the version is too old to be used with Bugzilla.
     if ( vers_cmp($sql_vers,$sql_want) > -1 ) {
-        print "ok: found v$sql_vers\n\n";
+        print "ok: found v$sql_vers\n";
     } else {
         die "Your MySQL server v$sql_vers is too old./n" . 
             "   Bugzilla requires version $sql_want or later of MySQL.\n" . 
@@ -830,7 +1208,38 @@ my $dbh = DBI->connect($connectstring, $my_db_user, $my_db_pass)
 END { $dbh->disconnect if $dbh }
 
 
+###########################################################################
+# Check GraphViz setup
+###########################################################################
+
+#
+# If we are using a local 'dot' binary, verify the specified binary exists
+# and that the generated images are accessible.
+#
+
+if(-e "data/params") {
+  require "data/params";
+  if( $::param{'webdotbase'} && $::param{'webdotbase'} !~ /^https?:/ ) {
+    printf("Checking for %15s %-9s ", "GraphViz", "(any)");
+    if(-x $::param{'webdotbase'}) {
+      print "ok: found\n";
+    } else {
+      print "not a valid executable: $::param{'webdotbase'}\n";
+    }
+
+    # Check .htaccess allows access to generated images
+    if(-e "data/webdot/.htaccess") {
+      open HTACCESS, "data/webdot/.htaccess";
+      if(! grep(/png/,<HTACCESS>)) {
+        print "Dependency graph images are not accessible.\n";
+        print "Delete data/webdot/.htaccess and re-run checksetup.pl to rectify.\n";
+      }
+      close HTACCESS;
+    }
+  }
+}
 
+print "\n";
 
 
 ###########################################################################
@@ -861,6 +1270,7 @@ my %table;
 
 $table{bugs_activity} = 
    'bug_id mediumint not null,
+    attach_id mediumint null,
     who mediumint not null,
     bug_when datetime not null,
     fieldid mediumint not null,
@@ -882,10 +1292,31 @@ $table{attachments} =
     filename mediumtext not null,
     thedata longblob not null,
     submitter_id mediumint not null,
+    isobsolete tinyint not null default 0, 
 
     index(bug_id),
     index(creation_ts)';
 
+# 2001-05-05 myk@mozilla.org: Tables to support attachment statuses.
+# "attachstatuses" stores one record for each status on each attachment.
+# "attachstatusdefs" defines the statuses that can be set on attachments.
+
+$table{attachstatuses} =
+   '
+     attach_id    MEDIUMINT    NOT NULL , 
+     statusid     SMALLINT     NOT NULL , 
+     PRIMARY KEY(attach_id, statusid) 
+   ';
+
+$table{attachstatusdefs} =
+   '
+     id           SMALLINT     NOT NULL  PRIMARY KEY , 
+     name         VARCHAR(50)  NOT NULL , 
+     description  MEDIUMTEXT   NULL , 
+     sortkey      SMALLINT     NOT NULL  DEFAULT 0 , 
+     product      VARCHAR(64)  NOT NULL 
+   ';
+
 #
 # Apostrophe's are not supportied in the enum types.
 # See http://bugzilla.mozilla.org/show_bug.cgi?id=27309
@@ -918,8 +1349,6 @@ $table{bugs} =
     lastdiffed datetime not null,
     everconfirmed tinyint not null,
     reporter_accessible tinyint not null default 1,
-    assignee_accessible tinyint not null default 1,
-    qacontact_accessible tinyint not null default 1,
     cclist_accessible tinyint not null default 1,
 
     index (assigned_to),
@@ -1010,11 +1439,9 @@ $table{groups} =
     unique(bit),
     unique(name)';
 
-
 $table{logincookies} =
    'cookie mediumint not null auto_increment primary key,
     userid mediumint not null,
-    cryptpassword varchar(34),
     ipaddr varchar(40) NOT NULL,
     lastused timestamp,
 
@@ -1191,7 +1618,7 @@ while (my ($tabname, $fielddef) = each %table) {
 # Populate groups table
 ###########################################################################
 
-sub GroupExists ($)
+sub GroupDoesExist ($)
 {
     my ($name) = @_;
     my $sth = $dbh->prepare("SELECT name FROM groups WHERE name='$name'");
@@ -1212,7 +1639,7 @@ sub AddGroup {
     my ($name, $desc, $userregexp) = @_;
     $userregexp ||= "";
 
-    return if GroupExists($name);
+    return if GroupDoesExist($name);
     
     # get highest bit number
     my $sth = $dbh->prepare("SELECT bit FROM groups ORDER BY bit DESC");
@@ -1251,12 +1678,12 @@ AddGroup 'editkeywords',   'Can create, destroy, and edit keywords.';
 # code that updates the database structure.
 &AddField('profiles', 'groupset', 'bigint not null');
 
-if (!GroupExists("editbugs")) {
+if (!GroupDoesExist("editbugs")) {
     my $id = AddGroup('editbugs',  'Can edit all aspects of any bug.', ".*");
     $dbh->do("UPDATE profiles SET groupset = groupset | $id");
 }
 
-if (!GroupExists("canconfirm")) {
+if (!GroupDoesExist("canconfirm")) {
     my $id = AddGroup('canconfirm',  'Can confirm a bug.', ".*");
     $dbh->do("UPDATE profiles SET groupset = groupset | $id");
 }
@@ -1317,6 +1744,8 @@ AddFDef("attachments.description", "Attachment description", 0);
 AddFDef("attachments.thedata", "Attachment data", 0);
 AddFDef("attachments.mimetype", "Attachment mime type", 0);
 AddFDef("attachments.ispatch", "Attachment is patch", 0);
+AddFDef("attachments.isobsolete", "Attachment is obsolete", 0);
+AddFDef("attachstatusdefs.name", "Attachment Status", 0);
 AddFDef("target_milestone", "Target Milestone", 0);
 AddFDef("delta_ts", "Last changed date", 0);
 AddFDef("(to_days(now()) - to_days(bugs.delta_ts))", "Days since bug changed",
@@ -1464,6 +1893,23 @@ if ($sth->rows == 0) {
   my $pass2 = "*";
   my $admin_ok = 0;
   my $admin_create = 1;
+  my $mailcheckexp = "";
+  my $mailcheck    = ""; 
+
+  # Here we look to see what the emailregexp is set to so we can 
+  # check the email addy they enter. Bug 96675. If they have no 
+  # params (likely but not always the case), we use the default.
+  if (-e "data/params") { 
+    require "data/params"; # if they have a params file, use that
+  }
+  if ($::param{emailregexp}) {
+    $mailcheckexp = $::param{emailregexp};
+    $mailcheck    = $::param{emailregexpdesc};
+  } else {
+    $mailcheckexp = '^[^@]+@[^@]+\\.[^@]+$';
+    $mailcheck    = 'A legal address must contain exactly one \'@\', 
+      and at least one \'.\' after the @.';
+  }
 
   print "\nLooks like we don't have an administrator set up yet.  Either this is your\n";
   print "first time using Bugzilla, or your administrator's privs might have accidently\n";
@@ -1476,6 +1922,14 @@ if ($sth->rows == 0) {
       if(! $login ) {
         print "\nYou DO want an administrator, don't you?\n";
       }
+      unless ($login =~ /$mailcheckexp/) {
+        print "\nThe login address is invalid:\n";
+        print "$mailcheck\n";
+        print "You can change this test on the params page once checksetup has successfully\n";
+        print "completed.\n\n";
+        # Go round, and ask them again
+        $login = "";
+      }
     }
     $login = $dbh->quote($login);
     $sth = $dbh->prepare(<<_End_Of_SQL_);
@@ -1577,39 +2031,6 @@ _End_Of_SQL_
 }
 
 
-sub Crypt {
-    # Crypts a password, generating a random salt to do it.
-    # Random salts are generated because the alternative is usually
-    # to use the first two characters of the password itself, and since
-    # the salt appears in plaintext at the beginning of the crypted
-    # password string this has the effect of revealing the first two
-    # characters of the password to anyone who views the crypted version.
-
-    my ($password) = @_;
-
-    # The list of characters that can appear in a salt.  Salts and hashes
-    # are both encoded as a sequence of characters from a set containing
-    # 64 characters, each one of which represents 6 bits of the salt/hash.
-    # The encoding is similar to BASE64, the difference being that the
-    # BASE64 plus sign (+) is replaced with a forward slash (/).
-    my @saltchars = (0..9, 'A'..'Z', 'a'..'z', '.', '/');
-
-    # Generate the salt.  We use an 8 character (48 bit) salt for maximum
-    # security on systems whose crypt uses MD5.  Systems with older
-    # versions of crypt will just use the first two characters of the salt.
-    my $salt = '';
-    for ( my $i=0 ; $i < 8 ; ++$i ) {
-        $salt .= $saltchars[rand(64)];
-    }
-
-    # Crypt the password.
-    my $cryptedpassword = crypt($password, $salt);
-
-    # Return the crypted password.
-    return $cryptedpassword;
-}
-
-
 
 
 ###########################################################################
@@ -2282,29 +2703,29 @@ if ( CountIndexes('keywords') != 3 ) {
 $sth = $dbh->prepare("SELECT count(*) from duplicates");
 $sth->execute();
 if (!($sth->fetchrow_arrayref()->[0])) {
-	# populate table
-	print("Populating duplicates table...\n");
-	
-	$sth = $dbh->prepare("SELECT longdescs.bug_id, thetext FROM longdescs left JOIN bugs using(bug_id) WHERE (thetext " . 
-	        "regexp '[.*.]{3,3} This bug has been marked as a duplicate of [[:digit:]]{1,5} [.*.]{3,3}') AND (resolution = 'DUPLICATE') ORDER" .
-			" BY longdescs.bug_when");
-	$sth->execute();
-
-	my %dupes;
-	my $key;
-	
-	# Because of the way hashes work, this loop removes all but the last dupe
-	# resolution found for a given bug.
-	while (my ($dupe, $dupe_of) = $sth->fetchrow_array()) {
-		$dupes{$dupe} = $dupe_of;
-	}
-
-	foreach $key (keys(%dupes))
-	{
-		$dupes{$key} =~ s/.*\*\*\* This bug has been marked as a duplicate of (\d{1,5}) \*\*\*.*?/$1/sm;
-		$dbh->do("INSERT INTO duplicates VALUES('$dupes{$key}', '$key')");
-		#					 BugItsADupeOf   Dupe
-	}
+        # populate table
+        print("Populating duplicates table...\n");
+
+        $sth = $dbh->prepare("SELECT longdescs.bug_id, thetext FROM longdescs left JOIN bugs using(bug_id) WHERE (thetext " . 
+                "regexp '[.*.]{3,3} This bug has been marked as a duplicate of [[:digit:]]{1,5} [.*.]{3,3}') AND (resolution = 'DUPLICATE') ORDER" .
+                        " BY longdescs.bug_when");
+        $sth->execute();
+
+        my %dupes;
+        my $key;
+
+        # Because of the way hashes work, this loop removes all but the last dupe
+        # resolution found for a given bug.
+        while (my ($dupe, $dupe_of) = $sth->fetchrow_array()) {
+                $dupes{$dupe} = $dupe_of;
+        }
+
+        foreach $key (keys(%dupes))
+        {
+                $dupes{$key} =~ s/.*\*\*\* This bug has been marked as a duplicate of (\d{1,5}) \*\*\*.*?/$1/sm;
+                $dbh->do("INSERT INTO duplicates VALUES('$dupes{$key}', '$key')");
+                #                                        BugItsADupeOf   Dupe
+        }
 }
 
 # 2000-12-18.  Added an 'emailflags' field for storing preferences about
@@ -2345,6 +2766,12 @@ unless (-d 'data/duplicates') {
 #
 AddField('groups', 'isactive', 'tinyint not null default 1');
 
+#
+# 2001-06-15 myk@mozilla.org:
+# isobsolete determines whether or not an attachment is pertinent/relevant/valid.
+#
+AddField('attachments', 'isobsolete', 'tinyint not null default 0');
+
 # 2001-04-29 jake@acutex.net - Remove oldemailtech
 #   http://bugzilla.mozilla.org/show_bugs.cgi?id=71552
 if (-d 'shadow') {
@@ -2371,19 +2798,19 @@ installation has many users.
 ENDTEXT
 
     # Re-crypt everyone's password.
-	  my $sth = $dbh->prepare("SELECT userid, password FROM profiles");
-	  $sth->execute();
+    my $sth = $dbh->prepare("SELECT userid, password FROM profiles");
+    $sth->execute();
 
     my $i = 1;
 
     print "Fixing password #1... ";
-	  while (my ($userid, $password) = $sth->fetchrow_array()) {
+    while (my ($userid, $password) = $sth->fetchrow_array()) {
         my $cryptpassword = $dbh->quote(Crypt($password));
         $dbh->do("UPDATE profiles SET cryptpassword = $cryptpassword WHERE userid = $userid");
         ++$i;
         # Let the user know where we are at every 500 records.
         print "$i... " if !($i%500);
-	  }
+    }
     print "$i... Done.\n";
 
     # Drop the plaintext password field and resize the cryptpassword field.
@@ -2488,13 +2915,53 @@ ChangeFieldType("profiles", "disabledtext", "mediumtext not null");
 # Add fields to the bugs table that record whether or not the reporter,
 # assignee, QA contact, and users on the cc: list can see bugs even when
 # they are not members of groups to which the bugs are restricted.
+# 2002-02-06 bbaetz@student.usyd.edu.au - assignee/qa can always see the bug
 AddField("bugs", "reporter_accessible", "tinyint not null default 1");
-AddField("bugs", "assignee_accessible", "tinyint not null default 1");
-AddField("bugs", "qacontact_accessible", "tinyint not null default 1");
+#AddField("bugs", "assignee_accessible", "tinyint not null default 1");
+#AddField("bugs", "qacontact_accessible", "tinyint not null default 1");
 AddField("bugs", "cclist_accessible", "tinyint not null default 1");
 
-# 2002-03-15 bbaetz@student.usyd.edu.au - bug 129466; 
-# 2002-05-13 2_14_1-BRANCH backport - preed@sigkill.com
+# 2001-08-21 myk@mozilla.org bug84338:
+# Add a field for the attachment ID to the bugs_activity table, so installations
+# using the attachment manager can record changes to attachments.
+AddField("bugs_activity", "attach_id", "mediumint null");
+
+# 2002-02-04 bbaetz@student.usyd.edu.au bug 95732
+# Remove logincookies.cryptpassword, and delete entries which become
+# invalid
+if (GetFieldDef("logincookies", "cryptpassword")) {
+    # We need to delete any cookies which are invalid, before dropping the
+    # column
+
+    print "Removing invalid login cookies...\n";
+
+    # mysql doesn't support DELETE with multi-table queries, so we have
+    # to iterate
+    my $sth = $dbh->prepare("SELECT cookie FROM logincookies, profiles " .
+                            "WHERE logincookies.cryptpassword != " .
+                            "profiles.cryptpassword AND " .
+                            "logincookies.userid = profiles.userid");
+    $sth->execute();
+    while (my ($cookie) = $sth->fetchrow_array()) {
+        $dbh->do("DELETE FROM logincookies WHERE cookie = $cookie");
+    }
+
+    DropField("logincookies", "cryptpassword");
+}
+
+# 2002-02-13 bbaetz@student.usyd.edu.au - bug 97471
+# qacontact/assignee should always be able to see bugs,
+# so remove their restriction column
+if (GetFieldDef("bugs","qacontact_accessible")) {
+    print "Removing restrictions on bugs for assignee and qacontact...\n";
+
+    DropField("bugs", "qacontact_accessible");
+    DropField("bugs", "assignee_accessible");
+}
+
+# 2002-03-15 bbaetz@student.usyd.edu.au - bug 129466
+# 2002-05-13 preed@sigkill.com - bug 129446 patch backported to the
+#  BUGZILLA-2_14_1-BRANCH as a security blocker for the 2.14.2 release
 # Use the ip, not the hostname, in the logincookies table
 if (GetFieldDef("logincookies", "hostname")) {
     # We've changed what we match against, so all entries are now invalid
@@ -2518,4 +2985,5 @@ if (GetFieldDef("logincookies", "hostname")) {
 # Final checks...
 
 unlink "data/versioncache";
+
 print "Reminder: Bugzilla now requires version 8.7 or later of sendmail.\n";
diff --git a/colchange.cgi b/colchange.cgi
index f3521b7ad..64dd9c4a5 100755
--- a/colchange.cgi
+++ b/colchange.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -23,23 +23,30 @@
 use diagnostics;
 use strict;
 
-sub sillyness { # shut up "used only once" warnings
-  my $zz = @::legal_keywords;
-}
+use lib qw(.);
+
+use vars qw(
+  @legal_keywords
+  $buffer
+  $template
+  $vars
+);
 
 require "CGI.pl";
 
+ConnectToDatabase();
+quietly_check_login();
+
 print "Content-type: text/html\n";
 
 # The master list not only says what fields are possible, but what order
 # they get displayed in.
 
-ConnectToDatabase();
 GetVersionTable();
 
 my @masterlist = ("opendate", "changeddate", "severity", "priority",
                   "platform", "owner", "reporter", "status", "resolution",
-                  "component", "product", "version", "os", "votes");
+                  "product", "component", "version", "os", "votes");
 
 if (Param("usetargetmilestone")) {
     push(@masterlist, "target_milestone");
@@ -57,6 +64,7 @@ if (@::legal_keywords) {
 
 push(@masterlist, ("summary", "summaryfull"));
 
+$vars->{masterlist} = \@masterlist;
 
 my @collist;
 if (defined $::FORM{'rememberedquery'}) {
@@ -75,8 +83,9 @@ if (defined $::FORM{'rememberedquery'}) {
     }
     my $list = join(" ", @collist);
     my $urlbase = Param("urlbase");
-    print "Set-Cookie: COLUMNLIST=$list ; path=/ ; expires=Sun, 30-Jun-2029 00:00:00 GMT\n";
-    print "Set-Cookie: SPLITHEADER=$::FORM{'splitheader'} ; path=/ ; expires=Sun, 30-Jun-2029 00:00:00 GMT\n";
+    my $cookiepath = Param("cookiepath");
+    print "Set-Cookie: COLUMNLIST=$list ; path=$cookiepath ; expires=Sun, 30-Jun-2029 00:00:00 GMT\n";
+    print "Set-Cookie: SPLITHEADER=$::FORM{'splitheader'} ; path=$cookiepath ; expires=Sun, 30-Jun-2029 00:00:00 GMT\n";
     print "Refresh: 0; URL=buglist.cgi?$::FORM{'rememberedquery'}\n";
     print "\n";
     print "<META HTTP-EQUIV=Refresh CONTENT=\"1; URL=$urlbase"."buglist.cgi?$::FORM{'rememberedquery'}\">\n";
@@ -92,13 +101,14 @@ if (defined $::COOKIE{'COLUMNLIST'}) {
     @collist = @::default_column_list;
 }
 
-my $splitheader = 0;
+$vars->{collist} = \@collist;
+
+$vars->{splitheader} = 0;
 if ($::COOKIE{'SPLITHEADER'}) {
-    $splitheader = 1;
+    $vars->{splitheader} = 1;
 }
 
-
-my %desc;
+my %desc = ();
 foreach my $i (@masterlist) {
     $desc{$i} = $i;
 }
@@ -106,36 +116,11 @@ foreach my $i (@masterlist) {
 $desc{'summary'} = "Summary (first 60 characters)";
 $desc{'summaryfull'} = "Full Summary";
 
+$vars->{desc} = \%desc;
+$vars->{buffer} = $::buffer;
 
-print "\n";
-PutHeader ("Change columns");
-print "Check which columns you wish to appear on the list, and then click\n";
-print "on submit.  (Cookies are required.)\n";
-print "<p>\n";
-print "<FORM ACTION=colchange.cgi>\n";
-print "<INPUT TYPE=HIDDEN NAME=rememberedquery VALUE=$::buffer>\n";
+# Generate and return the UI (HTML page) from the appropriate template.
+print "Content-type: text/html\n\n";
+$template->process("list/change-columns.html.tmpl", $vars)
+  || ThrowTemplateError($template->error());
 
-foreach my $i (@masterlist) {
-    my $c;
-    if (lsearch(\@collist, $i) >= 0) {
-        $c = 'CHECKED';
-    } else {
-        $c = '';
-    }
-    print "<INPUT TYPE=checkbox NAME=column_$i $c>$desc{$i}<br>\n";
-}
-print "<P>\n";
-print BuildPulldown("splitheader",
-                    [["0", "Normal headers (prettier)"],
-                     ["1", "Stagger headers (often makes list more compact)"]],
-                    $splitheader);
-print "<P>\n";
-
-print "<INPUT TYPE=\"submit\" VALUE=\"Submit\">\n";
-print "</FORM>\n";
-print "<FORM ACTION=colchange.cgi>\n";
-print "<INPUT TYPE=HIDDEN NAME=rememberedquery VALUE=$::buffer>\n";
-print "<INPUT TYPE=HIDDEN NAME=resetit VALUE=1>\n";
-print "<INPUT TYPE=\"submit\" VALUE=\"Reset to Bugzilla default\">\n";
-print "</FORM>\n";
-PutFooter();
diff --git a/collectstats.pl b/collectstats.pl
index 2a29bb9f5..4e69ab9b5 100755
--- a/collectstats.pl
+++ b/collectstats.pl
@@ -57,7 +57,7 @@ foreach (@myproducts) {
 sub check_data_dir {
     my $dir = shift;
 
-    if (! -d $dir) {
+    if (! -d) {
         mkdir $dir, 0777;
         chmod 0777, $dir;
     }
diff --git a/confirmhelp.html b/confirmhelp.html
index 1dad97302..20ccfd402 100644
--- a/confirmhelp.html
+++ b/confirmhelp.html
@@ -1,4 +1,5 @@
-<HTML><head>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html><head>
 
 <!--
      The contents of this file are subject to the Mozilla Public
@@ -21,15 +22,18 @@
      Contributor(s): Terry Weissman <terry@mozilla.org>
 -->
 
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <title>Understanding the UNCONFIRMED state, and other recent changes</title>
 </head>
 
 <body>
 <h1>Understanding the UNCONFIRMED state, and other recent changes</h1>
 
+<p>
 [This document is aimed primarily at people who have used Bugzilla
 before the UNCONFIRMED state was implemented.  It might be helpful for
 newer users as well.]
+</p>
 
 <p>
 
@@ -39,60 +43,67 @@ bug is real.  Very busy engineers will probably generally ignore
 UNCONFIRMED that have been assigned to them, until they have been
 confirmed in one way or another.  (Engineers with more time will
 hopefully glance over their UNCONFIRMED bugs regularly.)
+</p>
 
 <p>
-
 The <a href="bug_status.html">page describing bug fields</a> has been
 updated to include UNCONFIRMED.
-<p>
+</p>
 
+<p>
 There are two basic ways that a bug can become confirmed (and enter
 the NEW) state.
+</p>
 
 <ul>
   <li> A user with the appropriate permissions (see below for more on
        permissions) decides that the bug is a valid one, and confirms
        it.  We hope to gather a small army of responsible volunteers
-       to regularly go through bugs for us.
-  <li> The bug gathers a certain number of votes. <B>Any</B> valid Bugzilla user may vote for 
+       to regularly go through bugs for us.</li>
+  <li> The bug gathers a certain number of votes. <b>Any</b> valid Bugzilla user may vote for 
 bugs (each user gets a certain number of bugs); any UNCONFIRMED bug which 
-gets enough votes becomes automatically confirmed, and enters the NEW state.
+gets enough votes becomes automatically confirmed, and enters the NEW state.</li>
 </ul>
 
+<p>
 One implication of this is that it is worth your time to search the
 bug system for duplicates of your bug to vote on them, before
 submitting your own bug.  If we can spread around knowledge of this
 fact, it ought to help cut down the number of duplicate bugs in the
 system. 
+</p>
 
 <h2>Permissions.</h2>
 
+<p>
 Users now have a certain set of permissions.  To see your permissions,
 check out the
 <a href="userprefs.cgi?bank=permissions">user preferences</a> page.
+</p>
 
 <p>
-
 If you have the "Can confirm a bug" permission, then you will be able
 to move UNCONFIRMED bugs into the NEW state.
+</p>
 
 <p>
-
 If you have the "Can edit all aspects of any bug" permission, then you
 can tweak anything about any bug.  If not, you may only edit those
 bugs that you have submitted, or that you have assigned to you (or
 qa-assigned to you).  However, anyone may add a comment to any bug.
+</p>
 
 <p>
-
 Some people (initially, the initial owners and initial qa-contacts for
 components in the system) have the ability to give the above two
 permissions to other people.  So, if you really feel that you ought to
 have one of these permissions, a good person to ask (via private
 email, please!) is the person who is assigned a relevant bug.
+</p>
 
 <h2>Other details.</h2>
 
+<p>
 An initial stab was taken to decide who would be given which of the
 above permissions.  This was determined by some simple heurstics of
 who was assigned bugs, and who the default owners of bugs were, and a
@@ -100,54 +111,58 @@ look at people who seem to have submitted several bugs that appear to
 have been interesting and valid.  Inevitably, we have failed to give
 someone the permissions they deserve.  Please don't take it
 personally; just bear with us as we shake out the new system.
+</p>
 
 <p>
-
-
 People with one of the two bits above can easily confirm their own
 bugs, so bugs they submit will actually start out in the NEW state.
 They can override this when submitting a bug.
+</p>
 
 <p>
-
 People can ACCEPT or RESOLVE a bug assigned to them, even if they
 aren't allowed to confirm it.  However, the system remembers, and if
 the bug gets REOPENED or reassigned to someone else, it will revert
 back to the UNCONFIRMED state.  If the bug has ever been confirmed,
 then REOPENing or reassigning will cause it to go to the NEW or
 REOPENED state.
+</p>
 
 <p>
-
 Note that only some products support the UNCONFIRMED state.  In other
 products, all new bugs will automatically start in the NEW state.
+</p>
 
 <h2>Things still to be done.</h2>
 
+<p>
 There probably ought to be a way to get a bug back into the
 UNCONFIRMED state, but there isn't yet.
+</p>
 
 <p>
-
 If a person has submitted several bugs that get confirmed, then this
 is probably a person who understands the system well, and deserves the
 "Can confirm a bug" permission.  This kind of person should be
 detected and promoted automatically.
+</p>
 
 <p>
-
 There should also be a way to automatically promote people to get the
 "Can edit all aspects of any bug" permission.
+</p>
 
 <p>
-
 The "enter a new bug" page needs to be revamped with easy ways for new
 people to educate themselves on the benefit of searching for a bug
 like the one they're about to submit and voting on it, rather than
 adding a new useless duplicate.
+</p>
 
 <hr>
+<p>
 <!-- hhmts start -->
-Last modified: Wed Feb 16 21:04:56 2000
+Last modified: Sun Apr 14 12:55:14 EST 2002
 <!-- hhmts end -->
+</p>
 </body> </html>
diff --git a/contrib/CVS/Entries b/contrib/CVS/Entries
index 1c960dbbe..6b54b7eb4 100644
--- a/contrib/CVS/Entries
+++ b/contrib/CVS/Entries
@@ -1,12 +1,13 @@
-/BugzillaEmail.pm/1.1/Wed Mar 15 22:29:44 2000//TBUGZILLA-2_14_5
-/README/1.4/Sun Apr 22 18:13:40 2001//TBUGZILLA-2_14_5
-/README.Mailif/1.3/Wed Mar 15 23:39:03 2000//TBUGZILLA-2_14_5
-/bug_email.pl/1.9.10.2/Sat Aug 17 14:26:32 2002//TBUGZILLA-2_14_5
-/bugmail_help.html/1.1/Tue Mar  7 17:36:48 2000//TBUGZILLA-2_14_5
-/bugzilla.procmailrc/1.1/Wed Mar 15 23:39:09 2000//TBUGZILLA-2_14_5
-/bugzilla_email_append.pl/1.2.12.2/Tue Sep  3 06:39:14 2002//TBUGZILLA-2_14_5
-/cvs-update.sh/1.1/Wed Apr 18 18:01:28 2001//TBUGZILLA-2_14_5
-/gnats2bz.pl/1.5/Thu Nov 18 17:29:58 1999//TBUGZILLA-2_14_5
-/mysqld-watcher.pl/1.2/Fri Jun  1 08:34:45 2001//TBUGZILLA-2_14_5
-/yp_nomail.sh/1.1/Tue Sep 12 23:50:31 2000//TBUGZILLA-2_14_5
-D
+/BugzillaEmail.pm/1.1/Wed Mar 15 22:29:44 2000//TBUGZILLA-2_16
+/README/1.4/Sun Apr 22 18:13:40 2001//TBUGZILLA-2_16
+/README.Mailif/1.3/Wed Mar 15 23:39:03 2000//TBUGZILLA-2_16
+/bug_email.pl/1.9.12.1/Thu Jul 25 01:47:33 2002//TBUGZILLA-2_16
+/bugmail_help.html/1.1/Tue Mar  7 17:36:48 2000//TBUGZILLA-2_16
+/bugzilla.procmailrc/1.1/Wed Mar 15 23:39:09 2000//TBUGZILLA-2_16
+/bugzilla_email_append.pl/1.2.14.1/Thu Jul 25 01:47:34 2002//TBUGZILLA-2_16
+/cvs-update.sh/1.1/Wed Apr 18 18:01:28 2001//TBUGZILLA-2_16
+/gnats2bz.pl/1.6/Thu Jan 31 14:29:21 2002//TBUGZILLA-2_16
+/jb2bz.py/1.1/Wed Feb 13 14:59:30 2002//TBUGZILLA-2_16
+/mysqld-watcher.pl/1.2/Fri Jun  1 08:34:45 2001//TBUGZILLA-2_16
+/yp_nomail.sh/1.1/Tue Sep 12 23:50:31 2000//TBUGZILLA-2_16
+D/cmdline////
diff --git a/contrib/CVS/Entries.Log b/contrib/CVS/Entries.Log
deleted file mode 100644
index 867bdc5c2..000000000
--- a/contrib/CVS/Entries.Log
+++ /dev/null
@@ -1,2 +0,0 @@
-A D/cmdline////
-R D/cmdline////
diff --git a/contrib/CVS/Tag b/contrib/CVS/Tag
index cc64cc0c3..f2ec6389c 100644
--- a/contrib/CVS/Tag
+++ b/contrib/CVS/Tag
@@ -1 +1 @@
-NBUGZILLA-2_14_5
+NBUGZILLA-2_16
diff --git a/contrib/bug_email.pl b/contrib/bug_email.pl
index f13091cf8..18e8bb3c6 100755
--- a/contrib/bug_email.pl
+++ b/contrib/bug_email.pl
@@ -37,7 +37,7 @@
 #
 # You need to work with bug_email.pl the MIME::Parser installed.
 # 
-# $Id: bug_email.pl,v 1.9.10.2 2002/08/17 14:26:32 bbaetz%student.usyd.edu.au Exp $
+# $Id: bug_email.pl,v 1.9.12.1 2002/07/25 01:47:33 justdave%syndicomm.com Exp $
 ###############################################################
 
 # 02/12/2000 (SML)
@@ -1232,11 +1232,17 @@ END
 	SendSQL("select LAST_INSERT_ID()");
 	$id = FetchOneColumn();
 
-        my $long_desc_query = "INSERT INTO longdescs SET bug_id=$id, who=$userid, bug_when=\'$bug_when\', thetext=" . SqlQuote($comment);
-        SendSQL($long_desc_query);
+	my $long_desc_query = "INSERT INTO longdescs SET bug_id=$id, who=$userid, bug_when=\'$bug_when\', thetext=" . SqlQuote($comment);
+	SendSQL($long_desc_query);
 
-        # Cool, the mail was successful
+	# Cool, the mail was successful
+        # chdir back to the main directory which has the processmail script
+        # Oh, for a processmail module....
+        use Cwd;
+        my $old_cwd = getcwd();
+        chdir("..");
         system("./processmail", $id, $SenderShort);
+        chdir($old_cwd);
     } else {
 	$id = 0xFFFF;  # TEST !
 	print "\n-------------------------------------------------------------------------\n";
diff --git a/contrib/bugzilla_email_append.pl b/contrib/bugzilla_email_append.pl
index 5fbd00824..826b49198 100755
--- a/contrib/bugzilla_email_append.pl
+++ b/contrib/bugzilla_email_append.pl
@@ -117,7 +117,7 @@ my $Body = "Subject: " . $Subject . "\n" . $Comment;
 my $long_desc_query = "INSERT INTO longdescs SET bug_id=$found_id, who=$userid, bug_when=NOW(), thetext=" . SqlQuote($Body) . ";";
 SendSQL($long_desc_query);
 
-system("./processmail", $found_id, $SenderShort);
+system("cd .. ; ./processmail $found_id '$SenderShort'");
 
 sub DealWithError {
   my ($reason) = @_;
diff --git a/contrib/cmdline/CVS/Entries b/contrib/cmdline/CVS/Entries
new file mode 100644
index 000000000..f5df070d4
--- /dev/null
+++ b/contrib/cmdline/CVS/Entries
@@ -0,0 +1,4 @@
+/buglist/1.1/Thu Nov 15 17:04:58 2001//TBUGZILLA-2_16
+/bugs/1.1/Thu Nov 15 17:04:58 2001//TBUGZILLA-2_16
+/query.conf/1.1/Thu Nov 15 17:04:58 2001//TBUGZILLA-2_16
+D
diff --git a/contrib/cmdline/CVS/Repository b/contrib/cmdline/CVS/Repository
new file mode 100644
index 000000000..4226e2a19
--- /dev/null
+++ b/contrib/cmdline/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/contrib/cmdline
diff --git a/contrib/cmdline/CVS/Root b/contrib/cmdline/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/contrib/cmdline/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/contrib/cmdline/CVS/Tag b/contrib/cmdline/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/contrib/cmdline/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/contrib/cmdline/buglist b/contrib/cmdline/buglist
new file mode 100755
index 000000000..7f08286de
--- /dev/null
+++ b/contrib/cmdline/buglist
@@ -0,0 +1,94 @@
+#!/bin/sh
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is the Bugzilla Bug Tracking System.
+#
+# The Initial Developer of the Original Code is 
+# Andreas Franke <afranke@ags.uni-sb.de>.
+# Corporation. Portions created by Andreas Franke are
+# Copyright (C) 2001 Andreas Franke. All
+# Rights Reserved.
+#
+# Contributor(s): 
+
+conf="`dirname $0`/query.conf"
+
+query="http://bugzilla.mozilla.org/buglist.cgi?cmd=doit"
+defaultcolumnlist="severity priority platform status resolution target_milestone status_whiteboard keywords summaryfull"
+
+chart=0
+and=0
+while test "$1" != ""; do
+    arg=$1
+    arg_len=`expr length ${arg}`
+    if test `expr substr "${arg}" 1 2` == "--"; then
+        eq_pos=`expr match ${arg} '--.*='`
+        if test "${eq_pos}" == "0"; then
+            echo 'Missing value for long option '"${arg}"' ("=" not found)' 1>&2
+            exit 1;
+        fi
+        # extract option name
+        let name_len=${eq_pos}-3
+        name=`expr substr ${arg} 3 ${name_len}`
+        # extract option value
+        let val_start=${eq_pos}+1
+        let val_len=${arg_len}-${eq_pos}
+        val=`expr substr ${arg} ${val_start} ${val_len}`
+    elif test `expr substr ${arg} 1 1` == "-" &&
+         test "`expr substr ${arg} 2 1`" != ""; then
+        # extract
+        name=`expr substr ${arg} 2 1`
+        let val_len=${arg_len}-2
+        val=`expr substr ${arg} 3 ${val_len}`
+    else
+        name="default"
+        val="${arg}"
+        #echo "Unrecognized option ${arg}" 1>&2
+        #exit 1
+    fi
+
+    # find field and comparison type for option ${name}
+    field=`grep '"'${name}'"' ${conf} | awk '{printf $1}'`
+    type=`grep '"'${name}'"' ${conf} | awk '{printf $2}'`
+    if test "${field}" == ""  || test "${type}" == ""; then
+        echo "Field name & comparison type not found for option ${name}." 1>&2
+        exit 1;
+    fi
+
+    or=0
+    while test "${val}" != ""; do
+        comma_idx=`expr index ${val} ,`
+        if test ${comma_idx} == "0"; then
+            val1="${val}"
+            val=""
+        else
+            let val1_len=${comma_idx}-1
+            val1=`expr substr ${val} 1 ${val1_len}`
+            val_len=`expr length ${val}`
+            let rest_start=${comma_idx}+1
+            let rest_len=${val_len}-${comma_idx}
+            val=`expr substr ${val} ${rest_start} ${rest_len}`
+        fi
+        query="${query}&field${chart}-${and}-${or}=${field}"
+        query="${query}&type${chart}-${and}-${or}=${type}"
+        query="${query}&value${chart}-${and}-${or}=${val1}"
+        #echo "----- ${name} : ${field} : ${type} : ${val1} -----" 1>&2
+        let or=${or}+1
+    done
+    let chart=${chart}+1
+    shift
+done
+
+outputfile="/dev/stdout"
+#outputfile="buglist.html"
+#\rm -f ${outputfile}
+wget -q -O ${outputfile} --header="Cookie: COLUMNLIST=${COLUMNLIST-${defaultcolumnlist}}" "${query}"
+
diff --git a/contrib/cmdline/bugs b/contrib/cmdline/bugs
new file mode 100755
index 000000000..05d4d66ab
--- /dev/null
+++ b/contrib/cmdline/bugs
@@ -0,0 +1,31 @@
+#!/bin/sh
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is the Bugzilla Bug Tracking System.
+#
+# The Initial Developer of the Original Code is 
+# Andreas Franke <afranke@ags.uni-sb.de>.
+# Corporation. Portions created by Andreas Franke are
+# Copyright (C) 2001 Andreas Franke. All
+# Rights Reserved.
+#
+# Contributor(s): 
+
+buglist="`dirname $0`/buglist"
+htmlfile="`dirname $0`/buglist.html"
+
+${buglist} "$@" 2>&1 1>${htmlfile}
+if test ${?} == "0"; then
+    echo `grep 'TR VALIGN=TOP ALIGN=LEFT CLASS=' ${htmlfile} | sed -e 's/<TR.*id=//' | sed -e 's/".*//'` | sed -e 's/ /\,/g'
+else
+    cat ${htmlfile} 1>&2
+    exit 1
+fi
diff --git a/contrib/cmdline/query.conf b/contrib/cmdline/query.conf
new file mode 100644
index 000000000..65bae2248
--- /dev/null
+++ b/contrib/cmdline/query.conf
@@ -0,0 +1,49 @@
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is the Bugzilla Bug Tracking System.
+#
+# The Initial Developer of the Original Code is 
+# Andreas Franke <afranke@ags.uni-sb.de>.
+# Corporation. Portions created by Andreas Franke are
+# Copyright (C) 2001 Andreas Franke. All
+# Rights Reserved.
+#
+# Contributor(s): 
+
+#
+# This is `query.conf', the config file for `buglist'.
+#
+# Columns: 1: field_name, 2: comparison_type, 3: cmd-line options
+#
+bug_status              substring       "s","status"
+resolution              substring       "r","resolution"
+rep_platform            substring       "p","platform"
+op_sys                  substring       "o","os","opsys"
+priority                substring       "p","priority"
+bug_severity            substring       "S","severity"
+assigned_to             substring       "A","O","owner","assignedto"
+reporter                substring       "R","reporter"
+qa_contact              substring       "Q","qa","qacontact"
+cc                      substring       "C","cc"
+product                 substring       "product"
+version                 substring       "V","version"
+component               substring       "c","component"
+target_milestone        substring       "M","milestone"
+short_desc              substring       "default","summary"
+longdesc                substring       "d","description","longdesc"
+bug_file_loc            substring       "u","url"
+status_whiteboard       substring       "w","whiteboard"
+keywords                substring       "k","K","keywords"
+attachments.description substring       "attachdesc"
+attachments.thedata     substring       "attachdata"
+attachments.mimetype    substring       "attachmime"
+dependson               substring       # bug 30823
+blocked                 substring       # bug 30823
diff --git a/contrib/gnats2bz.pl b/contrib/gnats2bz.pl
index b4d8f45e3..c343f5750 100644
--- a/contrib/gnats2bz.pl
+++ b/contrib/gnats2bz.pl
@@ -19,8 +19,7 @@
 # Rights Reserved.
 #
 # Contributor(s): Tom Schutter <tom@platte.com>
-
-
+#
 # Perl script to convert a GNATS database to a Bugzilla database.
 # This script generates a file that contains SQL commands for MySQL.
 # This script DOES NOT MODIFY the GNATS database.
@@ -74,6 +73,16 @@
 #     is no place to put the "Why" text, which can have a fair amount
 #     of information content.
 #
+# 15 January 2002 - changes from Andrea Dell'Amico <adellam@link.it>
+#
+#     * Adapted to the new database structure: now long_descs is a 
+#       separate table.
+#     * Set a default for the target milestone, otherwise bugzilla
+#       doesn't work with the imported database if milestones are used.
+#     * In gnats version 3.113 records are separated by "|" and not ":".
+#     * userid "1" is for the bugzilla administrator, so it's better to
+#       start from 2.
+#
 
 use strict;
 
@@ -102,8 +111,9 @@ my($cleanup_with_edit_pr) = 0;
 my($default_component) = "GNATS Import";
 my($default_component_description) = "Bugs imported from GNATS.";
 
-# First generated userid.
-my($userid_base) = 1;
+# First generated userid. Start from 2: 1 is used for the bugzilla
+# administrator.
+my($userid_base) = 2;
 
 # Output filenames.
 my($cleanup_pathname) = "gnats2bz_cleanup.sh";
@@ -150,7 +160,7 @@ my($pr_data_dup_fields) = "";
 # String to hold badly labeled fields found during read of PR.
 # This usually happens when the user does not separate the field name
 # from the field data with whitespace.
-my($pr_data_bad_fields) = "";
+my($pr_data_bad_fields) = " ";
 
 # Hash to hold statistics (note that this a hash of hashes).
 my(%pr_stats);
@@ -215,6 +225,9 @@ foreach $pr (@pr_list) {
     update_versions();
 
     write_bugs();
+
+    write_longdescs();
+
 }
 
 write_non_bugs_tables();
@@ -233,7 +246,7 @@ sub load_index {
     open(INDEX, $pathname) || die "Unable to open $pathname: $!";
 
     while ($record = <INDEX>) {
-        @fields = split(/:/, $record);
+        @fields = split(/\|/, $record);
         push(@pr_list, $fields[0]);
     }
 
@@ -270,7 +283,7 @@ sub load_responsible {
         if ($record =~ /^#/) {
             next;
         }
-        push(@responsible_list, [split(/:/, $record)]);
+        push(@responsible_list, [split(/\|/, $record)]);
     }
 
     close(RESPONSIBLE) || die "Unable to close $pathname: $!";
@@ -667,29 +680,7 @@ sub write_bugs {
 
     my($short_desc) = SqlQuote($pr_data{"Synopsis"});
 
-    my($long_desc) = $pr_data{"Description"};
-    if (defined($pr_data{"How-To-Repeat"}) && $pr_data{"How-To-Repeat"} ne "") {
-        $long_desc =
-            $long_desc . "\n\nHow-To-Repeat:\n" . $pr_data{"How-To-Repeat"};
-    }
-    if (defined($pr_data{"Fix"}) && $pr_data{"Fix"} ne "") {
-        $long_desc = $long_desc . "\n\nFix:\n" . $pr_data{"Fix"};
-    }
-    if (defined($pr_data{"Originator"}) && $pr_data{"Originator"} ne "") {
-        $long_desc = $long_desc . "\n\nOriginator:\n" . $pr_data{"Originator"};
-    }
-    if (defined($pr_data{"Organization"}) && $pr_data{"Organization"} ne "") {
-        $long_desc = $long_desc . "\n\nOrganization:\n" . $pr_data{"Organization"};
-    }
-    if (defined($pr_data{"Audit-Trail"}) && $pr_data{"Audit-Trail"} ne "") {
-        $long_desc = $long_desc . "\n\nAudit-Trail:\n" . $pr_data{"Audit-Trail"};
-    }
-    if (defined($pr_data{"Unformatted"}) && $pr_data{"Unformatted"} ne "") {
-        $long_desc = $long_desc . "\n\nUnformatted:\n" . $pr_data{"Unformatted"};
-    }
-    $long_desc = SqlQuote($long_desc);
-
-    my($rep_platform, $op_sys) = split(/:/, $pr_data{"Environment"});
+    my($rep_platform, $op_sys) = split(/\|/, $pr_data{"Environment"});
     $rep_platform = SqlQuote($rep_platform);
     $op_sys = SqlQuote($op_sys);
 
@@ -715,8 +706,8 @@ sub write_bugs {
 
     my($component) = SqlQuote($default_component);
 
-    my($target_milestone) = "";
-    $target_milestone = SqlQuote($target_milestone);
+    my($target_milestone) = "0";
+    # $target_milestone = SqlQuote($target_milestone);
 
     my($qa_contact) = "0";
 
@@ -730,17 +721,54 @@ sub write_bugs {
     print DATA "  bug_id, assigned_to, bug_severity, priority, bug_status, creation_ts, delta_ts,\n";
     print DATA "  short_desc,\n";
     print DATA "  rep_platform, op_sys, reporter, version,\n";
-    print DATA "  product, component, resolution, target_milestone, qa_contact,\n";
-    print DATA "  long_desc\n";
+    print DATA "  product, component, resolution, target_milestone, qa_contact\n";
     print DATA ") values (\n";
     print DATA "  $bug_id, $userid, $bug_severity, $priority, $bug_status, $creation_ts, $delta_ts,\n";
     print DATA "  $short_desc,\n";
     print DATA "  $rep_platform, $op_sys, $reporter, $version,\n";
-    print DATA "  $product, $component, $resolution, $target_milestone, $qa_contact,\n";
-    print DATA "  $long_desc\n";
+    print DATA "  $product, $component, $resolution, $target_milestone, $qa_contact\n";
     print DATA ");\n";
 }
 
+sub write_longdescs {
+
+    my($bug_id) = $pr_data{"Number"};
+    my($who) = get_userid($pr_data{"Responsible"});;
+    my($bug_when) = "";
+    if (defined($pr_data{"Arrival-Date"}) && $pr_data{"Arrival-Date"} ne "") {
+        $bug_when = unixdate2datetime($bug_id, $pr_data{"Arrival-Date"});
+    }
+    $bug_when = SqlQuote($bug_when);
+    my($thetext) = $pr_data{"Description"};
+    if (defined($pr_data{"How-To-Repeat"}) && $pr_data{"How-To-Repeat"} ne "") {
+        $thetext =
+            $thetext . "\n\nHow-To-Repeat:\n" . $pr_data{"How-To-Repeat"};
+    }
+    if (defined($pr_data{"Fix"}) && $pr_data{"Fix"} ne "") {
+        $thetext = $thetext . "\n\nFix:\n" . $pr_data{"Fix"};
+    }
+    if (defined($pr_data{"Originator"}) && $pr_data{"Originator"} ne "") {
+        $thetext = $thetext . "\n\nOriginator:\n" . $pr_data{"Originator"};
+    }
+    if (defined($pr_data{"Organization"}) && $pr_data{"Organization"} ne "") {
+        $thetext = $thetext . "\n\nOrganization:\n" . $pr_data{"Organization"};
+    }
+    if (defined($pr_data{"Audit-Trail"}) && $pr_data{"Audit-Trail"} ne "") {
+        $thetext = $thetext . "\n\nAudit-Trail:\n" . $pr_data{"Audit-Trail"};
+    }
+    if (defined($pr_data{"Unformatted"}) && $pr_data{"Unformatted"} ne "") {
+        $thetext = $thetext . "\n\nUnformatted:\n" . $pr_data{"Unformatted"};
+    }
+    $thetext = SqlQuote($thetext);
+
+    print DATA "\ninsert into longdescs (\n";
+    print DATA "  bug_id, who, bug_when, thetext\n";
+    print DATA ") values (\n";
+    print DATA "  $bug_id, $who, $bug_when, $thetext\n";
+    print DATA ");\n";
+
+}
+
 sub write_non_bugs_tables {
 
     my($categories_record);
@@ -765,6 +793,14 @@ sub write_non_bugs_tables {
         print DATA
             "  $component, $product, $initialowner, '', $description\n";
         print DATA ");\n";
+
+        print DATA "\ninsert into milestones (\n";
+        print DATA
+            "  value, product, sortkey\n";
+        print DATA ") values (\n";
+        print DATA
+            "  0, $product, 0\n";
+        print DATA ");\n";
     }
 
     my($username);
@@ -778,10 +814,10 @@ sub write_non_bugs_tables {
         $realname = SqlQuote($realname);
         print DATA "\ninsert into profiles (\n";
         print DATA
-            "  userid, login_name, password, cryptpassword, realname, groupset\n";
+            "  userid, login_name, cryptpassword, realname, groupset\n";
         print DATA ") values (\n";
         print DATA
-            "  $userid, $username, '$password', encrypt('$password'), $realname, $groupset\n";
+            "  $userid, $username, encrypt('$password'), $realname, $groupset\n";
         print DATA ");\n";
         $userid++;
     }
@@ -799,6 +835,7 @@ sub write_non_bugs_tables {
             print DATA "values ($version, $product);\n";
         }
     }
+
 }
 
 sub map_username_to_realname() {
@@ -826,10 +863,18 @@ sub map_username_to_realname() {
 
 # This routine was copied from globals.pl which was largely copied
 # from Mysql.pm.
+sub detaint_string {
+    my ($str) = @_;
+    $str =~ m/^(.*)$/s;
+    $str = $1;
+}
+
 sub SqlQuote {
-    my($str) = @_;
+    my ($str) = (@_);
     $str =~ s/([\\\'])/\\$1/g;
     $str =~ s/\0/\\0/g;
+    # If it's been SqlQuote()ed, then it's safe, so we tell -T that.
+    $str = detaint_string($str);
     return "'$str'";
 }
 
@@ -967,7 +1012,7 @@ sub split_unixdate {
         return(1);
     }
 
-    @parts = split(/\//, $unixdate);
+    @parts = split(/:/, $unixdate);
     if (@parts == 3 && length($unixdate) <= 8) {
         $$year = "19" . $parts[2];
 
@@ -1021,3 +1066,4 @@ sub month2number {
 
     return(1);
 }
+
diff --git a/contrib/jb2bz.py b/contrib/jb2bz.py
new file mode 100644
index 000000000..dbd47ea7a
--- /dev/null
+++ b/contrib/jb2bz.py
@@ -0,0 +1,303 @@
+#!/usr/local/bin/python
+# -*- mode: python -*-
+
+"""
+jb2bz.py - a nonce script to import bugs from JitterBug to Bugzilla
+Written by Tom Emerson, tree@basistech.com
+
+This script is provided in the hopes that it will be useful.  No
+rights reserved. No guarantees expressed or implied. Use at your own
+risk. May be dangerous if swallowed. If it doesn't work for you, don't
+blame me. It did what I needed it to do.
+
+This code requires a recent version of Andy Dustman's MySQLdb interface,
+
+    http://sourceforge.net/projects/mysql-python
+
+Share and enjoy.
+"""
+
+import rfc822, mimetools, multifile, mimetypes
+import sys, re, glob, StringIO, os, stat, time
+import MySQLdb, getopt
+
+# mimetypes doesn't include everything we might encounter, yet.
+if not mimetypes.types_map.has_key('.doc'):
+    mimetypes.types_map['.doc'] = 'application/msword'
+
+if not mimetypes.encodings_map.has_key('.bz2'):
+    mimetypes.encodings_map['.bz2'] = "bzip2"
+
+bug_status='NEW'
+component="default"
+version=""
+product="" # this is required, the rest of these are defaulted as above
+
+"""
+Each bug in JitterBug is stored as a text file named by the bug number.
+Additions to the bug are indicated by suffixes to this:
+
+<bug>
+<bug>.followup.*
+<bug>.reply.*
+<bug>.notes
+
+The dates on the files represent the respective dates they were created/added.
+
+All <bug>s and <bug>.reply.*s include RFC 822 mail headers. These could include
+MIME file attachments as well that would need to be extracted.
+
+There are other additions to the file names, such as
+
+<bug>.notify
+
+which are ignored.
+
+Bugs in JitterBug are organized into directories. At Basis we used the following
+naming conventions:
+
+<product>-bugs         Open bugs
+<product>-requests     Open Feature Requests
+<product>-resolved     Bugs/Features marked fixed by engineering, but not verified
+<product>-verified     Resolved defects that have been verified by QA
+
+where <product> is either:
+
+<product-name>
+
+or
+
+<product-name>-<version>
+"""
+
+def process_notes_file(current, fname):
+    try:
+        new_note = {}
+        notes = open(fname, "r")
+        s = os.fstat(notes.fileno())
+
+        new_note['text']  = notes.read()
+        new_note['timestamp'] = time.gmtime(s[stat.ST_MTIME])
+
+        notes.close()
+
+        current['notes'].append(new_note)
+
+    except IOError:
+        pass
+
+def process_reply_file(current, fname):
+    new_note = {}
+    reply = open(fname, "r")
+    msg = rfc822.Message(reply)
+    new_note['text'] = "%s\n%s" % (msg['From'], msg.fp.read())
+    new_note['timestamp'] = rfc822.parsedate_tz(msg['Date'])
+    current["notes"].append(new_note)
+
+def add_notes(current):
+    """Add any notes that have been recorded for the current bug."""
+    process_notes_file(current, "%d.notes" % current['number'])
+
+    for f in glob.glob("%d.reply.*" % current['number']):
+        process_reply_file(current, f)
+
+    for f in glob.glob("%d.followup.*" % current['number']):
+        process_reply_file(current, f)
+
+def maybe_add_attachment(current, file, submsg):
+    """Adds the attachment to the current record"""
+    cd = submsg["Content-Disposition"]
+    m = re.search(r'filename="([^"]+)"', cd)
+    if m == None:
+        return
+    attachment_filename = m.group(1)
+    if (submsg.gettype() == 'application/octet-stream'):
+        # try get a more specific content-type for this attachment
+        type, encoding = mimetypes.guess_type(m.group(1))
+        if type == None:
+            type = submsg.gettype()
+    else:
+        type = submsg.gettype()
+
+    try:
+        data = StringIO.StringIO()
+        mimetools.decode(file, data, submsg.getencoding())
+    except:
+        return
+
+    current['attachments'].append( ( attachment_filename, type, data.getvalue() ) )
+
+def process_mime_body(current, file, submsg):
+    data = StringIO.StringIO()
+    mimetools.decode(file, data, submsg.getencoding())
+    current['description'] = data.getvalue()
+
+
+
+def process_text_plain(msg, current):
+    print "Processing: %d" % current['number']
+    current['description'] = msg.fp.read()
+
+def process_multi_part(file, msg, current):
+    print "Processing: %d" % current['number']
+    mf = multifile.MultiFile(file)
+    mf.push(msg.getparam("boundary"))
+    while mf.next():
+        submsg = mimetools.Message(file)
+        if submsg.has_key("Content-Disposition"):
+            maybe_add_attachment(current, mf, submsg)
+        else:
+            # This is the message body itself (always?), so process
+            # accordingly
+            process_mime_body(current, mf, submsg)
+
+def process_jitterbug(filename):
+    current = {}
+    current['number'] = int(filename)
+    current['notes'] = []
+    current['attachments'] = []
+    current['description'] = ''
+    current['date-reported'] = ()
+    current['short-description'] = ''
+    
+    file = open(filename, "r")
+    msg = mimetools.Message(file)
+
+    msgtype = msg.gettype()
+
+    add_notes(current)
+    current['date-reported'] = rfc822.parsedate_tz(msg['Date'])
+    current['short-description'] = msg['Subject']
+
+    if msgtype[:5] == 'text/':
+        process_text_plain(msg, current)
+    elif msgtype[:10] == "multipart/":
+        process_multi_part(file, msg, current)
+    else:
+        # Huh? This should never happen.
+        print "Unknown content-type: %s" % msgtype
+        sys.exit(1)
+
+    # At this point we have processed the message: we have all of the notes and
+    # attachments stored, so it's time to add things to the database.
+    # The schema for JitterBug 2.14 can be found at:
+    #
+    #    http://www.trilobyte.net/barnsons/html/dbschema.html
+    #
+    # The following fields need to be provided by the user:
+    #
+    # bug_status
+    # product
+    # version
+    # reporter
+    # component
+    # resolution
+
+    # change this to the user_id of the Bugzilla user who is blessed with the
+    # imported defects
+    reporter=6
+
+    # the resolution will need to be set manually
+    resolution=""
+
+    db = MySQLdb.connect(db='bugs',user='root',host='localhost')
+    cursor = db.cursor()
+
+    cursor.execute( "INSERT INTO bugs SET " \
+                    "bug_id=%s," \
+                    "bug_severity='normal',"  \
+                    "bug_status=%s," \
+                    "creation_ts=%s,"  \
+                    "short_desc=%s," \
+                    "product=%s," \
+                    "rep_platform='All'," \
+                    "assigned_to=%s,"
+                    "reporter=%s," \
+                    "version=%s,"  \
+                    "component=%s,"  \
+                    "resolution=%s",
+                    [ current['number'],
+                      bug_status,
+                      time.strftime("%Y-%m-%d %H:%M:%S", current['date-reported'][:9]),
+                      current['short-description'],
+                      product,
+                      reporter,
+                      reporter,
+                      version,
+                      component,
+                      resolution] )
+
+    # This is the initial long description associated with the bug report
+    cursor.execute( "INSERT INTO longdescs VALUES (%s,%s,%s,%s)",
+                    [ current['number'],
+                      reporter,
+                      time.strftime("%Y-%m-%d %H:%M:%S", current['date-reported'][:9]),
+                      current['description'] ] )
+
+    # Add whatever notes are associated with this defect
+    for n in current['notes']:
+        cursor.execute( "INSERT INTO longdescs VALUES (%s,%s,%s,%s)",
+                        [current['number'],
+                         reporter,
+                         time.strftime("%Y-%m-%d %H:%M:%S", n['timestamp'][:9]),
+                         n['text']])
+
+    # add attachments associated with this defect
+    for a in current['attachments']:
+        cursor.execute( "INSERT INTO attachments SET " \
+                        "bug_id=%s, creation_ts=%s, description='', mimetype=%s," \
+                        "filename=%s, thedata=%s, submitter_id=%s",
+                        [ current['number'],
+                          time.strftime("%Y-%m-%d %H:%M:%S", current['date-reported'][:9]),
+                          a[1], a[0], a[2], reporter ])
+
+    cursor.close()
+    db.close()
+
+def usage():
+    print """Usage: jb2bz.py [OPTIONS] Product
+
+Where OPTIONS are one or more of the following:
+
+  -h                This help information.
+  -s STATUS         One of UNCONFIRMED, NEW, ASSIGNED, REOPENED, RESOLVED, VERIFIED, CLOSED
+                    (default is NEW)
+  -c COMPONENT      The component to attach to each bug as it is important. This should be
+                    valid component for the Product.
+  -v VERSION        Version to assign to these defects.
+
+Product is the Product to assign these defects to.
+
+All of the JitterBugs in the current directory are imported, including replies, notes,
+attachments, and similar noise.
+"""
+    sys.exit(1)
+
+
+def main():
+    global bug_status, component, version, product
+    opts, args = getopt.getopt(sys.argv[1:], "hs:c:v:")
+
+    for o,a in opts:
+        if o == "-s":
+            if a in ('UNCONFIRMED','NEW','ASSIGNED','REOPENED','RESOLVED','VERIFIED','CLOSED'):
+                bug_status = a
+        elif o == '-c':
+            component = a
+        elif o == '-v':
+            version = a
+        elif o == '-h':
+            usage()
+
+    if len(args) != 1:
+        sys.stderr.write("Must specify the Product.\n")
+        sys.exit(1)
+
+    product = args[0]
+
+    for bug in filter(lambda x: re.match(r"\d+$", x), glob.glob("*")):
+        process_jitterbug(bug)
+        
+
+if __name__ == "__main__":
+    main()
diff --git a/createaccount.cgi b/createaccount.cgi
index 5b9bfb9f6..8a5b85782 100755
--- a/createaccount.cgi
+++ b/createaccount.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -21,83 +21,70 @@
 # Contributor(s): Terry Weissman <terry@mozilla.org>
 #                 David Gardiner <david.gardiner@unisa.edu.au>
 #                 Joe Robins <jmrobins@tgix.com>
+#                 Christopher Aillon <christopher@aillon.com>
+#                 Gervase Markham <gerv@gerv.net>
 
 use diagnostics;
 use strict;
 
+use lib qw(.);
+
 require "CGI.pl";
 
 # Shut up misguided -w warnings about "used only once":
-
-use vars %::FORM;
+use vars qw(
+  %FORM
+  $template
+  $vars
+);
 
 ConnectToDatabase();
 
-# Clear out the login cookies.  Make people log in again if they create an
-# account; otherwise, they'll probably get confused.
-
-print "Set-Cookie: Bugzilla_login= ; path=/; expires=Sun, 30-Jun-80 00:00:00 GMT
-Set-Cookie: Bugzilla_logincookie= ; path=/; expires=Sun, 30-Jun-80 00:00:00 GMT
-Set-Cookie: Bugzilla_password= ; path=/; expires=Sun, 30-Jun-80 00:00:00 GMT
-Content-type: text/html
-
-";
-
 # If we're using LDAP for login, then we can't create a new account here.
 if(Param('useLDAP')) {
-  PutHeader("Can't create LDAP accounts");
-  print "This site is using LDAP for authentication.  Please contact an LDAP ";
-  print "administrator to get a new account created.\n";
+  # Just in case someone already has an account, let them get the correct
+  # footer on the error message
+  quietly_check_login();
+  DisplayError("This site is using LDAP for authentication.  Please contact 
+                an LDAP administrator to get a new account created.",
+               "Can't create LDAP accounts");
   PutFooter();
   exit;
 }
 
+# Clear out the login cookies.  Make people log in again if they create an
+# account; otherwise, they'll probably get confused.
+my $cookiepath = Param("cookiepath");
+print "Set-Cookie: Bugzilla_login= ; path=$cookiepath; expires=Sun, 30-Jun-80 00:00:00 GMT
+Set-Cookie: Bugzilla_logincookie= ; path=$cookiepath; expires=Sun, 30-Jun-80 00:00:00 GMT\n";
+
+print "Content-Type: text/html\n\n";
+
 my $login = $::FORM{'login'};
-my $realname = $::FORM{'realname'};
-if (defined $login) {
+
+if (defined($login)) {
+    # We've been asked to create an account.
+    my $realname = trim($::FORM{'realname'});
     CheckEmailSyntax($login);
-    if (DBname_to_id($login) != 0) {
-        PutHeader("Account Exists");
-        print qq|
-          <form method="get" action="token.cgi">
-            <input type="hidden" name="a" value="reqpw">
-            <input type="hidden" name="loginname" value="$login">
-            A Bugzilla account for <tt>$login</tt> already exists.  If you
-            are the account holder and have forgotten your password, 
-            <input type="submit" value="submit a request to change it">.
-          </form>
-        |;
-        PutFooter();
+    trick_taint($login);
+    $vars->{'login'} = $login;
+    
+    if (!ValidateNewUser($login)) {
+        # Account already exists        
+        $template->process("account/exists.html.tmpl", $vars)
+          || ThrowTemplateError($template->error());
         exit;
     }
-    PutHeader("Account created");
+    
+    # Create account
     my $password = InsertNewUser($login, $realname);
     MailPassword($login, $password);
-    print " You can also <a href=query.cgi?GoAheadAndLogIn>click\n";
-    print "here</a> to log in for the first time.";
-    PutFooter();
+    
+    $template->process("account/created.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
     exit;
 }
 
-PutHeader("Create a new bugzilla account");
-print q{
-To create a bugzilla account, all that you need to do is to enter a
-legitimate e-mail address.  The account will be created, and its
-password will be mailed to you. Optionally you may enter your real name 
-as well.
-
-<FORM method=get>
-<table>
-<tr>
-<td align=right><b>E-mail address:</b></td>
-<td><input size=35 name=login></td>
-</tr>
-<tr>
-<td align=right><b>Real name:</b></td>
-<td><input size=35 name=realname></td>
-</tr>
-</table>
-<input type="submit" value="Create Account">
-};
-
-PutFooter();
+# Show the standard "would you like to create an account?" form.
+$template->process("account/create.html.tmpl", $vars)
+  || ThrowTemplateError($template->error());
diff --git a/createattachment.cgi b/createattachment.cgi
deleted file mode 100755
index 6af304bec..000000000
--- a/createattachment.cgi
+++ /dev/null
@@ -1,116 +0,0 @@
-#!/usr/bonsaitools/bin/perl -w
-# -*- Mode: perl; indent-tabs-mode: nil -*-
-#
-# The contents of this file are subject to the Mozilla Public
-# License Version 1.1 (the "License"); you may not use this file
-# except in compliance with the License. You may obtain a copy of
-# the License at http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS
-# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
-# implied. See the License for the specific language governing
-# rights and limitations under the License.
-#
-# The Original Code is the Bugzilla Bug Tracking System.
-#
-# The Initial Developer of the Original Code is Netscape Communications
-# Corporation. Portions created by Netscape are
-# Copyright (C) 1998 Netscape Communications Corporation. All
-# Rights Reserved.
-#
-# Contributor(s): Terry Weissman <terry@mozilla.org>
-#                 David Gardiner <david.gardiner@unisa.edu.au>
-
-use diagnostics;
-use strict;
-
-require "CGI.pl";
-
-use vars %::COOKIE, %::FILENAME;
-
-sub Punt {
-    my ($str) = (@_);
-    print "$str<P>Please hit <b>Back</b> and try again.\n";
-    PutFooter();
-    exit;
-}
-
-
-confirm_login();
-
-print "Content-type: text/html\n\n";
-
-my $id = $::FORM{'id'};
-die "invalid id: $id" unless $id=~/^\s*\d+\s*$/;
-
-PutHeader("Create an attachment", "Create attachment", "Bug $id");
-
-
-if (!defined($::FORM{'data'})) {
-    print qq{
-<form method=post ENCTYPE="multipart/form-data">
-<input type=hidden name=id value=$id>
-To attach a file to <a href="show_bug.cgi?id=$id">bug $id</a>, place it in a
-file on your local machine, and enter the path to that file here:<br>
-<input type=file name=data size=60>
-<P>
-Please also provide a one-line description of this attachment:<BR>
-<input name=description size=60>
-<BR>
-What kind of file is this?
-<br><input type=radio name=type value=patch>Patch file (text/plain, diffs)
-<br><input type=radio name=type value="text/plain">Plain text (text/plain)
-<br><input type=radio name=type value="text/html">HTML source (text/html)
-<br><input type=radio name=type value="image/gif">GIF Image (image/gif)
-<br><input type=radio name=type value="image/jpeg">JPEG Image (image/jpeg)
-<br><input type=radio name=type value="image/png">PNG Image (image/png)
-<br><input type=radio name=type value="application/octet-stream">Binary file (application/octet-stream)
-<br><input type=radio name=type value="other">Other (enter mime type: <input name=othertype size=30>)
-<P>
-<input type=submit value="Submit">
-</form>
-<P>
-};
-} else {
-    if ($::FORM{'data'} eq "" || !defined $::FILENAME{'data'}) {
-        Punt("No file was provided, or it was empty.");
-    }
-    my $desc = trim($::FORM{'description'});
-    if ($desc eq "") {
-        Punt("You must provide a description of your attachment.");
-    }
-    my $ispatch = 0;
-    my $mimetype = $::FORM{'type'};
-    if (!defined $mimetype) {
-        Punt("You must select which kind of file you have.");
-    }
-    $mimetype = trim($mimetype);
-    if ($mimetype eq "patch") {
-        $mimetype = "text/plain";
-        $ispatch = 1;
-    }
-    if ($mimetype eq "other") {
-        $mimetype = $::FORM{'othertype'};
-    }
-    if ($mimetype !~ m@^(\w|-|\+|\.)+/(\w|-|\+|\.)+$@) {
-        Punt("You must select a legal mime type.  '<tt>$mimetype</tt>' simply will not do.");
-    }
-    SendSQL("insert into attachments (bug_id, filename, description, mimetype, ispatch, submitter_id, thedata) values ($id," .
-            SqlQuote($::FILENAME{'data'}) . ", " . SqlQuote($desc) . ", " .
-            SqlQuote($mimetype) . ", $ispatch, " .
-            DBNameToIdAndCheck($::COOKIE{'Bugzilla_login'}) . ", " .
-            SqlQuote($::FORM{'data'}) . ")");
-    SendSQL("select LAST_INSERT_ID()");
-    my $attachid = FetchOneColumn();
-    AppendComment($id, $::COOKIE{"Bugzilla_login"},
-                  "Created an attachment (id=$attachid)\n$desc\n");
-
-    print '<TABLE BORDER=1><TD><H2>Attachment <A TITLE="'.value_quote($desc).
-      "\" HREF=\"showattachment.cgi?attach_id=$attachid\">$attachid</A> to bug $id created</H2>\n";
-    system("./processmail", $id, $::COOKIE{'Bugzilla_login'});
-    print "<TD><A HREF=\"show_bug.cgi?id=$id\">Go Back to BUG# $id</A></TABLE>\n";
-    print "<P><A HREF=\"createattachment.cgi?id=$id\">Create another attachment to bug $id</A></P>\n";
-}
-
-PutFooter();
-
diff --git a/css/CVS/Entries b/css/CVS/Entries
new file mode 100644
index 000000000..900e6ccdf
--- /dev/null
+++ b/css/CVS/Entries
@@ -0,0 +1,3 @@
+/buglist.css/1.1/Tue Mar 12 13:55:00 2002//TBUGZILLA-2_16
+/panel.css/1.1/Wed Dec 12 22:41:11 2001//TBUGZILLA-2_16
+D
diff --git a/css/CVS/Repository b/css/CVS/Repository
new file mode 100644
index 000000000..0495c7673
--- /dev/null
+++ b/css/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/css
diff --git a/css/CVS/Root b/css/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/css/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/css/CVS/Tag b/css/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/css/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/css/buglist.css b/css/buglist.css
new file mode 100644
index 000000000..c8a4d13d0
--- /dev/null
+++ b/css/buglist.css
@@ -0,0 +1,38 @@
+/* The contents of this file are subject to the Mozilla Public
+  * License Version 1.1 (the "License"); you may not use this file
+  * except in compliance with the License. You may obtain a copy of
+  * the License at http://www.mozilla.org/MPL/
+  *
+  * Software distributed under the License is distributed on an "AS
+  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  * implied. See the License for the specific language governing
+  * rights and limitations under the License.
+  *
+  * The Original Code is the Bugzilla Bug Tracking System.
+  *
+  * The Initial Developer of the Original Code is Netscape Communications
+  * Corporation. Portions created by Netscape are
+  * Copyright (C) 1998 Netscape Communications Corporation. All
+  * Rights Reserved.
+  *
+  * Contributor(s): Myk Melez <myk@mozilla.org>
+  */
+
+/* Right align bug IDs. */
+.bz_id_column { text-align: right; }
+
+/* Style bug rows according to severity. */
+.bz_blocker { color: red; font-weight: bold; }
+.bz_critical { color: red; }
+.bz_enhancement { font-style: italic; }
+
+/* Style secure bugs if the installation is not using bug groups.
+ * Installations that *are* using bug groups are likely to be using
+ * them for almost all bugs, in which case special styling is not
+ * informative and generally a nuisance.
+ */
+.bz_secure { color: black; background-color: lightgrey; }
+
+/* Align columns in the "change multiple bugs" form to the right. */
+table#form tr th { text-align: right; }
+
diff --git a/css/panel.css b/css/panel.css
new file mode 100644
index 000000000..23b52705e
--- /dev/null
+++ b/css/panel.css
@@ -0,0 +1,37 @@
+body
+  {
+    font-family:       sans-serif;
+    font-size:        10pt;
+    background-color:  white;
+  }
+
+ul
+  {
+    padding-left: 12px;
+  }
+
+radio
+  {
+    -moz-user-select: ignore;
+  }
+
+.text-link
+  {
+    margin-left:      3px;
+  }
+
+.text-link:hover
+  {
+    text-decoration:  underline;
+    cursor:           pointer;
+  }
+
+.descriptive-content
+  {
+    color:            #AAAAAA;
+  }
+
+.descriptive-content[focused=true]
+  {
+    color:            black;
+  }
diff --git a/defparams.pl b/defparams.pl
index 071d41c8d..d5c41dc60 100644
--- a/defparams.pl
+++ b/defparams.pl
@@ -38,7 +38,7 @@ use strict;
 # Shut up misguided -w warnings about "used only once".  For some reason,
 # "use vars" chokes on me when I try it here.
 
-sub bug_form_pl_sillyness {
+sub defparams_pl_sillyness {
     my $zz;
     $zz = %::param_checker;
     $zz = %::param_desc;
@@ -47,13 +47,14 @@ sub bug_form_pl_sillyness {
 
 sub WriteParams {
     foreach my $i (@::param_list) {
-	if (!defined $::param{$i}) {
-	    $::param{$i} = $::param_default{$i};
+        if (!defined $::param{$i}) {
+            $::param{$i} = $::param_default{$i};
             if (!defined $::param{$i}) {
                 die "No default parameter ever specified for $i";
             }
-	}
+        }
     }
+
     my $tmpname = "data/params.$$";
     open(FID, ">$tmpname") || die "Can't create $tmpname";
     my $v = $::param{'version'};
@@ -75,7 +76,7 @@ sub DefParam {
     $::param_type{$id} = $type;
     $::param_default{$id} = $default;
     if (defined $checker) {
-	$::param_checker{$id} = $checker;
+        $::param_checker{$id} = $checker;
     }
 }
 
@@ -83,7 +84,7 @@ sub DefParam {
 sub check_numeric {
     my ($value) = (@_);
     if ($value !~ /^[0-9]+$/) {
-	return "must be a numeric value";
+        return "must be a numeric value";
     }
     return "";
 }
@@ -120,39 +121,33 @@ sub check_shadowdb {
 # b -- A boolean value (either 1 or 0)
 
 DefParam("maintainer",
-	 "The email address of the person who maintains this installation of Bugzilla.",
-	 "t",
+         "The email address of the person who maintains this installation of Bugzilla.",
+         "t",
          'THE MAINTAINER HAS NOT YET BEEN SET');
 
 DefParam("urlbase",
-	 "The URL that is the common initial leading part of all Bugzilla URLs.",
-	 "t",
-	 "http://cvs-mirror.mozilla.org/webtools/bugzilla/",
-	 \&check_urlbase);
+         "The URL that is the common initial leading part of all Bugzilla URLs.",
+         "t",
+         "http://cvs-mirror.mozilla.org/webtools/bugzilla/",
+         \&check_urlbase);
 
 sub check_urlbase {
     my ($url) = (@_);
     if ($url !~ m:^http.*/$:) {
-	return "must be a legal URL, that starts with http and ends with a slash.";
+        return "must be a legal URL, that starts with http and ends with a slash.";
     }
     return "";
 }
 
-DefParam("preferlists",
-	"If this is on, Bugzilla will display most selection options as selection lists. If this is off, Bugzilla will use radio buttons and checkboxes instead.",
-	"b",
-	1);
-
-DefParam("capitalizelists",
-	"If this is on, Bugzilla will capitalize list entries, checkboxes, and radio buttons. If this is off, Bugzilla will leave these items untouched.",
-	"b",
-	0);
-
+DefParam("cookiepath", 
+  "Directory path under your document root that holds your Bugzilla installation. Make sure to begin with a /.",
+  "t",
+  "/");
 
 DefParam("usequip",
-	"If this is on, Bugzilla displays a silly quip at the beginning of buglists, and lets users add to the list of quips.",
-	"b",
-	1);
+        "If this is on, Bugzilla displays a silly quip at the beginning of buglists, and lets users add to the list of quips.",
+        "b",
+        1);
 
 # Added parameter - JMR, 2/16/00
 DefParam("usebuggroups",
@@ -178,27 +173,6 @@ DefParam("queryagainstshadowdb",
          0);
          
 
-DefParam("usedespot",
-         "If this is on, then we are using the Despot system to control our database of users.  Bugzilla won't ever write into the user database, it will let the Despot code maintain that.  And Bugzilla will send the user over to Despot URLs if they need to change their password.  Also, in that case, Bugzilla will treat the passwords stored in the database as being crypt'd, not plaintext.",
-         "b",
-         0);
-
-DefParam("despotbaseurl",
-         "The base URL for despot.  Used only if <b>usedespot</b> is turned on, above.",
-         "t",
-         "http://cvs-mirror.mozilla.org/webtools/despot/despot.cgi",
-         \&check_despotbaseurl);
-
-
-sub check_despotbaseurl {
-    my ($url) = (@_);
-    if ($url !~ /^http.*cgi$/) {
-	return "must be a legal URL, that starts with http and ends with .cgi";
-    }
-    return "";
-}
-
-
 # Adding in four parameters for LDAP authentication.  -JMR, 7/28/00
 DefParam("useLDAP",
          "Turn this on to use an LDAP directory for user authentication ".
@@ -229,113 +203,18 @@ DefParam("LDAPmailattribute",
 #End of LDAP parameters
 
 
-DefParam("headerhtml",
-         "Additional HTML to add to the HEAD area of documents, eg. links to stylesheets.",
-         "l",
-         '');
-
-DefParam("bodyhtml",
-         "Additional parameters to add to the BODY tag at the beginning of documents, eg. background image/colors, link colors, etc",
-         "l",
-         'BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000"');
-
-DefParam("footerhtml",
-         "HTML to add to the bottom of every page. By default it displays the blurbhtml, and %commandmenu%, a menu of useful commands.  You probably really want either headerhtml or footerhtml to include %commandmenu%.",
-         "l",
-         '<TABLE BORDER="0"><TR><TD BGCOLOR="#000000" VALIGN="TOP">
-<TABLE BORDER="0" CELLPADDING="10" CELLSPACING="0" WIDTH="100%" BGCOLOR="lightyellow">
-<TR><TD>
-%blurbhtml%
-<BR>
-%commandmenu%
-</TD></TR></TABLE></TD></TR></TABLE>');
-
-DefParam("errorhtml",
-         "This is what is printed out when a form is improperly filled out.  %errormsg% is replaced by the actual error itself; %<i>anythingelse</i>% gets replaced by the definition of that parameter (as defined on this page).",
-         "l",
-         qq{<TABLE CELLPADDING=20><TR><TD BGCOLOR="#ff0000">
-<FONT SIZE="+2">%errormsg%</FONT></TD></TR></TABLE>
-<P>Please press <B>Back</B> and try again.<P>});
-
-
-
-DefParam("bannerhtml",
-         "The html that gets emitted at the head of every Bugzilla page. 
-Anything of the form %<i>word</i>% gets replaced by the defintion of that 
-word (as defined on this page).",
-         "l",
-         q{<TABLE BGCOLOR="#000000" WIDTH="100%" BORDER=0 CELLPADDING=0 CELLSPACING=0>
-<TR><TD><A HREF="http://www.mozilla.org/"><IMG
- SRC="http://www.mozilla.org/images/mozilla-banner.gif" ALT=""
-BORDER=0 WIDTH=600 HEIGHT=58></A></TD></TR></TABLE>
-<CENTER><FONT SIZE=-1>Bugzilla version %version%
-</FONT></CENTER>});
-
-DefParam("blurbhtml",
-         "A blurb that appears as part of the header of every Bugzilla page.  This is a place to put brief warnings, pointers to one or two related pages, etc.",
-         "l",
-         "This is <B>Bugzilla</B>: the Mozilla bug system.  For more 
-information about what Bugzilla is and what it can do, see 
-<A HREF=\"http://www.mozilla.org/\">mozilla.org</A>'s
-<A HREF=\"http://www.mozilla.org/bugs/\"><B>bug pages</B></A>.");
-
-
-DefParam("mostfreqhtml",
-         "The HTML which appears at the top of the list of most-frequently-reported bugs. Use it to explain the page, set a maintainer etc.",
-         "l",
-         q{
-<br><p>
-
-<b>What are "most frequent bugs"?</b>
-
-<blockquote>The Most Frequent Bugs page lists the known open bugs which 
-are reported most frequently in recent builds of Mozilla. It is automatically
-generated from the Bugzilla database every 24 hours, by counting the number
-of direct and indirect duplicates of bugs.
-This information is provided in order to assist in minimizing
-the amount of duplicate bugs entered into Bugzilla which in turn cuts down
-on development time.
-</blockquote>
-
-<b>How do I use this list?</b>
-
-<ul>
-<li>Review the most frequent bugs list.</li>
-<li>If problem is listed:</li>
-
-<ul>
-<li>Click on Bug # link to confirm that you have found the same bug and comment
-if you have additional information. Or move on with your testing
-of the product.</li>
-</ul>
-
-<li>If problem not listed:</li>
-
-<ul>
-<li>Go to the <a href="query.cgi">Bugzilla Query/Search</a>
-page to try and locate a similar bug that has already been written.</li>
-<li>If you find your bug in Bugzilla, feel free to comment with any new or
-additional data you may have.</li>
-<li>If you cannot find your problem already documented in Bugzilla, go to the
-<a href="http://www.mozilla.org/quality/help/bug-form.html">Bugzilla Helper</a> and post a new bug.</li>
-</ul>
-
-</ul>
-<br>
-});
-
 DefParam("mostfreqthreshold",
          "The minimum number of duplicates a bug needs to show up on the <A HREF=\"duplicates.cgi\">most frequently reported bugs page</a>. If you have a large database and this page takes a long time to load, try increasing this number.",
          "t",
          "2");
 
+
 DefParam("mybugstemplate",
          "This is the URL to use to bring up a simple 'all of my bugs' list for a user.  %userid% will get replaced with the login name of a user.",
          "t",
-         "buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&email1=%userid%&emailtype1=exact&emailassigned_to1=1&emailreporter1=1");
+         "buglist.cgi?bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;email1=%userid%&amp;emailtype1=exact&amp;emailassigned_to1=1&amp;emailreporter1=1");
     
 
-
 DefParam("shutdownhtml",
          "If this field is non-empty, then Bugzilla will be completely disabled and this text will be displayed instead of all the Bugzilla pages.",
          "l",
@@ -449,9 +328,9 @@ You will get this message once a day until you've dealt with these bugs!
 
 
 DefParam("defaultquery",
- 	 "This is the default query that initially comes up when you submit a bug.  It's in URL parameter format, which makes it hard to read.  Sorry!",
-	 "t",
-	 "bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=%22Importance%22");
+          "This is the default query that initially comes up when you submit a bug.  It's in URL parameter format, which makes it hard to read.  Sorry!",
+         "t",
+         "bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&emailassigned_to1=1&emailassigned_to2=1&emailreporter2=1&emailcc2=1&emailqa_contact2=1&order=%22Importance%22");
 
 
 DefParam("letsubmitterchoosepriority",
@@ -478,9 +357,9 @@ DefParam("defaultpriority",
 
 
 DefParam("usetargetmilestone",
-	 "Do you wish to use the Target Milestone field?",
-	 "b",
-	 0);
+         "Do you wish to use the Target Milestone field?",
+         "b",
+         0);
 
 DefParam("nummilestones",
          "If using Target Milestone, how many milestones do you wish to
@@ -501,35 +380,73 @@ DefParam("musthavemilestoneonaccept",
          0);
 
 DefParam("useqacontact",
-	 "Do you wish to use the QA Contact field?",
-	 "b",
-	 0);
+         "Do you wish to use the QA Contact field?",
+         "b",
+         0);
 
 DefParam("usestatuswhiteboard",
-	 "Do you wish to use the Status Whiteboard field?",
-	 "b",
-	 0);
+         "Do you wish to use the Status Whiteboard field?",
+         "b",
+         0);
 
 DefParam("usebrowserinfo",
-	 "Do you want bug reports to be assigned an OS & Platform based on the browser
-	  the user makes the report from?",
-	 "b",
-	 1);
+         "Do you want bug reports to be assigned an OS & Platform based on the browser
+          the user makes the report from?",
+         "b",
+         1);
 
 DefParam("usedependencies",
          "Do you wish to use dependencies (allowing you to mark which bugs depend on which other ones)?",
          "b",
          1);
 
+DefParam("usevotes",
+         "Do you wish to allow users to vote for bugs? Note that in order for this to be effective, you will have to change the maximum votes allowed in a product to be non-zero in <a href=\"editproducts.cgi\">the product edit page</a>.",
+         "b",
+         1);
+
 DefParam("webdotbase",
-         "This is the URL prefix that is common to all requests for webdot.  The <a href=\"http://www.research.att.com/~north/cgi-bin/webdot.cgi\">webdot package</a> is a very swell thing that generates pictures of graphs.  If you have an installation of bugsplat that hides behind a firewall, then to get graphs to work, you will have to install a copy of webdot behind your firewall, and change this path to match.  Also, webdot has some trouble with software domain names, so you may have to play games and hack the %urlbase% part of this.  If this all seems like too much trouble, you can set this paramater to be the empty string, which will cause the graphing feature to be disabled entirely.",
+         "It is possible to show graphs of dependent bugs. You may set this parameter to
+any of the following:
+<ul>
+<li>A complete file path to \'dot\' (part of <a
+href=\"http://www.graphviz.org\">GraphViz</a>) will generate the graphs
+locally.</li>
+<li>A URL prefix pointing to an installation of the <a
+href=\"http://www.research.att.com/~north/cgi-bin/webdot.cgi\">webdot
+package</a> will generate the graphs remotely.</li>
+<li>A blank value will disable dependency graphing.</li>
+</ul>
+The default value is a publically-accessible webdot server. If you change
+this value, make certain that the webdot server can read files from your
+data/webdot directory. On Apache you do this by editing the .htaccess file,
+for other systems the needed measures may vary. You can run checksetup.pl
+to recreate the .htaccess file if it has been lost.",
          "t",
-         "http://www.research.att.com/~north/cgi-bin/webdot.cgi/%urlbase%");
+         "http://www.research.att.com/~north/cgi-bin/webdot.cgi/%urlbase%",
+         \&check_webdotbase);
 
-DefParam("entryheaderhtml",
-         "This is a special header for the bug entry page. The text will be printed after the page header, before the bug entry form. It is meant to be a place to put pointers to intructions on how to enter bugs.",
-         "l",
-         '<A HREF="bugwritinghelp.html">Bug writing guidelines</A>');
+sub check_webdotbase {
+    my ($value) = (@_);
+    $value = trim($value);
+    if ($value eq "") {
+        return "";
+    }
+    if($value !~ /^https?:/) {
+        if(! -x $value) {
+            return "The file path \"$value\" is not a valid executable.  Please specify the complete file path to 'dot' if you intend to generate graphs locally.";
+        }
+        # Check .htaccess allows access to generated images
+        if(-e "data/webdot/.htaccess") {
+            open HTACCESS, "data/webdot/.htaccess";
+            if(! grep(/png/,<HTACCESS>)) {
+                print "Dependency graph images are not accessible.\nDelete data/webdot/.htaccess and re-run checksetup.pl to rectify.\n";
+            }
+            close HTACCESS;
+        }
+    }
+    return "";
+}
 
 DefParam("expectbigqueries",
          "If this is on, then we will tell mysql to <tt>set option SQL_BIG_TABLES=1</tt> before doing queries on bugs.  This will be a little slower, but one will not get the error <tt>The table ### is full</tt> for big queries that require a big temporary table.",
@@ -537,9 +454,9 @@ DefParam("expectbigqueries",
          0);
 
 DefParam("emailregexp",
-         'This defines the regexp to use for legal email addresses.  The default tries to match fully qualified email addresses.  Another popular value to put here is <tt>^[^@]*$</tt>, which means "local usernames, no @ allowed.',
+         'This defines the regexp to use for legal email addresses.  The default tries to match fully qualified email addresses.  Another popular value to put here is <tt>^[^@]+$</tt>, which means "local usernames, no @ allowed."',
          "t",
-         q:^[^@]*@[^@]*\\.[^@]*$:);
+         q:^[^@]+@[^@]+\\.[^@]+$:);
 
 DefParam("emailregexpdesc",
          "This describes in english words what kinds of legal addresses are allowed by the <tt>emailregexp</tt> param.",
@@ -576,20 +493,19 @@ DefParam("allowbugdeletion",
          0);
 
 
-DefParam("allowuserdeletion",
-         q{The pages to edit users can also let you delete a user.  But there is no code that goes and cleans up any references to that user in other tables, so such deletions are kinda scary.  So, you have to turn on this option before any such deletions will ever happen.},
+DefParam("allowemailchange",
+         q{Users can change their own email address through the preferences.  Note that the change is validated by emailing both addresses, so switching this option on will not let users use an invalid address.},
          "b",
          0);
 
 
-DefParam("strictvaluechecks",
-         "Do stricter integrity checking on both form submission values and values read in from the database.",
+DefParam("allowuserdeletion",
+         q{The pages to edit users can also let you delete a user.  But there is no code that goes and cleans up any references to that user in other tables, so such deletions are kinda scary.  So, you have to turn on this option before any such deletions will ever happen.},
          "b",
          0);
 
-
 DefParam("browserbugmessage",
-         "If strictvaluechecks is on, and the bugzilla gets unexpected data from the browser, in addition to displaying the cause of the problem, it will output this HTML as well.",
+         "If bugzilla gets unexpected data from the browser, in addition to displaying the cause of the problem, it will output this HTML as well.",
          "l",
          "this may indicate a bug in your browser.\n");
 
@@ -635,7 +551,7 @@ DefParam("supportwatchers",
 DefParam("move-enabled",
          "If this is on, Bugzilla will allow certain people to move bugs to the defined database.",
          "b",
-	 0);
+         0);
 DefParam("move-button-text",
          "The text written on the Move button. Explain where the bug is being moved to.",
          "t",
@@ -667,4 +583,28 @@ DefParam("moved-default-component",
          "t",
          '');
 
+# The maximum size (in bytes) for patches and non-patch attachments.
+# The default limit is 1000KB, which is 24KB less than mysql's default
+# maximum packet size (which determines how much data can be sent in a
+# single mysql packet and thus how much data can be inserted into the
+# database) to provide breathing space for the data in other fields of
+# the attachment record as well as any mysql packet overhead (I don't
+# know of any, but I suspect there may be some.)
+
+DefParam("maxpatchsize",
+         "The maximum size (in kilobytes) of patches.  Bugzilla will not 
+          accept patches greater than this number of kilobytes in size.
+          To accept patches of any size (subject to the limitations of 
+          your server software), set this value to zero." ,
+         "t",
+         '1000');
+
+DefParam("maxattachmentsize" , 
+         "The maximum size (in kilobytes) of non-patch attachments.  Bugzilla 
+          will not accept attachments greater than this number of kilobytes 
+          in size.  To accept attachments of any size (subject to the
+          limitations of your server software), set this value to zero." , 
+         "t" , 
+         '1000');
+
 1;
diff --git a/describecomponents.cgi b/describecomponents.cgi
index 95f5ba316..2f723757e 100755
--- a/describecomponents.cgi
+++ b/describecomponents.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -19,128 +19,112 @@
 # Rights Reserved.
 #
 # Contributor(s): Terry Weissman <terry@mozilla.org>
+#                 Bradley Baetz <bbaetz@student.usyd.edu.au>
 
-use vars %::FORM;
+use vars qw(
+  %FORM
+  $userid
+);
 
 use diagnostics;
 use strict;
 
+use lib qw(.);
+
 require "CGI.pl";
 
 ConnectToDatabase();
+quietly_check_login();
+
 GetVersionTable();
 
-quietly_check_login();
+if (!defined $::FORM{'product'}) {
+    # Reference to a subset of %::proddesc, which the user is allowed to see
+    my %products;
+
+    if (Param("usebuggroups")) {
+        # OK, now only add products the user can see
+        confirm_login() unless $::userid;
+        foreach my $p (@::legal_product) {
+            if (!GroupExists($p) || UserInGroup($p)) {
+                $products{$p} = $::proddesc{$p};
+            }
+        }
+    }
+    else {
+          %products = %::proddesc;
+    }
 
-######################################################################
-# Begin Data/Security Validation
-######################################################################
+    my $prodsize = scalar(keys %products);
+    if ($prodsize == 0) {
+        DisplayError("Either no products have been defined ".
+                     "or you have not been given access to any.\n");
+        exit;
+    }
+    elsif ($prodsize > 1) {
+        $::vars->{'proddesc'} = \%products;
+        $::vars->{'target'} = "describecomponents.cgi";
+        $::vars->{'title'} = "Bugzilla component description";
+        $::vars->{'h2'} = 
+          "Please specify the product whose components you want described.";
+
+        print "Content-type: text/html\n\n";
+        $::template->process("global/choose-product.html.tmpl", $::vars)
+          || ThrowTemplateError($::template->error());
+        exit;
+    }
 
-# If this installation uses bug groups to restrict access to products,
-# only show the user products that don't have their own bug group or
-# those whose bug group the user is a member of.  Otherwise, if this 
-# installation doesn't use bug groups, show the user all legal products.
-my @products;
-if ( Param("usebuggroups") ) {
-  @products = grep( !GroupExists($_) || UserInGroup($_) , @::legal_product );
-} else {
-  @products = @::legal_product;
+    $::FORM{'product'} = (keys %products)[0];
 }
 
-if ( defined $::FORM{'product'} ) {
-  # Make sure the user specified a valid product name.  Note that
-  # if the user specifies a valid product name but is not authorized
-  # to access that product, they will receive a different error message
-  # which could enable people guessing product names to determine
-  # whether or not certain products exist in Bugzilla, even if they
-  # cannot get any other information about that product.
-  grep( $::FORM{'product'} eq $_ , @::legal_product )
-    || DisplayError("The product name is invalid.")
-    && exit;
-
-  # Make sure the user is authorized to access this product.
-  if ( Param("usebuggroups") && GroupExists($::FORM{'product'}) ) {
-    UserInGroup($::FORM{'product'})
+my $product = $::FORM{'product'};
+
+# Make sure the user specified a valid product name.  Note that
+# if the user specifies a valid product name but is not authorized
+# to access that product, they will receive a different error message
+# which could enable people guessing product names to determine
+# whether or not certain products exist in Bugzilla, even if they
+# cannot get any other information about that product.
+grep($product eq $_ , @::legal_product)
+  || DisplayError("The product name is invalid.")
+  && exit;
+
+# Make sure the user is authorized to access this product.
+if (Param("usebuggroups") && GroupExists($product)) {
+    confirm_login() unless $::userid;
+    UserInGroup($product)
       || DisplayError("You are not authorized to access that product.")
-      && exit;
-  }
+        && exit;
 }
 
 ######################################################################
 # End Data/Security Validation
 ######################################################################
 
-print "Content-type: text/html\n\n";
-
-my $product = $::FORM{'product'};
-if (!defined $product || lsearch(\@products, $product) < 0) {
-
-    PutHeader("Bugzilla component description");
-    print "
-<FORM>
-Please specify the product whose components you want described.
-<P>
-Product: <SELECT NAME=product>
-";
-    print make_options(\@products);
-    print "
-</SELECT>
-<P>
-<INPUT TYPE=\"submit\" VALUE=\"Submit\">
-</FORM>
-";
-    PutFooter();
-    exit;
-}
-
-
-PutHeader("Bugzilla component description", "Bugzilla component description",
-          $product);
+my @components;
+SendSQL("SELECT value, initialowner, initialqacontact, description FROM " .
+        "components WHERE program = " . SqlQuote($product) . " ORDER BY " .
+        "value");
+while (MoreSQLData()) {
+    my ($name, $initialowner, $initialqacontact, $description) =
+      FetchSQLData();
 
-print "
-<TABLE>
-<tr>
-<th align=left>Component</th>
-<th align=left>Default owner</th>
-";
+    my %component;
 
-my $useqacontact = Param("useqacontact");
+    $component{'name'} = $name;
+    $component{'initialowner'} = $initialowner ?
+      DBID_to_name($initialowner) : '';
+    $component{'initialqacontact'} = $initialqacontact ?
+      DBID_to_name($initialqacontact) : '';
+    $component{'description'} = $description;
 
-my $cols = 2;
-if ($useqacontact) {
-    print "<th align=left>Default qa contact</th>";
-    $cols++;
+    push @components, \%component;
 }
 
-my $colbut1 = $cols - 1;
-
-print "</tr>";
-
-SendSQL("select value, initialowner, initialqacontact, description from components where program = " . SqlQuote($product) . " order by value");
+$::vars->{'product'} = $product;
+$::vars->{'components'} = \@components;
 
-my @data;
-while (MoreSQLData()) {
-    push @data, [FetchSQLData()];
-}
-foreach (@data) {
-    my ($component, $initialownerid, $initialqacontactid, $description) = @$_;
-
-    my ($initialowner, $initialqacontact) = ($initialownerid ? DBID_to_name ($initialownerid) : '',
-                                             $initialqacontactid ? DBID_to_name ($initialqacontactid) : '');
-
-    print qq|
-<tr><td colspan=$cols><hr></td></tr>
-<tr><td rowspan=2>$component</td>
-<td><a href="mailto:$initialowner">$initialowner</a></td>
-|;
-    if ($useqacontact) {
-        print qq|
-<td><a href="mailto:$initialqacontact">$initialqacontact</a></td>
-|;
-    }
-    print "</tr><tr><td colspan=$colbut1>$description</td></tr>\n";
-}
-
-print "<tr><td colspan=$cols><hr></td></tr></table>\n";
+print "Content-type: text/html\n\n";
+$::template->process("reports/components.html.tmpl", $::vars)
+  || ThrowTemplateError($::template->error());
 
-PutFooter();
diff --git a/describekeywords.cgi b/describekeywords.cgi
index c80158267..503e0d5a3 100755
--- a/describekeywords.cgi
+++ b/describekeywords.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -19,70 +19,40 @@
 # Rights Reserved.
 #
 # Contributor(s): Terry Weissman <terry@mozilla.org>
+# Contributor(s): Gervase Markham <gerv@gerv.net>
 
 use diagnostics;
 use strict;
+use lib ".";
 
 require "CGI.pl";
 
-ConnectToDatabase();
-
-print "Content-type: text/html\n\n";
-
-PutHeader("Bugzilla keyword description");
+# Use the global template variables. 
+use vars qw($vars $template);
 
-my $tableheader = qq{
-<TABLE BORDER=1 CELLPADDING=4 CELLSPACING=0>
-<TR BGCOLOR="#6666FF">
-<TH ALIGN="left">Name</TH>
-<TH ALIGN="left">Description</TH>
-<TH ALIGN="left">Bugs</TH>
-</TR>
-};
+ConnectToDatabase();
 
-print $tableheader;
-my $line_count = 0;
-my $max_table_size = 50;
+quietly_check_login();
 
 SendSQL("SELECT keyworddefs.name, keyworddefs.description, 
-                COUNT(keywords.bug_id), keywords.bug_id
+                COUNT(keywords.bug_id)
          FROM keyworddefs LEFT JOIN keywords ON keyworddefs.id=keywords.keywordid
          GROUP BY keyworddefs.id
          ORDER BY keyworddefs.name");
 
-while (MoreSQLData()) {
-    my ($name, $description, $bugs, $onebug) = FetchSQLData();
-    if ($bugs && $onebug) {
-        # This 'onebug' stuff is silly hackery for old versions of
-        # MySQL that seem to return a count() of 1 even if there are
-        # no matching.  So, we ask for an actual bug number.  If it
-        # can't find any bugs that match the keyword, then we set the
-        # count to be zero, ignoring what it had responded.
-        my $q = url_quote($name);
-        $bugs = qq{<A HREF="buglist.cgi?keywords=$q">$bugs</A>};
-    } else {
-        $bugs = "none";
-    }
-    if ($line_count == $max_table_size) {
-        print "</table>\n$tableheader";
-        $line_count = 0;
-    }
-    $line_count++;
-    print qq{
-<TR>
-<TH>$name</TH>
-<TD>$description</TD>
-<TD ALIGN="right">$bugs</TD>
-</TR>
-};
-}
-
-print "</TABLE><P>\n";
-
-quietly_check_login();
+my @keywords;
 
-if (UserInGroup("editkeywords")) {
-    print "<p><a href=editkeywords.cgi>Edit keywords</a><p>\n";
+while (MoreSQLData()) {
+    my ($name, $description, $bugs) = FetchSQLData();
+   
+    push (@keywords, { name => $name, 
+                       description => $description,
+                       bugcount => $bugs });
 }
+   
+$vars->{'keywords'} = \@keywords;
+$vars->{'caneditkeywords'} = UserInGroup("editkeywords");
 
-PutFooter();
+print "Content-type: text/html\n\n";
+$template->process("reports/keywords.html.tmpl", $vars)
+  || ThrowTemplateError($template->error());
diff --git a/docs/CVS/Entries b/docs/CVS/Entries
index 2dbff5207..3effe51fa 100644
--- a/docs/CVS/Entries
+++ b/docs/CVS/Entries
@@ -1,5 +1,5 @@
-/README.docs/1.3/Wed Aug 22 03:44:14 2001//TBUGZILLA-2_14_5
-/rel_notes.txt/1.5.10.10/Thu Jan  2 15:09:12 2003//TBUGZILLA-2_14_5
+/README.docs/1.6/Wed May  1 09:24:40 2002//TBUGZILLA-2_16
+/rel_notes.txt/1.10.2.10/Sat Jul 27 22:30:20 2002//TBUGZILLA-2_16
 D/html////
 D/images////
 D/sgml////
diff --git a/docs/CVS/Tag b/docs/CVS/Tag
index cc64cc0c3..f2ec6389c 100644
--- a/docs/CVS/Tag
+++ b/docs/CVS/Tag
@@ -1 +1 @@
-NBUGZILLA-2_14_5
+NBUGZILLA-2_16
diff --git a/docs/README.docs b/docs/README.docs
index 4ccd7044d..80349957f 100644
--- a/docs/README.docs
+++ b/docs/README.docs
@@ -62,19 +62,19 @@ rpms:
 
 openjade
 jadetex
-docbook-dtd41-sgml
+docbook-dtds
 docbook-style-dsssl
-docbook-dtd31-sgml
 docbook-style-dsssl-doc
+docbook-utils
 xemacs
 psgml
 sgml-tools
 sgml-common
 
-Set up environment:
 
-in your .bashrc add this line (after installing above RPMS):
-export SGML_CATALOG_FILES=/etc/sgml/catalog
+If you're getting these from RedHat, make sure you get the ones in the
+rawhide area.  The ones in the 7.2 distribution are too old and don't
+include the XML stuff.
 
 Download "ldp.dsl" from the Resources page on linuxdoc.org.  This is the 
 stylesheet I use to get the HTML and text output.  It works well, and has a 
@@ -83,47 +83,67 @@ adjust the paths in ldp.dsl at the top of the file to reflect the actual
 locations of your docbook catalog files.  I created a directory, 
 /usr/share/sgml/docbook/ldp, and put the ldp.dsl file there.  I then edited 
 ldp.dsl and changed two lines near the top:
-<!ENTITY docbook.dsl SYSTEM "../dsssl-stylesheets-1.62/html/docbook.dsl" CDATA 
+<!ENTITY docbook.dsl SYSTEM "../dsssl-stylesheets/html/docbook.dsl" CDATA 
 dsssl>
 ...and...
-<!ENTITY docbook.dsl SYSTEM "../dsssl-stylesheets-1.62/print/docbook.dsl" CDATA
+<!ENTITY docbook.dsl SYSTEM "../dsssl-stylesheets/print/docbook.dsl" CDATA
 dsssl>
 
 Note the difference is the top one points to the HTML docbook stylesheet, 
 and the next one points to the PRINT docbook stylesheet.
 
-  You know, this sure looks awful involved.  Anyway, once you have this in 
+  You know, this sure looks awful involved.  Anyway, once you have this in
 place, add to your .bashrc:
+export SGML_CATALOG_FILES=/etc/sgml/catalog
 export LDP_HOME=/usr/share/sgml/docbook/ldp
+export JADE_PUB=/usr/share/doc/openjade-1.3.1/pubtext
+
+or in .tcshrc:
+setenv SGML_CATALOG_FILES /etc/sgml/catalog
+setenv LDP_HOME /usr/share/sgml/docbook/ldp
+setenv JADE_PUB /usr/share/doc/openjade-1.3.1/pubtext
+
+  If you have root access and want to set this up for anyone on your box,
+you can add those lines to /etc/profile for bash users and /etc/csh.login
+for tcsh users.
+
+  Make sure you edit the paths in the above environment variables if those
+folders are anywhere else on your system (for example, the openjade version
+might change if you get a new version at some point).
 
   I suggest xemacs for editing your SGML/XML Docbook documents.  The darn
-thing just works, and generally includes PSGML mode by default.  You can
-download psgml at http://www.sourceforge.net/projects/psgml.
+thing just works, and generally includes PSGML mode by default.  Not to
+mention you can validate the SGML from right within it without having to
+remember the command-line syntax for nsgml (not that it's that hard
+anyway).  If not, you can download psgml at
+http://www.sourceforge.net/projects/psgml.
 
 ==========
 NOTES:
 ==========
 
   Here are the commands I use to maintain this documentation.
-  You MUST have DocBook 4.1 set up correctly in order for this to work.
-  Substitute your own path to "ldp.dsl" for "$LDP_HOME".
-
+  You MUST have DocBook 4.1.2 set up correctly in order for this to work.
 
 To create HTML documentation:
 bash$ cd html
 bash$ jade -t sgml -i html -d $LDP_HOME/ldp.dsl\#html \
-../sgml/Bugzilla-Guide.sgml
+$JADE_PUB/xml.dcl ../sgml/Bugzilla-Guide.sgml
 
 To create HTML documentation as a single big HTML file:
 bash$ cd html
 bash$ jade -V nochunks -t sgml -i html -d $LDP_HOME/ldp.dsl\#html \
-../sgml/Bugzilla-Guide.sgml >Bugzilla-Guide.html
+$JADE_PUB/xml.dcl ../sgml/Bugzilla-Guide.sgml >Bugzilla-Guide.html
 
 To create TXT documentation as a single big TXT file:
 bash$ cd txt
 bash$ lynx -dump -nolist ../html/Bugzilla-Guide.html >Bugzilla-Guide.txt
 
+
 Sincerely,
  Matthew P. Barnson
  The Bugzilla "Doc Knight"
- barnboy@trilobyte.net
+ mbarnson@sisna.com
+
+ with major edits by Dave Miller <justdave@syndicomm.com> based on
+ experience setting this up on the Landfill test server.
diff --git a/docs/html/Bugzilla-Guide.html b/docs/html/Bugzilla-Guide.html
index ca916f417..66bb333ec 100644
--- a/docs/html/Bugzilla-Guide.html
+++ b/docs/html/Bugzilla-Guide.html
@@ -4,7 +4,7 @@
 >The Bugzilla Guide</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><META
 NAME="KEYWORD"
 CONTENT="Bugzilla"><META
@@ -25,7 +25,7 @@ CONTENT="Mozilla"><META
 NAME="KEYWORD"
 CONTENT="webtools"></HEAD
 ><BODY
-CLASS="BOOK"
+CLASS="book"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -34,180 +34,43 @@ ALINK="#0000FF"
 ><DIV
 CLASS="BOOK"
 ><A
-NAME="INDEX"
-></A
-><DIV
+NAME="index"><DIV
 CLASS="TITLEPAGE"
 ><H1
-CLASS="TITLE"
+CLASS="title"
 ><A
-NAME="AEN2"
->The Bugzilla Guide</A
-></H1
+NAME="AEN2">The Bugzilla Guide</H1
 ><H3
-CLASS="AUTHOR"
+CLASS="author"
 ><A
-NAME="AEN27"
->Matthew P. Barnson</A
-></H3
-><DIV
-CLASS="AFFILIATION"
-><DIV
-CLASS="ADDRESS"
-><P
-CLASS="ADDRESS"
->barnboy@trilobyte.net</P
-></DIV
-></DIV
-><SPAN
-CLASS="COLLAB"
-><SPAN
-CLASS="COLLABNAME"
->Zach Lipton</SPAN
-><DIV
-CLASS="AFFILIATION"
-><DIV
-CLASS="ADDRESS"
-><P
-CLASS="ADDRESS"
->zach AT zachlipton DOT com</P
-></DIV
-></DIV
-><BR></SPAN
-><DIV
-CLASS="REVHISTORY"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-><TR
-><TH
-ALIGN="LEFT"
-VALIGN="TOP"
-COLSPAN="3"
-><B
->Revision History</B
-></TH
-></TR
-><TR
-><TD
-ALIGN="LEFT"
->Revision v2.11</TD
-><TD
-ALIGN="LEFT"
->20 December 2000</TD
-><TD
-ALIGN="LEFT"
->Revised by: MPB</TD
-></TR
-><TR
-><TD
-ALIGN="LEFT"
-COLSPAN="3"
->Converted the README, FAQ, and DATABASE information into
-	  SGML docbook format.</TD
-></TR
-><TR
-><TD
-ALIGN="LEFT"
->Revision 2.11.1</TD
-><TD
-ALIGN="LEFT"
->06 March 2001</TD
-><TD
-ALIGN="LEFT"
->Revised by: MPB</TD
-></TR
-><TR
-><TD
-ALIGN="LEFT"
-COLSPAN="3"
->Took way too long to revise this for 2.12 release. Updated
-	  FAQ to use qandaset tags instead of literallayout, cleaned
-	  up administration section, added User Guide section,
-	  miscellaneous FAQ updates and third-party integration
-	  information. From this point on all new tags are lowercase
-	  in preparation for the 2.13 release of the Guide in XML
-	  format instead of SGML.</TD
-></TR
-><TR
-><TD
-ALIGN="LEFT"
->Revision 2.12.0</TD
-><TD
-ALIGN="LEFT"
->24 April 2001</TD
-><TD
-ALIGN="LEFT"
->Revised by: MPB</TD
-></TR
-><TR
-><TD
-ALIGN="LEFT"
-COLSPAN="3"
->Things fixed this release: Elaborated on queryhelp
-	  interface, added FAQ regarding moving bugs from one keyword
-	  to another, clarified possible problems with the Landfill
-	  tutorial, fixed a boatload of typos and unclear sentence
-	  structures.  Incorporated the README into the UNIX
-	  installation section, and changed the README to indicate the
-	  deprecated status.  Things I know need work:  Used
-	  "simplelist" a lot, where I should have used "procedure" to
-	  tag things.  Need to lowercase all tags to be XML compliant.</TD
-></TR
-><TR
-><TD
-ALIGN="LEFT"
->Revision 2.14.0</TD
-><TD
-ALIGN="LEFT"
->07 August 2001</TD
-><TD
-ALIGN="LEFT"
->Revised by: MPB</TD
-></TR
-><TR
-><TD
-ALIGN="LEFT"
-COLSPAN="3"
->Attempted to integrate relevant portions of the UNIX and
-	  Windows installation instructions, moved some data from FAQ
-	  to Install, removed references to README from text, added
-	  Mac OS X install instructions, fixed a bunch
-	  of tpyos (Mark Harig), linked text that referenced other
-	  parts of the Guide, and nuked the old MySQL permissions
-	  section.</TD
-></TR
-></TABLE
-></DIV
+NAME="AEN5">Matthew P. Barnson</H3
+><H3
+CLASS="author"
+><A
+NAME="AEN9">The Bugzilla Team</H3
 ><DIV
 ><DIV
-CLASS="ABSTRACT"
+CLASS="abstract"
 ><A
-NAME="AEN39"
-></A
-><P
+NAME="AEN13"><P
 ></P
 ><P
->	This is the documentation for Bugzilla, the Mozilla
-	bug-tracking system.
-      </P
-><P
->	Bugzilla is an enterprise-class set of software utilities
-	that, when used together, power issue-tracking for hundreds of
-	organizations around the world, tracking millions of bugs.
-	While it is easy to use and quite flexible, it is very
-	difficult for a novice to install and maintain.  Although we
-	have provided step-by-step directions, Bugzilla is not always
-	easy to get working.  Please be sure the person responsible
-	for installing and maintaining this software is a qualified
-	professional on operating system upon which you install
-	Bugzilla.
+>&#13;	      This is the documentation for Bugzilla, the mozilla.org
+	      bug-tracking system.
+	      Bugzilla is an enterprise-class piece of software
+	      that powers issue-tracking for hundreds of
+	      organizations around the world, tracking millions of bugs.
       </P
 ><P
->	THIS DOCUMENTATION IS MAINTAINED IN DOCBOOK 4.1 SGML FORMAT.
-	IF YOU WISH TO MAKE CORRECTIONS, PLEASE MAKE THEM IN PLAIN
-	TEXT OR SGML DIFFS AGAINST THE SOURCE.  I CANNOT ACCEPT
-	ADDITIONS TO THE GUIDE WRITTEN IN HTML!
+>  
+	      This documentation is maintained in DocBook 4.1.2 XML format.
+        Changes are best submitted as plain text or SGML diffs, attached
+        to a bug filed in
+        <A
+HREF="http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla&component=Documentation"
+TARGET="_top"
+>mozilla.org's Bugzilla</A
+>.
       </P
 ><P
 ></P
@@ -223,885 +86,305 @@ CLASS="TOC"
 ></DT
 ><DT
 >1. <A
-HREF="#ABOUT"
+HREF="#about"
 >About This Guide</A
 ></DT
 ><DD
 ><DL
 ><DT
 >1.1. <A
-HREF="#ABOUTTHISGUIDE"
->Purpose and Scope of this Guide</A
-></DT
-><DT
->1.2. <A
-HREF="#COPYRIGHT"
+HREF="#copyright"
 >Copyright Information</A
 ></DT
 ><DT
->1.3. <A
-HREF="#DISCLAIMER"
+>1.2. <A
+HREF="#disclaimer"
 >Disclaimer</A
 ></DT
 ><DT
->1.4. <A
-HREF="#NEWVERSIONS"
+>1.3. <A
+HREF="#newversions"
 >New Versions</A
 ></DT
 ><DT
->1.5. <A
-HREF="#CREDITS"
+>1.4. <A
+HREF="#credits"
 >Credits</A
 ></DT
 ><DT
->1.6. <A
-HREF="#CONTRIBUTORS"
->Contributors</A
-></DT
-><DT
->1.7. <A
-HREF="#FEEDBACK"
->Feedback</A
-></DT
-><DT
->1.8. <A
-HREF="#TRANSLATIONS"
->Translations</A
-></DT
-><DT
->1.9. <A
-HREF="#CONVENTIONS"
+>1.5. <A
+HREF="#conventions"
 >Document Conventions</A
 ></DT
 ></DL
 ></DD
 ><DT
 >2. <A
-HREF="#USING"
->Using Bugzilla</A
+HREF="#introduction"
+>Introduction</A
 ></DT
 ><DD
 ><DL
 ><DT
 >2.1. <A
-HREF="#WHATIS"
+HREF="#whatis"
 >What is Bugzilla?</A
 ></DT
 ><DT
 >2.2. <A
-HREF="#WHY"
+HREF="#why"
 >Why Should We Use Bugzilla?</A
 ></DT
-><DT
->2.3. <A
-HREF="#HOW"
->How do I use Bugzilla?</A
-></DT
-><DD
-><DL
-><DT
->2.3.1. <A
-HREF="#MYACCOUNT"
->Create a Bugzilla Account</A
-></DT
-><DT
->2.3.2. <A
-HREF="#QUERY"
->The Bugzilla Query Page</A
-></DT
-><DT
->2.3.3. <A
-HREF="#BUGREPORTS"
->Creating and Managing Bug Reports</A
-></DT
-><DD
-><DL
-><DT
->2.3.3.1. <A
-HREF="#BUG_WRITING"
->Writing a Great Bug Report</A
-></DT
-><DT
->2.3.3.2. <A
-HREF="#BUG_MANAGE"
->Managing your Bug Reports</A
-></DT
-></DL
-></DD
 ></DL
 ></DD
 ><DT
->2.4. <A
-HREF="#INIT4ME"
->Where can I find my user preferences?</A
-></DT
-><DD
-><DL
-><DT
->2.4.1. <A
-HREF="#ACCOUNTSETTINGS"
->Account Settings</A
-></DT
-><DT
->2.4.2. <A
-HREF="#EMAILSETTINGS"
->Email Settings</A
+>3. <A
+HREF="#using"
+>Using Bugzilla</A
 ></DT
 ><DD
 ><DL
 ><DT
->2.4.2.1. <A
-HREF="#NOTIFICATION"
->Email Notification</A
-></DT
-><DT
->2.4.2.2. <A
-HREF="#NEWEMAILTECH"
->New Email Technology</A
-></DT
-><DT
->2.4.2.3. <A
-HREF="#WATCHSETTINGS"
->"Watching" Users</A
-></DT
-></DL
-></DD
-><DT
->2.4.3. <A
-HREF="#FOOTERSETTINGS"
->Page Footer</A
+>3.1. <A
+HREF="#how"
+>How do I use Bugzilla?</A
 ></DT
 ><DT
->2.4.4. <A
-HREF="#PERMISSIONSETTINGS"
->Permissions</A
+>3.2. <A
+HREF="#hintsandtips"
+>Hints and Tips</A
 ></DT
-></DL
-></DD
 ><DT
->2.5. <A
-HREF="#USINGBZ-CONC"
->Using Bugzilla-Conclusion</A
+>3.3. <A
+HREF="#userpreferences"
+>User Preferences</A
 ></DT
 ></DL
 ></DD
 ><DT
->3. <A
-HREF="#INSTALLATION"
+>4. <A
+HREF="#installation"
 >Installation</A
 ></DT
 ><DD
 ><DL
 ><DT
->3.1. <A
-HREF="#ERRATA"
->ERRATA</A
-></DT
-><DT
->3.2. <A
-HREF="#STEPBYSTEP"
+>4.1. <A
+HREF="#stepbystep"
 >Step-by-step Install</A
 ></DT
-><DD
-><DL
-><DT
->3.2.1. <A
-HREF="#AEN509"
->Introduction</A
-></DT
-><DT
->3.2.2. <A
-HREF="#AEN515"
->Installing the Prerequisites</A
-></DT
-><DT
->3.2.3. <A
-HREF="#INSTALL-MYSQL"
->Installing MySQL Database</A
-></DT
-><DT
->3.2.4. <A
-HREF="#INSTALL-PERL"
->Perl (5.004 or greater)</A
-></DT
 ><DT
->3.2.5. <A
-HREF="#AEN602"
->DBI Perl Module</A
-></DT
-><DT
->3.2.6. <A
-HREF="#AEN640"
->Data::Dumper Perl Module</A
+>4.2. <A
+HREF="#extraconfig"
+>Optional Additional Configuration</A
 ></DT
 ><DT
->3.2.7. <A
-HREF="#AEN645"
->MySQL related Perl Module Collection</A
+>4.3. <A
+HREF="#win32"
+>Win32 Installation Notes</A
 ></DT
 ><DT
->3.2.8. <A
-HREF="#AEN654"
->TimeDate Perl Module Collection</A
+>4.4. <A
+HREF="#osx"
+>Mac OS X Installation Notes</A
 ></DT
 ><DT
->3.2.9. <A
-HREF="#AEN658"
->GD Perl Module (1.8.3)</A
+>4.5. <A
+HREF="#troubleshooting"
+>Troubleshooting</A
 ></DT
+></DL
+></DD
 ><DT
->3.2.10. <A
-HREF="#AEN667"
->Chart::Base Perl Module (0.99c)</A
+>5. <A
+HREF="#administration"
+>Administering Bugzilla</A
 ></DT
+><DD
+><DL
 ><DT
->3.2.11. <A
-HREF="#AEN671"
->DB_File Perl Module</A
+>5.1. <A
+HREF="#parameters"
+>Bugzilla Configuration</A
 ></DT
 ><DT
->3.2.12. <A
-HREF="#AEN674"
->HTTP Server</A
+>5.2. <A
+HREF="#useradmin"
+>User Administration</A
 ></DT
 ><DT
->3.2.13. <A
-HREF="#AEN692"
->Installing the Bugzilla Files</A
+>5.3. <A
+HREF="#programadmin"
+>Product, Component, Milestone, and Version Administration</A
 ></DT
 ><DT
->3.2.14. <A
-HREF="#AEN721"
->Setting Up the MySQL Database</A
+>5.4. <A
+HREF="#voting"
+>Voting</A
 ></DT
 ><DT
->3.2.15. <A
-HREF="#AEN768"
->Tweaking <TT
-CLASS="FILENAME"
->localconfig</TT
-></A
+>5.5. <A
+HREF="#groups"
+>Groups and Group Security</A
 ></DT
 ><DT
->3.2.16. <A
-HREF="#AEN806"
->Setting Up Maintainers Manually (Optional)</A
+>5.6. <A
+HREF="#security"
+>Bugzilla Security</A
 ></DT
 ><DT
->3.2.17. <A
-HREF="#AEN817"
->The Whining Cron (Optional)</A
+>5.7. <A
+HREF="#cust-templates"
+>Template Customisation</A
 ></DT
 ><DT
->3.2.18. <A
-HREF="#AEN827"
->Bug Graphs (Optional)</A
+>5.8. <A
+HREF="#upgrading"
+>Upgrading to New Releases</A
 ></DT
 ><DT
->3.2.19. <A
-HREF="#AEN839"
->Securing MySQL</A
+>5.9. <A
+HREF="#integration"
+>Integrating Bugzilla with Third-Party Tools</A
 ></DT
 ></DL
 ></DD
 ><DT
->3.3. <A
-HREF="#OSX"
->Mac OS X Installation Notes</A
-></DT
-><DT
->3.4. <A
-HREF="#BSDINSTALL"
->BSD Installation Notes</A
+>A. <A
+HREF="#faq"
+>The Bugzilla FAQ</A
 ></DT
 ><DT
->3.5. <A
-HREF="#GENINSTALL"
->Installation General Notes</A
+>B. <A
+HREF="#database"
+>The Bugzilla Database</A
 ></DT
 ><DD
 ><DL
 ><DT
->3.5.1. <A
-HREF="#AEN941"
->Modifying Your Running System</A
-></DT
-><DT
->3.5.2. <A
-HREF="#AEN948"
->Upgrading From Previous Versions</A
+>B.1. <A
+HREF="#dbschema"
+>Database Schema Chart</A
 ></DT
 ><DT
->3.5.3. <A
-HREF="#HTACCESS"
-><TT
-CLASS="FILENAME"
->.htaccess</TT
-> files and security</A
+>B.2. <A
+HREF="#dbdoc"
+>MySQL Bugzilla Database Introduction</A
 ></DT
+></DL
+></DD
 ><DT
->3.5.4. <A
-HREF="#MOD_THROTTLE"
-><TT
-CLASS="FILENAME"
->mod_throttle</TT
-> and Security</A
+>C. <A
+HREF="#patches"
+>Useful Patches and Utilities for Bugzilla</A
 ></DT
+><DD
+><DL
 ><DT
->3.5.5. <A
-HREF="#CONTENT_TYPE"
->Preventing untrusted Bugzilla content from executing malicious Javascript code</A
+>C.1. <A
+HREF="#rewrite"
+>Apache 
+    <TT
+CLASS="filename"
+>mod_rewrite</TT
+>
+
+    magic</A
 ></DT
 ><DT
->3.5.6. <A
-HREF="#UNIXHISTORY"
->UNIX Installation Instructions History</A
+>C.2. <A
+HREF="#cmdline"
+>Command-line Bugzilla Queries</A
 ></DT
 ></DL
 ></DD
 ><DT
->3.6. <A
-HREF="#WIN32"
->Win32 Installation Notes</A
+>D. <A
+HREF="#variants"
+>Bugzilla Variants and Competitors</A
 ></DT
 ><DD
 ><DL
 ><DT
->3.6.1. <A
-HREF="#WININSTALL"
->Win32 Installation: Step-by-step</A
-></DT
-><DT
->3.6.2. <A
-HREF="#ADDLWINTIPS"
->Additional Windows Tips</A
+>D.1. <A
+HREF="#rhbugzilla"
+>Red Hat Bugzilla</A
 ></DT
 ><DT
->3.6.3. <A
-HREF="#BZLDAP"
->Bugzilla LDAP Integration</A
+>D.2. <A
+HREF="#variant-fenris"
+>Loki Bugzilla (Fenris)</A
 ></DT
-></DL
-></DD
-></DL
-></DD
 ><DT
->4. <A
-HREF="#ADMINISTRATION"
->Administering Bugzilla</A
+>D.3. <A
+HREF="#variant-issuezilla"
+>Issuezilla</A
 ></DT
-><DD
-><DL
 ><DT
->4.1. <A
-HREF="#POSTINSTALL-CHECK"
->Post-Installation Checklist</A
+>D.4. <A
+HREF="#variant-scarab"
+>Scarab</A
 ></DT
 ><DT
->4.2. <A
-HREF="#USERADMIN"
->User Administration</A
+>D.5. <A
+HREF="#variant-perforce"
+>Perforce SCM</A
 ></DT
-><DD
-><DL
 ><DT
->4.2.1. <A
-HREF="#DEFAULTUSER"
->Creating the Default User</A
+>D.6. <A
+HREF="#variant-sourceforge"
+>SourceForge</A
 ></DT
+></DL
+></DD
 ><DT
->4.2.2. <A
-HREF="#MANAGEUSERS"
->Managing Other Users</A
+><A
+HREF="#glossary"
+>Glossary</A
 ></DT
-><DD
+></DL
+></DIV
+><DIV
+CLASS="LOT"
 ><DL
+CLASS="LOT"
 ><DT
->4.2.2.1. <A
-HREF="#LOGIN"
->Logging In</A
+><B
+>List of Examples</B
 ></DT
 ><DT
->4.2.2.2. <A
-HREF="#CREATENEWUSERS"
->Creating new users</A
+>4-1. <A
+HREF="#AEN989"
+>Installing ActivePerl ppd Modules on Microsoft
+            Windows</A
 ></DT
 ><DT
->4.2.2.3. <A
-HREF="#DISABLEUSERS"
->Disabling Users</A
+>4-2. <A
+HREF="#AEN1002"
+>Installing OpenInteract ppd Modules manually on Microsoft
+            Windows</A
 ></DT
 ><DT
->4.2.2.4. <A
-HREF="#MODIFYUSERS"
->Modifying Users</A
-></DT
-></DL
-></DD
-></DL
-></DD
-><DT
->4.3. <A
-HREF="#PROGRAMADMIN"
->Product, Component, Milestone, and Version
-      Administration</A
-></DT
-><DD
-><DL
-><DT
->4.3.1. <A
-HREF="#PRODUCTS"
->Products</A
-></DT
-><DT
->4.3.2. <A
-HREF="#COMPONENTS"
->Components</A
-></DT
-><DT
->4.3.3. <A
-HREF="#VERSIONS"
->Versions</A
-></DT
-><DT
->4.3.4. <A
-HREF="#MILESTONES"
->Milestones</A
-></DT
-><DT
->4.3.5. <A
-HREF="#VOTING"
->Voting</A
-></DT
-><DT
->4.3.6. <A
-HREF="#GROUPS"
->Groups and Group Security</A
-></DT
-></DL
-></DD
-><DT
->4.4. <A
-HREF="#SECURITY"
->Bugzilla Security</A
-></DT
-></DL
-></DD
-><DT
->5. <A
-HREF="#INTEGRATION"
->Integrating Bugzilla with Third-Party Tools</A
-></DT
-><DD
-><DL
-><DT
->5.1. <A
-HREF="#BONSAI"
->Bonsai</A
-></DT
-><DT
->5.2. <A
-HREF="#CVS"
->CVS</A
-></DT
-><DT
->5.3. <A
-HREF="#SCM"
->Perforce SCM</A
-></DT
-><DT
->5.4. <A
-HREF="#TINDERBOX"
->Tinderbox/Tinderbox2</A
-></DT
-></DL
-></DD
-><DT
->6. <A
-HREF="#FUTURE"
->The Future of Bugzilla</A
-></DT
-><DT
->7. <A
-HREF="#VARIANTS"
->Bugzilla Variants and Competitors</A
-></DT
-><DD
-><DL
-><DT
->7.1. <A
-HREF="#RHBUGZILLA"
->Red Hat Bugzilla</A
-></DT
-><DT
->7.2. <A
-HREF="#VARIANT_FENRIS"
->Loki Bugzilla (Fenris)</A
-></DT
-><DT
->7.3. <A
-HREF="#VARIANT_ISSUEZILLA"
->Issuezilla</A
-></DT
-><DT
->7.4. <A
-HREF="#VARIANT_SCARAB"
->Scarab</A
-></DT
-><DT
->7.5. <A
-HREF="#VARIANT_PERFORCE"
->Perforce SCM</A
-></DT
-><DT
->7.6. <A
-HREF="#VARIANT_SOURCEFORGE"
->SourceForge</A
-></DT
-></DL
-></DD
-><DT
->A. <A
-HREF="#FAQ"
->The Bugzilla FAQ</A
-></DT
-><DT
->B. <A
-HREF="#DOWNLOADLINKS"
->Software Download Links</A
-></DT
-><DT
->C. <A
-HREF="#DATABASE"
->The Bugzilla Database</A
-></DT
-><DD
-><DL
-><DT
->C.1. <A
-HREF="#DBSCHEMA"
->Database Schema Chart</A
-></DT
-><DT
->C.2. <A
-HREF="#DBDOC"
->MySQL Bugzilla Database Introduction</A
-></DT
-><DD
-><DL
-><DT
->C.2.1. <A
-HREF="#AEN2331"
->Bugzilla Database Basics</A
-></DT
-><DD
-><DL
-><DT
->C.2.1.1. <A
-HREF="#AEN2360"
->Bugzilla Database Tables</A
-></DT
-></DL
-></DD
-></DL
-></DD
-><DT
->C.3. <A
-HREF="#GRANTTABLES"
->MySQL Permissions &#38; Grant Tables</A
-></DT
-></DL
-></DD
-><DT
->D. <A
-HREF="#PATCHES"
->Useful Patches and Utilities for Bugzilla</A
-></DT
-><DD
-><DL
-><DT
->D.1. <A
-HREF="#REWRITE"
->Apache <TT
-CLASS="FILENAME"
->mod_rewrite</TT
-> magic</A
-></DT
-><DT
->D.2. <A
-HREF="#SETPERL"
->The setperl.csh Utility</A
-></DT
-><DT
->D.3. <A
-HREF="#CMDLINE"
->Command-line Bugzilla Queries</A
-></DT
-><DT
->D.4. <A
-HREF="#QUICKSEARCH"
->The Quicksearch Utility</A
-></DT
-><DT
->D.5. <A
-HREF="#BZHACKING"
->Hacking Bugzilla</A
-></DT
-></DL
-></DD
-><DT
->E. <A
-HREF="#GFDL"
->GNU Free Documentation License</A
-></DT
-><DD
-><DL
-><DT
->0. <A
-HREF="#GFDL_0"
->PREAMBLE</A
-></DT
-><DT
->1. <A
-HREF="#GFDL_1"
->APPLICABILITY AND DEFINITIONS</A
-></DT
-><DT
->2. <A
-HREF="#GFDL_2"
->VERBATIM COPYING</A
-></DT
-><DT
->3. <A
-HREF="#GFDL_3"
->COPYING IN QUANTITY</A
-></DT
-><DT
->4. <A
-HREF="#GFDL_4"
->MODIFICATIONS</A
-></DT
-><DT
->5. <A
-HREF="#GFDL_5"
->COMBINING DOCUMENTS</A
-></DT
-><DT
->6. <A
-HREF="#GFDL_6"
->COLLECTIONS OF DOCUMENTS</A
-></DT
-><DT
->7. <A
-HREF="#GFDL_7"
->AGGREGATION WITH INDEPENDENT WORKS</A
-></DT
-><DT
->8. <A
-HREF="#GFDL_8"
->TRANSLATION</A
-></DT
-><DT
->9. <A
-HREF="#GFDL_9"
->TERMINATION</A
-></DT
-><DT
->10. <A
-HREF="#GFDL_10"
->FUTURE REVISIONS OF THIS LICENSE</A
-></DT
-><DT
-><A
-HREF="#GFDL_HOWTO"
->How to use this License for your documents</A
-></DT
-></DL
-></DD
-><DT
-><A
-HREF="#GLOSSARY"
->Glossary</A
-></DT
-></DL
-></DIV
-><DIV
-CLASS="LOT"
-><DL
-CLASS="LOT"
-><DT
-><B
->List of Examples</B
-></DT
-><DT
->2-1. <A
-HREF="#AEN307"
->Some Famous Software Versions</A
-></DT
-><DT
->2-2. <A
-HREF="#AEN317"
->Mozilla's Bugzilla Components</A
-></DT
-><DT
->3-1. <A
-HREF="#AEN708"
->Setting up bonsaitools symlink</A
-></DT
-><DT
->3-2. <A
-HREF="#AEN799"
->Running checksetup.pl as the web user</A
-></DT
-><DT
->3-3. <A
-HREF="#AEN1038"
->Installing ActivePerl ppd Modules on Microsoft Windows</A
-></DT
-><DT
->3-4. <A
-HREF="#AEN1224"
->Removing encrypt() for Windows NT Bugzilla version
-	      2.12 or earlier</A
-></DT
-><DT
->4-1. <A
-HREF="#AEN1461"
->Creating some Components</A
-></DT
-><DT
->4-2. <A
-HREF="#AEN1490"
->Common Use of Versions</A
-></DT
-><DT
->4-3. <A
-HREF="#AEN1494"
->A Different Use of Versions</A
-></DT
-><DT
->4-4. <A
-HREF="#AEN1522"
->Using SortKey with Target Milestone</A
-></DT
-><DT
->4-5. <A
-HREF="#AEN1558"
->When to Use Group Security</A
-></DT
-><DT
->4-6. <A
-HREF="#AEN1575"
->Creating a New Group</A
-></DT
-><DT
->4-7. <A
-HREF="#AEN1592"
->Bugzilla Groups</A
-></DT
-><DT
->D-1. <A
-HREF="#AEN2439"
->Using Setperl to set your perl path</A
-></DT
-><DT
->1. <A
-HREF="#AEN2685"
->A Sample Product</A
+>4-3. <A
+HREF="#AEN1184"
+>Removing encrypt() for Windows NT Bugzilla version 2.12 or
+          earlier</A
 ></DT
 ></DL
 ></DIV
 ><DIV
-CLASS="CHAPTER"
+CLASS="chapter"
 ><HR><H1
 ><A
-NAME="ABOUT"
->Chapter 1. About This Guide</A
-></H1
+NAME="about">Chapter 1. About This Guide</H1
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
-><A
-NAME="ABOUTTHISGUIDE"
->1.1. Purpose and Scope of this Guide</A
-></H1
-><P
->      This document was started on September 17, 2000 by Matthew P.
-      Barnson after a great deal of procrastination updating the
-      Bugzilla FAQ, which I left untouched for nearly half a year.
-      After numerous complete rewrites and reformatting, it is the
-      document you see today.
-    </P
-><P
->      Bugzilla is simply the best piece of bug-tracking software the
-      world has ever seen.  This document is intended to be the
-      comprehensive guide to  the installation, administration,
-      maintenance, and use of the Bugzilla bug-tracking system.
-    </P
-><P
->      This release of the Bugzilla Guide is the
-      <EM
->2.14</EM
-> release. It is so named that it
-      may match the current version of Bugzilla. The numbering
-      tradition stems from that used for many free software projects,
-      in which <EM
->even-numbered</EM
-> point releases (1.2,
-      1.14, etc.) are considered "stable releases", intended for
-      public consumption; on the other  hand,
-      <EM
->odd-numbered</EM
-> point releases (1.3, 2.09,
-      etc.) are considered unstable <EM
->development</EM
->
-      releases intended for advanced users, systems administrators,
-      developers, and those who enjoy a lot of pain. 
-    </P
-><P
->      Newer revisions of the Bugzilla Guide follow the numbering
-      conventions of the main-tree Bugzilla releases, available at
-      <A
-HREF="http://www.mozilla.org/projects/bugzilla"
-TARGET="_top"
->http://www.mozilla.org/projects/bugzilla</A
->.  Intermediate releases will have
-      a minor revision number following a period.  The current version
-      of Bugzilla, as of this writing (August 10, 2001) is 2.14; if
-      something were seriously wrong with that edition of the Guide,
-      subsequent releases would receive an additional dotted-decimal
-      digit to indicate the update (2.14.1, 2.14.2, etc.).
-      Got it?  Good.
-    </P
-><P
->      I wrote this in response to the enormous demand for decent
-      Bugzilla documentation. I have incorporated instructions from
-      the Bugzilla README, Frequently Asked Questions, Database Schema
-      Document, and various mailing lists to create it. Chances are,
-      there are glaring errors in this documentation; please contact
-      <TT
-CLASS="EMAIL"
->&#60;<A
-HREF="mailto:barnboy@trilobyte.net"
->barnboy@trilobyte.net</A
->&#62;</TT
-> to correct them.
-    </P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="COPYRIGHT"
->1.2. Copyright Information</A
-></H1
+NAME="copyright">1.1. Copyright Information</H1
 ><A
-NAME="AEN70"
-></A
-><TABLE
+NAME="AEN31"><TABLE
 BORDER="0"
 WIDTH="100%"
 CELLSPACING="0"
@@ -1116,13 +399,12 @@ VALIGN="TOP"
 WIDTH="80%"
 VALIGN="TOP"
 ><P
->	Permission is granted to copy, distribute and/or modify this
+>&#13;	Permission is granted to copy, distribute and/or modify this
 	document under the terms of the GNU Free Documentation
 	License, Version 1.1 or any later version published  by the
 	Free Software Foundation; with no Invariant Sections, no
 	Front-Cover Texts, and  with no Back-Cover Texts.  A copy of
-	the license is included in the section entitled  "GNU Free
-	Documentation LIcense".
+	the license is included below.
       </P
 ></TD
 ><TD
@@ -1136,8 +418,8 @@ COLSPAN="2"
 ALIGN="RIGHT"
 VALIGN="TOP"
 >--<SPAN
-CLASS="ATTRIBUTION"
->Copyright (c) 2000-2001 Matthew P. Barnson</SPAN
+CLASS="attribution"
+>Copyright (c) 2000-2002 Matthew P. Barnson and The Bugzilla Team</SPAN
 ></TD
 ><TD
 WIDTH="10%"
@@ -1145,51 +427,518 @@ WIDTH="10%"
 ></TR
 ></TABLE
 ><P
->      If you have any questions regarding this document, its
+>&#13;      If you have any questions regarding this document, its
       copyright, or publishing this document in non-electronic form,
-      please contact Matthew P. Barnson. 
+      please contact The Bugzilla Team. 
     </P
-></DIV
 ><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
+CLASS="section"
+><HR><H2
+CLASS="section"
 ><A
-NAME="DISCLAIMER"
->1.3. Disclaimer</A
-></H1
+NAME="gfdl">1.1.1. GNU Free Documentation License</H2
 ><P
->      No liability for the contents of this document can be accepted.
+>Version 1.1, March 2000</P
+><A
+NAME="AEN38"><BLOCKQUOTE
+CLASS="BLOCKQUOTE"
+><P
+>Copyright (C) 2000 Free Software Foundation, Inc. 59 Temple Place,
+    Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and
+    distribute verbatim copies of this license document, but changing it is
+    not allowed.</P
+></BLOCKQUOTE
+><DIV
+CLASS="section"
+><HR><H3
+CLASS="section"
+><A
+NAME="gfdl-0">0. PREAMBLE</H3
+><P
+>The purpose of this License is to make a manual, textbook, or other
+    written document "free" in the sense of freedom: to assure everyone the
+    effective freedom to copy and redistribute it, with or without modifying
+    it, either commercially or noncommercially. Secondarily, this License
+    preserves for the author and publisher a way to get credit for their
+    work, while not being considered responsible for modifications made by
+    others.</P
+><P
+>This License is a kind of "copyleft", which means that derivative
+    works of the document must themselves be free in the same sense. It
+    complements the GNU General Public License, which is a copyleft license
+    designed for free software.</P
+><P
+>We have designed this License in order to use it for manuals for
+    free software, because free software needs free documentation: a free
+    program should come with manuals providing the same freedoms that the
+    software does. But this License is not limited to software manuals; it
+    can be used for any textual work, regardless of subject matter or whether
+    it is published as a printed book. We recommend this License principally
+    for works whose purpose is instruction or reference.</P
+></DIV
+><DIV
+CLASS="section"
+><HR><H3
+CLASS="section"
+><A
+NAME="gfdl-1">1. APPLICABILITY AND DEFINITIONS</H3
+><P
+>This License applies to any manual or other work that contains a
+    notice placed by the copyright holder saying it can be distributed under
+    the terms of this License. The "Document", below, refers to any such
+    manual or work. Any member of the public is a licensee, and is addressed
+    as "you".</P
+><P
+>A "Modified Version" of the Document means any work containing the
+    Document or a portion of it, either copied verbatim, or with
+    modifications and/or translated into another language.</P
+><P
+>A "Secondary Section" is a named appendix or a front-matter section
+    of the Document that deals exclusively with the relationship of the
+    publishers or authors of the Document to the Document's overall subject
+    (or to related matters) and contains nothing that could fall directly
+    within that overall subject. (For example, if the Document is in part a
+    textbook of mathematics, a Secondary Section may not explain any
+    mathematics.) The relationship could be a matter of historical connection
+    with the subject or with related matters, or of legal, commercial,
+    philosophical, ethical or political position regarding them.</P
+><P
+>The "Invariant Sections" are certain Secondary Sections whose
+    titles are designated, as being those of Invariant Sections, in the
+    notice that says that the Document is released under this License.</P
+><P
+>The "Cover Texts" are certain short passages of text that are
+    listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says
+    that the Document is released under this License.</P
+><P
+>A "Transparent" copy of the Document means a machine-readable copy,
+    represented in a format whose specification is available to the general
+    public, whose contents can be viewed and edited directly and
+    straightforwardly with generic text editors or (for images composed of
+    pixels) generic paint programs or (for drawings) some widely available
+    drawing editor, and that is suitable for input to text formatters or for
+    automatic translation to a variety of formats suitable for input to text
+    formatters. A copy made in an otherwise Transparent file format whose
+    markup has been designed to thwart or discourage subsequent modification
+    by readers is not Transparent. A copy that is not "Transparent" is called
+    "Opaque".</P
+><P
+>Examples of suitable formats for Transparent copies include plain
+    ASCII without markup, Texinfo input format, LaTeX input format, SGML or
+    XML using a publicly available DTD, and standard-conforming simple HTML
+    designed for human modification. Opaque formats include PostScript, PDF,
+    proprietary formats that can be read and edited only by proprietary word
+    processors, SGML or XML for which the DTD and/or processing tools are not
+    generally available, and the machine-generated HTML produced by some word
+    processors for output purposes only.</P
+><P
+>The "Title Page" means, for a printed book, the title page itself,
+    plus such following pages as are needed to hold, legibly, the material
+    this License requires to appear in the title page. For works in formats
+    which do not have any title page as such, "Title Page" means the text
+    near the most prominent appearance of the work's title, preceding the
+    beginning of the body of the text.</P
+></DIV
+><DIV
+CLASS="section"
+><HR><H3
+CLASS="section"
+><A
+NAME="gfdl-2">2. VERBATIM COPYING</H3
+><P
+>You may copy and distribute the Document in any medium, either
+    commercially or noncommercially, provided that this License, the
+    copyright notices, and the license notice saying this License applies to
+    the Document are reproduced in all copies, and that you add no other
+    conditions whatsoever to those of this License. You may not use technical
+    measures to obstruct or control the reading or further copying of the
+    copies you make or distribute. However, you may accept compensation in
+    exchange for copies. If you distribute a large enough number of copies
+    you must also follow the conditions in section 3.</P
+><P
+>You may also lend copies, under the same conditions stated above,
+    and you may publicly display copies.</P
+></DIV
+><DIV
+CLASS="section"
+><HR><H3
+CLASS="section"
+><A
+NAME="gfdl-3">3. COPYING IN QUANTITY</H3
+><P
+>If you publish printed copies of the Document numbering more than
+    100, and the Document's license notice requires Cover Texts, you must
+    enclose the copies in covers that carry, clearly and legibly, all these
+    Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts
+    on the back cover. Both covers must also clearly and legibly identify you
+    as the publisher of these copies. The front cover must present the full
+    title with all words of the title equally prominent and visible. You may
+    add other material on the covers in addition. Copying with changes
+    limited to the covers, as long as they preserve the title of the Document
+    and satisfy these conditions, can be treated as verbatim copying in other
+    respects.</P
+><P
+>If the required texts for either cover are too voluminous to fit
+    legibly, you should put the first ones listed (as many as fit reasonably)
+    on the actual cover, and continue the rest onto adjacent pages.</P
+><P
+>If you publish or distribute Opaque copies of the Document
+    numbering more than 100, you must either include a machine-readable
+    Transparent copy along with each Opaque copy, or state in or with each
+    Opaque copy a publicly-accessible computer-network location containing a
+    complete Transparent copy of the Document, free of added material, which
+    the general network-using public has access to download anonymously at no
+    charge using public-standard network protocols. If you use the latter
+    option, you must take reasonably prudent steps, when you begin
+    distribution of Opaque copies in quantity, to ensure that this
+    Transparent copy will remain thus accessible at the stated location until
+    at least one year after the last time you distribute an Opaque copy
+    (directly or through your agents or retailers) of that edition to the
+    public.</P
+><P
+>It is requested, but not required, that you contact the authors of
+    the Document well before redistributing any large number of copies, to
+    give them a chance to provide you with an updated version of the
+    Document.</P
+></DIV
+><DIV
+CLASS="section"
+><HR><H3
+CLASS="section"
+><A
+NAME="gfdl-4">4. MODIFICATIONS</H3
+><P
+>You may copy and distribute a Modified Version of the Document
+    under the conditions of sections 2 and 3 above, provided that you release
+    the Modified Version under precisely this License, with the Modified
+    Version filling the role of the Document, thus licensing distribution and
+    modification of the Modified Version to whoever possesses a copy of it.
+    In addition, you must do these things in the Modified Version:</P
+><P
+></P
+><OL
+TYPE="A"
+><LI
+><P
+>Use in the Title Page (and on the covers, if any) a title
+        distinct from that of the Document, and from those of previous
+        versions (which should, if there were any, be listed in the History
+        section of the Document). You may use the same title as a previous
+        version if the original publisher of that version gives
+        permission.</P
+></LI
+><LI
+><P
+>List on the Title Page, as authors, one or more persons or
+        entities responsible for authorship of the modifications in the
+        Modified Version, together with at least five of the principal
+        authors of the Document (all of its principal authors, if it has less
+        than five).</P
+></LI
+><LI
+><P
+>State on the Title page the name of the publisher of the
+        Modified Version, as the publisher.</P
+></LI
+><LI
+><P
+>Preserve all the copyright notices of the Document.</P
+></LI
+><LI
+><P
+>Add an appropriate copyright notice for your modifications
+        adjacent to the other copyright notices.</P
+></LI
+><LI
+><P
+>Include, immediately after the copyright notices, a license
+        notice giving the public permission to use the Modified Version under
+        the terms of this License, in the form shown in the Addendum
+        below.</P
+></LI
+><LI
+><P
+>Preserve in that license notice the full lists of Invariant
+        Sections and required Cover Texts given in the Document's license
+        notice.</P
+></LI
+><LI
+><P
+>Include an unaltered copy of this License.</P
+></LI
+><LI
+><P
+>Preserve the section entitled "History", and its title, and add
+        to it an item stating at least the title, year, new authors, and
+        publisher of the Modified Version as given on the Title Page. If
+        there is no section entitled "History" in the Document, create one
+        stating the title, year, authors, and publisher of the Document as
+        given on its Title Page, then add an item describing the Modified
+        Version as stated in the previous sentence.</P
+></LI
+><LI
+><P
+>Preserve the network location, if any, given in the Document
+        for public access to a Transparent copy of the Document, and likewise
+        the network locations given in the Document for previous versions it
+        was based on. These may be placed in the "History" section. You may
+        omit a network location for a work that was published at least four
+        years before the Document itself, or if the original publisher of the
+        version it refers to gives permission.</P
+></LI
+><LI
+><P
+>In any section entitled "Acknowledgements" or "Dedications",
+        preserve the section's title, and preserve in the section all the
+        substance and tone of each of the contributor acknowledgements and/or
+        dedications given therein.</P
+></LI
+><LI
+><P
+>Preserve all the Invariant Sections of the Document, unaltered
+        in their text and in their titles. Section numbers or the equivalent
+        are not considered part of the section titles.</P
+></LI
+><LI
+><P
+>Delete any section entitled "Endorsements". Such a section may
+        not be included in the Modified Version.</P
+></LI
+><LI
+><P
+>Do not retitle any existing section as "Endorsements" or to
+        conflict in title with any Invariant Section.</P
+></LI
+></OL
+><P
+>If the Modified Version includes new front-matter sections or
+    appendices that qualify as Secondary Sections and contain no material
+    copied from the Document, you may at your option designate some or all of
+    these sections as invariant. To do this, add their titles to the list of
+    Invariant Sections in the Modified Version's license notice. These titles
+    must be distinct from any other section titles.</P
+><P
+>You may add a section entitled "Endorsements", provided it contains
+    nothing but endorsements of your Modified Version by various parties--for
+    example, statements of peer review or that the text has been approved by
+    an organization as the authoritative definition of a standard.</P
+><P
+>You may add a passage of up to five words as a Front-Cover Text,
+    and a passage of up to 25 words as a Back-Cover Text, to the end of the
+    list of Cover Texts in the Modified Version. Only one passage of
+    Front-Cover Text and one of Back-Cover Text may be added by (or through
+    arrangements made by) any one entity. If the Document already includes a
+    cover text for the same cover, previously added by you or by arrangement
+    made by the same entity you are acting on behalf of, you may not add
+    another; but you may replace the old one, on explicit permission from the
+    previous publisher that added the old one.</P
+><P
+>The author(s) and publisher(s) of the Document do not by this
+    License give permission to use their names for publicity for or to assert
+    or imply endorsement of any Modified Version.</P
+></DIV
+><DIV
+CLASS="section"
+><HR><H3
+CLASS="section"
+><A
+NAME="gfdl-5">5. COMBINING DOCUMENTS</H3
+><P
+>You may combine the Document with other documents released under
+    this License, under the terms defined in section 4 above for modified
+    versions, provided that you include in the combination all of the
+    Invariant Sections of all of the original documents, unmodified, and list
+    them all as Invariant Sections of your combined work in its license
+    notice.</P
+><P
+>The combined work need only contain one copy of this License, and
+    multiple identical Invariant Sections may be replaced with a single copy.
+    If there are multiple Invariant Sections with the same name but different
+    contents, make the title of each such section unique by adding at the end
+    of it, in parentheses, the name of the original author or publisher of
+    that section if known, or else a unique number. Make the same adjustment
+    to the section titles in the list of Invariant Sections in the license
+    notice of the combined work.</P
+><P
+>In the combination, you must combine any sections entitled
+    "History" in the various original documents, forming one section entitled
+    "History"; likewise combine any sections entitled "Acknowledgements", and
+    any sections entitled "Dedications". You must delete all sections
+    entitled "Endorsements."</P
+></DIV
+><DIV
+CLASS="section"
+><HR><H3
+CLASS="section"
+><A
+NAME="gfdl-6">6. COLLECTIONS OF DOCUMENTS</H3
+><P
+>You may make a collection consisting of the Document and other
+    documents released under this License, and replace the individual copies
+    of this License in the various documents with a single copy that is
+    included in the collection, provided that you follow the rules of this
+    License for verbatim copying of each of the documents in all other
+    respects.</P
+><P
+>You may extract a single document from such a collection, and
+    distribute it individually under this License, provided you insert a copy
+    of this License into the extracted document, and follow this License in
+    all other respects regarding verbatim copying of that document.</P
+></DIV
+><DIV
+CLASS="section"
+><HR><H3
+CLASS="section"
+><A
+NAME="gfdl-7">7. AGGREGATION WITH INDEPENDENT WORKS</H3
+><P
+>A compilation of the Document or its derivatives with other
+    separate and independent documents or works, in or on a volume of a
+    storage or distribution medium, does not as a whole count as a Modified
+    Version of the Document, provided no compilation copyright is claimed for
+    the compilation. Such a compilation is called an "aggregate", and this
+    License does not apply to the other self-contained works thus compiled
+    with the Document, on account of their being thus compiled, if they are
+    not themselves derivative works of the Document.</P
+><P
+>If the Cover Text requirement of section 3 is applicable to these
+    copies of the Document, then if the Document is less than one quarter of
+    the entire aggregate, the Document's Cover Texts may be placed on covers
+    that surround only the Document within the aggregate. Otherwise they must
+    appear on covers around the whole aggregate.</P
+></DIV
+><DIV
+CLASS="section"
+><HR><H3
+CLASS="section"
+><A
+NAME="gfdl-8">8. TRANSLATION</H3
+><P
+>Translation is considered a kind of modification, so you may
+    distribute translations of the Document under the terms of section 4.
+    Replacing Invariant Sections with translations requires special
+    permission from their copyright holders, but you may include translations
+    of some or all Invariant Sections in addition to the original versions of
+    these Invariant Sections. You may include a translation of this License
+    provided that you also include the original English version of this
+    License. In case of a disagreement between the translation and the
+    original English version of this License, the original English version
+    will prevail.</P
+></DIV
+><DIV
+CLASS="section"
+><HR><H3
+CLASS="section"
+><A
+NAME="gfdl-9">9. TERMINATION</H3
+><P
+>You may not copy, modify, sublicense, or distribute the Document
+    except as expressly provided for under this License. Any other attempt to
+    copy, modify, sublicense or distribute the Document is void, and will
+    automatically terminate your rights under this License. However, parties
+    who have received copies, or rights, from you under this License will not
+    have their licenses terminated so long as such parties remain in full
+    compliance.</P
+></DIV
+><DIV
+CLASS="section"
+><HR><H3
+CLASS="section"
+><A
+NAME="gfdl-10">10. FUTURE REVISIONS OF THIS LICENSE</H3
+><P
+>The Free Software Foundation may publish new, revised versions of
+    the GNU Free Documentation License from time to time. Such new versions
+    will be similar in spirit to the present version, but may differ in
+    detail to address new problems or concerns. See 
+    <A
+HREF="http://www.gnu.org/copyleft/"
+TARGET="_top"
+>&#13;    http://www.gnu.org/copyleft/</A
+>
+
+    .</P
+><P
+>Each version of the License is given a distinguishing version
+    number. If the Document specifies that a particular numbered version of
+    this License "or any later version" applies to it, you have the option of
+    following the terms and conditions either of that specified version or of
+    any later version that has been published (not as a draft) by the Free
+    Software Foundation. If the Document does not specify a version number of
+    this License, you may choose any version ever published (not as a draft)
+    by the Free Software Foundation.</P
+></DIV
+><DIV
+CLASS="section"
+><HR><H3
+CLASS="section"
+><A
+NAME="gfdl-howto">How to use this License for your documents</H3
+><P
+>To use this License in a document you have written, include a copy
+    of the License in the document and put the following copyright and
+    license notices just after the title page:</P
+><A
+NAME="AEN128"><BLOCKQUOTE
+CLASS="BLOCKQUOTE"
+><P
+>Copyright (c) YEAR YOUR NAME. Permission is granted to copy,
+      distribute and/or modify this document under the terms of the GNU Free
+      Documentation License, Version 1.1 or any later version published by
+      the Free Software Foundation; with the Invariant Sections being LIST
+      THEIR TITLES, with the Front-Cover Texts being LIST, and with the
+      Back-Cover Texts being LIST. A copy of the license is included in the
+      section entitled "GNU Free Documentation License".</P
+></BLOCKQUOTE
+><P
+>If you have no Invariant Sections, write "with no Invariant
+    Sections" instead of saying which ones are invariant. If you have no
+    Front-Cover Texts, write "no Front-Cover Texts" instead of "Front-Cover
+    Texts being LIST"; likewise for Back-Cover Texts.</P
+><P
+>If your document contains nontrivial examples of program code, we
+    recommend releasing these examples in parallel under your choice of free
+    software license, such as the GNU General Public License, to permit their
+    use in free software.</P
+></DIV
+></DIV
+></DIV
+><DIV
+CLASS="section"
+><HR><H1
+CLASS="section"
+><A
+NAME="disclaimer">1.2. Disclaimer</H1
+><P
+>&#13;      No liability for the contents of this document can be accepted.
       Use the concepts, examples, and other content at your own risk.
-      As this is a new edition of this document, there may be errors
-      and inaccuracies that may damage your system.  Use of this
-      document may cause your girlfriend to leave you, your cats to
-      pee on your furniture and clothing, your computer to cease
-      functioning, your boss to fire you, and global thermonuclear
-      war.  Proceed with caution.
+      This document may contain errors
+      and inaccuracies that may damage your system, cause your partner 
+      to leave you, your boss to fire you, your cats to
+      pee on your furniture and clothing, and global thermonuclear
+      war. Proceed with caution.
     </P
 ><P
->      All copyrights are held by their respective owners, unless
+>&#13;      All copyrights are held by their respective owners, unless
       specifically noted otherwise.  Use of a term in this document
       should not be regarded as affecting the validity of any
       trademark or service mark.
     </P
 ><P
->      Naming of particular products or brands should not be seen as
-      endorsements, with the exception of the term "GNU/Linux".  I
+>&#13;      Naming of particular products or brands should not be seen as
+      endorsements, with the exception of the term "GNU/Linux".  We
       wholeheartedly endorse the use of GNU/Linux in every situation
       where it is appropriate.  It is an extremely versatile, stable,
       and robust operating system that offers an ideal operating
       environment for Bugzilla.
     </P
 ><P
->      You are strongly recommended to make a backup of your system
+>&#13;      You are strongly recommended to make a backup of your system
       before installing Bugzilla and at regular intervals thereafter.
-      Heaven knows it's saved my bacon time after time; if you
-      implement any suggestion in  this Guide, implement this one!
+      If you implement any suggestion in this Guide, implement this one!
     </P
 ><P
->      Although the Bugzilla development team has taken great care to
+>&#13;      Although the Bugzilla development team has taken great care to
       ensure that all easily-exploitable bugs or options are
       documented or fixed in the code, security holes surely exist.
       Great care should be taken both in the installation and usage of
@@ -1198,52 +947,42 @@ NAME="DISCLAIMER"
       team members, Netscape Communications, America Online Inc., and
       any affiliated developers or sponsors assume no liability for
       your use of this product.  You have the source code to this
-      product, and are responsible for auditing it yourself to insure
+      product, and are responsible for auditing it yourself to ensure
       your security needs are met.
     </P
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="NEWVERSIONS"
->1.4. New Versions</A
-></H1
+NAME="newversions">1.3. New Versions</H1
 ><P
->      This is the 2.14 version of The Bugzilla Guide.  If you are
+>&#13;      This is the 2.16 version of The Bugzilla Guide. It is so named 
+      to match the current version of Bugzilla. If you are
       reading this from any source other than those below, please
       check one of these mirrors to make sure you are reading an
       up-to-date version of the Guide.
     </P
 ><P
->      This document can be found in the following places:
+>&#13;      This document can be found in the following places:
     </P
 ><P
->      <P
+>&#13;      <P
 ></P
 ><UL
 ><LI
 ><P
->	    <A
-HREF="http://www.trilobyte.net/barnsons/"
-TARGET="_top"
->TriloBYTE</A
->
-	  </P
-></LI
-><LI
-><P
->	    <A
-HREF="http://www.mozilla.org/projects/bugzilla/"
+>&#13;	    <A
+HREF="http://www.bugzilla.org/"
 TARGET="_top"
->Mozilla.org</A
+>bugzilla.org</A
 >
 	  </P
 ></LI
 ><LI
 ><P
->	    <A
+>&#13;	    <A
 HREF="http://www.linuxdoc.org/"
 TARGET="_top"
 >The Linux
@@ -1255,30 +994,52 @@ TARGET="_top"
 >
     </P
 ><P
->      The latest version of this document can be checked out via CVS.
-	Please follow the instructions available at <A
+>&#13;      The latest version of this document can always be checked out via CVS.
+	    Please follow the instructions available at 
+      <A
 HREF="http://www.mozilla.org/cvs.html"
 TARGET="_top"
 >the Mozilla CVS page</A
->, and check out the mozilla/webtools/bugzilla/docs/ branch.
+>,
+      and check out the <TT
+CLASS="filename"
+>mozilla/webtools/bugzilla/docs/</TT
+>
+      subtree.
+    </P
+><P
+>&#13;      The Bugzilla Guide is currently only available in English. 
+      If you would like to volunteer to translate it, please contact
+      <A
+HREF="mailto:justdave@syndicomm.com"
+TARGET="_top"
+>Dave Miller</A
+>.
     </P
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="CREDITS"
->1.5. Credits</A
-></H1
+NAME="credits">1.4. Credits</H1
 ><P
->      The people listed below have made enormous contributions to the
-      creation of this Guide, through their dedicated hacking efforts,
+>&#13;      The people listed below have made enormous contributions to the
+      creation of this Guide, through their writing, dedicated hacking efforts,
       numerous e-mail and IRC support sessions, and overall excellent
       contribution to the Bugzilla community:
     </P
 ><P
->      <A
+>&#13;      <A
+HREF="mailto://mbarnson@sisna.com"
+TARGET="_top"
+>Matthew P. Barnson</A
+>
+      for the Herculaean task of pulling together the Bugzilla Guide and
+      shepherding it to 2.14.
+    </P
+><P
+>&#13;      <A
 HREF="mailto://terry@mozilla.org"
 TARGET="_top"
 >Terry Weissman</A
@@ -1287,26 +1048,26 @@ TARGET="_top"
       README upon which the UNIX installation documentation is largely based.
     </P
 ><P
->      <A
+>&#13;      <A
 HREF="mailto://tara@tequilarista.org"
 TARGET="_top"
->Tara
-	Hernandez</A
->  for keeping Bugzilla development going
-      strong after Terry left Mozilla.org
+>Tara Hernandez</A
+>  
+      for keeping Bugzilla development going
+      strong after Terry left mozilla.org
     </P
 ><P
->      <A
+>&#13;      <A
 HREF="mailto://dkl@redhat.com"
 TARGET="_top"
 >Dave Lawrence</A
-> for
-      providing insight into the key differences between Red Hat's
+> 
+      for providing insight into the key differences between Red Hat's
       customized Bugzilla, and being largely responsible for the "Red
       Hat Bugzilla" appendix
     </P
 ><P
->      <A
+>&#13;      <A
 HREF="mailto://endico@mozilla.org"
 TARGET="_top"
 >Dawn Endico</A
@@ -1315,98 +1076,34 @@ TARGET="_top"
       questions and arguments on irc.mozilla.org in #mozwebtools
     </P
 ><P
->      Last but not least, all the members of the <A
+>&#13;      Last but not least, all the members of the 
+      <A
 HREF="news://news.mozilla.org/netscape/public/mozilla/webtools"
 TARGET="_top"
 > netscape.public.mozilla.webtools</A
 > newsgroup.  Without your discussions, insight, suggestions, and patches, this could never have happened.
     </P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="CONTRIBUTORS"
->1.6. Contributors</A
-></H1
-><P
->      Thanks go to these people for significant contributions to this
-      documentation (in no particular order):
-    </P
 ><P
->      Andrew Pearson, Spencer Smith, Eric Hanson, Kevin Brannen, Ron
-      Teitelbaum, Jacob Steenhagen, Joe Robins
+>&#13;      Thanks also go to the following people for significant contributions 
+      to this documentation (in no particular order):
     </P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="FEEDBACK"
->1.7. Feedback</A
-></H1
 ><P
->      I welcome feedback on this document.  Without your submissions
-      and input, this Guide cannot continue to exist.  Please mail
-      additions, comments, criticisms, etc. to
-      <TT
-CLASS="EMAIL"
->&#60;<A
-HREF="mailto:barnboy@trilobyte.net"
->barnboy@trilobyte.net</A
->&#62;</TT
->.  Please send flames to
-      <TT
-CLASS="EMAIL"
->&#60;<A
-HREF="mailto:devnull@localhost"
->devnull@localhost</A
->&#62;</TT
->
-    </P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="TRANSLATIONS"
->1.8. Translations</A
-></H1
-><P
->      The Bugzilla Guide needs translators! Please volunteer your
-      translation into the language of your choice. If you will
-      translate this Guide, please notify the members of the
-      mozilla-webtools mailing list at
-      <TT
-CLASS="EMAIL"
->&#60;<A
-HREF="mailto:mozilla-webtools@mozilla.org"
->mozilla-webtools@mozilla.org</A
->&#62;</TT
->, and arrange with
-      Matt Barnson to check it into CVS.
+>&#13;      Zach Liption, Andrew Pearson, Spencer Smith, Eric Hanson, Kevin Brannen,
+      Ron Teitelbaum, Jacob Steenhagen, Joe Robins, Gervase Markham.
     </P
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="CONVENTIONS"
->1.9. Document Conventions</A
-></H1
+NAME="conventions">1.5. Document Conventions</H1
 ><P
->    This document uses the following conventions
-  </P
+>This document uses the following conventions:</P
 ><DIV
-CLASS="INFORMALTABLE"
+CLASS="informaltable"
 ><A
-NAME="AEN129"
-></A
-><P
+NAME="AEN178"><P
 ></P
 ><TABLE
 BORDER="0"
@@ -1415,11 +1112,11 @@ CLASS="CALSTABLE"
 ><TR
 ><TH
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Descriptions</TH
 ><TH
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Appearance</TH
 ></TR
 ></THEAD
@@ -1427,17 +1124,17 @@ VALIGN="TOP"
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Warnings</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><DIV
-CLASS="CAUTION"
+VALIGN="MIDDLE"
+>&#13;            <DIV
+CLASS="caution"
 ><P
 ></P
 ><TABLE
-CLASS="CAUTION"
+CLASS="caution"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -1453,27 +1150,28 @@ ALT="Caution"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->Warnings.</P
+>Don't run with scissors!</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
-></TD
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Hint</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><DIV
-CLASS="TIP"
+VALIGN="MIDDLE"
+>&#13;            <DIV
+CLASS="tip"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
+CLASS="tip"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -1489,27 +1187,28 @@ ALT="Tip"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->Hint.</P
+>Would you like a breath mint?</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
-></TD
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Notes</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><DIV
-CLASS="NOTE"
+VALIGN="MIDDLE"
+>&#13;            <DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -1525,27 +1224,28 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->Note.</P
+>Dear John...</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
-></TD
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Information requiring special attention</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><DIV
-CLASS="WARNING"
+VALIGN="MIDDLE"
+>&#13;            <DIV
+CLASS="warning"
 ><P
 ></P
 ><TABLE
-CLASS="WARNING"
+CLASS="warning"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -1561,138 +1261,151 @@ ALT="Warning"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->Warning.</P
+>Read this or the cat gets it.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
-></TD
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >File Names</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><TT
-CLASS="FILENAME"
->file.extension</TT
-></TD
+VALIGN="MIDDLE"
+>&#13;            <TT
+CLASS="filename"
+>filename</TT
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Directory Names</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><TT
-CLASS="FILENAME"
+VALIGN="MIDDLE"
+>&#13;            <TT
+CLASS="filename"
 >directory</TT
-></TD
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Commands to be typed</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><B
-CLASS="COMMAND"
+VALIGN="MIDDLE"
+>&#13;            <B
+CLASS="command"
 >command</B
-></TD
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Applications Names</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><SPAN
-CLASS="APPLICATION"
+VALIGN="MIDDLE"
+>&#13;            <SPAN
+CLASS="application"
 >application</SPAN
-></TD
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><I
-CLASS="FOREIGNPHRASE"
+VALIGN="MIDDLE"
+>&#13;          <I
+CLASS="foreignphrase"
 >Prompt</I
-> of users command under bash shell</TD
+>
+
+          of users command under bash shell</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >bash$</TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><I
-CLASS="FOREIGNPHRASE"
+VALIGN="MIDDLE"
+>&#13;          <I
+CLASS="foreignphrase"
 >Prompt</I
-> of root users command under bash shell</TD
+>
+
+          of root users command under bash shell</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >bash#</TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><I
-CLASS="FOREIGNPHRASE"
+VALIGN="MIDDLE"
+>&#13;          <I
+CLASS="foreignphrase"
 >Prompt</I
-> of user command under tcsh shell</TD
+>
+
+          of user command under tcsh shell</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >tcsh$</TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Environment Variables</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><TT
-CLASS="ENVAR"
+VALIGN="MIDDLE"
+>&#13;            <TT
+CLASS="envar"
 >VARIABLE</TT
-></TD
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Emphasized word</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><EM
+VALIGN="MIDDLE"
+>&#13;            <EM
 >word</EM
-></TD
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Code Example</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><TABLE
+VALIGN="MIDDLE"
+>&#13;            <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -1701,19 +1414,22 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
+CLASS="programlisting"
 ><TT
-CLASS="SGMLTAG"
+CLASS="sgmltag"
 >&#60;para&#62;</TT
->Beginning and end of paragraph<TT
-CLASS="SGMLTAG"
+>
+Beginning and end of paragraph
+<TT
+CLASS="sgmltag"
 >&#60;/para&#62;</TT
 ></PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
-></TD
+>
+          </TD
 ></TR
 ></TBODY
 ></TABLE
@@ -1723,344 +1439,200 @@ CLASS="SGMLTAG"
 ></DIV
 ></DIV
 ><DIV
-CLASS="CHAPTER"
+CLASS="chapter"
 ><HR><H1
 ><A
-NAME="USING"
->Chapter 2. Using Bugzilla</A
-></H1
-><TABLE
-BORDER="0"
-WIDTH="100%"
-CELLSPACING="0"
-CELLPADDING="0"
-CLASS="EPIGRAPH"
-><TR
-><TD
-WIDTH="45%"
->&nbsp;</TD
-><TD
-WIDTH="45%"
-ALIGN="LEFT"
-VALIGN="TOP"
-><I
-><P
-><I
->What, Why, How, &#38; Where?</I
-></P
-></I
-></TD
-></TR
-></TABLE
+NAME="introduction">Chapter 2. Introduction</H1
 ><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="WHATIS"
->2.1. What is Bugzilla?</A
-></H1
-><P
->      Bugzilla is one example of a class of programs called "Defect
-Tracking Systems", or, more commonly, "Bug-Tracking Systems".  Defect
-Tracking Systems allow individual or groups of developers to keep
-track of outstanding bugs in their product effectively. Bugzilla was
-originally written by Terry Weissman in a programming language called
-"TCL", to replace a crappy bug-tracking database used internally for
-Netscape Communications.  Terry later ported Bugzilla to Perl from
-TCL, and in Perl it remains to this day. Most commercial
-defect-tracking software vendors at the time charged enormous
-licensing fees, and Bugzilla quickly became a favorite of the
-open-source crowd (with its genesis in the open-source browser
-project, Mozilla).  It is now the de-facto standard defect-tracking
-system against which all others are measured.
+CLASS="section"
+><H1
+CLASS="section"
+><A
+NAME="whatis">2.1. What is Bugzilla?</H1
+><P
+>&#13;    Bugzilla is a bug- or issue-tracking system. Bug-tracking
+    systems allow individual or groups of developers effectively to keep track
+    of outstanding problems with their product. 
+    Bugzilla was originally
+    written by Terry Weissman in a programming language called TCL, to
+    replace a rudimentary bug-tracking database used internally by Netscape
+    Communications. Terry later ported Bugzilla to Perl from TCL, and in Perl
+    it remains to this day. Most commercial defect-tracking software vendors
+    at the time charged enormous licensing fees, and Bugzilla quickly became
+    a favorite of the open-source crowd (with its genesis in the open-source
+    browser project, Mozilla). It is now the de-facto standard
+    defect-tracking system against which all others are measured.
     </P
 ><P
->      Bugzilla has matured immensely, and now boasts many advanced features.  These include:
-      <P
+>Bugzilla boasts many advanced features. These include: 
+    <P
 ></P
 ><UL
 ><LI
 ><P
->	    integrated, product-based granular security schema
-	  </P
+>Powerful searching</P
 ></LI
 ><LI
 ><P
->	    inter-bug dependencies and dependency graphing
-	  </P
+>User-configurable email notifications of bug changes</P
 ></LI
 ><LI
 ><P
->	    advanced reporting capabilities
-	  </P
+>Full change history</P
 ></LI
 ><LI
 ><P
->	    a robust, stable RDBMS back-end
-	  </P
+>Inter-bug dependency tracking and graphing</P
 ></LI
 ><LI
 ><P
->	    extensive configurability
-	  </P
+>Excellent attachment management</P
 ></LI
 ><LI
 ><P
->	    a very well-understood and well-thought-out natural bug resolution protocol
-	  </P
+>Integrated, product-based, granular security schema</P
 ></LI
 ><LI
 ><P
->	    email, XML, console, and HTTP APIs
-	  </P
+>Fully security-audited, and runs under Perl's taint mode</P
 ></LI
 ><LI
 ><P
->	    available integration with automated software
-	    configuration management systems, including Perforce and
-	    CVS (through the Bugzilla email interface and
-	    checkin/checkout scripts)
-	  </P
+>A robust, stable RDBMS back-end</P
 ></LI
 ><LI
 ><P
->	    too many more features to list
-	  </P
+>Web, XML, email and console interfaces</P
 ></LI
-></UL
->
-    </P
+><LI
 ><P
->      Despite its current robustness and popularity, Bugzilla faces
-      some near-term challenges, such as reliance on a single
-      database, a lack of abstraction of the user interface and
-      program logic, verbose email bug notifications, a powerful but
-      daunting query interface, little reporting configurability,
-      problems with extremely large queries, some unsupportable bug
-      resolution options, little internationalization (although non-US
-      character sets are accepted for comments), and dependence on
-      some nonstandard libraries.
-    </P
+>Completely customisable and/or localisable web user
+        interface</P
+></LI
+><LI
 ><P
->      Some recent headway has been made on the query front, however.
-      If you are using the latest version of Bugzilla, you should see
-      a <SPAN
-CLASS="QUOTE"
->"simple search"</SPAN
-> form on the default front page of
-      your Bugzilla install.  Type in two or three search terms and
-      you should pull up some relevant information.  This is also
-      available as "queryhelp.cgi".
-    </P
+>Extensive configurability</P
+></LI
+><LI
 ><P
->      Despite these small problems, Bugzilla is very hard to beat.  It
-      is under <EM
->very</EM
-> active development to address
-      the current issues, and continually gains new features.
+>Smooth upgrade pathway between versions</P
+></LI
+></UL
+>
     </P
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H1
-CLASS="SECTION"
-><A
-NAME="WHY"
->2.2. Why Should We Use Bugzilla?</A
-></H1
-><TABLE
-BORDER="0"
-WIDTH="100%"
-CELLSPACING="0"
-CELLPADDING="0"
-CLASS="EPIGRAPH"
-><TR
-><TD
-WIDTH="45%"
->&nbsp;</TD
-><TD
-WIDTH="45%"
-ALIGN="LEFT"
-VALIGN="TOP"
-><I
-><P
-><I
->No, Who's on first...</I
-></P
-></I
-></TD
-></TR
-></TABLE
-><P
->      For many years, defect-tracking software has remained
-      principally the domain of large software development houses.
-      Even then, most shops never bothered with bug-tracking software,
-      and instead simply relied on shared lists and email to monitor
-      the status of defects.  This procedure is error-prone and tends
-      to cause those bugs judged least significant by developers to be
-      dropped or ignored.
-    </P
-><P
->      These days, many companies are finding that integrated
-      defect-tracking systems reduce downtime, increase productivity,
-      and raise customer  satisfaction with their systems.  Along with
-      full disclosure, an open bug-tracker allows manufacturers to
-      keep in touch with their clients and resellers, to communicate
-      about problems effectively throughout the data management chain.
-      Many corporations have also discovered that defect-tracking
-      helps reduce costs by providing IT support accountability,
-      telephone support knowledge bases, and a common, well-understood
-      system for accounting for unusual system or software issues.
-    </P
-><P
->      But why should <EM
+CLASS="section"
+><A
+NAME="why">2.2. Why Should We Use Bugzilla?</H1
+><P
+>For many years, defect-tracking software has remained principally
+    the domain of large software development houses. Even then, most shops
+    never bothered with bug-tracking software, and instead simply relied on
+    shared lists and email to monitor the status of defects. This procedure
+    is error-prone and tends to cause those bugs judged least significant by
+    developers to be dropped or ignored.</P
+><P
+>These days, many companies are finding that integrated
+    defect-tracking systems reduce downtime, increase productivity, and raise
+    customer satisfaction with their systems. Along with full disclosure, an
+    open bug-tracker allows manufacturers to keep in touch with their clients
+    and resellers, to communicate about problems effectively throughout the
+    data management chain. Many corporations have also discovered that
+    defect-tracking helps reduce costs by providing IT support
+    accountability, telephone support knowledge bases, and a common,
+    well-understood system for accounting for unusual system or software
+    issues.</P
+><P
+>But why should 
+    <EM
 >you</EM
-> use Bugzilla?
-    </P
-><P
->      Bugzilla is very adaptable to various situations.  Known uses
-      currently include IT support queues, Systems Administration
-      deployment management, chip design and development problem
-      tracking (both pre-and-post fabrication), and software and
-      hardware bug tracking for luminaries such as Redhat, Loki
-      software, Linux-Mandrake, and VA Systems.  Combined with systems
-      such as CVS, Bonsai, or Perforce SCM, Bugzilla provides a
-      powerful, easy-to-use  solution to configuration management and
-      replication problems
-    </P
-><P
->      Bugzilla can dramatically increase the productivity and
-      accountability of individual employees by providing a documented
-      workflow and positive feedback for good performance.  How many
-      times do you wake up in the morning, remembering that you were
-      supposed to do <EM
+>
+
+    use Bugzilla?</P
+><P
+>Bugzilla is very adaptable to various situations. Known uses
+    currently include IT support queues, Systems Administration deployment
+    management, chip design and development problem tracking (both
+    pre-and-post fabrication), and software and hardware bug tracking for
+    luminaries such as Redhat, NASA, Linux-Mandrake, and VA Systems.
+    Combined with systems such as 
+    <A
+HREF="http://www.cvshome.org"
+TARGET="_top"
+>CVS</A
+>, 
+    <A
+HREF="http://www.mozilla.org/bonsai.html"
+TARGET="_top"
+>Bonsai</A
+>, or 
+    <A
+HREF="http://www.perforce.com"
+TARGET="_top"
+>Perforce SCM</A
+>, Bugzilla
+    provides a powerful, easy-to-use solution to configuration management and
+    replication problems.</P
+><P
+>Bugzilla can dramatically increase the productivity and
+    accountability of individual employees by providing a documented workflow
+    and positive feedback for good performance. How many times do you wake up
+    in the morning, remembering that you were supposed to do 
+    <EM
 >something</EM
-> today, but you
-      just can't quite remember?  Put it in Bugzilla, and you have a
-      record of it from which you can extrapolate milestones, predict
-      product versions for integration, and by using Bugzilla's e-mail
-      integration features be able to follow the discussion trail that
-      led to critical decisions.
-    </P
+>
+    today, but you just can't quite remember? Put it in Bugzilla, and you
+    have a record of it from which you can extrapolate milestones, predict
+    product versions for integration, and  follow the discussion trail 
+    that led to critical decisions.</P
 ><P
->      Ultimately, Bugzilla puts the power in your hands to improve
-      your value to your employer or business while providing a usable
-      framework for your natural attention to detail and knowledge
-      store to flourish.
-    </P
+>Ultimately, Bugzilla puts the power in your hands to improve your
+    value to your employer or business while providing a usable framework for
+    your natural attention to detail and knowledge store to flourish.</P
+></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="chapter"
 ><HR><H1
-CLASS="SECTION"
 ><A
-NAME="HOW"
->2.3. How do I use Bugzilla?</A
-></H1
-><TABLE
-BORDER="0"
-WIDTH="100%"
-CELLSPACING="0"
-CELLPADDING="0"
-CLASS="EPIGRAPH"
-><TR
-><TD
-WIDTH="45%"
->&nbsp;</TD
-><TD
-WIDTH="45%"
-ALIGN="LEFT"
-VALIGN="TOP"
-><I
-><P
-><I
->Hey!  I'm Woody!  Howdy, Howdy, Howdy!</I
-></P
-></I
-></TD
-></TR
-></TABLE
-><P
->      Bugzilla is a large, complex system.  Describing how to use it
-      requires some time.  If you are only interested in installing or
-      administering a Bugzilla installation, please consult the
-      Installing and Administering Bugzilla portions of this Guide.
-      This section is principally aimed towards developing end-user
-      mastery of Bugzilla, so you may fully enjoy the benefits
-      afforded by using this reliable open-source bug-tracking
-      software.
-    </P
-><P
->      Throughout this portion of the Guide, we will refer to user
-      account options available at the Bugzilla test installation,
-      <A
-HREF="http://landfill.tequilarista.org/"
-TARGET="_top"
->	landfill.tequilarista.org</A
->.
-      <DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
+NAME="using">Chapter 3. Using Bugzilla</H1
+><DIV
+CLASS="section"
+><H1
+CLASS="section"
+><A
+NAME="how">3.1. How do I use Bugzilla?</H1
 ><P
->	  Some people have run into difficulties completing this
-	  tutorial.  If you run into problems, please check the
-	  updated online documentation available at <A
-HREF="http://www.trilobyte.net/barnsons/"
-TARGET="_top"
->http://www.trilobyte.net/barnsons</A
->. If you're still stumped, please subscribe to the newsgroup and provide details of exactly what's stumping you!  If enough people complain, I'll have to fix it in the next version of this Guide.  You can subscribe to the newsgroup at <A
-HREF="news://news.mozilla.org/netscape.public.mozilla.webtools"
+>This section contains information for end-users of Bugzilla. 
+    There is a Bugzilla test installation, called 
+    <A
+HREF="http://landfill.bugzilla.org/"
 TARGET="_top"
-> news://news.mozilla.org/netscape.public.mozilla.webtools</A
->
-	</P
-></TD
-></TR
-></TABLE
-></DIV
-> Although Landfill serves as a great introduction to
-      Bugzilla, it does not offer all the options you would have as a
-      user on your own installation of Bugzilla, nor can it do more
-      than serve as a general introduction to Bugzilla.  Additionally,
-      Landfill often runs cutting-edge versions of Bugzilla for
-      testing, so some things may work slightly differently than
-      mentioned here.
-    </P
+>Landfill</A
+>, 
+    which you are welcome to play with (if it's up.) 
+    However, it does not necessarily
+    have all Bugzilla features enabled, and often runs cutting-edge versions
+    of Bugzilla for testing, so some things may work slightly differently
+    than mentioned here.</P
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="MYACCOUNT"
->2.3.1. Create a Bugzilla Account</A
-></H2
+NAME="myaccount">3.1.1. Create a Bugzilla Account</H2
 ><P
->	First things first!  If you want to use Bugzilla, first you
-	need to create an account.  Consult with the administrator
-	responsible for your installation of Bugzilla for the URL you
-	should use to access it. If you're test-driving the end-user
-	Bugzilla experience, use this URL: <A
-HREF="http://landfill.tequilarista.org/bugzilla-tip/"
+>If you want to use Bugzilla, first you need to create an account.
+      Consult with the administrator responsible for your installation of
+      Bugzilla for the URL you should use to access it. If you're
+      test-driving Bugzilla, use this URL: 
+      <A
+HREF="http://landfill.bugzilla.org/bugzilla-tip/"
 TARGET="_top"
-> http://landfill.tequilarista.org/bugzilla-tip/</A
+>&#13;      http://landfill.bugzilla.org/bugzilla-tip/</A
 >
       </P
 ><P
@@ -2069,631 +1641,539 @@ TARGET="_top"
 TYPE="1"
 ><LI
 ><P
->	    Click the "Open a new Bugzilla account" link.
-	  </P
-></LI
-><LI
-><P
->	    Enter your "E-mail address" and "Real Name" (or whatever
-	    name you want to call yourself) in the spaces provided,
-	    then select the "Create Account" button.
-	  </P
+>Click the 
+          <SPAN
+CLASS="QUOTE"
+>"Open a new Bugzilla account"</SPAN
+>
+
+          link, enter your email address and, optionally, your name in the
+          spaces provided, then click 
+          <SPAN
+CLASS="QUOTE"
+>"Create Account"</SPAN
+>
+
+          .</P
 ></LI
 ><LI
 ><P
->	    Within moments, you should receive an email to the address
-	    you provided above, which contains your login name
-	    (generally the same as the email address), and a password
-	    you can use to access your account.  This password is
-	    randomly generated, and should be changed at your nearest
-	    opportunity (we'll go into how to do it later).
-	  </P
+>Within moments, you should receive an email to the address
+          you provided above, which contains your login name (generally the
+          same as the email address), and a password you can use to access
+          your account. This password is randomly generated, and can be
+          changed to something more memorable.</P
 ></LI
 ><LI
 ><P
->	    Click the <SPAN
+>Click the 
+          <SPAN
 CLASS="QUOTE"
 >"Log In"</SPAN
-> link in the yellow area at
-	    the bottom of the page in your browser, then enter your
-	    <SPAN
-CLASS="QUOTE"
->"E-mail address"</SPAN
-> and <SPAN
-CLASS="QUOTE"
->"Password"</SPAN
 >
-	    you just received into the spaces provided, and select
-	    <SPAN
+          link in the yellow area at the bottom of the page in your browser,
+          enter your email address and password into the spaces provided, and
+          click 
+          <SPAN
 CLASS="QUOTE"
 >"Login"</SPAN
 >.
-	    <DIV
-CLASS="NOTE"
+          </P
+></LI
+></OL
 ><P
+>You are now logged in. Bugzilla uses cookies for authentication
+      so, unless your IP address changes, you should not have to log in
+      again.</P
+></DIV
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="bug_page">3.1.2. Anatomy of a Bug</H2
+><P
+>The core of Bugzilla is the screen which displays a particular
+      bug. It's a good place to explain some Bugzilla concepts. 
+      <A
+HREF="http://landfill.bugzilla.org/bugzilla-tip/show_bug.cgi?id=1"
+TARGET="_top"
+>&#13;      Bug 1 on Landfill</A
+>
+
+      is a good example. Note that the labels for most fields are hyperlinks;
+      clicking them will take you to context-sensitive help on that
+      particular field. Fields marked * may not be present on every
+      installation of Bugzilla.</P
+><P
+></P
+><OL
+TYPE="1"
+><LI
+><P
+>&#13;          <EM
+>Product and Component</EM
+>: 
+          Bugs are divided up by Product and Component, with a Product
+          having one or more Components in it. For example,
+          bugzilla.mozilla.org's "Bugzilla" Product is composed of several
+          Components: 
+          <P
 ></P
 ><TABLE
-CLASS="NOTE"
-WIDTH="90%"
 BORDER="0"
+><TBODY
 ><TR
 ><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
+>&#13;          <EM
+>Administration:</EM
+>
+          Administration of a Bugzilla installation.</TD
+></TR
+><TR
 ><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->		If you ever forget your password, you can come back to
-		this page, enter your <SPAN
-CLASS="QUOTE"
->"E-mail address"</SPAN
->,
-		then select the <SPAN
-CLASS="QUOTE"
->"E-mail me a password"</SPAN
+>&#13;          <EM
+>Bugzilla-General:</EM
 >
-		button to have your password mailed to you again so
-		that you can login.
-	      </P
-></TD
+          Anything that doesn't fit in the other components, or spans
+          multiple components.</TD
 ></TR
-></TABLE
-></DIV
+><TR
+><TD
+>&#13;          <EM
+>Creating/Changing Bugs:</EM
 >
-	    <DIV
-CLASS="CAUTION"
-><P
-></P
-><TABLE
-CLASS="CAUTION"
-WIDTH="90%"
-BORDER="0"
+          Creating, changing, and viewing bugs.</TD
+></TR
 ><TR
 ><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/caution.gif"
-HSPACE="5"
-ALT="Caution"></TD
+>&#13;          <EM
+>Documentation:</EM
+>
+          The Bugzilla documentation, including The Bugzilla Guide.</TD
+></TR
+><TR
 ><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->		Many modern browsers include an
-		<SPAN
-CLASS="QUOTE"
->"Auto-Complete"</SPAN
-> or <SPAN
-CLASS="QUOTE"
->"Form
-		  Fill"</SPAN
-> feature to remember the user names and
-		passwords you type in at many sites.  Unfortunately,
-		sometimes they attempt to guess what you will put in
-		as your password, and guess wrong.  If you notice a
-		text box is already filled out, please overwrite the
-		contents of the text box so you can be sure to input
-		the correct information.
-	      </P
-></TD
+>&#13;          <EM
+>Email:</EM
+>
+          Anything to do with email sent by Bugzilla.</TD
+></TR
+><TR
+><TD
+>&#13;          <EM
+>Installation:</EM
+>
+          The installation process of Bugzilla.</TD
+></TR
+><TR
+><TD
+>&#13;          <EM
+>Query/Buglist:</EM
+>
+          Anything to do with searching for bugs and viewing the
+          buglists.</TD
+></TR
+><TR
+><TD
+>&#13;          <EM
+>Reporting/Charting:</EM
+>
+          Getting reports from Bugzilla.</TD
+></TR
+><TR
+><TD
+>&#13;          <EM
+>User Accounts:</EM
+>
+          Anything about managing a user account from the user's perspective.
+          Saved queries, creating accounts, changing passwords, logging in,
+          etc.</TD
+></TR
+><TR
+><TD
+>&#13;          <EM
+>User Interface:</EM
+>
+          General issues having to do with the user interface cosmetics (not
+          functionality) including cosmetic issues, HTML templates,
+          etc.</TD
 ></TR
+></TBODY
 ></TABLE
-></DIV
+><P
+></P
 >
-	  </P
+          </P
 ></LI
-></OL
+><LI
 ><P
->	Congratulations!  If you followed these directions, you now
-	are the proud owner of a user account on
-	landfill.tequilarista.org (Landfill) or your local Bugzilla
-	install.  You should now see in your browser a page called the
-	<SPAN
-CLASS="QUOTE"
->"Bugzilla Query Page"</SPAN
->.  It may look daunting, but with this
-	Guide to walk you through it, you will master it in no time.
-      </P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
-><A
-NAME="QUERY"
->2.3.2. The Bugzilla Query Page</A
-></H2
-><P
->	The Bugzilla Query Page is the heart and soul of the Bugzilla
-	user experience.  It is the master interface where you can
-	find any bug report, comment, or patch currently in the
-	Bugzilla system.  We'll go into how to create your own bug
-	report later on.
-      </P
-><P
->	There are efforts underway to simplify query usage.  If you
-	have a local installation of Bugzilla 2.12 or higher, you
-	should have <TT
-CLASS="FILENAME"
->quicksearch.html</TT
-> available to
-	use and simplify your searches.  There is also a helper for
-	the query interface, called
-	<TT
-CLASS="FILENAME"
->queryhelp.cgi</TT
->.  Landfill tends to run the
-	latest code, so these two utilities should be available there
-	for your perusal.
-      </P
-><P
->	At this point, please visit the main Bugzilla site,
-	<A
-HREF="http://bugzilla.mozilla.org/query.cgi"
-TARGET="_top"
->	bugzilla.mozilla.org</A
->, to see a more fleshed-out query page.
-      </P
+>&#13;          <EM
+>Status and Resolution:</EM
+>
+
+          These define exactly what state the bug is in - from not even
+          being confirmed as a bug, through to being fixed and the fix
+          confirmed by Quality Assurance. The different possible values for
+          Status and Resolution on your installation should be documented in the
+          context-sensitive help for those items.</P
+></LI
+><LI
 ><P
->	The first thing you need to notice about the Bugzilla Query
-	Page is that nearly every box you see on your screen has a
-	hyperlink nearby, explaining what it is or what it does.  Near
-	the upper-left-hand corner of your browser window you should
-	see the word <SPAN
-CLASS="QUOTE"
->"Status"</SPAN
-> underlined.  Select it.
-      </P
+>&#13;          <EM
+>Assigned To:</EM
+>
+          The person responsible for fixing the bug.</P
+></LI
+><LI
 ><P
->	Notice the page that popped up?  Every underlined word you see
-	on your screen is a hyperlink that will take you to
-	context-sensitive help. Click around for a while, and learn
-	what everything here does.  To return to the query interface
-	after pulling up a help page, use the <SPAN
-CLASS="QUOTE"
->"Back"</SPAN
+>&#13;          <EM
+>*URL:</EM
 >
-	button in your browser.
-      </P
+          A URL associated with the bug, if any.</P
+></LI
+><LI
 ><P
->	I'm sure that after checking out the online help, you are now
-	an expert on the Bugzilla Query Page.  If, however, you feel
-	you haven't mastered it yet, let me walk you through making a
-	few successful queries to find out what there are in the
-	Bugzilla bug-tracking system itself.
-      </P
+>&#13;          <EM
+>Summary:</EM
+>
+          A one-sentence summary of the problem.</P
+></LI
+><LI
 ><P
-></P
-><OL
-TYPE="1"
+>&#13;          <EM
+>*Status Whiteboard:</EM
+>
+          (a.k.a. Whiteboard) A free-form text area for adding short notes
+          and tags to a bug.</P
+></LI
 ><LI
 ><P
->	    Ensure you are back on the <SPAN
-CLASS="QUOTE"
->"Bugzilla Query
-	      Page"</SPAN
->. Do nothing in the boxes marked "Status",
-	    "Resolution", "Platform", "OpSys", "Priority", or
-	    "Severity".  The default query for "Status" is to find all
-	    bugs that are NEW, ASSIGNED, or REOPENED, which is what we
-	    want.  If you don't select anything in the other 5
-	    scrollboxes there, then you are saying that "any of these
-	    are OK"; we're not locking ourselves into only finding
-	    bugs on the "DEC" Platform, or "Windows 95" OpSys
-	    (Operating System).  You're smart, I think you have it
-	    figured out.
-	  </P
+>&#13;          <EM
+>*Keywords:</EM
+>
+          The administrator can define keywords which you can use to tag and
+          categorise bugs - e.g. The Mozilla Project has keywords like crash
+          and regression.</P
+></LI
+><LI
 ><P
->	    Basically, selecting <EM
->anything</EM
-> on the
-	    query page narrows your search down.  Leaving stuff
-	    unselected, or text boxes unfilled, broadens your search.
-	  </P
+>&#13;          <EM
+>Platform and OS:</EM
+>
+          These indicate the computing environment where the bug was
+          found.</P
 ></LI
 ><LI
 ><P
->	    You see the box immediately below the top six boxes that
-	    contains an "Email" text box,  with the words "matching
-	    as", a drop-down selection box, then some checkboxes with
-	    "Assigned To" checked by default?  This allows you to
-	    filter your search down based upon email address.  Let's
-	    put my email address in there, and see what happens.
-	  </P
+>&#13;          <EM
+>Version:</EM
+>
+          The "Version" field is usually used for versions of a product which
+          have been released, and is set to indicate which versions of a
+          Component have the particular problem the bug report is
+          about.</P
+></LI
+><LI
 ><P
->	    Type "barnboy@trilobyte.net" in the top Email text box.
-	  </P
+>&#13;          <EM
+>Priority:</EM
+>
+          The bug assignee uses this field to prioritise his or her bugs.
+          It's a good idea not to change this on other people's bugs.</P
 ></LI
 ><LI
 ><P
->	    Let's narrow the search some more.  Scroll down until you
-	    find the box with the word "Program" over the top of it.
-	    This is where we can narrow our search down to only
-	    specific products (software programs or product lines) in
-	    our Bugzilla database. Please notice the box is a
-	    <EM
->scrollbox</EM
->.  Using the down arrow on
-	    the scrollbox, scroll down until you can see an entry
-	    called "Bugzilla".  Select this entry.
-	  </P
+>&#13;          <EM
+>Severity:</EM
+>
+          This indicates how severe the problem is - from blocker
+          ("application unusable") to trivial ("minor cosmetic issue"). You
+          can also use this field to indicate whether a bug is an enhancement
+          request.</P
 ></LI
 ><LI
 ><P
->	    Did you notice that some of the boxes to the right changed
-	    when you selected "Bugzilla"? Every Program (or Product)
-	    has different Versions, Components, and Target Milestones
-	    associated with it.  A "Version" is the number of a
-	    software program.
-	    <DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN307"
-></A
+>&#13;          <EM
+>*Target:</EM
+>
+          (a.k.a. Target Milestone) A future version by which the bug is to
+          be fixed. e.g. The Bugzilla Project's milestones for future
+          Bugzilla versions are 2.18, 2.20, 3.0, etc. Milestones are not
+          restricted to numbers, thought - you can use any text strings, such
+          as dates.</P
+></LI
+><LI
 ><P
-><B
->Example 2-1. Some Famous Software Versions</B
-></P
-><DIV
-CLASS="INFORMALEXAMPLE"
-><A
-NAME="AEN309"
-></A
+>&#13;          <EM
+>Reporter:</EM
+>
+          The person who filed the bug.</P
+></LI
+><LI
 ><P
-></P
+>&#13;          <EM
+>CC list:</EM
+>
+          A list of people who get mail when the bug changes.</P
+></LI
+><LI
 ><P
->		  Do you remember the hype in 1995 when Microsoft
-		  Windows 95(r) was released? It may have been several
-		  years ago, but Microsoft(tm) spent over $300 Million
-		  advertising this new Version of their software.
-		  Three years later, they released Microsoft Windows
-		  98(r), another new version, to great fanfare, and
-		  then in 2000 quietly  released Microsoft Windows
-		  ME(Millenium Edition)(r). 
-		</P
+>&#13;          <EM
+>Attachments:</EM
+>
+          You can attach files (e.g. testcases or patches) to bugs. If there
+          are any attachments, they are listed in this section.</P
+></LI
+><LI
 ><P
->		  Software "Versions" help a manufacturer
-		  differentiate their current product from their
-		  previous products.  Most do not identify their
-		  products by the year they were released. Instead,
-		  the "original" version of their software will often
-		  be numbered "1.0", with small bug-fix releases on
-		  subsequent tenths of a digit.  In most cases, it's
-		  not a decimal number; for instance, often 1.9 is an
-		  <EM
->older</EM
-> version of the software
-		  than 1.11, but is a <EM
->newer</EM
->
-		  version than 1.1.1.
-		</P
+>&#13;          <EM
+>*Dependencies:</EM
+>
+          If this bug cannot be fixed unless other bugs are fixed (depends
+          on), or this bug stops other bugs being fixed (blocks), their
+          numbers are recorded here.</P
+></LI
+><LI
 ><P
->		  In general, a "Version" in Bugzilla should refer to
-		  <EM
->released</EM
-> products, not products
-		  that have not yet been released  to the public.
-		  Forthcoming products are what the Target Milestone
-		  field is for.
-		</P
+>&#13;          <EM
+>*Votes:</EM
+>
+          Whether this bug has any votes.</P
+></LI
+><LI
 ><P
-></P
-></DIV
+>&#13;          <EM
+>Additional Comments:</EM
+>
+          You can add your two cents to the bug discussion here, if you have
+          something worthwhile to say.</P
+></LI
+></OL
 ></DIV
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="query">3.1.3. Searching for Bugs</H2
+><P
+>The Bugzilla Search page is is the interface where you can find
+      any bug report, comment, or patch currently in the Bugzilla system. You
+      can play with it here: 
+      <A
+HREF="http://landfill.bugzilla.org/bugzilla-tip/query.cgi"
+TARGET="_top"
+>&#13;      landfill.bugzilla.org/bugzilla-tip/query.cgi</A
 >
-	  </P
+
+      .</P
 ><P
->	    A "Component" is a piece of a Product.
-	    It may be a standalone program, or some other logical
-	    division of a Product or Program. 
-	    Normally, a Component has a single Owner, who is responsible
-	    for overseeing efforts to improve that Component.
-	    <DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN317"
-></A
+>The Search page has controls for selecting different possible
+      values for all of the fields in a bug, as described above. Once you've
+      defined a search, you can either run it, or save it as a Remembered
+      Query, which can optionally appear in the footer of your pages.</P
 ><P
-><B
->Example 2-2. Mozilla's Bugzilla Components</B
-></P
+>Highly advanced querying is done using Boolean Charts, which have
+      their own 
+      <A
+HREF="http://landfill.bugzilla.org/bugzilla-tip/booleanchart.html"
+TARGET="_top"
+>&#13;      context-sensitive help</A
+>
+
+      .</P
+></DIV
 ><DIV
-CLASS="INFORMALEXAMPLE"
+CLASS="section"
+><HR><H2
+CLASS="section"
 ><A
-NAME="AEN319"
-></A
+NAME="list">3.1.4. Bug Lists</H2
 ><P
-></P
+>If you run a search, a list of matching bugs will be returned.
+      The default search is to return all open bugs on the system - don't try
+      running this search on a Bugzilla installation with a lot of
+      bugs!</P
 ><P
->		  Mozilla's "Bugzilla" Product is composed of several pieces (Components):
-		  <P
+>The format of the list is configurable. For example, it can be
+      sorted by clicking the column headings. Other useful features can be
+      accessed using the links at the bottom of the list: 
+      <P
 ></P
 ><TABLE
 BORDER="0"
 ><TBODY
 ><TR
 ><TD
-><EM
->Administration</EM
->,
-                      Administration of a bugzilla installation, including 
-                      <TT
-CLASS="FILENAME"
->editcomponents.cgi</TT
->,
-                      <TT
-CLASS="FILENAME"
->editgroups.cgi</TT
->, 
-                      <TT
-CLASS="FILENAME"
->editkeywords.cgi</TT
->, 
-                      <TT
-CLASS="FILENAME"
->editparams.cgi</TT
->,
-                      <TT
-CLASS="FILENAME"
->editproducts.cgi</TT
->,
-                      <TT
-CLASS="FILENAME"
->editusers.cgi</TT
->,
-                      <TT
-CLASS="FILENAME"
->editversions.cgi,</TT
-> and
-                      <TT
-CLASS="FILENAME"
->sanitycheck.cgi</TT
->.
-                    </TD
-></TR
-><TR
-><TD
-><EM
->Bugzilla-General</EM
->,
-                      Anything that doesn't fit in the other components, or spans
-                      multiple components.
-                    </TD
-></TR
-><TR
-><TD
-><EM
->Creating/Changing Bugs</EM
->,
-                      Creating, changing, and viewing bugs.
-                      <TT
-CLASS="FILENAME"
->enter_bug.cgi</TT
->,
-                      <TT
-CLASS="FILENAME"
->post_bug.cgi</TT
->,
-                      <TT
-CLASS="FILENAME"
->show_bug.cgi</TT
-> and
-                      <TT
-CLASS="FILENAME"
->process_bug.cgi</TT
->.
-                    </TD
-></TR
-><TR
-><TD
-><EM
->Documentation</EM
->,
-                      The bugzilla documentation, including anything in the
-                      <TT
-CLASS="FILENAME"
->docs/</TT
-> directory and The Bugzilla Guide
-                      (This document :)
-                    </TD
-></TR
-><TR
-><TD
-><EM
->Email</EM
->,
-                      Anything to do with email sent by Bugzilla.
-                      <TT
-CLASS="FILENAME"
->processmail</TT
+>&#13;        <EM
+>Long Format:</EM
 >
-                    </TD
-></TR
-><TR
-><TD
-><EM
->Installation</EM
->,
-                      The installation process of Bugzilla. This includes
-                      <TT
-CLASS="FILENAME"
->checksetup.pl</TT
-> and whatever else it evolves into.
-                    </TD
+
+        this gives you a large page with a non-editable summary of the fields
+        of each bug.</TD
 ></TR
 ><TR
 ><TD
-><EM
->Query/Buglist</EM
->,
-                      Anything to do with searching for bugs and viewing the buglists.
-                      <TT
-CLASS="FILENAME"
->query.cgi</TT
-> and
-                      <TT
-CLASS="FILENAME"
->buglist.cgi</TT
+>&#13;        <EM
+>Change Columns:</EM
 >
-                    </TD
+
+        change the bug attributes which appear in the list.</TD
 ></TR
 ><TR
 ><TD
-><EM
->Reporting/Charting</EM
->,
-                      Getting reports from Bugzilla.
-                      <TT
-CLASS="FILENAME"
->reports.cgi</TT
-> and
-                      <TT
-CLASS="FILENAME"
->duplicates.cgi</TT
+>&#13;        <EM
+>Change several bugs at once:</EM
 >
-                    </TD
+
+        If your account is sufficiently empowered, you can make the same
+        change to all the bugs in the list - for example, changing their
+        owner.</TD
 ></TR
 ><TR
 ><TD
-><EM
->User Accounts</EM
->,
-                      Anything about managing a user account from the user's perspective.
-                      <TT
-CLASS="FILENAME"
->userprefs.cgi</TT
->, saved queries, creating accounts,
-                      changing passwords, logging in, etc. 
-                    </TD
+>&#13;        <EM
+>Send mail to bug owners:</EM
+>
+
+        Sends mail to the owners of all bugs on the list.</TD
 ></TR
 ><TR
 ><TD
-><EM
->User Interface</EM
->,
-                      General issues having to do with the user interface cosmetics (not
-                      functionality) including cosmetic issues, HTML templates, etc.
-                    </TD
+>&#13;        <EM
+>Edit this query:</EM
+>
+
+        If you didn't get exactly the results you were looking for, you can
+        return to the Query page through this link and make small revisions
+        to the query you just made so you get more accurate results.</TD
 ></TR
 ></TBODY
 ></TABLE
 ><P
 ></P
 >
-		</P
-><P
-></P
-></DIV
+      </P
 ></DIV
->
-	  </P
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="bugreports">3.1.5. Filing Bugs</H2
 ><P
->	    A "Milestone", or "Target Milestone" is a often a planned
-	    future "Version" of a product.  In many cases, though,
-	    Milestones simply represent significant dates for a
-	    developer.  Having certain features in your Product is
-	    frequently tied to revenue (money) the developer will
-	    receive if the features work by the time she  reaches the
-	    Target Milestone. Target Milestones are a great tool to
-	    organize your time. If someone will pay you $100,000 for
-	    incorporating certain features by a certain date, those
-	    features by that Milestone date become a very high
-	    priority.  Milestones tend to be highly malleable
-	    creatures, though, that appear to be in reach but are out
-	    of reach by the time the important day arrives.
-	  </P
+>Years of bug writing experience has been distilled for your
+      reading pleasure into the 
+      <A
+HREF="http://landfill.bugzilla.org/bugzilla-tip/bugwritinghelp.html"
+TARGET="_top"
+>&#13;      Bug Writing Guidelines</A
+>. 
+      While some of the advice is Mozilla-specific, the basic principles of
+      reporting Reproducible, Specific bugs, isolating the Product you are
+      using, the Version of the Product, the Component which failed, the
+      Hardware Platform, and Operating System you were using at the time of
+      the failure go a long way toward ensuring accurate, responsible fixes
+      for the bug that bit you.</P
 ><P
->	    The Bugzilla Project has set up Milestones for future
-	    Bugzilla versions 2.14, 2.16, 2.18, 3.0, etc.  However, a
-	    Target Milestone can just as easily be a specific date,
-	    code name, or weird alphanumeric combination, like "M19".
-	  </P
+>The procedure for filing a test bug is as follows:</P
+><P
+></P
+><OL
+TYPE="1"
+><LI
+><P
+>Go to 
+          <A
+HREF="http://landfill.bugzilla.org/bugzilla-tip/"
+TARGET="_top"
+>&#13;          Landfill</A
+>
+          in your browser and click 
+          <A
+HREF="http://landfill.bugzilla.org/bugzilla-tip/enter_bug.cgi"
+TARGET="_top"
+>&#13;          Enter a new bug report</A
+>.
+          </P
 ></LI
 ><LI
 ><P
->	    OK, now let's select the "Bugzilla" component from its scrollbox.
-	  </P
+>Select a product - any one will do.</P
 ></LI
 ><LI
 ><P
->	    Skip down the page a bit -- do you see the "submit query" button?
-	    Select it, and let's run
-	    this query!
-	  </P
+>Fill in the fields. Bugzilla should have made reasonable
+          guesses, based upon your browser, for the "Platform" and "OS"
+          drop-down boxes. If they are wrong, change them.</P
 ></LI
 ><LI
 ><P
->	    Congratulations!  You've completed your first Query, and
-	    have before you the Bug List of the author of this Guide,
-	    Matthew P. Barnson (barnboy@trilobyte.net).  If I'm doing
-	    well, you'll have a cryptic "Zarro Boogs Found" message on
-	    your screen.  It is just a happy hacker's way of saying
-	    "Zero Bugs Found".  However, I am fairly certain I will
-	    always have some bugs assigned to me that aren't done yet,
-	    so you won't often see that message!
-	  </P
+>Select "Commit" and send in your bug report.</P
 ></LI
 ></OL
+></DIV
+></DIV
+><DIV
+CLASS="section"
+><HR><H1
+CLASS="section"
+><A
+NAME="hintsandtips">3.2. Hints and Tips</H1
 ><P
->	I encourage you to click the bug numbers in the left-hand
-	column and examine my bugs.  Also notice that if you click the
-	underlined  links near the top of this page, they do not take
-	you to context-sensitive help here, but instead sort the
-	columns of bugs on the screen! When you need to sort your bugs
-	by priority, severity, or the people they are assigned to,
-	this is a tremendous timesaver.
-      </P
+>This section distills some Bugzilla tips and best practices
+    that have been developed.</P
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="AEN434">3.2.1. Autolinkification</H2
 ><P
->	A couple more interesting things about the Bug List page:
-	<P
+>Bugzilla comments are plain text - so posting HTML will result
+      in literal HTML tags rather than being interpreted by a browser.
+      However, Bugzilla will automatically make hyperlinks out of certain
+      sorts of text in comments. For example, the text 
+      http://www.bugzilla.org will be turned into
+      <A
+HREF="http://www.bugzilla.org"
+TARGET="_top"
+>http://www.bugzilla.org</A
+>.
+      Other strings which get linkified in the obvious manner are:
+      <P
 ></P
 ><TABLE
 BORDER="0"
 ><TBODY
 ><TR
 ><TD
-><EM
->Change Columns</EM
->: by selecting
-	    this link, you can show all kinds of information in the
-	    Bug List</TD
+>bug 12345</TD
 ></TR
 ><TR
 ><TD
-><EM
->Change several bugs at once</EM
->: If
-	    you have sufficient rights to change all the bugs shown in
-	    the Bug List, you can mass-modify them. This is a big
-	    time-saver.</TD
+>bug 23456, comment 53</TD
 ></TR
 ><TR
 ><TD
-><EM
->Send mail to bug owners</EM
->: If you
-	    have many related bugs, you can request an update from
-	    every person who owns the bugs in the Bug List asking them
-	    the status.</TD
+>attachment 4321</TD
 ></TR
 ><TR
 ><TD
-><EM
->Edit this query</EM
->: If you didn't
-	    get exactly the results you were looking for, you can
-	    return to the Query page through this link and make small
-	    revisions to the query you just made so you get more
-	    accurate results.</TD
+>mailto:george@example.com</TD
+></TR
+><TR
+><TD
+>george@example.com</TD
+></TR
+><TR
+><TD
+>ftp://ftp.mozilla.org</TD
+></TR
+><TR
+><TD
+>Most other sorts of URL</TD
 ></TR
 ></TBODY
 ></TABLE
@@ -2701,405 +2181,170 @@ BORDER="0"
 ></P
 >
       </P
-><DIV
-CLASS="NOTE"
 ><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
+>A corollary here is that if you type a bug number in a comment,
+      you should put the word "bug" before it, so it gets autolinkified
+      for the convenience of others.
+      </P
+></DIV
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="quicksearch">3.2.2. Quicksearch</H2
+><P
+>Quicksearch is a single-text-box query tool which uses
+      metacharacters to indicate what is to be searched. For example, typing
+      "<TT
+CLASS="filename"
+>foo|bar</TT
+>" 
+      into Quicksearch would search for "foo" or "bar" in the 
+      summary and status whiteboard of a bug; adding 
+      "<TT
+CLASS="filename"
+>:BazProduct</TT
+>" would
+      search only in that product.
+      </P
 ><P
->	  There are many more options to the Bugzilla Query Page  and
-	  the Bug List than I have shown you. But this should be
-	  enough for you to learn to get around. I encourage you to
-	  check out the <A
-HREF="http://www.mozilla.org/bugs/"
+>You'll find the Quicksearch box on Bugzilla's
+      front page, along with a 
+      <A
+HREF="../../quicksearch.html"
 TARGET="_top"
->Bugzilla Home Page</A
-> to learn about the Anatomy and Life Cycle of a Bug before continuing.
-	</P
-></TD
-></TR
-></TABLE
+>Help</A
+> 
+      link which details how to use it.</P
 ></DIV
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="commenting">3.2.3. Comments</H2
+><P
+>If you are changing the fields on a bug, only comment if
+      either you have something pertinent to say, or Bugzilla requires it.
+      Otherwise, you may spam people unnecessarily with bug mail.
+      To take an example: a user can set up their account to filter out messages
+      where someone just adds themselves to the CC field of a bug
+      (which happens a lot.) If you come along, add yourself to the CC field,
+      and add a comment saying "Adding self to CC", then that person
+      gets a pointless piece of mail they would otherwise have avoided.
+      </P
+><P
+>&#13;      Don't use sigs in comments. Signing your name ("Bill") is acceptable,
+      particularly if you do it out of habit, but full mail/news-style
+      four line ASCII art creations are not.
+      </P
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="BUGREPORTS"
->2.3.3. Creating and Managing Bug Reports</A
-></H2
-><TABLE
-BORDER="0"
-WIDTH="100%"
-CELLSPACING="0"
-CELLPADDING="0"
-CLASS="EPIGRAPH"
-><TR
-><TD
-WIDTH="45%"
->&nbsp;</TD
-><TD
-WIDTH="45%"
-ALIGN="LEFT"
-VALIGN="TOP"
-><I
-><P
-><I
->And all this time, I thought we were taking bugs <EM
->out</EM
->...</I
-></P
-></I
-></TD
-></TR
-></TABLE
-><DIV
-CLASS="SECTION"
-><HR><H3
-CLASS="SECTION"
-><A
-NAME="BUG_WRITING"
->2.3.3.1. Writing a Great Bug Report</A
-></H3
-><P
->	  Before we plunge into writing your first bug report, I
-	  encourage you to read some bug-writing guidelines.  If you
-	  are reading this document as part of a Bugzilla CVS checkout
-	  or un-tarred Bugzilla distribution, you should be able to
-	  read them by clicking <A
-HREF="../../bugwritinghelp.html"
-TARGET="_top"
->here</A
->.  If you are reading this online, check out the Mozilla.org bug-writing guidelines at <A
-HREF="http://www.mozilla.org/quality/bug-writing-guidelines.html"
-TARGET="_top"
->http://www.mozilla.org/quality/bug-writing-guidelines.html</A
->.  While some of the advice is Mozilla-specific, the basic principles of reporting Reproducible, Specific bugs, isolating the Product you are using, the Version of the Product, the Component which failed, the Hardware Platform, and Operating System you were using at the time of the failure go a long way toward ensuring accurate, responsible fixes for the bug that bit you.
-	</P
-><P
->	  While you are at it, why not learn how to find previously
-	  reported bugs?  Mozilla.org has published a great tutorial
-	  on finding duplicate bugs, available at <A
-HREF="http://www.mozilla.org/quality/help/beginning-duplicate-finding.html"
-TARGET="_top"
-> http://www.mozilla.org/quality/help/beginning-duplicate-finding.html</A
->.
-	</P
-><P
->	  I realize this was a lot to read.  However, understanding
-	  the mentality of writing great bug reports will help us on
-	  the next part!
-	</P
-><P
-></P
-><OL
-TYPE="1"
-><LI
-><P
->	      Go back to <A
-HREF="http://landfill.tequilarista.org/bugzilla-tip/"
-TARGET="_top"
-> http://landfill.tequilarista.org/bugzilla-tip/</A
-> in your browser.
-	    </P
-></LI
-><LI
-><P
->	      Select the  <A
-HREF="http://landfill.tequilarista.org/bugzilla-tip/enter_bug.cgi"
-TARGET="_top"
-> Enter a new bug report</A
-> link.
-	    </P
-></LI
-><LI
-><P
->	      Select a product.
-	    </P
-></LI
-><LI
-><P
->	      Now you should be at the "Enter Bug" form. The
-	      "reporter" should have been automatically filled out for
-	      you (or else Bugzilla prompted you to Log In again --
-	      you did keep the email with your username and password,
-	      didn't you?).
-	    </P
-></LI
-><LI
-><P
->	      Select a Component in the scrollbox.
-	    </P
-></LI
-><LI
+NAME="attachments">3.2.4. Attachments</H2
 ><P
->	      Bugzilla should have made reasonable guesses, based upon
-	      your browser, for the "Platform" and "OS" drop-down
-	      boxes.  If those are wrong, change them -- if you're on
-	      an SGI box running IRIX, we want to know!
-	    </P
-></LI
-><LI
-><P
->	      Fill in the "Assigned To" box with the email address you
-	      provided earlier.  This way you don't end up sending
-	      copies of your bug to lots of other people, since it's
-	      just a test bug.
-	    </P
-></LI
-><LI
-><P
->	      Leave the "CC" text box blank.  Fill in the "URL" box
-	      with "http://www.mozilla.org".
-	    </P
-></LI
-><LI
+>&#13;      Use attachments, rather than comments, for large chunks of ASCII data,
+      such as trace, debugging output files, or log files. That way, it doesn't
+      bloat the bug for everyone who wants to read it, and cause people to
+      receive fat, useless mails.
+      </P
 ><P
->	      Enter "The Bugzilla Guide" in the Summary text box, and
-	      place any comments you have on this tutorial, or the
-	      Guide in general, into the Description box.
-	    </P
-></LI
-></OL
+>Trim screenshots. There's no need to show the whole screen if
+      you are pointing out a single-pixel problem.
+      </P
 ><P
->	  Voila!  Select "Commit" and send in your bug report! Next
-	  we'll look at resolving bugs.
-	</P
+>Don't attach simple test cases (e.g. one HTML file, one 
+      CSS file and an image) as a ZIP file. Instead, upload them in 
+      reverse order and edit the referring file so that they point to the
+      attached files. This way, the test case works immediately 
+      out of the bug.
+      </P
 ></DIV
 ><DIV
-CLASS="SECTION"
-><HR><H3
-CLASS="SECTION"
+CLASS="section"
+><HR><H2
+CLASS="section"
 ><A
-NAME="BUG_MANAGE"
->2.3.3.2. Managing your Bug Reports</A
-></H3
-><P
->	  OK, you should have a link to the bug you just created near
-	  the top of your page. It should say "Bug XXXX posted", with
-	  a link to the right saying "Back to BUG# XXXX". Select this
-	  link.
-	</P
-><P
-></P
-><OL
-TYPE="1"
-><LI
-><P
->	      Scroll down a bit on the subsequent page, until you see
-	      the "Resolve bug, changing resolution to (dropdown box).
-	      Normally, you would "Accept bug (change status to
-	      ASSIGNED)", fix it, and then resolve. But in this case,
-	      we're going to short-circuit the process because this
-	      wasn't a real bug. Change the dropdown next to "Resolve
-	      Bug" to "INVALID", make sure the radio button is marked
-	      next to "Resolve Bug", then click "Commit".
-	    </P
-></LI
-><LI
-><P
->	      Hey!  It said it couldn't take the change in a big red
-	      box! That's right, you must specify a Comment in order
-	      to make this change.  Select the "Back" button in your
-	      browser, add a Comment, then try Resolving the bug with
-	      INVALID status again. This time it should work.
-	    </P
-></LI
-></OL
-><P
->	  You have now learned the basics of Bugzilla navigation,
-	  entering a bug, and bug maintenance. I encourage you to
-	  explore these features, and see what you can do with them!
-	  We'll spend no more time on individual Bugs or Queries from
-	  this point on, so you are on your own there.
-	</P
-><P
->	  But I'll give a few last hints!
-	</P
+NAME="AEN463">3.2.5. Filing Bugs</H2
 ><P
->	  There is a <A
-HREF="http://bugzilla.mozilla.org/help.html"
-TARGET="_top"
->CLUE</A
-> on the Query page that will teach you more how to use the form.
-	</P
-><P
->	  If you click the hyperlink on the <A
-HREF="http://bugzilla.mozilla.org/describecomponents.cgi"
-TARGET="_top"
->Component</A
-> box of the Query page, you will be presented a form that will describe what all the components are.
-	</P
+>Try to make sure that everything said in the summary is also 
+      said in the first comment. Summaries are often updated and this will
+      ensure your original information is easily accessible.
+      </P
 ><P
->	  Possibly the most powerful feature of the Query page is the
-	  <A
-HREF="http://bugzilla.mozilla.org/booleanchart.html"
-TARGET="_top"
->Boolean Chart</A
-> section. It's a bit confusing to use the first time, but can provide unparalleled flexibility in your queries, allowing you to build extremely powerful requests.
-	</P
+>&#13;      You do not need to put "any" or similar strings in the URL field.
+      If there is no specific URL associated with the bug, leave this 
+      field blank.
+      </P
 ><P
->	  Finally, you can build some nifty  <A
-HREF="http://bugzilla.mozilla.org/reports.cgi"
-TARGET="_top"
->Reports</A
-> using the "Bug Reports" link near the bottom of the query page, and also available via the "Reports" link at the footer of each page.
-	</P
-></DIV
+>If you feel a bug you filed was incorrectly marked as a
+      DUPLICATE of another, please question it in your bug, not      
+      the bug it was duped to. Feel free to CC the person who duped it 
+      if they are not already CCed.
+      </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="INIT4ME"
->2.4. Where can I find my user preferences?</A
-></H1
-><TABLE
-BORDER="0"
-WIDTH="100%"
-CELLSPACING="0"
-CELLPADDING="0"
-CLASS="EPIGRAPH"
-><TR
-><TD
-WIDTH="45%"
->&nbsp;</TD
-><TD
-WIDTH="45%"
-ALIGN="LEFT"
-VALIGN="TOP"
-><I
-><P
-><I
->Indiana, it feels like we walking on fortune cookies!</I
-></P
-><P
-><I
->These ain't fortune cookies, kid...</I
-></P
-></I
-></TD
-></TR
-></TABLE
+NAME="userpreferences">3.3. User Preferences</H1
 ><P
->      Customized User Preferences offer tremendous versatility to your
-      individual Bugzilla experience. Let's plunge into what you can
-      do!  The first step is to click the "Edit prefs" link at the
-      footer of each page once you have logged in to <A
-HREF="http://landfill.tequilarista.org/bugzilla-tip/query.cgi?GoAheadAndLogIn=1"
-TARGET="_top"
-> Landfill</A
->.
-    </P
+>Once you have logged in, you can customise various aspects of 
+    Bugzilla via the "Edit prefs" link in the page footer.
+    The preferences are split into four tabs:</P
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="ACCOUNTSETTINGS"
->2.4.1. Account Settings</A
-></H2
+NAME="accountsettings">3.3.1. Account Settings</H2
 ><P
->	On this page, you can change your basic Account Settings,
-	including your password and full name. For security reasons,
-	in order to change anything on this page you must type your
-	<EM
+>On this tab, you can change your basic account information,
+      including your password, email address and real name. For security
+      reasons, in order to change anything on this page you must type your 
+      <EM
 >current</EM
-> password into the <SPAN
-CLASS="QUOTE"
->"Old
-	  Password"</SPAN
-> field.  If you wish to change your
-	password, type the new password you want into the <SPAN
-CLASS="QUOTE"
->"New
-	  Password"</SPAN
-> field and again into the <SPAN
-CLASS="QUOTE"
->"Re-enter
-	  new password"</SPAN
-> field to ensure you typed your new
-	password correctly.  Select the <SPAN
+>
+      password into the 
+      <SPAN
 CLASS="QUOTE"
->"Submit"</SPAN
-> button
-	    and you are done.
-      </P
+>"Password"</SPAN
+>
+      field at the top of the page. 
+      If you attempt to change your email address, a confirmation
+      email is sent to both the old and new addresses, with a link to use to
+      confirm the change. This helps to prevent account hijacking.</P
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="EMAILSETTINGS"
->2.4.2. Email Settings</A
-></H2
-><DIV
-CLASS="SECTION"
-><H3
-CLASS="SECTION"
-><A
-NAME="NOTIFICATION"
->2.4.2.1. Email Notification</A
-></H3
+NAME="emailsettings">3.3.2. Email Settings</H2
 ><P
->	  Here you can reduce or increase the amount of email sent you
-	  from Bugzilla.  Although this is referred to as
-	  <SPAN
-CLASS="QUOTE"
->"Advanced Email Filtering Options"</SPAN
->, they are,
-	  in fact, the standard email filter set.  All of them are
-	  self-explanatory, but you can use the filters in interesting
-	  ways.  For instance, some people (notably Quality Assurance
-	  personnel) often only care to receive updates regarding a
-	  bug when the bug changes state, so they can track bugs on
-	  their flow charts and know when it is time to pull the bug
-	  onto a quality assurance platform for inspection.  Other
-	  people set up email gateways to
-	    <A
-HREF="#BONSAI"
->Bonsai, the Mozilla automated CVS management system</A
-> or <A
-HREF="#TINDERBOX"
->Tinderbox, the Mozilla automated build management system</A
->, and
-	  restrict which types of Bugzilla information are fed to
-	  these systems..
-	</P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H3
-CLASS="SECTION"
-><A
-NAME="NEWEMAILTECH"
->2.4.2.2. New Email Technology</A
-></H3
+>On this tab you can reduce or increase the amount of email sent
+      you from Bugzilla, opting in our out depending on your relationship to
+      the bug and the change that was made to it. (Note that you can also do
+      client-side filtering using the X-Bugzilla-Reason header which Bugzilla
+      adds to all bugmail.)</P
+><P
+>By entering user email names, delineated by commas, into the
+      "Users to watch" text entry box you can receive a copy of all the
+      bugmail of other users (security settings permitting.) This powerful
+      functionality enables seamless transitions as developers change
+      projects or users go on holiday.</P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -3115,97 +2360,81 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	    This option may not be available in all Bugzilla
-	    installations, depending upon the preferences of the
-	    systems administrator responsible for the setup of your
-	    Bugzilla. However, if you really want this functionality,
-	    ask her to "enable newemailtech in Params" and "make it
-	    the default for all new users", referring her to the
-	    Administration section of this Guide.
-	  </P
+>The ability to watch other users may not be available in all
+        Bugzilla installations. If you can't see it, ask your 
+        administrator.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
-><P
->	  Disregard the warnings about "experimental and bleeding
-	  edge"; the code to handle email in a cleaner manner than
-	  that historically used for Bugzilla is quite robust and
-	  well-tested now.
-	</P
-><P
->	  I recommend you enable the option, "Click here to sign up
-	  (and risk any bugs)". Your email-box will thank you for it.
-	  The fundamental shift in "newemailtech" is away from
-	  standard UNIX "diff" output, which is quite ugly, to a
-	  prettier, better laid-out email.
-	</P
 ></DIV
 ><DIV
-CLASS="SECTION"
-><HR><H3
-CLASS="SECTION"
+CLASS="section"
+><HR><H2
+CLASS="section"
 ><A
-NAME="WATCHSETTINGS"
->2.4.2.3. "Watching" Users</A
-></H3
-><DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
+NAME="footersettings">3.3.3. Page Footer</H2
 ><P
->	    This option may not be available in all Bugzilla
-	    installations, depending upon the preferences of the
-	    systems administrator responsible for the setup of your
-	    Bugzilla. However, if you really want this functionality,
-	    ask her to "enable watchers in Params".
-	  </P
-></TD
-></TR
-></TABLE
+>On the Search page, you can store queries in Bugzilla, so if you
+      regularly run a particular query it is just a drop-down menu away. 
+      Once you have a stored query, you can come
+      here to request that it also be displayed in your page footer.</P
 ></DIV
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="permissionsettings">3.3.4. Permissions</H2
 ><P
->	  By entering user email names into the "Users to watch" text
-	  entry box, delineated by commas, you can watch bugs of other
-	  users.  This powerful functionality enables seamless
-	  transitions as developers change projects, managers wish to
-	  get in touch with the issues faced by their direct reports,
-	  or users go on vacation.  If any of these three situations
-	  apply to you, you will undoubtedly find this feature quite
-	  convenient.
-	</P
+>This is a purely informative page which outlines your current
+      permissions on this installation of Bugzilla - what product groups you
+      are in, and whether you can edit bugs or perform various administration
+      functions.</P
+></DIV
+></DIV
 ></DIV
+><DIV
+CLASS="chapter"
+><HR><H1
+><A
+NAME="installation">Chapter 4. Installation</H1
+><DIV
+CLASS="section"
+><H1
+CLASS="section"
+><A
+NAME="stepbystep">4.1. Step-by-step Install</H1
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="AEN492">4.1.1. Introduction</H2
+><P
+>Bugzilla has been successfully installed under Solaris, Linux,
+      and Win32. Win32 is not yet officially supported, but many people
+      have got it working fine.
+      Please see the 
+      <A
+HREF="#win32"
+>Win32 Installation Notes</A
+>
+      for further advice on getting Bugzilla to work on Microsoft
+      Windows.</P
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="FOOTERSETTINGS"
->2.4.3. Page Footer</A
-></H2
+NAME="AEN496">4.1.2. Package List</H2
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -3221,412 +2450,209 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  By default, this page is quite barren.  However, go explore
-	  the Query Page some more; you will find that you can store
-	  numerous queries on the server, so if you regularly run a
-	  particular query it is just a drop-down menu away.  On this
-	  page of Preferences, if you have many stored queries you can
-	  elect to have them always one-click away!
-	</P
+> If you are running the very most recent
+        version of Perl and MySQL (both the executables and development
+        libraries) on your system, you can skip these manual installation 
+        steps for the Perl modules by using Bundle::Bugzilla; see
+        <A
+HREF="#bundlebugzilla"
+>Using Bundle::Bugzilla instead of manually installing Perl modules</A
+>.
+        </P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ><P
->	If you have many stored queries on the server, here you will
-	find individual drop-downs for each stored query.  Each
-	drop-down gives you the option of that query appearing on the
-	footer of every page in Bugzilla!  This gives you powerful
-	one-click access to any complex searches you may set up, and
-	is an excellent way to impress your boss...
-      </P
-><DIV
-CLASS="TIP"
-><P
+>The software packages necessary for the proper running of
+      Bugzilla (with download links) are: 
+      <P
 ></P
-><TABLE
-CLASS="TIP"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/tip.gif"
-HSPACE="5"
-ALT="Tip"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->By default, the "My Bugs" link appears at the bottom of
-	  each page.  However, this query gives you both the bugs you
-	  have reported, as well as those you are assigned.  One of
-	  the most common uses for this page is to remove the "My
-	  Bugs" link, replacing it with two other queries, commonly
-	  called "My Bug Reports" and "My Bugs" (but only referencing
-	  bugs assigned to you).  This allows you to distinguish those
-	  bugs you have reported from those you are assigned.  I
-	  commonly set up complex Boolean queries in the Query page
-	  and link them to my footer in this page.  When they are
-	  significantly complex, a one-click reference can save hours
-	  of work.</P
-></TD
-></TR
-></TABLE
-></DIV
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
-><A
-NAME="PERMISSIONSETTINGS"
->2.4.4. Permissions</A
-></H2
+><OL
+TYPE="1"
+><LI
 ><P
->	This is a purely informative page which outlines your current
-	permissions on this installation of Bugzilla.  If you have
-	permissions to grant certain permissions to other users, the
-	"other users" link appears on this page as well as the footer.
-	For more information regarding user administration, please
-	consult the Administration section of this Guide.
-      </P
-></DIV
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="USINGBZ-CONC"
->2.5. Using Bugzilla-Conclusion</A
-></H1
-><P
->      Thank you for reading through this portion of the Bugzilla
-      Guide.  I anticipate it may not yet meet the needs of all
-      readers.  If you have additional comments or corrections to
-      make, please submit your contributions to the <A
-HREF="mailto://mozilla-webtools@mozilla.org"
+>&#13;    <A
+HREF="http://www.mysql.com/"
 TARGET="_top"
->mozilla-webtools</A
-> mailing list/newsgroup.  The mailing list is mirrored to the netscape.public.mozilla.webtools newsgroup, and the newsgroup is mirrored to mozilla-webtools@mozilla.org
-    </P
-></DIV
-></DIV
-><DIV
-CLASS="CHAPTER"
-><HR><H1
-><A
-NAME="INSTALLATION"
->Chapter 3. Installation</A
-></H1
-><P
->      These installation instructions are presented assuming you are
-      installing on a UNIX or completely POSIX-compliant system.  If
-      you are installing on Microsoft Windows or another oddball
-      operating system, please consult the appropriate sections in
-      this installation guide for notes on how to be successful.
-    </P
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="ERRATA"
->3.1. ERRATA</A
-></H1
+>MySQL database server</A
+>
+    (3.22.5 or greater)
+  </P
+></LI
+><LI
 ><P
->Here are some miscellaneous notes about possible issues you
-      main run into when you begin your Bugzilla installation.
-      Reference platforms for Bugzilla installation are Redhat Linux
-      7.2, Linux-Mandrake 8.0, and Solaris 8.</P
+>&#13;    <A
+HREF="http://www.perl.org"
+TARGET="_top"
+>Perl</A
+>
+    (5.005 or greater, 5.6.1 is recommended if you wish to
+    use Bundle::Bugzilla)
+  </P
+></LI
+><LI
 ><P
+>Perl Modules (minimum version):
+  <P
 ></P
-><TABLE
-BORDER="0"
-><TBODY
-><TR
-><TD
->	If you are installing Bugzilla on S.u.S.e. Linux, or some
-	other distributions with <SPAN
-CLASS="QUOTE"
->"paranoid"</SPAN
-> security
-	options, it is possible that the checksetup.pl script may fail
-	with the error: <SPAN
-CLASS="ERRORNAME"
->cannot chdir(/var/spool/mqueue):
-	  Permission denied</SPAN
-> This is because your
-	<TT
-CLASS="FILENAME"
->/var/spool/mqueue</TT
-> directory has a mode of
-	<SPAN
-CLASS="QUOTE"
->"drwx------"</SPAN
->.  Type <B
-CLASS="COMMAND"
->chmod 755
-	  <TT
-CLASS="FILENAME"
->/var/spool/mqueue</TT
-></B
-> as root to
-	fix this problem.
-      </TD
-></TR
-><TR
-><TD
->	Bugzilla may be installed on Macintosh OS X (10), which is a
-	unix-based (BSD)  operating system. Everything required for
-	Bugzilla on OS X will install cleanly, but the optional GD
-	perl module which is used for bug charting requires some
-	additional setup for installation. Please see the  Mac OS X
-	installation section below for details
-      </TD
-></TR
-><TR
-><TD
->	Release Notes for Bugzilla 2.14 are available at
-	<TT
-CLASS="FILENAME"
->docs/rel_notes.txt</TT
-> in your Bugzilla
-	source distribution.
-      </TD
-></TR
-><TR
-><TD
->	  The preferred documentation for Bugzilla is available in
-	docs/, with a variety of document types available.  Please
-	refer to these documents when  installing, configuring, and
-	maintaining your Bugzilla installation.
-      </TD
-></TR
-></TBODY
-></TABLE
-><P
-></P
-><DIV
-CLASS="WARNING"
-><P
-></P
-><TABLE
-CLASS="WARNING"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/warning.gif"
-HSPACE="5"
-ALT="Warning"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	Bugzilla is not a package where you can just plop it in a directory,
-	twiddle a few things, and you're off.  Installing Bugzilla assumes you
-	know your variant of UNIX or Microsoft Windows well, are familiar with the
-	command line, and are comfortable compiling and installing a plethora
-	of third-party utilities.  To install Bugzilla on Win32 requires
-	fair Perl proficiency, and if you use a webserver other than Apache you
-	should be intimately familiar with the security mechanisms and CGI
-	environment thereof.
-      </P
-></TD
-></TR
-></TABLE
-></DIV
-><DIV
-CLASS="WARNING"
-><P
-></P
-><TABLE
-CLASS="WARNING"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/warning.gif"
-HSPACE="5"
-ALT="Warning"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	Bugzilla has not undergone a complete security review. Security holes
-	may exist in the code.  Great care should be taken both in the installation
-	and usage of this software.  Carefully consider the implications of
-	installing other network services with Bugzilla.
-      </P
-></TD
-></TR
-></TABLE
-></DIV
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="STEPBYSTEP"
->3.2. Step-by-step Install</A
-></H1
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="AEN509"
->3.2.1. Introduction</A
-></H2
+><OL
+TYPE="a"
+><LI
 ><P
->	Installation of bugzilla is pretty straightforward, particularly if your
-	machine already has MySQL and the MySQL-related perl packages installed.
-	If those aren't installed yet, then that's the first order of business.  The
-	other necessary ingredient is a web server set up to run cgi scripts.
-	While using Apache for your webserver is not required, it is recommended.
+>&#13;        <A
+HREF="http://www.template-toolkit.org"
+TARGET="_top"
+>Template</A
+>
+        (v2.07)
       </P
+></LI
+><LI
 ><P
->	Bugzilla has been successfully installed under Solaris, Linux,
-	and Win32. The peculiarities of installing on Win32 (Microsoft
-	Windows) are not included in this section of the Guide; please
-	check out the <A
-HREF="#WIN32"
->Win32 Installation Notes</A
-> for further advice
-	on getting Bugzilla to work on Microsoft Windows.
+>&#13;        <A
+HREF="http://www.cpan.org/modules/by-module/AppConfig/"
+TARGET="_top"
+>AppConfig 
+        </A
+>
+        (v1.52)
       </P
+></LI
+><LI
 ><P
->	The Bugzilla Guide is contained in the "docs/" folder in your
-	Bugzilla distribution.  It is available in plain text
-	(docs/txt), HTML (docs/html), or SGML source (docs/sgml).
+>&#13;        <A
+HREF="http://www.cpan.org/authors/id/MUIR/modules/Text-Tabs%2BWrap-2001.0131.tar.gz"
+TARGET="_top"
+>Text::Wrap</A
+> 
+        (v2001.0131)
       </P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
-><A
-NAME="AEN515"
->3.2.2. Installing the Prerequisites</A
-></H2
-><DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->If you want to skip these manual installation steps for
-	  the CPAN dependencies listed below, and are running the very
-	  most recent version of Perl and MySQL (both the executables
-	  and development libraries) on your system, check out
-	  Bundle::Bugzilla in <A
-HREF="#BUNDLEBUGZILLA"
->Using Bundle::Bugzilla instead of manually installing Perl modules</A
-></P
-></TD
-></TR
-></TABLE
-></DIV
-><P
->	The software packages necessary for the proper running of bugzilla are:
-	<P
-></P
-><OL
-TYPE="1"
+></LI
 ><LI
 ><P
->	      MySQL database server and the mysql client (3.22.5 or greater)
-	    </P
+>&#13;        <A
+HREF="http://search.cpan.org/search?dist=File-Spec"
+TARGET="_top"
+>File::Spec 
+        </A
+>
+        (v0.8.2)
+      </P
 ></LI
 ><LI
 ><P
->	      Perl (5.004 or greater, 5.6.1 is recommended if you wish
-	      to use Bundle::Bugzilla)
-	    </P
+>&#13;        <A
+HREF="http://www.cpan.org/modules/by-module/Data/"
+TARGET="_top"
+>Data::Dumper 
+        </A
+> 
+        (any)
+      </P
 ></LI
 ><LI
 ><P
->	      DBI Perl module
-	    </P
+>&#13;        <A
+HREF="http://www.cpan.org/modules/by-module/Mysql/"
+TARGET="_top"
+>DBD::mysql
+        </A
+> 
+        (v1.2209)
+      </P
 ></LI
 ><LI
 ><P
->	      Data::Dumper Perl module
-	    </P
+>&#13;        <A
+HREF="http://www.cpan.org/modules/by-module/DBI/"
+TARGET="_top"
+>DBI</A
+> 
+        (v1.13)
+      </P
 ></LI
 ><LI
 ><P
->	      Bundle::Mysql Perl module collection
-	    </P
+>&#13;        <A
+HREF="http://www.cpan.org/modules/by-module/Date/"
+TARGET="_top"
+>Date::Parse
+        </A
+> 
+        (any)
+      </P
 ></LI
 ><LI
 ><P
->	      TimeDate Perl module collection
-	    </P
+>&#13;        CGI::Carp 
+        (any)
+      </P
 ></LI
+></OL
+>
+  and, optionally:
+  <P
+></P
+><OL
+TYPE="a"
 ><LI
 ><P
->	      GD perl module (1.8.3) (optional, for bug charting)
-	    </P
+>&#13;        <A
+HREF="http://www.cpan.org/modules/by-module/GD/"
+TARGET="_top"
+>GD</A
+>
+        (v1.19) for bug charting
+      </P
 ></LI
 ><LI
 ><P
->	      Chart::Base Perl module (0.99c) (optional, for bug charting)
-	    </P
+>&#13;        <A
+HREF="http://www.cpan.org/modules/by-module/Chart/"
+TARGET="_top"
+>Chart::Base 
+        </A
+>
+        (v0.99c) for bug charting
+      </P
 ></LI
 ><LI
 ><P
->	      DB_File Perl module (optional, for bug charting)
-	    </P
+>&#13;        XML::Parser 
+        (any) for the XML interface
+      </P
 ></LI
 ><LI
 ><P
->	      The web server of your choice.  Apache is recommended.
-	    </P
+>&#13;        MIME::Parser 
+        (any) for the email interface
+      </P
+></LI
+></OL
+>          
+  </P
 ></LI
 ><LI
 ><P
->	      MIME::Parser Perl module (optional, for contrib/bug_email.pl interface)
-	    </P
+>&#13;    The web server of your choice. 
+    <A
+HREF="http://www.apache.org/"
+TARGET="_top"
+>Apache</A
+> 
+    is highly recommended.
+  </P
 ></LI
 ></OL
 >
 
-	<DIV
-CLASS="WARNING"
+      <DIV
+CLASS="warning"
 ><P
 ></P
 ><TABLE
-CLASS="WARNING"
+CLASS="warning"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -3642,29 +2668,25 @@ ALT="Warning"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	    It is a good idea, while installing Bugzilla, to ensure it
-	    is not <EM
->accessible</EM
-> by other machines
-	    on the Internet. Your machine may be vulnerable to attacks
-	    while you are installing. In other words, ensure there is
-	    some kind of firewall between you and the rest of the
-	    Internet.  Many installation steps require an active
-	    Internet connection to complete, but you must take care to
-	    ensure that at no point is your machine vulnerable to an
-	    attack.
-	  </P
+>It is a good idea, while installing Bugzilla, to ensure that there
+        is some kind of firewall between you and the rest of the Internet,
+        because your machine may be insecure for periods during the install.
+        Many
+        installation steps require an active Internet connection to complete,
+        but you must take care to ensure that at no point is your machine
+        vulnerable to an attack.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 >
-	<DIV
-CLASS="NOTE"
+
+      <DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -3680,20 +2702,23 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->Linux-Mandrake 8.0, the author's test system, includes
-	    every required and optional library for Bugzilla.  The
-	    easiest way to install them is by using the
-	    <TT
-CLASS="FILENAME"
+>Linux-Mandrake 8.0 includes every
+        required and optional library for Bugzilla. The easiest way to
+        install them is by using the 
+        <TT
+CLASS="filename"
 >urpmi</TT
-> utility.  If you follow these
-	    commands, you should have everything you need for
-	    Bugzilla, and <TT
-CLASS="FILENAME"
+>
+
+        utility. If you follow these commands, you should have everything you
+        need for Bugzilla, and 
+        <TT
+CLASS="filename"
 >checksetup.pl</TT
-> should
-	    not complain about any missing libraries.  You may already
-	    have some of these installed.</P
+>
+
+        should not complain about any missing libraries. You may already have
+        some of these installed.</P
 ><P
 ></P
 ><TABLE
@@ -3701,59 +2726,69 @@ BORDER="0"
 ><TBODY
 ><TR
 ><TD
-><TT
-CLASS="PROMPT"
+>&#13;            <TT
+CLASS="prompt"
 >bash#</TT
-><B
-CLASS="COMMAND"
-> urpmi
-		perl-mysql</B
-></TD
+>
+
+            <B
+CLASS="command"
+>urpmi perl-mysql</B
+>
+          </TD
 ></TR
 ><TR
 ><TD
-><TT
-CLASS="PROMPT"
+>&#13;            <TT
+CLASS="prompt"
 >bash#</TT
-><B
-CLASS="COMMAND"
-> urpmi
-		perl-chart</B
-></TD
+>
+
+            <B
+CLASS="command"
+>urpmi perl-chart</B
+>
+          </TD
 ></TR
 ><TR
 ><TD
-><TT
-CLASS="PROMPT"
+>&#13;            <TT
+CLASS="prompt"
 >bash#</TT
-><B
-CLASS="COMMAND"
-> urpmi
-		perl-gd</B
-></TD
+>
+
+            <B
+CLASS="command"
+>urpmi perl-gd</B
+>
+          </TD
 ></TR
 ><TR
 ><TD
-><TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="prompt"
 >bash#</TT
-><B
-CLASS="COMMAND"
-> urpmi
-		perl-MailTools</B
-> (for Bugzilla email
-	      integration)</TD
+>
+
+          <B
+CLASS="command"
+>urpmi perl-MailTools</B
+>
+
+          (for Bugzilla email integration)</TD
 ></TR
 ><TR
 ><TD
-><TT
-CLASS="PROMPT"
+>&#13;            <TT
+CLASS="prompt"
 >bash#</TT
-><B
-CLASS="COMMAND"
-> urpmi
-		apache-modules</B
-></TD
+>
+
+            <B
+CLASS="command"
+>urpmi apache-modules</B
+>
+          </TD
 ></TR
 ></TBODY
 ></TABLE
@@ -3764,46 +2799,29 @@ CLASS="COMMAND"
 ></TABLE
 ></DIV
 >
-	
       </P
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="INSTALL-MYSQL"
->3.2.3. Installing MySQL Database</A
-></H2
+NAME="install-mysql">4.1.3. MySQL</H2
 ><P
->	Visit MySQL homepage at <A
+>Visit the MySQL homepage at 
+      <A
 HREF="http://www.mysql.com"
 TARGET="_top"
 >www.mysql.com</A
-> and grab the latest stable release of the server.  Many of the binary versions of MySQL store their data files in <TT
-CLASS="FILENAME"
->/var</TT
-> which is often part of a smaller root partition. If you decide to build from sources you can easily set the dataDir as an option to <TT
-CLASS="FILENAME"
->configure</TT
->.
+>
+      to grab and install the latest stable release of the server. 
       </P
-><P
->	If you install from source or non-package (RPM, deb, etc.)
-	binaries you need to add
-	<I
-CLASS="FIRSTTERM"
->mysqld</I
-> to your
-	init scripts so the server daemon will come back up whenever
-	your machine reboots. Further discussion of UNIX init
-	sequences are beyond the scope of this guide.
-	<DIV
-CLASS="NOTE"
+><DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -3819,43 +2837,98 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->You should have your init script start
-	    <I
-CLASS="GLOSSTERM"
->mysqld</I
-> with the ability to accept
-	    large packets. By default, <TT
-CLASS="FILENAME"
->mysqld</TT
+> Many of the binary
+        versions of MySQL store their data files in 
+        <TT
+CLASS="filename"
+>/var</TT
+>.
+        On some Unix systems, this is part of a smaller root partition,
+        and may not have room for your bug database. You can set the data
+         directory as an option to <TT
+CLASS="filename"
+>configure</TT
 >
-	    only accepts packets up to 64K long. This limits the size
-	    of attachments you may put on bugs. If you add <TT
-CLASS="OPTION"
->-O
-	    max_allowed_packet=1M</TT
-> to the command that starts
-	    <TT
-CLASS="FILENAME"
->mysqld</TT
-> (or
-	    <TT
-CLASS="FILENAME"
->safe_mysqld</TT
->), then you will be able
-	    to have attachments up to about 1 megabyte.</P
+         if you build MySQL from source yourself.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
+><P
+>If you install from something other than an RPM or Debian 
+      package, you will need to add <TT
+CLASS="filename"
+>mysqld</TT
 >
-
+      to your init scripts so the server daemon will come back up whenever
+      your machine reboots. Further discussion of UNIX init sequences are
+      beyond the scope of this guide. 
       </P
+><P
+>Change your init script to start 
+      <TT
+CLASS="filename"
+>mysqld</TT
+>
+      with the ability to accept large packets. By default, 
+      <TT
+CLASS="filename"
+>mysqld</TT
+>
+      only accepts packets up to 64K long. This limits the size of
+      attachments you may put on bugs. If you add 
+      <TT
+CLASS="option"
+>-O max_allowed_packet=1M</TT
+>
+      to the command that starts 
+      <TT
+CLASS="filename"
+>mysqld</TT
+>
+      (or <TT
+CLASS="filename"
+>safe_mysqld</TT
+>), 
+      then you will be able to have attachments up to about 1 megabyte.
+      There is a Bugzilla parameter for maximum attachment size;
+      you should configure it to match the value you choose here.</P
+><P
+>If you plan on running Bugzilla and MySQL on the same machine,
+      consider using the 
+      <TT
+CLASS="option"
+>--skip-networking</TT
+>
+      option in the init script. This enhances security by preventing
+      network access to MySQL.</P
+></DIV
 ><DIV
-CLASS="NOTE"
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="install-perl">4.1.4. Perl</H2
 ><P
+>Any machine that doesn't have Perl on it is a sad machine indeed.
+      Perl can be got in source form from 
+      <A
+HREF="http://www.perl.com"
+TARGET="_top"
+>perl.com</A
+> for the rare 
+      *nix systems which don't have it. 
+      Although Bugzilla runs with all post-5.005
+      versions of Perl, it's a good idea to be up to the very latest version
+      if you can when running Bugzilla. As of this writing, that is Perl
+      version 5.6.1.</P
+><DIV
+CLASS="tip"
+><A
+NAME="bundlebugzilla"><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="tip"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -3864,462 +2937,299 @@ WIDTH="25"
 ALIGN="CENTER"
 VALIGN="TOP"
 ><IMG
-SRC="../images/note.gif"
+SRC="../images/tip.gif"
 HSPACE="5"
-ALT="Note"></TD
+ALT="Tip"></TD
 ><TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  If you plan on running Bugzilla and MySQL on the same
-	  machine, consider using the <TT
-CLASS="OPTION"
->--skip-networking</TT
+>You can skip the following Perl module installation steps by
+        installing 
+        <SPAN
+CLASS="productname"
+>Bundle::Bugzilla</SPAN
 >
-	  option in the init script. This enhances security by
-	  preventing network access to MySQL.
-	</P
-></TD
-></TR
-></TABLE
-></DIV
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
-><A
-NAME="INSTALL-PERL"
->3.2.4. Perl (5.004 or greater)</A
-></H2
-><P
->	Any machine that doesn't have perl on it is a sad machine
-	indeed.  Perl for *nix systems can be gotten in source form
-	from http://www.perl.com.  Although Bugzilla runs with most
-	post-5.004 versions of Perl, it's a good idea to be up to the
-	very latest version if you can when running Bugzilla.  As of
-	this writing, that is perl version 5.6.1.
-      </P
-><P
->	Perl is now a far cry from the the single compiler/interpreter
-	binary it once was.  It includes a great many required modules
-	and quite a few other support files.  If you're not up to or
-	not inclined to build perl from source, you'll want to install
-	it on your machine using some sort of packaging system (be it
-	RPM, deb, or what have you) to ensure a sane install. In the
-	subsequent sections you'll be installing quite a few perl
-	modules; this can be quite ornery if your perl installation
-	isn't up to snuff.
-      </P
-><DIV
-CLASS="WARNING"
-><P
-></P
-><TABLE
-CLASS="WARNING"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/warning.gif"
-HSPACE="5"
-ALT="Warning"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->Many people complain that Perl modules will not install
-	  for them.  Most times, the error messages complain that they
-	  are missing a file in <SPAN
-CLASS="QUOTE"
->"@INC"</SPAN
->.  Virtually every
-	  time, this is due to permissions being set too restrictively
-	  for you to compile Perl modules or not having the necessary
-	  Perl development libraries installed on your system..
-	  Consult your local UNIX systems administrator for help
-	  solving these permissions issues; if you
-	  <EM
->are</EM
-> the local UNIX sysadmin, please
-	  consult the newsgroup/mailing list for further assistance or
-	  hire someone to help you out.
-	</P
-></TD
-></TR
-></TABLE
-></DIV
-><DIV
-CLASS="TIP"
-><A
-NAME="BUNDLEBUGZILLA"
-></A
-><P
-></P
-><TABLE
-CLASS="TIP"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/tip.gif"
-HSPACE="5"
-ALT="Tip"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	  You can skip the following Perl module installation steps by
-	  installing <SPAN
-CLASS="PRODUCTNAME"
->Bundle::Bugzilla</SPAN
-> from
-	  <A
-HREF="#GLOSS_CPAN"
+
+        from 
+        <A
+HREF="#gloss-cpan"
 ><I
-CLASS="GLOSSTERM"
+CLASS="glossterm"
 >CPAN</I
 ></A
->, which
-	  includes them. All Perl module installation steps require
-	  you have an active Internet connection.  If you wish to use
-	  Bundle::Bugzilla, however, you must be using the latest
-	  version of Perl (at this writing, version 5.6.1)
-	</P
+>, 
+        which installs all required modules for you.</P
 ><P
->	  <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >bash#</TT
-> <B
-CLASS="COMMAND"
->perl -MCPAN
-	      -e 'install "Bundle::Bugzilla"'</B
 >
-	  </TT
+
+            <B
+CLASS="command"
+>perl -MCPAN -e 'install "Bundle::Bugzilla"'</B
+>
+          </TT
 >
-	</P
+        </P
 ><P
->	  Bundle::Bugzilla doesn't include GD, Chart::Base, or
-	  MIME::Parser, which are not essential to a basic Bugzilla
-	  install.  If installing this bundle fails, you should
-	  install each module individually to isolate the problem.
-	</P
+>Bundle::Bugzilla doesn't include GD, Chart::Base, or
+        MIME::Parser, which are not essential to a basic Bugzilla install. If
+        installing this bundle fails, you should install each module
+        individually to isolate the problem.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="AEN602"
->3.2.5. DBI Perl Module</A
-></H2
-><P
->	The DBI module is a generic Perl module used by other database related
-	Perl modules.  For our purposes it's required by the MySQL-related
-	modules.  As long as your Perl installation was done correctly the
-	DBI module should be a breeze.  It's a mixed Perl/C module, but Perl's
-	MakeMaker system simplifies the C compilation greatly.
-      </P
+NAME="perl-modules">4.1.5. Perl Modules</H2
 ><P
->	Like almost all Perl modules DBI can be found on the Comprehensive Perl
-	Archive Network (CPAN) at http://www.cpan.org.  The CPAN servers have a
-	real tendency to bog down, so please use mirrors.  The current location
-	at the time of this writing can be found in <A
-HREF="#DOWNLOADLINKS"
->Appendix B</A
->.
-      </P
+> 
+      All Perl modules can be found on the
+      <A
+HREF="http://www.cpan.org"
+TARGET="_top"
+>Comprehensive Perl 
+      Archive Network</A
+> (CPAN). The
+      CPAN servers have a real tendency to bog down, so please use mirrors.
+    </P
 ><P
->	Quality, general Perl module installation instructions can be found on
-	the CPAN website, but the easy thing to do is to just use the CPAN shell
-	which does all the hard work for you.
+>Quality, general Perl module installation instructions can be
+      found on the CPAN website, but the easy thing to do is to just use the
+      CPAN shell which does all the hard work for you.
+      To use the CPAN shell to install a module: 
       </P
 ><P
->	To use the CPAN shell to install DBI:
-	<DIV
-CLASS="INFORMALEXAMPLE"
-><A
-NAME="AEN609"
-></A
-><P
-></P
-><P
->	    <TT
-CLASS="COMPUTEROUTPUT"
->	      <TT
-CLASS="PROMPT"
+>&#13;        <TT
+CLASS="computeroutput"
+>&#13;          <TT
+CLASS="prompt"
 >bash#</TT
 >
-	      <B
-CLASS="COMMAND"
->perl -MCPAN -e 'install "DBI"'</B
->
-	    </TT
->
-	    <DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->Replace "DBI" with the name of whichever module you wish
-		to install, such as Data::Dumper, TimeDate, GD, etc.</P
-></TD
-></TR
-></TABLE
-></DIV
+          <B
+CLASS="command"
+>perl -MCPAN -e 'install "&#60;modulename&#62;"'</B
 >
-	  </P
-><P
-></P
-></DIV
+        </TT
 >
-	To do it the hard way:
-	<DIV
-CLASS="INFORMALEXAMPLE"
-><A
-NAME="AEN616"
-></A
+      </P
 ><P
-></P
+>&#13;      To do it the hard way: 
+      </P
 ><P
->	    Untar the module tarball -- it should create its own directory
-	  </P
+>Untar the module tarball -- it should create its own
+      directory</P
 ><P
->	    CD to the directory just created, and enter the following commands:
-	    <P
+>CD to the directory just created, and enter the following
+      commands: 
+      <P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->		  <TT
-CLASS="COMPUTEROUTPUT"
->		    <TT
-CLASS="PROMPT"
+>&#13;            <TT
+CLASS="computeroutput"
+>&#13;              <TT
+CLASS="prompt"
 >bash#</TT
 >
-		    <B
-CLASS="COMMAND"
+
+              <B
+CLASS="command"
 >perl Makefile.PL</B
 >
-		  </TT
+            </TT
 >
-		</P
+          </P
 ></LI
 ><LI
 ><P
->		  <TT
-CLASS="COMPUTEROUTPUT"
->		    <TT
-CLASS="PROMPT"
+>&#13;            <TT
+CLASS="computeroutput"
+>&#13;              <TT
+CLASS="prompt"
 >bash#</TT
 >
-		    <B
-CLASS="COMMAND"
+
+              <B
+CLASS="command"
 >make</B
 >
-		  </TT
+            </TT
 >
-		</P
+          </P
 ></LI
 ><LI
 ><P
->		  <TT
-CLASS="COMPUTEROUTPUT"
->		    <TT
-CLASS="PROMPT"
+>&#13;            <TT
+CLASS="computeroutput"
+>&#13;              <TT
+CLASS="prompt"
 >bash#</TT
 >
-		    <B
-CLASS="COMMAND"
+
+              <B
+CLASS="command"
 >make test</B
 >
-		  </TT
+            </TT
 >
-		</P
+          </P
 ></LI
 ><LI
 ><P
->		  <TT
-CLASS="COMPUTEROUTPUT"
->		    <TT
-CLASS="PROMPT"
+>&#13;            <TT
+CLASS="computeroutput"
+>&#13;              <TT
+CLASS="prompt"
 >bash#</TT
 >
-		    <B
-CLASS="COMMAND"
+
+              <B
+CLASS="command"
 >make install</B
 >
-		  </TT
+            </TT
 >
-		</P
+          </P
 ></LI
 ></OL
 >
-	    If everything went ok that should be all it takes.  For the vast
-	    majority of perl modules this is all that's required.
-	  </P
+      </P
+><DIV
+CLASS="warning"
 ><P
 ></P
-></DIV
+><TABLE
+CLASS="warning"
+WIDTH="100%"
+BORDER="0"
+><TR
+><TD
+WIDTH="25"
+ALIGN="CENTER"
+VALIGN="TOP"
+><IMG
+SRC="../images/warning.gif"
+HSPACE="5"
+ALT="Warning"></TD
+><TD
+ALIGN="LEFT"
+VALIGN="TOP"
+><P
+>Many people complain that Perl modules will not install for
+        them. Most times, the error messages complain that they are missing a
+        file in 
+        <SPAN
+CLASS="QUOTE"
+>"@INC"</SPAN
+>. 
+        Virtually every time, this error is due to permissions being set too
+        restrictively for you to compile Perl modules or not having the
+        necessary Perl development libraries installed on your system.
+        Consult your local UNIX systems administrator for help solving these
+        permissions issues; if you 
+        <EM
+>are</EM
 >
-      </P
+        the local UNIX sysadmin, please consult the newsgroup/mailing list
+        for further assistance or hire someone to help you out.</P
+></TD
+></TR
+></TABLE
 ></DIV
 ><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
+CLASS="section"
+><HR><H3
+CLASS="section"
 ><A
-NAME="AEN640"
->3.2.6. Data::Dumper Perl Module</A
-></H2
+NAME="AEN642">4.1.5.1. DBI</H3
 ><P
->	The Data::Dumper module provides data structure persistence for Perl
-	(similar to Java's serialization).  It comes with later sub-releases of
-	Perl 5.004, but a re-installation just to be sure it's available won't
-	hurt anything.
-      </P
+>The DBI module is a generic Perl module used the
+      MySQL-related modules. As long as your Perl installation was done
+      correctly the DBI module should be a breeze. It's a mixed Perl/C
+      module, but Perl's MakeMaker system simplifies the C compilation
+      greatly.</P
+></DIV
+><DIV
+CLASS="section"
+><HR><H3
+CLASS="section"
+><A
+NAME="AEN645">4.1.5.2. Data::Dumper</H3
 ><P
->	Data::Dumper is used by the MySQL-related Perl modules.  It
-	can be found on CPAN (see <A
-HREF="#DOWNLOADLINKS"
->Appendix B</A
->) and
-	can be
-	installed by following the same four step make sequence used
-	for the DBI module.
-      </P
+>The Data::Dumper module provides data structure persistence for
+      Perl (similar to Java's serialization). It comes with later
+      sub-releases of Perl 5.004, but a re-installation just to be sure it's
+      available won't hurt anything.</P
 ></DIV
 ><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
+CLASS="section"
+><HR><H3
+CLASS="section"
 ><A
-NAME="AEN645"
->3.2.7. MySQL related Perl Module Collection</A
-></H2
+NAME="AEN648">4.1.5.3. MySQL-related modules</H3
 ><P
->	The Perl/MySQL interface requires a few mutually-dependent perl
-	modules.  These modules are grouped together into the the
-	Msql-Mysql-modules package.  This package can be found at CPAN.
-	After the archive file has been downloaded it should
-	be untarred.
-      </P
+>The Perl/MySQL interface requires a few mutually-dependent Perl
+      modules. These modules are grouped together into the the
+      Msql-Mysql-modules package.</P
 ><P
->	The MySQL modules are all built using one make file which is generated
-	by running:
-	<TT
-CLASS="PROMPT"
->bash#</TT
->
-	<B
-CLASS="COMMAND"
->perl Makefile.pl</B
->
-      </P
+>The MakeMaker process will ask you a few questions about the
+      desired compilation target and your MySQL installation. For most of the
+      questions the provided default will be adequate, but when asked if your
+      desired target is the MySQL or mSQL packages, you should
+      select the MySQL related ones. Later you will be asked if you wish to
+      provide backwards compatibility with the older MySQL packages; you
+      should answer YES to this question. The default is NO.</P
 ><P
->	The MakeMaker process will ask you a few questions about the desired
-	compilation target and your MySQL installation.  For many of the questions
-	the provided default will be adequate.
+>A host of 'localhost' should be fine and a testing user of 'test'
+      with a null password should find itself with sufficient access to run
+      tests on the 'test' database which MySQL created upon installation.
       </P
-><P
->	When asked if your desired target is the MySQL or mSQL packages,
-	select the MySQL related ones.  Later you will be asked if you wish
-	to provide backwards compatibility with the older MySQL packages; you
-	  should answer YES to this question. The default is NO.
-	</P
-><P
->	  A host of 'localhost' should be fine and a testing user of 'test' and
-	  a null password should find itself with sufficient access to run tests
-	  on the 'test' database which MySQL created upon installation.  If 'make
-	  test' and 'make install' go through without errors you should be ready
-	  to go as far as database connectivity is concerned.
-	</P
 ></DIV
 ><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
+CLASS="section"
+><HR><H3
+CLASS="section"
 ><A
-NAME="AEN654"
->3.2.8. TimeDate Perl Module Collection</A
-></H2
+NAME="AEN653">4.1.5.4. TimeDate modules</H3
 ><P
->	  Many of the more common date/time/calendar related Perl
-	modules have been grouped into a bundle similar to the MySQL
-	modules bundle. This bundle is stored on the CPAN under the
-	name TimeDate (see link: <A
-HREF="#DOWNLOADLINKS"
->Appendix B</A
->). The
-	component module we're most interested in is the Date::Format
-	module, but installing all of them is probably a good idea
-	anyway.  The standard Perl module installation instructions
-	should work perfectly for this simple package.
-	</P
+>Many of the more common date/time/calendar related Perl modules
+      have been grouped into a bundle similar to the MySQL modules bundle.
+      This bundle is stored on the CPAN under the name TimeDate. 
+      The component module we're most interested in is the Date::Format
+      module, but installing all of them is probably a good idea anyway.
+      </P
 ></DIV
 ><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
+CLASS="section"
+><HR><H3
+CLASS="section"
 ><A
-NAME="AEN658"
->3.2.9. GD Perl Module (1.8.3)</A
-></H2
-><P
->	  The GD library was written by Thomas Boutell a long while
-	ago to programatically generate images in C.  Since then it's
-	become the defacto standard for programatic image
-	construction.  The Perl bindings to it found in the GD library
-	are used on millions of web pages to generate graphs on the
-	fly. That's what bugzilla will be using it for so you must
-	install it if you want any of the graphing to work.
-	</P
+NAME="AEN656">4.1.5.5. GD (optional)</H3
 ><P
->	  Actually bugzilla uses the Graph module which relies on GD
-	itself.  Isn't that always the way with object-oriented
-	programming?  At any rate, you can find the GD library on CPAN
-	in <A
-HREF="#DOWNLOADLINKS"
->Appendix B</A
->.  
-	</P
+>The GD library was written by Thomas Boutell a long while ago to
+      programatically generate images in C. Since then it's become the
+      defacto standard for programatic image construction. The Perl bindings
+      to it found in the GD library are used on millions of web pages to
+      generate graphs on the fly. That's what Bugzilla will be using it for
+      so you must install it if you want any of the graphing to work.</P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -4335,84 +3245,75 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	    The Perl GD library requires some other libraries that may
-	  or may not be installed on your system, including
-	  <TT
-CLASS="CLASSNAME"
+>The Perl GD library requires some other libraries that may or
+        may not be installed on your system, including 
+        <TT
+CLASS="classname"
 >libpng</TT
-> and
-	  <TT
-CLASS="CLASSNAME"
+>
+        and 
+        <TT
+CLASS="classname"
 >libgd</TT
->.  The full requirements are
-	  listed in the Perl GD library README.  Just realize that if
-	  compiling GD fails, it's probably because you're missing a
-	  required library.
-	  </P
+>. 
+        The full requirements are listed in the Perl GD library README.
+        If compiling GD fails, it's probably because you're
+        missing a required library.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
+CLASS="section"
+><HR><H3
+CLASS="section"
 ><A
-NAME="AEN667"
->3.2.10. Chart::Base Perl Module (0.99c)</A
-></H2
+NAME="AEN663">4.1.5.6. Chart::Base (optional)</H3
 ><P
->	  The Chart module provides bugzilla with on-the-fly charting
-	abilities.  It can be installed in the usual fashion after it
-	has been fetched from CPAN where it is found as the
-	Chart-x.x... tarball, linked in <A
-HREF="#DOWNLOADLINKS"
->Appendix B</A
->. Note that
-	as with the GD perl module, only the version listed above, or
-	newer, will work. Earlier versions used GIF's, which are no
-	longer supported by the latest versions of GD.
-	</P
+>The Chart module provides Bugzilla with on-the-fly charting
+      abilities. It can be installed in the usual fashion after it has been
+      fetched from CPAN. 
+      Note that earlier versions that 0.99c used GIFs, which are no longer
+      supported by the latest versions of GD.</P
 ></DIV
 ><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
+CLASS="section"
+><HR><H3
+CLASS="section"
 ><A
-NAME="AEN671"
->3.2.11. DB_File Perl Module</A
-></H2
+NAME="AEN666">4.1.5.7. Template Toolkit</H3
 ><P
->	  DB_File is a module which allows Perl programs to make use
-	of the facilities provided by  Berkeley DB version 1.x. This
-	module is required by collectstats.pl which is used for  bug
-	charting. If you plan to make use of bug charting, you must
-	install this module.
-	</P
+>When you install Template Toolkit, you'll get asked various
+      questions about features to enable. The defaults are fine, except
+      that it is recommended you use the high speed XS Stash of the Template
+      Toolkit, in order to achieve best performance.  However, there are
+      known problems with XS Stash and Perl 5.005_02 and lower.  If you
+      wish to use these older versions of Perl, please use the regular
+      stash.</P
+></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="AEN674"
->3.2.12. HTTP Server</A
-></H2
+NAME="AEN669">4.1.6. HTTP Server</H2
 ><P
->	  You have a freedom of choice here - Apache, Netscape or any
-	other server on UNIX would do.  You can easily run the web
-	server on a different machine than MySQL, but need to adjust
-	the MySQL <SPAN
+>You have a freedom of choice here - Apache, Netscape or any other
+      server on UNIX would do. You can run the web server on a
+      different machine than MySQL, but need to adjust the MySQL 
+      <SPAN
 CLASS="QUOTE"
 >"bugs"</SPAN
-> user permissions accordingly.
-	<DIV
-CLASS="NOTE"
+>
+      user permissions accordingly. 
+      <DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -4428,24 +3329,22 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->I strongly recommend Apache as the web server to use.
-	    The Bugzilla Guide installation instructions, in general,
-	    assume you are using Apache.  As more users use different
-	    webservers and send me information on the peculiarities of
-	    installing using their favorite webserver, I will provide
-	    notes for them.</P
+>We strongly recommend Apache as the web server to use. The
+        Bugzilla Guide installation instructions, in general, assume you are
+        using Apache. If you have got Bugzilla working using another webserver,
+        please share your experiences with us.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 >
-	</P
+      </P
 ><P
->	  You'll want to make sure that your web server will run any
-	file with the .cgi extension as a cgi and not just display it.
-	If you're using apache that means uncommenting the following
-	line in the srm.conf file:
-	<TABLE
+>You'll want to make sure that your web server will run any file
+      with the .cgi extension as a CGI and not just display it. If you're
+      using Apache that means uncommenting the following line in the httpd.conf
+      file: 
+      <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -4454,19 +3353,18 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->AddHandler cgi-script .cgi
-	</PRE
+CLASS="programlisting"
+>AddHandler cgi-script .cgi</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-	</P
+      </P
 ><P
->	  With apache you'll also want to make sure that within the
-	access.conf file the line:
- <TABLE
+>With Apache you'll also want to make sure that within the
+      httpd.conf file the line: 
+      <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -4475,22 +3373,23 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->Options ExecCGI</PRE
+CLASS="programlisting"
+>Options ExecCGI AllowOverride Limit</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-	is in the stanza that covers the directories into which
-	you intend to put the bugzilla .html and .cgi files.
-	</P
-><DIV
-CLASS="NOTE"
+
+      is in the stanza that covers the directories into which you intend to
+      put the bugzilla .html and .cgi files.
+
+        <DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -4506,20 +3405,23 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  Users of newer versions of Apache will generally find both
-	  of the above lines will be in the httpd.conf file, rather
-	  than srm.conf or access.conf.
-	</P
+>AllowOverride Limit allows the use of a Deny statement in the
+          .htaccess file generated by checksetup.pl</P
+><P
+>Users of older versions of Apache may find the above lines 
+          in the srm.conf and access.conf files, respecitvely.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
+>
+      </P
 ><DIV
-CLASS="WARNING"
+CLASS="warning"
 ><P
 ></P
 ><TABLE
-CLASS="WARNING"
+CLASS="warning"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -4535,64 +3437,63 @@ ALT="Warning"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	    There are important files and directories that should not
-	  be a served by the HTTP server. These are most files in the
-	  <SPAN
+>There are important files and directories that should not be a
+        served by the HTTP server - most files in the 
+        <SPAN
 CLASS="QUOTE"
 >"data"</SPAN
-> and <SPAN
+>
+        and 
+        <SPAN
 CLASS="QUOTE"
 >"shadow"</SPAN
->  directories
-	  and the <SPAN
+>
+        directories and the 
+        <SPAN
 CLASS="QUOTE"
 >"localconfig"</SPAN
-> file. You should
-	  configure your HTTP server to not serve content from these
-	  files. Failure to do so will expose critical passwords and
-	  other data. Please see <A
-HREF="#HTACCESS"
+>
+        file. You should configure your HTTP server to not serve 
+        these files. Failure to do so will expose critical passwords and
+        other data. Please see 
+        <A
+HREF="#htaccess"
 >.htaccess files and security</A
-> for details
-	  on how to do this for Apache.  I appreciate notes on how to
-	  get this same functionality using other webservers.
-	  </P
+>
+        for details on how to do this for Apache; the checksetup.pl
+        script should create appropriate .htaccess files for you.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="AEN692"
->3.2.13. Installing the Bugzilla Files</A
-></H2
+NAME="AEN688">4.1.7. Bugzilla</H2
 ><P
->	  You should untar the Bugzilla files into a directory that
-	you're willing to make writable by the default web server user
-	(probably <SPAN
+>You should untar the Bugzilla files into a directory that you're
+      willing to make writable by the default web server user (probably 
+      <SPAN
 CLASS="QUOTE"
 >"nobody"</SPAN
->).  You may decide to put the
-	files off of the main web space for your web server or perhaps
-	off of <TT
-CLASS="FILENAME"
+>). 
+      You may decide to put the files in the main web space for your
+      web server or perhaps in 
+      <TT
+CLASS="filename"
 >/usr/local</TT
-> with a symbolic link in
-	the web space that points to the Bugzilla directory.  At any
-	rate, just dump all the files in the same place, and make sure
-	you can access the files in that directory through your web
-	server.
-	</P
+>
+      with a symbolic link in the web space that points to the Bugzilla
+      directory.</P
 ><DIV
-CLASS="TIP"
+CLASS="tip"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
+CLASS="tip"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -4608,80 +3509,50 @@ ALT="Tip"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	    If you symlink the bugzilla directory into your Apache's
-	  HTML heirarchy, you may receive
-	  <SPAN
-CLASS="ERRORNAME"
+>If you symlink the bugzilla directory into your Apache's HTML
+        heirarchy, you may receive 
+        <SPAN
+CLASS="errorname"
 >Forbidden</SPAN
-> errors unless you add the
-	  <SPAN
+>
+        errors unless you add the 
+        <SPAN
 CLASS="QUOTE"
 >"FollowSymLinks"</SPAN
-> directive to the
-	  &#60;Directory&#62; entry for the HTML root.
-	  </P
+>
+        directive to the &#60;Directory&#62; entry for the HTML root
+        in httpd.conf.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ><P
->	  Once all the files are in a web accessible directory, make
-	that directory writable by your webserver's user.  This is a
-	temporary step until you run the post-install
-	<TT
-CLASS="FILENAME"
+>Once all the files are in a web accessible directory, make that
+      directory writable by your webserver's user. This is a temporary step
+      until you run the post-install 
+      <TT
+CLASS="filename"
 >checksetup.pl</TT
-> script, which locks down your
-	installation.
-      </P
+>
+      script, which locks down your installation.</P
 ><P
->	Lastly, you'll need to set up a symbolic link to
-	<TT
-CLASS="FILENAME"
+>Lastly, you'll need to set up a symbolic link to 
+      <TT
+CLASS="filename"
 >/usr/bonsaitools/bin/perl</TT
-> for the correct
-	location of your perl executable (probably
-	<TT
-CLASS="FILENAME"
+>
+      for the correct location of your Perl executable (probably 
+      <TT
+CLASS="filename"
 >/usr/bin/perl</TT
->). Otherwise you must hack
-	all the .cgi files to change where they look for perl, or use
-	<A
-HREF="#SETPERL"
->The setperl.csh Utility</A
->, found in
-	<A
-HREF="#PATCHES"
->Useful Patches and Utilities for Bugzilla</A
->.  I suggest using the symlink
-	approach for future release compatability.
-	<DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN708"
-></A
-><P
-><B
->Example 3-1. Setting up bonsaitools symlink</B
-></P
+>). 
+      Otherwise you must hack all the .cgi files to change where they look
+      for Perl. This can be done using the following Perl one-liner, but 
+      I suggest using the symlink approach to avoid upgrade hassles.
+      </P
 ><P
->	      Here's how you set up the Perl symlink on Linux to make
-	    Bugzilla work. Your mileage may vary.  For some UNIX
-	    operating systems, you probably need to subsitute
-	    <SPAN
-CLASS="QUOTE"
->"/usr/local/bin/perl"</SPAN
-> for
-	    <SPAN
-CLASS="QUOTE"
->"/usr/bin/perl"</SPAN
->  below; if on certain other
-	    UNIX systems, Perl may live in weird places like
-	    <SPAN
-CLASS="QUOTE"
->"/opt/perl"</SPAN
->.  As root, run these commands:
-	    <TABLE
+> 
+        <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -4690,270 +3561,186 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->bash# mkdir /usr/bonsaitools  
-bash# mkdir /usr/bonsaitools/bin 
-bash# ln -s /usr/bin/perl /usr/bosaitools/bin/perl
-	    </PRE
+CLASS="programlisting"
+>perl -pi -e
+        's@#\!/usr/bonsaitools/bin/perl@#\!/usr/bin/perl@' *cgi *pl Bug.pm
+        processmail syncshadowdb</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-	  </P
-><P
->	    Alternately, you can simply run this perl one-liner to
-	    change your path to perl in all the files in your Bugzilla
-	    installation:
-	    <TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
->perl -pi -e 's@#!/usr/bonsaitools/bin/perl@#!/usr/bin/perl@' *cgi *pl Bug.pm
-	    </PRE
-></FONT
-></TD
-></TR
-></TABLE
->
-	    Change the second path to perl to match your installation.
-	  </P
-></DIV
->
-	<DIV
-CLASS="TIP"
-><P
-></P
-><TABLE
-CLASS="TIP"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/tip.gif"
-HSPACE="5"
-ALT="Tip"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	    If you don't have root access to set this symlink up,
-	    check out the
-	    <A
-HREF="#SETPERL"
->The setperl.csh Utility</A
->, listed in <A
-HREF="#PATCHES"
->Useful Patches and Utilities for Bugzilla</A
->. It will change the path to perl in all your Bugzilla files for you.
-	  </P
-></TD
-></TR
-></TABLE
-></DIV
->
-	</P
+
+        Change <TT
+CLASS="filename"
+>/usr/bin/perl</TT
+> to match the location
+        of Perl on your machine.
+      </P
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="AEN721"
->3.2.14. Setting Up the MySQL Database</A
-></H2
+NAME="AEN705">4.1.8. Setting Up the MySQL Database</H2
 ><P
->	  After you've gotten all the software installed and working you're ready
-	  to start preparing the database for its life as a the back end to a high
-	  quality bug tracker.
-	</P
+>After you've gotten all the software installed and working you're
+      ready to start preparing the database for its life as the back end to
+      a high quality bug tracker.</P
 ><P
->	  First, you'll want to fix MySQL permissions to allow access
-	from Bugzilla.  For the purpose of this Installation section,
-	the Bugzilla username will be <SPAN
+>First, you'll want to fix MySQL permissions to allow access from
+      Bugzilla. For the purpose of this Installation section, the Bugzilla
+      username will be 
+      <SPAN
 CLASS="QUOTE"
 >"bugs"</SPAN
->, and will
-	have minimal permissions.
-	
-	<DIV
-CLASS="WARNING"
-><P
-></P
-><TABLE
-CLASS="WARNING"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/warning.gif"
-HSPACE="5"
-ALT="Warning"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	    Bugzilla has not undergone a thorough security audit. It
-	    may be possible for a system cracker to somehow trick
-	    Bugzilla into executing a command such as <B
-CLASS="COMMAND"
->DROP
-	      DATABASE mysql</B
->.
-	  </P
-><P
->That would be bad.</P
-></TD
-></TR
-></TABLE
-></DIV
->
+>, and will have minimal permissions. 
       </P
 ><P
->	Give the MySQL root user a password.  MySQL passwords are
-	limited to 16 characters.
-	<P
+>Begin by giving the MySQL root user a password. MySQL passwords are limited
+      to 16 characters. 
+      <P
 ></P
 ><TABLE
 BORDER="0"
 ><TBODY
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >bash#</TT
-> <B
-CLASS="COMMAND"
->mysql
-		-u root mysql</B
-> </TT
 >
-	  </TD
+
+            <B
+CLASS="command"
+>mysql -u root mysql</B
+>
+          </TT
+>
+        </TD
 ></TR
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >mysql&#62;</TT
-> <B
-CLASS="COMMAND"
->		UPDATE user SET Password=PASSWORD ('new_password')
-		WHERE user='root'; </B
-> </TT
 >
-	  </TD
+
+            <B
+CLASS="command"
+>UPDATE user SET Password=PASSWORD('&#60;new_password'&#62;)
+            WHERE user='root';</B
+>
+          </TT
+>
+        </TD
 ></TR
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >mysql&#62;</TT
-> <B
-CLASS="COMMAND"
->FLUSH
-		PRIVILEGES;</B
-> </TT
 >
-	  </TD
+
+            <B
+CLASS="command"
+>FLUSH PRIVILEGES;</B
+>
+          </TT
+>
+        </TD
 ></TR
 ></TBODY
 ></TABLE
 ><P
 ></P
-> From this point on, if you need to access
-	MySQL as the MySQL root user, you will need to use
-	<B
-CLASS="COMMAND"
+>
+
+      From this point on, if you need to access MySQL as the MySQL root user,
+      you will need to use 
+      <B
+CLASS="command"
 >mysql -u root -p</B
-> and enter your
-	new_password.  Remember that MySQL user names have nothing to
-	do with Unix user names (login names).	  
-      </P
+>
+
+      and enter &#60;new_password&#62;. Remember that MySQL user names have
+      nothing to do with Unix user names (login names).</P
 ><P
->	Next, we create the <SPAN
+>Next, we use an SQL <B
+CLASS="command"
+>GRANT</B
+> command to create a 
+      <SPAN
 CLASS="QUOTE"
 >"bugs"</SPAN
-> user, and grant
-	sufficient permissions for checksetup.pl, which we'll use
-	later, to work its magic.  This also restricts the
-	<SPAN
+>
+
+      user, and grant sufficient permissions for checksetup.pl, which we'll
+      use later, to work its magic. This also restricts the 
+      <SPAN
 CLASS="QUOTE"
 >"bugs"</SPAN
-> user to operations within a database
-	called <SPAN
+>
+      user to operations within a database called 
+      <SPAN
 CLASS="QUOTE"
 >"bugs"</SPAN
->, and only allows the account to
-	connect from <SPAN
+>, and only allows the account to connect from 
+      <SPAN
 CLASS="QUOTE"
 >"localhost"</SPAN
->.  Modify it to reflect
-	your setup if you will be connecting from another machine or
-	as a different user.
-      </P
+>. 
+      Modify it to reflect your setup if you will be connecting from
+      another machine or as a different user.</P
 ><P
->	Remember to set bugs_password to some unique password.
-	<P
+>Remember to set &#60;bugs_password&#62; to some unique password. 
+      <P
 ></P
 ><TABLE
 BORDER="0"
 ><TBODY
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
->	      <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-	      <B
-CLASS="COMMAND"
+
+            <B
+CLASS="command"
 >GRANT SELECT,INSERT,UPDATE,DELETE,INDEX,
-		ALTER,CREATE,DROP,REFERENCES 
-		ON bugs.* TO bugs@localhost
-		IDENTIFIED BY 'bugs_password';</B
+            ALTER,CREATE,DROP,REFERENCES ON bugs.* TO bugs@localhost
+            IDENTIFIED BY '&#60;bugs_password&#62;';</B
 >
-	    </TT
+          </TT
 >
-	  </TD
+        </TD
 ></TR
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
->	      <TT
-CLASS="PROMPT"
->		mysql&#62;
-	      </TT
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
+>mysql&#62;</TT
 >
-	      <B
-CLASS="COMMAND"
->		FLUSH PRIVILEGES;
-	      </B
+
+            <B
+CLASS="command"
+>FLUSH PRIVILEGES;</B
 >
-	    </TT
+          </TT
 >
-	  </TD
+        </TD
 ></TR
 ></TBODY
 ></TABLE
@@ -4961,229 +3748,135 @@ CLASS="COMMAND"
 ></P
 >
       </P
+></DIV
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="AEN741">4.1.9. <TT
+CLASS="filename"
+>checksetup.pl</TT
+></H2
 ><P
->	Next, run the magic checksetup.pl script.  (Many thanks to
-	Holger Schurig &#60;holgerschurig@nikocity.de&#62; for writing
-	this script!) It will make sure Bugzilla files and directories
-	have reasonable permissions, set up the
-	<TT
-CLASS="FILENAME"
+>Next, run the magic checksetup.pl script. (Many thanks to 
+      <A
+HREF="mailto:holgerschurig@nikocity.de"
+TARGET="_top"
+>Holger Schurig </A
+> 
+      for writing this script!) 
+      This script is designed to make sure your MySQL database and other
+      configuration options are consistent with the Bugzilla CGI files. 
+      It will make sure Bugzilla files and directories have reasonable
+      permissions, set up the 
+      <TT
+CLASS="filename"
 >data</TT
-> directory, and create all the MySQL
-	tables.
-	<P
+>
+      directory, and create all the MySQL tables. 
+      <P
 ></P
 ><TABLE
 BORDER="0"
 ><TBODY
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >bash#</TT
 >
-	      <B
-CLASS="COMMAND"
+
+            <B
+CLASS="command"
 >./checksetup.pl</B
-> </TT
 >
-	  </TD
+          </TT
+>
+        </TD
 ></TR
 ></TBODY
 ></TABLE
 ><P
 ></P
-> The first time you run it, it will create a
-	file called <TT
-CLASS="FILENAME"
->localconfig</TT
->.
-      </P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
-><A
-NAME="AEN768"
->3.2.15. Tweaking <TT
-CLASS="FILENAME"
+>
+
+      The first time you run it, it will create a file called 
+      <TT
+CLASS="filename"
 >localconfig</TT
-></A
-></H2
+>.</P
 ><P
->	This file contains a variety of settings you may need to tweak including
-	how Bugzilla should connect to the MySQL database.
-      </P
+>This file contains a variety of settings you may need to tweak
+      including how Bugzilla should connect to the MySQL database.</P
 ><P
->	The connection settings include:
-	<P
+>The connection settings include: 
+      <P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->	      server's host: just use <SPAN
+>server's host: just use 
+          <SPAN
 CLASS="QUOTE"
 >"localhost"</SPAN
-> if the
-	      MySQL server is local
-	    </P
+>
+          if the MySQL server is local</P
 ></LI
 ><LI
 ><P
->	      database name: <SPAN
+>database name: 
+          <SPAN
 CLASS="QUOTE"
 >"bugs"</SPAN
-> if you're following
-	      these directions
-	    </P
+>
+          if you're following these directions</P
 ></LI
 ><LI
 ><P
->	      MySQL username: <SPAN
+>MySQL username: 
+          <SPAN
 CLASS="QUOTE"
 >"bugs"</SPAN
-> if you're following
-	      these directions
-	    </P
+>
+          if you're following these directions</P
 ></LI
 ><LI
 ><P
->	      Password for the <SPAN
+>Password for the 
+          <SPAN
 CLASS="QUOTE"
 >"bugs"</SPAN
-> MySQL account above
-	    </P
+>
+          MySQL account; (&#60;bugs_password&#62;) above</P
 ></LI
 ></OL
 >
       </P
 ><P
->	You should also install .htaccess files that the Apache
-	webserver will use  to restrict access to Bugzilla data files.
-	See <A
-HREF="#HTACCESS"
->.htaccess files and security</A
->.
-      </P
-><P
->	Once you are happy with the settings, re-run
-	<TT
-CLASS="FILENAME"
+>Once you are happy with the settings, 
+      <TT
+CLASS="filename"
+>su</TT
+> to the user
+      your web server runs as, and re-run 
+      <TT
+CLASS="filename"
 >checksetup.pl</TT
->. On this second run, it will
-	  create the database and an administrator account for which
-	  you will be prompted to provide information.
-      </P
-><P
->	When logged into an administrator account once Bugzilla is
-	running, if you go to the query page (off of the Bugzilla main
-	menu), you'll find an <SPAN
-CLASS="QUOTE"
->"edit parameters"</SPAN
-> option
-	that is filled with editable treats.
-      </P
-><P
->	Should everything work, you will have a nearly empty Bugzilla
-	database and a newly-created <TT
-CLASS="FILENAME"
->localconfig</TT
->
-	file in your Bugzilla root directory.
-      </P
-><P
->	<DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	    The second time you run checksetup.pl, you should become
-	    the user your web server runs as, and that you ensure that
-	    you set the <SPAN
-CLASS="QUOTE"
->"webservergroup"</SPAN
-> parameter in localconfig to
-	    match the web  server's group name, if any.  I believe,
-	    for the next release of Bugzilla, this will be fixed so
-	    that Bugzilla supports a <SPAN
-CLASS="QUOTE"
->"webserveruser"</SPAN
-> parameter in
-	    localconfig as well.
-	    <DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN799"
-></A
-><P
-><B
->Example 3-2. Running checksetup.pl as the web user</B
-></P
-><P
->		  Assuming your web server runs as user "apache", and
-		Bugzilla is installed in "/usr/local/bugzilla", here's
-		one way to run checksetup.pl as the web server user.
-		As root, for the <EM
->second run</EM
-> of
-		checksetup.pl, do this: 
-		<TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
-> 
-bash# chown -R apache:apache /usr/local/bugzilla 
-bash# su - apache 
-bash# cd /usr/local/bugzilla 
-bash# ./checksetup.pl 
-		</PRE
-></FONT
-></TD
-></TR
-></TABLE
->
-	      </P
-></DIV
->
-	  </P
-></TD
-></TR
-></TABLE
-></DIV
->
-      </P
+>. (Note: on some security-conscious
+      systems, you may need to change the login shell for the webserver 
+      account before you can do this.)
+      On this second run, it will create the database and an administrator
+      account for which you will be prompted to provide information.</P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -5199,97 +3892,52 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  The checksetup.pl script is designed so that you can run
-	  it at any time without causing harm.  You should run it
-	  after any upgrade to Bugzilla.
-	</P
+>The checksetup.pl script is designed so that you can run it at
+        any time without causing harm. You should run it after any upgrade to
+        Bugzilla.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="AEN806"
->3.2.16. Setting Up Maintainers Manually (Optional)</A
-></H2
+NAME="AEN773">4.1.10. Securing MySQL</H2
 ><P
->	If you want to add someone else to every group by hand, you
-	can do it by typing the appropriate MySQL commands.  Run
-	<B
-CLASS="COMMAND"
-> mysql -u root -p bugs</B
-> You
-	may need different parameters, depending on your security
-	settings. Then:
-	  <P
+>If you followed the installation instructions for setting up your
+      "bugs" and "root" user in MySQL, much of this should not apply to you.
+      If you are upgrading an existing installation of Bugzilla, you should
+      pay close attention to this section.</P
+><P
+>Most MySQL installs have "interesting" default security
+      parameters: 
+      <P
 ></P
 ><TABLE
 BORDER="0"
 ><TBODY
 ><TR
 ><TD
->	      <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->mysql&#62;</TT
-> <B
-CLASS="COMMAND"
->update
-		profiles set groupset=0x7fffffffffffffff where
-		login_name = 'XXX';</B
-> </TT
-> (yes, that's <EM
->fifteen</EM
-><SPAN
-CLASS="QUOTE"
->"f"</SPAN
->'s.
-	    </TD
+>mysqld defaults to running as root</TD
 ></TR
-></TBODY
-></TABLE
-><P
-></P
-> replacing XXX with the Bugzilla email address.
-	</P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
-><A
-NAME="AEN817"
->3.2.17. The Whining Cron (Optional)</A
-></H2
-><P
->	By now you have a fully functional bugzilla, but what good
-	are bugs if they're not annoying?  To help make those bugs
-	more annoying you can set up bugzilla's automatic whining
-	system.  This can be done by adding the following command as a
-	daily crontab entry (for help on that see that crontab man
-	page):
-	<P
-></P
-><TABLE
-BORDER="0"
-><TBODY
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
-> <B
-CLASS="COMMAND"
->cd
-		&#60;your-bugzilla-directory&#62; ;
-		./whineatnews.pl</B
-> </TT
->
-	  </TD
+>it defaults to allowing external network connections</TD
+></TR
+><TR
+><TD
+>it has a known port number, and is easy to detect</TD
+></TR
+><TR
+><TD
+>it defaults to no passwords whatsoever</TD
+></TR
+><TR
+><TD
+>it defaults to allowing "File_Priv"</TD
 ></TR
 ></TBODY
 ></TABLE
@@ -5297,248 +3945,101 @@ CLASS="COMMAND"
 ></P
 >
       </P
-><DIV
-CLASS="TIP"
 ><P
+>This means anyone from anywhere on the internet can not only drop
+      the database with one SQL command, and they can write as root to the
+      system.</P
+><P
+>To see your permissions do: 
+      <P
 ></P
 ><TABLE
-CLASS="TIP"
-WIDTH="100%"
 BORDER="0"
+><TBODY
 ><TR
 ><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/tip.gif"
-HSPACE="5"
-ALT="Tip"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	  Depending on your system, crontab may have several manpages.
-	  The following command should  lead you to the most useful
-	  page for this purpose: 
-	  <TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
-> man 5 crontab
-	  </PRE
-></FONT
-></TD
-></TR
-></TABLE
->
-	</P
-></TD
-></TR
-></TABLE
-></DIV
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
-><A
-NAME="AEN827"
->3.2.18. Bug Graphs (Optional)</A
-></H2
-><P
->	As long as you installed the GD and Graph::Base Perl modules
-	you might as well turn on the nifty bugzilla bug reporting
-	graphs.
-      </P
-><P
->	Add a cron entry like this to run collectstats daily at 5
-	after midnight:
-	<P
-></P
-><TABLE
-BORDER="0"
-><TBODY
-><TR
-><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->bash#</TT
-> <B
-CLASS="COMMAND"
->crontab
-		-e</B
-> </TT
->
-	  </TD
-></TR
-><TR
-><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
-> 5 0 * * * cd
-	      &#60;your-bugzilla-directory&#62; ; ./collectstats.pl
-	    </TT
->
-	  </TD
-></TR
-></TBODY
-></TABLE
-><P
-></P
->
-      </P
-><P
->	After two days have passed you'll be able to view bug graphs
-	from the Bug Reports page. 
-      </P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
-><A
-NAME="AEN839"
->3.2.19. Securing MySQL</A
-></H2
-><P
->	If you followed the installation instructions for setting up
-	your "bugs" and "root" user in MySQL, much of this should not
-	apply to you.  If you are upgrading an existing installation
-	of Bugzilla, you should pay close attention to this section.
-      </P
-><P
->	Most MySQL installs have "interesting" default security parameters:
-	<P
-></P
-><TABLE
-BORDER="0"
-><TBODY
-><TR
-><TD
->mysqld defaults to running as root</TD
-></TR
-><TR
-><TD
->it defaults to allowing external network connections</TD
-></TR
-><TR
-><TD
->it has a known port number, and is easy to detect</TD
-></TR
-><TR
-><TD
->it defaults to no passwords whatsoever</TD
-></TR
-><TR
-><TD
->it defaults to allowing "File_Priv"</TD
-></TR
-></TBODY
-></TABLE
-><P
-></P
->
-      </P
-><P
->	This means anyone from anywhere on the internet can not only
-	drop the database with one SQL command, and they can write as
-	root to the system.
-      </P
-><P
->	To see your permissions do:
-	<P
-></P
-><TABLE
-BORDER="0"
-><TBODY
-><TR
-><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
->	      <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >bash#</TT
 >
-	      <B
-CLASS="COMMAND"
+
+            <B
+CLASS="command"
 >mysql -u root -p</B
 >
-	    </TT
+          </TT
 >
-	  </TD
+        </TD
 ></TR
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
->	      <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-	      <B
-CLASS="COMMAND"
+
+            <B
+CLASS="command"
 >use mysql;</B
 >
-	    </TT
+          </TT
 >
-	  </TD
+        </TD
 ></TR
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
->	      <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-	      <B
-CLASS="COMMAND"
+
+            <B
+CLASS="command"
 >show tables;</B
 >
-	    </TT
+          </TT
 >
-	  </TD
+        </TD
 ></TR
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
->	      <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-	      <B
-CLASS="COMMAND"
+
+            <B
+CLASS="command"
 >select * from user;</B
 >
-	    </TT
+          </TT
 >
-	  </TD
+        </TD
 ></TR
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
->	      <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-	      <B
-CLASS="COMMAND"
+
+            <B
+CLASS="command"
 >select * from db;</B
 >
-	    </TT
+          </TT
 >
-	  </TD
+        </TD
 ></TR
 ></TBODY
 ></TABLE
@@ -5547,8 +4048,8 @@ CLASS="COMMAND"
 >
       </P
 ><P
->	To fix the gaping holes:
-	<P
+>To fix the gaping holes: 
+      <P
 ></P
 ><TABLE
 BORDER="0"
@@ -5559,11 +4060,12 @@ BORDER="0"
 ></TR
 ><TR
 ><TD
->UPDATE user SET Password=PASSWORD('new_password') WHERE user='root';</TD
+>UPDATE user SET Password=PASSWORD('new_password') WHERE
+        user='root';</TD
 ></TR
 ><TR
 ><TD
-> FLUSH PRIVILEGES;</TD
+>FLUSH PRIVILEGES;</TD
 ></TR
 ></TBODY
 ></TABLE
@@ -5572,8 +4074,8 @@ BORDER="0"
 >
       </P
 ><P
->	If you're not running "mit-pthreads" you can use:
-	<P
+>If you're not running "mit-pthreads" you can use: 
+      <P
 ></P
 ><TABLE
 BORDER="0"
@@ -5601,10 +4103,10 @@ BORDER="0"
 >
       </P
 ><P
->	With "mit-pthreads" you'll need to modify the "globals.pl" Mysql-&#62;Connect
-	line to specify a specific host name instead of "localhost", and accept
-	external connections:
-	<P
+>With "mit-pthreads" you'll need to modify the "globals.pl"
+      Mysql-&#62;Connect line to specify a specific host name instead of
+      "localhost", and accept external connections: 
+      <P
 ></P
 ><TABLE
 BORDER="0"
@@ -5632,174 +4134,148 @@ BORDER="0"
 >
       </P
 ><P
->	Use .htaccess files with the Apache webserver to secure your
-	bugzilla install. See <A
-HREF="#HTACCESS"
->.htaccess files and security</A
->
-      </P
-><P
->	Consider also:
-	<P
+>Consider also: 
+      <P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->	      Turning off external networking with "--skip-networking",
-	      unless you have "mit-pthreads", in which case you can't.
-	      Without networking, MySQL connects with a Unix domain socket.
-	    </P
+>Turning off external networking with "--skip-networking",
+          unless you have "mit-pthreads", in which case you can't. Without
+          networking, MySQL connects with a Unix domain socket.</P
 ></LI
 ><LI
 ><P
->	      using the --user= option to mysqld to run it as an unprivileged
-	      user.
-	    </P
+>using the --user= option to mysqld to run it as an
+          unprivileged user.</P
 ></LI
 ><LI
 ><P
->	      starting MySQL in a chroot jail
-	    </P
+>running MySQL in a chroot jail</P
 ></LI
 ><LI
 ><P
->	      running the httpd in a "chrooted" jail
-	    </P
+>running the httpd in a chroot jail</P
 ></LI
 ><LI
 ><P
->	      making sure the MySQL passwords are different from the OS
-	      passwords (MySQL "root" has nothing to do with system "root").
-	    </P
+>making sure the MySQL passwords are different from the OS
+          passwords (MySQL "root" has nothing to do with system
+          "root").</P
 ></LI
 ><LI
 ><P
->	      running MySQL on a separate untrusted machine
-	    </P
+>running MySQL on a separate untrusted machine</P
 ></LI
 ><LI
 ><P
->	      making backups ;-)
-	    </P
+>making backups ;-)</P
 ></LI
 ></OL
 >
       </P
 ></DIV
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="AEN839">4.1.11. Configuring Bugzilla</H2
+><P
+>&#13;      You should run through the parameters on the Edit Parameters page
+      (link in the footer) and set them all to appropriate values. 
+      They key parameters are documented in <A
+HREF="#parameters"
+>Section 5.1</A
+>.
+      </P
+></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="OSX"
->3.3. Mac OS X Installation Notes</A
-></H1
-><P
->      There are a lot of common libraries and utilities out there
-      that Apple did not include with Mac OS X, but which run
-      perfectly well on it.  The GD library, which Bugzilla needs to
-      do bug graphs, is one of these.
-    </P
-><P
->      The easiest way to get a lot of these is with a program called
-      Fink, which is similar in nature to the CPAN installer, but
-      installs common GNU utilities.  Fink is available from
-      &#60;http://sourceforge.net/projects/fink/&#62;.
-    </P
+NAME="extraconfig">4.2. Optional Additional Configuration</H1
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="AEN845">4.2.1. Dependency Charts</H2
 ><P
->      Follow the instructions for setting up Fink.  Once it's
-      installed, you'll want to run the following as root:
-      <B
-CLASS="COMMAND"
->fink install gd</B
->
-    </P
+>As well as the text-based dependency graphs, Bugzilla also
+      supports dependency graphing, using a package called 'dot'.
+      Exactly how this works is controlled by the 'webdotbase' parameter,
+      which can have one of three values:
+      </P
 ><P
->      It will prompt you for a number of dependencies, type 'y' and
-      hit enter to install all of the dependencies.  Then watch it
-      work.
-    </P
+>&#13;        <P
+></P
+><OL
+TYPE="1"
+><LI
 ><P
->      To prevent creating conflicts with the software that Apple
-      installs by default, Fink creates its own directory tree at
-      /sw where it installs most of the software that it installs.
-      This means your libraries and headers for libgd will be at
-      /sw/lib and /sw/include instead of /usr/lib and
-      /usr/local/include.  Because of these changed locations for
-      the libraries, the Perl GD module will not install directly
-      via CPAN (it looks for the specific paths instead of getting
-      them from your environment).  But there's a way around that
-      :-)
-    </P
+>&#13;            A complete file path to the command 'dot' (part of 
+            <A
+HREF="http://www.graphviz.org/"
+TARGET="_top"
+>GraphViz</A
+>) 
+            will generate the graphs locally
+            </P
+></LI
+><LI
 ><P
->      Instead of typing <SPAN
-CLASS="QUOTE"
->"install GD"</SPAN
-> at the
-      <TT
-CLASS="PROMPT"
->cpan&#62;</TT
-> prompt, type <B
-CLASS="COMMAND"
->look
-	GD</B
->.  This should go through the motions of
-      downloading the latest version of the GD module, then it will
-      open a shell and drop you into the build directory. Apply the
-      following patch to the Makefile.PL file (save the patch into a
-      file  and use the command <B
-CLASS="COMMAND"
->patch &#60;
-	patchfile</B
->:
-    </P
+>&#13;            A URL prefix pointing to an installation of the webdot package will
+            generate the graphs remotely
+            </P
+></LI
+><LI
 ><P
->      <TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
->	
---- GD-1.33/Makefile.PL Fri Aug  4 16:59:22 2000
-+++ GD-1.33-darwin/Makefile.PL  Tue Jun 26 01:29:32 2001
-@@ -3,8 +3,8 @@
- warn "NOTICE: This module requires libgd 1.8.3 or higher (shared library version 4.X).\n";
- 
- # =====&#62; PATHS: CHECK AND ADJUST &#60;=====
--my @INC     = qw(-I/usr/local/include -I/usr/local/include/gd); 
--my @LIBPATH = qw(-L/usr/lib/X11 -L/usr/X11R6/lib -L/usr/X11/lib -L/usr/local/lib );
-+my @INC     = qw(-I/sw/include -I/sw/include/gd -I/usr/local/include -I/usr/local/include/gd);
-+my @LIBPATH = qw(-L/usr/lib/X11 -L/usr/X11R6/lib -L/usr/X11/lib -L/sw/lib -L/usr/local/lib);
- my @LIBS    = qw(-lgd -lpng -lz);
- 
- # FEATURE FLAGS
-@@ -23,7 +23,7 @@
- 
- push @LIBS,'-lttf' if $TTF;
- push @LIBS,'-ljpeg' if $JPEG;
--push @LIBS, '-lm' unless $^O eq 'MSWin32';
-+push @LIBS, '-lm' unless ($^O =~ /^MSWin32|darwin$/);
- 
- # FreeBSD 3.3 with libgd built from ports croaks if -lXpm is specified 
- if ($^O ne 'freebsd' &#38;&#38; $^O ne 'MSWin32') {
-
- 
-      </PRE
-></FONT
-></TD
-></TR
-></TABLE
+>&#13;            A blank value will disable dependency graphing.
+            </P
+></LI
+></OL
 >
-    </P
+      </P
+><P
+>So, to get this working, install
+      <A
+HREF="http://www.graphviz.org/"
+TARGET="_top"
+>GraphViz</A
+>. If you
+      do that, you need to
+      <A
+HREF="http://httpd.apache.org/docs/mod/mod_imap.html"
+TARGET="_top"
+>enable
+      server-side image maps</A
+> in Apache.
+      Alternatively, you could set up a webdot server, or use the AT&#38;T 
+      public webdot server (the
+      default for the webdotbase param). Note that AT&#38;T's server won't work
+      if Bugzilla is only accessible using HTTPS.
+      </P
+></DIV
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="AEN860">4.2.2. Bug Graphs</H2
+><P
+>As long as you installed the GD and Graph::Base Perl modules you
+      might as well turn on the nifty Bugzilla bug reporting graphs.</P
 ><P
->      Then, run these commands to finish the installation of the perl module:
+>Add a cron entry like this to run 
+      <TT
+CLASS="filename"
+>collectstats.pl</TT
+> 
+      daily at 5 after midnight: 
       <P
 ></P
 ><TABLE
@@ -5807,278 +4283,241 @@ BORDER="0"
 ><TBODY
 ><TR
 ><TD
-><B
-CLASS="COMMAND"
->perl Makefile.PL</B
-></TD
-></TR
-><TR
-><TD
-><B
-CLASS="COMMAND"
->make</B
-></TD
-></TR
-><TR
-><TD
-><B
-CLASS="COMMAND"
->make test</B
-></TD
-></TR
-><TR
-><TD
-><B
-CLASS="COMMAND"
->make install</B
-></TD
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
+>bash#</TT
+>
+
+            <B
+CLASS="command"
+>crontab -e</B
+>
+          </TT
+>
+        </TD
 ></TR
 ><TR
 ><TD
->And don't forget to run <B
-CLASS="COMMAND"
->exit</B
-> to get back to cpan.</TD
+>&#13;          <TT
+CLASS="computeroutput"
+>5 0 * * * cd &#60;your-bugzilla-directory&#62; ;
+          ./collectstats.pl</TT
+>
+        </TD
 ></TR
 ></TBODY
 ></TABLE
 ><P
 ></P
 >
-    </P
-><P
->      Happy Hacking!
-    </P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="BSDINSTALL"
->3.4. BSD Installation Notes</A
-></H1
-><P
->      For instructions on how to set up Bugzilla on FreeBSD, NetBSD, OpenBSD, BSDi, etc. please
-      consult <A
-HREF="#OSX"
->Section 3.3</A
->.
-    </P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="GENINSTALL"
->3.5. Installation General Notes</A
-></H1
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="AEN941"
->3.5.1. Modifying Your Running System</A
-></H2
-><P
->	Bugzilla optimizes database lookups by storing all relatively static
-	information in the versioncache file, located in the data/ subdirectory
-	under your installation directory.
-      </P
-><P
->	If you make a change to the structural data in your database
-	(the versions table for example), or to the
-	<SPAN
-CLASS="QUOTE"
->"constants"</SPAN
-> encoded in defparams.pl, you will
-	need to remove the cached content from the data directory
-	(by doing a <SPAN
-CLASS="QUOTE"
->"rm data/versioncache"</SPAN
->), or your
-	changes won't show up.
       </P
 ><P
->	That file gets automatically regenerated whenever it's more than an
-	hour old, so Bugzilla will eventually notice your changes by itself, but
-	generally you want it to notice right away, so that you can test things.
-      </P
+>After two days have passed you'll be able to view bug graphs from
+      the Bug Reports page.</P
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="AEN948"
->3.5.2. Upgrading From Previous Versions</A
-></H2
-><P
->	The developers of Bugzilla are constantly adding new tables, columns and
-	fields.  You'll get SQL errors if you just update the code.  The strategy
-	to update is to simply always run the checksetup.pl script whenever
-	you upgrade your installation of Bugzilla.  If you want to see what has
-	changed, you can read the comments in that file, starting from the end.
-      </P
+NAME="AEN873">4.2.3. The Whining Cron</H2
 ><P
->	If you are running Bugzilla version 2.8 or lower, and wish to upgrade to
-	the latest version, please consult the file, "UPGRADING-pre-2.8" in the
-	Bugzilla root directory after untarring the archive.
+>By now you have a fully functional Bugzilla, but what good are
+      bugs if they're not annoying? To help make those bugs more annoying you
+      can set up Bugzilla's automatic whining system to complain at engineers
+      which leave their bugs in the NEW state without triaging them.
       </P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
-><A
-NAME="HTACCESS"
->3.5.3. <TT
-CLASS="FILENAME"
->.htaccess</TT
-> files and security</A
-></H2
-><P
->	To enhance the security of your Bugzilla installation,
-	Bugzilla  will generate
-	<I
-CLASS="GLOSSTERM"
-><TT
-CLASS="FILENAME"
->.htaccess</TT
-></I
-> files
-	which the Apache webserver can use to restrict  access to
-	the bugzilla data files. The checksetup script  will
-	generate the <TT
-CLASS="FILENAME"
->.htaccess</TT
-> files.
-	
-	<DIV
-CLASS="NOTE"
 ><P
+>&#13;      This can be done by
+      adding the following command as a daily crontab entry (for help on that
+      see that crontab man page): 
+      <P
 ></P
 ><TABLE
-CLASS="NOTE"
-WIDTH="100%"
 BORDER="0"
+><TBODY
 ><TR
 ><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <B
+CLASS="command"
+>cd &#60;your-bugzilla-directory&#62; ;
+            ./whineatnews.pl</B
+>
+          </TT
+>
+        </TD
+></TR
+></TBODY
+></TABLE
+><P
+></P
+>
+      </P
+><DIV
+CLASS="tip"
+><P
+></P
+><TABLE
+CLASS="tip"
+WIDTH="100%"
+BORDER="0"
+><TR
+><TD
+WIDTH="25"
+ALIGN="CENTER"
+VALIGN="TOP"
+><IMG
+SRC="../images/tip.gif"
+HSPACE="5"
+ALT="Tip"></TD
 ><TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	    If you are using an alternate provider of
-	    <SPAN
-CLASS="PRODUCTNAME"
->webdot</SPAN
-> services for graphing
-	    (as described when viewing
-	    <TT
-CLASS="FILENAME"
->editparams.cgi</TT
-> in your web
-	    browser), you will need to change  the ip address in
-	    <TT
-CLASS="FILENAME"
->data/webdot/.htaccess</TT
-> to the ip
-	    address of the webdot server that  you are using. 
-	  </P
+>Depending on your system, crontab may have several manpages.
+        The following command should lead you to the most useful page for
+        this purpose: 
+        <TABLE
+BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
+><TR
+><TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+>man 5 crontab</PRE
+></FONT
 ></TD
 ></TR
 ></TABLE
-></DIV
->
-	
-      </P
-><P
->	If you are using Internet Information Server or other web
-	server which does not observe <TT
-CLASS="FILENAME"
->.htaccess</TT
 >
-	conventions, you can disable their creation by editing
-	<TT
-CLASS="FILENAME"
->localconfig</TT
-> and setting the
-	<TT
-CLASS="VARNAME"
->$create_htaccess</TT
-> variable to
-	<TT
-CLASS="PARAMETER"
-><I
->0</I
-></TT
->.
-      </P
+        </P
+></TD
+></TR
+></TABLE
+></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="MOD_THROTTLE"
->3.5.4. <TT
-CLASS="FILENAME"
->mod_throttle</TT
-> and Security</A
-></H2
+NAME="bzldap">4.2.4. LDAP Authentication</H2
 ><P
->	It is possible for a user, by mistake or on purpose, to access
-	the database many times in a row which can result in very slow
-	access speeds for other users.  If your Bugzilla installation
-	is experiencing this problem , you may install  the Apache
-	module <TT
-CLASS="FILENAME"
->mod_throttle</TT
-> which can limit
-	connections by ip-address. You may download this module at
-	<A
-HREF="http://www.snert.com/Software/Throttle/"
-TARGET="_top"
->http://www.snert.com/Software/Throttle/</A
->. Follow the instructions to install into your Apache install.  <EM
->This module only functions with the Apache web server!</EM
->. You may use the <B
-CLASS="COMMAND"
->ThrottleClientIP</B
-> command provided by this module  to accomplish this goal. See the <A
-HREF="http://www.snert.com/Software/Throttle/"
+>&#13;        <DIV
+CLASS="warning"
+><P
+></P
+><TABLE
+CLASS="warning"
+WIDTH="100%"
+BORDER="0"
+><TR
+><TD
+WIDTH="25"
+ALIGN="CENTER"
+VALIGN="TOP"
+><IMG
+SRC="../images/warning.gif"
+HSPACE="5"
+ALT="Warning"></TD
+><TD
+ALIGN="LEFT"
+VALIGN="TOP"
+><P
+>This information on using the LDAP
+            authentication options with Bugzilla is old, and the authors do
+            not know of anyone who has tested it. Approach with caution.
+          </P
+></TD
+></TR
+></TABLE
+></DIV
+>
+      </P
+><P
+>&#13;      The existing authentication
+      scheme for Bugzilla uses email addresses as the primary user ID, and a
+      password to authenticate that user. All places within Bugzilla where
+      you need to deal with user ID (e.g assigning a bug) use the email
+      address. The LDAP authentication builds on top of this scheme, rather
+      than replacing it. The initial log in is done with a username and
+      password for the LDAP directory. This then fetches the email address
+      from LDAP and authenticates seamlessly in the standard Bugzilla
+      authentication scheme using this email address. If an account for this
+      address already exists in your Bugzilla system, it will log in to that
+      account. If no account for that email address exists, one is created at
+      the time of login. (In this case, Bugzilla will attempt to use the
+      "displayName" or "cn" attribute to determine the user's full name.)
+      After authentication, all other user-related tasks are still handled by
+      email address, not LDAP username. You still assign bugs by email
+      address, query on users by email address, etc.
+      </P
+><P
+>Using LDAP for Bugzilla authentication requires the 
+      Mozilla::LDAP (aka PerLDAP) Perl module. The
+      Mozilla::LDAP module in turn requires Netscape's Directory SDK for C.
+      After you have installed the SDK, then install the PerLDAP module.
+      Mozilla::LDAP and the Directory SDK for C are both 
+      <A
+HREF="http://www.mozilla.org/directory/"
 TARGET="_top"
->Module Instructions</A
-> for more  information. </P
+>available for
+      download</A
+> from mozilla.org. 
+      </P
+><P
+>&#13;      Set the Param 'useLDAP' to "On" **only** if you will be using an LDAP
+      directory for
+      authentication. Be very careful when setting up this parameter; if you
+      set LDAP authentication, but do not have a valid LDAP directory set up,
+      you will not be able to log back in to Bugzilla once you log out. (If
+      this happens, you can get back in by manually editing the data/params
+      file, and setting useLDAP back to 0.)
+      </P
+><P
+>If using LDAP, you must set the
+      three additional parameters: Set LDAPserver to the name (and optionally
+      port) of your LDAP server. If no port is specified, it defaults to the
+      default port of 389. (e.g "ldap.mycompany.com" or
+      "ldap.mycompany.com:1234") Set LDAPBaseDN to the base DN for searching
+      for users in your LDAP directory. (e.g. "ou=People,o=MyCompany") uids
+      must be unique under the DN specified here. Set LDAPmailattribute to
+      the name of the attribute in your LDAP directory which contains the
+      primary email address. On most directory servers available, this is
+      "mail", but you may need to change this.
+      </P
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="CONTENT_TYPE"
->3.5.5. Preventing untrusted Bugzilla content from executing malicious Javascript code</A
-></H2
+NAME="content-type">4.2.5. Preventing untrusted Bugzilla content from executing malicious
+      Javascript code</H2
 ><P
->It is possible for a Bugzilla to execute malicious
-	Javascript code.  Due to internationalization concerns, we are
-	unable to incorporate the code changes necessary to fulfill
-	the CERT advisory requirements mentioned in <A
+>It is possible for a Bugzilla to execute malicious Javascript
+      code. Due to internationalization concerns, we are unable to
+      incorporate the code changes necessary to fulfill the CERT advisory
+      requirements mentioned in 
+      <A
 HREF="http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3"
 TARGET="_top"
->http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3</A
->.  Executing the following code snippet from a UNIX command shell will rectify the problem if your Bugzilla installation is intended for an English-speaking audience.  As always, be sure your Bugzilla installation has a good backup before making changes, and I recommend you understand what the script is doing before executing it. </P
+>&#13;      http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3</A
+>.
+      Executing the following code snippet from a UNIX command shell will
+      rectify the problem if your Bugzilla installation is intended for an
+      English-speaking audience. As always, be sure your Bugzilla
+      installation has a good backup before making changes, and I recommend
+      you understand what the script is doing before executing it.</P
 ><P
-><TABLE
+>&#13;        <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -6087,121 +4526,79 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->bash# cd $BUGZILLA_HOME; for i in `ls *.cgi`; \
-	  do cat $i | sed 's/Content-type\: text\/html/Content-Type: text\/html\; charset=ISO-8859-1/' &#62;$i.tmp; \
-	  mv $i.tmp $i; done
-	</PRE
+CLASS="programlisting"
+>bash# perl -pi -e "s/Content-Type\: text\/html/Content-Type\: text\/html\; charset=ISO-8859-1/i" *.cgi *.pl
+        </PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
-></P
+>
+      </P
 ><P
->	All this one-liner command does is search for all instances of
-	<SPAN
+>All this one-liner command does is search for all instances of 
+      <SPAN
 CLASS="QUOTE"
 >"Content-type: text/html"</SPAN
-> and replaces it with
-	<SPAN
+>
+
+      and replaces it with 
+      <SPAN
 CLASS="QUOTE"
 >"Content-Type: text/html; charset=ISO-8859-1"</SPAN
->.
-	This specification prevents possible Javascript attacks on the
-	browser, and is suggested for all English-speaking sites.  For
-	non-english-speaking Bugzilla sites, I suggest changing
-	<SPAN
+>
+
+      . This specification prevents possible Javascript attacks on the
+      browser, and is suggested for all English-speaking sites. For
+      non-English-speaking Bugzilla sites, I suggest changing 
+      <SPAN
 CLASS="QUOTE"
 >"ISO-8859-1"</SPAN
->, above, to <SPAN
+>, above, to 
+      <SPAN
 CLASS="QUOTE"
 >"UTF-8"</SPAN
->.
-      </P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
-><A
-NAME="UNIXHISTORY"
->3.5.6. UNIX Installation Instructions History</A
-></H2
-><P
->	This document was originally adapted from the Bonsai
-	installation instructions by Terry Weissman
-	&#60;terry@mozilla.org&#62;.
-      </P
-><P
->	The February 25, 1999 re-write of this page was done by Ry4an
-	Brase &#60;ry4an@ry4an.org&#62;, with some edits by Terry
-	Weissman, Bryce Nesbitt, Martin Pool, &#38; Dan Mosedale (But
-	don't send bug reports to them; report them using bugzilla, at <A
-HREF="http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla"
-TARGET="_top"
->http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla</A
-> ).
-      </P
-><P
->	This document was heavily modified again Wednesday, March 07
-	2001 to reflect changes for Bugzilla 2.12 release by Matthew
-	P. Barnson.  The securing MySQL section should be changed to
-	become standard procedure for Bugzilla installations.
-      </P
-><P
->	Finally, the README in its entirety was marked up in SGML and
-	included into the Guide on April 24, 2001 by Matt Barnson.
-	Since that time, it's undergone extensive modification as
-	Bugzilla grew.
-      </P
+>.</P
 ><P
->	Comments from people using this Guide for the first time are
-	particularly welcome.
-      </P
-></DIV
+>Note: using &#60;meta&#62; tags to set the charset is not
+      recommended, as there's a bug in Netscape 4.x which causes pages
+      marked up in this way to load twice.</P
 ></DIV
 ><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="WIN32"
->3.6. Win32 Installation Notes</A
-></H1
-><P
->This section covers installation on Microsoft Windows 95,
-      98, ME, NT, and 2000.  Bugzilla works fine on Win32 platforms,
-      but please remember that the Bugzilla team and the author of the
-      Guide neither endorse nor support installation on Microsoft
-      Windows.  Bugzilla installs and runs <EM
->best</EM
->
-      and <EM
->easiest</EM
-> on UNIX-like operating systems,
-      and that is the way it will stay for the foreseeable future. The
-      Bugzilla team is considering supporting Win32 for the 2.16
-      release and later.</P
-><P
->The easiest way to install Bugzilla on Intel-archiecture
-      machines is to install some variant of GNU/Linux, then follow
-      the UNIX installation instructions in this Guide.  If you have
-      any influence in the platform choice for running this system,
-      please choose GNU/Linux instead of Microsoft Windows.</P
-><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="WININSTALL"
->3.6.1. Win32 Installation: Step-by-step</A
-></H2
-><DIV
-CLASS="NOTE"
+NAME="htaccess">4.2.6. <TT
+CLASS="filename"
+>.htaccess</TT
+>
+      files and security</H2
+><P
+>To enhance the security of your Bugzilla installation, Bugzilla's
+      <TT
+CLASS="filename"
+>checksetup.pl</TT
+> script will generate 
+      <I
+CLASS="glossterm"
+>&#13;        <TT
+CLASS="filename"
+>.htaccess</TT
+>
+      </I
+>
+
+      files which the Apache webserver can use to restrict access to the
+      bugzilla data files. 
+      These .htaccess files will not work with Apache 1.2.x - but this
+      has security holes, so you shouldn't be using it anyway. 
+      <DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -6217,68 +4614,196 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  You should be familiar with, and cross-reference, the rest
-	  of the  
-	  <A
-HREF="#INSTALLATION"
->Bugzilla Installation</A
-> section while performing your
-	  Win32 installation.
-	</P
+>If you are using an alternate provider of 
+        <SPAN
+CLASS="productname"
+>webdot</SPAN
+>
+
+        services for graphing (as described when viewing 
+        <TT
+CLASS="filename"
+>editparams.cgi</TT
+>
+
+        in your web browser), you will need to change the ip address in 
+        <TT
+CLASS="filename"
+>data/webdot/.htaccess</TT
+>
+
+        to the ip address of the webdot server that you are using.</P
+></TD
+></TR
+></TABLE
+></DIV
+>
+      </P
 ><P
->  Making Bugzilla work on Microsoft Windows is no
-	  picnic.  Support for Win32 has improved dramatically in the
-	  last few releases, but, if you choose to proceed, you should
-	  be a <EM
->very</EM
-> skilled Windows Systems
-	  Administrator with strong troubleshooting abilities, a high
-	  tolerance for pain, and moderate perl skills. Bugzilla on NT
-	  requires hacking source code and implementing some advanced
-	  utilities.  What follows is the recommended installation
-	  procedure for Win32; additional suggestions are provided in
-	  <A
-HREF="#FAQ"
->Appendix A</A
->.
-	</P
+>The default .htaccess file may not provide adequate access
+      restrictions, depending on your web server configuration. Be sure to
+      check the &#60;Directory&#62; entries for your Bugzilla directory so that
+      the 
+      <TT
+CLASS="filename"
+>.htaccess</TT
+>
+
+      file is allowed to override web server defaults. For instance, let's
+      assume your installation of Bugzilla is installed to 
+      <TT
+CLASS="filename"
+>/usr/local/bugzilla</TT
+>
+
+      . You should have this &#60;Directory&#62; entry in your 
+      <TT
+CLASS="filename"
+>httpd.conf</TT
+>
+
+      file:</P
+><P
+>&#13;      
+<TABLE
+BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
+><TR
+><TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+>&#13;  &#60;Directory /usr/local/bugzilla/&#62;
+  Options +FollowSymLinks +Indexes +Includes +ExecCGI
+  AllowOverride All
+&#60;/Directory&#62;
+</PRE
+></FONT
 ></TD
 ></TR
 ></TABLE
+>
+
+      </P
+><P
+>The important part above is 
+      <SPAN
+CLASS="QUOTE"
+>"AllowOverride All"</SPAN
+>
+
+      . Without that, the 
+      <TT
+CLASS="filename"
+>.htaccess</TT
+>
+
+      file created by 
+      <TT
+CLASS="filename"
+>checksetup.pl</TT
+>
+
+      will not have sufficient permissions to protect your Bugzilla
+      installation.</P
+><P
+>If you are using Internet Information Server (IIS) or another 
+      web server which does not observe 
+      <TT
+CLASS="filename"
+>.htaccess</TT
+>
+      conventions, you can disable their creation by editing 
+      <TT
+CLASS="filename"
+>localconfig</TT
+>
+      and setting the 
+      <TT
+CLASS="varname"
+>$create_htaccess</TT
+>
+      variable to 
+      <TT
+CLASS="parameter"
+><I
+>0</I
+></TT
+>.
+      </P
 ></DIV
 ><DIV
-CLASS="PROCEDURE"
-><OL
-TYPE="1"
-><LI
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="mod-throttle">4.2.7. <TT
+CLASS="filename"
+>mod_throttle</TT
+>
+
+      and Security</H2
 ><P
->	    Install <A
-HREF="http://www.apache.org/"
+>It is possible for a user, by mistake or on purpose, to access
+      the database many times in a row which can result in very slow access
+      speeds for other users. If your Bugzilla installation is experiencing
+      this problem , you may install the Apache module 
+      <TT
+CLASS="filename"
+>mod_throttle</TT
+>
+
+      which can limit connections by ip-address. You may download this module
+      at 
+      <A
+HREF="http://www.snert.com/Software/Throttle/"
 TARGET="_top"
->Apache Web
-	      Server</A
-> for Windows, and copy the Bugzilla files
-	    somewhere Apache can serve them.  Please follow all the
-	    instructions referenced in <A
-HREF="#INSTALLATION"
->Bugzilla Installation</A
+>&#13;      http://www.snert.com/Software/Throttle/</A
+>. 
+      Follow the instructions to install into your Apache install. 
+      <EM
+>This module only functions with the Apache web
+      server!</EM
 >
-	    regarding your Apache configuration, particularly
-	    instructions regarding the <SPAN
-CLASS="QUOTE"
->"AddHandler"</SPAN
+      You may use the 
+      <B
+CLASS="command"
+>ThrottleClientIP</B
 >
-	    parameter and <SPAN
-CLASS="QUOTE"
->"ExecCGI"</SPAN
->.
-	  </P
+
+      command provided by this module to accomplish this goal. See the 
+      <A
+HREF="http://www.snert.com/Software/Throttle/"
+TARGET="_top"
+>Module
+      Instructions</A
+>
+      for more information.</P
+></DIV
+></DIV
+><DIV
+CLASS="section"
+><HR><H1
+CLASS="section"
+><A
+NAME="win32">4.3. Win32 Installation Notes</H1
+><P
+>This section covers installation on Microsoft Windows. 
+    Bugzilla has been made to work on Win32 platforms, but the Bugzilla team
+    wish to emphasise that The easiest way to install Bugzilla on
+    Intel-archiecture machines
+    is to install some variant of GNU/Linux, then follow the UNIX
+    installation instructions in this Guide. If you have any influence in the
+    platform choice for running this system, please choose GNU/Linux instead
+    of Microsoft Windows.</P
 ><DIV
-CLASS="NOTE"
+CLASS="warning"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="warning"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -6287,27 +4812,181 @@ WIDTH="25"
 ALIGN="CENTER"
 VALIGN="TOP"
 ><IMG
-SRC="../images/note.gif"
+SRC="../images/warning.gif"
+HSPACE="5"
+ALT="Warning"></TD
+><TD
+ALIGN="LEFT"
+VALIGN="TOP"
+><P
+>After that warning, here's the situation for 2.16
+      and Windows. It doesn't work at all out of the box. 
+      You are almost certainly better off getting
+      the 2.17 version from CVS (after consultation with the Bugzilla Team to
+      make sure you are pulling on a stable day) because we'll be doing a load
+      of work to make the Win32 experience more pleasant than it is now.
+      </P
+></TD
+></TR
+></TABLE
+></DIV
+><P
+>&#13;    If you still want to try this, to have any hope of getting it to work,
+    you'll need to apply the 
+    <A
+HREF=""
+TARGET="_top"
+>mail patch</A
+> from 
+    <A
+HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=124174"
+TARGET="_top"
+>bug 124174</A
+>.
+    After that, you'll need to read the (outdated) installation 
+    instructions below, some (probably a lot better) <A
+HREF="http://bugzilla.mozilla.org/attachment.cgi?id=84430&action=view"
+TARGET="_top"
+>more
+     recent ones</A
+> kindly provided by Toms Baugis and Jean-Sebastien 
+     Guay, and also check the 
+     <A
+HREF="http://www.bugzilla.org/releases/2.16/docs/win32.html"
+TARGET="_top"
+>Bugzilla 2.16 Win32 update page
+     </A
+>. If we get time,
+     we'll write some better installation instructions for 2.16 and put
+     them up there. But no promises.
+    </P
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="wininstall">4.3.1. Win32 Installation: Step-by-step</H2
+><DIV
+CLASS="note"
+><P
+></P
+><TABLE
+CLASS="note"
+WIDTH="100%"
+BORDER="0"
+><TR
+><TD
+WIDTH="25"
+ALIGN="CENTER"
+VALIGN="TOP"
+><IMG
+SRC="../images/note.gif"
 HSPACE="5"
 ALT="Note"></TD
 ><TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	      You may also use Internet Information Server or Personal
-	      Web Server for this purpose.  However, setup is quite
-	      different.  If ActivePerl doesn't seem to handle your
-	      file associations correctly (for .cgi and .pl files),
-	      please consult <A
-HREF="#FAQ"
+>You should be familiar with, and cross-reference, the rest of
+        the 
+        <A
+HREF="#installation"
+>Bugzilla Installation</A
+>
+
+        section while performing your Win32 installation.</P
+><P
+>Making Bugzilla work on Microsoft Windows is no picnic. Support
+        for Win32 has improved dramatically in the last few releases, but, if
+        you choose to proceed, you should be a 
+        <EM
+>very</EM
+>
+
+        skilled Windows Systems Administrator with strong troubleshooting
+        abilities, a high tolerance for pain, and moderate perl skills.
+        Bugzilla on NT requires hacking source code and implementing some
+        advanced utilities. What follows is the recommended installation
+        procedure for Win32; additional suggestions are provided in 
+        <A
+HREF="#faq"
 >Appendix A</A
->.
-	    </P
+>
+
+        .</P
+></TD
+></TR
+></TABLE
+></DIV
+><DIV
+CLASS="procedure"
+><OL
+TYPE="1"
+><LI
+><P
+>Install 
+          <A
+HREF="http://www.apache.org/"
+TARGET="_top"
+>Apache Web Server</A
+>
+
+          for Windows, and copy the Bugzilla files somewhere Apache can serve
+          them. Please follow all the instructions referenced in 
+          <A
+HREF="#installation"
+>Bugzilla Installation</A
+>
+
+          regarding your Apache configuration, particularly instructions
+          regarding the 
+          <SPAN
+CLASS="QUOTE"
+>"AddHandler"</SPAN
+>
+
+          parameter and 
+          <SPAN
+CLASS="QUOTE"
+>"ExecCGI"</SPAN
+>
+
+          .</P
+><DIV
+CLASS="note"
+><P
+></P
+><TABLE
+CLASS="note"
+WIDTH="100%"
+BORDER="0"
+><TR
+><TD
+WIDTH="25"
+ALIGN="CENTER"
+VALIGN="TOP"
+><IMG
+SRC="../images/note.gif"
+HSPACE="5"
+ALT="Note"></TD
+><TD
+ALIGN="LEFT"
+VALIGN="TOP"
+><P
+>You may also use Internet Information Server or Personal
+            Web Server for this purpose. However, setup is quite different.
+            If ActivePerl doesn't seem to handle your file associations
+            correctly (for .cgi and .pl files), please consult 
+            <A
+HREF="#faq"
+>Appendix A</A
+>
+
+            .</P
 ><P
->	      If you are going to use IIS, if on Windows NT you must
-	      be updated to at least Service Pack 4.  Windows 2000
-	      ships with a sufficient version of IIS.
-	    </P
+>If you are going to use IIS, if on Windows NT you must be
+            updated to at least Service Pack 4. Windows 2000 ships with a
+            sufficient version of IIS.</P
 ></TD
 ></TR
 ></TABLE
@@ -6315,44 +4994,60 @@ HREF="#FAQ"
 ></LI
 ><LI
 ><P
->	    Install <A
+>Install 
+          <A
 HREF="http://www.activestate.com/"
 TARGET="_top"
 >ActivePerl</A
-> for Windows.  Check <A
+>
+
+          for Windows. Check 
+          <A
 HREF="http://aspn.activestate.com/ASPN/Downloads/ActivePerl/"
 TARGET="_top"
->http://aspn.activestate.com/ASPN/Downloads/ActivePerl</A
-> for a current compiled binary.
-	  </P
+>&#13;          http://aspn.activestate.com/ASPN/Downloads/ActivePerl</A
+>
+
+          for a current compiled binary.</P
 ><P
->	    Please also check the following links to fully understand the status
-	    of ActivePerl on Win32:
-	    <A
+>Please also check the following links to fully understand the
+          status of ActivePerl on Win32: 
+          <A
 HREF="http://language.perl.com/newdocs/pod/perlport.html"
 TARGET="_top"
->	      Perl Porting</A
->, and
-	    <A
+>&#13;          Perl Porting</A
+>
+
+          , and 
+          <A
 HREF="http://ftp.univie.ac.at/packages/perl/ports/nt/FAQ/perlwin32faq5.html"
 TARGET="_top"
->	      Perl on Win32 FAQ</A
+>&#13;          Perl on Win32 FAQ</A
 >
-	  </P
+          </P
 ></LI
 ><LI
 ><P
->	    Use ppm from your perl\bin directory to install the following packs: DBI,
-	    DBD-Mysql, TimeDate, Chart, Date-Calc, Date-Manip, and GD.  You may need
-	    to extract them from .zip format using Winzip or other unzip program first.
-	    These additional ppm modules can be downloaded from ActiveState.
-	  </P
+>Use ppm from your perl\bin directory to install the following
+          packs: DBI, DBD-Mysql, TimeDate, Chart, Date-Calc, Date-Manip, GD,
+          AppConfig, and Template. You may need to extract them from .zip
+          format using Winzip or other unzip program first. Most of these
+          additional ppm modules can be downloaded from ActiveState, but
+          AppConfig and Template should be obtained from OpenInteract using 
+          <A
+HREF="http://openinteract.sourceforge.net/"
+TARGET="_top"
+>the
+          instructions on the Template Toolkit web site</A
+>
+
+          .</P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -6368,73 +5063,134 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	      You can find a list of modules at
-	      <A
+>You can find a list of modules at 
+            <A
 HREF="http://www.activestate.com/PPMPackages/zips/5xx-builds-only"
 TARGET="_top"
->		http://www.activestate.com/PPMPackages/zips/5xx-builds-only/</A
+>&#13;            http://www.activestate.com/PPMPackages/zips/5xx-builds-only/</A
 >
-	    </P
+
+            or 
+            <A
+HREF="http://www.activestate.com/PPMPackages/5.6plus"
+TARGET="_top"
+>&#13;            http://www.activestate.com/PPMPackages/5.6plus</A
+>
+            </P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ><P
->	    The syntax for ppm is:
-	    <TT
-CLASS="COMPUTEROUTPUT"
->	      <TT
-CLASS="PROMPT"
->C:&#62; </TT
-><B
-CLASS="COMMAND"
+>The syntax for ppm is: 
+          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
+>C:&#62;</TT
+>
+
+            <B
+CLASS="command"
 >ppm &#60;modulename&#62;</B
 >
-	    </TT
+          </TT
 >
-	  </P
+          </P
 ><DIV
-CLASS="EXAMPLE"
+CLASS="example"
 ><A
-NAME="AEN1038"
-></A
-><P
+NAME="AEN989"><P
 ><B
->Example 3-3. Installing ActivePerl ppd Modules on Microsoft Windows</B
+>Example 4-1. Installing ActivePerl ppd Modules on Microsoft
+            Windows</B
 ></P
 ><P
-><TT
-CLASS="PROMPT"
+>&#13;              <TT
+CLASS="prompt"
 >C:&#62;</TT
-><B
-CLASS="COMMAND"
->ppm
-		<TT
-CLASS="OPTION"
+>
+
+              <B
+CLASS="command"
+>ppm 
+              <TT
+CLASS="option"
 >DBD-Mysql</TT
-></B
-></P
+>
+              </B
+>
+            </P
 ><P
 >Watch your capitalization!</P
 ></DIV
 ><P
->	    You can find ActiveState ppm modules at
-	    <A
-HREF="http://www.activestate.com/PPMPackages/5.6plus/"
+>ActiveState's 5.6Plus directory also contains an AppConfig
+          ppm, so you might see the following error when trying to install
+          the version at OpenInteract:</P
+><P
+>&#13;            <TT
+CLASS="computeroutput"
+>Error installing package 'AppConfig': Read a PPD
+            for 'AppConfig', but it is not intended for this build of Perl
+            (MSWin32-x86-multi-thread)</TT
+>
+          </P
+><P
+>If so, download both 
+          <A
+HREF="http://openinteract.sourceforge.net/ppmpackages/AppConfig.tar.gz"
 TARGET="_top"
->	      http://www.activestate.com/PPMPackages/5.6plus</A
+>&#13;          the tarball</A
 >
-	  </P
+
+          and 
+          <A
+HREF="http://openinteract.sourceforge.net/ppmpackages/AppConfig.ppd"
+TARGET="_top"
+>&#13;          the ppd</A
+>
+
+          directly from OpenInteract, then run ppm from within the same
+          directory to which you downloaded those files and install the
+          package by referencing the ppd file explicitly via in the install
+          command, f.e.: 
+          <DIV
+CLASS="example"
+><A
+NAME="AEN1002"><P
+><B
+>Example 4-2. Installing OpenInteract ppd Modules manually on Microsoft
+            Windows</B
+></P
+><P
+>&#13;              <TT
+CLASS="computeroutput"
+>&#13;                <B
+CLASS="command"
+>install 
+                <TT
+CLASS="filename"
+>C:\AppConfig.ppd</TT
+>
+                </B
+>
+              </TT
+>
+            </P
+></DIV
+>
+          </P
 ></LI
 ><LI
 ><P
->	    Install MySQL for NT.
-	    <DIV
-CLASS="NOTE"
+>Install MySQL for NT. 
+          <DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -6450,193 +5206,211 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->		You can download MySQL for Windows NT from <A
+>You can download MySQL for Windows NT from 
+            <A
 HREF="http://www.mysql.com/"
 TARGET="_top"
 >MySQL.com</A
->.  Some find it helpful to use the WinMySqlAdmin utility, included with the download, to set up the database.
-	      </P
+>
+
+            . Some find it helpful to use the WinMySqlAdmin utility, included
+            with the download, to set up the database.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 >
-	  </P
+          </P
 ></LI
 ><LI
 ><P
->	    Setup MySQL
-	  </P
+>Setup MySQL</P
 ><OL
 CLASS="SUBSTEPS"
 TYPE="a"
 ><LI
 ><P
->		<TT
-CLASS="COMPUTEROUTPUT"
->		  <TT
-CLASS="PROMPT"
->C:&#62; </TT
+>&#13;                <TT
+CLASS="computeroutput"
+>&#13;                  <TT
+CLASS="prompt"
+>C:&#62;</TT
 >
-		  <B
-CLASS="COMMAND"
+
+                  <B
+CLASS="command"
 >C:\mysql\bin\mysql -u root mysql</B
 >
-		</TT
+                </TT
 >
-	      </P
+              </P
 ></LI
 ><LI
 ><P
->		<TT
-CLASS="COMPUTEROUTPUT"
->		  <TT
-CLASS="PROMPT"
+>&#13;                <TT
+CLASS="computeroutput"
+>&#13;                  <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-		  <B
-CLASS="COMMAND"
->DELETE FROM user WHERE Host='localhost' AND User='';</B
+
+                  <B
+CLASS="command"
+>DELETE FROM user WHERE Host='localhost' AND
+                  User='';</B
 >
-		</TT
+                </TT
 >
-	      </P
+              </P
 ></LI
 ><LI
 ><P
->		<TT
-CLASS="COMPUTEROUTPUT"
->		  <TT
-CLASS="PROMPT"
+>&#13;                <TT
+CLASS="computeroutput"
+>&#13;                  <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-		  <B
-CLASS="COMMAND"
+
+                  <B
+CLASS="command"
 >UPDATE user SET Password=PASSWORD ('new_password')
-		    WHERE user='root';</B
+                  WHERE user='root';</B
 >
-		</TT
+                </TT
 >
-	      </P
+              </P
 ><P
-><SPAN
+>&#13;              <SPAN
 CLASS="QUOTE"
 >"new_password"</SPAN
->, above, indicates
-		whatever password you wish to use for your
-		<SPAN
+>
+
+              , above, indicates whatever password you wish to use for your 
+              <SPAN
 CLASS="QUOTE"
 >"root"</SPAN
-> user.</P
+>
+
+              user.</P
 ></LI
 ><LI
 ><A
-NAME="NTBUGS-PASSWORD"
+NAME="ntbugs-password"
 ></A
 ><P
->		<TT
-CLASS="COMPUTEROUTPUT"
->		  <TT
-CLASS="PROMPT"
+>&#13;                <TT
+CLASS="computeroutput"
+>&#13;                  <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-		  <B
-CLASS="COMMAND"
->GRANT SELECT, INSERT, UPDATE, DELETE,
-		    INDEX, ALTER, CREATE, DROP, REFERENCES
-		    ON bugs.* to bugs@localhost
-		    IDENTIFIED BY 'bugs_password';</B
+
+                  <B
+CLASS="command"
+>GRANT SELECT, INSERT, UPDATE, DELETE, INDEX,
+                  ALTER, CREATE, DROP, REFERENCES ON bugs.* to bugs@localhost
+                  IDENTIFIED BY 'bugs_password';</B
 >
-		</TT
+                </TT
 >
-	      </P
+              </P
 ><P
-><SPAN
+>&#13;              <SPAN
 CLASS="QUOTE"
 >"bugs_password"</SPAN
->, above, indicates
-		whatever password you wish to use for your
-		<SPAN
+>
+
+              , above, indicates whatever password you wish to use for your 
+              <SPAN
 CLASS="QUOTE"
 >"bugs"</SPAN
-> user.</P
+>
+
+              user.</P
 ></LI
 ><LI
 ><P
->		<TT
-CLASS="COMPUTEROUTPUT"
->		  <TT
-CLASS="PROMPT"
+>&#13;                <TT
+CLASS="computeroutput"
+>&#13;                  <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-		  <B
-CLASS="COMMAND"
+
+                  <B
+CLASS="command"
 >FLUSH PRIVILEGES;</B
 >
-		</TT
+                </TT
 >
-	      </P
+              </P
 ></LI
 ><LI
 ><P
->		<TT
-CLASS="COMPUTEROUTPUT"
->		  <TT
-CLASS="PROMPT"
+>&#13;                <TT
+CLASS="computeroutput"
+>&#13;                  <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-		  <B
-CLASS="COMMAND"
+
+                  <B
+CLASS="command"
 >create database bugs;</B
 >
-		</TT
+                </TT
 >
-	      </P
+              </P
 ></LI
 ><LI
 ><P
->		<TT
-CLASS="COMPUTEROUTPUT"
->		  <TT
-CLASS="PROMPT"
+>&#13;                <TT
+CLASS="computeroutput"
+>&#13;                  <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-		  <B
-CLASS="COMMAND"
+
+                  <B
+CLASS="command"
 >exit;</B
 >
-		</TT
+                </TT
 >
-	      </P
+              </P
 ></LI
 ><LI
 ><P
->		<TT
-CLASS="COMPUTEROUTPUT"
->		  <TT
-CLASS="PROMPT"
+>&#13;                <TT
+CLASS="computeroutput"
+>&#13;                  <TT
+CLASS="prompt"
 >C:&#62;</TT
 >
-		  <B
-CLASS="COMMAND"
->C:\mysql\bin\mysqladmin -u root -p reload</B
+
+                  <B
+CLASS="command"
+>C:\mysql\bin\mysqladmin -u root -p
+                  reload</B
 >
-		</TT
+                </TT
 >
-	      </P
+              </P
 ></LI
 ></OL
 ></LI
 ><LI
 ><P
->	    Edit <TT
-CLASS="FILENAME"
+>Edit 
+          <TT
+CLASS="filename"
 >checksetup.pl</TT
-> in your Bugzilla directory.  Change
-	    this line:
-	  </P
+>
+
+          in your Bugzilla directory. Change this line:</P
 ><P
->	    <TABLE
+>&#13;            <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -6645,20 +5419,19 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->my $webservergid = getgrnam($my_webservergroup);
-	    </PRE
+CLASS="programlisting"
+>my $webservergid =
+            getgrnam($my_webservergroup);</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-	  </P
+          </P
 ><P
->	    to
-	  </P
+>to</P
 ><P
->	    <TABLE
+>&#13;          <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -6667,16 +5440,17 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->my $webservergid = $my_webservergroup;
-	    </PRE
+CLASS="programlisting"
+>my $webservergid =
+          $my_webservergroup;</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-or the name of the group you wish to own the files explicitly:
-	    <TABLE
+
+          or the name of the group you wish to own the files explicitly: 
+          <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -6685,53 +5459,71 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->my $webservergid = 'Administrators'
-	    </PRE
+CLASS="programlisting"
+>my $webservergid =
+          'Administrators'</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-	  </P
+          </P
 ></LI
 ><LI
 ><P
->	    Run <TT
-CLASS="FILENAME"
+>Run 
+          <TT
+CLASS="filename"
 >checksetup.pl</TT
-> from the Bugzilla directory.
-	  </P
+>
+
+          from the Bugzilla directory.</P
 ></LI
 ><LI
 ><P
->Edit <TT
-CLASS="FILENAME"
+>Edit 
+          <TT
+CLASS="filename"
 >localconfig</TT
-> to suit your
-	    requirements.  Set <TT
-CLASS="VARNAME"
+>
+
+          to suit your requirements. Set 
+          <TT
+CLASS="varname"
 >$db_pass</TT
-> to your
-	    <SPAN
+>
+
+          to your 
+          <SPAN
 CLASS="QUOTE"
 >"bugs_password"</SPAN
-> from <A
-HREF="#NTBUGS-PASSWORD"
+>
+
+          from 
+          <A
+HREF="#ntbugs-password"
 >step 5.d</A
->, and <TT
-CLASS="VARNAME"
+>
+
+          , and 
+          <TT
+CLASS="varname"
 >$webservergroup</TT
-> to <SPAN
+>
+
+          to 
+          <SPAN
 CLASS="QUOTE"
 >"8"</SPAN
->.</P
+>
+
+          .</P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -6747,15 +5539,19 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->Not sure on the <SPAN
+>Not sure on the 
+            <SPAN
 CLASS="QUOTE"
 >"8"</SPAN
-> for
-	      <TT
-CLASS="VARNAME"
+>
+
+            for 
+            <TT
+CLASS="varname"
 >$webservergroup</TT
-> above.  If it's
-	      wrong, please send corrections.</P
+>
+
+            above. If it's wrong, please send corrections.</P
 ></TD
 ></TR
 ></TABLE
@@ -6763,27 +5559,30 @@ CLASS="VARNAME"
 ></LI
 ><LI
 ><P
->	    Edit <TT
-CLASS="FILENAME"
+>Edit 
+          <TT
+CLASS="filename"
 >defparams.pl</TT
-> to suit your
-	    requirements.  Particularly, set
-	    <TT
-CLASS="VARNAME"
+>
+
+          to suit your requirements. Particularly, set 
+          <TT
+CLASS="varname"
 >DefParam("maintainer")</TT
-> and
-	    <TT
-CLASS="VARNAME"
->DefParam("urlbase") to match your
-	      install.</TT
 >
-	  </P
+
+          and 
+          <TT
+CLASS="varname"
+>DefParam("urlbase") to match your install.</TT
+>
+          </P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -6800,9 +5599,9 @@ ALIGN="LEFT"
 VALIGN="TOP"
 ><P
 >This is yet another step I'm not sure of, since the
-	      maintainer of this documentation does not maintain
-	      Bugzilla on NT.  If you can confirm or deny that this
-	      step is required, please let me know.</P
+            maintainer of this documentation does not maintain Bugzilla on
+            NT. If you can confirm or deny that this step is required, please
+            let me know.</P
 ></TD
 ></TR
 ></TABLE
@@ -6810,11 +5609,11 @@ VALIGN="TOP"
 ></LI
 ><LI
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -6830,46 +5629,58 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	      There are several alternatives to Sendmail that will work on Win32.
-	      The one mentioned here is a <EM
+>There are several alternatives to Sendmail that will work
+            on Win32. The one mentioned here is a 
+            <EM
 >suggestion</EM
->, not
-	      a requirement.  Some other mail packages that can work include
-	      <A
+>
+
+            , not a requirement. Some other mail packages that can work
+            include 
+            <A
 HREF="http://www.blat.net/"
 TARGET="_top"
 >BLAT</A
->,
-	      <A
+>
+
+            , 
+            <A
 HREF="http://www.geocel.com/windmail/"
 TARGET="_top"
 >Windmail</A
->,
-	      <A
+>
+
+            , 
+            <A
 HREF="http://www.dynamicstate.com/"
 TARGET="_top"
->Mercury Sendmail</A
->,
-	      and the CPAN Net::SMTP Perl module (available in .ppm).
-	      Every option requires some hacking of the Perl scripts for Bugzilla
-	      to make it work.  The option here simply requires the least.
-	    </P
+>Mercury
+            Sendmail</A
+>
+
+            , and the CPAN Net::SMTP Perl module (available in .ppm). Every
+            option requires some hacking of the Perl scripts for Bugzilla to
+            make it work. The option here simply requires the least.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ><DIV
-CLASS="PROCEDURE"
+CLASS="procedure"
 ><OL
 TYPE="1"
 ><LI
 ><P
->		Download NTsendmail, available from<A
+>Download NTsendmail, available from
+              <A
 HREF="http://www.ntsendmail.com/"
 TARGET="_top"
-> www.ntsendmail.com</A
->. You must have a "real" mail server which allows you to relay off it in your $ENV{"NTsendmail"} (which you should probably place in globals.pl)
-	      </P
+>&#13;              www.ntsendmail.com</A
+>
+
+              . You must have a "real" mail server which allows you to relay
+              off it in your $ENV{"NTsendmail"} (which you should probably
+              place in globals.pl)</P
 ></LI
 ><LI
 ><P
@@ -6887,23 +5698,22 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
-># these settings configure the NTsendmail process
-use NTsendmail;
-$ENV{"NTsendmail"}="your.smtpserver.box";
-$ENV{"NTsendmail_debug"}=1;
-$ENV{"NTsendmail_max_tries"}=5;
-	      </PRE
+CLASS="programlisting"
+># these settings configure the NTsendmail
+              process use NTsendmail;
+              $ENV{"NTsendmail"}="your.smtpserver.box";
+              $ENV{"NTsendmail_debug"}=1;
+              $ENV{"NTsendmail_max_tries"}=5;</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -6919,28 +5729,34 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->		  Some mention to also edit
-		  <TT
-CLASS="VARNAME"
+>Some mention to also edit 
+                <TT
+CLASS="varname"
 >$db_pass</TT
-> in
-		  <TT
-CLASS="FILENAME"
+>
+
+                in 
+                <TT
+CLASS="filename"
 >globals.pl</TT
-> to be your
-		  <SPAN
+>
+
+                to be your 
+                <SPAN
 CLASS="QUOTE"
 >"bugs_password"</SPAN
->.  Although this may get
-		  you around some problem authenticating to your
-		  database, since globals.pl is not normally
-		  restricted by <TT
-CLASS="FILENAME"
+>
+
+                . Although this may get you around some problem
+                authenticating to your database, since globals.pl is not
+                normally restricted by 
+                <TT
+CLASS="filename"
 >.htaccess</TT
->, your
-		  database password is exposed to whoever uses your
-		  web server.
-		</P
+>
+
+                , your database password is exposed to whoever uses your web
+                server.</P
 ></TD
 ></TR
 ></TABLE
@@ -6948,16 +5764,19 @@ CLASS="FILENAME"
 ></LI
 ><LI
 ><P
->		Find and comment out all occurences of
-		<SPAN
+>Find and comment out all occurences of 
+              <SPAN
 CLASS="QUOTE"
->"<B
-CLASS="COMMAND"
+>"
+                <B
+CLASS="command"
 >open(SENDMAIL</B
->"</SPAN
-> in
-		your Bugzilla directory.  Then replace them with:
-		<TABLE
+>
+              "</SPAN
+>
+
+              in your Bugzilla directory. Then replace them with: 
+              <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -6966,26 +5785,23 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
-># new sendmail functionality
-my $mail=new NTsendmail;
-my $from="bugzilla\@your.machine.name.tld";
-my $to=$login;
-my $subject=$urlbase;
-$mail-&#62;send($from,$to,$subject,$msg);
-		</PRE
+CLASS="programlisting"
+># new sendmail functionality my $mail=new
+              NTsendmail; my $from="bugzilla\@your.machine.name.tld"; my
+              $to=$login; my $subject=$urlbase;
+              $mail-&#62;send($from,$to,$subject,$msg);</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-	      </P
+              </P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -7001,13 +5817,14 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->		  Some have found success using the commercial product, 
-		  <SPAN
-CLASS="PRODUCTNAME"
+>Some have found success using the commercial product, 
+                <SPAN
+CLASS="productname"
 >Windmail</SPAN
->.
-		  You could try replacing your sendmail calls with:
-		  <TABLE
+>
+
+                . You could try replacing your sendmail calls with: 
+                <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -7016,16 +5833,17 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->open SENDMAIL, "|\"C:/General/Web/tools/Windmail 4.0 Beta/windmail\" -t &#62; mail.log";
-		  </PRE
+CLASS="programlisting"
+>open SENDMAIL,
+                "|\"C:/General/Web/tools/Windmail 4.0 Beta/windmail\" -t &#62;
+                mail.log";</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-		or something to that effect.
-		</P
+
+                or something to that effect.</P
 ></TD
 ></TR
 ></TABLE
@@ -7036,30 +5854,37 @@ CLASS="PROGRAMLISTING"
 ></LI
 ><LI
 ><P
->	    Change all references in all files from
-	    <TT
-CLASS="FILENAME"
+>Change all references in all files from 
+          <TT
+CLASS="filename"
 >processmail</TT
-> to
-	    <TT
-CLASS="FILENAME"
+>
+
+          to 
+          <TT
+CLASS="filename"
 >processmail.pl</TT
->, and
-	    rename <TT
-CLASS="FILENAME"
+>
+
+          , and rename 
+          <TT
+CLASS="filename"
 >processmail</TT
-> to
-	    <TT
-CLASS="FILENAME"
+>
+
+          to 
+          <TT
+CLASS="filename"
 >processmail.pl</TT
->.
-	  </P
+>
+
+          .</P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -7075,20 +5900,19 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	      Many think this may be a change we want to make for
-	      main-tree Bugzilla.  It's painless for the UNIX folks,
-	      and will make the Win32 people happier.
-	    </P
+>Many think this may be a change we want to make for
+            main-tree Bugzilla. It's painless for the UNIX folks, and will
+            make the Win32 people happier.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -7104,8 +5928,10 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	      Some people have suggested using the Net::SMTP Perl module instead of NTsendmail or the other options listed here.  You can change processmail.pl to make this work.
-	    <TABLE
+>Some people have suggested using the Net::SMTP Perl module
+            instead of NTsendmail or the other options listed here. You can
+            change processmail.pl to make this work. 
+            <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -7114,8 +5940,10 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->&#13;my $smtp = Net::SMTP-&#62;new('&#60;Name of your SMTP server&#62;');   #connect to SMTP server
+CLASS="programlisting"
+>&#13;
+
+my $smtp = Net::SMTP-&#62;new('&#60;Name of your SMTP server&#62;');   #connect to SMTP server
 $smtp-&#62;mail('&#60;your name&#62;@&#60;you smpt server&#62;');# use the sender's adress here
 $smtp-&#62;to($tolist); # recipient's address
 $smtp-&#62;data();  # Start the mail
@@ -7123,14 +5951,18 @@ $smtp-&#62;datasend($msg);
 $smtp-&#62;dataend();   # Finish sending the mail
 $smtp-&#62;quit;    # Close the SMTP connection
 $logstr = "$logstr; mail sent to $tolist $cclist";
-}&#13;</PRE
+}
+
+
+            </PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-here is a test mail program for Net::SMTP:
-<TABLE
+
+            here is a test mail program for Net::SMTP: 
+            <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -7139,8 +5971,10 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->&#13;use Net::SMTP;
+CLASS="programlisting"
+>&#13;
+
+use Net::SMTP;
  my $smtp = Net::SMTP-&#62;new('&#60;Name of your SMTP server', Timeout =&#62; 30, Debug
 =&#62; 1, ); # connect to SMTP server
                  $smtp-&#62;auth;
@@ -7152,13 +5986,16 @@ recipient's address
                 $smtp-&#62;datasend('test');
                 $smtp-&#62;dataend();   # Finish sending the mail
                 $smtp-&#62;quit;    # Close the SMTP connection
-exit;&#13;</PRE
+exit;
+
+
+            </PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-	    </P
+            </P
 ></TD
 ></TR
 ></TABLE
@@ -7166,11 +6003,11 @@ exit;&#13;</PRE
 ></LI
 ><LI
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -7186,67 +6023,58 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	      This step is optional if you are using IIS or another
-	      web server which only decides on an interpreter based
-	      upon the file extension (.pl), rather than the
-	      <SPAN
+>This step is optional if you are using IIS or another web
+            server which only decides on an interpreter based upon the file
+            extension (.pl), rather than the 
+            <SPAN
 CLASS="QUOTE"
 >"shebang"</SPAN
-> line (#/usr/bonsaitools/bin/perl)
-	    </P
+>
+
+            line (#/usr/bonsaitools/bin/perl)</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ><P
->	    Modify the path to perl on the first line (#!) of all
-	    files to point to your Perl installation, and add
-	    <SPAN
+>Modify the path to perl on the first line (#!) of all files
+          to point to your Perl installation, and add 
+          <SPAN
 CLASS="QUOTE"
 >"perl"</SPAN
-> to the beginning of all Perl system
-	    calls that use a perl script as an argument.  This may
-	    take you a while. There is a <SPAN
+>
+
+          to the beginning of all Perl system calls that use a perl script as
+          an argument. This may take you a while. There is a 
+          <SPAN
 CLASS="QUOTE"
 >"setperl.csh"</SPAN
 >
-	    utility to speed part of this procedure, available in the
-	    <A
-HREF="#PATCHES"
+
+          utility to speed part of this procedure, available in the 
+          <A
+HREF="#patches"
 >Useful Patches and Utilities for Bugzilla</A
-> section of The Bugzilla Guide.
-	    However, it requires the Cygwin GNU-compatible environment
-	    for Win32 be set up in order to work.  See <A
+>
+
+          section of The Bugzilla Guide. However, it requires the Cygwin
+          GNU-compatible environment for Win32 be set up in order to work.
+          See 
+          <A
 HREF="http://www.cygwin.com/"
 TARGET="_top"
 >http://www.cygwin.com/</A
-> for details on obtaining Cygwin.
-	  </P
+>
+
+          for details on obtaining Cygwin.</P
 ></LI
 ><LI
 ><P
->	    Modify the invocation of all system() calls in all perl
-	    scripts in your Bugzilla directory.  For instance, change
-	    this line in processmail: 
-	    <TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
-> 
-system ("./processmail.pl",@ARGLIST); 
-	    </PRE
-></FONT
-></TD
-></TR
-></TABLE
-> to
-	    <TABLE
+>Modify the invocation of all system() calls in all perl
+          scripts in your Bugzilla directory. You should specify the full
+          path to perl for each system() call. For instance, change this line
+          in processmail: 
+          <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -7255,47 +6083,62 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
-> 
-system ("perl processmail.pl",@ARGLIST);
-	    </PRE
+CLASS="programlisting"
+>&#13; 
+system ("./processmail",@ARGLIST); 
+        &#60;/programlisting&#62; to
+        &#60;programlisting&#62; 
+system ("C:\\perl\\bin\\perl", "processmail", @ARGLIST);
+
+          </PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-	  </P
+          </P
 ></LI
 ><LI
 ><P
->            Add <TT
-CLASS="FUNCTION"
+>Add 
+          <TT
+CLASS="function"
 >binmode()</TT
-> calls so attachments
-	    will work (<A
+>
+
+          calls so attachments will work (
+          <A
 HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=62000"
 TARGET="_top"
->bug 62000</A
->).
-          </P
+>bug
+          62000</A
+>
+
+          ).</P
 ><P
->            Because Microsoft Windows based systems handle binary
-	    files different than Unix based systems, you need to add
-	    the following lines to
-	    <TT
-CLASS="FILENAME"
+>Because Microsoft Windows based systems handle binary files
+          different than Unix based systems, you need to add the following
+          lines to 
+          <TT
+CLASS="filename"
 >createattachment.cgi</TT
->  and
-	    <TT
-CLASS="FILENAME"
+>
+
+          and 
+          <TT
+CLASS="filename"
 >showattachment.cgi</TT
-> before the
-	    <TT
-CLASS="FUNCTION"
+>
+
+          before the 
+          <TT
+CLASS="function"
 >require 'CGI.pl';</TT
-> line.</P
+>
+
+          line.</P
 ><P
-><TABLE
+>&#13;            <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -7304,9 +6147,12 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->binmode(STDIN);
-binmode(STDOUT);</PRE
+CLASS="programlisting"
+>&#13;
+binmode(STDIN);
+binmode(STDOUT);
+
+            </PRE
 ></FONT
 ></TD
 ></TR
@@ -7314,11 +6160,11 @@ binmode(STDOUT);</PRE
 >
           </P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -7334,21 +6180,35 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->              According to <A
+>According to 
+            <A
 HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=62000"
 TARGET="_top"
->bug 62000</A
->, the perl documentation says that you should always use <TT
-CLASS="FUNCTION"
+>&#13;            bug 62000</A
+>
+
+            , the perl documentation says that you should always use 
+            <TT
+CLASS="function"
 >binmode()</TT
-> when dealing with binary files, but never when dealing with text files.  That seems to suggest that rather than aribtrarily putting <TT
-CLASS="FUNCTION"
+>
+
+            when dealing with binary files, but never when dealing with text
+            files. That seems to suggest that rather than arbitrarily putting
+            
+            <TT
+CLASS="function"
 >binmode()</TT
-> at the begining of the attachment files, there should be logic to determine if <TT
-CLASS="FUNCTION"
+>
+
+            at the beginning of the attachment files, there should be logic
+            to determine if 
+            <TT
+CLASS="function"
 >binmode()</TT
-> is needed or not.
-            </P
+>
+
+            is needed or not.</P
 ></TD
 ></TR
 ></TABLE
@@ -7357,11 +6217,11 @@ CLASS="FUNCTION"
 ></OL
 ></DIV
 ><DIV
-CLASS="TIP"
+CLASS="tip"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
+CLASS="tip"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -7377,13 +6237,12 @@ ALT="Tip"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  If you are using IIS or Personal Web Server, you must add cgi
-	  relationships to Properties -&#62; Home directory (tab) -&#62;
-	  Application Settings (section) -&#62; Configuration (button),
-	  such as: 
-	</P
+>If you are using IIS or Personal Web Server, you must add cgi
+        relationships to Properties -&#62; Home directory (tab) -&#62;
+        Application Settings (section) -&#62; Configuration (button), such
+        as:</P
 ><P
->	  <TABLE
+>&#13;        <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -7392,39 +6251,34 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
-> 
-.cgi to: &#60;perl install directory&#62;\perl.exe %s %s
-.pl to: &#60;perl install directory&#62;\perl.exe %s %s
-GET,HEAD,POST
-	  </PRE
+CLASS="programlisting"
+>.cgi to: &#60;perl install directory&#62;\perl.exe %s
+        %s .pl to: &#60;perl install directory&#62;\perl.exe %s %s
+        GET,HEAD,POST</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
-> 
-	  Change the path to Perl to match your
-	  install, of course.
-	</P
+>
+
+        Change the path to Perl to match your install, of course.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="ADDLWINTIPS"
->3.6.2. Additional Windows Tips</A
-></H2
+NAME="addlwintips">4.3.2. Additional Windows Tips</H2
 ><DIV
-CLASS="TIP"
+CLASS="tip"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
+CLASS="tip"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -7440,27 +6294,25 @@ ALT="Tip"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  From Andrew Pearson:
-	  <A
-NAME="AEN1212"
-></A
-><BLOCKQUOTE
+>From Andrew Pearson: 
+        <A
+NAME="AEN1172"><BLOCKQUOTE
 CLASS="BLOCKQUOTE"
 ><P
->	      You can make Bugzilla work with Personal Web Server for
-	      Windows 98 and higher, as well as for IIS 4.0.
-	      Microsoft has information available at <A
-HREF="            http://support.microsoft.com/support/kb/articles/Q231/9/98.ASP"
+>You can make Bugzilla work with Personal Web Server for
+          Windows 98 and higher, as well as for IIS 4.0. Microsoft has
+          information available at 
+          <A
+HREF=" http://support.microsoft.com/support/kb/articles/Q231/9/98.ASP"
 TARGET="_top"
-> http://support.microsoft.com/support/kb/articles/Q231/9/98.ASP</A
+>&#13;          http://support.microsoft.com/support/kb/articles/Q231/9/98.ASP</A
 >
-	    </P
+          </P
 ><P
->	      Basically you need to add two String Keys in the
-	      registry at the following location:
-	    </P
+>Basically you need to add two String Keys in the registry at
+          the following location:</P
 ><P
->	      <TABLE
+>&#13;            <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -7469,40 +6321,38 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\ScriptMap
-	      </PRE
+CLASS="programlisting"
+>&#13;            HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\ScriptMap</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-	    </P
+          </P
 ><P
->	      The keys should be called ".pl" and ".cgi", and both
-	      should have a value something like:
-	      <B
-CLASS="COMMAND"
+>The keys should be called ".pl" and ".cgi", and both should
+          have a value something like: 
+          <B
+CLASS="command"
 >c:/perl/bin/perl.exe "%s" "%s"</B
 >
-	    </P
+          </P
 ><P
->	      The KB article only talks about .pl, but it goes into
-	      more detail and provides a perl test script.
-	    </P
+>The KB article only talks about .pl, but it goes into more
+          detail and provides a perl test script.</P
 ></BLOCKQUOTE
 >
-	</P
+        </P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ><DIV
-CLASS="TIP"
+CLASS="tip"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
+CLASS="tip"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -7518,26 +6368,25 @@ ALT="Tip"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  If attempting to run Bugzilla 2.12 or older, you will need
-	  to remove encrypt() calls from the Perl source. This is
-	  <EM
+>If attempting to run Bugzilla 2.12 or older, you will need to
+        remove encrypt() calls from the Perl source. This is 
+        <EM
 >not necessary</EM
-> for Bugzilla 2.13 and
-	  later, which includes the current release, Bugzilla
-	  2.14.
-	  <DIV
-CLASS="EXAMPLE"
+>
+
+        for Bugzilla 2.13 and later, which includes the current release,
+        Bugzilla &#38;bz-ver;. 
+        <DIV
+CLASS="example"
 ><A
-NAME="AEN1224"
-></A
-><P
+NAME="AEN1184"><P
 ><B
->Example 3-4. Removing encrypt() for Windows NT Bugzilla version
-	      2.12 or earlier</B
+>Example 4-3. Removing encrypt() for Windows NT Bugzilla version 2.12 or
+          earlier</B
 ></P
 ><P
->	      Replace this:   
-	      <TABLE
+>Replace this: 
+          <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -7546,18 +6395,18 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->  
-SendSQL("SELECT encrypt(" . SqlQuote($enteredpwd) . ", " . SQLQuote(substr($realcryptpwd, 0, 2)) . ")");
-my $enteredcryptpwd = FetchOneColumn();
-	      </PRE
+CLASS="programlisting"
+>SendSQL("SELECT encrypt(" . SqlQuote($enteredpwd) .
+          ", " . SQLQuote(substr($realcryptpwd, 0, 2)) . ")"); my
+          $enteredcryptpwd = FetchOneColumn();</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
-> 
-with this:   
-	      <TABLE
+>
+
+          with this: 
+          <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -7566,377 +6415,455 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->  
-my $enteredcryptpwd = $enteredpwd   
-	      </PRE
+CLASS="programlisting"
+>my $enteredcryptpwd = $enteredpwd</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
-> 
-	      in cgi.pl.
-	    </P
+>
+
+          in cgi.pl.</P
 ></DIV
 >
-	</P
+        </P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ></DIV
-><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
-><A
-NAME="BZLDAP"
->3.6.3. Bugzilla LDAP Integration</A
-></H2
-><P
->	What follows is some late-breaking information on using the
-	LDAP authentication options with Bugzilla.  The author has not
-	tested these (nor even formatted this section!) so please
-	contribute feedback to the newsgroup.
-      </P
-><P
-CLASS="LITERALLAYOUT"
->Mozilla::LDAP&nbsp;module<br>
-<br>
-The&nbsp;Mozilla::LDAP&nbsp;module&nbsp;allows&nbsp;you&nbsp;to&nbsp;use&nbsp;LDAP&nbsp;for&nbsp;authentication&nbsp;to<br>
-the&nbsp;Bugzilla&nbsp;system.&nbsp;&nbsp;This&nbsp;module&nbsp;is&nbsp;not&nbsp;required&nbsp;if&nbsp;you&nbsp;are&nbsp;not&nbsp;using<br>
-LDAP.<br>
-<br>
-Mozilla::LDAP&nbsp;(aka&nbsp;PerLDAP)&nbsp;is&nbsp;available&nbsp;for&nbsp;download&nbsp;from<br>
-http://www.mozilla.org/directory.<br>
-<br>
-NOTE:&nbsp;The&nbsp;Mozilla::LDAP&nbsp;module&nbsp;requires&nbsp;Netscape's&nbsp;Directory&nbsp;SDK.<br>
-Follow&nbsp;the&nbsp;link&nbsp;for&nbsp;"Directory&nbsp;SDK&nbsp;for&nbsp;C"&nbsp;on&nbsp;that&nbsp;same&nbsp;page&nbsp;to<br>
-download&nbsp;the&nbsp;SDK&nbsp;first.&nbsp;&nbsp;After&nbsp;you&nbsp;have&nbsp;installed&nbsp;this&nbsp;SDK,&nbsp;then<br>
-install&nbsp;the&nbsp;PerLDAP&nbsp;module.<br>
-----------------------------------------------------------------------<br>
-<br>
-Post-Installation&nbsp;Checklist<br>
-----------------------------------------------------------------------<br>
-Set&nbsp;useLDAP&nbsp;to&nbsp;"On"&nbsp;**only**&nbsp;if&nbsp;you&nbsp;will&nbsp;be&nbsp;using&nbsp;an&nbsp;LDAP&nbsp;directory<br>
-for&nbsp;authentication.&nbsp;&nbsp;Be&nbsp;very&nbsp;careful&nbsp;when&nbsp;setting&nbsp;up&nbsp;this&nbsp;parameter;<br>
-if&nbsp;you&nbsp;set&nbsp;LDAP&nbsp;authentication,&nbsp;but&nbsp;do&nbsp;not&nbsp;have&nbsp;a&nbsp;valid&nbsp;LDAP&nbsp;directory<br>
-set&nbsp;up,&nbsp;you&nbsp;will&nbsp;not&nbsp;be&nbsp;able&nbsp;to&nbsp;log&nbsp;back&nbsp;in&nbsp;to&nbsp;Bugzilla&nbsp;once&nbsp;you&nbsp;log<br>
-out.&nbsp;&nbsp;(If&nbsp;this&nbsp;happens,&nbsp;you&nbsp;can&nbsp;get&nbsp;back&nbsp;in&nbsp;by&nbsp;manually&nbsp;editing&nbsp;the<br>
-data/params&nbsp;file,&nbsp;and&nbsp;setting&nbsp;useLDAP&nbsp;back&nbsp;to&nbsp;0.)<br>
-<br>
-If&nbsp;using&nbsp;LDAP,&nbsp;you&nbsp;must&nbsp;set&nbsp;the&nbsp;three&nbsp;additional&nbsp;parameters:<br>
-<br>
-Set&nbsp;LDAPserver&nbsp;to&nbsp;the&nbsp;name&nbsp;(and&nbsp;optionally&nbsp;port)&nbsp;of&nbsp;your&nbsp;LDAP&nbsp;server.<br>
-If&nbsp;no&nbsp;port&nbsp;is&nbsp;specified,&nbsp;it&nbsp;defaults&nbsp;to&nbsp;the&nbsp;default&nbsp;port&nbsp;of&nbsp;389.&nbsp;&nbsp;(e.g<br>
-"ldap.mycompany.com"&nbsp;or&nbsp;"ldap.mycompany.com:1234")<br>
-<br>
-Set&nbsp;LDAPBaseDN&nbsp;to&nbsp;the&nbsp;base&nbsp;DN&nbsp;for&nbsp;searching&nbsp;for&nbsp;users&nbsp;in&nbsp;your&nbsp;LDAP<br>
-directory.&nbsp;&nbsp;(e.g.&nbsp;"ou=People,o=MyCompany")&nbsp;&nbsp;uids&nbsp;must&nbsp;be&nbsp;unique&nbsp;under<br>
-the&nbsp;DN&nbsp;specified&nbsp;here.<br>
-<br>
-Set&nbsp;LDAPmailattribute&nbsp;to&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;attribute&nbsp;in&nbsp;your&nbsp;LDAP<br>
-directory&nbsp;which&nbsp;contains&nbsp;the&nbsp;primary&nbsp;email&nbsp;address.&nbsp;&nbsp;On&nbsp;most&nbsp;directory<br>
-servers&nbsp;available,&nbsp;this&nbsp;is&nbsp;"mail",&nbsp;but&nbsp;you&nbsp;may&nbsp;need&nbsp;to&nbsp;change&nbsp;this.<br>
-----------------------------------------------------------------------<br>
-<br>
-(Not&nbsp;sure&nbsp;where&nbsp;this&nbsp;bit&nbsp;should&nbsp;go,&nbsp;but&nbsp;it's&nbsp;important&nbsp;that&nbsp;it&nbsp;be&nbsp;in<br>
-there&nbsp;somewhere...)<br>
-----------------------------------------------------------------------<br>
-Using&nbsp;LDAP&nbsp;authentication&nbsp;for&nbsp;Bugzilla:<br>
-<br>
-The&nbsp;existing&nbsp;authentication&nbsp;scheme&nbsp;for&nbsp;Bugzilla&nbsp;uses&nbsp;email&nbsp;addresses<br>
-as&nbsp;the&nbsp;primary&nbsp;user&nbsp;ID,&nbsp;and&nbsp;a&nbsp;password&nbsp;to&nbsp;authenticate&nbsp;that&nbsp;user.&nbsp;&nbsp;All<br>
-places&nbsp;within&nbsp;Bugzilla&nbsp;where&nbsp;you&nbsp;need&nbsp;to&nbsp;deal&nbsp;with&nbsp;user&nbsp;ID&nbsp;(e.g<br>
-assigning&nbsp;a&nbsp;bug)&nbsp;use&nbsp;the&nbsp;email&nbsp;address.<br>
-<br>
-The&nbsp;LDAP&nbsp;authentication&nbsp;builds&nbsp;on&nbsp;top&nbsp;of&nbsp;this&nbsp;scheme,&nbsp;rather&nbsp;than<br>
-replacing&nbsp;it.&nbsp;&nbsp;The&nbsp;initial&nbsp;log&nbsp;in&nbsp;is&nbsp;done&nbsp;with&nbsp;a&nbsp;username&nbsp;and&nbsp;password<br>
-for&nbsp;the&nbsp;LDAP&nbsp;directory.&nbsp;&nbsp;This&nbsp;then&nbsp;fetches&nbsp;the&nbsp;email&nbsp;address&nbsp;from&nbsp;LDAP<br>
-and&nbsp;authenticates&nbsp;seamlessly&nbsp;in&nbsp;the&nbsp;standard&nbsp;Bugzilla&nbsp;authentication<br>
-scheme&nbsp;using&nbsp;this&nbsp;email&nbsp;address.&nbsp;&nbsp;If&nbsp;an&nbsp;account&nbsp;for&nbsp;this&nbsp;address<br>
-already&nbsp;exists&nbsp;in&nbsp;your&nbsp;Bugzilla&nbsp;system,&nbsp;it&nbsp;will&nbsp;log&nbsp;in&nbsp;to&nbsp;that<br>
-account.&nbsp;&nbsp;If&nbsp;no&nbsp;account&nbsp;for&nbsp;that&nbsp;email&nbsp;address&nbsp;exists,&nbsp;one&nbsp;is&nbsp;created<br>
-at&nbsp;the&nbsp;time&nbsp;of&nbsp;login.&nbsp;&nbsp;(In&nbsp;this&nbsp;case,&nbsp;Bugzilla&nbsp;will&nbsp;attempt&nbsp;to&nbsp;use&nbsp;the<br>
-"displayName"&nbsp;or&nbsp;"cn"&nbsp;attribute&nbsp;to&nbsp;determine&nbsp;the&nbsp;user's&nbsp;full&nbsp;name.)<br>
-<br>
-After&nbsp;authentication,&nbsp;all&nbsp;other&nbsp;user-related&nbsp;tasks&nbsp;are&nbsp;still&nbsp;handled<br>
-by&nbsp;email&nbsp;address,&nbsp;not&nbsp;LDAP&nbsp;username.&nbsp;&nbsp;You&nbsp;still&nbsp;assign&nbsp;bugs&nbsp;by&nbsp;email<br>
-address,&nbsp;query&nbsp;on&nbsp;users&nbsp;by&nbsp;email&nbsp;address,&nbsp;etc.<br>
-----------------------------------------------------------------------<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P
-></DIV
-></DIV
 ></DIV
 ><DIV
-CLASS="CHAPTER"
-><HR><H1
-><A
-NAME="ADMINISTRATION"
->Chapter 4. Administering Bugzilla</A
-></H1
-><FONT
-COLOR="RED"
->    Or, I just got this cool thing installed.  Now what the heck do I
-    do with it?
-  </FONT
-><P
->    So you followed <SPAN
-CLASS="QUOTE"
->"<A
-HREF="#INSTALLATION"
->Bugzilla Installation</A
->"</SPAN
-> to the
-    letter, and logged into Bugzilla for the very first time with your
-    super-duper god account.  You sit, contentedly staring at the
-    Bugzilla Query Screen, the worst of the whole mad business of
-    installing this terrific program behind you. It seems, though, you
-    have nothing yet to query! Your first act of business should be to
-    setup the operating parameters for Bugzilla so you can get busy
-    getting data into your bug tracker.
-  </P
-><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="POSTINSTALL-CHECK"
->4.1. Post-Installation Checklist</A
-></H1
-><P
->      After installation, follow the checklist below to help ensure
-      that you have a successful installation. If you do not see a
-      recommended setting for a parameter, consider leaving it at the
-      default while you perform your initial tests on your Bugzilla
-      setup.
-    </P
-><DIV
-CLASS="PROCEDURE"
-><OL
-TYPE="1"
-><LI
-><P
->	  Bring up <TT
-CLASS="FILENAME"
->editparams.cgi</TT
-> in your web
-	  browser.  This should be available as the <SPAN
-CLASS="QUOTE"
->"edit
-	    parameters"</SPAN
-> link from any Bugzilla screen once you
-	  have logged in.
-	</P
-></LI
-><LI
-><P
->The <SPAN
-CLASS="QUOTE"
->"maintainer"</SPAN
-> is the email address of
-	  the person responsible for maintaining this Bugzilla
-	  installation.  The maintainer need not be a valid Bugzilla
-	  user.  Error pages, error emails, and administrative mail
-	  will be sent with the maintainer as the return email
-	  address.</P
-><P
->	  Set <SPAN
-CLASS="QUOTE"
->"maintainer"</SPAN
-> to <EM
->your</EM
-> email address.
-	  This allows Bugzilla's error messages to display your email
-	  address and allow people to contact you for help.
-	</P
-></LI
-><LI
+NAME="osx">4.4. Mac OS X Installation Notes</H1
 ><P
->The <SPAN
-CLASS="QUOTE"
->"urlbase"</SPAN
-> parameter defines the fully
-	  qualified domain name and web server path to your Bugzilla
-	  installation.</P
+>There are a lot of common libraries and utilities out there that
+    Apple did not include with Mac OS X, but which run perfectly well on it.
+    The GD library, which Bugzilla needs to do bug graphs, is one of
+    these.</P
 ><P
->	  For example, if your bugzilla query page is
-	  http://www.foo.com/bugzilla/query.cgi, set your
-	  <SPAN
-CLASS="QUOTE"
->"urlbase"</SPAN
-> is http://www.foo.com/bugzilla/.  
-	</P
-></LI
-><LI
+>The easiest way to get a lot of these is with a program called
+    Fink, which is similar in nature to the CPAN installer, but installs
+    common GNU utilities. Fink is available from
+    &#60;http://sourceforge.net/projects/fink/&#62;.</P
 ><P
-><SPAN
-CLASS="QUOTE"
->"usebuggroups"</SPAN
-> dictates whether or not to
-	  implement group-based security for Bugzilla.  If set,
-	  Bugzilla bugs can have an associated groupmask defining
-	  which groups of users are allowed to see and edit the
-	  bug.</P
-><P
->	  Set "usebuggroups" to "on" <EM
->only</EM
-> if you
-	  may wish to restrict access to products. I suggest leaving
-	  this parameter <EM
->off</EM
-> while initially
-	  testing your Bugzilla.  
-	</P
-></LI
-><LI
+>Follow the instructions for setting up Fink. Once it's installed,
+    you'll want to run the following as root: 
+    <B
+CLASS="command"
+>fink install gd</B
+>
+    </P
 ><P
->	  <SPAN
-CLASS="QUOTE"
->"usebuggroupsentry"</SPAN
->, when set to
-	  <SPAN
-CLASS="QUOTE"
->"on"</SPAN
->, requires that all bugs have an associated
-	  groupmask when submitted.  This parameter is made for those
-	  installations where product isolation is a necessity.
-	</P
+>It will prompt you for a number of dependencies, type 'y' and hit
+    enter to install all of the dependencies. Then watch it work.</P
 ><P
->	  Set "usebuggroupsentry" to "on" if you absolutely need to
-	  restrict access to bugs from the moment they are submitted
-	  through resolution. Once again, if you are simply testing
-	  your installation, I suggest against turning this parameter
-	  on; the strict security checking may stop you from being
-	  able to modify your new entries.
-	</P
-></LI
-><LI
+>To prevent creating conflicts with the software that Apple installs
+    by default, Fink creates its own directory tree at /sw where it installs
+    most of the software that it installs. This means your libraries and
+    headers for libgd will be at /sw/lib and /sw/include instead of /usr/lib
+    and /usr/local/include. Because of these changed locations for the
+    libraries, the Perl GD module will not install directly via CPAN, because it
+    looks for the specific paths instead of getting them from your
+    environment. But there's a way around that :-)</P
 ><P
->	  You run into an interesting problem when Bugzilla reaches a
-	  high level of continuous activity.  MySQL supports only
-	  table-level write locking.  What this means is that if
-	  someone needs to make a change to a bug, they will lock the
-	  entire table until the operation is complete.  Locking for
-	  write also blocks reads until the write is complete.  The
-	  <SPAN
+>Instead of typing 
+    <SPAN
 CLASS="QUOTE"
->"shadowdb"</SPAN
-> parameter was designed to get around
-	  this limitation.  While only a single user is allowed to
-	  write to a table at a time, reads can continue unimpeded on
-	  a read-only shadow copy of the database.  Although your
-	  database size will double, a shadow database can cause an
-	  enormous performance improvement when implemented on
-	  extremely high-traffic Bugzilla databases.
-	</P
-><P
->	  Set "shadowdb" to "bug_shadowdb" if you will be running a
-	  *very* large installation of Bugzilla. The shadow database
-	  enables many simultaneous users to read and write to the
-	  database without interfering with one another.  
-	  <DIV
-CLASS="NOTE"
+>"install GD"</SPAN
+>
+    at the 
+    <TT
+CLASS="prompt"
+>cpan&#62;</TT
+>
+    prompt, type 
+    <B
+CLASS="command"
+>look GD</B
+>. 
+    This should go through the motions of downloading the latest version of
+    the GD module, then it will open a shell and drop you into the build
+    directory. Apply <A
+HREF="../sgml/gd-makefile.patch"
+TARGET="_top"
+>this patch</A
+> 
+    to the Makefile.PL file (save the
+    patch into a file and use the command 
+    <B
+CLASS="command"
+>patch &#60; patchfile</B
+>.)
+    </P
 ><P
+>Then, run these commands to finish the installation of the GD
+    module: 
+    <P
 ></P
 ><TABLE
-CLASS="NOTE"
-WIDTH="100%"
 BORDER="0"
+><TBODY
 ><TR
 ><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
+>&#13;        <B
+CLASS="command"
+>perl Makefile.PL</B
+>
+      </TD
+></TR
+><TR
 ><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	      Enabling "shadowdb" can adversely affect the stability
-	      of your installation of Bugzilla. You should regularly
-	      check that your database is in sync.  It is often
-	      advisable to force a shadow database sync nightly via
-	      <SPAN
-CLASS="QUOTE"
->"cron"</SPAN
->.
-	    </P
-></TD
+>&#13;        <B
+CLASS="command"
+>make</B
+>
+      </TD
+></TR
+><TR
+><TD
+>&#13;        <B
+CLASS="command"
+>make test</B
+>
+      </TD
+></TR
+><TR
+><TD
+>&#13;        <B
+CLASS="command"
+>make install</B
+>
+      </TD
+></TR
+><TR
+><TD
+>And don't forget to run 
+      <B
+CLASS="command"
+>exit</B
+>
+
+      to get back to CPAN.</TD
 ></TR
+></TBODY
 ></TABLE
+><P
+></P
+>
+    </P
 ></DIV
-> Once again, in testing you should avoid this option
-	  -- use it if or when you <EM
->need</EM
-> to use
-	  it, and have repeatedly run into the problem it was designed
-	  to solve -- very long wait times while attempting to commit
-	  a change to the database.  Mozilla.org began needing
-	  <SPAN
-CLASS="QUOTE"
->"shadowdb"</SPAN
-> when they reached around 40,000
-	  Bugzilla users with several hundred Bugzilla bug changes and
-	  comments per day.
-        </P
+><DIV
+CLASS="section"
+><HR><H1
+CLASS="section"
+><A
+NAME="troubleshooting">4.5. Troubleshooting</H1
 ><P
->	  If you use the "shadowdb" option, it is only natural that
-	  you should turn the "queryagainstshadowdb" option "On" as
-	  well.  Otherwise you are replicating data into a shadow
-	  database for no reason!
-	</P
-></LI
-><LI
+>This section gives solutions to common Bugzilla installation
+    problems.
+    </P
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="AEN1218">4.5.1. Bundle::Bugzilla makes me upgrade to Perl 5.6.1</H2
 ><P
-><SPAN
-CLASS="QUOTE"
->"headerhtml"</SPAN
->, <SPAN
-CLASS="QUOTE"
->"footerhtml"</SPAN
->,
-	  <SPAN
-CLASS="QUOTE"
->"errorhtml"</SPAN
->, <SPAN
-CLASS="QUOTE"
->"bannerhtml"</SPAN
->, and
-	  <SPAN
-CLASS="QUOTE"
->"blurbhtml"</SPAN
-> are all templates which control
-	  display of headers, footers, errors, banners, and additional
-	  data.  We could go into some detail regarding the usage of
-	  these, but it is really best just to monkey around with them
-	  a bit to see what they do.  I strongly recommend you copy
-	  your <TT
-CLASS="FILENAME"
->data/params</TT
-> file somewhere safe
-	  before playing with these values, though.  If they are
-	  changed dramatically, it may make it impossible for you to
-	  display Bugzilla pages to fix the problem until you have
-	  restored your <TT
-CLASS="FILENAME"
->data/params</TT
-> file.</P
-><P
->	  If you have custom logos or HTML you must put in place to
-	  fit within your site design guidelines, place the code in
-	  the "headerhtml", "footerhtml", "errorhtml", "bannerhtml",
-	  or "blurbhtml" text boxes.
-	  <DIV
-CLASS="NOTE"
+>&#13;      Try executing <B
+CLASS="command"
+>perl -MCPAN -e 'install CPAN'</B
+>
+      and then continuing.
+      </P
 ><P
-></P
+>&#13;      Certain older versions of the CPAN toolset were somewhat naive about how
+      to upgrade Perl modules. When a couple of modules got rolled into the core
+      Perl distribution for 5.6.1, CPAN thought that the best way to get those
+      modules up to date was to haul down the Perl distribution itself and
+      build it. Needless to say, this has caused headaches for just about
+      everybody. Upgrading to a newer version of CPAN with the
+      commandline above should fix things.
+      </P
+></DIV
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="AEN1223">4.5.2. DBD::Sponge::db prepare failed</H2
+><P
+>&#13;        The following error message may appear due to a bug in DBD::mysql
+        (over which the Bugzilla team have no control):
+      </P
 ><TABLE
-CLASS="NOTE"
-WIDTH="100%"
+BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
+><TR
+><TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+> DBD::Sponge::db prepare failed: Cannot determine NUM_OF_FIELDS at D:/Perl/site/lib/DBD/mysql.pm line 248.
+  SV = NULL(0x0) at 0x20fc444
+  REFCNT = 1
+  FLAGS = (PADBUSY,PADMY)
+</PRE
+></FONT
+></TD
+></TR
+></TABLE
+><P
+>&#13;        To fix this, go to 
+        <TT
+CLASS="filename"
+>&#60;path-to-perl&#62;/lib/DBD/sponge.pm</TT
+> 
+        in your Perl installation and replace
+      </P
+><TABLE
+BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
+><TR
+><TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+> my $numFields;
+ if ($attribs-&#62;{'NUM_OF_FIELDS'}) {
+     $numFields = $attribs-&#62;{'NUM_OF_FIELDS'};
+ } elsif ($attribs-&#62;{'NAME'}) {
+     $numFields = @{$attribs-&#62;{NAME}};
+</PRE
+></FONT
+></TD
+></TR
+></TABLE
+><P
+>&#13;        by
+      </P
+><TABLE
+BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
+><TR
+><TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+> my $numFields;
+ if ($attribs-&#62;{'NUM_OF_FIELDS'}) {
+     $numFields = $attribs-&#62;{'NUM_OF_FIELDS'};
+ } elsif ($attribs-&#62;{'NAMES'}) {
+     $numFields = @{$attribs-&#62;{NAMES}};
+</PRE
+></FONT
+></TD
+></TR
+></TABLE
+><P
+>&#13;        (note the S added to NAME.)      
+      </P
+></DIV
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="paranoid-security">4.5.3. cannot chdir(/var/spool/mqueue)</H2
+><P
+>If you are installing Bugzilla on SuSE Linux, or some other
+      distributions with 
+      <SPAN
+CLASS="QUOTE"
+>"paranoid"</SPAN
+>
+      security options, it is possible that the checksetup.pl script may fail
+      with the error: 
+<TABLE
+BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
+><TR
+><TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+>cannot chdir(/var/spool/mqueue): Permission denied
+</PRE
+></FONT
+></TD
+></TR
+></TABLE
+>
+      </P
+><P
+>&#13;      This is because your 
+      <TT
+CLASS="filename"
+>/var/spool/mqueue</TT
+>
+      directory has a mode of 
+      <SPAN
+CLASS="QUOTE"
+>"drwx------"</SPAN
+>. Type 
+      <B
+CLASS="command"
+>chmod 755 
+      <TT
+CLASS="filename"
+>/var/spool/mqueue</TT
+>
+      </B
+>
+      as root to fix this problem.
+      </P
+></DIV
+></DIV
+></DIV
+><DIV
+CLASS="chapter"
+><HR><H1
+><A
+NAME="administration">Chapter 5. Administering Bugzilla</H1
+><DIV
+CLASS="section"
+><H1
+CLASS="section"
+><A
+NAME="parameters">5.1. Bugzilla Configuration</H1
+><P
+>Bugzilla is configured by changing various parameters, accessed
+    from the "Edit parameters" link in the page footer. Here are
+    some of the key parameters on that page. You should run down this
+    list and set them appropriately after installing Bugzilla.</P
+><DIV
+CLASS="procedure"
+><OL
+TYPE="1"
+><LI
+><P
+> 
+        <B
+CLASS="command"
+>maintainer</B
+>:
+        The maintainer parameter is the email address of the person 
+        responsible for maintaining this
+        Bugzilla installation. The address need not be that of a valid Bugzilla
+        account.</P
+></LI
+><LI
+><P
+>&#13;        <B
+CLASS="command"
+>urlbase</B
+>:
+        This parameter defines the fully qualified domain name and web 
+        server path to your Bugzilla installation.</P
+><P
+>For example, if your Bugzilla query page is
+        <TT
+CLASS="filename"
+>http://www.foo.com/bugzilla/query.cgi</TT
+>, 
+        set your <SPAN
+CLASS="QUOTE"
+>"urlbase"</SPAN
+>
+        to <TT
+CLASS="filename"
+>http://www.foo.com/bugzilla/</TT
+>.</P
+></LI
+><LI
+><P
+>&#13;        <B
+CLASS="command"
+>usebuggroups</B
+>:
+        This dictates whether or not to implement group-based security for
+        Bugzilla. If set, Bugzilla bugs can have an associated 'group',
+        defining which users are allowed to see and edit the
+        bug.</P
+><P
+>Set "usebuggroups" to "on" 
+        <EM
+>only</EM
+>
+        if you may wish to restrict access to particular bugs to certain
+        groups of users. I suggest leaving
+        this parameter <EM
+>off</EM
+>
+        while initially testing your Bugzilla.</P
+></LI
+><LI
+><P
+>&#13;        <B
+CLASS="command"
+>usebuggroupsentry</B
+>:
+        Bugzilla Products can have a group associated with them, so that
+        certain users can only see bugs in certain products. When this parameter
+        is set to <SPAN
+CLASS="QUOTE"
+>"on"</SPAN
+>, this places all newly-created bugs in the
+        group for their product immediately.</P
+></LI
+><LI
+><P
+>&#13;        <B
+CLASS="command"
+>shadowdb</B
+>:
+        You run into an interesting problem when Bugzilla reaches a
+        high level of continuous activity. MySQL supports only table-level
+        write locking. What this means is that if someone needs to make a
+        change to a bug, they will lock the entire table until the operation
+        is complete. Locking for write also blocks reads until the write is
+        complete. The 
+        <SPAN
+CLASS="QUOTE"
+>"shadowdb"</SPAN
+>
+        parameter was designed to get around this limitation. While only a
+        single user is allowed to write to a table at a time, reads can
+        continue unimpeded on a read-only shadow copy of the database.
+        Although your database size will double, a shadow database can cause
+        an enormous performance improvement when implemented on extremely
+        high-traffic Bugzilla databases.</P
+><P
+>&#13;        As a guide, mozilla.org began needing 
+        <SPAN
+CLASS="QUOTE"
+>"shadowdb"</SPAN
+>
+        when they reached around 40,000 Bugzilla users with several hundred
+        Bugzilla bug changes and comments per day.</P
+><P
+>The value of the parameter defines the name of the 
+        shadow bug database. 
+        Set "shadowdb" to e.g. "bug_shadowdb" if you will be running a
+        *very* large installation of Bugzilla. 
+        <DIV
+CLASS="note"
+><P
+></P
+><TABLE
+CLASS="note"
+WIDTH="100%"
 BORDER="0"
 ><TR
 ><TD
@@ -7951,116 +6878,115 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	      The "headerhtml" text box is the HTML printed out
-	      <EM
->before</EM
-> any other code on the page,
-	      except the CONTENT-TYPE header sent by the Bugzilla
-	      engine. If you have a special banner, put the code for
-	      it in "bannerhtml". You may want to leave these settings
-	      at the defaults initially.
-	    </P
+>Enabling "shadowdb" can adversely affect the stability of
+          your installation of Bugzilla. You should regularly check that your
+          database is in sync. It is often advisable to force a shadow
+          database sync nightly via 
+          <SPAN
+CLASS="QUOTE"
+>"cron"</SPAN
+>.
+          </P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 >
-	</P
+        </P
+><P
+>If you use the "shadowdb" option, it is only natural that you
+        should turn the "queryagainstshadowdb" option on as well. Otherwise
+        you are replicating data into a shadow database for no reason!</P
 ></LI
 ><LI
 ><P
-><SPAN
-CLASS="QUOTE"
->"passwordmail"</SPAN
-> is rather simple.  Every
-	  time a user creates an account, the text of this parameter
-	  is read as the text to send to the new user along with their
-	  password message.</P
-><P
->	  Add any text you wish to the "passwordmail" parameter box.
-	  For instance, many people choose to use this box to give a
-	  quick training blurb about how to use Bugzilla at your site.
+>&#13;        <B
+CLASS="command"
+>shutdownhtml</B
+>:
+
+        If you need to shut down Bugzilla to perform administration, enter
+        some descriptive HTML here and anyone who tries to use Bugzilla will
+        receive a page to that effect. Obviously, editparams.cgi will
+        still be accessible so you can remove the HTML and re-enable Bugzilla.
+        :-)
         </P
 ></LI
 ><LI
 ><P
-><SPAN
-CLASS="QUOTE"
->"useqacontact"</SPAN
-> allows you to define an
-	  email address for each component, in addition to that of the
-	  default owner, who will be sent carbon copies of incoming
-	  bugs.  The critical difference between a QA Contact and an
-	  Owner is that the QA Contact follows the component.  If you
-	  reassign a bug from component A to component B, the QA
-	  Contact for that bug will change with the reassignment,
-	  regardless of owner.</P
-><P
-><SPAN
-CLASS="QUOTE"
->"usestatuswhiteboard"</SPAN
-> defines whether you
-	  wish to have a free-form, overwritable field associated with
-	  each bug.  The advantage of the Status Whiteboard is that it
-	  can be deleted or modified with ease, and provides an
-	  easily-searchable field for indexing some bugs that have
-	  some trait in common.  Many people will put <SPAN
-CLASS="QUOTE"
->"help
-	    wanted"</SPAN
->, <SPAN
-CLASS="QUOTE"
->"stalled"</SPAN
->, or <SPAN
-CLASS="QUOTE"
->"waiting
-	    on reply from somebody"</SPAN
-> messages into the Status
-	  Whiteboard field so those who peruse the bugs are aware of
-	  their status even more than that which can be indicated by
-	  the Resolution fields.</P
-><P
->	  Do you want to use the QA Contact ("useqacontact") and
-	  status whiteboard ("usestatuswhiteboard") fields? These
-	  fields are useful because they allow for more flexibility,
-	  particularly when you have an existing Quality Assurance
-	  and/or Release Engineering team,  but they may not be needed
-	  for many smaller installations.
-	</P
+>&#13;        <B
+CLASS="command"
+>passwordmail</B
+>:
+
+        Every time a user creates an account, the text of
+        this parameter (with substitutions) is sent to the new user along with
+        their password message.</P
+><P
+>Add any text you wish to the "passwordmail" parameter box. For
+        instance, many people choose to use this box to give a quick training
+        blurb about how to use Bugzilla at your site.</P
 ></LI
 ><LI
 ><P
->	  Set "whinedays" to the amount of days you want to let bugs
-	  go in the "New" or "Reopened" state before notifying people
-	  they have untouched new bugs.  If you do not plan to use
-	  this feature, simply do not set up the whining cron job
-	  described in the installation instructions, or set this
-	  value to "0" (never whine).
-	</P
+>&#13;        <B
+CLASS="command"
+>useqacontact</B
+>:
+
+        This allows you to define an email address for each component, in
+        addition
+        to that of the default owner, who will be sent carbon copies of
+        incoming bugs.</P
 ></LI
 ><LI
 ><P
-><SPAN
-CLASS="QUOTE"
->"commenton"</SPAN
-> fields allow you to dictate
-	  what changes can pass without comment, and which must have a
-	  comment from the person who changed them.  Often,
-	  administrators will allow users to add themselves to the CC
-	  list, accept bugs, or change the Status Whiteboard without
-	  adding a comment as to their reasons for the change, yet
-	  require that most other changes come with an
-	  explanation.</P
-><P
->	  Set the "commenton" options according to your site policy.
-	  It is a wise idea to require comments when users resolve,
-	  reassign, or reopen bugs at the very least.
-	  <DIV
-CLASS="NOTE"
+>&#13;        <B
+CLASS="command"
+>usestatuswhiteboard</B
+>:
+        This defines whether you wish to have a free-form, overwritable field
+        associated with each bug. The advantage of the Status Whiteboard is
+        that it can be deleted or modified with ease, and provides an
+        easily-searchable field for indexing some bugs that have some trait
+        in common.         
+        </P
+></LI
+><LI
+><P
+>&#13;        <B
+CLASS="command"
+>whinedays</B
+>:
+        Set this to the number of days you want to let bugs go
+        in the NEW or REOPENED state before notifying people they have
+        untouched new bugs. If you do not plan to use this feature, simply do
+        not set up the whining cron job described in the installation
+        instructions, or set this value to "0" (never whine).</P
+></LI
+><LI
+><P
+>&#13;        <B
+CLASS="command"
+>commenton*</B
+>:
+        All these
+        fields allow you to dictate what changes can pass without comment,
+        and which must have a comment from the person who changed them.
+        Often, administrators will allow users to add themselves to the CC
+        list, accept bugs, or change the Status Whiteboard without adding a
+        comment as to their reasons for the change, yet require that most
+        other changes come with an explanation.</P
+><P
+>Set the "commenton" options according to your site policy. It
+        is a wise idea to require comments when users resolve, reassign, or
+        reopen bugs at the very least. 
+        <DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -8076,93 +7002,64 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	      It is generally far better to require a developer
-	      comment when resolving bugs than not. Few things are
-	      more annoying to bug database users than having a
-	      developer mark a bug "fixed" without any comment as to
-	      what the fix was (or even that it was truly fixed!)
-	    </P
+>It is generally far better to require a developer comment
+          when resolving bugs than not. Few things are more annoying to bug
+          database users than having a developer mark a bug "fixed" without
+          any comment as to what the fix was (or even that it was truly
+          fixed!)</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 >
-	</P
+        </P
 ></LI
 ><LI
 ><P
->The <SPAN
-CLASS="QUOTE"
->"supportwatchers"</SPAN
-> option can be an
-	  exceptionally powerful tool in the hands of a power Bugzilla
-	  user.  By enabling this option, you allow users to receive
-	  email updates whenever other users receive email updates.
-	  This is, of course, subject to the groupset restrictions on
-	  the bug; if the <SPAN
+>&#13;        <B
+CLASS="command"
+>supportwatchers</B
+>:
+
+        Turning on this option allows users to ask to receive copies of 
+        all a particular other user's bug email. This is, of
+        course, subject to the groupset restrictions on the bug; if the 
+        <SPAN
 CLASS="QUOTE"
 >"watcher"</SPAN
-> would not normally be
-	  allowed to view a bug, the watcher cannot get around the
-	  system by setting herself up to watch the bugs of someone
-	  with bugs outside her priveleges.  She would still only
-	  receive email updates for those bugs she could normally
-	  view.</P
-><P
->For Bugzilla sites which require strong inter-Product
-	  security to prevent snooping, watchers are not a good
-	  idea.</P
-><P
->	  However, for most sites you should set
-	  <SPAN
-CLASS="QUOTE"
->"supportwatchers"</SPAN
-> to "On".  This feature is
-	  helpful for team leads to monitor progress in their
-	  respective areas, and can offer many other benefits, such as
-	  allowing a developer to pick up a former engineer's bugs
-	  without requiring her to change all the information in the
-	  bug.
-	</P
+>
+        would not normally be allowed to view a bug, the watcher cannot get
+        around the system by setting herself up to watch the bugs of someone
+        with bugs outside her privileges. They would still only receive email
+        updates for those bugs she could normally view.</P
 ></LI
 ></OL
 ></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="USERADMIN"
->4.2. User Administration</A
-></H1
-><P
->      User administration is one of the easiest parts of Bugzilla.
-      Keeping it from getting out of hand, however, can become a
-      challenge.
-    </P
+NAME="useradmin">5.2. User Administration</H1
 ><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
+CLASS="section"
+><H2
+CLASS="section"
 ><A
-NAME="DEFAULTUSER"
->4.2.1. Creating the Default User</A
-></H2
+NAME="defaultuser">5.2.1. Creating the Default User</H2
 ><P
->	When you first run checksetup.pl after installing Bugzilla, it
-	will prompt you for the administrative username (email
-	address) and password for this "super user". If for some
-	reason you were to delete the "super user" account, re-running
-	checksetup.pl will again prompt you for this username and
-	password.
-      </P
+>When you first run checksetup.pl after installing Bugzilla, it
+      will prompt you for the administrative username (email address) and
+      password for this "super user". If for some reason you delete
+      the "super user" account, re-running checksetup.pl will again prompt
+      you for this username and password.</P
 ><DIV
-CLASS="TIP"
+CLASS="tip"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
+CLASS="tip"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -8178,126 +7075,103 @@ ALT="Tip"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->       If you wish to add more administrative users, you must use the
-	  MySQL interface. Run "mysql" from the command line, and use
-	  these commands ("mysql&#62;" denotes the  mysql prompt, not
-	  something you should type in):
-	  <B
-CLASS="COMMAND"
-><TT
-CLASS="PROMPT"
+>If you wish to add more administrative users, you must use the
+        MySQL interface. Run "mysql" from the command line, and use these
+        commands: 
+        <P
+></P
+><TABLE
+BORDER="0"
+><TBODY
+><TR
+><TD
+>&#13;            <TT
+CLASS="prompt"
 >mysql&#62;</TT
-> use bugs;</B
 >
-	  <B
-CLASS="COMMAND"
-><TT
-CLASS="PROMPT"
+            <B
+CLASS="command"
+>use bugs;</B
+>
+          </TD
+></TR
+><TR
+><TD
+>&#13;            <TT
+CLASS="prompt"
 >mysql&#62;</TT
-> update profiles set
-	    groupset=0x7ffffffffffffff where login_name = "(user's
-	    login name)"; </B
 >
-	</P
+
+            <B
+CLASS="command"
+>&#13;              update profiles set groupset=0x7ffffffffffffff where login_name =
+              "(user's login name)";
+            </B
+>
+          </TD
+></TR
+></TBODY
+></TABLE
+><P
+></P
+>
+        </P
 ><P
->Yes, that is <EM
+>Yes, that is 
+        <EM
 >fourteen</EM
 >
-	  <SPAN
+
+        <SPAN
 CLASS="QUOTE"
 >"f"</SPAN
->'s.  A whole lot of f-ing going on if you
-	  want to create a new administator.</P
+>
+
+        's. A whole lot of f-ing going on if you want to create a new
+        administator.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="MANAGEUSERS"
->4.2.2. Managing Other Users</A
-></H2
+NAME="manageusers">5.2.2. Managing Other Users</H2
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H3
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="LOGIN"
->4.2.2.1. Logging In</A
-></H3
-><P
-></P
-><OL
-TYPE="1"
-><LI
-><P
->	      Open the index.html page for your Bugzilla installation
-	      in your browser window.
-	    </P
-></LI
-><LI
-><P
->	      Click the "Query Existing Bug Reports" link.
-	    </P
-></LI
-><LI
+NAME="createnewusers">5.2.2.1. Creating new users</H3
 ><P
->	      Click the "Log In" link at the foot of the page.
-	    </P
-></LI
-><LI
-><P
->	      Type your email address, and the password which was
-	      emailed to you when you created your Bugzilla account,
-	      into the spaces provided.
-	    </P
-></LI
-></OL
-><P
->Congratulations, you are logged in!</P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H3
-CLASS="SECTION"
-><A
-NAME="CREATENEWUSERS"
->4.2.2.2. Creating new users</A
-></H3
-><P
->	  Your users can create their own user accounts by clicking
-	  the "New Account" link at the bottom of each page. However,
-	  should you desire to create user accounts ahead of time,
-	  here is how you do it.
-	</P
+>Your users can create their own user accounts by clicking the
+        "New Account" link at the bottom of each page (assuming they
+        aren't logged in as someone else already.) However, should you
+        desire to create user accounts ahead of time, here is how you do
+        it.</P
 ><P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->	      After logging in, click the "Users" link at the footer
-	      of the query page.
-	    </P
+>After logging in, click the "Users" link at the footer of
+            the query page, and then click "Add a new user".</P
 ></LI
 ><LI
 ><P
->	      To see a specific user, type a portion of their login
-	      name in the box provided and click "submit". To see all
-	      users, simply click the "submit" button. You must click
-	      "submit" here to be able to add a new user.
-	    </P
+>Fill out the form presented. This page is self-explanatory.
+            When done, click "Submit".</P
 ><DIV
-CLASS="TIP"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
-WIDTH="90%"
+CLASS="note"
+WIDTH="100%"
 BORDER="0"
 ><TR
 ><TD
@@ -8305,110 +7179,115 @@ WIDTH="25"
 ALIGN="CENTER"
 VALIGN="TOP"
 ><IMG
-SRC="../images/tip.gif"
+SRC="../images/note.gif"
 HSPACE="5"
-ALT="Tip"></TD
+ALT="Note"></TD
 ><TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->		More functionality is available via the list on the
-		right-hand side of the text entry box. You can match
-		what you type as a case-insensitive substring (the
-		default) of all users on your system, a case-sensitive
-		regular expression (please see the <B
-CLASS="COMMAND"
->man
-		  regexp</B
-> manual page for details on regular
-		expression syntax), or a <EM
->reverse</EM
+>Adding a user this way will 
+              <EM
+>not</EM
 >
-		regular expression match, where every user name which
-		does NOT match the regular expression is selected.
-	      </P
+
+              send an email informing them of their username and password.
+              While useful for creating dummy accounts (watchers which
+              shuttle mail to another system, for instance, or email
+              addresses which are a mailing list), in general it is
+              preferable to log out and use the 
+              <SPAN
+CLASS="QUOTE"
+>"New Account"</SPAN
+>
+
+              button to create users, as it will pre-populate all the
+              required fields and also notify the user of her account name
+              and password.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ></LI
-><LI
+></OL
+></DIV
+><DIV
+CLASS="section"
+><HR><H3
+CLASS="section"
+><A
+NAME="modifyusers">5.2.2.2. Modifying Users</H3
 ><P
->	      Click the "Add New User" link at the bottom of the user
-	      list
-	    </P
-></LI
-><LI
+>To see a specific user, search for their login name
+        in the box provided on the "Edit Users" page. To see all users, 
+        leave the box blank.</P
 ><P
->	      Fill out the form presented.  This page is
-	      self-explanatory.  When done, click "submit".
-	    </P
-><DIV
-CLASS="NOTE"
+>You can search in different ways the listbox to the right
+        of the text entry box. You can match by 
+        case-insensitive substring (the default),
+        regular expression, or a 
+        <EM
+>reverse</EM
+>
+        regular expression match, which finds every user name which does NOT
+        match the regular expression. (Please see
+        the <B
+CLASS="command"
+>man regexp</B
+>
+        manual page for details on regular expression syntax.)
+        </P
+><P
+>Once you have found your user, you can change the following
+        fields:</P
 ><P
 ></P
-><TABLE
-CLASS="NOTE"
-WIDTH="90%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
+><UL
+><LI
 ><P
->		Adding a user this way will <EM
->not</EM
->
-		send an email informing them of their username and
-		password. While useful for creating dummy accounts
-		(watchers which shuttle mail to another system, for
-		instance, or email addresses which are a mailing
-		list), in general it is preferable to log out and use
-		the <SPAN
-CLASS="QUOTE"
->"New Account"</SPAN
-> button to create users,
-		as it will pre-populate all the required fields and
-		also notify  the user of her account name and
-		password.
-	      </P
-></TD
-></TR
-></TABLE
-></DIV
+>&#13;            <EM
+>Login Name</EM
+>: 
+            This is generally the user's full email address. However, if you
+            have are using the emailsuffix Param, this may just be the user's
+            login name. Note that users can now change their login names
+            themselves (to any valid email address.)
+            </P
 ></LI
-></OL
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H3
-CLASS="SECTION"
-><A
-NAME="DISABLEUSERS"
->4.2.2.3. Disabling Users</A
-></H3
-><P
->	  I bet you noticed that big "Disabled Text" entry box
-	  available from the "Add New User" screen, when you edit an
-	  account? By entering any text in this box and selecting
-	  "submit", you have prevented the user from using Bugzilla
-	  via the web interface. Your explanation, written in this
-	  text box, will be presented to the user the next time she
-	  attempts to use the system.
-	  <DIV
-CLASS="WARNING"
+><LI
+><P
+>&#13;            <EM
+>Real Name</EM
+>: The user's real name. Note that
+            Bugzilla does not require this to create an account.</P
+></LI
+><LI
+><P
+>&#13;            <EM
+>Password</EM
+>: 
+            You can change the user's password here. Users can automatically
+            request a new password, so you shouldn't need to do this often.
+            If you want to disable an account, see Disable Text below.
+            </P
+></LI
+><LI
+><P
+>&#13;            <EM
+>Disable Text</EM
+>: 
+            If you type anything in this box, including just a space, the
+            user is prevented from logging in, or making any changes to 
+            bugs via the web interface. 
+            The HTML you type in this box is presented to the user when
+            they attempt to perform these actions, and should explain
+            why the account was disabled.
+            <DIV
+CLASS="warning"
 ><P
 ></P
 ><TABLE
-CLASS="WARNING"
+CLASS="warning"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -8424,55 +7303,20 @@ ALT="Warning"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	      Don't disable your own administrative account, or you
-	      will hate life!
-	    </P
-><P
->At this time, <SPAN
-CLASS="QUOTE"
->"Disabled Text"</SPAN
-> does not
-	      prevent a user from using the email interface.  If you
-	      have the email interface enabled, they can still
-	      continue to submit bugs and comments that way.  We need
-	      a patch to fix this.</P
+>Don't disable the administrator account!</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 >
-	</P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H3
-CLASS="SECTION"
-><A
-NAME="MODIFYUSERS"
->4.2.2.4. Modifying Users</A
-></H3
-><P
->	  Here I will attempt to describe the function of each option
-	  on the Edit User screen.
-	</P
-><P
-></P
-><UL
-><LI
-><P
->	      <EM
->Login Name</EM
->: This is generally the
-	      user's email address. However, if you have edited your
-	      system parameters, this may just be the user's login
-	      name or some other identifier.
-	      <DIV
-CLASS="TIP"
+
+            <DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
-WIDTH="90%"
+CLASS="note"
+WIDTH="100%"
 BORDER="0"
 ><TR
 ><TD
@@ -8480,150 +7324,286 @@ WIDTH="25"
 ALIGN="CENTER"
 VALIGN="TOP"
 ><IMG
-SRC="../images/tip.gif"
+SRC="../images/note.gif"
 HSPACE="5"
-ALT="Tip"></TD
+ALT="Note"></TD
 ><TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->		  For compatability reasons, you should probably stick
-		  with email addresses as user login names.  It will
-		  make your life easier.
-		</P
+>The user can still submit bugs via
+              the e-mail gateway, if you set it up, even if the disabled text
+              field is filled in. The e-mail gateway should 
+              <EM
+>not</EM
+>
+              be enabled for secure installations of Bugzilla.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 >
-	    </P
+            </P
 ></LI
 ><LI
 ><P
->	      <EM
->Real Name</EM
->: Duh!
-	    </P
+>&#13;            <EM
+>&#60;groupname&#62;</EM
+>: 
+            If you have created some groups, e.g. "securitysensitive", then
+            checkboxes will appear here to allow you to add users to, or
+            remove them from, these groups.
+            </P
 ></LI
 ><LI
 ><P
->	      <EM
->Password</EM
->:  You can change the user
-	      password here.  It is normal to only see asterisks.
-	    </P
+>&#13;            <EM
+>canconfirm</EM
+>: 
+            This field is only used if you have enabled the "unconfirmed"
+            status. If you enable this for a user,
+            that user can then move bugs from "Unconfirmed" to a "Confirmed"
+            status (e.g.: "New" status).</P
+></LI
+><LI
+><P
+>&#13;            <EM
+>creategroups</EM
+>: 
+            This option will allow a user to create and destroy groups in
+            Bugzilla.</P
+></LI
+><LI
+><P
+>&#13;            <EM
+>editbugs</EM
+>: 
+            Unless a user has this bit set, they can only edit those bugs
+            for which they are the assignee or the reporter. Even if this
+            option is unchecked, users can still add comments to bugs.
+            </P
+></LI
+><LI
+><P
+>&#13;            <EM
+>editcomponents</EM
+>: 
+            This flag allows a user to create new products and components,
+            as well as modify and destroy those that have no bugs associated
+            with them. If a product or component has bugs associated with it,
+            those bugs must be moved to a different product or component
+            before Bugzilla will allow them to be destroyed.
+            </P
+></LI
+><LI
+><P
+>&#13;            <EM
+>editkeywords</EM
+>: 
+            If you use Bugzilla's keyword functionality, enabling this
+            feature allows a user to create and destroy keywords. As always,
+            the keywords for existing bugs containing the keyword the user
+            wishes to destroy must be changed before Bugzilla will allow it
+            to die.</P
+></LI
+><LI
+><P
+>&#13;            <EM
+>editusers</EM
+>: 
+            This flag allows a user to do what you're doing right now: edit
+            other users. This will allow those with the right to do so to
+            remove administrator privileges from other users or grant them to
+            themselves. Enable with care.</P
 ></LI
 ><LI
 ><P
->	      <EM
->Email Notification</EM
->: You may choose
-	      from one of three options:
-	      <P
+>&#13;            <EM
+>tweakparams</EM
+>: 
+            This flag allows a user to change Bugzilla's Params 
+            (using <TT
+CLASS="filename"
+>editparams.cgi</TT
+>.)</P
+></LI
+><LI
+><P
+>&#13;            <EM
+>&#60;productname&#62;</EM
+>: 
+            This allows an administrator to specify the products in which 
+            a user can see bugs. The user must still have the 
+            "editbugs" privilege to edit bugs in these products.</P
+></LI
+></UL
+></DIV
+></DIV
+></DIV
+><DIV
+CLASS="section"
+><HR><H1
+CLASS="section"
+><A
+NAME="programadmin">5.3. Product, Component, Milestone, and Version Administration</H1
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="products">5.3.1. Products</H2
+><P
+>&#13;      <A
+HREF="#gloss-product"
+><I
+CLASS="glossterm"
+>&#13;      Products</I
+></A
+>
+
+      are the broadest category in Bugzilla, and tend to represent real-world
+      shipping products. E.g. if your company makes computer games, 
+      you should have one product per game, perhaps a "Common" product for 
+      units of technology used in multiple games, and maybe a few special
+       products (Website, Administration...)</P
+><P
+>Many of Bugzilla's settings are configurable on a per-product
+      basis. The number of "votes" available to users is set per-product, 
+      as is the number of votes
+      required to move a bug automatically from the UNCONFIRMED status to the
+      NEW status.</P
+><P
+>To create a new product:</P
+><P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->		    All qualifying bugs except those which I change:
-		    The user will be notified of any change to any bug
-		    for which she is the reporter, assignee, QA
-		    Contact, CC recipient, or "watcher".
-		  </P
+>Select "products" from the footer</P
 ></LI
 ><LI
 ><P
->		    Only those bugs which I am listed on the CC line:
-		    The user will not be notified of changes to bugs
-		    where she is the assignee, reporter, or QA
-		    Contact, but will receive them if she is on the CC
-		    list.
-		    <DIV
-CLASS="NOTE"
+>Select the "Add" link in the bottom right</P
+></LI
+><LI
 ><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="90%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
+>Enter the name of the product and a description. The
+          Description field may contain HTML.</P
+></LI
+></OL
 ><P
->			She will still receive whining cron emails if
-			you set up the "whinemail" feature.
-		      </P
-></TD
-></TR
-></TABLE
+>Don't worry about the "Closed for bug entry", "Maximum Votes
+      per person", "Maximum votes a person can put on a single bug",
+      "Number of votes a bug in this Product needs to automatically get out
+      of the UNCOMFIRMED state", and "Version" options yet. We'll cover
+      those in a few moments.
+      </P
 ></DIV
->
-		  </P
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="components">5.3.2. Components</H2
+><P
+>Components are subsections of a Product. E.g. the computer game 
+      you are designing may have a "UI"
+      component, an "API" component, a "Sound System" component, and a
+      "Plugins" component, each overseen by a different programmer. It
+      often makes sense to divide Components in Bugzilla according to the
+      natural divisions of responsibility within your Product or
+      company.</P
+><P
+>&#13;      Each component has a owner and (if you turned it on in the parameters),
+      a QA Contact. The owner should be the primary person who fixes bugs in
+      that component. The QA Contact should be the person who will ensure
+      these bugs are completely fixed. The Owner, QA Contact, and Reporter
+      will get email when new bugs are created in this Component and when
+      these bugs change. Default Owner and Default QA Contact fields only
+      dictate the 
+      <EM
+>default assignments</EM
+>; 
+      these can be changed on bug submission, or at any later point in
+      a bug's life.</P
+><P
+>To create a new Component:</P
+><P
+></P
+><OL
+TYPE="1"
+><LI
+><P
+>Select the "Edit components" link from the "Edit product"
+          page</P
+></LI
+><LI
+><P
+>Select the "Add" link in the bottom right.</P
 ></LI
 ><LI
 ><P
->		    <EM
->All Qualifying Bugs</EM
->: This
-		    user is a glutton for punishment. If her name is
-		    in the reporter, QA Contact, CC, assignee, or is a
-		    "watcher", she will get email updates regarding
-		    the bug.
-		  </P
+>Fill out the "Component" field, a short "Description", 
+          the "Initial Owner" and "Initial QA Contact" (if enabled.) 
+          The Component and Description fields may contain HTML; 
+          the "Initial Owner" field must be a login name
+          already existing in the database. 
+          </P
 ></LI
 ></OL
-></P
+></DIV
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="versions">5.3.3. Versions</H2
 ><P
->	      <EM
->Disable Text</EM
->: If you type anything
-	      in this box, including just a space, the user account is
-	      disabled from making any changes to bugs via the web
-	      interface, and what you type in this box is presented as
-	      the reason.
-	      <DIV
-CLASS="WARNING"
+>Versions are the revisions of the product, such as "Flinders
+      3.1", "Flinders 95", and "Flinders 2000". Version is not a multi-select
+      field; the usual practice is to select the most recent version with
+      the bug.
+      </P
+><P
+>To create and edit Versions:</P
 ><P
 ></P
-><TABLE
-CLASS="WARNING"
-WIDTH="90%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/warning.gif"
-HSPACE="5"
-ALT="Warning"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
+><OL
+TYPE="1"
+><LI
 ><P
->Don't disable the administrator account!</P
-></TD
-></TR
-></TABLE
+>From the "Edit product" screen, select "Edit Versions"</P
+></LI
+><LI
+><P
+>You will notice that the product already has the default
+          version "undefined". Click the "Add" link in the bottom right.</P
+></LI
+><LI
+><P
+>Enter the name of the Version. This field takes text only. 
+          Then click the "Add" button.</P
+></LI
+></OL
 ></DIV
->
-	      <DIV
-CLASS="NOTE"
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="milestones">5.3.4. Milestones</H2
+><P
+>Milestones are "targets" that you plan to get a bug fixed by. For
+      example, you have a bug that you plan to fix for your 3.0 release, it
+      would be assigned the milestone of 3.0.</P
+><DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
-WIDTH="90%"
+CLASS="note"
+WIDTH="100%"
 BORDER="0"
 ><TR
 ><TD
@@ -8638,59 +7618,50 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->		  As of this writing, the user can still submit bugs
-		  via the e-mail gateway, if you set it up, despite
-		  the disabled text field.  The e-mail gateway should
-		  <EM
->not</EM
-> be enabled for secure
-		  installations of Bugzilla.
-		</P
+>Milestone options will only appear for a Product if you turned
+        on the "usetargetmilestone" Param in the "Edit Parameters" screen.
+        </P
 ></TD
 ></TR
 ></TABLE
 ></DIV
->
-	    </P
+><P
+>To create new Milestones, set Default Milestones, and set
+      Milestone URL:</P
+><P
+></P
+><OL
+TYPE="1"
+><LI
+><P
+>Select "Edit milestones" from the "Edit product" page.</P
 ></LI
 ><LI
 ><P
->	      <EM
->CanConfirm</EM
->: This field is only used
-	      if you have enabled "unconfirmed" status in your
-	      parameters screen.  If you enable this for a user, that
-	      user can then move bugs from "Unconfirmed" to
-	      "Confirmed" status (e.g.: "New" status). Be judicious
-	      about allowing users to turn this bit on for other
-	      users.
-	    </P
+>Select "Add" in the bottom right corner.
+          text</P
 ></LI
 ><LI
 ><P
->	      <EM
->Creategroups</EM
->: This option will
-	      allow a user to create and destroy groups in Bugzilla.
-	      Unless you are using the Bugzilla GroupSentry security
-	      option "usebuggroupsentry" in your parameters, this
-	      setting has no effect.
-	    </P
+>Enter the name of the Milestone in the "Milestone" field. You
+          can optionally set the "sortkey", which is a positive or negative
+          number (-255 to 255) that defines where in the list this particular
+          milestone appears. This is because milestones often do not 
+          occur in alphanumeric order For example, "Future" might be
+          after "Release 1.2". Select "Add".</P
 ></LI
 ><LI
 ><P
->	      <EM
->Editbugs</EM
->: Unless a user has this
-	      bit set, they can only edit those bugs for which they
-	      are the assignee or the reporter.  
-	      <DIV
-CLASS="NOTE"
+>From the Edit product screen, you can enter the URL of a 
+          page which gives information about your milestones and what
+          they mean. </P
+><DIV
+CLASS="tip"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
-WIDTH="90%"
+CLASS="tip"
+WIDTH="100%"
 BORDER="0"
 ><TR
 ><TD
@@ -8698,172 +7669,152 @@ WIDTH="25"
 ALIGN="CENTER"
 VALIGN="TOP"
 ><IMG
-SRC="../images/note.gif"
+SRC="../images/tip.gif"
 HSPACE="5"
-ALT="Note"></TD
+ALT="Tip"></TD
 ><TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->		  Leaving this option unchecked does not prevent users
-		  from adding comments to a bug!  They simply cannot
-		  change a bug priority, severity, etc. unless they
-		  are the assignee or reporter.
-		</P
+>If you want your milestone document to be restricted so
+          that it can only be viewed by people in a particular Bugzilla
+          group, the best way is to attach the document to a bug in that
+          group, and make the URL the URL of that attachment.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
->
-	    </P
+></LI
+></OL
+></DIV
+></DIV
+><DIV
+CLASS="section"
+><HR><H1
+CLASS="section"
+><A
+NAME="voting">5.4. Voting</H1
+><P
+>Voting allows users to be given a pot of votes which they can allocate
+    to bugs, to indicate that they'd like them fixed. 
+    This allows developers to gauge
+    user need for a particular enhancement or bugfix. By allowing bugs with
+    a certain number of votes to automatically move from "UNCONFIRMED" to
+    "NEW", users of the bug system can help high-priority bugs garner
+    attention so they don't sit for a long time awaiting triage.</P
+><P
+>To modify Voting settings:</P
+><P
+></P
+><OL
+TYPE="1"
+><LI
+><P
+>Navigate to the "Edit product" screen for the Product you
+        wish to modify</P
 ></LI
 ><LI
 ><P
->	      <EM
->Editcomponents</EM
->: This flag allows a
-	      user to create new  products and components, as well as
-	      modify and destroy those that have no bugs associated
-	      with them.  If a product or component has bugs
-	      associated with it, those bugs must be moved to a
-	      different product or component before Bugzilla will
-	      allow them to be destroyed.  The name of a product or
-	      component can be changed without affecting the
-	      associated bugs, but it tends to annoy the hell out of
-	      your users when these change a lot.
-	    </P
+><EM
+>Maximum Votes per person</EM
+>:
+        Setting this field to "0" disables voting.</P
 ></LI
 ><LI
 ><P
->	      <EM
->Editkeywords</EM
->: If you use Bugzilla's
-	      keyword functionality, enabling this feature allows a
-	      user can create and destroy keywords. As always, the
-	      keywords for existing bugs containing the keyword the
-	      user wishes to destroy must be changed before Bugzilla
-	      will allow it to die. You must be very careful about
-	      creating too many new keywords if you run a very large
-	      Bugzilla installation; keywords are global variables
-	      across products, and you can often run into a phenomenon
-	      called "keyword bloat". This confuses users, and then
-	      the feature goes unused.
-	    </P
+><EM
+>Maximum Votes a person can put on a single
+         bug"</EM
+>: 
+         It should probably be some number lower than the
+        "Maximum votes per person". Don't set this field to "0" if
+        "Maximum votes per person" is non-zero; that doesn't make
+        any sense.</P
 ></LI
 ><LI
 ><P
->	      <EM
->Editusers</EM
->: This flag allows a user
-	      do what you're doing right now: edit other users. This
-	      will allow those with the right to do so to remove
-	      administrator priveleges from other users or grant them
-	      to themselves.  Enable with care.
-	    </P
+><EM
+>Number of votes a bug in this product needs to
+        automatically get out of the UNCONFIRMED state</EM
+>: 
+        Setting this field to "0" disables the automatic move of
+        bugs from UNCONFIRMED to NEW. 
+        </P
 ></LI
 ><LI
 ><P
->	      <EM
->PRODUCT</EM
->: PRODUCT bugs access.  This
-	      allows an administrator, with product-level granularity,
-	      to specify in which products a user can edit bugs.  The
-	      user must still have the "editbugs" privelege to edit
-	      bugs in this area; this simply restricts them from even
-	      seeing bugs outside these boundaries if the
-	      administrator has enabled the group sentry parameter
-	      "usebuggroupsentry".  Unless you are using bug groups,
-	      this option has no effect.
-	    </P
+>Once you have adjusted the values to your preference, click
+        "Update".</P
 ></LI
-></UL
-></DIV
-></DIV
+></OL
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="PROGRAMADMIN"
->4.3. Product, Component, Milestone, and Version
-      Administration</A
-></H1
-><TABLE
-BORDER="0"
-WIDTH="100%"
-CELLSPACING="0"
-CELLPADDING="0"
-CLASS="EPIGRAPH"
-><TR
-><TD
-WIDTH="45%"
->&nbsp;</TD
-><TD
-WIDTH="45%"
-ALIGN="LEFT"
-VALIGN="TOP"
-><I
+NAME="groups">5.5. Groups and Group Security</H1
+><P
+>Groups allow the administrator
+    to isolate bugs or products that should only be seen by certain people.
+    There are two types of group - Generic Groups, and Product-Based Groups.
+    </P
+><P
+>&#13;    Product-Based Groups are matched with products, and allow you to restrict
+    access to bugs on a per-product basis. They are enabled using the 
+    usebuggroups Param. Turning on the usebuggroupsentry
+    Param will mean bugs automatically get added to their product group when 
+    filed.   
+    </P
+><P
+>&#13;    Generic Groups have no special relationship to products; 
+    you create them, and put bugs in them
+    as required. One example of the use of Generic Groups 
+    is Mozilla's "Security" group,
+    into which security-sensitive bugs are placed until fixed. Only the
+    Mozilla Security Team are members of this group.
+    </P
+><P
+>To create Generic Groups:</P
 ><P
-><I
->Dear Lord, we have to get our users to do WHAT?</I
 ></P
-></I
-></TD
-></TR
-></TABLE
-><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
-><A
-NAME="PRODUCTS"
->4.3.1. Products</A
-></H2
-><FONT
-COLOR="RED"
->Formerly, and in some spots still, called
-	"Programs"</FONT
+><OL
+TYPE="1"
+><LI
 ><P
->	<A
-HREF="#GLOSS_PRODUCT"
-><I
-CLASS="GLOSSTERM"
->Products</I
-></A
-> are
-	the broadest category in Bugzilla, and you should have the
-	least of these. If your company makes computer games, you
-	should have one product per game, and possibly a few special
-	products (website, meetings...)
-      </P
+>Select the "groups"
+        link in the footer.</P
+></LI
+><LI
 ><P
->	A Product (formerly called "Program", and still referred to
-	that way in some portions of the source code) controls some
-	very important functions. The number of "votes" available for
-	users to vote for the most important bugs is set per-product,
-	as is the number of votes required to move a bug automatically
-	from the UNCONFIRMED status to the NEW status.  One can close
-	a Product for further bug entry and define various Versions
-	available from the Edit product screen.
-      </P
+>Take a moment to understand the instructions on the "Edit
+        Groups" screen, then select the "Add Group" link.</P
+></LI
+><LI
 ><P
->To create a new product:</P
+>Fill out the "New Name", "New Description", and 
+        "New User RegExp" fields. "New User RegExp" allows you to automatically
+         place all users who fulfill the Regular Expression into the new group. 
+         When you have finished, click "Add".</P
+></LI
+></OL
+><P
+>To use Product-Based Groups:</P
 ><P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->	    Select "components" from the yellow footer
-	  </P
+>Turn on "usebuggroups" and "usebuggroupsentry" in the "Edit
+        Parameters" screen.</P
 ><DIV
-CLASS="TIP"
+CLASS="warning"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
-WIDTH="90%"
+CLASS="warning"
+WIDTH="100%"
 BORDER="0"
 ><TR
 ><TD
@@ -8871,18 +7822,22 @@ WIDTH="25"
 ALIGN="CENTER"
 VALIGN="TOP"
 ><IMG
-SRC="../images/tip.gif"
+SRC="../images/warning.gif"
 HSPACE="5"
-ALT="Tip"></TD
+ALT="Warning"></TD
 ><TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	      It may seem counterintuitive to click "components" when
-	      you want to edit the properties associated with
-	      Products.  This is one of a long list of things we want
-	      in Bugzilla 3.0...
-	    </P
+>XXX is this still true?
+          "usebuggroupsentry" has the capacity to prevent the
+          administrative user from directly altering bugs because of
+          conflicting group permissions. If you plan on using
+          "usebuggroupsentry", you should plan on restricting
+          administrative account usage to administrative duties only. In
+          other words, manage bugs with an unpriveleged user account, and
+          manage users, groups, Products, etc. with the administrative
+          account.</P
 ></TD
 ></TR
 ></TABLE
@@ -8890,22 +7845,19 @@ VALIGN="TOP"
 ></LI
 ><LI
 ><P
->	    Select the "Add" link to the right of "Add a new product".
-	  </P
-></LI
-><LI
-><P
->	    Enter the name of the product and a description. The
-	    Description field is free-form.
-	  </P
+>In future, when you create a Product, a matching group will be
+        automatically created. If you need to add a Product Group to
+        a Product which was created before you turned on usebuggroups,
+        then simply create a new group, as outlined above, with the
+        same name as the Product.</P
 ></LI
 ></OL
 ><DIV
-CLASS="TIP"
+CLASS="warning"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
+CLASS="warning"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -8914,111 +7866,42 @@ WIDTH="25"
 ALIGN="CENTER"
 VALIGN="TOP"
 ><IMG
-SRC="../images/tip.gif"
+SRC="../images/warning.gif"
 HSPACE="5"
-ALT="Tip"></TD
+ALT="Warning"></TD
 ><TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  Don't worry about the "Closed for bug entry", "Maximum Votes
-	  per person",  "Maximum votes a person can put on a single
-	  bug", "Number of votes a bug in this Product needs to
-	  automatically get out of the UNCOMFIRMED state", and
-	  "Version" options yet. We'll cover those in a few moments.
-	</P
+>Bugzilla currently has a limit of 64 groups per installation. If
+      you have more than about 50 products, you should consider
+      running multiple Bugzillas. Ask in the newsgroup for other
+      suggestions for working around this restriction.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
+><P
+>&#13;      Note that group permissions are such that you need to be a member
+      of <EM
+>all</EM
+> the groups a bug is in, for whatever
+      reason, to see that bug.
+    </P
 ></DIV
 ><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
-><A
-NAME="COMPONENTS"
->4.3.2. Components</A
-></H2
-><P
->	Components are subsections of a Product. 
-
-	<DIV
-CLASS="EXAMPLE"
+CLASS="section"
+><HR><H1
+CLASS="section"
 ><A
-NAME="AEN1461"
-></A
-><P
-><B
->Example 4-1. Creating some Components</B
-></P
+NAME="security">5.6. Bugzilla Security</H1
 ><DIV
-CLASS="INFORMALEXAMPLE"
-><A
-NAME="AEN1463"
-></A
-><P
-></P
-><P
->	      The computer game you are designing may have a "UI"
-	      component, an "API" component, a "Sound System"
-	      component, and a "Plugins" component,  each overseen by
-	      a different programmer.  It often makes sense to divide
-	      Components in Bugzilla according to the natural
-	      divisions of responsibility within your Product  or
-	      company.
-	    </P
-><P
-></P
-></DIV
-></DIV
-> Each component has a owner and (if you turned it on
-	in the parameters), a QA  Contact. The owner should be the
-	primary person who fixes bugs in that component.  The  QA
-	Contact should be the person who will ensure these bugs are
-	completely fixed. The Owner, QA Contact, and Reporter will get
-	email when new bugs are created in this Component and when
-	these bugs change. Default Owner and Default QA Contact fields
-	only dictate the <EM
->default assignments</EM
->; the
-	Owner and QA Contact fields in a bug  are otherwise unrelated
-	to the Component.
-      </P
-><P
->	To create a new Component:
-      </P
-><P
-></P
-><OL
-TYPE="1"
-><LI
-><P
->	    Select the "Edit components" link from the "Edit product"
-	    page
-	  </P
-></LI
-><LI
-><P
->	    Select the "Add" link to the right of the "Add a new
-	    component" text on the "Select Component" page.
-	  </P
-></LI
-><LI
-><P
->	    Fill out the "Component" field, a short "Description", and
-	    the "Initial Owner". The Component and Description fields
-	    are free-form; the "Initial Owner" field must be that of a
-	    user ID already existing in the database.  If the initial
-	    owner does not exist, Bugzilla will refuse to create the
-	    component.
-	    <DIV
-CLASS="TIP"
+CLASS="warning"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
-WIDTH="90%"
+CLASS="warning"
+WIDTH="100%"
 BORDER="0"
 ><TR
 ><TD
@@ -9026,206 +7909,107 @@ WIDTH="25"
 ALIGN="CENTER"
 VALIGN="TOP"
 ><IMG
-SRC="../images/tip.gif"
+SRC="../images/warning.gif"
 HSPACE="5"
-ALT="Tip"></TD
+ALT="Warning"></TD
 ><TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->		Is your "Default Owner" a user who is not yet in the
-		database? No problem.
-		<P
-></P
-><OL
-TYPE="a"
-><LI
-><P
->		      Select the "Log out" link on the footer of the
-		      page.
-		    </P
-></LI
-><LI
-><P
->		      Select the "New Account" link on the footer of
-		      the "Relogin" page
-		    </P
-></LI
-><LI
-><P
->		      Type in the email address of the default owner
-		      you want to create in the "E-mail address"
-		      field, and her full name in the "Real name"
-		      field, then select the "Submit Query" button.
-		    </P
-></LI
-><LI
-><P
->		      Now select "Log in" again, type in your login
-		      information, and you can modify the product to
-		      use the Default Owner information you require.
-		    </P
-></LI
-></OL
->
-	      </P
+>Poorly-configured MySQL and Bugzilla installations have
+      given attackers full access to systems in the past. Please take these
+      guidelines seriously, even for Bugzilla machines hidden away behind
+      your firewall. 80% of all computer trespassers are insiders, not
+      anonymous crackers.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
->
-	  </P
-></LI
-><LI
-><P
->	    Either Edit more components or return to the Bugzilla
-	    Query Page. To return to the Product you were editing, you
-	    must select the Components link as before.
-	  </P
-></LI
-></OL
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
-><A
-NAME="VERSIONS"
->4.3.3. Versions</A
-></H2
-><P
->	Versions are the revisions of the product, such as "Flinders
-	3.1", "Flinders 95", and "Flinders 2000".  Using Versions
-	helps you isolate code changes and are an aid in reporting.
-
-	<DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN1490"
-></A
-><P
-><B
->Example 4-2. Common Use of Versions</B
-></P
-><DIV
-CLASS="INFORMALEXAMPLE"
-><A
-NAME="AEN1492"
-></A
-><P
-></P
-><P
->	      A user reports a bug against Version "Beta 2.0" of your
-	      product.  The current Version of your software is
-	      "Release Candidate 1", and no longer has the bug.  This
-	      will help you triage and classify bugs according to
-	      their relevance.  It is also possible people may report
-	      bugs against bleeding-edge beta versions that are not
-	      evident in older versions of the software.  This can
-	      help isolate code changes that caused the bug
-	    </P
-><P
-></P
-></DIV
-></DIV
->
-	<DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN1494"
-></A
-><P
-><B
->Example 4-3. A Different Use of Versions</B
-></P
 ><DIV
-CLASS="INFORMALEXAMPLE"
-><A
-NAME="AEN1496"
-></A
+CLASS="note"
 ><P
 ></P
+><TABLE
+CLASS="note"
+WIDTH="100%"
+BORDER="0"
+><TR
+><TD
+WIDTH="25"
+ALIGN="CENTER"
+VALIGN="TOP"
+><IMG
+SRC="../images/note.gif"
+HSPACE="5"
+ALT="Note"></TD
+><TD
+ALIGN="LEFT"
+VALIGN="TOP"
 ><P
->	      This field has been used to good effect by an online
-	      service provider in a slightly different way.  They had
-	      three versions of the product: "Production", "QA", and
-	      "Dev".  Although it may be the same product, a bug in
-	      the development environment is not normally as critical
-	      as a Production bug, nor does it need to be reported
-	      publicly.  When used in conjunction with Target
-	      Milestones, one can easily specify the environment where
-	      a bug can be reproduced, and the Milestone by which it
-	      will be fixed.
-	    </P
-><P
-></P
-></DIV
-></DIV
+>These instructions must, of necessity, be somewhat vague since
+      Bugzilla runs on so many different platforms. If you have refinements
+      of these directions for specific platforms, please submit them to 
+      <A
+HREF="mailto://mozilla-webtools@mozilla.org"
+TARGET="_top"
+>&#13;      mozilla-webtools@mozilla.org</A
 >
-       </P
-><P
->	To create and edit Versions:
       </P
+></TD
+></TR
+></TABLE
+></DIV
 ><P
+>To secure your installation:
+     
+    <P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->	    From the "Edit product" screen, select "Edit Versions"
-	  </P
+>Ensure you are running at least MysQL version 3.22.32 or newer.
+        Earlier versions had notable security holes and (from a security
+        point of view) poor default configuration choices.</P
 ></LI
 ><LI
 ><P
->	    You will notice that the product already has the default
-	    version "undefined". If your product doesn't use version
-	    numbers, you may want to leave this as it is or edit it so
-	    that it is "---". You can then go back to the edit
-	    versions page and add new versions to your product.
-	  </P
-><P
->	    Otherwise, click the "Add" button to the right of the "Add
-	    a new version" text.
-	  </P
+>&#13;        <EM
+>There is no substitute for understanding the tools on your
+        system!</EM
+>
+
+        Read 
+        <A
+HREF="http://www.mysql.com/doc/P/r/Privilege_system.html"
+TARGET="_top"
+>&#13;        The MySQL Privilege System</A
+>
+        until you can recite it from memory!</P
 ></LI
 ><LI
 ><P
->	    Enter the name of the Version.  This can be free-form
-	    characters up to the limit of the text box.  Then select
-	    the "Add" button.
-	  </P
+>Lock down /etc/inetd.conf. Heck, disable inet entirely on this
+        box. It should only listen to port 25 for Sendmail and port 80 for
+        Apache.</P
 ></LI
 ><LI
 ><P
->	    At this point you can select "Edit" to edit more Versions,
-	    or return to the "Query" page, from which you can navigate
-	    back to the product through the "components" link at the
-	    foot of the Query page.
-	  </P
-></LI
-></OL
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
-><A
-NAME="MILESTONES"
->4.3.4. Milestones</A
-></H2
-><P
->	Milestones are "targets" that you plan to get a bug fixed by.
-	For example, you have a bug that you plan to fix for your 3.0
-	release, it would be assigned the milestone of 3.0. Or, you
-	have a bug that you plan to fix for 2.8, this would have a
-	milestone of 2.8.
-      </P
-><DIV
-CLASS="NOTE"
+>Do not run Apache as 
+        <SPAN
+CLASS="QUOTE"
+>"nobody"</SPAN
+>
+
+        . This will require very lax permissions in your Bugzilla
+        directories. Run it, instead, as a user with a name, set via your
+        httpd.conf file. 
+        <DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -9241,83 +8025,84 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  Milestone options will only appear for a Product if you
-	  turned the "usetargetmilestone" field in the "Edit
-	  Parameters" screen "On".
-	</P
+>&#13;          <SPAN
+CLASS="QUOTE"
+>"nobody"</SPAN
+>
+
+          is a real user on UNIX systems. Having a process run as user id 
+          <SPAN
+CLASS="QUOTE"
+>"nobody"</SPAN
+>
+
+          is absolutely no protection against system crackers versus using
+          any other user account. As a general security measure, I recommend
+          you create unique user ID's for each daemon running on your system
+          and, if possible, use "chroot" to jail that process away from the
+          rest of your system.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
-><P
->	To create new Milestones, set Default Milestones, and set
-	Milestone URL: 
-      </P
-><P
-></P
-><OL
-TYPE="1"
-><LI
-><P
->	    Select "edit milestones"
-	  </P
+>
+        </P
 ></LI
 ><LI
 ><P
->	    Select "Add" to the right of the "Add a new milestone"
-	    text
-	  </P
-></LI
-><LI
+>Ensure you have adequate access controls for the
+        $BUGZILLA_HOME/data/ directory, as well as the
+        $BUGZILLA_HOME/localconfig file.
+        The localconfig file stores your "bugs" database account password. 
+        In addition, some
+        files under $BUGZILLA_HOME/data/ store sensitive information.
+        </P
 ><P
->	    Enter the name of the Milestone in the "Milestone" field.
-	    You can optionally set the "Sortkey", which is a positive
-	    or negative number (-255 to 255) that defines where in the
-	    list this particular milestone appears. Select "Add".
-	  </P
-><DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN1522"
-></A
+>Bugzilla provides default .htaccess files to protect the most
+        common Apache installations. However, you should verify these are
+        adequate according to the site-wide security policy of your web
+        server, and ensure that the .htaccess files are allowed to
+        "override" default permissions set in your Apache configuration
+        files. Covering Apache security is beyond the scope of this Guide;
+        please consult the Apache documentation for details.</P
 ><P
-><B
->Example 4-4. Using SortKey with Target Milestone</B
-></P
+>If you are using a web server that does not support the
+        .htaccess control method, 
+        <EM
+>you are at risk!</EM
+>
+
+        After installing, check to see if you can view the file
+        "localconfig" in your web browser (e.g.: 
+        <A
+HREF="http://bugzilla.mozilla.org/localconfig"
+TARGET="_top"
+>&#13;        http://bugzilla.mozilla.org/localconfig</A
+>
+
+        ). If you can read the contents of this file, your web server has
+        not secured your bugzilla directory properly and you must fix this
+        problem before deploying Bugzilla. If, however, it gives you a
+        "Forbidden" error, then it probably respects the .htaccess
+        conventions and you are good to go.</P
+><P
+>When you run checksetup.pl, the script will attempt to modify
+        various permissions on files which Bugzilla uses. If you do not have
+        a webservergroup set in the localconfig file, then Bugzilla will have
+        to make certain files world readable and/or writable. 
+        <EM
+>THIS IS INSECURE!</EM
+>
+
+        . This means that anyone who can get access to your system can do
+        whatever they want to your Bugzilla installation.</P
 ><DIV
-CLASS="INFORMALEXAMPLE"
-><A
-NAME="AEN1524"
-></A
-><P
-></P
-><P
->		Let's say you create a target milestone called
-		"Release 1.0", with Sortkey set to "0". Later, you
-		realize that you will have a public beta, called
-		"Beta1". You can create a Milestone called "Beta1",
-		with a Sortkey of "-1" in order to ensure people will
-		see the Target Milestone of "Beta1" earlier on the
-		list than "Release 1.0"
-	      </P
-><P
-></P
-></DIV
-></DIV
-></LI
-><LI
-><P
->	    If you want to add more milestones, select the "Edit"
-	    link. If you don't, well shoot, you have to go back to the
-	    "query" page and select "components" again, and make your
-	    way back to the Product you were editing.
-	    <DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
-WIDTH="90%"
+CLASS="note"
+WIDTH="100%"
 BORDER="0"
 ><TR
 ><TD
@@ -9332,121 +8117,172 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->		This is another in the list of unusual user interface
-		decisions that we'd like to get cleaned up.  Shouldn't
-		there be a link to the effect of "edit the Product I
-		was editing when I ended up here"?  In any case,
-		clicking "components" in the footer takes you back to
-		the "Select product" screen, from which you can begin
-		editing your product again.
-	      </P
+>This also means that if your webserver runs all cgi scripts
+          as the same user/group, anyone on the system who can run cgi
+          scripts will be able to take control of your Bugzilla
+          installation.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
->
-	  </P
-></LI
-><LI
 ><P
->	    From the Edit product screen again (once you've made your
-	    way back), enter the URL for a description of what your
-	    milestones are for this product in the "Milestone URL"
-	    field. It should be of the format
-	    "http://www.foo.com/bugzilla/product_milestones.html"
-	  </P
+>On Apache, you can use .htaccess files to protect access to
+        these directories, as outlined in 
+        <A
+HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=57161"
+TARGET="_top"
+>Bug
+        57161</A
+>
+
+        for the localconfig file, and 
+        <A
+HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=65572"
+TARGET="_top"
+>Bug
+        65572</A
+>
+
+        for adequate protection in your data/ directory.</P
 ><P
->	    Some common uses of this field include product
-	    descriptions, product roadmaps, and of course a simple
-	    description of the meaning of each milestone.
-	  </P
-></LI
-><LI
+>Note the instructions which follow are Apache-specific. If you
+        use IIS, Netscape, or other non-Apache web servers, please consult
+        your system documentation for how to secure these files from being
+        transmitted to curious users.</P
 ><P
->	    If you're using Target Milestones, the "Default Milestone"
-	    field must have some kind of entry.  If you really don't
-	    care if people set coherent Target Milestones,  simply
-	    leave this at the default, "---".  However, controlling
-	    and regularly updating the Default Milestone field is a
-	    powerful tool when reporting the status of projects.
-	  </P
+>Place the following text into a file named ".htaccess",
+        readable by your web server, in your $BUGZILLA_HOME/data directory. 
+        <P
+CLASS="literallayout"
+>&#60;Files&nbsp;comments&#62;&nbsp;allow&nbsp;from&nbsp;all&nbsp;&#60;/Files&#62;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deny&nbsp;from&nbsp;all</P
+>
+        </P
 ><P
->Select the "Update" button when you are done.</P
+>Place the following text into a file named ".htaccess",
+        readable by your web server, in your $BUGZILLA_HOME/ directory. 
+        <P
+CLASS="literallayout"
+>&#60;Files&nbsp;localconfig&#62;&nbsp;deny&nbsp;from&nbsp;all&nbsp;&#60;/Files&#62;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allow&nbsp;from&nbsp;all</P
+>
+        </P
 ></LI
 ></OL
+>
+    </P
 ></DIV
 ><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
+CLASS="section"
+><HR><H1
+CLASS="section"
 ><A
-NAME="VOTING"
->4.3.5. Voting</A
-></H2
+NAME="cust-templates">5.7. Template Customisation</H1
 ><P
->	The concept of "voting" is a poorly understood, yet powerful
-	feature for the management of open-source projects.  Each user
-	is assigned so many Votes per product, which they can freely
-	reassign (or assign multiple votes to a single bug). This
-	allows developers to gauge user need for a particular
-	enhancement or bugfix.  By allowing bugs with a certain number
-	of votes to automatically move from "UNCONFIRMED" to "NEW",
-	users of the bug system can help high-priority bugs garner
-	attention so they don't sit for a long time awaiting triage.
-      </P
+>&#13;      One of the large changes for 2.16 was the templatisation of the
+      entire user-facing UI, using the 
+      <A
+HREF="http://www.template-toolkit.org"
+TARGET="_top"
+>Template Toolkit</A
+>.
+      Administrators can now configure the look and feel of Bugzilla without
+      having to edit Perl files or face the nightmare of massive merge
+      conflicts when they upgrade to a newer version in the future.
+    </P
 ><P
->	The daunting challenge of Votes is deciding where you draw the
-	line for a "vocal majority".  If you only have a user base of
-	100 users, setting a low threshold for bugs to move from
-	UNCONFIRMED to NEW makes sense.  As the Bugzilla user base
-	expands, however, these thresholds must be re-evaluated.  You
-	should gauge whether this feature is worth the time and close
-	monitoring involved, and perhaps forego implementation until
-	you have a critical mass of users who demand it.
+>&#13;      Templatisation also makes localised versions of Bugzilla possible, 
+      for the first time. In the future, a Bugzilla installation may
+      have templates installed for multiple localisations, and select
+      which ones to use based on the user's browser language setting.      
+    </P
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="AEN1539">5.7.1. What to Edit</H2
+><P
+>&#13;        There are two different ways of editing of Bugzilla's templates,
+        and which you use depends mainly on how you upgrade Bugzilla. The
+        template directory structure is that there's a top level directory,
+        <TT
+CLASS="filename"
+>template</TT
+>, which contains a directory for
+        each installed localisation. The default English templates are
+        therefore in <TT
+CLASS="filename"
+>en</TT
+>. Underneath that, there
+        is the <TT
+CLASS="filename"
+>default</TT
+> directory and optionally the 
+        <TT
+CLASS="filename"
+>custom</TT
+> directory. The <TT
+CLASS="filename"
+>default</TT
+>
+        directory contains all the templates shipped with Bugzilla, whereas
+        the <TT
+CLASS="filename"
+>custom</TT
+> directory does not exist at first and
+        must be created if you want to use it.
       </P
 ><P
->To modify Voting settings:</P
-><P
-></P
-><OL
-TYPE="1"
-><LI
-><P
->	    Navigate to the "Edit product" screen for the Product you
-	    wish to modify
-	  </P
-></LI
-><LI
+>&#13;        The first method of making customisations is to directly edit the
+        templates in <TT
+CLASS="filename"
+>template/en/default</TT
+>. This is
+        probably the best method for small changes if you are going to use
+        the CVS method of upgrading, because if you then execute a
+        <B
+CLASS="command"
+>cvs update</B
+>, any template fixes will get
+        automagically merged into your modified versions.
+      </P
 ><P
->	    Set "Maximum Votes per person" to your calculated value.
-	    Setting this field to "0" disables voting.
-	  </P
-></LI
-><LI
+>&#13;        If you use this method, your installation will break if CVS conflicts
+        occur.
+      </P
 ><P
->	    Set "Maximum Votes a person can put on a single bug" to
-	    your calculated value.  It should probably be some number
-	    lower than the "Maximum votes per person". Setting this
-	    field to "0" disables voting, but leaves the voting
-	    options open to the user.  This is confusing.
-	  </P
-></LI
-><LI
+>&#13;        The other method is to copy the templates into a mirrored directory
+        structure under <TT
+CLASS="filename"
+>template/en/custom</TT
+>.  The templates
+        in this directory automatically override those in default.  
+        This is the technique you
+        need to use if you use the overwriting method of upgrade, because
+        otherwise your changes will be lost.  This method is also better if
+        you are using the CVS method of upgrading and are going to make major
+        changes, because it is guaranteed that the contents of this directory
+        will not be touched during an upgrade, and you can then decide whether
+        to continue using your own templates, or make the effort to merge your
+        changes into the new versions by hand.
+      </P
 ><P
->	    Set "Number of votes a bug in this product needs to
-	    automatically get out of the UNCONFIRMED state" to your
-	    calculated number.  Setting this field to "0"  disables
-	    the automatic move of bugs from UNCONFIRMED to NEW.  Some
-	    people advocate leaving this at "0", but of what use are
-	    Votes if your Bugzilla user base is unable to affect which
-	    bugs appear on Development radar?
-	    <DIV
-CLASS="TIP"
+>&#13;        If you use this method, your installation may break if incompatible
+        changes are made to the template interface.  If such changes are made
+        they will be documented in the release notes, provided you are using a
+        stable release of Bugzilla.  If you use using unstable code, you will
+        need to deal with this one yourself, although if possible the changes
+        will be mentioned before they occur in the deprecations section of the
+        previous stable release's release notes.
+      </P
+><DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
-WIDTH="90%"
+CLASS="note"
+WIDTH="100%"
 BORDER="0"
 ><TR
 ><TD
@@ -9454,96 +8290,75 @@ WIDTH="25"
 ALIGN="CENTER"
 VALIGN="TOP"
 ><IMG
-SRC="../images/tip.gif"
+SRC="../images/note.gif"
 HSPACE="5"
-ALT="Tip"></TD
+ALT="Note"></TD
 ><TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->		You should probably set this number to higher than a
-		small coalition of Bugzilla users can influence it.
-		Most sites use this as a "referendum" mechanism -- if
-		users are able to vote a bug out of UNCONFIRMED, it is
-		a <EM
->really</EM
-> bad bug!
-	      </P
+>&#13;          Don't directly edit the compiled templates in 
+          <TT
+CLASS="filename"
+>data/template/*</TT
+> - your
+          changes will be lost when Template Toolkit recompiles them.
+        </P
 ></TD
 ></TR
 ></TABLE
 ></DIV
->
-	  </P
-></LI
-><LI
-><P
->	    Once you have adjusted the values to your preference,
-	    select the "Update" button.
-	  </P
-></LI
-></OL
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H2
-CLASS="SECTION"
-><A
-NAME="GROUPS"
->4.3.6. Groups and Group Security</A
-></H2
-><P
->	Groups can be very useful in bugzilla, because they allow
-	users to isolate bugs or products that should only be seen by
-	certain people.  Groups can also be a complicated minefield of
-	interdependencies and weirdness if mismanaged.
-
-	<DIV
-CLASS="EXAMPLE"
+CLASS="section"
 ><A
-NAME="AEN1558"
-></A
+NAME="AEN1558">5.7.2. How To Edit Templates</H2
 ><P
-><B
->Example 4-5. When to Use Group Security</B
-></P
-><DIV
-CLASS="INFORMALEXAMPLE"
-><A
-NAME="AEN1560"
-></A
+>&#13;        The syntax of the Template Toolkit language is beyond the scope of
+        this guide. It's reasonably easy to pick up by looking at the current 
+        templates; or, you can read the manual, available on the
+        <A
+HREF="http://www.template-toolkit.org"
+TARGET="_top"
+>Template Toolkit home
+        page</A
+>. However, you should particularly remember (for security
+        reasons) to always HTML filter things which come from the database or
+        user input, to prevent cross-site scripting attacks.
+      </P
 ><P
-></P
+>&#13;        However, one thing you should take particular care about is the need
+        to properly HTML filter data that has been passed into the template.
+        This means that if the data can possibly contain special HTML characters
+        such as &#60;, and the data was not intended to be HTML, they need to be
+        converted to entity form, ie &#38;lt;.  You use the 'html' filter in the
+        Template Toolkit to do this.  If you fail to do this, you may open up
+        your installation to cross-site scripting attacks.
+      </P
 ><P
->	      Many Bugzilla sites isolate "Security-related" bugs from
-	      all other bugs. This way, they can have a fix ready
-	      before the security vulnerability is announced to the
-	      world.  You can create a "Security" product which, by
-	      default, has no members, and only add members to the
-	      group (in their individual User page, as described under
-	      User Administration) who should have priveleged access
-	      to "Security" bugs.  Alternately, you may create a Group
-	      independently of any Product, and change the Group mask
-	      on individual bugs to restrict access to members only of
-	      certain Groups.
-	    </P
+>&#13;        Also note that Bugzilla adds a few filters of its own, that are not
+        in standard Template Toolkit.  In particular, the 'url_quote' filter
+        can convert characters that are illegal or have special meaning in URLs,
+        such as &#38;, to the encoded form, ie %26.  This actually encodes most
+        characters (but not the common ones such as letters and numbers and so
+        on), including the HTML-special characters, so there's never a need to
+        HTML filter afterwards.
+      </P
 ><P
-></P
-></DIV
-></DIV
-> Groups only work if you enable the "usebuggroups"
-	paramater. In addition, if the "usebuggroupsentry" parameter
-	is "On", one can restrict access to products by groups, so
-	that only members of a product group are able to view bugs
-	within that product. Group security in Bugzilla can be divided
-	into two categories: Generic and Product-Based.
+>&#13;        Editing templates is a good way of doing a "poor man's custom fields".
+        For example, if you don't use the Status Whiteboard, but want to have
+        a free-form text entry box for "Build Identifier", then you can just
+        edit the templates to change the field labels. It's still be called
+        status_whiteboard internally, but your users don't need to know that.
       </P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -9559,1791 +8374,621 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  Groups in Bugzilla are a complicated beast that evolved out
-	  of very simple user permission bitmasks, apparently itself
-	  derived from common concepts in UNIX access controls.  A
-	  "bitmask" is a fixed-length number whose value can describe
-	  one, and only one, set of states.  For instance, UNIX file
-	  permissions are assigned bitmask values:  "execute" has a
-	  value of 1, "write" has a value of 2,  and "read" has a
-	  value of 4.  Add them together, and a file can be read,
-	  written to, and executed if it has a bitmask of "7". (This
-	  is a simplified example -- anybody who knows UNIX security
-	  knows there is much more to it than this.  Please bear with
-	  me for the purpose of this note.)  The only way a bitmask
-	  scheme can work is by doubling the bit count for each value.
-	  Thus if UNIX wanted to offer another file permission, the
-	  next would have to be a value of 8, then the next 16, the
-	  next 32, etc.
-	</P
-><P
->	  Similarly, Bugzilla offers a bitmask to define group
-	  permissions, with an internal limit of 64.  Several are
-	  already occupied by built-in permissions.  The way around
-	  this limitation is to avoid assigning groups to products if
-	  you have many products, avoid bloating of group lists, and
-	  religiously prune irrelevant groups.  In reality, most
-	  installations of Bugzilla support far fewer than 64 groups,
-	  so this limitation has not hit for most sites, but it is on
-	  the table to be revised for Bugzilla 3.0 because it
-	  interferes with the security schemes of some administrators.
-	</P
+>&#13;          If you are making template changes that you intend on submitting back
+          for inclusion in standard Bugzilla, you should read the relevant
+          sections of the 
+          <A
+HREF="http://www.bugzilla.org/developerguide.html"
+TARGET="_top"
+>Developers'
+          Guide</A
+>.
+        </P
 ></TD
 ></TR
 ></TABLE
 ></DIV
-><P
->	To enable Generic Group Security ("usebuggroups"):
+></DIV
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
+><A
+NAME="AEN1568">5.7.3. Template Formats</H2
+><P
+>&#13;        Some CGIs have the ability to use more than one template. For
+        example, buglist.cgi can output bug lists as RDF or two
+        different forms of HTML (complex and simple). (Try this out
+        by appending <TT
+CLASS="filename"
+>&#38;format=simple</TT
+> to a buglist.cgi
+        URL on your Bugzilla installation.) This
+        mechanism, called template 'formats', is extensible.
       </P
 ><P
-></P
-><OL
-TYPE="1"
-><LI
-><P
->	    Turn "On" "usebuggroups" in the "Edit Parameters" screen.
-	  </P
-></LI
-><LI
+>&#13;        To see if a CGI supports multiple output formats, grep the
+        CGI for "ValidateOutputFormat". If it's not present, adding
+        multiple format support isn't too hard - see how it's done in
+        other CGIs.
+      </P
 ><P
->	    You will generally have no groups set up.  Select the
-	    "groups" link in the footer.
-	  </P
-></LI
-><LI
+>&#13;        To make a new format template for a CGI which supports this, 
+        open a current template for
+        that CGI and take note of the INTERFACE comment (if present.) This 
+        comment defines what variables are passed into this template. If 
+        there isn't one, I'm afraid you'll have to read the template and
+        the code to find out what information you get. 
+      </P
 ><P
->	    Take a moment to understand the instructions on the "Edit
-	    Groups" screen. Once you feel confident you understand
-	    what is expected of you, select the "Add Group" link.
-	  </P
-></LI
-><LI
+>&#13;        Write your template in whatever markup or text style is appropriate.
+      </P
 ><P
->	    Fill out the "New Name" (remember, no spaces!), "New
-	    Description", and "New User RegExp" fields.  "New User
-	    RegExp" allows you to automatically place all users who
-	    fulfill the Regular Expression into the new group.
-
-	    <DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN1575"
-></A
+>&#13;        You now need to decide what content type you want your template
+        served as. Open up the <TT
+CLASS="filename"
+>localconfig</TT
+> file and find the 
+        <TT
+CLASS="filename"
+>$contenttypes</TT
+>
+        variable. If your content type is not there, add it. Remember
+        the three- or four-letter tag assigned to you content type. 
+        This tag will be part of the template filename.
+      </P
 ><P
-><B
->Example 4-6. Creating a New Group</B
-></P
+>&#13;        Save the template as <TT
+CLASS="filename"
+>&#60;stubname&#62;-&#60;formatname&#62;.&#60;contenttypetag&#62;.tmpl</TT
+>. 
+        Try out the template by calling the CGI as 
+        <TT
+CLASS="filename"
+>&#60;cginame&#62;.cgi?format=&#60;formatname&#62;</TT
+> .
+      </P
+></DIV
 ><DIV
-CLASS="INFORMALEXAMPLE"
+CLASS="section"
+><HR><H2
+CLASS="section"
 ><A
-NAME="AEN1577"
-></A
+NAME="AEN1581">5.7.4. Particular Templates</H2
 ><P
-></P
+>&#13;        There are a few templates you may be particularly interested in
+        customising for your installation.
+      </P
 ><P
->		  I created a group called DefaultGroup with a
-		  description of <SPAN
-CLASS="QUOTE"
->"This is simply a group to play
-		  with"</SPAN
->, and a New User RegExp of <SPAN
-CLASS="QUOTE"
->".*@mydomain.tld"</SPAN
+>&#13;        <B
+CLASS="command"
+>index.html.tmpl</B
+>:
+        This is the Bugzilla front page.
+      </P
+><P
+>&#13;        <B
+CLASS="command"
+>global/header.html.tmpl</B
+>:
+        This defines the header that goes on all Bugzilla pages.
+        The header includes the banner, which is what appears to users
+        and is probably what you want to edit instead.  However the
+        header also includes the HTML HEAD section, so you could for
+        example add a stylesheet or META tag by editing the header.
+      </P
+><P
+>&#13;        <B
+CLASS="command"
+>global/banner.html.tmpl</B
+>:
+        This contains the "banner", the part of the header that appears
+        at the top of all Bugzilla pages.  The default banner is reasonably
+        barren, so you'll probably want to customise this to give your
+        installation a distinctive look and feel.  It is recommended you
+        preserve the Bugzilla version number in some form so the version 
+        you are running can be determined, and users know what docs to read.
+      </P
+><P
+>&#13;        <B
+CLASS="command"
+>global/footer.html.tmpl</B
+>:
+        This defines the footer that goes on all Bugzilla pages.  Editing
+        this is another way to quickly get a distinctive look and feel for
+        your Bugzilla installation.
+      </P
+><P
+>&#13;        <B
+CLASS="command"
+>bug/create/user-message.html.tmpl</B
+>:
+        This is a message that appears near the top of the bug reporting page.
+        By modifying this, you can tell your users how they should report
+        bugs.
+      </P
+><P
+>&#13;        <B
+CLASS="command"
+>bug/create/create.html.tmpl</B
+> and
+        <B
+CLASS="command"
+>bug/create/comment.txt.tmpl</B
+>:
+        You may wish to get bug submitters to give certain bits of structured
+        information, each in a separate input widget, for which there is not a
+        field in the database. The bug entry system has been designed in an
+        extensible fashion to enable you to define arbitrary fields and widgets,
+        and have their values appear formatted in the initial
+        Description, rather than in database fields. An example of this
+        is the mozilla.org 
+        <A
+HREF="http://bugzilla.mozilla.org/enter_bug.cgi?format=guided"
+TARGET="_top"
+>guided 
+        bug submission form</A
 >.
-		  This new group automatically includes all Bugzilla
-		  users with "@mydomain.tld" at the end of their user id.
-		  When I finished, my new group was assigned bit #128.
-		</P
+      </P
 ><P
-></P
-></DIV
-></DIV
-> When you have finished, select the Add
-	    button.
-	  </P
-></LI
-></OL
+>&#13;        To make this work, create a custom template for 
+        <TT
+CLASS="filename"
+>enter_bug.cgi</TT
+> (the default template, on which you
+        could base it, is <TT
+CLASS="filename"
+>create.html.tmpl</TT
+>),
+        and either call it <TT
+CLASS="filename"
+>create.html.tmpl</TT
+> or use a format and
+        call it <TT
+CLASS="filename"
+>create-&#60;formatname&#62;.html.tmpl</TT
+>.
+        Put it in the <TT
+CLASS="filename"
+>custom/bug/create</TT
+>
+        directory. In it, add widgets for each piece of information you'd like
+        collected - such as a build number, or set of steps to reproduce.
+      </P
 ><P
->	To enable Product-Based Group Security (usebuggroupsentry):
+>&#13;        Then, create a template like 
+        <TT
+CLASS="filename"
+>custom/bug/create/comment.txt.tmpl</TT
+>, also named
+        after your format if you are using one, which
+        references the form fields you have created. When a bug report is
+        submitted, the initial comment attached to the bug report will be
+        formatted according to the layout of this template.
       </P
-><DIV
-CLASS="WARNING"
 ><P
-></P
-><TABLE
-CLASS="WARNING"
-WIDTH="100%"
+>&#13;        For example, if your enter_bug template had a field
+        <TABLE
 BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
 ><TR
 ><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/warning.gif"
-HSPACE="5"
-ALT="Warning"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	  Don't forget that you only have 64 groups masks available,
-	  total, for your installation of Bugzilla!  If you plan on
-	  having more than 50 products in your individual Bugzilla
-	  installation, and require group security for your products,
-	  you should consider either running multiple Bugzillas or
-	  using Generic Group Security instead of Product-Based
-	  ("usebuggroupsentry") Group Security.
-	</P
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+>&#60;input type="text" name="buildid" size="30"&#62;</PRE
+></FONT
 ></TD
 ></TR
 ></TABLE
-></DIV
-><P
-></P
-><OL
-TYPE="1"
-><LI
-><P
->	    Turn "On" "usebuggroups" and "usebuggroupsentry" in the
-	    "Edit Parameters" screen.
-	  </P
-><DIV
-CLASS="WARNING"
-><P
-></P
-><TABLE
-CLASS="WARNING"
-WIDTH="90%"
+>
+        and then your comment.txt.tmpl had
+        <TABLE
 BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
 ><TR
 ><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/warning.gif"
-HSPACE="5"
-ALT="Warning"></TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+>BuildID: [% form.buildid %]</PRE
+></FONT
+></TD
+></TR
+></TABLE
+>
+        then
+        <TABLE
+BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
+><TR
 ><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	      "usebuggroupsentry" has the capacity to prevent the
-	      administrative user from directly altering bugs because
-	      of conflicting group permissions. If you plan on using
-	      "usebuggroupsentry", you should plan on restricting
-	      administrative account usage to administrative duties
-	      only. In other words, manage bugs with an unpriveleged
-	      user account, and manage users, groups, Products, etc.
-	      with the administrative account.
-	    </P
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+>BuildID: 20020303</PRE
+></FONT
 ></TD
 ></TR
 ></TABLE
-></DIV
-></LI
-><LI
-><P
->	    You will generally have no Groups set up, unless you
-	    enabled "usebuggroupsentry" prior to creating any
-	    Products.  To create "Generic Group Security" groups,
-	    follow the instructions given above.  To create
-	    Product-Based Group security, simply follow the
-	    instructions for creating a new Product.  If you need to
-	    add users to these new groups as you create them, you will
-	    find the option to add them to the group available under
-	    the "Edit User" screens.
-	  </P
-></LI
-></OL
-><P
->	You may find this example illustrative for how bug groups work.
-	<DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN1592"
-></A
-><P
-><B
->Example 4-7. Bugzilla Groups</B
-></P
-><P
-CLASS="LITERALLAYOUT"
->Bugzilla&nbsp;Groups&nbsp;example<br>
------------------------<br>
-<br>
-For&nbsp;this&nbsp;example,&nbsp;let&nbsp;us&nbsp;suppose&nbsp;we&nbsp;have&nbsp;four&nbsp;groups,&nbsp;call&nbsp;them<br>
-Group1,&nbsp;Group2,&nbsp;Group3,&nbsp;and&nbsp;Group4.<br>
-<br>
-We&nbsp;have&nbsp;5&nbsp;users,&nbsp;User1,&nbsp;User2,&nbsp;User3,&nbsp;User4,&nbsp;User5.<br>
-<br>
-We&nbsp;have&nbsp;8&nbsp;bugs,&nbsp;Bug1,&nbsp;...,&nbsp;Bug8.<br>
-<br>
-Group&nbsp;membership&nbsp;is&nbsp;defined&nbsp;by&nbsp;this&nbsp;chart:<br>
-(X&nbsp;denotes&nbsp;that&nbsp;user&nbsp;is&nbsp;in&nbsp;that&nbsp;group.)<br>
-(I&nbsp;apologize&nbsp;for&nbsp;the&nbsp;nasty&nbsp;formatting&nbsp;of&nbsp;this&nbsp;table.&nbsp;&nbsp;Try&nbsp;viewing<br>
-it&nbsp;in&nbsp;a&nbsp;text-based&nbsp;browser&nbsp;or&nbsp;something&nbsp;for&nbsp;now.&nbsp;-MPB)<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G&nbsp;G&nbsp;G&nbsp;G<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;r&nbsp;r&nbsp;r<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;o&nbsp;o&nbsp;o<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u&nbsp;u&nbsp;u&nbsp;u<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;p&nbsp;p&nbsp;p<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;2&nbsp;3&nbsp;4<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-User1|X|&nbsp;|&nbsp;|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-User2|&nbsp;|X|&nbsp;|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-User3|X|&nbsp;|X|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-User4|X|X|X|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-User5|&nbsp;|&nbsp;|&nbsp;|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-<br>
-Bug&nbsp;restrictions&nbsp;are&nbsp;defined&nbsp;by&nbsp;this&nbsp;chart:<br>
-(X&nbsp;denotes&nbsp;that&nbsp;bug&nbsp;is&nbsp;restricted&nbsp;to&nbsp;that&nbsp;group.)<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G&nbsp;G&nbsp;G&nbsp;G<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;r&nbsp;r&nbsp;r<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;o&nbsp;o&nbsp;o<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u&nbsp;u&nbsp;u&nbsp;u<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;p&nbsp;p&nbsp;p<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;2&nbsp;3&nbsp;4<br>
-&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-Bug1|&nbsp;|&nbsp;|&nbsp;|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-Bug2|&nbsp;|X|&nbsp;|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-Bug3|&nbsp;|&nbsp;|X|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-Bug4|&nbsp;|&nbsp;|&nbsp;|X|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-Bug5|X|X|&nbsp;|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-Bug6|X|&nbsp;|X|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-Bug7|X|X|X|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-Bug8|X|X|X|X|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-<br>
-Who&nbsp;can&nbsp;see&nbsp;each&nbsp;bug?<br>
-<br>
-Bug1&nbsp;has&nbsp;no&nbsp;group&nbsp;restrictions.&nbsp;&nbsp;Therefore,&nbsp;Bug1&nbsp;can&nbsp;be&nbsp;seen&nbsp;by&nbsp;any<br>
-user,&nbsp;whatever&nbsp;their&nbsp;group&nbsp;membership.&nbsp;&nbsp;This&nbsp;is&nbsp;going&nbsp;to&nbsp;be&nbsp;the&nbsp;only<br>
-bug&nbsp;that&nbsp;User5&nbsp;can&nbsp;see,&nbsp;because&nbsp;User5&nbsp;isn't&nbsp;in&nbsp;any&nbsp;groups.<br>
-<br>
-Bug2&nbsp;can&nbsp;be&nbsp;seen&nbsp;by&nbsp;anyone&nbsp;in&nbsp;Group2,&nbsp;that&nbsp;is&nbsp;User2&nbsp;and&nbsp;User4.<br>
-<br>
-Bug3&nbsp;can&nbsp;be&nbsp;seen&nbsp;by&nbsp;anyone&nbsp;in&nbsp;Group3,&nbsp;that&nbsp;is&nbsp;User3&nbsp;and&nbsp;User4.<br>
-<br>
-Bug4&nbsp;can&nbsp;be&nbsp;seen&nbsp;by&nbsp;anyone&nbsp;in&nbsp;Group4.&nbsp;&nbsp;Nobody&nbsp;is&nbsp;in&nbsp;Group4,&nbsp;so&nbsp;none&nbsp;of<br>
-these&nbsp;users&nbsp;can&nbsp;see&nbsp;Bug4.<br>
-<br>
-Bug5&nbsp;can&nbsp;be&nbsp;seen&nbsp;by&nbsp;anyone&nbsp;who&nbsp;is&nbsp;in&nbsp;_both_&nbsp;Group1&nbsp;and&nbsp;Group2.&nbsp;&nbsp;This<br>
-is&nbsp;only&nbsp;User4.&nbsp;&nbsp;User1&nbsp;cannot&nbsp;see&nbsp;it&nbsp;because&nbsp;he&nbsp;is&nbsp;not&nbsp;in&nbsp;Group2,&nbsp;and<br>
-User2&nbsp;cannot&nbsp;see&nbsp;it&nbsp;because&nbsp;she&nbsp;is&nbsp;not&nbsp;in&nbsp;Group1.<br>
-<br>
-Bug6&nbsp;can&nbsp;be&nbsp;seen&nbsp;by&nbsp;anyone&nbsp;who&nbsp;is&nbsp;in&nbsp;both&nbsp;Group1&nbsp;and&nbsp;Group3.&nbsp;&nbsp;This<br>
-would&nbsp;include&nbsp;User3&nbsp;and&nbsp;User4.&nbsp;&nbsp;Similar&nbsp;to&nbsp;Bug5,&nbsp;User1&nbsp;cannot&nbsp;see&nbsp;Bug6<br>
-because&nbsp;he&nbsp;is&nbsp;not&nbsp;in&nbsp;Group3.<br>
-<br>
-Bug7&nbsp;can&nbsp;be&nbsp;seen&nbsp;by&nbsp;anyone&nbsp;who&nbsp;is&nbsp;in&nbsp;Group1,&nbsp;Group2,&nbsp;and&nbsp;Group3.&nbsp;&nbsp;This<br>
-is&nbsp;only&nbsp;User4.&nbsp;&nbsp;All&nbsp;of&nbsp;the&nbsp;others&nbsp;are&nbsp;missing&nbsp;at&nbsp;least&nbsp;one&nbsp;of&nbsp;those<br>
-group&nbsp;priveleges,&nbsp;and&nbsp;thus&nbsp;cannot&nbsp;see&nbsp;the&nbsp;bug.<br>
-<br>
-Bug8&nbsp;can&nbsp;be&nbsp;seen&nbsp;by&nbsp;anyone&nbsp;who&nbsp;is&nbsp;in&nbsp;Group1,&nbsp;Group2,&nbsp;Group3,&nbsp;and<br>
-Group4.&nbsp;&nbsp;There&nbsp;is&nbsp;nobody&nbsp;in&nbsp;all&nbsp;four&nbsp;of&nbsp;these&nbsp;groups,&nbsp;so&nbsp;nobody&nbsp;can<br>
-see&nbsp;Bug8.&nbsp;&nbsp;It&nbsp;doesn't&nbsp;matter&nbsp;that&nbsp;User4&nbsp;is&nbsp;in&nbsp;Group1,&nbsp;Group2,&nbsp;and<br>
-Group3,&nbsp;since&nbsp;he&nbsp;isn't&nbsp;in&nbsp;Group4.<br>
-	&nbsp;&nbsp;</P
-></DIV
 >
+        would appear in the initial checkin comment.
       </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H1
-CLASS="SECTION"
-><A
-NAME="SECURITY"
->4.4. Bugzilla Security</A
-></H1
-><TABLE
-BORDER="0"
-WIDTH="100%"
-CELLSPACING="0"
-CELLPADDING="0"
-CLASS="EPIGRAPH"
-><TR
-><TD
-WIDTH="45%"
->&nbsp;</TD
-><TD
-WIDTH="45%"
-ALIGN="LEFT"
-VALIGN="TOP"
-><I
-><P
-><I
->Putting your money in a wall safe is better protection than
-	depending on the fact that no one knows that you hide your
-	money in a mayonnaise jar in your fridge.</I
-></P
-></I
-></TD
-></TR
-></TABLE
-><DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	Poorly-configured MySQL, Bugzilla, and FTP installations have
-	given attackers full access to systems in the past.  Please
-	take these guidelines seriously, even for Bugzilla machines
-	hidden away behind your firewall.  80% of all computer
-	trespassers are insiders, not anonymous crackers.
-      </P
-></TD
-></TR
-></TABLE
-></DIV
-><P
->      Secure your installation.
-      <DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	  These instructions must, of necessity, be somewhat vague
-	  since Bugzilla runs on so many different platforms.  If you
-	  have refinements of these directions for specific platforms,
-	  please submit them to <A
-HREF="mailto://mozilla-webtools@mozilla.org"
-TARGET="_top"
->mozilla-webtools@mozilla.org</A
->
-	</P
-></TD
-></TR
-></TABLE
-></DIV
->
-      <P
-></P
-><OL
-TYPE="1"
-><LI
-><P
->	    Ensure you are running at least MysQL version 3.22.32 or
-	    newer.  Earlier versions had notable security holes and
-	    poorly secured default configuration choices.
-	  </P
-></LI
-><LI
-><P
-><EM
->There is no substitute for understanding the
-	      tools on your system!</EM
-> Read <A
-HREF="http://www.mysql.com/documentation/mysql/bychapter/manual_Privilege_system.html"
-TARGET="_top"
-> The MySQL Privilege System</A
-> until you can recite it from memory!</P
-><P
->	    At the very least, ensure you password the "mysql -u root"
-	    account and the "bugs" account, establish grant table
-	    rights (consult the Keystone guide in Appendix C: The
-	    Bugzilla Database for some easy-to-use details) that do
-	    not allow CREATE, DROP, RELOAD, SHUTDOWN, and PROCESS for
-	    user "bugs".  I wrote up the Keystone advice back when I
-	    knew far less about security than I do now : )
-	  </P
-></LI
-><LI
-><P
->	    Lock down /etc/inetd.conf.  Heck, disable inet entirely on
-	    this box.  It should only listen to port 25 for Sendmail
-	    and port 80 for Apache.
-	  </P
-></LI
-><LI
-><P
->	    Do not run Apache as <SPAN
-CLASS="QUOTE"
->"nobody"</SPAN
->.  This will
-	    require very lax permissions in your Bugzilla directories.
-	    Run it, instead, as a user with a name, set via your
-	    httpd.conf file.
-	    <DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="90%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->		<SPAN
-CLASS="QUOTE"
->"nobody"</SPAN
-> is a real user on UNIX systems.
-		Having a process run as user id <SPAN
-CLASS="QUOTE"
->"nobody"</SPAN
->
-		is absolutely no protection against system crackers
-		versus using any other user account.  As a general
-		security measure, I recommend you create unique user
-		ID's for each daemon running on your system and, if
-		possible, use "chroot" to jail that process away from
-		the rest of your system.
-	      </P
-></TD
-></TR
-></TABLE
-></DIV
->
-	  </P
-></LI
-><LI
-><P
->	    Ensure you have adequate access controls for the
-	    $BUGZILLA_HOME/data/ and $BUGZILLA_HOME/shadow/
-	    directories, as well as the $BUGZILLA_HOME/localconfig and
-	    $BUGZILLA_HOME/globals.pl files. The localconfig file
-	    stores your "bugs" user password, which would be terrible
-	    to have in the hands of a criminal, while the "globals.pl"
-	    stores some default information regarding your
-	    installation which could aid a system cracker. In
-	    addition, some files under $BUGZILLA_HOME/data/ store
-	    sensitive information, and $BUGZILLA_HOME/shadow/ stores
-	    bug information for faster retrieval.  If you fail to
-	    secure these directories and this file, you will expose
-	    bug information to those who may not be allowed to see it.
-	  </P
-><DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="90%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	      Bugzilla provides default .htaccess files to protect the
-	      most common Apache installations.  However, you should
-	      verify these are adequate according to the site-wide
-	      security policy of your web server, and ensure that the
-	      .htaccess files are allowed to "override" default
-	      permissions set in your Apache configuration files.
-	      Covering Apache security is beyond the scope of this
-	      Guide; please consult the Apache documentation for
-	      details.
-	    </P
-><P
->	      If you are using a web server that does not support the
-	      .htaccess control method, <EM
->you are at
-		risk!</EM
->  After installing, check to see if
-	      you can view the file "localconfig" in your web browser
-	      (e.g.:  <A
-HREF="http://bugzilla.mozilla.org/localconfig"
-TARGET="_top"
-> http://bugzilla.mozilla.org/localconfig</A
->).  If you can read the contents of this file, your web server has not secured your bugzilla directory properly and you must fix this problem before deploying Bugzilla.  If, however, it gives you a "Forbidden" error, then it probably respects the .htaccess conventions and you are good to go.
-	    </P
-></TD
-></TR
-></TABLE
-></DIV
-><P
->	    On Apache, you can use .htaccess files to protect access
-	    to these directories, as outlined in <A
-HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=57161"
-TARGET="_top"
->Bug 57161</A
-> for the localconfig file, and <A
-HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=65572"
-TARGET="_top"
-> Bug 65572</A
-> for adequate protection in your data/ and shadow/ directories.
-	  </P
-><P
->	    Note the instructions which follow are Apache-specific.
-	    If you use IIS, Netscape, or other non-Apache web servers,
-	    please consult your system documentation for how to secure
-	    these files from being transmitted to curious users.
-	  </P
-><P
->	    Place the following text into a file named ".htaccess",
-	    readable by your web server, in your $BUGZILLA_HOME/data
-	    directory. <P
-CLASS="LITERALLAYOUT"
->&nbsp;&#60;Files&nbsp;comments&#62;&nbsp;allow<br>
-	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;all&nbsp;&#60;/Files&#62;&nbsp;deny&nbsp;from&nbsp;all&nbsp;</P
->
-	  </P
+CLASS="section"
+><A
+NAME="upgrading">5.8. Upgrading to New Releases</H1
+><P
+>A plain Bugzilla is fairly easy to upgrade from one version to a
+    newer one. Always read the release notes to see if there are any issues
+    that you might need to take note of. It is recommended that you take a 
+    backup of your database and your entire Bugzilla installation before attempting an
+    upgrade. You can upgrade a 'clean' installation by untarring a new
+    tarball over the old installation. If you are upgrading from 2.12 or
+    later, and have cvs installed, you can type <TT
+CLASS="filename"
+>cvs -z3 update</TT
+>, 
+    and resolve conflicts if there are any.
+    </P
 ><P
->	    Place the following text into a file named ".htaccess",
-	    readable by your web server, in your $BUGZILLA_HOME/
-	    directory. <P
-CLASS="LITERALLAYOUT"
->&nbsp;&#60;Files&nbsp;localconfig&#62;&nbsp;deny<br>
-	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;all&nbsp;&#60;/Files&#62;&nbsp;allow&nbsp;from&nbsp;all&nbsp;</P
->
-	  </P
+>However, things get a bit more complicated if you've made
+    changes to Bugzilla's code. In this case, you may have to re-make or
+    reapply those changes. One good method is to take a diff of your customised
+    version against the original, so you can survey all that you've changed.
+    Hopefully, templatisation will reduce the need for
+    this in the future.</P
+><P
+>From version 2.8 onwards, Bugzilla databases can be automatically
+    carried forward during an upgrade. However, because the developers of
+    Bugzilla are constantly adding new
+    tables, columns and fields, you'll probably get SQL errors if you just
+    update the code and attempt to use Bugzilla. Always run the
+    <TT
+CLASS="filename"
+>checksetup.pl</TT
+> 
+    script whenever you upgrade your installation.</P
 ><P
->	    Place the following text into a file named ".htaccess",
-	    readable by your web server, in your $BUGZILLA_HOME/shadow
-	    directory. <P
-CLASS="LITERALLAYOUT"
->&nbsp;deny&nbsp;from&nbsp;all&nbsp;</P
->
-	  </P
-></LI
-></OL
->
-    </P
-></DIV
+>If you are running Bugzilla version 2.8 or lower, and wish to
+    upgrade to the latest version, please consult the file,
+    "UPGRADING-pre-2.8" in the Bugzilla root directory after untarring the
+    archive.</P
 ></DIV
 ><DIV
-CLASS="CHAPTER"
+CLASS="section"
 ><HR><H1
+CLASS="section"
 ><A
-NAME="INTEGRATION"
->Chapter 5. Integrating Bugzilla with Third-Party Tools</A
-></H1
+NAME="integration">5.9. Integrating Bugzilla with Third-Party Tools</H1
 ><DIV
-CLASS="SECTION"
-><H1
-CLASS="SECTION"
+CLASS="section"
+><H2
+CLASS="section"
 ><A
-NAME="BONSAI"
->5.1. Bonsai</A
-></H1
+NAME="bonsai">5.9.1. Bonsai</H2
 ><P
->Bonsai is a web-based tool for managing <A
-HREF="#CVS"
+>Bonsai is a web-based tool for managing 
+    <A
+HREF="#cvs"
 >CVS, the Concurrent Versioning System</A
 >
-      .  Using Bonsai, administrators can control open/closed status
-      of trees, query a fast relational database back-end for change,
-      branch, and comment information, and view changes made since the
-      last time the tree was closed.  These kinds of changes cause the
-      engineer responsible to be <SPAN
-CLASS="QUOTE"
->"on the hook"</SPAN
-> (include
-      cool URL link here for Hook policies at mozilla.org).  Bonsai
-      also includes gateways to <A
-HREF="#TINDERBOX"
+
+    . Using Bonsai, administrators can control open/closed status of trees,
+    query a fast relational database back-end for change, branch, and comment
+    information, and view changes made since the last time the tree was
+    closed. Bonsai
+    also integrates with  
+    <A
+HREF="#tinderbox"
 >Tinderbox, the Mozilla automated build management system</A
-> and Bugzilla </P
+>.
+    </P
 ></DIV
 ><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
+CLASS="section"
+><HR><H2
+CLASS="section"
 ><A
-NAME="CVS"
->5.2. CVS</A
-></H1
-><P
->CVS integration is best accomplished, at this point, using
-      the Bugzilla Email Gateway.  There have been some files
-      submitted to allow greater CVS integration, but we need to make
-      certain that Bugzilla is not tied into one particular software
-      management package.</P
-><P
->      Follow the instructions in the FAQ for enabling Bugzilla e-mail
-      integration.  Ensure that your check-in script sends an email to
-      your Bugzilla e-mail gateway with the subject of <SPAN
+NAME="cvs">5.9.2. CVS</H2
+><P
+>CVS integration is best accomplished, at this point, using the
+    Bugzilla Email Gateway.</P
+><P
+>Follow the instructions in this Guide for enabling Bugzilla e-mail
+    integration. Ensure that your check-in script sends an email to your
+    Bugzilla e-mail gateway with the subject of 
+    <SPAN
 CLASS="QUOTE"
->"[Bug
-	XXXX]"</SPAN
->, and you can have CVS check-in comments append
-      to your Bugzilla bug.  If you have your check-in script include
-      an @resolution field, you can even change the Bugzilla bug
-      state.
-    </P
+>"[Bug XXXX]"</SPAN
+>, 
+    and you can have CVS check-in comments append to your Bugzilla bug. If
+    you have your check-in script include an @resolution field, you can even
+    change the Bugzilla bug state.</P
 ><P
->      There is also a project, based upon somewhat dated Bugzilla
-      code, to integrate CVS and Bugzilla through CVS' ability to
-      email.  Check it out at:
-      <A
+>There is also a CVSZilla project, based upon somewhat dated 
+    Bugzilla code, to integrate CVS and Bugzilla through CVS' ability to 
+    email. Check it out at: 
+    <A
 HREF="http://homepages.kcbbs.gen.nz/~tonyg/"
 TARGET="_top"
->      http://homepages.kcbbs.gen.nz/~tonyg/</A
->, under the
-      <SPAN
-CLASS="QUOTE"
->"cvszilla"</SPAN
-> link.
+>&#13;    http://homepages.kcbbs.gen.nz/~tonyg/</A
+>.
     </P
 ></DIV
 ><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
+CLASS="section"
+><HR><H2
+CLASS="section"
 ><A
-NAME="SCM"
->5.3. Perforce SCM</A
-></H1
+NAME="scm">5.9.3. Perforce SCM</H2
 ><P
->      You can find the project page for Bugzilla and Teamtrack
-      Perforce integration (p4dti) at: <A
+>You can find the project page for Bugzilla and Teamtrack Perforce
+    integration (p4dti) at: 
+    <A
 HREF="http://www.ravenbrook.com/project/p4dti/"
 TARGET="_top"
-> http://www.ravenbrook.com/project/p4dti</A
-> .  <SPAN
+>&#13;    http://www.ravenbrook.com/project/p4dti</A
+>
+
+    . 
+    <SPAN
 CLASS="QUOTE"
 >"p4dti"</SPAN
-> is now an officially supported product from Perforce, and you can find the "Perforce Public Depot" p4dti page at <A
+>
+
+    is now an officially supported product from Perforce, and you can find
+    the "Perforce Public Depot" p4dti page at 
+    <A
 HREF="http://public.perforce.com/public/perforce/p4dti/index.html"
 TARGET="_top"
-> http://public.perforce.com/public/perforce/p4dti/index.html</A
->.
-    </P
+>&#13;    http://public.perforce.com/public/perforce/p4dti/index.html</A
+>
+
+    .</P
 ><P
->      Integration of Perforce with Bugzilla, once patches are applied,
-      is seamless.  Perforce replication information will appear below
-      the comments of each bug.  Be certain you have a matching set of
-      patches for the Bugzilla version you are installing.  p4dti is
-      designed to support multiple defect trackers, and maintains its
-      own documentation for it. Please consult the pages linked above
-      for further information.
-    </P
+>Integration of Perforce with Bugzilla, once patches are applied, is
+    seamless. Perforce replication information will appear below the comments
+    of each bug. Be certain you have a matching set of patches for the
+    Bugzilla version you are installing. p4dti is designed to support
+    multiple defect trackers, and maintains its own documentation for it.
+    Please consult the pages linked above for further information.</P
 ></DIV
 ><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
+CLASS="section"
+><HR><H2
+CLASS="section"
 ><A
-NAME="TINDERBOX"
->5.4. Tinderbox/Tinderbox2</A
-></H1
+NAME="tinderbox">5.9.4. Tinderbox/Tinderbox2</H2
 ><P
 >We need Tinderbox integration information.</P
 ></DIV
 ></DIV
+></DIV
 ><DIV
-CLASS="CHAPTER"
+CLASS="appendix"
 ><HR><H1
 ><A
-NAME="FUTURE"
->Chapter 6. The Future of Bugzilla</A
-></H1
-><TABLE
-BORDER="0"
-BGCOLOR="#6495ED"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="SYNOPSIS"
->Bugzilla's Future.  Much of this is the present, now.</PRE
-></FONT
-></TD
-></TR
-></TABLE
-><P
->  Bugzilla's future is a constantly-changing thing, as various developers
-  <SPAN
-CLASS="QUOTE"
->"scratch an itch"</SPAN
-> when it comes to functionality.
-  Thus this section is very malleable, subject to change without notice, etc.
-  You'll probably also notice the lack of formatting.  I apologize that it's
-  not quite as readable as the rest of the Guide.
-    </P
+NAME="faq">Appendix A. The Bugzilla FAQ</H1
 ><P
->    <P
-CLASS="LITERALLAYOUT"
->&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bugzilla&nbsp;Blue&nbsp;Sky<br>
-<br>
-Customisability<br>
-<br>
-&nbsp;&nbsp;&nbsp;One&nbsp;of&nbsp;the&nbsp;major&nbsp;stumbling&nbsp;blocks&nbsp;of&nbsp;Bugzilla&nbsp;has&nbsp;been&nbsp;that&nbsp;it&nbsp;is&nbsp;too<br>
-&nbsp;&nbsp;&nbsp;rigid&nbsp;and&nbsp;does&nbsp;not&nbsp;adapt&nbsp;itself&nbsp;well&nbsp;enough&nbsp;to&nbsp;the&nbsp;needs&nbsp;of&nbsp;an<br>
-&nbsp;&nbsp;&nbsp;organisation.&nbsp;&nbsp;This&nbsp;has&nbsp;led&nbsp;to&nbsp;organisations&nbsp;making&nbsp;changes&nbsp;to&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;Bugzilla&nbsp;code&nbsp;that&nbsp;need&nbsp;to&nbsp;be&nbsp;redone&nbsp;each&nbsp;new&nbsp;version&nbsp;of&nbsp;Bugzilla.<br>
-&nbsp;&nbsp;&nbsp;Bugzilla&nbsp;should&nbsp;attempt&nbsp;to&nbsp;move&nbsp;away&nbsp;from&nbsp;this&nbsp;to&nbsp;a&nbsp;world&nbsp;where&nbsp;this<br>
-&nbsp;&nbsp;&nbsp;doesn't&nbsp;need&nbsp;to&nbsp;occur.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Most&nbsp;of&nbsp;the&nbsp;subsections&nbsp;in&nbsp;this&nbsp;section&nbsp;are&nbsp;currently&nbsp;explicit&nbsp;design<br>
-&nbsp;&nbsp;&nbsp;goals&nbsp;for&nbsp;the&nbsp;"Bugzilla&nbsp;3"&nbsp;rewrite.&nbsp;&nbsp;This&nbsp;does&nbsp;not&nbsp;necessarily&nbsp;mean<br>
-&nbsp;&nbsp;&nbsp;that&nbsp;they&nbsp;will&nbsp;not&nbsp;occur&nbsp;before&nbsp;them&nbsp;in&nbsp;Bugzilla&nbsp;2,&nbsp;but&nbsp;most&nbsp;are<br>
-&nbsp;&nbsp;&nbsp;significant&nbsp;undertakings.<br>
-<br>
-&nbsp;&nbsp;Field&nbsp;Customisation<br>
-<br>
-&nbsp;&nbsp;&nbsp;Many&nbsp;installations&nbsp;wish&nbsp;to&nbsp;customise&nbsp;the&nbsp;fields&nbsp;that&nbsp;appear&nbsp;on&nbsp;bug<br>
-&nbsp;&nbsp;&nbsp;reports.&nbsp;&nbsp;&nbsp;Current&nbsp;versions&nbsp;of&nbsp;Bugzilla&nbsp;offer&nbsp;limited<br>
-&nbsp;&nbsp;&nbsp;customisability.&nbsp;&nbsp;In&nbsp;particular,&nbsp;some&nbsp;fields&nbsp;can&nbsp;be&nbsp;turned&nbsp;off.<br>
-<br>
-&nbsp;&nbsp;&nbsp;However,&nbsp;many&nbsp;administrators&nbsp;wish&nbsp;to&nbsp;add&nbsp;their&nbsp;own&nbsp;fields,&nbsp;and&nbsp;rename<br>
-&nbsp;&nbsp;&nbsp;or&nbsp;otherwise&nbsp;modify&nbsp;existing&nbsp;fields.&nbsp;&nbsp;An&nbsp;architecture&nbsp;that&nbsp;supports<br>
-&nbsp;&nbsp;&nbsp;this&nbsp;would&nbsp;be&nbsp;extraordinarily&nbsp;useful.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Indeed,&nbsp;many&nbsp;fields&nbsp;work&nbsp;similarly&nbsp;and&nbsp;could&nbsp;be&nbsp;abstracted&nbsp;into&nbsp;"field<br>
-&nbsp;&nbsp;&nbsp;types",&nbsp;so&nbsp;that&nbsp;an&nbsp;administrator&nbsp;need&nbsp;write&nbsp;little&nbsp;or&nbsp;no&nbsp;code&nbsp;to<br>
-&nbsp;&nbsp;&nbsp;support&nbsp;the&nbsp;new&nbsp;fields&nbsp;they&nbsp;desire.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Possible&nbsp;field&nbsp;types&nbsp;include&nbsp;text&nbsp;(eg&nbsp;status&nbsp;whiteboard),&nbsp;numbers,<br>
-&nbsp;&nbsp;&nbsp;dates&nbsp;(eg&nbsp;report&nbsp;time),&nbsp;accounts&nbsp;(eg&nbsp;reporter,&nbsp;qa,&nbsp;cc),&nbsp;inter-bug<br>
-&nbsp;&nbsp;&nbsp;relationships&nbsp;(dependencies,&nbsp;duplicates),&nbsp;option&nbsp;groups&nbsp;(platform,&nbsp;os,<br>
-&nbsp;&nbsp;&nbsp;severity,&nbsp;priority,&nbsp;target&nbsp;milestone,&nbsp;version)&nbsp;etc.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Ideally&nbsp;an&nbsp;administrator&nbsp;could&nbsp;configure&nbsp;their&nbsp;fields&nbsp;through&nbsp;a<br>
-&nbsp;&nbsp;&nbsp;Bugzilla&nbsp;interface&nbsp;that&nbsp;requires&nbsp;no&nbsp;code&nbsp;to&nbsp;be&nbsp;added.&nbsp;&nbsp;However,&nbsp;it&nbsp;is<br>
-&nbsp;&nbsp;&nbsp;highly&nbsp;unlikely&nbsp;this&nbsp;ideal&nbsp;will&nbsp;never&nbsp;be&nbsp;met,&nbsp;and&nbsp;in&nbsp;a&nbsp;similar&nbsp;way<br>
-&nbsp;&nbsp;&nbsp;that&nbsp;office&nbsp;applications&nbsp;have&nbsp;scripting&nbsp;languages,&nbsp;Bugzilla&nbsp;should<br>
-&nbsp;&nbsp;&nbsp;allow&nbsp;new&nbsp;field&nbsp;types&nbsp;to&nbsp;be&nbsp;written.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Similarly,&nbsp;a&nbsp;common&nbsp;desire&nbsp;is&nbsp;for&nbsp;resolutions&nbsp;to&nbsp;be&nbsp;added&nbsp;or&nbsp;removed.<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allocations<br>
-<br>
-&nbsp;&nbsp;&nbsp;?<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Option&nbsp;Groups<br>
-<br>
-&nbsp;&nbsp;&nbsp;?<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Relations<br>
-<br>
-&nbsp;&nbsp;&nbsp;?<br>
-<br>
-&nbsp;&nbsp;Database&nbsp;Integrity<br>
-<br>
-&nbsp;&nbsp;&nbsp;Furthermore,&nbsp;it&nbsp;is&nbsp;desirable&nbsp;for&nbsp;administrators&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;specify<br>
-&nbsp;&nbsp;&nbsp;rules&nbsp;that&nbsp;must&nbsp;or&nbsp;should&nbsp;apply&nbsp;between&nbsp;the&nbsp;fields&nbsp;on&nbsp;a&nbsp;bug&nbsp;report.<br>
-<br>
-&nbsp;&nbsp;&nbsp;For&nbsp;example,&nbsp;you&nbsp;might&nbsp;wish&nbsp;to&nbsp;specify&nbsp;that&nbsp;a&nbsp;bug&nbsp;with&nbsp;status&nbsp;ASSIGNED<br>
-&nbsp;&nbsp;&nbsp;must&nbsp;have&nbsp;a&nbsp;target&nbsp;milestone&nbsp;field&nbsp;that&nbsp;that&nbsp;is&nbsp;not&nbsp;untargetted.&nbsp;&nbsp;Or<br>
-&nbsp;&nbsp;&nbsp;that&nbsp;a&nbsp;bug&nbsp;with&nbsp;a&nbsp;certain&nbsp;number&nbsp;of&nbsp;votes&nbsp;should&nbsp;get&nbsp;ASSIGNED.&nbsp;&nbsp;Or<br>
-&nbsp;&nbsp;&nbsp;that&nbsp;the&nbsp;QA&nbsp;contact&nbsp;must&nbsp;be&nbsp;different&nbsp;from&nbsp;the&nbsp;assignee.<br>
-<br>
-&nbsp;&nbsp;&nbsp;"Must"&nbsp;relationships&nbsp;could&nbsp;be&nbsp;implemented&nbsp;by&nbsp;refusing&nbsp;to&nbsp;make&nbsp;changes<br>
-&nbsp;&nbsp;&nbsp;that&nbsp;violate&nbsp;the&nbsp;relationships,&nbsp;or&nbsp;alternatively,&nbsp;automatically<br>
-&nbsp;&nbsp;&nbsp;updating&nbsp;certain&nbsp;fields&nbsp;in&nbsp;order&nbsp;to&nbsp;satisfy&nbsp;the&nbsp;criteria.&nbsp;&nbsp;Which<br>
-&nbsp;&nbsp;&nbsp;occurs&nbsp;should&nbsp;be&nbsp;up&nbsp;to&nbsp;the&nbsp;administrator.<br>
-<br>
-&nbsp;&nbsp;&nbsp;"Should"&nbsp;relationships&nbsp;could&nbsp;be&nbsp;implemented&nbsp;by&nbsp;a&nbsp;combination&nbsp;of<br>
-&nbsp;&nbsp;&nbsp;emitting&nbsp;warnings&nbsp;on&nbsp;the&nbsp;process&nbsp;bug&nbsp;page,&nbsp;the&nbsp;same&nbsp;on&nbsp;notification<br>
-&nbsp;&nbsp;&nbsp;mails,&nbsp;or&nbsp;emitting&nbsp;periodic&nbsp;whine&nbsp;mails&nbsp;about&nbsp;the&nbsp;situation.&nbsp;&nbsp;Again,<br>
-&nbsp;&nbsp;&nbsp;which&nbsp;occurs&nbsp;should&nbsp;be&nbsp;up&nbsp;to&nbsp;the&nbsp;administrator.<br>
-<br>
-&nbsp;&nbsp;&nbsp;It&nbsp;should&nbsp;also&nbsp;be&nbsp;possible&nbsp;for&nbsp;whine&nbsp;mails&nbsp;to&nbsp;be&nbsp;emitted&nbsp;for&nbsp;"must"<br>
-&nbsp;&nbsp;&nbsp;relationships,&nbsp;as&nbsp;they&nbsp;might&nbsp;become&nbsp;violated&nbsp;through&nbsp;direct&nbsp;database<br>
-&nbsp;&nbsp;&nbsp;access,&nbsp;Bugzilla&nbsp;bugs,&nbsp;or&nbsp;because&nbsp;they&nbsp;were&nbsp;there&nbsp;before&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;relationship&nbsp;was&nbsp;enforced.<br>
-<br>
-&nbsp;&nbsp;&nbsp;As&nbsp;well&nbsp;as&nbsp;implementing&nbsp;intra-bug&nbsp;constraints,&nbsp;it&nbsp;would&nbsp;be&nbsp;useful&nbsp;to<br>
-&nbsp;&nbsp;&nbsp;create&nbsp;inter-bug&nbsp;constraints.&nbsp;&nbsp;For&nbsp;example,&nbsp;a&nbsp;bug&nbsp;that&nbsp;is&nbsp;dependent&nbsp;on<br>
-&nbsp;&nbsp;&nbsp;another&nbsp;bug&nbsp;should&nbsp;not&nbsp;have&nbsp;an&nbsp;earlier&nbsp;milestone&nbsp;or&nbsp;greater&nbsp;priority<br>
-&nbsp;&nbsp;&nbsp;than&nbsp;that&nbsp;bug.<br>
-<br>
-&nbsp;&nbsp;Database&nbsp;Adaptability<br>
-<br>
-&nbsp;&nbsp;&nbsp;Often&nbsp;an&nbsp;administrator&nbsp;desires&nbsp;that&nbsp;fields&nbsp;adapt&nbsp;to&nbsp;the&nbsp;values&nbsp;of<br>
-&nbsp;&nbsp;&nbsp;other&nbsp;fields.&nbsp;&nbsp;For&nbsp;example,&nbsp;the&nbsp;value&nbsp;of&nbsp;a&nbsp;field&nbsp;might&nbsp;determine&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;possible&nbsp;values&nbsp;of&nbsp;another&nbsp;field&nbsp;or&nbsp;even&nbsp;whether&nbsp;it&nbsp;appears&nbsp;(whether<br>
-&nbsp;&nbsp;&nbsp;it&nbsp;is&nbsp;"applicable").<br>
-<br>
-&nbsp;&nbsp;&nbsp;Limited&nbsp;adaptability&nbsp;is&nbsp;present&nbsp;in&nbsp;Bugzilla&nbsp;2,&nbsp;and&nbsp;only&nbsp;on&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;"Product"&nbsp;field:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;possible&nbsp;values&nbsp;of&nbsp;the&nbsp;target&nbsp;milestone,&nbsp;version&nbsp;and&nbsp;component<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fields&nbsp;depend&nbsp;on&nbsp;the&nbsp;product.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;UNCONFIRMED&nbsp;can&nbsp;be&nbsp;turned&nbsp;off&nbsp;for&nbsp;specific&nbsp;products.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Voting&nbsp;can&nbsp;be&nbsp;configured&nbsp;differently&nbsp;or&nbsp;turned&nbsp;off&nbsp;for&nbsp;different<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products,&nbsp;and&nbsp;there&nbsp;is&nbsp;a&nbsp;separate&nbsp;user&nbsp;vote&nbsp;limits&nbsp;for&nbsp;each<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product.<br>
-<br>
-&nbsp;&nbsp;&nbsp;It&nbsp;would&nbsp;be&nbsp;good&nbsp;if&nbsp;more&nbsp;adaptability&nbsp;was&nbsp;present,&nbsp;both&nbsp;in&nbsp;terms&nbsp;of<br>
-&nbsp;&nbsp;&nbsp;all&nbsp;fields&nbsp;relying&nbsp;on&nbsp;the&nbsp;product,&nbsp;as&nbsp;well&nbsp;as&nbsp;the&nbsp;ability&nbsp;to&nbsp;adapt<br>
-&nbsp;&nbsp;&nbsp;based&nbsp;on&nbsp;the&nbsp;value&nbsp;of&nbsp;all&nbsp;fields.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Example&nbsp;???<br>
-<br>
-&nbsp;&nbsp;&nbsp;General&nbsp;adaptability&nbsp;raises&nbsp;the&nbsp;issue&nbsp;of&nbsp;circular&nbsp;references&nbsp;between<br>
-&nbsp;&nbsp;&nbsp;fields&nbsp;causing&nbsp;problems.&nbsp;&nbsp;One&nbsp;possible&nbsp;solution&nbsp;to&nbsp;this&nbsp;is&nbsp;to&nbsp;place<br>
-&nbsp;&nbsp;&nbsp;the&nbsp;fields&nbsp;in&nbsp;a&nbsp;total&nbsp;ordering&nbsp;and&nbsp;require&nbsp;a&nbsp;field&nbsp;refer&nbsp;only&nbsp;to&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;previous&nbsp;fields.<br>
-<br>
-&nbsp;&nbsp;&nbsp;In&nbsp;Bugzilla&nbsp;2,&nbsp;changing&nbsp;the&nbsp;product&nbsp;of&nbsp;a&nbsp;bug&nbsp;meant&nbsp;a&nbsp;second&nbsp;page&nbsp;would<br>
-&nbsp;&nbsp;&nbsp;appear&nbsp;that&nbsp;allowed&nbsp;you&nbsp;to&nbsp;choose&nbsp;a&nbsp;new&nbsp;milestone,&nbsp;component&nbsp;and<br>
-&nbsp;&nbsp;&nbsp;version,&nbsp;as&nbsp;those&nbsp;fields&nbsp;adapted&nbsp;themselves&nbsp;to&nbsp;the&nbsp;new&nbsp;product.&nbsp;&nbsp;This<br>
-&nbsp;&nbsp;&nbsp;page&nbsp;could&nbsp;be&nbsp;generalised&nbsp;to&nbsp;support&nbsp;all&nbsp;instances&nbsp;where:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;a&nbsp;field&nbsp;value&nbsp;must&nbsp;or&nbsp;might&nbsp;be&nbsp;changed&nbsp;because&nbsp;the&nbsp;possible&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;have&nbsp;changed<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;is&nbsp;going&nbsp;to&nbsp;drop&nbsp;off&nbsp;because&nbsp;it&nbsp;it&nbsp;is&nbsp;no&nbsp;longer&nbsp;applicable,&nbsp;and<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this&nbsp;should&nbsp;be&nbsp;confirmed<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;must&nbsp;be&nbsp;specified&nbsp;because&nbsp;it&nbsp;is&nbsp;suddenly&nbsp;applicable,&nbsp;and&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;value,&nbsp;if&nbsp;one&nbsp;exists,&nbsp;might&nbsp;not&nbsp;be&nbsp;acceptable<br>
-<br>
-&nbsp;&nbsp;Database&nbsp;Independence<br>
-<br>
-&nbsp;&nbsp;&nbsp;Currently&nbsp;Bugzilla&nbsp;only&nbsp;runs&nbsp;on&nbsp;the&nbsp;MySQL&nbsp;database.&nbsp;&nbsp;It&nbsp;would&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;desirable&nbsp;for&nbsp;Bugzilla&nbsp;to&nbsp;run&nbsp;on&nbsp;other&nbsp;databases,&nbsp;because:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Organisations&nbsp;may&nbsp;have&nbsp;existing&nbsp;database&nbsp;products&nbsp;they&nbsp;use&nbsp;and<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;would&nbsp;prefer&nbsp;to&nbsp;run&nbsp;a&nbsp;homogenous&nbsp;environment.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Databases&nbsp;each&nbsp;have&nbsp;their&nbsp;own&nbsp;shortcomings,&nbsp;including&nbsp;MySQL.&nbsp;&nbsp;An<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;administrator&nbsp;might&nbsp;choose&nbsp;a&nbsp;database&nbsp;that&nbsp;would&nbsp;work&nbsp;better&nbsp;with<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;their&nbsp;Bugzilla.<br>
-<br>
-&nbsp;&nbsp;&nbsp;This&nbsp;raises&nbsp;the&nbsp;possibility&nbsp;that&nbsp;we&nbsp;could&nbsp;use&nbsp;features&nbsp;that&nbsp;are&nbsp;only<br>
-&nbsp;&nbsp;&nbsp;present&nbsp;in&nbsp;some&nbsp;databases,&nbsp;by&nbsp;appropriately&nbsp;falling&nbsp;back.&nbsp;&nbsp;For<br>
-&nbsp;&nbsp;&nbsp;example,&nbsp;in&nbsp;the&nbsp;MySQL&nbsp;world,&nbsp;we&nbsp;live&nbsp;without:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;record-level&nbsp;locking,&nbsp;instead&nbsp;we&nbsp;use&nbsp;table-level&nbsp;locking<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;referential&nbsp;and&nbsp;record&nbsp;constraints,&nbsp;instead&nbsp;we&nbsp;checking&nbsp;code<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;subselects,&nbsp;instead&nbsp;we&nbsp;use&nbsp;multiple&nbsp;queries&nbsp;and&nbsp;redundant&nbsp;"caches"<br>
-<br>
-&nbsp;&nbsp;Multiple&nbsp;Front&nbsp;Ends<br>
-<br>
-&nbsp;&nbsp;&nbsp;Currently&nbsp;Bugzilla&nbsp;is&nbsp;manipulated&nbsp;via&nbsp;the&nbsp;Web,&nbsp;and&nbsp;notifies&nbsp;via<br>
-&nbsp;&nbsp;&nbsp;E-Mail.&nbsp;&nbsp;It&nbsp;would&nbsp;be&nbsp;desirable&nbsp;for&nbsp;Bugzilla&nbsp;to&nbsp;easily&nbsp;support&nbsp;various<br>
-&nbsp;&nbsp;&nbsp;front&nbsp;ends.<br>
-<br>
-&nbsp;&nbsp;&nbsp;There&nbsp;is&nbsp;no&nbsp;reason&nbsp;that&nbsp;Bugzilla&nbsp;could&nbsp;not&nbsp;be&nbsp;controlled&nbsp;via&nbsp;a&nbsp;whole<br>
-&nbsp;&nbsp;&nbsp;range&nbsp;of&nbsp;front&nbsp;ends,&nbsp;including&nbsp;Web,&nbsp;E-Mail,&nbsp;IRC,&nbsp;ICQ,&nbsp;etc,&nbsp;and<br>
-&nbsp;&nbsp;&nbsp;similarly&nbsp;for&nbsp;how&nbsp;it&nbsp;notifies.&nbsp;&nbsp;It's&nbsp;also&nbsp;possible&nbsp;that&nbsp;we&nbsp;could<br>
-&nbsp;&nbsp;&nbsp;introduce&nbsp;a&nbsp;special&nbsp;Bugzilla&nbsp;client&nbsp;that&nbsp;uses&nbsp;its&nbsp;own&nbsp;protocol,&nbsp;for<br>
-&nbsp;&nbsp;&nbsp;maximum&nbsp;user&nbsp;productivity.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Indeed&nbsp;a&nbsp;request&nbsp;reply&nbsp;might&nbsp;be&nbsp;returned&nbsp;via&nbsp;a&nbsp;totally&nbsp;different<br>
-&nbsp;&nbsp;&nbsp;transport&nbsp;method&nbsp;than&nbsp;was&nbsp;use&nbsp;to&nbsp;submit&nbsp;the&nbsp;request.<br>
-<br>
-Internationalisation<br>
-<br>
-&nbsp;&nbsp;&nbsp;Bugzilla&nbsp;currently&nbsp;supports&nbsp;only&nbsp;English.&nbsp;&nbsp;All&nbsp;of&nbsp;the&nbsp;field&nbsp;names,<br>
-&nbsp;&nbsp;&nbsp;user&nbsp;instructions,&nbsp;etc&nbsp;are&nbsp;written&nbsp;in&nbsp;English.&nbsp;&nbsp;It&nbsp;would&nbsp;be&nbsp;desirable<br>
-&nbsp;&nbsp;&nbsp;to&nbsp;allow&nbsp;"language&nbsp;packs"&nbsp;so&nbsp;Bugzilla&nbsp;can&nbsp;be&nbsp;easily&nbsp;used&nbsp;in<br>
-&nbsp;&nbsp;&nbsp;non-English&nbsp;speaking&nbsp;locales.<br>
-<br>
-&nbsp;&nbsp;&nbsp;To&nbsp;a&nbsp;degree&nbsp;field&nbsp;customisation&nbsp;supports&nbsp;this,&nbsp;because&nbsp;administrators<br>
-&nbsp;&nbsp;&nbsp;could&nbsp;specify&nbsp;their&nbsp;own&nbsp;fields&nbsp;names&nbsp;anyway.&nbsp;&nbsp;However,&nbsp;there&nbsp;will<br>
-&nbsp;&nbsp;&nbsp;always&nbsp;be&nbsp;some&nbsp;basic&nbsp;facilities&nbsp;not&nbsp;covered&nbsp;by&nbsp;this,&nbsp;and&nbsp;it&nbsp;is<br>
-&nbsp;&nbsp;&nbsp;desirable&nbsp;that&nbsp;the&nbsp;administrator's&nbsp;interface&nbsp;also&nbsp;is<br>
-&nbsp;&nbsp;&nbsp;internationalisable.<br>
-<br>
-Better&nbsp;Searching<br>
-<br>
-&nbsp;&nbsp;General&nbsp;Summary&nbsp;Reports<br>
-<br>
-&nbsp;&nbsp;&nbsp;Sometimes,&nbsp;the&nbsp;normal&nbsp;querying&nbsp;page&nbsp;leaves&nbsp;a&nbsp;lot&nbsp;to&nbsp;be&nbsp;desired.&nbsp;&nbsp;There<br>
-&nbsp;&nbsp;&nbsp;are&nbsp;other&nbsp;facilities&nbsp;already&nbsp;in&nbsp;place&nbsp;or&nbsp;which&nbsp;people&nbsp;have&nbsp;asked&nbsp;for:<br>
-<br>
-&nbsp;&nbsp;&nbsp;Most&nbsp;Doomed&nbsp;Reports&nbsp;-&nbsp;All&nbsp;Bugs&nbsp;or&nbsp;All&nbsp;Bugs&nbsp;In&nbsp;A&nbsp;Product,&nbsp;Categorised<br>
-&nbsp;&nbsp;&nbsp;On&nbsp;Assignee,&nbsp;Shows&nbsp;and&nbsp;Counts&nbsp;Number&nbsp;of&nbsp;Bugs&nbsp;For&nbsp;Each&nbsp;Assignee<br>
-&nbsp;&nbsp;&nbsp;Most&nbsp;Voted&nbsp;For&nbsp;Bugs&nbsp;-&nbsp;All&nbsp;Bugs,&nbsp;Categorised&nbsp;On&nbsp;Product,&nbsp;Shows&nbsp;Top&nbsp;Ten<br>
-&nbsp;&nbsp;&nbsp;Bugs&nbsp;Voters&nbsp;Most&nbsp;Want&nbsp;Fixed<br>
-&nbsp;&nbsp;&nbsp;Number&nbsp;of&nbsp;Open&nbsp;Bugs&nbsp;For&nbsp;An&nbsp;Assignee&nbsp;-&nbsp;Bug&nbsp;List,&nbsp;Categorised&nbsp;On<br>
-&nbsp;&nbsp;&nbsp;Developers,&nbsp;Counts&nbsp;Number&nbsp;of&nbsp;Bugs&nbsp;In&nbsp;Category<br>
-<br>
-&nbsp;&nbsp;&nbsp;The&nbsp;important&nbsp;thing&nbsp;to&nbsp;realise&nbsp;is&nbsp;that&nbsp;people&nbsp;want&nbsp;categorised&nbsp;reports<br>
-&nbsp;&nbsp;&nbsp;on&nbsp;all&nbsp;sorts&nbsp;of&nbsp;things&nbsp;-&nbsp;a&nbsp;general&nbsp;summary&nbsp;report.<br>
-<br>
-&nbsp;&nbsp;&nbsp;In&nbsp;a&nbsp;categorised&nbsp;report,&nbsp;you&nbsp;choose&nbsp;the&nbsp;subset&nbsp;of&nbsp;bugs&nbsp;you&nbsp;wish&nbsp;to<br>
-&nbsp;&nbsp;&nbsp;operate&nbsp;on&nbsp;(similar&nbsp;to&nbsp;how&nbsp;you&nbsp;would&nbsp;specify&nbsp;a&nbsp;query),&nbsp;and&nbsp;then<br>
-&nbsp;&nbsp;&nbsp;categorise&nbsp;them&nbsp;on&nbsp;one&nbsp;or&nbsp;more&nbsp;fields.<br>
-<br>
-&nbsp;&nbsp;&nbsp;For&nbsp;each&nbsp;category&nbsp;you&nbsp;display&nbsp;the&nbsp;count&nbsp;of&nbsp;the&nbsp;number&nbsp;of&nbsp;things&nbsp;in<br>
-&nbsp;&nbsp;&nbsp;that&nbsp;category.&nbsp;&nbsp;You&nbsp;can&nbsp;optionally&nbsp;display&nbsp;the&nbsp;bugs&nbsp;themselves,&nbsp;or<br>
-&nbsp;&nbsp;&nbsp;leave&nbsp;them&nbsp;out,&nbsp;just&nbsp;showing&nbsp;the&nbsp;counts.&nbsp;&nbsp;And&nbsp;you&nbsp;can&nbsp;optionally&nbsp;limit<br>
-&nbsp;&nbsp;&nbsp;the&nbsp;number&nbsp;of&nbsp;things&nbsp;(bugs&nbsp;or&nbsp;subcategories)&nbsp;that&nbsp;display&nbsp;in&nbsp;each<br>
-&nbsp;&nbsp;&nbsp;category.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Such&nbsp;a&nbsp;mechanism&nbsp;would&nbsp;let&nbsp;you&nbsp;do&nbsp;all&nbsp;of&nbsp;the&nbsp;above&nbsp;and&nbsp;more.<br>
-&nbsp;&nbsp;&nbsp;Applications&nbsp;of&nbsp;this&nbsp;mechanism&nbsp;would&nbsp;only&nbsp;be&nbsp;recognised&nbsp;once&nbsp;it&nbsp;was<br>
-&nbsp;&nbsp;&nbsp;implemented.<br>
-<br>
-&nbsp;&nbsp;Related&nbsp;Bugs<br>
-<br>
-&nbsp;&nbsp;&nbsp;It&nbsp;would&nbsp;be&nbsp;nice&nbsp;to&nbsp;have&nbsp;a&nbsp;field&nbsp;where&nbsp;you&nbsp;could&nbsp;enter&nbsp;other&nbsp;bugs<br>
-&nbsp;&nbsp;&nbsp;related&nbsp;to&nbsp;the&nbsp;current&nbsp;bug.&nbsp;&nbsp;It&nbsp;would&nbsp;be&nbsp;handy&nbsp;for&nbsp;navigation&nbsp;and<br>
-&nbsp;&nbsp;&nbsp;possibly&nbsp;even&nbsp;finding&nbsp;duplicates.<br>
-<br>
-&nbsp;&nbsp;Column&nbsp;Specification&nbsp;Support<br>
-<br>
-&nbsp;&nbsp;&nbsp;Currently&nbsp;bug&nbsp;lists&nbsp;use&nbsp;the&nbsp;columns&nbsp;that&nbsp;you&nbsp;last&nbsp;used.&nbsp;&nbsp;This&nbsp;doesn't<br>
-&nbsp;&nbsp;&nbsp;work&nbsp;well&nbsp;for&nbsp;"prepackaged&nbsp;queries",&nbsp;where&nbsp;you&nbsp;followed&nbsp;a&nbsp;link.&nbsp;&nbsp;You<br>
-&nbsp;&nbsp;&nbsp;can&nbsp;probably&nbsp;add&nbsp;a&nbsp;column&nbsp;by&nbsp;specifying&nbsp;a&nbsp;sort&nbsp;column,&nbsp;but&nbsp;this&nbsp;is<br>
-&nbsp;&nbsp;&nbsp;difficult&nbsp;and&nbsp;suboptimal.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Furthermore,&nbsp;I&nbsp;find&nbsp;that&nbsp;when&nbsp;I&nbsp;want&nbsp;to&nbsp;add&nbsp;a&nbsp;column&nbsp;to&nbsp;a&nbsp;bug&nbsp;list,<br>
-&nbsp;&nbsp;&nbsp;it's&nbsp;usually&nbsp;a&nbsp;one&nbsp;off&nbsp;and&nbsp;I&nbsp;would&nbsp;prefer&nbsp;it&nbsp;to&nbsp;go&nbsp;away&nbsp;for&nbsp;the&nbsp;next<br>
-&nbsp;&nbsp;&nbsp;query.&nbsp;&nbsp;Hence,&nbsp;it&nbsp;would&nbsp;be&nbsp;nice&nbsp;to&nbsp;specify&nbsp;the&nbsp;columns&nbsp;that&nbsp;appear&nbsp;on<br>
-&nbsp;&nbsp;&nbsp;the&nbsp;bug&nbsp;list&nbsp;(and&nbsp;general&nbsp;summary&nbsp;report)&nbsp;pages.&nbsp;&nbsp;The&nbsp;default&nbsp;query<br>
-&nbsp;&nbsp;&nbsp;mechanism&nbsp;should&nbsp;be&nbsp;able&nbsp;to&nbsp;let&nbsp;you&nbsp;specify&nbsp;your&nbsp;default&nbsp;columns.<br>
-<br>
-&nbsp;&nbsp;Advanced&nbsp;Querying&nbsp;Redesign<br>
-<br>
-&nbsp;&nbsp;&nbsp;?<br>
-<br>
-Keywords<br>
-<br>
-&nbsp;&nbsp;&nbsp;People&nbsp;have&nbsp;a&nbsp;need&nbsp;to&nbsp;apply&nbsp;tags&nbsp;to&nbsp;bugs.&nbsp;&nbsp;In&nbsp;the&nbsp;beginning,&nbsp;people<br>
-&nbsp;&nbsp;&nbsp;placed&nbsp;designators&nbsp;in&nbsp;the&nbsp;summary&nbsp;and&nbsp;status&nbsp;whiteboard.&nbsp;&nbsp;However,<br>
-&nbsp;&nbsp;&nbsp;these&nbsp;fields&nbsp;were&nbsp;not&nbsp;designed&nbsp;for&nbsp;that,&nbsp;and&nbsp;so&nbsp;there&nbsp;were&nbsp;many&nbsp;flaws<br>
-&nbsp;&nbsp;&nbsp;with&nbsp;this&nbsp;system:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;They&nbsp;pollute&nbsp;the&nbsp;field&nbsp;with&nbsp;information&nbsp;that&nbsp;was&nbsp;never&nbsp;intended&nbsp;to<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;be&nbsp;present.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Removing&nbsp;them&nbsp;with&nbsp;a&nbsp;bulk&nbsp;change&nbsp;is&nbsp;a&nbsp;difficult&nbsp;problem&nbsp;that&nbsp;has<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;too&nbsp;many&nbsp;pitfalls&nbsp;to&nbsp;implement.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;You&nbsp;can&nbsp;easily&nbsp;get&nbsp;the&nbsp;capitalisation&nbsp;wrong.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Then&nbsp;dependencies&nbsp;were&nbsp;introduced&nbsp;(when?),&nbsp;and&nbsp;people&nbsp;realised&nbsp;that<br>
-&nbsp;&nbsp;&nbsp;they&nbsp;could&nbsp;use&nbsp;them&nbsp;for&nbsp;"tracking&nbsp;bugs".&nbsp;&nbsp;Again,&nbsp;dependencies&nbsp;were&nbsp;not<br>
-&nbsp;&nbsp;&nbsp;designed&nbsp;for&nbsp;that,&nbsp;and&nbsp;so&nbsp;there&nbsp;were&nbsp;more&nbsp;flaws,&nbsp;albeit&nbsp;different<br>
-&nbsp;&nbsp;&nbsp;ones,&nbsp;including:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;They&nbsp;aren't&nbsp;really&nbsp;bugs,&nbsp;so&nbsp;it's&nbsp;difficult&nbsp;to&nbsp;distinguish&nbsp;issues<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;bugs.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;They&nbsp;can&nbsp;pollute&nbsp;bugs&nbsp;counts,&nbsp;and&nbsp;you&nbsp;must&nbsp;somehow&nbsp;exclude&nbsp;them<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;queries.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;There&nbsp;is&nbsp;a&nbsp;whole&nbsp;lot&nbsp;of&nbsp;useless&nbsp;information&nbsp;on&nbsp;them.&nbsp;&nbsp;They&nbsp;have&nbsp;an<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assignee&nbsp;but&nbsp;there&nbsp;is&nbsp;nothing&nbsp;to&nbsp;fix,&nbsp;and&nbsp;that&nbsp;person&nbsp;can&nbsp;get<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;whined&nbsp;at&nbsp;by&nbsp;Bugzilla.&nbsp;&nbsp;They&nbsp;have&nbsp;target&nbsp;milestones&nbsp;which&nbsp;must&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manually&nbsp;maintained.&nbsp;&nbsp;And&nbsp;so&nbsp;on.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Finally,&nbsp;keywords&nbsp;were&nbsp;introduced&nbsp;(when?)&nbsp;for&nbsp;this&nbsp;purpose&nbsp;to&nbsp;remove<br>
-&nbsp;&nbsp;&nbsp;the&nbsp;need&nbsp;for&nbsp;these&nbsp;two&nbsp;systems.&nbsp;&nbsp;Unfortunately,&nbsp;the&nbsp;simple&nbsp;keywords<br>
-&nbsp;&nbsp;&nbsp;implementation&nbsp;was&nbsp;itself&nbsp;lacking&nbsp;in&nbsp;certain&nbsp;features&nbsp;provided&nbsp;by&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;two&nbsp;previous&nbsp;systems,&nbsp;and&nbsp;has&nbsp;remained&nbsp;almost&nbsp;unchanged&nbsp;since&nbsp;its<br>
-&nbsp;&nbsp;&nbsp;inception.&nbsp;&nbsp;Furthermore,&nbsp;it&nbsp;could&nbsp;not&nbsp;be&nbsp;forseen&nbsp;that&nbsp;in&nbsp;large<br>
-&nbsp;&nbsp;&nbsp;installations,&nbsp;the&nbsp;sheer&nbsp;number&nbsp;of&nbsp;keywords&nbsp;could&nbsp;become&nbsp;unwieldly&nbsp;and<br>
-&nbsp;&nbsp;&nbsp;could&nbsp;lead&nbsp;to&nbsp;a&nbsp;movement&nbsp;back&nbsp;to&nbsp;the&nbsp;other&nbsp;systems.<br>
-<br>
-&nbsp;&nbsp;&nbsp;The&nbsp;keywords&nbsp;system&nbsp;was&nbsp;the&nbsp;right&nbsp;idea,&nbsp;however,&nbsp;and&nbsp;it&nbsp;remains&nbsp;so.<br>
-&nbsp;&nbsp;&nbsp;Fixing&nbsp;the&nbsp;keywords&nbsp;system&nbsp;is&nbsp;one&nbsp;of&nbsp;the&nbsp;most&nbsp;important&nbsp;Bugzilla<br>
-&nbsp;&nbsp;&nbsp;issues.<br>
-<br>
-&nbsp;&nbsp;Bringing&nbsp;Keywords&nbsp;Up&nbsp;To&nbsp;Par<br>
-<br>
-&nbsp;&nbsp;&nbsp;For&nbsp;the&nbsp;most&nbsp;part,&nbsp;keywords&nbsp;are&nbsp;very&nbsp;good&nbsp;at&nbsp;what&nbsp;they&nbsp;do.&nbsp;&nbsp;It&nbsp;is&nbsp;easy<br>
-&nbsp;&nbsp;&nbsp;to&nbsp;add&nbsp;and&nbsp;remove&nbsp;them&nbsp;(unlike&nbsp;summary/whiteboard&nbsp;designators),&nbsp;we&nbsp;can<br>
-&nbsp;&nbsp;&nbsp;simply&nbsp;see&nbsp;what&nbsp;issues&nbsp;are&nbsp;present&nbsp;on&nbsp;a&nbsp;bug&nbsp;(unlike&nbsp;tracking&nbsp;bugs),<br>
-&nbsp;&nbsp;&nbsp;and&nbsp;we&nbsp;do&nbsp;not&nbsp;confuse&nbsp;bugs&nbsp;with&nbsp;issues&nbsp;(unlike&nbsp;tracking&nbsp;bugs).<br>
-<br>
-&nbsp;&nbsp;&nbsp;However,&nbsp;there&nbsp;are&nbsp;still&nbsp;some&nbsp;"regressions"&nbsp;in&nbsp;the&nbsp;keyword&nbsp;system&nbsp;over<br>
-&nbsp;&nbsp;&nbsp;previous&nbsp;systems:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Users&nbsp;wish&nbsp;to&nbsp;view&nbsp;the&nbsp;"dependency&nbsp;forest"&nbsp;of&nbsp;a&nbsp;keyword.&nbsp;&nbsp;While&nbsp;a<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dependency&nbsp;tree&nbsp;is&nbsp;of&nbsp;one&nbsp;bug,&nbsp;a&nbsp;dependency&nbsp;forest&nbsp;is&nbsp;of&nbsp;a&nbsp;bug<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list,&nbsp;and&nbsp;consists&nbsp;of&nbsp;a&nbsp;dependency&nbsp;tree&nbsp;for&nbsp;each&nbsp;member&nbsp;of&nbsp;the&nbsp;bug<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.&nbsp;&nbsp;Users&nbsp;can&nbsp;work&nbsp;around&nbsp;this&nbsp;with&nbsp;tracking&nbsp;bugs&nbsp;by&nbsp;creating&nbsp;a<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tracking&nbsp;bug&nbsp;and&nbsp;viewing&nbsp;the&nbsp;dependency&nbsp;tree&nbsp;of&nbsp;that&nbsp;tracking&nbsp;bug.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Users&nbsp;wish&nbsp;to&nbsp;specify&nbsp;the&nbsp;keywords&nbsp;that&nbsp;initially&nbsp;apply&nbsp;to&nbsp;a&nbsp;bug,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;but&nbsp;instead&nbsp;they&nbsp;must&nbsp;edit&nbsp;the&nbsp;bug&nbsp;once&nbsp;it&nbsp;has&nbsp;already&nbsp;been<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;submitted.&nbsp;&nbsp;They&nbsp;can&nbsp;work&nbsp;around&nbsp;this&nbsp;with&nbsp;summary&nbsp;designators,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;since&nbsp;they&nbsp;specify&nbsp;the&nbsp;summary&nbsp;at&nbsp;reporting&nbsp;time.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Users&nbsp;wish&nbsp;to&nbsp;store&nbsp;or&nbsp;share&nbsp;a&nbsp;bug&nbsp;list&nbsp;that&nbsp;contains&nbsp;a&nbsp;keywords<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column.&nbsp;&nbsp;Hence&nbsp;they&nbsp;wish&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;specify&nbsp;what&nbsp;columns&nbsp;appear<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;the&nbsp;bug&nbsp;list&nbsp;URL,&nbsp;as&nbsp;mentioned&nbsp;earlier.&nbsp;&nbsp;They&nbsp;can&nbsp;work&nbsp;around<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this&nbsp;using&nbsp;summary&nbsp;designators,&nbsp;since&nbsp;almost&nbsp;all&nbsp;bug&nbsp;lists&nbsp;have&nbsp;a<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;summary&nbsp;column.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Users&nbsp;wish&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;view&nbsp;keywords&nbsp;on&nbsp;a&nbsp;bug&nbsp;list.&nbsp;&nbsp;However<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;often&nbsp;they&nbsp;are&nbsp;only&nbsp;interested&nbsp;in&nbsp;a&nbsp;small&nbsp;number&nbsp;of&nbsp;keywords.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Having&nbsp;a&nbsp;bug&nbsp;list&nbsp;with&nbsp;a&nbsp;keywords&nbsp;column&nbsp;means&nbsp;that&nbsp;all&nbsp;keywords<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;will&nbsp;appear&nbsp;on&nbsp;a&nbsp;bug&nbsp;list.&nbsp;&nbsp;This&nbsp;can&nbsp;take&nbsp;a&nbsp;substantial&nbsp;amount&nbsp;of<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;space&nbsp;where&nbsp;a&nbsp;bug&nbsp;has&nbsp;a&nbsp;lot&nbsp;of&nbsp;keywords,&nbsp;since&nbsp;the&nbsp;table&nbsp;columns<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;Bugzilla&nbsp;adjust&nbsp;to&nbsp;the&nbsp;largest&nbsp;cell&nbsp;in&nbsp;that&nbsp;column.&nbsp;&nbsp;Hence<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;users&nbsp;wish&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;specify&nbsp;which&nbsp;keywords&nbsp;should&nbsp;appear&nbsp;in<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;bug&nbsp;list.&nbsp;&nbsp;In&nbsp;a&nbsp;very&nbsp;real&nbsp;sense,&nbsp;each&nbsp;keyword&nbsp;is&nbsp;a&nbsp;field&nbsp;unto<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itself.&nbsp;&nbsp;Users&nbsp;can&nbsp;work&nbsp;around&nbsp;this&nbsp;by&nbsp;using&nbsp;summary&nbsp;designators,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;since&nbsp;they&nbsp;keywords&nbsp;will&nbsp;share&nbsp;the&nbsp;space&nbsp;in&nbsp;the&nbsp;summary&nbsp;column.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Users&nbsp;wish&nbsp;to&nbsp;know&nbsp;when&nbsp;bugs&nbsp;with&nbsp;a&nbsp;specific&nbsp;issue&nbsp;are&nbsp;resolved.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hence&nbsp;they&nbsp;wish&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;receive&nbsp;notifications&nbsp;on&nbsp;all&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bugs&nbsp;with&nbsp;a&nbsp;specific&nbsp;keyword.&nbsp;&nbsp;The&nbsp;introduction&nbsp;a&nbsp;generic&nbsp;watching<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;facility&nbsp;(also&nbsp;for&nbsp;things&nbsp;like&nbsp;watching&nbsp;all&nbsp;bugs&nbsp;in&nbsp;a&nbsp;component)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;would&nbsp;achieve&nbsp;this.&nbsp;&nbsp;Users&nbsp;can&nbsp;work&nbsp;around&nbsp;this&nbsp;by&nbsp;using&nbsp;tracking<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bugs,&nbsp;as&nbsp;dependencies&nbsp;have&nbsp;an&nbsp;existing&nbsp;way&nbsp;of&nbsp;detecting&nbsp;fixes&nbsp;to<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bug&nbsp;a&nbsp;bug&nbsp;was&nbsp;blocked&nbsp;by.<br>
-<br>
-&nbsp;&nbsp;Dealing&nbsp;With&nbsp;The&nbsp;Keyword&nbsp;Overload<br>
-<br>
-&nbsp;&nbsp;&nbsp;At&nbsp;the&nbsp;time&nbsp;of&nbsp;writing,&nbsp;the&nbsp;mozilla.org&nbsp;installation&nbsp;has&nbsp;approximately<br>
-&nbsp;&nbsp;&nbsp;100&nbsp;keywords,&nbsp;and&nbsp;many&nbsp;more&nbsp;would&nbsp;be&nbsp;in&nbsp;use&nbsp;if&nbsp;the&nbsp;keywords&nbsp;system<br>
-&nbsp;&nbsp;&nbsp;didn't&nbsp;have&nbsp;the&nbsp;problems&nbsp;it&nbsp;does.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Such&nbsp;a&nbsp;large&nbsp;number&nbsp;of&nbsp;keywords&nbsp;introduces&nbsp;logistical&nbsp;problems:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;It&nbsp;must&nbsp;be&nbsp;easy&nbsp;for&nbsp;someone&nbsp;to&nbsp;learn&nbsp;what&nbsp;a&nbsp;keyword&nbsp;means.&nbsp;&nbsp;If&nbsp;a<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyword&nbsp;is&nbsp;buried&nbsp;within&nbsp;a&nbsp;lot&nbsp;of&nbsp;other&nbsp;keywords,&nbsp;it&nbsp;can&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;difficult&nbsp;to&nbsp;find.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;It&nbsp;must&nbsp;be&nbsp;easy&nbsp;to&nbsp;see&nbsp;what&nbsp;keywords&nbsp;are&nbsp;on&nbsp;a&nbsp;bug.&nbsp;&nbsp;If&nbsp;the&nbsp;number<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;keywords&nbsp;is&nbsp;large,&nbsp;then&nbsp;this&nbsp;can&nbsp;be&nbsp;difficult.<br>
-<br>
-&nbsp;&nbsp;&nbsp;These&nbsp;lead&nbsp;some&nbsp;people&nbsp;to&nbsp;feel&nbsp;that&nbsp;there&nbsp;are&nbsp;"too&nbsp;many&nbsp;keywords".<br>
-<br>
-&nbsp;&nbsp;&nbsp;These&nbsp;problems&nbsp;are&nbsp;not&nbsp;without&nbsp;solutions&nbsp;however.&nbsp;&nbsp;It&nbsp;is&nbsp;harder&nbsp;to<br>
-&nbsp;&nbsp;&nbsp;find&nbsp;a&nbsp;list&nbsp;of&nbsp;designators&nbsp;or&nbsp;tracking&nbsp;bugs&nbsp;than&nbsp;it&nbsp;is&nbsp;a&nbsp;list&nbsp;of<br>
-&nbsp;&nbsp;&nbsp;keywords.<br>
-<br>
-&nbsp;&nbsp;&nbsp;The&nbsp;essential&nbsp;problem&nbsp;is&nbsp;it&nbsp;needs&nbsp;to&nbsp;be&nbsp;easy&nbsp;to&nbsp;find&nbsp;the&nbsp;keywords<br>
-&nbsp;&nbsp;&nbsp;we're&nbsp;interested&nbsp;in&nbsp;through&nbsp;the&nbsp;mass&nbsp;of&nbsp;keywords.<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Keyword&nbsp;Applicability<br>
-<br>
-&nbsp;&nbsp;&nbsp;As&nbsp;has&nbsp;been&nbsp;previously&nbsp;mentioned,&nbsp;it&nbsp;is&nbsp;desirable&nbsp;for&nbsp;fields&nbsp;to&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;able&nbsp;to&nbsp;adapt&nbsp;to&nbsp;the&nbsp;values&nbsp;of&nbsp;other&nbsp;fields.&nbsp;&nbsp;This&nbsp;is&nbsp;certainly&nbsp;true<br>
-&nbsp;&nbsp;&nbsp;for&nbsp;keywords.&nbsp;&nbsp;Many&nbsp;keywords&nbsp;are&nbsp;simply&nbsp;not&nbsp;relevant&nbsp;because&nbsp;of&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;bugs&nbsp;product,&nbsp;component,&nbsp;etc.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Hence,&nbsp;by&nbsp;introducing&nbsp;keyword&nbsp;applicability,&nbsp;and&nbsp;not&nbsp;displaying<br>
-&nbsp;&nbsp;&nbsp;keywords&nbsp;that&nbsp;are&nbsp;not&nbsp;relevant&nbsp;to&nbsp;the&nbsp;current&nbsp;bug,&nbsp;or&nbsp;clearly<br>
-&nbsp;&nbsp;&nbsp;separating&nbsp;them,&nbsp;we&nbsp;can&nbsp;make&nbsp;the&nbsp;keyword&nbsp;overload&nbsp;problem&nbsp;less<br>
-&nbsp;&nbsp;&nbsp;significant.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Currently&nbsp;when&nbsp;you&nbsp;click&nbsp;on&nbsp;"keywords"&nbsp;on&nbsp;a&nbsp;bug,&nbsp;you&nbsp;get&nbsp;a&nbsp;list&nbsp;of&nbsp;all<br>
-&nbsp;&nbsp;&nbsp;bugs.&nbsp;&nbsp;It&nbsp;would&nbsp;be&nbsp;desirable&nbsp;to&nbsp;introduce&nbsp;a&nbsp;list&nbsp;of&nbsp;keywords&nbsp;tailored<br>
-&nbsp;&nbsp;&nbsp;to&nbsp;a&nbsp;specific&nbsp;bug,&nbsp;that&nbsp;reports,&nbsp;in&nbsp;order:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;keywords&nbsp;currently&nbsp;on&nbsp;the&nbsp;bug<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;keywords&nbsp;not&nbsp;currently&nbsp;on&nbsp;the&nbsp;bug,&nbsp;but&nbsp;applicable&nbsp;to&nbsp;the&nbsp;bug<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;optionally,&nbsp;the&nbsp;keywords&nbsp;not&nbsp;applicable&nbsp;to&nbsp;the&nbsp;bug<br>
-<br>
-&nbsp;&nbsp;&nbsp;This&nbsp;essentially&nbsp;orders&nbsp;the&nbsp;keywords&nbsp;into&nbsp;three&nbsp;groups,&nbsp;where&nbsp;each<br>
-&nbsp;&nbsp;&nbsp;group&nbsp;is&nbsp;more&nbsp;important&nbsp;than&nbsp;the&nbsp;previous,&nbsp;and&nbsp;therefore&nbsp;appears<br>
-&nbsp;&nbsp;&nbsp;closer&nbsp;to&nbsp;the&nbsp;top.<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Keyword&nbsp;Grouping&nbsp;&#38;&nbsp;Ordering<br>
-<br>
-&nbsp;&nbsp;&nbsp;We&nbsp;could&nbsp;further&nbsp;enhance&nbsp;both&nbsp;the&nbsp;global&nbsp;and&nbsp;bug&nbsp;specific&nbsp;keyword&nbsp;list<br>
-&nbsp;&nbsp;&nbsp;by&nbsp;grouping&nbsp;keywords.&nbsp;&nbsp;We&nbsp;should&nbsp;always&nbsp;have&nbsp;a&nbsp;"flat"&nbsp;view&nbsp;of<br>
-&nbsp;&nbsp;&nbsp;keywords,&nbsp;but&nbsp;other&nbsp;ways&nbsp;of&nbsp;viewing&nbsp;the&nbsp;keywords&nbsp;would&nbsp;be&nbsp;useful&nbsp;too.<br>
-<br>
-&nbsp;&nbsp;&nbsp;If&nbsp;keyword&nbsp;applicability&nbsp;was&nbsp;implemented,&nbsp;we&nbsp;could&nbsp;group&nbsp;keywords<br>
-&nbsp;&nbsp;&nbsp;based&nbsp;on&nbsp;their&nbsp;"applicability&nbsp;condition".&nbsp;&nbsp;Keywords&nbsp;that&nbsp;apply&nbsp;to&nbsp;all<br>
-&nbsp;&nbsp;&nbsp;bugs&nbsp;could&nbsp;be&nbsp;separated&nbsp;from&nbsp;keywords&nbsp;that&nbsp;apply&nbsp;to&nbsp;a&nbsp;specific<br>
-&nbsp;&nbsp;&nbsp;product,&nbsp;both&nbsp;on&nbsp;the&nbsp;global&nbsp;keyword&nbsp;list&nbsp;and&nbsp;the&nbsp;keyword&nbsp;list&nbsp;of&nbsp;a&nbsp;bug<br>
-&nbsp;&nbsp;&nbsp;that&nbsp;is&nbsp;in&nbsp;that&nbsp;product.<br>
-<br>
-&nbsp;&nbsp;&nbsp;We&nbsp;could&nbsp;specify&nbsp;groups&nbsp;of&nbsp;our&nbsp;own.&nbsp;&nbsp;For&nbsp;example,&nbsp;many&nbsp;keywords&nbsp;are&nbsp;in<br>
-&nbsp;&nbsp;&nbsp;a&nbsp;mutually&nbsp;exclusive&nbsp;group,&nbsp;essentially&nbsp;like&nbsp;radio&nbsp;buttons&nbsp;in&nbsp;a&nbsp;user<br>
-&nbsp;&nbsp;&nbsp;interface.&nbsp;&nbsp;This&nbsp;creates&nbsp;a&nbsp;natural&nbsp;grouping,&nbsp;although&nbsp;other&nbsp;groupings<br>
-&nbsp;&nbsp;&nbsp;occur&nbsp;(which&nbsp;depends&nbsp;on&nbsp;your&nbsp;keywords).<br>
-<br>
-&nbsp;&nbsp;&nbsp;It&nbsp;is&nbsp;possible&nbsp;that&nbsp;we&nbsp;could&nbsp;use&nbsp;collapsing/expanding&nbsp;operations&nbsp;on<br>
-&nbsp;&nbsp;&nbsp;"twisties"&nbsp;to&nbsp;only&nbsp;should&nbsp;the&nbsp;groups&nbsp;we&nbsp;are&nbsp;interested&nbsp;in.<br>
-<br>
-&nbsp;&nbsp;&nbsp;And&nbsp;instead&nbsp;of&nbsp;grouping&nbsp;keywords,&nbsp;we&nbsp;could&nbsp;order&nbsp;them&nbsp;on&nbsp;some&nbsp;metric<br>
-&nbsp;&nbsp;&nbsp;of&nbsp;usefulness,&nbsp;such&nbsp;as:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;when&nbsp;the&nbsp;keyword&nbsp;was&nbsp;last&nbsp;added&nbsp;to&nbsp;a&nbsp;bug<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;how&nbsp;many&nbsp;bugs&nbsp;the&nbsp;keyword&nbsp;is&nbsp;on<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;how&nbsp;many&nbsp;open&nbsp;bugs&nbsp;the&nbsp;keyword&nbsp;is&nbsp;on<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Opting&nbsp;Out&nbsp;Of&nbsp;Keywords<br>
-<br>
-&nbsp;&nbsp;&nbsp;Not&nbsp;all&nbsp;people&nbsp;are&nbsp;going&nbsp;to&nbsp;care&nbsp;about&nbsp;all&nbsp;keywords.&nbsp;&nbsp;Therefore&nbsp;it<br>
-&nbsp;&nbsp;&nbsp;makes&nbsp;sense&nbsp;that&nbsp;you&nbsp;may&nbsp;wish&nbsp;to&nbsp;specify&nbsp;which&nbsp;keywords&nbsp;you&nbsp;are<br>
-&nbsp;&nbsp;&nbsp;interested&nbsp;in,&nbsp;either&nbsp;on&nbsp;the&nbsp;bug&nbsp;page,&nbsp;or&nbsp;on&nbsp;notifications.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Other&nbsp;keywords&nbsp;will&nbsp;therefore&nbsp;not&nbsp;bother&nbsp;users&nbsp;who&nbsp;are&nbsp;not&nbsp;interested<br>
-&nbsp;&nbsp;&nbsp;in&nbsp;them.<br>
-<br>
-&nbsp;&nbsp;Keyword&nbsp;Security<br>
-<br>
-&nbsp;&nbsp;&nbsp;Currently&nbsp;all&nbsp;keywords&nbsp;are&nbsp;available&nbsp;and&nbsp;editable&nbsp;to&nbsp;all&nbsp;people&nbsp;with<br>
-&nbsp;&nbsp;&nbsp;edit&nbsp;bugs&nbsp;access.&nbsp;&nbsp;This&nbsp;situation&nbsp;is&nbsp;clearly&nbsp;suboptimal.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Although&nbsp;relying&nbsp;on&nbsp;good&nbsp;behaviour&nbsp;for&nbsp;people&nbsp;to&nbsp;not&nbsp;do&nbsp;what&nbsp;they<br>
-&nbsp;&nbsp;&nbsp;shouldn't&nbsp;works&nbsp;reasonably&nbsp;well&nbsp;on&nbsp;the&nbsp;mozilla.org,&nbsp;it&nbsp;is&nbsp;better&nbsp;to<br>
-&nbsp;&nbsp;&nbsp;enforce&nbsp;that&nbsp;behaviour&nbsp;-&nbsp;it&nbsp;can&nbsp;be&nbsp;breached&nbsp;through&nbsp;malice,&nbsp;accident<br>
-&nbsp;&nbsp;&nbsp;or&nbsp;ignorance.<br>
-<br>
-&nbsp;&nbsp;&nbsp;And&nbsp;in&nbsp;the&nbsp;situation&nbsp;where&nbsp;it&nbsp;is&nbsp;desirable&nbsp;for&nbsp;the&nbsp;presence&nbsp;or&nbsp;absence<br>
-&nbsp;&nbsp;&nbsp;of&nbsp;a&nbsp;keyword&nbsp;not&nbsp;to&nbsp;be&nbsp;revealed,&nbsp;organisations&nbsp;either&nbsp;need&nbsp;to&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;content&nbsp;with&nbsp;the&nbsp;divulgence,&nbsp;or&nbsp;not&nbsp;use&nbsp;keywords&nbsp;at&nbsp;all.<br>
-<br>
-&nbsp;&nbsp;&nbsp;In&nbsp;the&nbsp;situation&nbsp;where&nbsp;they&nbsp;choose&nbsp;to&nbsp;divulge,&nbsp;introducing&nbsp;the&nbsp;ability<br>
-&nbsp;&nbsp;&nbsp;to&nbsp;restrict&nbsp;who&nbsp;can&nbsp;see&nbsp;the&nbsp;keyword&nbsp;would&nbsp;also&nbsp;reduce&nbsp;keyword<br>
-&nbsp;&nbsp;&nbsp;overload.<br>
-<br>
-&nbsp;&nbsp;Personal&nbsp;Keywords<br>
-<br>
-&nbsp;&nbsp;&nbsp;Keywords&nbsp;join&nbsp;together&nbsp;a&nbsp;set&nbsp;of&nbsp;bugs&nbsp;which&nbsp;would&nbsp;otherwise&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;unrelated&nbsp;in&nbsp;the&nbsp;bug&nbsp;system.<br>
-<br>
-&nbsp;&nbsp;&nbsp;We&nbsp;allow&nbsp;users&nbsp;to&nbsp;store&nbsp;their&nbsp;own&nbsp;queries.&nbsp;&nbsp;However&nbsp;we&nbsp;don't&nbsp;allow<br>
-&nbsp;&nbsp;&nbsp;them&nbsp;to&nbsp;store&nbsp;their&nbsp;own&nbsp;keywords&nbsp;on&nbsp;a&nbsp;bug.&nbsp;&nbsp;This&nbsp;reduces&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;usefulness&nbsp;of&nbsp;personal&nbsp;queries,&nbsp;since&nbsp;you&nbsp;cannot&nbsp;join&nbsp;a&nbsp;set&nbsp;of<br>
-&nbsp;&nbsp;&nbsp;unrelated&nbsp;bugs&nbsp;together&nbsp;in&nbsp;a&nbsp;way&nbsp;that&nbsp;you&nbsp;wish.&nbsp;&nbsp;Lists&nbsp;of&nbsp;bug&nbsp;numbers<br>
-&nbsp;&nbsp;&nbsp;can&nbsp;work,&nbsp;by&nbsp;they&nbsp;can&nbsp;only&nbsp;be&nbsp;used&nbsp;for&nbsp;small&nbsp;lists,&nbsp;and&nbsp;it&nbsp;is<br>
-&nbsp;&nbsp;&nbsp;impossible&nbsp;to&nbsp;share&nbsp;a&nbsp;list&nbsp;between&nbsp;multiple&nbsp;queries.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Personal&nbsp;keywords&nbsp;are&nbsp;necessary&nbsp;to&nbsp;replace&nbsp;personal&nbsp;tracking&nbsp;bugs,&nbsp;as<br>
-&nbsp;&nbsp;&nbsp;they&nbsp;would&nbsp;not&nbsp;pollute&nbsp;the&nbsp;keyword&nbsp;space.&nbsp;&nbsp;Indeed,&nbsp;on&nbsp;many<br>
-&nbsp;&nbsp;&nbsp;installations&nbsp;this&nbsp;could&nbsp;remove&nbsp;some&nbsp;keywords&nbsp;out&nbsp;of&nbsp;the&nbsp;global<br>
-&nbsp;&nbsp;&nbsp;keyword&nbsp;space.<br>
-<br>
-&nbsp;&nbsp;&nbsp;In&nbsp;a&nbsp;similar&nbsp;vein&nbsp;and&nbsp;with&nbsp;similar&nbsp;effects,&nbsp;group&nbsp;keywords&nbsp;could&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;introduced&nbsp;that&nbsp;are&nbsp;only&nbsp;available&nbsp;to&nbsp;members&nbsp;of&nbsp;a&nbsp;specific&nbsp;group.<br>
-<br>
-&nbsp;&nbsp;Keyword&nbsp;Restrictions<br>
-<br>
-&nbsp;&nbsp;&nbsp;Keywords&nbsp;are&nbsp;not&nbsp;islands&nbsp;unto&nbsp;themselves.&nbsp;&nbsp;Along&nbsp;with&nbsp;their&nbsp;potential<br>
-&nbsp;&nbsp;&nbsp;to&nbsp;be&nbsp;involved&nbsp;in&nbsp;the&nbsp;inter-field&nbsp;relationships&nbsp;mentioned&nbsp;earlier,<br>
-&nbsp;&nbsp;&nbsp;keywords&nbsp;can&nbsp;also&nbsp;be&nbsp;related&nbsp;to&nbsp;other&nbsp;keywords.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Essentially,&nbsp;there&nbsp;are&nbsp;two&nbsp;possibilities:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;a&nbsp;set&nbsp;of&nbsp;keywords&nbsp;are&nbsp;mutually&nbsp;exclusive<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;presence&nbsp;of&nbsp;a&nbsp;keyword&nbsp;implies&nbsp;another&nbsp;keyword&nbsp;must&nbsp;be&nbsp;present<br>
-<br>
-&nbsp;&nbsp;&nbsp;Introduction&nbsp;of&nbsp;the&nbsp;ability&nbsp;to&nbsp;specify&nbsp;these&nbsp;restrictions&nbsp;would&nbsp;have<br>
-&nbsp;&nbsp;&nbsp;benefits.<br>
-<br>
-&nbsp;&nbsp;&nbsp;If&nbsp;mutually&nbsp;exclusive&nbsp;keywords&nbsp;were&nbsp;present&nbsp;on&nbsp;a&nbsp;bug,&nbsp;their&nbsp;removal<br>
-&nbsp;&nbsp;&nbsp;would&nbsp;fix&nbsp;up&nbsp;the&nbsp;database,&nbsp;as&nbsp;well&nbsp;as&nbsp;reducing&nbsp;the&nbsp;number&nbsp;of&nbsp;keywords<br>
-&nbsp;&nbsp;&nbsp;on&nbsp;that&nbsp;bug.<br>
-<br>
-&nbsp;&nbsp;&nbsp;In&nbsp;the&nbsp;situation&nbsp;where&nbsp;a&nbsp;keyword&nbsp;implies&nbsp;another&nbsp;keyword,&nbsp;there&nbsp;are<br>
-&nbsp;&nbsp;&nbsp;two&nbsp;possiblities&nbsp;as&nbsp;to&nbsp;how&nbsp;to&nbsp;handle&nbsp;the&nbsp;situation.<br>
-<br>
-&nbsp;&nbsp;&nbsp;The&nbsp;first&nbsp;is&nbsp;automatically&nbsp;add&nbsp;the&nbsp;keyword.&nbsp;&nbsp;This&nbsp;would&nbsp;fix&nbsp;up&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;database,&nbsp;but&nbsp;it&nbsp;would&nbsp;increase&nbsp;the&nbsp;number&nbsp;of&nbsp;keywords&nbsp;on&nbsp;a&nbsp;bug.<br>
-<br>
-&nbsp;&nbsp;&nbsp;The&nbsp;second&nbsp;is&nbsp;to&nbsp;automatically&nbsp;remove&nbsp;the&nbsp;keyword,&nbsp;and&nbsp;alter&nbsp;queries<br>
-&nbsp;&nbsp;&nbsp;so&nbsp;they&nbsp;pick&nbsp;up&nbsp;the&nbsp;first&nbsp;keyword&nbsp;as&nbsp;well&nbsp;as&nbsp;the&nbsp;removed&nbsp;keyword.<br>
-&nbsp;&nbsp;&nbsp;This&nbsp;would&nbsp;fix&nbsp;up&nbsp;the&nbsp;database&nbsp;and&nbsp;reduce&nbsp;the&nbsp;number&nbsp;of&nbsp;keywords&nbsp;on&nbsp;a<br>
-&nbsp;&nbsp;&nbsp;bug,&nbsp;but&nbsp;it&nbsp;might&nbsp;confuse&nbsp;users&nbsp;who&nbsp;don't&nbsp;see&nbsp;the&nbsp;keyword.<br>
-&nbsp;&nbsp;&nbsp;Alternatively,&nbsp;the&nbsp;implied&nbsp;keywords&nbsp;could&nbsp;be&nbsp;listed&nbsp;separately.<br>
-<br>
-Notifications<br>
-<br>
-&nbsp;&nbsp;&nbsp;Every&nbsp;time&nbsp;a&nbsp;bug&nbsp;gets&nbsp;changed&nbsp;notifications&nbsp;get&nbsp;sent&nbsp;out&nbsp;to&nbsp;people<br>
-&nbsp;&nbsp;&nbsp;letting&nbsp;them&nbsp;know&nbsp;about&nbsp;what&nbsp;changes&nbsp;have&nbsp;been&nbsp;made.&nbsp;&nbsp;This&nbsp;is&nbsp;a<br>
-&nbsp;&nbsp;&nbsp;significant&nbsp;feature,&nbsp;and&nbsp;all&nbsp;sorts&nbsp;of&nbsp;questions&nbsp;can&nbsp;be&nbsp;raised,&nbsp;but<br>
-&nbsp;&nbsp;&nbsp;they&nbsp;mainly&nbsp;boil&nbsp;down&nbsp;to&nbsp;when&nbsp;they&nbsp;should&nbsp;be&nbsp;sent&nbsp;and&nbsp;what&nbsp;they&nbsp;should<br>
-&nbsp;&nbsp;&nbsp;look&nbsp;like.<br>
-<br>
-&nbsp;&nbsp;Changes&nbsp;You're&nbsp;Interested&nbsp;In<br>
-<br>
-&nbsp;&nbsp;&nbsp;As&nbsp;of&nbsp;version&nbsp;2.12&nbsp;users&nbsp;can&nbsp;specify&nbsp;what&nbsp;sort&nbsp;of&nbsp;changes&nbsp;they&nbsp;are<br>
-&nbsp;&nbsp;&nbsp;interested&nbsp;in&nbsp;receiving&nbsp;notifications&nbsp;for.&nbsp;&nbsp;However,&nbsp;this&nbsp;is&nbsp;still<br>
-&nbsp;&nbsp;&nbsp;limited.&nbsp;&nbsp;As&nbsp;yet&nbsp;there&nbsp;is&nbsp;no&nbsp;facility&nbsp;to&nbsp;specify&nbsp;which&nbsp;keywords&nbsp;you<br>
-&nbsp;&nbsp;&nbsp;care&nbsp;about,&nbsp;and&nbsp;whether&nbsp;you&nbsp;care&nbsp;about&nbsp;changes&nbsp;to&nbsp;fields&nbsp;such&nbsp;as&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;QA&nbsp;contact&nbsp;changes.<br>
-&nbsp;&nbsp;&nbsp;Furthermore,&nbsp;often&nbsp;an&nbsp;unnecessary&nbsp;comment&nbsp;will&nbsp;go&nbsp;along&nbsp;with&nbsp;a&nbsp;change,<br>
-&nbsp;&nbsp;&nbsp;either&nbsp;because&nbsp;it&nbsp;is&nbsp;required,&nbsp;or&nbsp;the&nbsp;commenter&nbsp;is&nbsp;ignorant&nbsp;of&nbsp;how&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;new&nbsp;system&nbsp;works.&nbsp;&nbsp;While&nbsp;explaining&nbsp;why&nbsp;you&nbsp;did&nbsp;something&nbsp;is&nbsp;useful,<br>
-&nbsp;&nbsp;&nbsp;merely&nbsp;commenting&nbsp;on&nbsp;what&nbsp;you&nbsp;did&nbsp;is&nbsp;not&nbsp;because&nbsp;that&nbsp;information&nbsp;is<br>
-&nbsp;&nbsp;&nbsp;already&nbsp;accessible&nbsp;view&nbsp;"Bug&nbsp;Activity".<br>
-<br>
-&nbsp;&nbsp;&nbsp;Because&nbsp;of&nbsp;this&nbsp;unnecessary&nbsp;comment,&nbsp;a&nbsp;lot&nbsp;of&nbsp;changes&nbsp;that&nbsp;would<br>
-&nbsp;&nbsp;&nbsp;otherwise&nbsp;not&nbsp;generate&nbsp;notifications&nbsp;for&nbsp;certain&nbsp;people&nbsp;do&nbsp;so,&nbsp;because<br>
-&nbsp;&nbsp;&nbsp;few&nbsp;people&nbsp;are&nbsp;willing&nbsp;to&nbsp;turn&nbsp;off&nbsp;comments.&nbsp;&nbsp;One&nbsp;way&nbsp;to&nbsp;deal&nbsp;with<br>
-&nbsp;&nbsp;&nbsp;this&nbsp;problem&nbsp;is&nbsp;to&nbsp;allow&nbsp;people&nbsp;to&nbsp;specify&nbsp;that&nbsp;their&nbsp;comments&nbsp;are<br>
-&nbsp;&nbsp;&nbsp;purely&nbsp;explanatory,&nbsp;and&nbsp;that&nbsp;anyone&nbsp;who&nbsp;is&nbsp;not&nbsp;interested&nbsp;in&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;change&nbsp;will&nbsp;not&nbsp;be&nbsp;interested&nbsp;in&nbsp;the&nbsp;comment.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Furthermore,&nbsp;one&nbsp;possible&nbsp;rationale&nbsp;for&nbsp;unnecessary&nbsp;comments&nbsp;is&nbsp;that<br>
-&nbsp;&nbsp;&nbsp;the&nbsp;bug&nbsp;activity&nbsp;does&nbsp;not&nbsp;display&nbsp;on&nbsp;the&nbsp;normal&nbsp;page&nbsp;and&nbsp;hence&nbsp;it&nbsp;is<br>
-&nbsp;&nbsp;&nbsp;difficult&nbsp;to&nbsp;cross&nbsp;reference&nbsp;comments&nbsp;and&nbsp;actions.&nbsp;&nbsp;Hence,&nbsp;it&nbsp;would&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;beneficial&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;do&nbsp;this.<br>
-<br>
-&nbsp;&nbsp;Bugs&nbsp;You're&nbsp;Watching<br>
-<br>
-&nbsp;&nbsp;&nbsp;Currently&nbsp;to&nbsp;receive&nbsp;a&nbsp;notification&nbsp;about&nbsp;a&nbsp;bug&nbsp;you&nbsp;need&nbsp;to&nbsp;have&nbsp;your<br>
-&nbsp;&nbsp;&nbsp;name&nbsp;on&nbsp;it.&nbsp;&nbsp;This&nbsp;is&nbsp;suboptimal&nbsp;because&nbsp;you&nbsp;need&nbsp;to&nbsp;know&nbsp;about&nbsp;a&nbsp;bug<br>
-&nbsp;&nbsp;&nbsp;before&nbsp;you&nbsp;can&nbsp;receive&nbsp;notifications&nbsp;on&nbsp;it.&nbsp;&nbsp;Often&nbsp;you&nbsp;are&nbsp;interested<br>
-&nbsp;&nbsp;&nbsp;in&nbsp;any&nbsp;bug&nbsp;with&nbsp;a&nbsp;field&nbsp;set&nbsp;to&nbsp;a&nbsp;specific&nbsp;value.&nbsp;&nbsp;For&nbsp;example,&nbsp;you<br>
-&nbsp;&nbsp;&nbsp;might&nbsp;be&nbsp;interested&nbsp;in&nbsp;all&nbsp;bugs&nbsp;with&nbsp;a&nbsp;specific&nbsp;product,&nbsp;component&nbsp;or<br>
-&nbsp;&nbsp;&nbsp;keyword.<br>
-<br>
-&nbsp;&nbsp;&nbsp;If&nbsp;someone&nbsp;could&nbsp;automatically&nbsp;receive&nbsp;notifications&nbsp;about&nbsp;these&nbsp;bugs,<br>
-&nbsp;&nbsp;&nbsp;it&nbsp;would&nbsp;make&nbsp;everyone's&nbsp;lives&nbsp;easier.&nbsp;&nbsp;Currently&nbsp;the&nbsp;default&nbsp;assignee<br>
-&nbsp;&nbsp;&nbsp;and&nbsp;QA&nbsp;contact&nbsp;for&nbsp;a&nbsp;component&nbsp;will&nbsp;automatically&nbsp;receive<br>
-&nbsp;&nbsp;&nbsp;notifications&nbsp;for<br>
-<br>
-&nbsp;&nbsp;&nbsp;Question:&nbsp;&nbsp;This&nbsp;moves&nbsp;half&nbsp;way&nbsp;to&nbsp;a&nbsp;BCC.<br>
-<br>
-&nbsp;&nbsp;Bulk&nbsp;Changes<br>
-<br>
-&nbsp;&nbsp;&nbsp;A&nbsp;very&nbsp;useful&nbsp;feature&nbsp;of&nbsp;Bugzilla&nbsp;is&nbsp;the&nbsp;ability&nbsp;to&nbsp;perform&nbsp;an&nbsp;action<br>
-&nbsp;&nbsp;&nbsp;on&nbsp;multiple&nbsp;bugs&nbsp;at&nbsp;once.&nbsp;&nbsp;However,&nbsp;this&nbsp;means&nbsp;that&nbsp;similar<br>
-&nbsp;&nbsp;&nbsp;notifications&nbsp;are&nbsp;currently&nbsp;generated&nbsp;for&nbsp;each&nbsp;bug&nbsp;modified.<br>
-<br>
-&nbsp;&nbsp;&nbsp;This&nbsp;can&nbsp;result&nbsp;in&nbsp;a&nbsp;torrent&nbsp;of&nbsp;notifications&nbsp;that&nbsp;can&nbsp;annoy.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Furthermore,&nbsp;since&nbsp;the&nbsp;bugs&nbsp;are&nbsp;all&nbsp;changed&nbsp;close&nbsp;to&nbsp;each&nbsp;other&nbsp;in<br>
-&nbsp;&nbsp;&nbsp;time,&nbsp;it&nbsp;is&nbsp;easy&nbsp;for&nbsp;someone&nbsp;to&nbsp;mass&nbsp;delete&nbsp;all&nbsp;the&nbsp;notifications<br>
-&nbsp;&nbsp;&nbsp;generated&nbsp;by&nbsp;a&nbsp;bulk&nbsp;change&nbsp;and&nbsp;miss&nbsp;an&nbsp;unrelated&nbsp;notification&nbsp;in&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;middle.<br>
-<br>
-&nbsp;&nbsp;&nbsp;These&nbsp;factors&nbsp;can&nbsp;lead&nbsp;to&nbsp;a&nbsp;tendency&nbsp;for&nbsp;people&nbsp;to&nbsp;delay&nbsp;bulk&nbsp;changes,<br>
-&nbsp;&nbsp;&nbsp;or&nbsp;avoid&nbsp;them&nbsp;entirely.&nbsp;&nbsp;This&nbsp;is&nbsp;suboptimal.<br>
-<br>
-&nbsp;&nbsp;&nbsp;It&nbsp;would&nbsp;be&nbsp;better&nbsp;if&nbsp;a&nbsp;bulk&nbsp;change&nbsp;generated&nbsp;only&nbsp;one&nbsp;notification<br>
-&nbsp;&nbsp;&nbsp;mail.&nbsp;&nbsp;This&nbsp;would&nbsp;vastly&nbsp;reduce&nbsp;the&nbsp;annoyance&nbsp;factor,&nbsp;and&nbsp;prevent<br>
-&nbsp;&nbsp;&nbsp;accidental&nbsp;deletion&nbsp;of&nbsp;notifications.<br>
-<br>
-&nbsp;&nbsp;&nbsp;One&nbsp;problem&nbsp;with&nbsp;this&nbsp;change&nbsp;is&nbsp;that&nbsp;some&nbsp;people&nbsp;separate&nbsp;out<br>
-&nbsp;&nbsp;&nbsp;notifications&nbsp;using&nbsp;filtering.&nbsp;&nbsp;This&nbsp;means&nbsp;that&nbsp;they&nbsp;would&nbsp;no&nbsp;longer<br>
-&nbsp;&nbsp;&nbsp;be&nbsp;match&nbsp;parts&nbsp;of&nbsp;a&nbsp;bulk&nbsp;change&nbsp;under&nbsp;different&nbsp;filtering&nbsp;rules.<br>
-<br>
-&nbsp;&nbsp;&nbsp;One&nbsp;possibility&nbsp;to&nbsp;resolve&nbsp;this&nbsp;is&nbsp;to&nbsp;allow&nbsp;people&nbsp;to&nbsp;specify&nbsp;groups<br>
-&nbsp;&nbsp;&nbsp;of&nbsp;bugs.&nbsp;&nbsp;All&nbsp;bugs&nbsp;within&nbsp;a&nbsp;group&nbsp;would&nbsp;go&nbsp;into&nbsp;the&nbsp;same<br>
-&nbsp;&nbsp;&nbsp;notification.&nbsp;&nbsp;The&nbsp;filters&nbsp;could&nbsp;then&nbsp;distinguish&nbsp;the&nbsp;different&nbsp;bug<br>
-&nbsp;&nbsp;&nbsp;groups.<br>
-<br>
-&nbsp;&nbsp;&nbsp;In&nbsp;any&nbsp;case,&nbsp;it&nbsp;is&nbsp;likely&nbsp;there&nbsp;would&nbsp;need&nbsp;to&nbsp;be&nbsp;a&nbsp;transition&nbsp;period<br>
-&nbsp;&nbsp;&nbsp;to&nbsp;allow&nbsp;people&nbsp;to&nbsp;alter&nbsp;their&nbsp;filters.<br>
-<br>
-Nominations<br>
-<br>
-&nbsp;&nbsp;&nbsp;?<br>
-<br>
-Linking&nbsp;Bugzilla&nbsp;Installations<br>
-<br>
-&nbsp;&nbsp;&nbsp;The&nbsp;first&nbsp;example&nbsp;of&nbsp;linking&nbsp;Bugzilla&nbsp;installations&nbsp;together&nbsp;has&nbsp;is<br>
-&nbsp;&nbsp;&nbsp;the&nbsp;introduction&nbsp;of&nbsp;bug&nbsp;moving&nbsp;in&nbsp;version&nbsp;2.12.&nbsp;&nbsp;However,&nbsp;it&nbsp;would&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;useful&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;link&nbsp;installations&nbsp;in&nbsp;more&nbsp;ways.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Dependencies&nbsp;and&nbsp;other&nbsp;relationships&nbsp;between&nbsp;bugs&nbsp;in&nbsp;other<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;installations.&nbsp;&nbsp;This&nbsp;is&nbsp;difficult&nbsp;because&nbsp;dependencies&nbsp;are<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;synchronised&nbsp;on&nbsp;both&nbsp;bugs,&nbsp;so&nbsp;the&nbsp;installation&nbsp;that&nbsp;changes<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dependencies&nbsp;would&nbsp;need&nbsp;to&nbsp;communicate&nbsp;the&nbsp;new&nbsp;state&nbsp;to&nbsp;the&nbsp;other<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;installation.&nbsp;&nbsp;It&nbsp;would&nbsp;also&nbsp;mean&nbsp;that&nbsp;relationships&nbsp;and<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notifications&nbsp;that&nbsp;refer&nbsp;to&nbsp;other&nbsp;bugs&nbsp;would&nbsp;need&nbsp;to&nbsp;communicate<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;the&nbsp;other&nbsp;installation.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;References&nbsp;to&nbsp;bugs&nbsp;in&nbsp;other&nbsp;installations.&nbsp;&nbsp;Currently&nbsp;if&nbsp;you&nbsp;type<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"bug&nbsp;XXX"&nbsp;or&nbsp;"bug&nbsp;#XXX"&nbsp;where&nbsp;XXX&nbsp;is&nbsp;a&nbsp;number,&nbsp;you&nbsp;get&nbsp;an<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;automatic&nbsp;hyperlink&nbsp;to&nbsp;that&nbsp;bug.&nbsp;&nbsp;It&nbsp;would&nbsp;be&nbsp;useful&nbsp;if&nbsp;you&nbsp;could<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;say&nbsp;"YYY&nbsp;bug&nbsp;#XXX"&nbsp;where&nbsp;YYY&nbsp;is&nbsp;the&nbsp;name&nbsp;of&nbsp;another&nbsp;installation.<br>
-<br>
-Retirement<br>
-<br>
-&nbsp;&nbsp;&nbsp;?<br>
-<br>
-Whiny&nbsp;Reports<br>
-<br>
-&nbsp;&nbsp;&nbsp;?<br>
-<br>
-&nbsp;&nbsp;Group&nbsp;Redesign<br>
-<br>
-&nbsp;&nbsp;&nbsp;?<br>
-<br>
-&nbsp;&nbsp;Hard&nbsp;Wrapping&nbsp;Comments<br>
-<br>
-&nbsp;&nbsp;&nbsp;Currently&nbsp;Bugzilla&nbsp;"hard&nbsp;wraps"&nbsp;its&nbsp;comments&nbsp;to&nbsp;a&nbsp;specific&nbsp;line&nbsp;size,<br>
-&nbsp;&nbsp;&nbsp;similar&nbsp;to&nbsp;E-Mail.&nbsp;&nbsp;This&nbsp;has&nbsp;various&nbsp;problems:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;way&nbsp;it&nbsp;currently&nbsp;works,&nbsp;wrapping&nbsp;is&nbsp;done&nbsp;in&nbsp;the&nbsp;browser&nbsp;at<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;submission&nbsp;time&nbsp;using&nbsp;a&nbsp;non-standard&nbsp;HTML&nbsp;extension&nbsp;not&nbsp;supported<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;by&nbsp;some&nbsp;(uncommon)&nbsp;browsers.&nbsp;&nbsp;These&nbsp;browsers&nbsp;generate&nbsp;comments<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;scroll&nbsp;off&nbsp;the&nbsp;right&nbsp;side&nbsp;of&nbsp;the&nbsp;screen.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Because&nbsp;comments&nbsp;are&nbsp;of&nbsp;fixed&nbsp;width,&nbsp;when&nbsp;you&nbsp;expand&nbsp;your&nbsp;browser<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window,&nbsp;the&nbsp;comments&nbsp;do&nbsp;not&nbsp;expand&nbsp;to&nbsp;fit&nbsp;available&nbsp;space.<br>
-<br>
-&nbsp;&nbsp;&nbsp;It&nbsp;would&nbsp;be&nbsp;much&nbsp;better&nbsp;to&nbsp;move&nbsp;to&nbsp;a&nbsp;world&nbsp;of&nbsp;soft&nbsp;wrapping,&nbsp;where&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;browser&nbsp;wraps&nbsp;the&nbsp;text&nbsp;at&nbsp;display&nbsp;time,&nbsp;similar&nbsp;to&nbsp;a&nbsp;world&nbsp;processor.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;And&nbsp;as&nbsp;in&nbsp;a&nbsp;word&nbsp;processor,&nbsp;soft&nbsp;wrapping&nbsp;does&nbsp;not&nbsp;preclude&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;insertion&nbsp;of&nbsp;newlines.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Hard&nbsp;wrapping&nbsp;is&nbsp;too&nbsp;entrenched&nbsp;into&nbsp;text&nbsp;E-Mail&nbsp;to&nbsp;fix,&nbsp;but&nbsp;we&nbsp;can<br>
-&nbsp;&nbsp;&nbsp;fix&nbsp;Bugzilla&nbsp;without&nbsp;causing&nbsp;any&nbsp;problems.&nbsp;&nbsp;The&nbsp;old&nbsp;content&nbsp;will&nbsp;still<br>
-&nbsp;&nbsp;&nbsp;be&nbsp;wrapped&nbsp;too&nbsp;early,&nbsp;but&nbsp;at&nbsp;least&nbsp;new&nbsp;content&nbsp;will&nbsp;work.<br>
-&nbsp;&nbsp;&nbsp;</P
->
+>&#13;    This FAQ includes questions not covered elsewhere in the Guide.
   </P
-></DIV
-><DIV
-CLASS="CHAPTER"
-><HR><H1
-><A
-NAME="VARIANTS"
->Chapter 7. Bugzilla Variants and Competitors</A
-></H1
-><P
->I created this section to answer questions about Bugzilla
-    competitors and variants, then found a wonderful site which covers
-    an awful lot of what I wanted to discuss.  Rather than quote it in
-    its entirety, I'll simply refer you here: <A
-HREF="http://linas.org/linux/pm.html"
-TARGET="_top"
->http://linas.org/linux/pm.html</A
-></P
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="RHBUGZILLA"
->7.1. Red Hat Bugzilla</A
-></H1
-><P
->      Red Hat Bugzilla is probably the most popular Bugzilla variant
-      on the planet. One of the major benefits of Red Hat Bugzilla is
-      the ability to work with Oracle, MySQL, and PostGreSQL databases
-      serving as the back-end, instead of just MySQL.  Dave Lawrence
-      has worked very hard to keep Red Hat Bugzilla up-to-date, and
-      many people prefer the snappier-looking page layout of Red Hat
-      Bugzilla to the default Mozilla-standard formatting.
-    </P
-><P
->URL: <A
-HREF="http://bugzilla.redhat.com/bugzilla/"
-TARGET="_top"
->http://bugzilla.redhat.com/bugzilla/</A
-></P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="VARIANT_FENRIS"
->7.2. Loki Bugzilla (Fenris)</A
-></H1
-><P
->Fenris can be found at <A
-HREF="http://fenris.lokigames.com/"
-TARGET="_top"
->http://fenris.lokigames.com</A
->.  It is a fork from Bugzilla.</P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="VARIANT_ISSUEZILLA"
->7.3. Issuezilla</A
-></H1
-><P
->Issuezilla is another fork from Bugzilla, and seems nearly
-      as popular as the Red Hat Bugzilla fork.  Some Issuezilla team
-      members are regular contributors to the Bugzilla mailing
-      list/newsgroup.  Issuezilla is not the primary focus of
-      bug-tracking at tigris.org, however.  Their Java-based
-      bug-tracker, <A
-HREF="#VARIANT_SCARAB"
->Scarab, a newfangled Java-based issue tracker</A
->, is under heavy development
-      and looks promising!</P
-><P
->URL:  <A
-HREF="http://issuezilla.tigris.org/servlets/ProjectHome"
-TARGET="_top"
->http://issuezilla.tigris.org/servlets/ProjectHome</A
-></P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="VARIANT_SCARAB"
->7.4. Scarab</A
-></H1
-><P
->Scarab is a promising new bug-tracking system built using
-      Java Serlet technology.  As of this writing, no source code has
-      been released as a package, but you can obtain the code from
-      CVS.
-    </P
-><P
->URL: <A
-HREF="http://scarab.tigris.org/"
-TARGET="_top"
->http://scarab.tigris.org</A
-></P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="VARIANT_PERFORCE"
->7.5. Perforce SCM</A
-></H1
-><P
->Although Perforce isn't really a bug tracker, it can be used
-      as such through the <SPAN
-CLASS="QUOTE"
->"jobs"</SPAN
-> functionality.</P
-><P
-><A
-HREF="http://www.perforce.com/perforce/technotes/note052.html"
-TARGET="_top"
->http://www.perforce.com/perforce/technotes/note052.html</A
->http://www.perforce.com/perforce/technotes/note052.html</P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="VARIANT_SOURCEFORGE"
->7.6. SourceForge</A
-></H1
-><P
->SourceForge is more of a way of coordinating geographically
-      distributed free software and open source projects over the
-      Internet than strictly a bug tracker, but if you're hunting for
-      bug-tracking for your open project, it may be just what the
-      software engineer ordered!</P
-><P
->URL: <A
-HREF="http://www.sourceforge.net"
-TARGET="_top"
->http://www.sourceforge.net</A
-></P
-></DIV
-></DIV
 ><DIV
-CLASS="APPENDIX"
-><HR><H1
-><A
-NAME="FAQ"
->Appendix A. The Bugzilla FAQ</A
-></H1
-><DIV
-CLASS="QANDASET"
+CLASS="qandaset"
 ><DL
 ><DT
 >1. <A
-HREF="#FAQ_GENERAL"
+HREF="#faq-general"
 >General Questions</A
 ></DT
 ><DD
 ><DL
 ><DT
 >A.1.1. <A
-HREF="#AEN1713"
->	    Where can I find information about Bugzilla?</A
+HREF="#AEN1649"
+>&#13;	    Where can I find information about Bugzilla?</A
 ></DT
 ><DT
 >A.1.2. <A
-HREF="#AEN1719"
->	    What license is Bugzilla distributed under?
+HREF="#AEN1655"
+>&#13;	    What license is Bugzilla distributed under?
 	  </A
 ></DT
 ><DT
 >A.1.3. <A
-HREF="#AEN1725"
->	    How do I get commercial support for Bugzilla?
+HREF="#AEN1661"
+>&#13;	    How do I get commercial support for Bugzilla?
 	  </A
 ></DT
 ><DT
 >A.1.4. <A
-HREF="#AEN1732"
->	    What major companies or projects are currently using Bugzilla
+HREF="#AEN1668"
+>&#13;	    What major companies or projects are currently using Bugzilla
 	    for bug-tracking?
 	  </A
 ></DT
 ><DT
 >A.1.5. <A
-HREF="#AEN1757"
->	    Who maintains Bugzilla?
+HREF="#AEN1693"
+>&#13;	    Who maintains Bugzilla?
 	  </A
 ></DT
 ><DT
 >A.1.6. <A
-HREF="#AEN1763"
->	    How does Bugzilla stack up against other bug-tracking databases?
+HREF="#AEN1699"
+>&#13;	    How does Bugzilla stack up against other bug-tracking databases?
 	  </A
 ></DT
 ><DT
 >A.1.7. <A
-HREF="#AEN1770"
->	    How do I change my user name in Bugzilla?
+HREF="#AEN1705"
+>&#13;	    Why doesn't Bugzilla offer this or that feature or compatability
+	    with this other tracking software?
 	  </A
 ></DT
 ><DT
 >A.1.8. <A
-HREF="#AEN1775"
->	    Why doesn't Bugzilla offer this or that feature or compatability
-	    with this other tracking software?
+HREF="#AEN1712"
+>&#13;	    Why MySQL?  I'm interested in seeing Bugzilla run on
+	    Oracle/Sybase/Msql/PostgreSQL/MSSQL.
 	  </A
 ></DT
 ><DT
 >A.1.9. <A
-HREF="#AEN1782"
->	    Why MySQL?  I'm interested in seeing Bugzilla run on
-	    Oracle/Sybase/Msql/PostgreSQL/MSSQL?
+HREF="#AEN1717"
+>&#13;	    Why do the scripts say "/usr/bonsaitools/bin/perl" instead of
+	    "/usr/bin/perl" or something else?
 	  </A
 ></DT
 ><DT
 >A.1.10. <A
-HREF="#AEN1800"
->	    Why do the scripts say "/usr/bonsaitools/bin/perl" instead of
-	    "/usr/bin/perl" or something else?
+HREF="#AEN1723"
+>&#13;	    Is there an easy way to change the Bugzilla cookie name?
 	  </A
 ></DT
 ></DL
 ></DD
 ><DT
 >2. <A
-HREF="#FAQ_REDHAT"
->Red Hat Bugzilla</A
+HREF="#faq-phb"
+>Managerial Questions</A
 ></DT
 ><DD
 ><DL
 ><DT
 >A.2.1. <A
-HREF="#AEN1817"
->	    What about Red Hat Bugzilla?
+HREF="#AEN1733"
+>&#13;	    Is Bugzilla web-based, or do you have to have specific software or
+	    a specific operating system on your machine?
 	  </A
 ></DT
 ><DT
 >A.2.2. <A
-HREF="#AEN1825"
->	    What are the primary benefits of Red Hat Bugzilla?
-	  </A
-></DT
-><DT
->A.2.3. <A
-HREF="#AEN1853"
->	    What's the current status of Red Hat Bugzilla?
-	  </A
-></DT
-></DL
-></DD
-><DT
->3. <A
-HREF="#FAQ_LOKI"
->Loki Bugzilla (AKA Fenris)</A
-></DT
-><DD
-><DL
-><DT
->A.3.1. <A
-HREF="#AEN1866"
->	    What is Loki Bugzilla (Fenris)?
-	  </A
-></DT
-></DL
-></DD
-><DT
->4. <A
-HREF="#FAQ_PHB"
->Pointy-Haired-Boss Questions</A
-></DT
-><DD
-><DL
-><DT
->A.4.1. <A
-HREF="#AEN1877"
->	    Is Bugzilla web-based or do you have to have specific software or
-	    specific operating system on your machine?
-	  </A
-></DT
-><DT
->A.4.2. <A
-HREF="#AEN1882"
->	    Has anyone you know of already done any Bugzilla integration with
+HREF="#AEN1738"
+>&#13;	    Can Bugzilla integrate with
 	    Perforce (SCM software)?
 	  </A
 ></DT
 ><DT
->A.4.3. <A
-HREF="#AEN1887"
->	    Does Bugzilla allow the user to track multiple projects?
+>A.2.3. <A
+HREF="#AEN1743"
+>&#13;	    Does Bugzilla allow the user to track multiple projects?
 	  </A
 ></DT
 ><DT
->A.4.4. <A
-HREF="#AEN1892"
->	    If I am on many projects, and search for all bugs assigned to me, will
+>A.2.4. <A
+HREF="#AEN1748"
+>&#13;	    If I am on many projects, and search for all bugs assigned to me, will
 	    Bugzilla list them for me and allow me to sort by project, severity etc?
 	  </A
 ></DT
 ><DT
->A.4.5. <A
-HREF="#AEN1897"
->	    Does Bugzilla allow attachments (text, screenshots, urls etc)? If yes,
+>A.2.5. <A
+HREF="#AEN1753"
+>&#13;	    Does Bugzilla allow attachments (text, screenshots, URLs etc)? If yes,
 	    are there any that are NOT allowed?
 	  </A
 ></DT
 ><DT
->A.4.6. <A
-HREF="#AEN1902"
->	    Does Bugzilla allow us to define our own priorities and levels? Do we
+>A.2.6. <A
+HREF="#AEN1758"
+>&#13;	    Does Bugzilla allow us to define our own priorities and levels? Do we
 	    have complete freedom to change the labels of fields and format of them, and
 	    the choice of acceptable values?
 	  </A
 ></DT
 ><DT
->A.4.7. <A
-HREF="#AEN1909"
->	    The index.html page doesn't show the footer.  It's really annoying to have
-	    to go to the querypage just to check my "my bugs" link.  How do I get a footer
-	    on static HTML pages?
-	  </A
-></DT
-><DT
->A.4.8. <A
-HREF="#AEN1931"
->	    Does Bugzilla provide any reporting features, metrics, graphs, etc? You
+>A.2.7. <A
+HREF="#AEN1765"
+>&#13;	    Does Bugzilla provide any reporting features, metrics, graphs, etc? You
 	    know, the type of stuff that management likes to see. :)
 	  </A
 ></DT
 ><DT
->A.4.9. <A
-HREF="#AEN1939"
->	    Is there email notification and if so, what do you see when you get an
-	    email? Do you see bug number and title or is it only the number?
+>A.2.8. <A
+HREF="#AEN1772"
+>&#13;	    Is there email notification and if so, what do you see when you get an
+	    email?
 	  </A
 ></DT
 ><DT
->A.4.10. <A
-HREF="#AEN1944"
->	    Can email notification be set up to send to multiple
+>A.2.9. <A
+HREF="#AEN1777"
+>&#13;	    Can email notification be set up to send to multiple
 	    people, some on the To List, CC List, BCC List etc?
 	  </A
 ></DT
 ><DT
->A.4.11. <A
-HREF="#AEN1949"
->	    If there is email notification, do users have to have any particular
+>A.2.10. <A
+HREF="#AEN1782"
+>&#13;	    Do users have to have any particular
 	    type of email application?
 	  </A
 ></DT
 ><DT
->A.4.12. <A
-HREF="#AEN1956"
->	     If I just wanted to track certain bugs, as they go through life, can I
-	    set it up to alert me via email whenever that bug changes, whether it be
-	    owner, status or description etc.?
-	  </A
-></DT
-><DT
->A.4.13. <A
-HREF="#AEN1961"
->	    Does Bugzilla allow data to be imported and exported? If I had outsiders
+>A.2.11. <A
+HREF="#AEN1789"
+>&#13;	    Does Bugzilla allow data to be imported and exported? If I had outsiders
 	    write up a bug report using a MS Word bug template, could that template be
 	    imported into "matching" fields? If I wanted to take the results of a query
 	    and export that data to MS Excel, could I do that?
 	  </A
 ></DT
 ><DT
->A.4.14. <A
-HREF="#AEN1969"
->	    Has anyone converted Bugzilla to another language to be used in other
+>A.2.12. <A
+HREF="#AEN1797"
+>&#13;	    Has anyone converted Bugzilla to another language to be used in other
 	    countries? Is it localizable?
 	  </A
 ></DT
 ><DT
->A.4.15. <A
-HREF="#AEN1974"
->	    Can a user create and save reports? Can they do this in Word format?
+>A.2.13. <A
+HREF="#AEN1802"
+>&#13;	    Can a user create and save reports? Can they do this in Word format?
 	    Excel format?
 	  </A
 ></DT
 ><DT
->A.4.16. <A
-HREF="#AEN1979"
->	    Can a user re-run a report with a new project, same query?
-	  </A
-></DT
-><DT
->A.4.17. <A
-HREF="#AEN1984"
->	    Can a user modify an existing report and then save it into another name?
-	  </A
-></DT
-><DT
->A.4.18. <A
-HREF="#AEN1989"
->	    Does Bugzilla have the ability to search by word, phrase, compound
+>A.2.14. <A
+HREF="#AEN1807"
+>&#13;	    Does Bugzilla have the ability to search by word, phrase, compound
 	    search?
 	  </A
 ></DT
 ><DT
->A.4.19. <A
-HREF="#AEN1994"
->	    Can the admin person establish separate group and individual user
-	    privileges?
-	  </A
-></DT
-><DT
->A.4.20. <A
-HREF="#AEN1999"
->	     Does Bugzilla provide record locking when there is simultaneous access
+>A.2.15. <A
+HREF="#AEN1812"
+>&#13;	     Does Bugzilla provide record locking when there is simultaneous access
 	    to the same bug? Does the second person get a notice that the bug is in use
 	    or how are they notified?
 	  </A
 ></DT
 ><DT
->A.4.21. <A
-HREF="#AEN2004"
->	    Are there any backup features provided?
+>A.2.16. <A
+HREF="#AEN1817"
+>&#13;	    Are there any backup features provided?
 	  </A
 ></DT
 ><DT
->A.4.22. <A
-HREF="#AEN2010"
->	    Can users be on the system while a backup is in progress?
+>A.2.17. <A
+HREF="#AEN1823"
+>&#13;	    Can users be on the system while a backup is in progress?
 	  </A
 ></DT
 ><DT
->A.4.23. <A
-HREF="#AEN2015"
->	    What type of human resources are needed to be on staff to install and
+>A.2.18. <A
+HREF="#AEN1828"
+>&#13;	    What type of human resources are needed to be on staff to install and
 	    maintain Bugzilla? Specifically, what type of skills does the person need to
 	    have? I need to find out if we were to go with Bugzilla, what types of
 	    individuals would we need to hire and how much would that cost vs buying an
@@ -11351,9 +8996,9 @@ HREF="#AEN2015"
 	  </A
 ></DT
 ><DT
->A.4.24. <A
-HREF="#AEN2022"
->	    What time frame are we looking at if we decide to hire people to install
+>A.2.19. <A
+HREF="#AEN1834"
+>&#13;	    What time frame are we looking at if we decide to hire people to install
 	    and maintain the Bugzilla? Is this something that takes hours or weeks to
 	    install and a couple of hours per week to maintain and customize or is this
 	    a multi-week install process, plus a full time job for 1 person, 2 people,
@@ -11361,386 +9006,337 @@ HREF="#AEN2022"
 	  </A
 ></DT
 ><DT
->A.4.25. <A
-HREF="#AEN2027"
->	    Is there any licensing fee or other fees for using Bugzilla? Any
+>A.2.20. <A
+HREF="#AEN1839"
+>&#13;	    Is there any licensing fee or other fees for using Bugzilla? Any
 	    out-of-pocket cost other than the bodies needed as identified above?
 	  </A
 ></DT
 ></DL
 ></DD
 ><DT
->5. <A
-HREF="#FAQ_INSTALL"
->Bugzilla Installation</A
+>3. <A
+HREF="#faq-security"
+>Bugzilla Security</A
 ></DT
 ><DD
 ><DL
 ><DT
->A.5.1. <A
-HREF="#AEN2034"
->	    How do I download and install Bugzilla?
+>A.3.1. <A
+HREF="#AEN1846"
+>&#13;	    How do I completely disable MySQL security if it's giving me problems
+	    (I've followed the instructions in the installation section of this guide)?
 	  </A
 ></DT
 ><DT
->A.5.2. <A
-HREF="#AEN2040"
->	    How do I install Bugzilla on Windows NT?
+>A.3.2. <A
+HREF="#AEN1852"
+>&#13;	    Are there any security problems with Bugzilla?
 	  </A
 ></DT
 ><DT
->A.5.3. <A
-HREF="#AEN2045"
->	    Is there an easy way to change the Bugzilla cookie name?
+>A.3.3. <A
+HREF="#AEN1857"
+>&#13;	    I've implemented the security fixes mentioned in Chris Yeh's security
+	    advisory of 5/10/2000 advising not to run MySQL as root, and am running into
+	    problems with MySQL no longer working correctly.
 	  </A
 ></DT
 ></DL
 ></DD
 ><DT
->6. <A
-HREF="#FAQ_SECURITY"
->Bugzilla Security</A
+>4. <A
+HREF="#faq-email"
+>Bugzilla Email</A
 ></DT
 ><DD
 ><DL
 ><DT
->A.6.1. <A
-HREF="#AEN2052"
->	    How do I completely disable MySQL security if it's giving me problems
-	    (I've followed the instructions in the installation section of this guide!)?
+>A.4.1. <A
+HREF="#AEN1864"
+>&#13;	    I have a user who doesn't want to receive any more email from Bugzilla.
+	    How do I stop it entirely for this user?
 	  </A
 ></DT
 ><DT
->A.6.2. <A
-HREF="#AEN2058"
->	    Are there any security problems with Bugzilla?
+>A.4.2. <A
+HREF="#AEN1869"
+>&#13;	    I'm evaluating/testing Bugzilla, and don't want it to send email to
+	    anyone but me. How do I do it?
 	  </A
 ></DT
 ><DT
->A.6.3. <A
-HREF="#AEN2063"
->	    I've implemented the security fixes mentioned in Chris Yeh's security
-	    advisory of 5/10/2000 advising not to run MySQL as root, and am running into
-	    problems with MySQL no longer working correctly.
-	  </A
-></DT
-></DL
-></DD
-><DT
->7. <A
-HREF="#FAQ_EMAIL"
->Bugzilla Email</A
-></DT
-><DD
-><DL
-><DT
->A.7.1. <A
-HREF="#AEN2070"
->	    I have a user who doesn't want to receive any more email from Bugzilla.
-	    How do I stop it entirely for this user?
-	  </A
-></DT
-><DT
->A.7.2. <A
-HREF="#AEN2075"
->	    I'm evaluating/testing Bugzilla, and don't want it to send email to
-	    anyone but me. How do I do it?
-	  </A
-></DT
-><DT
->A.7.3. <A
-HREF="#AEN2080"
->	    I want whineatnews.pl to whine at something more, or other than, only new
-	    bugs. How do I do it?
+>A.4.3. <A
+HREF="#AEN1874"
+>&#13;	    I want whineatnews.pl to whine at something more, or other than, only new
+	    bugs. How do I do it?
 	  </A
 ></DT
 ><DT
->A.7.4. <A
-HREF="#AEN2086"
->	    I don't like/want to use Procmail to hand mail off to bug_email.pl.
+>A.4.4. <A
+HREF="#AEN1880"
+>&#13;	    I don't like/want to use Procmail to hand mail off to bug_email.pl.
 	    What alternatives do I have?
 	  </A
 ></DT
 ><DT
->A.7.5. <A
-HREF="#AEN2093"
->	    How do I set up the email interface to submit/change bugs via email?
+>A.4.5. <A
+HREF="#AEN1887"
+>&#13;	    How do I set up the email interface to submit/change bugs via email?
 	  </A
 ></DT
 ><DT
->A.7.6. <A
-HREF="#AEN2098"
->	    Email takes FOREVER to reach me from bugzilla -- it's extremely slow.
+>A.4.6. <A
+HREF="#AEN1892"
+>&#13;	    Email takes FOREVER to reach me from Bugzilla -- it's extremely slow.
 	    What gives?
 	  </A
 ></DT
 ><DT
->A.7.7. <A
-HREF="#AEN2105"
->	     How come email never reaches me from bugzilla changes?
+>A.4.7. <A
+HREF="#AEN1899"
+>&#13;	     How come email from Bugzilla changes never reaches me?
 	  </A
 ></DT
 ></DL
 ></DD
 ><DT
->8. <A
-HREF="#FAQ_DB"
+>5. <A
+HREF="#faq-db"
 >Bugzilla Database</A
 ></DT
 ><DD
 ><DL
 ><DT
->A.8.1. <A
-HREF="#AEN2113"
->	    I've heard Bugzilla can be used with Oracle?
-	  </A
-></DT
-><DT
->A.8.2. <A
-HREF="#AEN2118"
->	    Bugs are missing from queries, but exist in the database (and I can pull
-	    them up by specifying the bug ID). What's wrong?
+>A.5.1. <A
+HREF="#AEN1907"
+>&#13;	    I've heard Bugzilla can be used with Oracle?
 	  </A
 ></DT
 ><DT
->A.8.3. <A
-HREF="#AEN2123"
->	    I think my database might be corrupted, or contain invalid entries. What
+>A.5.2. <A
+HREF="#AEN1912"
+>&#13;	    I think my database might be corrupted, or contain invalid entries. What
 	    do I do?
 	  </A
 ></DT
 ><DT
->A.8.4. <A
-HREF="#AEN2131"
->	    I want to manually edit some entries in my database. How?
+>A.5.3. <A
+HREF="#AEN1920"
+>&#13;	    I want to manually edit some entries in my database. How?
 	  </A
 ></DT
 ><DT
->A.8.5. <A
-HREF="#AEN2136"
->	    I try to add myself as a user, but Bugzilla always tells me my password is wrong.
+>A.5.4. <A
+HREF="#AEN1925"
+>&#13;	    I try to add myself as a user, but Bugzilla always tells me my password is wrong.
 	  </A
 ></DT
 ><DT
->A.8.6. <A
-HREF="#AEN2141"
->	    I think I've set up MySQL permissions correctly, but bugzilla still can't
+>A.5.5. <A
+HREF="#AEN1930"
+>&#13;	    I think I've set up MySQL permissions correctly, but Bugzilla still can't
 	    connect.
 	  </A
 ></DT
 ><DT
->A.8.7. <A
-HREF="#AEN2146"
->	    How do I synchronize bug information among multiple different Bugzilla
+>A.5.6. <A
+HREF="#AEN1935"
+>&#13;	    How do I synchronize bug information among multiple different Bugzilla
 	    databases?
 	  </A
 ></DT
-><DT
->A.8.8. <A
-HREF="#AEN2153"
->	    Why do I get bizarre errors when trying to submit data, particularly problems
-	    with "groupset"?
-	  </A
-></DT
-><DT
->A.8.9. <A
-HREF="#AEN2158"
->	    How come even after I delete bugs, the long descriptions show up?
-	  </A
-></DT
 ></DL
 ></DD
 ><DT
->9. <A
-HREF="#FAQ_NT"
+>6. <A
+HREF="#faq-nt"
 >Bugzilla and Win32</A
 ></DT
 ><DD
 ><DL
 ><DT
->A.9.1. <A
-HREF="#AEN2168"
->	    What is the easiest way to run Bugzilla on Win32 (Win98+/NT/2K)?
+>A.6.1. <A
+HREF="#AEN1944"
+>&#13;	    What is the easiest way to run Bugzilla on Win32 (Win98+/NT/2K)?
 	  </A
 ></DT
 ><DT
->A.9.2. <A
-HREF="#AEN2173"
->	    Is there a "Bundle::Bugzilla" equivalent for Win32?
+>A.6.2. <A
+HREF="#AEN1949"
+>&#13;	    Is there a "Bundle::Bugzilla" equivalent for Win32?
 	  </A
 ></DT
 ><DT
->A.9.3. <A
-HREF="#AEN2178"
->	    CGI's are failing with a "something.cgi is not a valid Windows NT
+>A.6.3. <A
+HREF="#AEN1954"
+>&#13;	    CGI's are failing with a "something.cgi is not a valid Windows NT
 	    application" error. Why?
 	  </A
 ></DT
 ><DT
->A.9.4. <A
-HREF="#AEN2186"
->	    Can I have some general instructions on how to make Bugzilla on Win32 work?
-	  </A
-></DT
-><DT
->A.9.5. <A
-HREF="#AEN2192"
->	    I'm having trouble with the perl modules for NT not being able to talk to
+>A.6.4. <A
+HREF="#AEN1962"
+>&#13;	    I'm having trouble with the perl modules for NT not being able to talk to
 	    to the database.
 	  </A
 ></DT
 ></DL
 ></DD
 ><DT
->10. <A
-HREF="#FAQ_USE"
+>7. <A
+HREF="#faq-use"
 >Bugzilla Usage</A
 ></DT
 ><DD
 ><DL
 ><DT
->A.10.1. <A
-HREF="#AEN2213"
->	    The query page is very confusing.  Isn't there a simpler way to query?
+>A.7.1. <A
+HREF="#AEN1983"
+>&#13;	    How do I change my user name (email address) in Bugzilla?
+	  </A
+></DT
+><DT
+>A.7.2. <A
+HREF="#AEN1988"
+>&#13;	    The query page is very confusing.  Isn't there a simpler way to query?
 	  </A
 ></DT
 ><DT
->A.10.2. <A
-HREF="#AEN2219"
->	    I'm confused by the behavior of the "accept" button in the Show Bug form.
+>A.7.3. <A
+HREF="#AEN1993"
+>&#13;	    I'm confused by the behavior of the "accept" button in the Show Bug form.
 	    Why doesn't it assign the bug to me when I accept it?
 	  </A
 ></DT
 ><DT
->A.10.3. <A
-HREF="#AEN2229"
->	    I can't upload anything into the database via the "Create Attachment"
+>A.7.4. <A
+HREF="#AEN2003"
+>&#13;	    I can't upload anything into the database via the "Create Attachment"
 	    link.  What am I doing wrong?
 	  </A
 ></DT
 ><DT
->A.10.4. <A
-HREF="#AEN2234"
->	    Email submissions to Bugzilla that have attachments end up asking me to
+>A.7.5. <A
+HREF="#AEN2008"
+>&#13;	    Email submissions to Bugzilla that have attachments end up asking me to
 	    save it as a "cgi" file.
 	  </A
 ></DT
 ><DT
->A.10.5. <A
-HREF="#AEN2239"
->	    How do I change a keyword in Bugzilla, once some bugs are using it?
+>A.7.6. <A
+HREF="#AEN2013"
+>&#13;	    How do I change a keyword in Bugzilla, once some bugs are using it?
 	  </A
 ></DT
 ></DL
 ></DD
 ><DT
->11. <A
-HREF="#FAQ_HACKING"
+>8. <A
+HREF="#faq-hacking"
 >Bugzilla Hacking</A
 ></DT
 ><DD
 ><DL
 ><DT
->A.11.1. <A
-HREF="#AEN2246"
->	    What bugs are in Bugzilla right now?
+>A.8.1. <A
+HREF="#AEN2020"
+>&#13;	    What bugs are in Bugzilla right now?
 	  </A
 ></DT
 ><DT
->A.11.2. <A
-HREF="#AEN2255"
->	    How can I change the default priority to a null value?  For instance, have the default
+>A.8.2. <A
+HREF="#AEN2029"
+>&#13;	    How can I change the default priority to a null value?  For instance, have the default
 	    priority be "---" instead of "P2"?
 	  </A
 ></DT
 ><DT
->A.11.3. <A
-HREF="#AEN2261"
->	    What's the best way to submit patches?  What guidelines should I follow?
+>A.8.3. <A
+HREF="#AEN2035"
+>&#13;	    What's the best way to submit patches?  What guidelines should I follow?
 	  </A
 ></DT
 ></DL
 ></DD
 ></DL
 ><DIV
-CLASS="QANDADIV"
+CLASS="qandadiv"
 ><H3
 ><A
-NAME="FAQ_GENERAL"
-></A
->1. General Questions</H3
+NAME="faq-general">1. General Questions</H3
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1713"
-></A
-><B
+NAME="AEN1649"><B
 >A.1.1. </B
->	    Where can I find information about Bugzilla?</P
+>
+	    Where can I find information about Bugzilla?</P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    You can stay up-to-date with the latest Bugzilla
+>
+	    You can stay up-to-date with the latest Bugzilla
 	    information at <A
-HREF="http://www.mozilla.org/projects/bugzilla/"
+HREF="http://www.bugzilla.org/"
 TARGET="_top"
->	    http://www.mozilla.org/projects/bugzilla/</A
+>&#13;	    http://www.bugzilla.org/</A
 >
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1719"
-></A
-><B
+NAME="AEN1655"><B
 >A.1.2. </B
->	    What license is Bugzilla distributed under?
+>
+	    What license is Bugzilla distributed under?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Bugzilla is covered by the Mozilla Public License.
+>
+	    Bugzilla is covered by the Mozilla Public License.
 	    See details at <A
 HREF="http://www.mozilla.org/MPL/"
 TARGET="_top"
->	    http://www.mozilla.org/MPL/</A
+>&#13;	    http://www.mozilla.org/MPL/</A
 >
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1725"
-></A
-><B
+NAME="AEN1661"><B
 >A.1.3. </B
->	    How do I get commercial support for Bugzilla?
+>
+	    How do I get commercial support for Bugzilla?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    <A
+>
+	    <A
 HREF="http://www.collab.net/"
 TARGET="_top"
 >www.collab.net</A
@@ -11750,33 +9346,33 @@ TARGET="_top"
 	    aren't interested in small projects.
 	  </P
 ><P
->	    There are several experienced
+>&#13;	    There are several experienced
 	    Bugzilla hackers on the mailing list/newsgroup who are willing
-	    to whore themselves out for generous compensation.
+	    to make themselves available for generous compensation.
 	    Try sending a message to the mailing list asking for a volunteer.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1732"
-></A
-><B
+NAME="AEN1668"><B
 >A.1.4. </B
->	    What major companies or projects are currently using Bugzilla
+>
+	    What major companies or projects are currently using Bugzilla
 	    for bug-tracking?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    There are <EM
+>
+	    There are <EM
 >dozens</EM
 > of major comapanies with public
 	    Bugzilla sites to track bugs in their products.  A few include:
@@ -11795,15 +9391,15 @@ BORDER="0"
 ></TR
 ><TR
 ><TD
->AtHome Corporation</TD
+>NASA</TD
 ></TR
 ><TR
 ><TD
->Red Hat Software</TD
+>AtHome Corporation</TD
 ></TR
 ><TR
 ><TD
->Loki Entertainment Software</TD
+>Red Hat Software</TD
 ></TR
 ><TR
 ><TD
@@ -11815,10 +9411,6 @@ BORDER="0"
 ></TR
 ><TR
 ><TD
->The Eazel Project</TD
-></TR
-><TR
-><TD
 >AbiSource</TD
 ></TR
 ><TR
@@ -11851,6 +9443,10 @@ BORDER="0"
 ></TR
 ><TR
 ><TD
+>Ximian</TD
+></TR
+><TR
+><TD
 >Linux-Mandrake</TD
 ></TR
 ></TBODY
@@ -11860,61 +9456,60 @@ BORDER="0"
 >
 	  </P
 ><P
->	    Suffice to say, there are more than enough huge projects using Bugzilla
+>&#13;	    Suffice to say, there are more than enough huge projects using Bugzilla
 	    that we can safely say it's extremely popular.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1757"
-></A
-><B
+NAME="AEN1693"><B
 >A.1.5. </B
->	    Who maintains Bugzilla?
+>
+	    Who maintains Bugzilla?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Bugzilla maintenance has been in a state of flux recently.
-	    Please check <A
-HREF="http://www.mozilla.org/projects/bugzilla/"
-TARGET="_top"
->the Bugzilla Project Page for the latest details. </A
 >
+	    A 
+      <A
+HREF="http://www.bugzilla.org/who_we_are.html"
+TARGET="_top"
+>core team</A
+>,
+      led by Dave Miller (justdave@syndicomm.com).      
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1763"
-></A
-><B
+NAME="AEN1699"><B
 >A.1.6. </B
->	    How does Bugzilla stack up against other bug-tracking databases?
+>
+	    How does Bugzilla stack up against other bug-tracking databases?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    A year has gone by, and I <EM
->still</EM
-> can't
-	    find any head-to-head comparisons of Bugzilla against
-	    other defect-tracking software.  However, from my personal
+>
+	    We can't find any head-to-head comparisons of Bugzilla against
+	    other defect-tracking software. If you know of one, please
+      get in touch. However, from the author's personal
 	    experience with other bug-trackers, Bugzilla offers
 	    superior performance on commodity hardware, better price
 	    (free!), more developer- friendly features (such as stored
@@ -11923,69 +9518,45 @@ CLASS="ANSWER"
 	    flexibility, and superior ease-of-use.
 	  </P
 ><P
->	    If you happen to be a commercial bug-tracker vendor, please
-	    step forward with a rebuttal so I can include it in the
-	    FAQ.  We're not in pursuit of Bugzilla ueber alles; we
-	    simply love having a powerful, open-source tool to get our
-	    jobs done.
+>&#13;	    If you happen to be a commercial bug-tracker vendor, please
+	    step forward with a list of advantages your product has over
+      Bugzilla. We'd be happy to include it in the "Competitors"
+      section.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1770"
-></A
-><B
+NAME="AEN1705"><B
 >A.1.7. </B
->	    How do I change my user name in Bugzilla?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    You can't.  However, the administrative account can, by simply opening
-	    your user account in editusers.cgi and changing the login name.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN1775"
-></A
-><B
->A.1.8. </B
->	    Why doesn't Bugzilla offer this or that feature or compatability
+>
+	    Why doesn't Bugzilla offer this or that feature or compatability
 	    with this other tracking software?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    It may be that the support has not been built yet, or that you
+>
+	    It may be that the support has not been built yet, or that you
 	    have not yet found it.  Bugzilla is making tremendous strides in
 	    usability, customizability, scalability, and user interface.  It
 	    is widely considered the most complete and popular open-source
 	    bug-tracking software in existence.
 	  </P
 ><P
->	    That doesn't mean it can't use improvement!
+>&#13;	    That doesn't mean it can't use improvement!
 	    You can help the project along by either hacking a patch yourself
 	    that supports the functionality you require, or else submitting a
 	    "Request for Enhancement" (RFE) using the bug submission interface
 	    at <A
-HREF="http://bugzilla.mozilla.org/"
+HREF="http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla"
 TARGET="_top"
 >bugzilla.mozilla.org</A
 >.
@@ -11993,187 +9564,95 @@ TARGET="_top"
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1782"
-></A
-><B
->A.1.9. </B
->	    Why MySQL?  I'm interested in seeing Bugzilla run on
-	    Oracle/Sybase/Msql/PostgreSQL/MSSQL?
+NAME="AEN1712"><B
+>A.1.8. </B
+>
+	    Why MySQL?  I'm interested in seeing Bugzilla run on
+	    Oracle/Sybase/Msql/PostgreSQL/MSSQL.
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->Terry Weissman answers,
-	  <A
-NAME="AEN1786"
-></A
-><BLOCKQUOTE
-CLASS="BLOCKQUOTE"
-><P
->	      You're not the only one. But <EM
->I</EM
-> am not very interested. I'm not
-	      a real SQL or database person. I just wanted to make a useful tool,
-	      and build it on top of free software. So, I picked MySQL, and
-	      learned SQL by staring at the MySQL manual and some code lying
-	      around here, and
-	      wrote Bugzilla. I didn't know that Enum's were non-standard SQL.
-	      I'm not sure if I would have cared, but I didn't even know. So, to
-	      me, things are "portable" because it uses MySQL, and MySQL is
-	      portable enough. I fully understand (now) that people want to be
-	      portable to other databases, but that's never been a real concern
-	      of mine.
-	    </P
-></BLOCKQUOTE
 >
+      There is DB-independence work afoot. PostgreSQL support is planned
+      for 2.18, and full DB-independence can't be far further on.
 	  </P
-><P
->	    Things aren't quite that grim these days, however.  Terry pretty much
-	    sums up much of the thinking many of us have for Bugzilla, but there
-	    is light on the horizon for database-independence!  Here are some options:
-	  </P
-><P
-></P
-><TABLE
-BORDER="0"
-><TBODY
-><TR
-><TD
->	      <EM
-><A
-HREF="http://bugzilla.redhat.com/"
-TARGET="_top"
->Red Hat Bugzilla</A
-></EM
->:
-	      Runs a modified Bugzilla 2.8 atop an Oracle database.
-	    </TD
-></TR
-><TR
-><TD
->	      <EM
-><A
-HREF="http://sourceforge.net/projects/interzilla"
-TARGET="_top"
->Interzilla</A
-></EM
->:
-	      A project to run Bugzilla on Interbase.  No code released yet, however.
-	    </TD
-></TR
-><TR
-><TD
->	      <EM
->Bugzilla 3.0</EM
->: One of the primary stated goals
-	      is multiple database support.
-	    </TD
-></TR
-></TBODY
-></TABLE
-><P
-></P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1800"
-></A
-><B
->A.1.10. </B
->	    Why do the scripts say "/usr/bonsaitools/bin/perl" instead of
+NAME="AEN1717"><B
+>A.1.9. </B
+>
+	    Why do the scripts say "/usr/bonsaitools/bin/perl" instead of
 	    "/usr/bin/perl" or something else?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	     Mozilla.org uses /usr/bonsaitools/bin/perl. The prime rule in making
-	    submissions is "don't break bugzilla.mozilla.org". If it breaks it, your
-	    patch will be reverted faster than you can do a diff.
-	  </P
-><P
->	    Here's Terry Weissman's comment, for some historical context:
-	    <A
-NAME="AEN1805"
-></A
-><BLOCKQUOTE
-CLASS="BLOCKQUOTE"
-><P
->		[This was] purely my own convention. I wanted a place to put a version of
-		Perl and other tools that was strictly under my control for the
-		various webtools, and not subject to anyone else. Edit it to point
-		to whatever you like.
-	      </P
-><DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
+>
+	     Mozilla.org uses /usr/bonsaitools/bin/perl, because originally
+       Terry wanted a place to put a version of Perl and other tools 
+       that was strictly under his control. 
+    </P
 ><P
->		  We always recommend that, if possible, you keep the path
-		  as /usr/bonsaitools/bin/perl, and simply add a /usr/bonsaitools
-		  and /usr/bonsaitools/bin directory, then symlink your version
-		  of perl to /usr/bonsaitools/bin/perl.  This will make upgrading
+>&#13;		  We always recommend that, if possible, you keep the path
+		  as /usr/bonsaitools/bin/perl, and simply add symlink.  
+      This will make upgrading
 		  your Bugzilla much easier in the future.
 		</P
+></DIV
+></DIV
+><DIV
+CLASS="qandaentry"
+><DIV
+CLASS="question"
 ><P
->		  Obviously, if you do not have root access to your Bugzilla
-		  box, our suggestion is irrelevant.
-		</P
-></TD
-></TR
-></TABLE
+><A
+NAME="AEN1723"><B
+>A.1.10. </B
+>
+	    Is there an easy way to change the Bugzilla cookie name?
+	  </P
 ></DIV
-></BLOCKQUOTE
+><DIV
+CLASS="answer"
+><P
+><B
+> </B
 >
+	    At present, no.
 	  </P
 ></DIV
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDADIV"
+CLASS="qandadiv"
 ><H3
 ><A
-NAME="FAQ_REDHAT"
-></A
->2. Red Hat Bugzilla</H3
+NAME="faq-phb">2. Managerial Questions</H3
 ><P
->	<DIV
-CLASS="NOTE"
+>&#13;	<DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -12189,10 +9668,7 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	    <EM
->This section is no longer up-to-date.</EM
->
-	    Please see the section on "Red Hat Bugzilla" under "Variants" in The Bugzilla Guide.
+>&#13;	    Questions likely to be asked by managers. :-)
 	  </P
 ></TD
 ></TR
@@ -12201,341 +9677,274 @@ VALIGN="TOP"
 >
       </P
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1817"
-></A
-><B
+NAME="AEN1733"><B
 >A.2.1. </B
->	    What about Red Hat Bugzilla?
+>
+	    Is Bugzilla web-based, or do you have to have specific software or
+	    a specific operating system on your machine?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Red Hat Bugzilla is arguably more user-friendly, customizable, and scalable
-	    than stock Bugzilla. Check it out at
-	    http://bugzilla.redhat.com and the sources at ftp://people.redhat.com/dkl/.
-	    They've set their Bugzilla up to work with Oracle out of the box.
-	    Note that Redhat Bugzilla is based upon the 2.8 Bugzilla tree;
-	    Bugzilla has made some tremendous advances since the 2.8 release.
-	    Why not download both Bugzillas to check out the differences for
-	    yourself?
-	  </P
-><P
->	    Dave Lawrence, the original Red Hat Bugzilla maintainer, mentions:
-	    <A
-NAME="AEN1822"
-></A
-><BLOCKQUOTE
-CLASS="BLOCKQUOTE"
-><P
->		Somebody needs to take the ball and run with it.  I'm the only
-		maintainer and am very pressed for time.
-	      </P
-></BLOCKQUOTE
 >
-	    If you, or someone you know, has the time and expertise to do the integration
-	    work so main-tree Bugzilla 2.12 and higher integrates the Red
-	    Hat Bugzilla Oracle modifications, please donate your
-	    time to supporting the Bugzilla project.
+	    It is web and e-mail based.  You can edit bugs by sending specially
+	    formatted email to a properly configured Bugzilla, or control via the web.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1825"
-></A
-><B
+NAME="AEN1738"><B
 >A.2.2. </B
->	    What are the primary benefits of Red Hat Bugzilla?
+>
+	    Can Bugzilla integrate with
+	    Perforce (SCM software)?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    <EM
->Dave Lawrence</EM
->:
-	    <A
-NAME="AEN1830"
-></A
-><BLOCKQUOTE
-CLASS="BLOCKQUOTE"
+>
+	    Yes!  You can find more information elsewhere in "The Bugzilla
+	    Guide" in the "Integration with Third-Party Products" section.
+	  </P
+></DIV
+></DIV
+><DIV
+CLASS="qandaentry"
+><DIV
+CLASS="question"
 ><P
->		For the record, we are not using any template type implementation for
-		the cosmetic changes maded to Bugzilla.  It is just alot of html changes
-		in the code itself.  I admit I may have gotten a little carried away with it
-		but the corporate types asked for a more standardized interface to match up
-		with other projects relating to Red Hat web sites.  A lot of other web based
-		internal tools I am working on also look like Bugzilla.
-	      </P
+><A
+NAME="AEN1743"><B
+>A.2.3. </B
+>
+	    Does Bugzilla allow the user to track multiple projects?
+	  </P
+></DIV
+><DIV
+CLASS="answer"
 ><P
->		I do want to land the changes that I have made to Bugzilla but I may
-		have to back out a good deal and make a different version of Red Hat's
-		Bugzilla for checking in to CVS. Especially the cosmetic changes because it
-		seems they may not fit the general public.  I will do that as soon as I can.
-		I also still do my regular QA responsibilities along with Bugzilla so time
-		is difficult sometimes to come by.
-	      </P
-><P
->		There are also a good deal of other changes that were requested by
-		management for things like support contracts and different permission
-		groups for making bugs private. Here is a short list of the major
-		changes that have been made:
-	      </P
-><P
-></P
-><OL
-TYPE="1"
-><LI
-><P
->		    No enum types. All old enum types are now separate smaller tables.
-		  </P
-></LI
-><LI
-><P
->		    No bit wise operations. Not all databases support this so they were
-		    changed to a more generic way of doing this task
-		  </P
-></LI
-><LI
-><P
->		    Bug reports can only be altered by the reporter, assignee, or a
-		    privileged bugzilla user. The rest of the world can see the bug but in
-		    a non-changeable format (unless the bug has been marked private).  They
-		    can however add comments, add and remove themselves from the CC list
-		  </P
-></LI
-><LI
-><P
->		    Different group scheme. Each group has an id number related to it.
-		    There is a user_group table which contains userid to groupid mappings
-		    to determine which groups each user belongs to.  Additionally there is
-		    a bug_group table that has bugid to groupid mappings to show which
-		    groups can see a particular bug. If there are no entries for a bug in
-		    this table then the bug is public.
-		  </P
-></LI
-><LI
-><P
->		    Product groups. product_table created to only allow certain products to
-		    be visible for certain groups in both bug entry and query. This was
-		    particulary helpful for support contracts.
-		  </P
-></LI
-><LI
+><B
+> </B
+>
+	    Absolutely!  You can track any number of Products (although you
+      are limited to about 55 or so if
+      you are using Product-Based Groups), that can each be composed of any
+      number of Components.
+	  </P
+></DIV
+></DIV
+><DIV
+CLASS="qandaentry"
+><DIV
+CLASS="question"
 ><P
->		    Of course many (too many) changes to Bugzilla code itself to allow use
-		    with Oracle and still allow operation with Mysql if so desired.
-		    Currently if you use Mysql it is set to use Mysql's old permission
-		    scheme to keep breakage to a minimum. Hopefully one day this will
-		    standardize on one style which may of course be something completely
-		    different.
-		  </P
-></LI
-><LI
+><A
+NAME="AEN1748"><B
+>A.2.4. </B
+>
+	    If I am on many projects, and search for all bugs assigned to me, will
+	    Bugzilla list them for me and allow me to sort by project, severity etc?
+	  </P
+></DIV
+><DIV
+CLASS="answer"
 ><P
->		    Uses Text::Template perl module for rendering of the dynamic HTML pages
-		    such as enter_bug.cgi, query.cgi, bug_form.pl, and for the header and
-		    footer parts of the page. This allows the html to be separate from the
-		    perl code for customizing the look and feel of the page to one's
-		    preference.
-		  </P
-></LI
-><LI
+><B
+> </B
+>
+	    Yes.
+	  </P
+></DIV
+></DIV
+><DIV
+CLASS="qandaentry"
+><DIV
+CLASS="question"
 ><P
->		    There are many other smaller changes. There is also a port to Oracle
-		    that I have been working on as time permits but is not completely
-		    finished but somewhat usable. I will merge it into our standard code
-		    base when it becomes production quality. Unfortunately there will have
-		    to be some conditionals in the code to make it work with other than
-		    Oracle due to some differences between Oracle and Mysql.
-		  </P
-></LI
-></OL
+><A
+NAME="AEN1753"><B
+>A.2.5. </B
+>
+	    Does Bugzilla allow attachments (text, screenshots, URLs etc)? If yes,
+	    are there any that are NOT allowed?
+	  </P
+></DIV
+><DIV
+CLASS="answer"
 ><P
->		Both the Mysql and Oracle versions of our current code base are
-		available from ftp://people.redhat.com/dkl. If Terry/Tara wants I can submit
-		patch files for all of the changes I have made and he can determine what is
-		suitable for addition to the main bugzilla cade base. But for me to commit
-		changes to the actual CVS I will need to back out alot of things that are
-		not suitable for the rest of the Bugzilla community. I am open to
-		suggestions.
-	      </P
-></BLOCKQUOTE
+><B
+> </B
 >
+	    Yes - any sort of attachment is allowed, although administrators can
+      configure a maximum size.  
+      There are many specific MIME-types that are pre-defined by Bugzilla,
+	    but you may specify any arbitrary MIME-type you need when you
+	    upload the file. 
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1853"
-></A
-><B
->A.2.3. </B
->	    What's the current status of Red Hat Bugzilla?
+NAME="AEN1758"><B
+>A.2.6. </B
+>
+	    Does Bugzilla allow us to define our own priorities and levels? Do we
+	    have complete freedom to change the labels of fields and format of them, and
+	    the choice of acceptable values?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    <DIV
-CLASS="NOTE"
+>
+	    Yes.  However, modifying some fields, notably those related to bug
+	    progression states, also require adjusting the program logic to
+	    compensate for the change.
+	  </P
 ><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
+>&#13;	    There is no GUI for adding fields to Bugzilla at this
+	    time.  You can follow development of this feature at
+	    <A
+HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=91037"
+TARGET="_top"
+>http://bugzilla.mozilla.org/show_bug.cgi?id=91037</A
+>
+	  </P
+></DIV
+></DIV
+><DIV
+CLASS="qandaentry"
+><DIV
+CLASS="question"
 ><P
->		This information is somewhat dated; I last updated it
-		7 June 2000.  Please see the "Variants" section of "The Bugzilla Guide"
-		for more up-to-date information regarding Red Hat Bugzilla.
-	      </P
-></TD
-></TR
-></TABLE
+><A
+NAME="AEN1765"><B
+>A.2.7. </B
+>
+	    Does Bugzilla provide any reporting features, metrics, graphs, etc? You
+	    know, the type of stuff that management likes to see. :)
+	  </P
 ></DIV
+><DIV
+CLASS="answer"
+><P
+><B
+> </B
 >
-	    <EM
->Dave Lawrence</EM
->:
-	    <A
-NAME="AEN1860"
-></A
-><BLOCKQUOTE
-CLASS="BLOCKQUOTE"
+	    Yes.  Look at <A
+HREF="http://bugzilla.mozilla.org/reports.cgi"
+TARGET="_top"
+>&#13;	    http://bugzilla.mozilla.org/reports.cgi</A
+> for basic reporting
+	    and graphing facilities.
+	  </P
 ><P
->		     I suppose the current thread warrants an update on the status of
-		Oracle and bugzilla ;) We have now been running Bugzilla 2.8 on
-		Oracle for the last two days in our production environment. I
-		tried to do as much testing as possible with it before going live
-		which is some of the reason for the long delay. I did not get
-		enough feedback as I would have liked from internal developers to
-		help weed out any bugs still left so I said "Fine, i will take it
-		live and then I will get the feedback I want :)" So it is now
-		starting to stabilize and it running quite well after working
-		feverishly the last two days fixing problems as soon as they came
-		in from the outside world. The current branch in cvs is up2date if
-		anyone would like to grab it and try it out. The oracle _setup.pl
-		is broken right now due to some last minute changes but I will
-		update that soon. Therefore you would probably need to create the
-		database tables the old fashioned way using the supplied sql
-		creation scripts located in the ./oracle directory. We have heavy
-		optimizations in the database it self thanks to the in-house DBA
-		here at Red Hat so it is running quite fast. The database itself
-		is located on a dual PII450 with 1GB ram and 14 high voltage
-		differential raided scsi drives. The tables and indexes are
-		partitioned in 4 chuncks across the raided drive which is nice
-		because when ever you need to do a full table scan, it is actually
-		starting in 4 different locations on 4 different drives
-		simultaneously. And the indexes of course are on separate drives
-		from the data so that speeds things up tremendously. When  I can
-		find the time I will document all that we have done to get this
-		thing going to help others that may need it.
-	      </P
+>&#13;	    For more advanced reporting, I recommend hooking up a professional
+	    reporting package, such as Crystal Reports, and use ODBC to access
+	    the MySQL database.  You can do a lot through the Query page of
+	    Bugzilla as well, but right now Advanced Reporting is much
+	    better accomplished through third-party utilities that can
+	    interface with the database directly.
+	  </P
+></DIV
+></DIV
+><DIV
+CLASS="qandaentry"
+><DIV
+CLASS="question"
 ><P
->		As Matt has mentioned it is still using out-dated code and with a
-		little help I would like to bring everything up to date for
-		eventual  incorporation with the main cvs tree. Due to other
-		duties I have with the company any help with this wiould be
-		appreciated. What we are using  now is what I call a best first
-		effort. It definitely can be improved on and may even need
-		complete rewrites in a lot of areas. A lot of changes may have to
-		be made in the way Bugzilla does things currently  to make this
-		transition to a more generic database interface.  Fortunately when
-		making the Oracle changes I made sure I didn't do  anything that I
-		would consider Oracle specific and could not be easily done with
-		other databases. Alot of the sql statements need to be broken up
-		into smaller utilities that themselves would need to make
-		decisions on what database they are using but the majority of the
-		code can be made database neutral.
-	      </P
-></BLOCKQUOTE
+><A
+NAME="AEN1772"><B
+>A.2.8. </B
 >
+	    Is there email notification and if so, what do you see when you get an
+	    email?
 	  </P
 ></DIV
+><DIV
+CLASS="answer"
+><P
+><B
+> </B
+>
+	    Email notification is user-configurable.  By default, the bug id and 
+      Summary of the bug report accompany each email notification, along with
+	    a list of the changes made.
+	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDADIV"
-><H3
-><A
-NAME="FAQ_LOKI"
-></A
->3. Loki Bugzilla (AKA Fenris)</H3
-><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1866"
-></A
-><B
->A.3.1. </B
->	    What is Loki Bugzilla (Fenris)?
+NAME="AEN1777"><B
+>A.2.9. </B
+>
+	    Can email notification be set up to send to multiple
+	    people, some on the To List, CC List, BCC List etc?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Loki Games has a customized version of Bugzilla available at
-	    <A
-HREF="http://fenris.lokigames.com/"
-TARGET="_top"
->http://fenris.lokigames.com</A
->.  There are some advantages to using Fenris, chief being separation of comments based upon user privacy level, data hiding, forced login for any data retrieval, and some additional fields.  Loki has mainted their code, originally a fork from the Bugzilla 2.8 code base, and it is quite a bit different than stock Bugzilla at this point.  I recommend you stick with official Bugzilla version 2.14 rather than using a fork, but it's up to you.
+>
+	    Yes.
 	  </P
 ></DIV
 ></DIV
-></DIV
 ><DIV
-CLASS="QANDADIV"
-><H3
+CLASS="qandaentry"
+><DIV
+CLASS="question"
+><P
 ><A
-NAME="FAQ_PHB"
-></A
->4. Pointy-Haired-Boss Questions</H3
+NAME="AEN1782"><B
+>A.2.10. </B
+>
+	    Do users have to have any particular
+	    type of email application?
+	  </P
+></DIV
+><DIV
+CLASS="answer"
 ><P
->	<DIV
-CLASS="NOTE"
+><B
+> </B
+>
+	    Bugzilla email is sent in plain text, the most compatible mail format
+	    on the planet.
+	    <DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -12551,2778 +9960,1296 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	    The title of this section doesn't mean you're a PHB -- it just means
-	    you probably HAVE a PHB who wants to know this :)
-	  </P
+>&#13;		If you decide to use the bugzilla_email integration features
+		to allow Bugzilla to record responses to mail with the associated bug,
+		you may need to caution your users to set their mailer to "respond
+		to messages in the format in which they were sent".  For security reasons
+		Bugzilla ignores HTML tags in comments, and if a user sends HTML-based
+		email into Bugzilla the resulting comment looks downright awful.
+	      </P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 >
-      </P
+	  </P
+></DIV
+></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1877"
-></A
-><B
->A.4.1. </B
->	    Is Bugzilla web-based or do you have to have specific software or
-	    specific operating system on your machine?
+NAME="AEN1789"><B
+>A.2.11. </B
+>
+	    Does Bugzilla allow data to be imported and exported? If I had outsiders
+	    write up a bug report using a MS Word bug template, could that template be
+	    imported into "matching" fields? If I wanted to take the results of a query
+	    and export that data to MS Excel, could I do that?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    It is web and e-mail based.  You can edit bugs by sending specially
-	    formatted email to a properly configured Bugzilla, or control via the web.
+>
+	    Mozilla allows data export through a custom DTD in XML format.
+	    It does not, however, export to specific formats other than the
+	    XML Mozilla DTD.  Importing the data into Excel or any other application
+	    is left as an exercise for the reader.
+	  </P
+><P
+>&#13;	    If you create import filters to other applications from Mozilla's XML,
+	    please submit your modifications for inclusion in future Bugzilla
+	    distributions.
+	  </P
+><P
+>&#13;	    As for data import, any application can send data to Bugzilla through
+	    the HTTP protocol, or through Mozilla's XML API.  However, it seems
+	    kind of silly to put another front-end in front of Bugzilla;
+	    it makes more sense to create a simplified bug submission form in
+	    HTML.  You can find an excellent example at
+	    <A
+HREF="http://www.mozilla.org/quality/help/bugzilla-helper.html"
+TARGET="_top"
+>&#13;	    http://www.mozilla.org/quality/help/bugzilla-helper.html</A
+>
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1882"
-></A
-><B
->A.4.2. </B
->	    Has anyone you know of already done any Bugzilla integration with
-	    Perforce (SCM software)?
+NAME="AEN1797"><B
+>A.2.12. </B
+>
+	    Has anyone converted Bugzilla to another language to be used in other
+	    countries? Is it localizable?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Yes!  You can find more information elsewhere in "The Bugzilla
-	    Guide" in the "Integration with Third-Party Products" section.
+>
+	    To a certain extent, yes. 2.16's templates mean that you can localise
+      the user-facing UI (and several projects are doing exactly that.) However,
+      error messages and the admin interface are currently not localisable.
+      This should be achieved by 2.18.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1887"
-></A
-><B
->A.4.3. </B
->	    Does Bugzilla allow the user to track multiple projects?
+NAME="AEN1802"><B
+>A.2.13. </B
+>
+	    Can a user create and save reports? Can they do this in Word format?
+	    Excel format?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Absolutely!  You can track up to a "soft-limit" of around
-	    64 individual "Products", that can each be composed of as
-	    many "Components" as you want.  Check the Administration
-	    section of the Bugzilla Guide for more information regarding
-	    setting up Products and Components.
+>
+	    Yes.  No.  No.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1892"
-></A
-><B
->A.4.4. </B
->	    If I am on many projects, and search for all bugs assigned to me, will
-	    Bugzilla list them for me and allow me to sort by project, severity etc?
+NAME="AEN1807"><B
+>A.2.14. </B
+>
+	    Does Bugzilla have the ability to search by word, phrase, compound
+	    search?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Yes.
+>
+	    You have no idea.  Bugzilla's query interface, particularly with the
+	    advanced Boolean operators, is incredibly versatile.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1897"
-></A
-><B
->A.4.5. </B
->	    Does Bugzilla allow attachments (text, screenshots, urls etc)? If yes,
-	    are there any that are NOT allowed?
+NAME="AEN1812"><B
+>A.2.15. </B
+>
+	     Does Bugzilla provide record locking when there is simultaneous access
+	    to the same bug? Does the second person get a notice that the bug is in use
+	    or how are they notified?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Yes.  There are many specific MIME-types that are pre-defined by Bugzilla,
-	    but you may specify any arbitrary MIME-type you need when you
-	    upload the file.  Since all attachments are stored in the database,
-	    however, I recommend storing large binary attachments elsewhere
-	    in the web server's file system and providing a hyperlink
-	    as a comment, or in the provided "URL" field in the bug report.
+>
+	    Bugzilla does not lock records.  It provides mid-air collision detection,
+	    and offers the offending user a choice of options to deal with the conflict.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1902"
-></A
-><B
->A.4.6. </B
->	    Does Bugzilla allow us to define our own priorities and levels? Do we
-	    have complete freedom to change the labels of fields and format of them, and
-	    the choice of acceptable values?
+NAME="AEN1817"><B
+>A.2.16. </B
+>
+	    Are there any backup features provided?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Yes.  However, modifying some fields, notably those related to bug
-	    progression states, also require adjusting the program logic to
-	    compensate for the change.
-	  </P
-><P
->	    There is no GUI for adding fields to Bugzilla at this
-	    time.  You can follow development of this feature at
-	    <A
-HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=91037"
+>
+	    MySQL, the database back-end for Bugzilla, allows hot-backup of data.
+	    You can find strategies for dealing with backup considerations
+	    at <A
+HREF="http://www.mysql.com/doc/B/a/Backup.html"
 TARGET="_top"
->http://bugzilla.mozilla.org/show_bug.cgi?id=91037</A
+>&#13;	    http://www.mysql.com/doc/B/a/Backup.html</A
 >
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1909"
-></A
-><B
->A.4.7. </B
->	    The index.html page doesn't show the footer.  It's really annoying to have
-	    to go to the querypage just to check my "my bugs" link.  How do I get a footer
-	    on static HTML pages?
+NAME="AEN1823"><B
+>A.2.17. </B
+>
+	    Can users be on the system while a backup is in progress?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->            It's possible to get the footer on the static index page using
-            Server Side Includes (SSI).  The trick to doing this is making
-            sure that your web server is set up to allow SSI and specifically,
-            the #exec directive.  You should also rename <TT
-CLASS="FILENAME"
->index.html</TT
->
-            to <TT
-CLASS="FILENAME"
->index.shtml</TT
->.
-          </P
-><P
->            After you've done all that, you can add the following line to
-            <TT
-CLASS="FILENAME"
->index.shtml</TT
->:
-<TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
->&#60;!--#exec cmd="/usr/bin/perl -e &#38;quot;require 'CGI.pl'; PutFooter();&#38;quot;" --&#62;</PRE
-></FONT
-></TD
-></TR
-></TABLE
->
-          </P
-><P
-><DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->              This line will be replaced with the actual HTML for the footer
-              when the page is requested, so you should put this line where you
-              want the footer to appear.
-            </P
-></TD
-></TR
-></TABLE
-></DIV
-></P
-><P
->            Because this method depends on being able to use a #exec directive,
-            and most ISP's will not allow that, there is an alternative method.
-            You could have a small script (such as <TT
-CLASS="FILENAME"
->api.cgi</TT
->)
-            that basically looks like:
-<TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
->#!/usr/bonsaitools/bin/perl -w
-
-require 'globals.pl';
-
-if ($::FORM{sub} eq 'PutFooter') {
-    PutFooter();
-} else {
-    die 'api.cgi was incorrectly called';
-}</PRE
-></FONT
-></TD
-></TR
-></TABLE
 >
-            and then put this line in <TT
-CLASS="FILENAME"
->index.shtml</TT
->.
-<TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
->&#60;!--#include virtual="api.cgi?sub=PutFooter"--&#62;</PRE
-></FONT
-></TD
-></TR
-></TABLE
->
-          </P
-><P
-> <DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->              This still requires being able to use Server Side Includes, if
-              this simply will not work for you, see <A
-HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=80183"
-TARGET="_top"
->bug 80183</A
->
-              for a third option.
-            </P
-></TD
-></TR
-></TABLE
-></DIV
-></P
+	    Yes.  However, commits to the database must wait
+	    until the tables are unlocked.  Bugzilla databases are typically
+	    very small, and backups routinely take less than a minute.
+	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1931"
-></A
-><B
->A.4.8. </B
->	    Does Bugzilla provide any reporting features, metrics, graphs, etc? You
-	    know, the type of stuff that management likes to see. :)
+NAME="AEN1828"><B
+>A.2.18. </B
+>
+	    What type of human resources are needed to be on staff to install and
+	    maintain Bugzilla? Specifically, what type of skills does the person need to
+	    have? I need to find out if we were to go with Bugzilla, what types of
+	    individuals would we need to hire and how much would that cost vs buying an
+	    "Out-of-the-Box" solution.
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Yes.  Look at <A
-HREF="http://bugzilla.mozilla.org/reports.cgi"
-TARGET="_top"
->	    http://bugzilla.mozilla.org/reports.cgi</A
-> for basic reporting
-	    facilities.
-	  </P
-><P
->	    For more advanced reporting, I recommend hooking up a professional
-	    reporting package, such as Crystal Reports, and use ODBC to access
-	    the MySQL database.  You can do a lot through the Query page of
-	    Bugzilla as well, but right now Advanced Reporting is much
-	    better accomplished through third-party utilities that can
-	    interface with the database directly.
+>
+	    If Bugzilla is set up correctly from the start, continuing maintenance
+      needs are minimal and can be done easily using the web interface.
 	  </P
 ><P
->	    Advanced Reporting is a Bugzilla 3.X proposed feature.
+>&#13;	    Commercial Bug-tracking software typically costs somewhere upwards
+	    of $20,000 or more for 5-10 floating licenses.  Bugzilla consultation
+	    is available from skilled members of the newsgroup. Simple questions
+      are answered there and then.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1939"
-></A
-><B
->A.4.9. </B
->	    Is there email notification and if so, what do you see when you get an
-	    email? Do you see bug number and title or is it only the number?
+NAME="AEN1834"><B
+>A.2.19. </B
+>
+	    What time frame are we looking at if we decide to hire people to install
+	    and maintain the Bugzilla? Is this something that takes hours or weeks to
+	    install and a couple of hours per week to maintain and customize or is this
+	    a multi-week install process, plus a full time job for 1 person, 2 people,
+	    etc?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Email notification is user-configurable.  The bug id and Topic
-	    of the bug report accompany each email notification, along with
-	    a list of the changes made.
+>
+	    It all depends on your level of commitment.  Someone with much Bugzilla
+	    experience can get you up and running in less than a day, and
+	    your Bugzilla install can run untended for years.  If your
+	    Bugzilla strategy is critical to your business workflow, hire somebody
+	    with reasonable UNIX or Perl skills to handle your process management and
+	    bug-tracking maintenance &#38; customization.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1944"
-></A
-><B
->A.4.10. </B
->	    Can email notification be set up to send to multiple
-	    people, some on the To List, CC List, BCC List etc?
+NAME="AEN1839"><B
+>A.2.20. </B
+>
+	    Is there any licensing fee or other fees for using Bugzilla? Any
+	    out-of-pocket cost other than the bodies needed as identified above?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Yes.
+>
+	    No.  MySQL asks, if you find their product valuable, that you purchase
+	    a support contract from them that suits your needs.
 	  </P
 ></DIV
 ></DIV
+></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandadiv"
+><H3
+><A
+NAME="faq-security">3. Bugzilla Security</H3
 ><DIV
-CLASS="QUESTION"
+CLASS="qandaentry"
+><DIV
+CLASS="question"
 ><P
 ><A
-NAME="AEN1949"
-></A
-><B
->A.4.11. </B
->	    If there is email notification, do users have to have any particular
-	    type of email application?
+NAME="AEN1846"><B
+>A.3.1. </B
+>
+	    How do I completely disable MySQL security if it's giving me problems
+	    (I've followed the instructions in the installation section of this guide)?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Bugzilla email is sent in plain text, the most compatible mail format
-	    on the planet.
-	    <DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->		If you decide to use the bugzilla_email integration features
-		to allow Bugzilla to record responses to mail with the associated bug,
-		you may need to caution your users to set their mailer to "respond
-		to messages in the format in which they were sent".  For security reasons
-		Bugzilla ignores HTML tags in comments, and if a user sends HTML-based
-		email into Bugzilla the resulting comment looks downright awful.
-	      </P
-></TD
-></TR
-></TABLE
-></DIV
 >
+	    Run MySQL like this: "mysqld --skip-grant-tables".  Please remember <EM
+>this
+	    makes MySQL as secure as taping a $100 to the floor of a football stadium
+	    bathroom for safekeeping.</EM
+> 
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1956"
-></A
-><B
->A.4.12. </B
->	     If I just wanted to track certain bugs, as they go through life, can I
-	    set it up to alert me via email whenever that bug changes, whether it be
-	    owner, status or description etc.?
+NAME="AEN1852"><B
+>A.3.2. </B
+>
+	    Are there any security problems with Bugzilla?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Yes.  Place yourself in the "cc" field of the bug you wish to monitor.
-	    Then change your "Notify me of changes to" field in the Email Settings
-	    tab of the User Preferences screen in Bugzilla to the "Only those
-	    bugs which I am listed on the CC line" option.
+>
+	    The Bugzilla code has undergone a reasonably complete security audit,
+      and user-facing CGIs run under Perl's taint mode. However, 
+	    it is recommended that you closely examine permissions on your Bugzilla
+	    installation, and follow the recommended security guidelines found
+	    in The Bugzilla Guide.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1961"
-></A
-><B
->A.4.13. </B
->	    Does Bugzilla allow data to be imported and exported? If I had outsiders
-	    write up a bug report using a MS Word bug template, could that template be
-	    imported into "matching" fields? If I wanted to take the results of a query
-	    and export that data to MS Excel, could I do that?
+NAME="AEN1857"><B
+>A.3.3. </B
+>
+	    I've implemented the security fixes mentioned in Chris Yeh's security
+	    advisory of 5/10/2000 advising not to run MySQL as root, and am running into
+	    problems with MySQL no longer working correctly.
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Mozilla allows data export through a custom DTD in XML format.
-	    It does not, however, export to specific formats other than the
-	    XML Mozilla DTD.  Importing the data into Excel or any other application
-	    is left as an exercise for the reader.
-	  </P
-><P
->	    If you create import filters to other applications from Mozilla's XML,
-	    please submit your modifications for inclusion in future Bugzilla
-	    distributions.
-	  </P
-><P
->	    As for data import, any application can send data to Bugzilla through
-	    the HTTP protocol, or through Mozilla's XML API.  However, it seems
-	    kind of silly to put another front-end in front of Bugzilla;
-	    it makes more sense to create a simplified bug submission form in
-	    HTML.  You can find an excellent example at
-	    <A
-HREF="http://www.mozilla.org/quality/help/bugzilla-helper.html"
-TARGET="_top"
->	    http://www.mozilla.org/quality/help/bugzilla-helper.html</A
 >
+	    This is a common problem, related to running out of file descriptors.
+	    Simply add "ulimit -n unlimited" to the script which starts
+	    mysqld.
 	  </P
 ></DIV
 ></DIV
+></DIV
+><DIV
+CLASS="qandadiv"
+><H3
+><A
+NAME="faq-email">4. Bugzilla Email</H3
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1969"
-></A
-><B
->A.4.14. </B
->	    Has anyone converted Bugzilla to another language to be used in other
-	    countries? Is it localizable?
+NAME="AEN1864"><B
+>A.4.1. </B
+>
+	    I have a user who doesn't want to receive any more email from Bugzilla.
+	    How do I stop it entirely for this user?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Currently, no.  Internationalization support for Perl did not
-	    exist in a robust fashion until the recent release of version 5.6.0;
-	    Bugzilla is, and likely will remain (until 3.X) completely
-	    non-localized.
+>
+	    The user should be able to set
+	    this in user email preferences (uncheck all boxes.)
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1974"
-></A
-><B
->A.4.15. </B
->	    Can a user create and save reports? Can they do this in Word format?
-	    Excel format?
+NAME="AEN1869"><B
+>A.4.2. </B
+>
+	    I'm evaluating/testing Bugzilla, and don't want it to send email to
+	    anyone but me. How do I do it?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Yes.  No.  No.
+>
+	    Edit the "changedmail" Param. Replace "To:" with "X-Real-To:",
+	    replace "Cc:" with "X-Real-CC:", and add a "To: &#60;youremailaddress&#62;".
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1979"
-></A
-><B
->A.4.16. </B
->	    Can a user re-run a report with a new project, same query?
+NAME="AEN1874"><B
+>A.4.3. </B
+>
+	    I want whineatnews.pl to whine at something more, or other than, only new
+	    bugs. How do I do it?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Yes.
+>
+	    Try Klaas Freitag's excellent patch for "whineatassigned" functionality.
+	    You can find it at<A
+HREF=" http://bugzilla.mozilla.org/show_bug.cgi?id=6679"
+TARGET="_top"
+>&#13;	      http://bugzilla.mozilla.org/show_bug.cgi?id=6679</A
+>. This
+	    patch is against an older version of Bugzilla, so you must apply
+	    the diffs manually.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1984"
-></A
-><B
->A.4.17. </B
->	    Can a user modify an existing report and then save it into another name?
+NAME="AEN1880"><B
+>A.4.4. </B
+>
+	    I don't like/want to use Procmail to hand mail off to bug_email.pl.
+	    What alternatives do I have?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    You can save an unlimited number of queries in Bugzilla.  You are free
-	    to modify them and rename them to your heart's desire.
+>
+	    You can call bug_email.pl directly from your aliases file, with
+	    an entry like this:
+	    <A
+NAME="AEN1884"><BLOCKQUOTE
+CLASS="BLOCKQUOTE"
+><P
+>&#13;		bugzilla-daemon: "|/usr/local/bin/bugzilla/contrib/bug_email.pl"
+	      </P
+></BLOCKQUOTE
+>
+	    However, this is fairly nasty and subject to problems; you also
+	    need to set up your smrsh (sendmail restricted shell) to allow
+	    it.  In a pinch, though, it can work.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1989"
-></A
-><B
->A.4.18. </B
->	    Does Bugzilla have the ability to search by word, phrase, compound
-	    search?
+NAME="AEN1887"><B
+>A.4.5. </B
+>
+	    How do I set up the email interface to submit/change bugs via email?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    You have no idea.  Bugzilla's query interface, particularly with the
-	    advanced Boolean operators, is incredibly versatile.
+>
+	    You can find an updated README.mailif file in the contrib/ directory
+	    of your Bugzilla distribution that walks you through the setup.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1994"
-></A
-><B
->A.4.19. </B
->	    Can the admin person establish separate group and individual user
-	    privileges?
+NAME="AEN1892"><B
+>A.4.6. </B
+>
+	    Email takes FOREVER to reach me from Bugzilla -- it's extremely slow.
+	    What gives?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Yes.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN1999"
-></A
-><B
->A.4.20. </B
->	     Does Bugzilla provide record locking when there is simultaneous access
-	    to the same bug? Does the second person get a notice that the bug is in use
-	    or how are they notified?
+>
+	    If you are using an alternate Mail Transport Agent (MTA other than
+	    sendmail), make sure the options given in the "processmail" and other
+      scripts for all
+	    instances of "sendmail" are correct for your MTA.
 	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
 ><P
-><B
-> </B
->	    Bugzilla does not lock records.  It provides mid-air collision detection,
-	    and offers the offending user a choice of options to deal with the conflict.
+>&#13;	    If you are using Sendmail, try enabling "sendmailnow" in editparams.cgi.
+            If you are using Postfix, you will also need to enable <SPAN
+CLASS="QUOTE"
+>"sendmailnow"</SPAN
+>.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2004"
-></A
-><B
->A.4.21. </B
->	    Are there any backup features provided?
+NAME="AEN1899"><B
+>A.4.7. </B
+>
+	     How come email from Bugzilla changes never reaches me?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    MySQL, the database back-end for Bugzilla, allows hot-backup of data.
-	    You can find strategies for dealing with backup considerations
-	    at <A
-HREF="http://www.mysql.com/doc/B/a/Backup.html"
-TARGET="_top"
->	    http://www.mysql.com/doc/B/a/Backup.html</A
 >
+	    Double-check that you have not turned off email in your user preferences.
+	    Confirm that Bugzilla is able to send email by visiting the "Log In"
+	    link of your Bugzilla installation and clicking the "Email me a password"
+	    button after entering your email address.
+	  </P
+><P
+>&#13;	    If you never receive mail from Bugzilla, chances you do not have
+	    sendmail in "/usr/lib/sendmail".  Ensure sendmail lives in, or is symlinked
+	    to, "/usr/lib/sendmail".
 	  </P
 ></DIV
 ></DIV
+></DIV
+><DIV
+CLASS="qandadiv"
+><H3
+><A
+NAME="faq-db">5. Bugzilla Database</H3
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2010"
-></A
-><B
->A.4.22. </B
->	    Can users be on the system while a backup is in progress?
+NAME="AEN1907"><B
+>A.5.1. </B
+>
+	    I've heard Bugzilla can be used with Oracle?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Yes.  However, commits to the database must wait
-	    until the tables are unlocked.  Bugzilla databases are typically
-	    very small, and backups routinely take less than a minute.
+>
+	    Red Hat Bugzilla works with Oracle.  The current version
+	    from Mozilla.org does not have this capability.  Unfortunately, though
+	    you will sacrifice a lot of the really great features available in
+	    Bugzilla 2.14 and 2.16 if you go with the 2.8-based Redhat version.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2015"
-></A
-><B
->A.4.23. </B
->	    What type of human resources are needed to be on staff to install and
-	    maintain Bugzilla? Specifically, what type of skills does the person need to
-	    have? I need to find out if we were to go with Bugzilla, what types of
-	    individuals would we need to hire and how much would that cost vs buying an
-	    "Out-of-the-Box" solution.
+NAME="AEN1912"><B
+>A.5.2. </B
+>
+	    I think my database might be corrupted, or contain invalid entries. What
+	    do I do?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    If Bugzilla is set up correctly from the start, continuing maintenance needs
-	    are minimal and can be completed by unskilled labor.  Things like rotate
-	    backup tapes and check log files for the word "error".
-	  </P
-><P
->	    Commercial Bug-tracking software typically costs somewhere upwards
-	    of $20,000 or more for 5-10 floating licenses.  Bugzilla consultation
-	    is available from skilled members of the newsgroup.
-	  </P
-><P
->	    As an example, as of this writing I typically charge
-	     $115 for the first hour, and $89 each hour thereafter
-	    for consulting work.  It takes me three to five hours to make Bugzilla
-	    happy on a Development installation of Linux-Mandrake.
+>
+	    Run the <SPAN
+CLASS="QUOTE"
+>"sanity check"</SPAN
+> utility
+	    (<TT
+CLASS="filename"
+>./sanitycheck.cgi</TT
+> in the
+	    Bugzilla_home directory) from your web browser to see! If
+	    it finishes without errors, you're
+	    <EM
+>probably</EM
+> OK.  If it doesn't come back
+	    OK (i.e. any red letters), there are certain things
+	    Bugzilla can recover from and certain things it can't.  If
+	    it can't auto-recover, I hope you're familiar with
+	    mysqladmin commands or have installed another way to
+	    manage your database.  Sanity Check, although it is a good
+	    basic check on your database integrity, by no means is a
+	    substitute for competent database administration and
+	    avoiding deletion of data.  It is not exhaustive, and was
+	    created to do a basic check for the most common problems
+	    in Bugzilla databases.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2022"
-></A
-><B
->A.4.24. </B
->	    What time frame are we looking at if we decide to hire people to install
-	    and maintain the Bugzilla? Is this something that takes hours or weeks to
-	    install and a couple of hours per week to maintain and customize or is this
-	    a multi-week install process, plus a full time job for 1 person, 2 people,
-	    etc?
+NAME="AEN1920"><B
+>A.5.3. </B
+>
+	    I want to manually edit some entries in my database. How?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    It all depends on your level of commitment.  Someone with much Bugzilla
-	    experience can get you up and running in less than a day, and
-	    your Bugzilla install can run untended for years.  If your
-	    Bugzilla strategy is critical to your business workflow, hire somebody
-	    with reasonable UNIX or Perl skills to handle your process management and
-	    bug-tracking maintenance &#38; customization.
+>
+	     There is no facility in Bugzilla itself to do this. It's also generally
+	    not a smart thing to do if you don't know exactly what you're doing.
+	    However, if you understand SQL you can use the mysqladmin utility to
+	    manually insert, delete, and modify table information. Personally, I
+	    use "phpMyAdmin". You have to compile a PHP module with MySQL
+	    support to make it work, but it's very clean and easy to use.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2027"
-></A
-><B
->A.4.25. </B
->	    Is there any licensing fee or other fees for using Bugzilla? Any
-	    out-of-pocket cost other than the bodies needed as identified above?
+NAME="AEN1925"><B
+>A.5.4. </B
+>
+	    I try to add myself as a user, but Bugzilla always tells me my password is wrong.
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    No.  MySQL asks, if you find their product valuable, that you purchase
-	    a support contract from them that suits your needs.
+>
+	    Certain version of MySQL (notably, 3.23.29 and 3.23.30) accidentally disabled
+	    the "crypt()" function.  This prevented MySQL from storing encrypted passwords.
+	    Upgrade to the "3.23 stable" version of MySQL and you should be good to go.
 	  </P
 ></DIV
 ></DIV
-></DIV
-><DIV
-CLASS="QANDADIV"
-><H3
-><A
-NAME="FAQ_INSTALL"
-></A
->5. Bugzilla Installation</H3
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2034"
-></A
-><B
->A.5.1. </B
->	    How do I download and install Bugzilla?
+NAME="AEN1930"><B
+>A.5.5. </B
+>
+	    I think I've set up MySQL permissions correctly, but Bugzilla still can't
+	    connect.
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Check <A
-HREF="http://www.mozilla.org/projects/bugzilla/"
-TARGET="_top"
->	    http://www.mozilla.org/projects/bugzilla/</A
-> for details.
-	    Once you download it, untar it, read the Bugzilla Guide.
+>
+	    Try running MySQL from its binary: "mysqld --skip-grant-tables". This
+	    will allow you to completely rule out grant tables as the cause of your
+	    frustration. However, I do not recommend you run it this way on a regular
+	    basis, unless you really want your web site defaced and your machine
+	    cracked.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2040"
-></A
-><B
->A.5.2. </B
->	    How do I install Bugzilla on Windows NT?
+NAME="AEN1935"><B
+>A.5.6. </B
+>
+	    How do I synchronize bug information among multiple different Bugzilla
+	    databases?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Installation on Windows NT has its own section in
-	    "The Bugzilla Guide".
+>
+	    Well, you can synchronize or you can move bugs.  Synchronization will
+	    only work one way -- you can create a read-only copy of the database
+	    at one site, and have it regularly updated at intervals from the main
+	    database.
 	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
 ><P
-><A
-NAME="AEN2045"
-></A
-><B
->A.5.3. </B
->	    Is there an easy way to change the Bugzilla cookie name?
+>&#13;	    MySQL has some synchronization features builtin to the latest releases.
+	    It would be great if someone looked into the possibilities there
+	    and provided a report to the newsgroup on how to effectively
+	    synchronize two Bugzilla installations.
 	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
 ><P
-><B
-> </B
->	    At present, no.
+>&#13;	    If you simply need to transfer bugs from one Bugzilla to another,
+	    checkout the "move.pl" script in the Bugzilla distribution.
 	  </P
 ></DIV
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDADIV"
+CLASS="qandadiv"
 ><H3
 ><A
-NAME="FAQ_SECURITY"
-></A
->6. Bugzilla Security</H3
+NAME="faq-nt">6. Bugzilla and Win32</H3
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2052"
-></A
-><B
+NAME="AEN1944"><B
 >A.6.1. </B
->	    How do I completely disable MySQL security if it's giving me problems
-	    (I've followed the instructions in the installation section of this guide!)?
+>
+	    What is the easiest way to run Bugzilla on Win32 (Win98+/NT/2K)?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Run mysql like this: "mysqld --skip-grant-tables".  Please remember <EM
->this
-	    makes mysql as secure as taping a $100 to the floor of a football stadium
-	    bathroom for safekeeping.</EM
->  Please read the Security section of the
-	    Administration chapter of "The Bugzilla Guide" before proceeding.
+>
+	    Remove Windows. Install Linux. Install Bugzilla.
+	    The boss will never know the difference.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2058"
-></A
-><B
+NAME="AEN1949"><B
 >A.6.2. </B
->	    Are there any security problems with Bugzilla?
+>
+	    Is there a "Bundle::Bugzilla" equivalent for Win32?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    The Bugzilla code has not undergone a complete security audit.
-	    It is recommended that you closely examine permissions on your Bugzilla
-	    installation, and follow the recommended security guidelines found
-	    in The Bugzilla Guide.
+>
+	    Not currently.  Bundle::Bugzilla enormously simplifies Bugzilla
+	    installation on UNIX systems.  If someone can volunteer to
+	    create a suitable PPM bundle for Win32, it would be appreciated.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2063"
-></A
-><B
+NAME="AEN1954"><B
 >A.6.3. </B
->	    I've implemented the security fixes mentioned in Chris Yeh's security
-	    advisory of 5/10/2000 advising not to run MySQL as root, and am running into
-	    problems with MySQL no longer working correctly.
+>
+	    CGI's are failing with a "something.cgi is not a valid Windows NT
+	    application" error. Why?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    This is a common problem, related to running out of file descriptors.
-	    Simply add "ulimit -n unlimited" to the script which starts
-	    mysqld.
+>
+	    Depending on what Web server you are using, you will have to configure
+	    the Web server to treat *.cgi files as CGI scripts. In IIS, you do this by
+	    adding *.cgi to the App Mappings with the &#60;path&#62;\perl.exe %s %s as the
+	    executable.
 	  </P
-></DIV
-></DIV
-></DIV
-><DIV
-CLASS="QANDADIV"
-><H3
-><A
-NAME="FAQ_EMAIL"
-></A
->7. Bugzilla Email</H3
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
 ><P
-><A
-NAME="AEN2070"
-></A
-><B
->A.7.1. </B
->	    I have a user who doesn't want to receive any more email from Bugzilla.
-	    How do I stop it entirely for this user?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
+>&#13;	    Microsoft has some advice on this matter, as well:
+	    <A
+NAME="AEN1959"><BLOCKQUOTE
+CLASS="BLOCKQUOTE"
 ><P
-><B
-> </B
->	    With the email changes to 2.12, the user should be able to set
-	    this in user email preferences.
+>&#13;		"Set application mappings. In the ISM, map the extension for the script
+		file(s) to the executable for the script interpreter. For example, you might
+		map the extension .py to Python.exe, the executable for the Python script
+		interpreter. Note For the ActiveState Perl script interpreter, the extension
+		.pl is associated with PerlIS.dll by default. If you want to change the
+		association of .pl to perl.exe, you need to change the application mapping.
+		In the mapping, you must add two percent (%) characters to the end of the
+		pathname for perl.exe, as shown in this example: c:\perl\bin\perl.exe %s %s"
+	      </P
+></BLOCKQUOTE
+>
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2075"
-></A
-><B
->A.7.2. </B
->	    I'm evaluating/testing Bugzilla, and don't want it to send email to
-	    anyone but me. How do I do it?
+NAME="AEN1962"><B
+>A.6.4. </B
+>
+	    I'm having trouble with the perl modules for NT not being able to talk to
+	    to the database.
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Edit the param for the mail text. Replace "To:" with "X-Real-To:",
-	    replace "Cc:" with "X-Real-CC:", and add a "To: (myemailaddress)".
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2080"
-></A
-><B
->A.7.3. </B
->	    I want whineatnews.pl to whine at something more, or other than, only new
-	    bugs. How do I do it?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
+>
+	    Your modules may be outdated or inaccurate. Try:
+	    <P
+></P
+><OL
+TYPE="1"
+><LI
 ><P
-><B
-> </B
->	    Try Klaas Freitag's excellent patch for "whineatassigned" functionality.
-	    You can find it at<A
-HREF=" http://bugzilla.mozilla.org/show_bug.cgi?id=6679"
-TARGET="_top"
->	      http://bugzilla.mozilla.org/show_bug.cgi?id=6679</A
->. This
-	    patch is against an older version of Bugzilla, so you must apply
-	    the diffs manually.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
+>&#13;		  Hitting http://www.activestate.com/ActivePerl
+		</P
+></LI
+><LI
 ><P
-><A
-NAME="AEN2086"
-></A
-><B
->A.7.4. </B
->	    I don't like/want to use Procmail to hand mail off to bug_email.pl.
-	    What alternatives do I have?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
+>&#13;		  Download ActivePerl
+		</P
+></LI
+><LI
 ><P
-><B
-> </B
->	    You can call bug_email.pl directly from your aliases file, with
-	    an entry like this:
-	    <A
-NAME="AEN2090"
-></A
-><BLOCKQUOTE
-CLASS="BLOCKQUOTE"
+>&#13;		  Go to your prompt
+		</P
+></LI
+><LI
 ><P
->		bugzilla-daemon: "|/usr/local/bin/bugzilla/contrib/bug_email.pl"
-	      </P
-></BLOCKQUOTE
+>&#13;		  Type 'ppm'
+		</P
+></LI
+><LI
+><P
+>&#13;		  <TT
+CLASS="prompt"
+>PPM&#62;</TT
+> <B
+CLASS="command"
+>install DBI DBD-mysql GD</B
+>
+		</P
+></LI
+></OL
+>
+	    I reckon TimeDate and Data::Dumper come with the activeperl. You can check
+	    the ActiveState site for packages for installation through PPM.
+	    <A
+HREF=" http://www.activestate.com/Packages/"
+TARGET="_top"
+>&#13;	      http://www.activestate.com/Packages/</A
 >
-	    However, this is fairly nasty and subject to problems; you also
-	    need to set up your smrsh (sendmail restricted shell) to allow
-	    it.  In a pinch, though, it can work.
 	  </P
 ></DIV
 ></DIV
+></DIV
+><DIV
+CLASS="qandadiv"
+><H3
+><A
+NAME="faq-use">7. Bugzilla Usage</H3
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2093"
-></A
-><B
->A.7.5. </B
->	    How do I set up the email interface to submit/change bugs via email?
+NAME="AEN1983"><B
+>A.7.1. </B
+>
+	    How do I change my user name (email address) in Bugzilla?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    You can find an updated README.mailif file in the contrib/ directory
-	    of your Bugzilla distribution that walks you through the setup.
+>
+	    New in 2.16 - go to the Account section of the Preferences. You will
+      be emailed at both addresses for confirmation.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2098"
-></A
-><B
->A.7.6. </B
->	    Email takes FOREVER to reach me from bugzilla -- it's extremely slow.
-	    What gives?
+NAME="AEN1988"><B
+>A.7.2. </B
+>
+	    The query page is very confusing.  Isn't there a simpler way to query?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    If you are using an alternate Mail Transport Agent (MTA other than
-	    sendmail), make sure the options given in the "processmail" script for all
-	    instances of "sendmail" are correct for your MTA.
-	  </P
-><P
->	    If you are using Sendmail, try enabling "sendmailnow" in editparams.cgi.
-            If you are using Postfix, you will also need to enable <SPAN
-CLASS="QUOTE"
->"sendmailnow"</SPAN
->.
+>
+	    The interface was simplified by a UI designer for 2.16. Further
+      suggestions for improvement are welcome, but we won't sacrifice power for
+      simplicity.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2105"
-></A
-><B
->A.7.7. </B
->	     How come email never reaches me from bugzilla changes?
+NAME="AEN1993"><B
+>A.7.3. </B
+>
+	    I'm confused by the behavior of the "accept" button in the Show Bug form.
+	    Why doesn't it assign the bug to me when I accept it?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Double-check that you have not turned off email in your user preferences.
-	    Confirm that Bugzilla is able to send email by visiting the "Log In"
-	    link of your Bugzilla installation and clicking the "Email me a password"
-	    button after entering your email address.
-	  </P
-><P
->	    If you never receive mail from Bugzilla, chances you do not have
-	    sendmail in "/usr/lib/sendmail".  Ensure sendmail lives in, or is symlinked
-	    to, "/usr/lib/sendmail".
-	  </P
-></DIV
-></DIV
-></DIV
-><DIV
-CLASS="QANDADIV"
-><H3
+>
+	    The current behavior is acceptable to bugzilla.mozilla.org and most
+	    users.  You have your choice of patches
+	    to change this behavior, however.
+	    <P
+></P
+><TABLE
+BORDER="0"
+><TBODY
+><TR
+><TD
 ><A
-NAME="FAQ_DB"
-></A
->8. Bugzilla Database</H3
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
+HREF="http://bugzilla.mozilla.org/showattachment.cgi?attach_id=8029"
+TARGET="_top"
+>&#13;		Add a "and accept bug" radio button</A
+></TD
+></TR
+><TR
+><TD
 ><A
-NAME="AEN2113"
-></A
-><B
->A.8.1. </B
->	    I've heard Bugzilla can be used with Oracle?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
+HREF="http://bugzilla.mozilla.org/showattachment.cgi?attach_id=8153"
+TARGET="_top"
+>&#13;		"Accept" button automatically assigns to you</A
+></TD
+></TR
+></TBODY
+></TABLE
 ><P
-><B
-> </B
->	    Red Hat Bugzilla, mentioned above, works with Oracle.  The current version
-	    from Mozilla.org does not have this capability.  Unfortunately, though
-	    you will sacrifice a lot of the really great features available in
-	    Bugzilla 2.10 and 2.12 if you go with the 2.8-based Redhat version.
+></P
+>
+	    Note that these patches are somewhat dated.  You will need to apply
+      them manually.  
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2118"
-></A
-><B
->A.8.2. </B
->	    Bugs are missing from queries, but exist in the database (and I can pull
-	    them up by specifying the bug ID). What's wrong?
+NAME="AEN2003"><B
+>A.7.4. </B
+>
+	    I can't upload anything into the database via the "Create Attachment"
+	    link.  What am I doing wrong?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	     You've almost certainly enabled the "shadow database", but for some
-	    reason it hasn't been updated for all your bugs. This is the database
-	    against which queries are run, so that really complex or slow queries won't
-	    lock up portions of the database for other users. You can turn off the
-	    shadow database in editparams.cgi. If you wish to continue using the shadow
-	    database, then as your "bugs" user run "./syncshadowdb -syncall" from the
-	    command line in the bugzilla installation directory to recreate your shadow
-	    database. After it finishes, be sure to check the params and make sure that
-	    "queryagainstshadowdb" is still turned on. The syncshadowdb program turns it
-	    off if it was on, and is supposed to turn it back on when completed; that
-	    way, if it crashes in the middle of recreating the database, it will stay
-	    off forever until someone turns it back on by hand. Apparently, it doesn't
-	    always do that yet.
+>
+	    The most likely cause is a very old browser or a browser that is
+	    incompatible with file upload via POST.  Download the latest Netscape,
+	    Microsoft, or Mozilla browser to handle uploads correctly.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2123"
-></A
-><B
->A.8.3. </B
->	    I think my database might be corrupted, or contain invalid entries. What
-	    do I do?
+NAME="AEN2008"><B
+>A.7.5. </B
+>
+	    Email submissions to Bugzilla that have attachments end up asking me to
+	    save it as a "cgi" file.
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Run the <SPAN
-CLASS="QUOTE"
->"sanity check"</SPAN
-> utility
-	    (<TT
-CLASS="FILENAME"
->./sanitycheck.cgi</TT
-> in the
-	    Bugzilla_home directory) from your web browser to see! If
-	    it finishes without errors, you're
-	    <EM
->probably</EM
-> OK.  If it doesn't come back
-	    OK (i.e. any red letters), there are certain things
-	    Bugzilla can recover from and certain things it can't.  If
-	    it can't auto-recover, I hope you're familiar with
-	    mysqladmin commands or have installed another way to
-	    manage your database.  Sanity Check, although it is a good
-	    basic check on your database integrity, by no means is a
-	    substitute for competent database administration and
-	    avoiding deletion of data.  It is not exhaustive, and was
-	    created to do a basic check for the most common problems
-	    in Bugzilla databases.
+>
+	    Yup.  Just rename it once you download it, or save it under a different
+	    filename.  This will not be fixed anytime soon, because it would
+	    cripple some other functionality.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2131"
-></A
-><B
->A.8.4. </B
->	    I want to manually edit some entries in my database. How?
+NAME="AEN2013"><B
+>A.7.6. </B
+>
+	    How do I change a keyword in Bugzilla, once some bugs are using it?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	     There is no facility in Bugzilla itself to do this. It's also generally
-	    not a smart thing to do if you don't know exactly what you're doing.
-	    However, if you understand SQL you can use the mysqladmin utility to
-	    manually insert, delete, and modify table information. Personally, I
-	    use "phpMyAdmin". You have to compile a PHP module with MySQL
-	    support to make it work, but it's very clean and easy to use.
+>
+	    In the Bugzilla administrator UI, edit the keyword and it will let you
+	    replace the old keyword name with a new one.  This will cause a problem
+	    with the keyword cache.  Run sanitycheck.cgi to fix it.
 	  </P
 ></DIV
 ></DIV
+></DIV
+><DIV
+CLASS="qandadiv"
+><H3
+><A
+NAME="faq-hacking">8. Bugzilla Hacking</H3
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2136"
-></A
-><B
->A.8.5. </B
->	    I try to add myself as a user, but Bugzilla always tells me my password is wrong.
+NAME="AEN2020"><B
+>A.8.1. </B
+>
+	    What bugs are in Bugzilla right now?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Certain version of MySQL (notably, 3.23.29 and 3.23.30) accidentally disabled
-	    the "crypt()" function.  This prevented MySQL from storing encrypted passwords.
-	    Upgrade to the "3.23 stable" version of MySQL and you should be good to go.
+>
+	    Try <A
+HREF="http://bugzilla.mozilla.org/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&product=Bugzilla"
+TARGET="_top"
+>&#13;	    this link</A
+> to view current bugs or requests for
+	    enhancement for Bugzilla.
+	  </P
+><P
+>&#13;	    You can view bugs marked for 2.18 release
+	    <A
+HREF="http://bugzilla.mozilla.org/buglist.cgi?product=Bugzilla&target_milestone=Bugzilla+2.18"
+TARGET="_top"
+>here</A
+>.
+	    This list includes bugs for the 2.18 release that have already
+	    been fixed and checked into CVS.  Please consult the
+	    <A
+HREF="http://www.mozilla.org/projects/bugzilla/"
+TARGET="_top"
+>&#13;	      Bugzilla Project Page</A
+> for details on how to
+	    check current sources out of CVS so you can have these
+	    bug fixes early!
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2141"
-></A
-><B
->A.8.6. </B
->	    I think I've set up MySQL permissions correctly, but bugzilla still can't
-	    connect.
+NAME="AEN2029"><B
+>A.8.2. </B
+>
+	    How can I change the default priority to a null value?  For instance, have the default
+	    priority be "---" instead of "P2"?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Try running MySQL from its binary: "mysqld --skip-grant-tables". This
-	    will allow you to completely rule out grant tables as the cause of your
-	    frustration. However, I do not recommend you run it this way on a regular
-	    basis, unless you really want your web site defaced and your machine
-	    cracked.
+>
+	    This is well-documented here: <A
+HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=49862"
+TARGET="_top"
+>&#13;	    http://bugzilla.mozilla.org/show_bug.cgi?id=49862</A
+>.  Ultimately, it's as easy
+	    as adding the "---" priority field to your localconfig file in the appropriate area,
+	    re-running checksetup.pl, and then changing the default priority in your browser using
+	    "editparams.cgi". 
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2146"
-></A
-><B
->A.8.7. </B
->	    How do I synchronize bug information among multiple different Bugzilla
-	    databases?
+NAME="AEN2035"><B
+>A.8.3. </B
+>
+	    What's the best way to submit patches?  What guidelines should I follow?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Well, you can synchronize or you can move bugs.  Synchronization will
-	    only work one way -- you can create a read-only copy of the database
-	    at one site, and have it regularly updated at intervals from the main
-	    database.
-	  </P
 ><P
->	    MySQL has some synchronization features builtin to the latest releases.
-	    It would be great if someone looked into the possibilities there
-	    and provided a report to the newsgroup on how to effectively
-	    synchronize two Bugzilla installations.
-	  </P
-><P
->	    If you simply need to transfer bugs from one Bugzilla to another,
-	    checkout the "move.pl" script in the Bugzilla distribution.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2153"
-></A
-><B
->A.8.8. </B
->	    Why do I get bizarre errors when trying to submit data, particularly problems
-	    with "groupset"?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    If you're sure your MySQL parameters are correct, you might want turn
-	    "strictvaluechecks" OFF in editparams.cgi.  If you have "usebugsentry" set
-	    "On", you also cannot submit a bug as readable by more than one group with
-	    "strictvaluechecks" ON.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2158"
-></A
-><B
->A.8.9. </B
->	    How come even after I delete bugs, the long descriptions show up?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    This should only happen with Bugzilla 2.14 if you are
-	    using the <SPAN
-CLASS="QUOTE"
->"shadow database"</SPAN
-> feature, and your
-	    shadow database is out of sync.  Try running
-	    <TT
-CLASS="FILENAME"
->syncshadowdb</TT
->
-	    <TT
-CLASS="OPTION"
->-syncall</TT
-> to make sure your shadow
-	    database is in synch with your primary database.
-	  </P
-></DIV
-></DIV
-></DIV
-><DIV
-CLASS="QANDADIV"
-><H3
-><A
-NAME="FAQ_NT"
-></A
->9. Bugzilla and Win32</H3
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2168"
-></A
-><B
->A.9.1. </B
->	    What is the easiest way to run Bugzilla on Win32 (Win98+/NT/2K)?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    Remove Windows. Install Linux. Install Bugzilla.
-	    The boss will never know the difference.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2173"
-></A
-><B
->A.9.2. </B
->	    Is there a "Bundle::Bugzilla" equivalent for Win32?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    Not currently.  Bundle::Bugzilla enormously simplifies Bugzilla
-	    installation on UNIX systems.  If someone can volunteer to
-	    create a suitable PPM bundle for Win32, it would be appreciated.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2178"
-></A
-><B
->A.9.3. </B
->	    CGI's are failing with a "something.cgi is not a valid Windows NT
-	    application" error. Why?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    Depending on what Web server you are using, you will have to configure
-	    the Web server to treat *.cgi files as CGI scripts. In IIS, you do this by
-	    adding *.cgi to the App Mappings with the &#60;path&#62;\perl.exe %s %s as the
-	    executable.
-	  </P
-><P
->	    Microsoft has some advice on this matter, as well:
-	    <A
-NAME="AEN2183"
-></A
-><BLOCKQUOTE
-CLASS="BLOCKQUOTE"
-><P
->		"Set application mappings. In the ISM, map the extension for the script
-		file(s) to the executable for the script interpreter. For example, you might
-		map the extension .py to Python.exe, the executable for the Python script
-		interpreter. Note For the ActiveState Perl script interpreter, the extension
-		.pl is associated with PerlIS.dll by default. If you want to change the
-		association of .pl to perl.exe, you need to change the application mapping.
-		In the mapping, you must add two percent (%) characters to the end of the
-		pathname for perl.exe, as shown in this example: c:\perl\bin\perl.exe %s %s"
-	      </P
-></BLOCKQUOTE
->
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2186"
-></A
-><B
->A.9.4. </B
->	    Can I have some general instructions on how to make Bugzilla on Win32 work?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    The following couple entries are deprecated in favor of the Windows installation
-	    instructions available in the "Administration" portion of "The Bugzilla Guide".
-	    However, they are provided here for historical interest and insight.
-	    <P
-CLASS="LITERALLAYOUT"
->&nbsp;&nbsp;1.&nbsp;#!C:/perl/bin/perl&nbsp;had&nbsp;to&nbsp;be&nbsp;added&nbsp;to&nbsp;every&nbsp;perl&nbsp;file.<br>
-&nbsp;&nbsp;2.&nbsp;Converted&nbsp;to&nbsp;Net::SMTP&nbsp;to&nbsp;handle&nbsp;mail&nbsp;messages&nbsp;instead&nbsp;of<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/bin/sendmail.<br>
-&nbsp;&nbsp;3.&nbsp;The&nbsp;crypt&nbsp;function&nbsp;isn't&nbsp;available&nbsp;on&nbsp;Windows&nbsp;NT&nbsp;(at&nbsp;least&nbsp;none&nbsp;that&nbsp;I<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;am&nbsp;aware),&nbsp;so&nbsp;I&nbsp;made&nbsp;encrypted&nbsp;passwords&nbsp;=&nbsp;plaintext&nbsp;passwords.<br>
-&nbsp;&nbsp;4.&nbsp;The&nbsp;system&nbsp;call&nbsp;to&nbsp;diff&nbsp;had&nbsp;to&nbsp;be&nbsp;changed&nbsp;to&nbsp;the&nbsp;Cygwin&nbsp;diff.<br>
-&nbsp;&nbsp;5.&nbsp;This&nbsp;was&nbsp;just&nbsp;to&nbsp;get&nbsp;a&nbsp;demo&nbsp;running&nbsp;under&nbsp;NT,&nbsp;it&nbsp;seems&nbsp;to&nbsp;be&nbsp;working<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;good,&nbsp;and&nbsp;I&nbsp;have&nbsp;inserted&nbsp;almost&nbsp;100&nbsp;bugs&nbsp;from&nbsp;another&nbsp;bug&nbsp;tracking<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;system.&nbsp;Since&nbsp;this&nbsp;work&nbsp;was&nbsp;done&nbsp;just&nbsp;to&nbsp;get&nbsp;an&nbsp;in-house&nbsp;demo,&nbsp;I&nbsp;am&nbsp;NOT<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;planning&nbsp;on&nbsp;making&nbsp;a&nbsp;patch&nbsp;for&nbsp;submission&nbsp;to&nbsp;Bugzilla.&nbsp;If&nbsp;you&nbsp;would<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;like&nbsp;a&nbsp;zip&nbsp;file,&nbsp;let&nbsp;me&nbsp;know.<br>
-<br>
-Q:&nbsp;Hmm,&nbsp;couldn't&nbsp;figure&nbsp;it&nbsp;out&nbsp;from&nbsp;the&nbsp;general&nbsp;instructions&nbsp;above.&nbsp;&nbsp;How<br>
-about&nbsp;step-by-step?<br>
-A:&nbsp;Sure!&nbsp;Here&nbsp;ya&nbsp;go!<br>
-<br>
-&nbsp;&nbsp;1.&nbsp;Install&nbsp;IIS&nbsp;4.0&nbsp;from&nbsp;the&nbsp;NT&nbsp;Option&nbsp;Pack&nbsp;#4.<br>
-&nbsp;&nbsp;2.&nbsp;Download&nbsp;and&nbsp;install&nbsp;Active&nbsp;Perl.<br>
-&nbsp;&nbsp;3.&nbsp;Install&nbsp;the&nbsp;Windows&nbsp;GNU&nbsp;tools&nbsp;from&nbsp;Cygwin.&nbsp;Make&nbsp;sure&nbsp;to&nbsp;add&nbsp;the&nbsp;bin<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;directory&nbsp;to&nbsp;your&nbsp;system&nbsp;path.&nbsp;(Everyone&nbsp;should&nbsp;have&nbsp;these,&nbsp;whether<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;they&nbsp;decide&nbsp;to&nbsp;use&nbsp;Bugzilla&nbsp;or&nbsp;not.&nbsp;:-)&nbsp;)<br>
-&nbsp;&nbsp;4.&nbsp;Download&nbsp;relevant&nbsp;packages&nbsp;from&nbsp;ActiveState&nbsp;at<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.activestate.com/packages/zips/.&nbsp;+&nbsp;DBD-Mysql.zip<br>
-&nbsp;&nbsp;5.&nbsp;Extract&nbsp;each&nbsp;zip&nbsp;file&nbsp;with&nbsp;WinZip,&nbsp;and&nbsp;install&nbsp;each&nbsp;ppd&nbsp;file&nbsp;using&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notation:&nbsp;ppm&nbsp;install&nbsp;&#60;module&#62;.ppd<br>
-&nbsp;&nbsp;6.&nbsp;Install&nbsp;Mysql.&nbsp;&nbsp;*Note:&nbsp;If&nbsp;you&nbsp;move&nbsp;the&nbsp;default&nbsp;install&nbsp;from&nbsp;c:\mysql,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;you&nbsp;must&nbsp;add&nbsp;the&nbsp;appropriate&nbsp;startup&nbsp;parameters&nbsp;to&nbsp;the&nbsp;NT&nbsp;service.&nbsp;(ex.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-b&nbsp;e:\\programs\\mysql)<br>
-&nbsp;&nbsp;7.&nbsp;Download&nbsp;any&nbsp;Mysql&nbsp;client.&nbsp;http://www.mysql.com/download_win.html<br>
-&nbsp;&nbsp;8.&nbsp;Setup&nbsp;MySql.&nbsp;(These&nbsp;are&nbsp;the&nbsp;commands&nbsp;that&nbsp;I&nbsp;used.)<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I.&nbsp;Cleanup&nbsp;default&nbsp;database&nbsp;settings.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\mysql\bin\mysql&nbsp;-u&nbsp;root&nbsp;mysql<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;DELETE&nbsp;FROM&nbsp;user&nbsp;WHERE&nbsp;Host='localhost'&nbsp;AND&nbsp;User='';<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;quit<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\mysql\bin\mysqladmin&nbsp;reload<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;II.&nbsp;Set&nbsp;password&nbsp;for&nbsp;root.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\mysql\bin\mysql&nbsp;-u&nbsp;root&nbsp;mysql<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;UPDATE&nbsp;user&nbsp;SET&nbsp;Password=PASSWORD('new_password')<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;user='root';<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;FLUSH&nbsp;PRIVILEGES;<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;quit<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\mysql\bin\mysqladmin&nbsp;-u&nbsp;root&nbsp;reload<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;III.&nbsp;Create&nbsp;bugs&nbsp;user.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\mysql\bin\mysql&nbsp;-u&nbsp;root&nbsp;-p<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;insert&nbsp;into&nbsp;user&nbsp;(host,user,password)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;values('localhost','bugs','');<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;quit<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\mysql\bin\mysqladmin&nbsp;-u&nbsp;root&nbsp;reload<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IV.&nbsp;Create&nbsp;the&nbsp;bugs&nbsp;database.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\mysql\bin\mysql&nbsp;-u&nbsp;root&nbsp;-p<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;create&nbsp;database&nbsp;bugs;<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;V.&nbsp;Give&nbsp;the&nbsp;bugs&nbsp;user&nbsp;access&nbsp;to&nbsp;the&nbsp;bugs&nbsp;database.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;insert&nbsp;into&nbsp;db<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(host,db,user,select_priv,insert_priv,update_priv,delete_priv,create_priv,drop_priv)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;values('localhost','bugs','bugs','Y','Y','Y','Y','Y','N')<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;quit<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\mysql\bin\mysqladmin&nbsp;-u&nbsp;root&nbsp;reload<br>
-&nbsp;&nbsp;9.&nbsp;Run&nbsp;the&nbsp;table&nbsp;scripts&nbsp;to&nbsp;setup&nbsp;the&nbsp;bugs&nbsp;database.<br>
-&nbsp;10.&nbsp;Change&nbsp;CGI.pm&nbsp;to&nbsp;use&nbsp;the&nbsp;following&nbsp;regular&nbsp;expression&nbsp;because&nbsp;of<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;differing&nbsp;backslashes&nbsp;in&nbsp;NT&nbsp;versus&nbsp;UNIX.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;$0&nbsp;=~&nbsp;m:[^\\]*$:;<br>
-&nbsp;11.&nbsp;Had&nbsp;to&nbsp;make&nbsp;the&nbsp;crypt&nbsp;password&nbsp;=&nbsp;plain&nbsp;text&nbsp;password&nbsp;in&nbsp;the&nbsp;database.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Thanks&nbsp;to&nbsp;Andrew&nbsp;Lahser"&nbsp;&#60;andrew_lahser@merck.com&#62;"&nbsp;on&nbsp;this&nbsp;one.)&nbsp;The<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files&nbsp;that&nbsp;I&nbsp;changed&nbsp;were:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;globals.pl<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;CGI.pl<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;alternately,&nbsp;you&nbsp;can&nbsp;try&nbsp;commenting&nbsp;all&nbsp;references&nbsp;to&nbsp;'crypt'<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;and&nbsp;replace&nbsp;them&nbsp;with&nbsp;similar&nbsp;lines&nbsp;but&nbsp;without&nbsp;encrypt()<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;or&nbsp;crypr()&nbsp;functions&nbsp;insida&nbsp;all&nbsp;files.<br>
-&nbsp;12.&nbsp;Replaced&nbsp;sendmail&nbsp;with&nbsp;Windmail.&nbsp;Basically,&nbsp;you&nbsp;have&nbsp;to&nbsp;come&nbsp;up&nbsp;with&nbsp;a<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendmail&nbsp;substitute&nbsp;for&nbsp;NT.&nbsp;Someone&nbsp;said&nbsp;that&nbsp;they&nbsp;used&nbsp;a&nbsp;Perl&nbsp;module<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Net::SMTP),&nbsp;but&nbsp;I&nbsp;was&nbsp;trying&nbsp;to&nbsp;save&nbsp;time&nbsp;and&nbsp;do&nbsp;as&nbsp;little&nbsp;Perl&nbsp;coding<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;as&nbsp;possible.<br>
-&nbsp;13.&nbsp;Added&nbsp;"perl"&nbsp;to&nbsp;the&nbsp;beginning&nbsp;of&nbsp;all&nbsp;Perl&nbsp;system&nbsp;calls&nbsp;that&nbsp;use&nbsp;a&nbsp;perl<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;script&nbsp;as&nbsp;an&nbsp;argument&nbsp;and&nbsp;renamed&nbsp;processmail&nbsp;to&nbsp;processmail.pl.<br>
-&nbsp;14.&nbsp;In&nbsp;processmail.pl,&nbsp;I&nbsp;added&nbsp;binmode(HANDLE)&nbsp;before&nbsp;all&nbsp;read()&nbsp;calls.&nbsp;I'm<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not&nbsp;sure&nbsp;about&nbsp;this&nbsp;one,&nbsp;but&nbsp;the&nbsp;read()&nbsp;under&nbsp;NT&nbsp;wasn't&nbsp;counting&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EOLs&nbsp;without&nbsp;the&nbsp;binary&nbsp;read."<br>
-	&nbsp;&nbsp;&nbsp;&nbsp;</P
->
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2192"
-></A
-><B
->A.9.5. </B
->	    I'm having trouble with the perl modules for NT not being able to talk to
-	    to the database.
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    Your modules may be outdated or inaccurate. Try:
-	    <P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->		  Hitting http://www.activestate.com/ActivePerl
-		</P
-></LI
-><LI
-><P
->		  Download ActivePerl
-		</P
-></LI
-><LI
-><P
->		  Go to your prompt
-		</P
-></LI
-><LI
-><P
->		  Type 'ppm'
+>&#13;		  Enter a bug into bugzilla.mozilla.org for the <SPAN
+CLASS="QUOTE"
+>"<A
+HREF="http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla"
+TARGET="_top"
+>Bugzilla</A
+>"</SPAN
+>
+                  product.
 		</P
 ></LI
 ><LI
 ><P
->		  <TT
-CLASS="PROMPT"
->PPM&#62;</TT
-> <B
-CLASS="COMMAND"
->install DBI DBD-mysql GD</B
->
+>&#13;		  Upload your patch as a unified diff (having used "diff -u" against
+		  the <EM
+>current sources</EM
+> checked out of CVS),
+		  or new source file by clicking
+		  "Create a new attachment" link on the bug page you've just created, and
+		  include any descriptions of database changes you may make, into the bug
+		  ID you submitted in step #1.  Be sure and click the "Patch" checkbox
+		  to indicate the text you are sending is a patch!
 		</P
 ></LI
-></OL
->
-	    I reckon TimeDate and Data::Dumper come with the activeperl. You can check
-	    the ActiveState site for packages for installation through PPM.
-	    <A
-HREF=" http://www.activestate.com/Packages/"
-TARGET="_top"
->	      http://www.activestate.com/Packages/</A
->
-	  </P
-></DIV
-></DIV
-></DIV
-><DIV
-CLASS="QANDADIV"
-><H3
-><A
-NAME="FAQ_USE"
-></A
->10. Bugzilla Usage</H3
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2213"
-></A
-><B
->A.10.1. </B
->	    The query page is very confusing.  Isn't there a simpler way to query?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    We are developing in that direction.  You can follow progress on this
-	    at <A
-HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=16775"
-TARGET="_top"
->	      http://bugzilla.mozilla.org/show_bug.cgi?id=16775</A
->.  Some functionality
-	    is available in Bugzilla 2.12, and is available as "quicksearch.html"
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2219"
-></A
-><B
->A.10.2. </B
->	    I'm confused by the behavior of the "accept" button in the Show Bug form.
-	    Why doesn't it assign the bug to me when I accept it?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    The current behavior is acceptable to bugzilla.mozilla.org and most
-	    users.  I personally don't like it.  You have your choice of patches
-	    to change this behavior, however.
-	    <P
-></P
-><TABLE
-BORDER="0"
-><TBODY
-><TR
-><TD
-><A
-HREF="http://bugzilla.mozilla.org/showattachment.cgi?attach_id=8029"
-TARGET="_top"
->		Add a "and accept bug" radio button</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="http://bugzilla.mozilla.org/showattachment.cgi?attach_id=8153"
-TARGET="_top"
->		"Accept" button automatically assigns to you</A
-></TD
-></TR
-></TBODY
-></TABLE
-><P
-></P
->
-	    Note that these patches are somewhat dated.  You will need to do the find
-	    and replace manually to apply them.  They are very small, though.  It is easy.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2229"
-></A
-><B
->A.10.3. </B
->	    I can't upload anything into the database via the "Create Attachment"
-	    link.  What am I doing wrong?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    The most likely cause is a very old browser or a browser that is
-	    incompatible with file upload via POST.  Download the latest Netscape,
-	    Microsoft, or Mozilla browser to handle uploads correctly.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2234"
-></A
-><B
->A.10.4. </B
->	    Email submissions to Bugzilla that have attachments end up asking me to
-	    save it as a "cgi" file.
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    Yup.  Just rename it once you download it, or save it under a different
-	    filename.  This will not be fixed anytime too soon, because it would
-	    cripple some other functionality.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2239"
-></A
-><B
->A.10.5. </B
->	    How do I change a keyword in Bugzilla, once some bugs are using it?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    In the Bugzilla administrator UI, edit the keyword and it will let you
-	    replace the old keyword name with a new one.  This will cause a problem
-	    with the keyword cache.  Run sanitycheck.cgi to fix it.
-	  </P
-></DIV
-></DIV
-></DIV
-><DIV
-CLASS="QANDADIV"
-><H3
-><A
-NAME="FAQ_HACKING"
-></A
->11. Bugzilla Hacking</H3
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2246"
-></A
-><B
->A.11.1. </B
->	    What bugs are in Bugzilla right now?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    Try <A
-HREF="http://bugzilla.mozilla.org/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&product=Bugzilla"
-TARGET="_top"
->	    this link</A
-> to view current bugs or requests for
-	    enhancement for Bugzilla.
-	  </P
-><P
->	    You can view bugs marked for 2.16 release
-	    <A
-HREF="http://bugzilla.mozilla.org/buglist.cgi?product=Bugzilla&target_milestone=Bugzilla+2.16"
-TARGET="_top"
->here</A
->.
-	    This list includes bugs for the 2.16 release that have already
-	    been fixed and checked into CVS.  Please consult the
-	    <A
-HREF="http://www.mozilla.org/projects/bugzilla/"
-TARGET="_top"
->	      Bugzilla Project Page</A
-> for details on how to
-	    check current sources out of CVS so you can have these
-	    bug fixes early!
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2255"
-></A
-><B
->A.11.2. </B
->	    How can I change the default priority to a null value?  For instance, have the default
-	    priority be "---" instead of "P2"?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    This is well-documented here: <A
-HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=49862"
-TARGET="_top"
->	    http://bugzilla.mozilla.org/show_bug.cgi?id=49862</A
->.  Ultimately, it's as easy
-	    as adding the "---" priority field to your localconfig file in the appropriate area,
-	    re-running checksetup.pl, and then changing the default priority in your browser using
-	    "editparams.cgi".  Hmm, now that I think about it, that is kind of a klunky way to handle
-	    it, but for now it's what we have!  Although the bug has been closed "resolved wontfix",
-	    there may be a better way to handle this...
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2261"
-></A
-><B
->A.11.3. </B
->	    What's the best way to submit patches?  What guidelines should I follow?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
-><P
-></P
-><OL
-TYPE="1"
-><LI
-><P
->		  Enter a bug into bugzilla.mozilla.org for the <SPAN
-CLASS="QUOTE"
->"<A
-HREF="http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla"
-TARGET="_top"
->Bugzilla</A
->"</SPAN
->
-                  product.
-		</P
-></LI
-><LI
-><P
->		  Upload your patch as a unified DIFF (having used "diff -u" against
-		  the <EM
->current sources</EM
-> checked out of CVS),
-		  or new source file by clicking
-		  "Create a new attachment" link on the bug page you've just created, and
-		  include any descriptions of database changes you may make, into the bug
-		  ID you submitted in step #1.  Be sure and click the "Patch" radio
-		  button to indicate the text you are sending is a patch!
-		</P
-></LI
-><LI
-><P
->		  Announce your patch and the associated URL
-		  (http://bugzilla.mozilla.org/show_bug.cgi?id=XXXX) for discussion in
-		  the newsgroup (netscape.public.mozilla.webtools).  You'll get a really
-		  good, fairly immediate reaction to the implications of your patch,
-		  which will also give us an idea how well-received the change would
-		  be.
-		</P
-></LI
-><LI
-><P
->		  If it passes muster with minimal modification, the person to whom
-		  the bug is assigned in Bugzilla is responsible for seeing the patch
-		  is checked into CVS.
-		</P
-></LI
-><LI
-><P
->		  Bask in the glory of the fact that you helped write the most successful
-		  open-source bug-tracking software on the planet :)
-		</P
-></LI
-></OL
-></P
-></DIV
-></DIV
-></DIV
-></DIV
-></DIV
-><DIV
-CLASS="APPENDIX"
-><HR><H1
-><A
-NAME="DOWNLOADLINKS"
->Appendix B. Software Download Links</A
-></H1
-><P
->    All of these sites are current as of April, 2001.  Hopefully
-    they'll stay current for a while.
-  </P
-><P
->    Apache Web Server: <A
-HREF="http://www.apache.org/"
-TARGET="_top"
->http://www.apache.org</A
->
-    Optional web server for Bugzilla, but recommended because of broad user base and support.
-  </P
-><P
->    Bugzilla: <A
-HREF="http://www.mozilla.org/projects/bugzilla/"
-TARGET="_top"
->      http://www.mozilla.org/projects/bugzilla/</A
->
-  </P
-><P
->    MySQL: <A
-HREF="http://www.mysql.com/"
-TARGET="_top"
->http://www.mysql.com/</A
->
-  </P
-><P
->    Perl: <A
-HREF="http://www.perl.org"
-TARGET="_top"
->http://www.perl.org/</A
->
-  </P
-><P
->    CPAN: <A
-HREF="http://www.cpan.org/"
-TARGET="_top"
->http://www.cpan.org/</A
->
-  </P
-><P
->    DBI Perl module: 
-    <A
-HREF="ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/DBI/"
-TARGET="_top"
->      ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/DBI/</A
->
-  </P
-><P
->    Data::Dumper module: 
-    <A
-HREF="ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Data/"
-TARGET="_top"
->      ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Data/</A
->
-  </P
-><P
->    MySQL related Perl modules:
-    <A
-HREF="ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Mysql/"
-TARGET="_top"
->      ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Mysql/</A
->
-  </P
-><P
->    TimeDate Perl module collection:
-    <A
-HREF="ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Date/"
-TARGET="_top"
->      ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Date/</A
->
-  </P
-><P
->    GD Perl module:
-    <A
-HREF="ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/GD/"
-TARGET="_top"
->      ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/GD/</A
->
-    Alternately, you should be able to find the latest version of
-    GD at <A
-HREF="http://www.boutell.com/gd/"
-TARGET="_top"
->http://www.boutell.com/gd/</A
->
-  </P
-><P
->    Chart::Base module:
-    <A
-HREF="ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Chart/"
-TARGET="_top"
->    ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Chart/</A
->
-  </P
-><P
->    LinuxDoc Software: 
-    <A
-HREF="http://www.linuxdoc.org/"
-TARGET="_top"
->http://www.linuxdoc.org/</A
->
-    (for documentation maintenance)
-  </P
-></DIV
-><DIV
-CLASS="APPENDIX"
-><HR><H1
-><A
-NAME="DATABASE"
->Appendix C. The Bugzilla Database</A
-></H1
-><DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->      This document really needs to be updated with more fleshed out information about primary keys, interrelationships, and maybe some nifty tables to document dependencies.  Any takers?
-    </P
-></TD
-></TR
-></TABLE
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="DBSCHEMA"
->C.1. Database Schema Chart</A
-></H1
-><P
->      <DIV
-CLASS="MEDIAOBJECT"
-><P
-><IMG
-SRC="../images/dbschema.jpg"
-ALT="Database Relationships"
-></IMG
-><DIV
-CLASS="CAPTION"
-><P
->Bugzilla database relationships chart</P
-></DIV
-></P
-></DIV
->
-    </P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="DBDOC"
->C.2. MySQL Bugzilla Database Introduction</A
-></H1
-><P
->      This information comes straight from my life.  I was forced to learn how
-      Bugzilla organizes database because of nitpicky requests from users for tiny
-      changes in wording, rather than having people re-educate themselves or
-      figure out how to work our procedures around the tool.  It sucks, but it can
-      and will happen to you, so learn how the schema works and deal with it when it
-      comes.
-    </P
-><P
->      So, here you are with your brand-new installation of Bugzilla.  You've got
-      MySQL set up, Apache working right, Perl DBI and DBD talking to the database
-      flawlessly.  Maybe you've even entered a few test bugs to make sure email's
-      working; people seem to be notified of new bugs and changes, and you can
-      enter and edit bugs to your heart's content.  Perhaps you've gone through the
-      trouble of setting up a gateway for people to submit bugs to your database via
-      email, have had a few people test it, and received rave reviews from your beta
-      testers.
-    </P
-><P
->      What's the next thing you do?  Outline a training strategy for your
-      development team, of course, and bring them up to speed on the new tool you've
-      labored over for hours.
-    </P
-><P
->      Your first training session starts off very well!  You have a captive
-      audience which seems enraptured by the efficiency embodied in this thing called
-      "Bugzilla".  You are caught up describing the nifty features, how people can
-      save favorite queries in the database, set them up as headers and footers on
-      their pages, customize their layouts, generate reports, track status with
-      greater efficiency than ever before, leap tall buildings with a single bound
-      and rescue Jane from the clutches of Certain Death!
-    </P
-><P
->      But Certain Death speaks up -- a tiny voice, from the dark corners of the
-      conference room.  "I have a concern," the voice hisses from the darkness,
-      "about the use of the word 'verified'.
-    </P
-><P
->      The room, previously filled with happy chatter, lapses into reverential
-      silence as Certain Death (better known as the Vice President of Software
-      Engineering) continues.  "You see, for two years we've used the word 'verified'
-      to indicate that a developer or quality assurance engineer has confirmed that,
-      in fact, a bug is valid. I don't want to lose two years of training to a
-      new software product.  You need to change the bug status of 'verified' to
-      'approved' as soon as possible. To avoid confusion, of course."
-    </P
-><P
->      Oh no!  Terror strikes your heart, as you find yourself mumbling "yes, yes, I
-      don't think that would be a problem," You review the changes with Certain
-      Death, and continue to jabber on, "no, it's not too big a change. I mean, we
-      have the source code, right? You know, 'Use the Source, Luke' and all that...
-      no problem," All the while you quiver inside like a beached jellyfish bubbling,
-      burbling, and boiling on a hot Jamaican sand dune...
-    </P
-><P
->      Thus begins your adventure into the heart of Bugzilla.  You've been forced
-      to learn about non-portable enum() fields, varchar columns, and tinyint
-      definitions. The Adventure Awaits You!
-    </P
-><DIV
-CLASS="SECTION"
-><HR><H2
-CLASS="SECTION"
-><A
-NAME="AEN2331"
->C.2.1. Bugzilla Database Basics</A
-></H2
-><P
->	If you were like me, at this point you're totally clueless
-	about the internals of MySQL, and if it weren't for this
-	executive order from the Vice President you couldn't care less
-	about the difference between a <SPAN
-CLASS="QUOTE"
->"bigint"</SPAN
-> and a
-	<SPAN
-CLASS="QUOTE"
->"tinyint"</SPAN
-> entry in MySQL.   I recommend you refer
-	to the MySQL documentation, available at <A
-HREF="http://www.mysql.com/doc.html"
-TARGET="_top"
->MySQL.com</A
->.  Below are the basics you need to know about the Bugzilla database.  Check the chart above for more details.
-      </P
-><P
-><P
-></P
-><OL
-TYPE="1"
-><LI
-><P
->	      To connect to your database:
-	    </P
-><P
->	      <TT
-CLASS="PROMPT"
->bash#</TT
-><B
-CLASS="COMMAND"
->mysql</B
-><TT
-CLASS="PARAMETER"
-><I
->-u root</I
-></TT
->
-	    </P
-><P
->	      If this works without asking you for a password,
-	      <EM
->shame on you</EM
->!  You should have
-	      locked your security down like the installation
-	      instructions told you to.  You can find details on
-	      locking down your database in the Bugzilla FAQ in this
-	      directory (under "Security"), or more robust security
-	      generalities in the MySQL searchable documentation at
-	      http://www.mysql.com/php/manual.php3?section=Privilege_system .
-	    </P
-></LI
-><LI
-><P
->You should now be at a prompt that looks like
-	      this:</P
-><P
-><TT
-CLASS="PROMPT"
->mysql&#62;</TT
-></P
-><P
->At the prompt, if <SPAN
-CLASS="QUOTE"
->"bugs"</SPAN
-> is the name
-	      you chose in the<TT
-CLASS="FILENAME"
->localconfig</TT
-> file
-	      for your Bugzilla database, type:</P
-><P
-><TT
-CLASS="PROMPT"
->mysql</TT
-><B
-CLASS="COMMAND"
->use bugs;</B
-></P
-><DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="90%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->Don't forget the <SPAN
-CLASS="QUOTE"
->";"</SPAN
-> at the end of
-		each line, or you'll be kicking yourself later.</P
-></TD
-></TR
-></TABLE
-></DIV
-></LI
-></OL
->
-      </P
-><DIV
-CLASS="SECTION"
-><HR><H3
-CLASS="SECTION"
-><A
-NAME="AEN2360"
->C.2.1.1. Bugzilla Database Tables</A
-></H3
-><P
->  Imagine your MySQL database as a series of
-	  spreadsheets, and you won't be too far off.  If you use this
-	  command:</P
-><P
-><TT
-CLASS="PROMPT"
->mysql&#62;</TT
-><B
-CLASS="COMMAND"
->show tables from bugs;</B
-></P
-><P
->you'll be able to see all the
-	  <SPAN
-CLASS="QUOTE"
->"spreadsheets"</SPAN
-> (tables) in your database.  It
-	  is similar to a file system, only faster and more robust for
-	  certain types of operations.</P
-><P
->From the command issued above, ou should have some
-	  output that looks like this:
-	  <TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
->+-------------------+
-| Tables in bugs    |
-+-------------------+
-| attachments       |
-| bugs              |
-| bugs_activity     |
-| cc                |
-| components        |
-| dependencies      |
-| fielddefs         |
-| groups            |
-| keyworddefs       |
-| keywords          |
-| logincookies      |
-| longdescs         |
-| milestones        |
-| namedqueries      |
-| products          |
-| profiles          |
-| profiles_activity |
-| shadowlog         |
-| tokens            |
-| versions          |
-| votes             |
-| watch             |
-+-------------------+
-	  </PRE
-></FONT
-></TD
-></TR
-></TABLE
-></P
-><P
-CLASS="LITERALLAYOUT"
-><br>
-&nbsp;&nbsp;Here's&nbsp;an&nbsp;overview&nbsp;of&nbsp;what&nbsp;each&nbsp;table&nbsp;does.&nbsp;&nbsp;Most&nbsp;columns&nbsp;in&nbsp;each&nbsp;table&nbsp;have<br>
-descriptive&nbsp;names&nbsp;that&nbsp;make&nbsp;it&nbsp;fairly&nbsp;trivial&nbsp;to&nbsp;figure&nbsp;out&nbsp;their&nbsp;jobs.<br>
-<br>
-attachments:&nbsp;This&nbsp;table&nbsp;stores&nbsp;all&nbsp;attachments&nbsp;to&nbsp;bugs.&nbsp;&nbsp;It&nbsp;tends&nbsp;to&nbsp;be&nbsp;your<br>
-largest&nbsp;table,&nbsp;yet&nbsp;also&nbsp;generally&nbsp;has&nbsp;the&nbsp;fewest&nbsp;entries&nbsp;because&nbsp;file<br>
-attachments&nbsp;are&nbsp;so&nbsp;(relatively)&nbsp;large.<br>
-<br>
-bugs:&nbsp;&nbsp;This&nbsp;is&nbsp;the&nbsp;core&nbsp;of&nbsp;your&nbsp;system.&nbsp;&nbsp;The&nbsp;bugs&nbsp;table&nbsp;stores&nbsp;most&nbsp;of&nbsp;the<br>
-current&nbsp;information&nbsp;about&nbsp;a&nbsp;bug,&nbsp;with&nbsp;the&nbsp;exception&nbsp;of&nbsp;the&nbsp;info&nbsp;stored&nbsp;in&nbsp;the<br>
-other&nbsp;tables.<br>
-<br>
-bugs_activity:&nbsp;&nbsp;This&nbsp;stores&nbsp;information&nbsp;regarding&nbsp;what&nbsp;changes&nbsp;are&nbsp;made&nbsp;to&nbsp;bugs<br>
-when&nbsp;--&nbsp;a&nbsp;history&nbsp;file.<br>
-<br>
-cc:&nbsp;&nbsp;This&nbsp;tiny&nbsp;table&nbsp;simply&nbsp;stores&nbsp;all&nbsp;the&nbsp;CC&nbsp;information&nbsp;for&nbsp;any&nbsp;bug&nbsp;which&nbsp;has<br>
-any&nbsp;entries&nbsp;in&nbsp;the&nbsp;CC&nbsp;field&nbsp;of&nbsp;the&nbsp;bug.&nbsp;&nbsp;Note&nbsp;that,&nbsp;like&nbsp;most&nbsp;other&nbsp;tables&nbsp;in<br>
-Bugzilla,&nbsp;it&nbsp;does&nbsp;not&nbsp;refer&nbsp;to&nbsp;users&nbsp;by&nbsp;their&nbsp;user&nbsp;names,&nbsp;but&nbsp;by&nbsp;their&nbsp;unique<br>
-userid,&nbsp;stored&nbsp;as&nbsp;a&nbsp;primary&nbsp;key&nbsp;in&nbsp;the&nbsp;profiles&nbsp;table.<br>
-<br>
-components:&nbsp;This&nbsp;stores&nbsp;the&nbsp;programs&nbsp;and&nbsp;components&nbsp;(or&nbsp;products&nbsp;and<br>
-components,&nbsp;in&nbsp;newer&nbsp;Bugzilla&nbsp;parlance)&nbsp;for&nbsp;Bugzilla.&nbsp;&nbsp;Curiously,&nbsp;the&nbsp;"program"<br>
-(product)&nbsp;field&nbsp;is&nbsp;the&nbsp;full&nbsp;name&nbsp;of&nbsp;the&nbsp;product,&nbsp;rather&nbsp;than&nbsp;some&nbsp;other&nbsp;unique<br>
-identifier,&nbsp;like&nbsp;bug_id&nbsp;and&nbsp;user_id&nbsp;are&nbsp;elsewhere&nbsp;in&nbsp;the&nbsp;database.<br>
-<br>
-dependencies:&nbsp;Stores&nbsp;data&nbsp;about&nbsp;those&nbsp;cool&nbsp;dependency&nbsp;trees.<br>
-<br>
-fielddefs:&nbsp;&nbsp;A&nbsp;nifty&nbsp;table&nbsp;that&nbsp;defines&nbsp;other&nbsp;tables.&nbsp;&nbsp;For&nbsp;instance,&nbsp;when&nbsp;you<br>
-submit&nbsp;a&nbsp;form&nbsp;that&nbsp;changes&nbsp;the&nbsp;value&nbsp;of&nbsp;"AssignedTo"&nbsp;this&nbsp;table&nbsp;allows<br>
-translation&nbsp;to&nbsp;the&nbsp;actual&nbsp;field&nbsp;name&nbsp;"assigned_to"&nbsp;for&nbsp;entry&nbsp;into&nbsp;MySQL.<br>
-<br>
-groups:&nbsp;&nbsp;defines&nbsp;bitmasks&nbsp;for&nbsp;groups.&nbsp;&nbsp;A&nbsp;bitmask&nbsp;is&nbsp;a&nbsp;number&nbsp;that&nbsp;can&nbsp;uniquely<br>
-identify&nbsp;group&nbsp;memberships.&nbsp;&nbsp;For&nbsp;instance,&nbsp;say&nbsp;the&nbsp;group&nbsp;that&nbsp;is&nbsp;allowed&nbsp;to<br>
-tweak&nbsp;parameters&nbsp;is&nbsp;assigned&nbsp;a&nbsp;value&nbsp;of&nbsp;"1",&nbsp;the&nbsp;group&nbsp;that&nbsp;is&nbsp;allowed&nbsp;to&nbsp;edit<br>
-users&nbsp;is&nbsp;assigned&nbsp;a&nbsp;"2",&nbsp;and&nbsp;the&nbsp;group&nbsp;that&nbsp;is&nbsp;allowed&nbsp;to&nbsp;create&nbsp;new&nbsp;groups&nbsp;is<br>
-assigned&nbsp;the&nbsp;bitmask&nbsp;of&nbsp;"4".&nbsp;&nbsp;By&nbsp;uniquely&nbsp;combining&nbsp;the&nbsp;group&nbsp;bitmasks&nbsp;(much<br>
-like&nbsp;the&nbsp;chmod&nbsp;command&nbsp;in&nbsp;UNIX,)&nbsp;you&nbsp;can&nbsp;identify&nbsp;a&nbsp;user&nbsp;is&nbsp;allowed&nbsp;to&nbsp;tweak<br>
-parameters&nbsp;and&nbsp;create&nbsp;groups,&nbsp;but&nbsp;not&nbsp;edit&nbsp;users,&nbsp;by&nbsp;giving&nbsp;him&nbsp;a&nbsp;bitmask&nbsp;of<br>
-"5",&nbsp;or&nbsp;a&nbsp;user&nbsp;allowed&nbsp;to&nbsp;edit&nbsp;users&nbsp;and&nbsp;create&nbsp;groups,&nbsp;but&nbsp;not&nbsp;tweak<br>
-parameters,&nbsp;by&nbsp;giving&nbsp;him&nbsp;a&nbsp;bitmask&nbsp;of&nbsp;"6"&nbsp;Simple,&nbsp;huh?<br>
-&nbsp;&nbsp;If&nbsp;this&nbsp;makes&nbsp;no&nbsp;sense&nbsp;to&nbsp;you,&nbsp;try&nbsp;this&nbsp;at&nbsp;the&nbsp;mysql&nbsp;prompt:<br>
-mysql&#62;&nbsp;select&nbsp;*&nbsp;from&nbsp;groups;<br>
-&nbsp;&nbsp;You'll&nbsp;see&nbsp;the&nbsp;list,&nbsp;it&nbsp;makes&nbsp;much&nbsp;more&nbsp;sense&nbsp;that&nbsp;way.<br>
-<br>
-keyworddefs:&nbsp;&nbsp;Definitions&nbsp;of&nbsp;keywords&nbsp;to&nbsp;be&nbsp;used<br>
-<br>
-keywords:&nbsp;Unlike&nbsp;what&nbsp;you'd&nbsp;think,&nbsp;this&nbsp;table&nbsp;holds&nbsp;which&nbsp;keywords&nbsp;are<br>
-associated&nbsp;with&nbsp;which&nbsp;bug&nbsp;id's.<br>
-<br>
-logincookies:&nbsp;This&nbsp;stores&nbsp;every&nbsp;login&nbsp;cookie&nbsp;ever&nbsp;assigned&nbsp;to&nbsp;you&nbsp;for&nbsp;every<br>
-machine&nbsp;you've&nbsp;ever&nbsp;logged&nbsp;into&nbsp;Bugzilla&nbsp;from.&nbsp;&nbsp;Curiously,&nbsp;it&nbsp;never&nbsp;does&nbsp;any<br>
-housecleaning&nbsp;--&nbsp;I&nbsp;see&nbsp;cookies&nbsp;in&nbsp;this&nbsp;file&nbsp;I've&nbsp;not&nbsp;used&nbsp;for&nbsp;months.&nbsp;&nbsp;However,<br>
-since&nbsp;Bugzilla&nbsp;never&nbsp;expires&nbsp;your&nbsp;cookie&nbsp;(for&nbsp;convenience'&nbsp;sake),&nbsp;it&nbsp;makes<br>
-sense.<br>
-<br>
-longdescs:&nbsp;&nbsp;The&nbsp;meat&nbsp;of&nbsp;bugzilla&nbsp;--&nbsp;here&nbsp;is&nbsp;where&nbsp;all&nbsp;user&nbsp;comments&nbsp;are&nbsp;stored!<br>
-You've&nbsp;only&nbsp;got&nbsp;2^24&nbsp;bytes&nbsp;per&nbsp;comment&nbsp;(it's&nbsp;a&nbsp;mediumtext&nbsp;field),&nbsp;so&nbsp;speak<br>
-sparingly&nbsp;--&nbsp;that's&nbsp;only&nbsp;the&nbsp;amount&nbsp;of&nbsp;space&nbsp;the&nbsp;Old&nbsp;Testament&nbsp;from&nbsp;the&nbsp;Bible<br>
-would&nbsp;take&nbsp;(uncompressed,&nbsp;16&nbsp;megabytes).&nbsp;&nbsp;Each&nbsp;comment&nbsp;is&nbsp;keyed&nbsp;to&nbsp;the<br>
-bug_id&nbsp;to&nbsp;which&nbsp;it's&nbsp;attached,&nbsp;so&nbsp;the&nbsp;order&nbsp;is&nbsp;necessarily&nbsp;chronological,&nbsp;for<br>
-comments&nbsp;are&nbsp;played&nbsp;back&nbsp;in&nbsp;the&nbsp;order&nbsp;in&nbsp;which&nbsp;they&nbsp;are&nbsp;received.<br>
-<br>
-milestones:&nbsp;&nbsp;Interesting&nbsp;that&nbsp;milestones&nbsp;are&nbsp;associated&nbsp;with&nbsp;a&nbsp;specific&nbsp;product<br>
-in&nbsp;this&nbsp;table,&nbsp;but&nbsp;Bugzilla&nbsp;does&nbsp;not&nbsp;yet&nbsp;support&nbsp;differing&nbsp;milestones&nbsp;by<br>
-product&nbsp;through&nbsp;the&nbsp;standard&nbsp;configuration&nbsp;interfaces.<br>
-<br>
-namedqueries:&nbsp;&nbsp;This&nbsp;is&nbsp;where&nbsp;everybody&nbsp;stores&nbsp;their&nbsp;"custom&nbsp;queries".&nbsp;&nbsp;Very<br>
-cool&nbsp;feature;&nbsp;it&nbsp;beats&nbsp;the&nbsp;tar&nbsp;out&nbsp;of&nbsp;having&nbsp;to&nbsp;bookmark&nbsp;each&nbsp;cool&nbsp;query&nbsp;you<br>
-construct.<br>
-<br>
-products:&nbsp;&nbsp;What&nbsp;products&nbsp;you&nbsp;have,&nbsp;whether&nbsp;new&nbsp;bug&nbsp;entries&nbsp;are&nbsp;allowed&nbsp;for&nbsp;the<br>
-product,&nbsp;what&nbsp;milestone&nbsp;you're&nbsp;working&nbsp;toward&nbsp;on&nbsp;that&nbsp;product,&nbsp;votes,&nbsp;etc.&nbsp;&nbsp;It<br>
-will&nbsp;be&nbsp;nice&nbsp;when&nbsp;the&nbsp;components&nbsp;table&nbsp;supports&nbsp;these&nbsp;same&nbsp;features,&nbsp;so&nbsp;you<br>
-could&nbsp;close&nbsp;a&nbsp;particular&nbsp;component&nbsp;for&nbsp;bug&nbsp;entry&nbsp;without&nbsp;having&nbsp;to&nbsp;close&nbsp;an<br>
-entire&nbsp;product...<br>
-<br>
-profiles:&nbsp;&nbsp;Ahh,&nbsp;so&nbsp;you&nbsp;were&nbsp;wondering&nbsp;where&nbsp;your&nbsp;precious&nbsp;user&nbsp;information&nbsp;was<br>
-stored?&nbsp;&nbsp;Here&nbsp;it&nbsp;is!&nbsp;&nbsp;With&nbsp;the&nbsp;passwords&nbsp;in&nbsp;plain&nbsp;text&nbsp;for&nbsp;all&nbsp;to&nbsp;see!&nbsp;(but<br>
-sshh...&nbsp;don't&nbsp;tell&nbsp;your&nbsp;users!)<br>
-<br>
-profiles_activity:&nbsp;&nbsp;Need&nbsp;to&nbsp;know&nbsp;who&nbsp;did&nbsp;what&nbsp;when&nbsp;to&nbsp;who's&nbsp;profile?&nbsp;&nbsp;This'll<br>
-tell&nbsp;you,&nbsp;it's&nbsp;a&nbsp;pretty&nbsp;complete&nbsp;history.<br>
-<br>
-shadowlog:&nbsp;&nbsp;I&nbsp;could&nbsp;be&nbsp;mistaken&nbsp;here,&nbsp;but&nbsp;I&nbsp;believe&nbsp;this&nbsp;table&nbsp;tells&nbsp;you&nbsp;when<br>
-your&nbsp;shadow&nbsp;database&nbsp;is&nbsp;updated&nbsp;and&nbsp;what&nbsp;commands&nbsp;were&nbsp;used&nbsp;to&nbsp;update&nbsp;it.&nbsp;&nbsp;We<br>
-don't&nbsp;use&nbsp;a&nbsp;shadow&nbsp;database&nbsp;at&nbsp;our&nbsp;site&nbsp;yet,&nbsp;so&nbsp;it's&nbsp;pretty&nbsp;empty&nbsp;for&nbsp;us.<br>
-<br>
-versions:&nbsp;&nbsp;Version&nbsp;information&nbsp;for&nbsp;every&nbsp;product<br>
-<br>
-votes:&nbsp;&nbsp;Who&nbsp;voted&nbsp;for&nbsp;what&nbsp;when<br>
-<br>
-watch:&nbsp;&nbsp;Who&nbsp;(according&nbsp;to&nbsp;userid)&nbsp;is&nbsp;watching&nbsp;who's&nbsp;bugs&nbsp;(according&nbsp;to&nbsp;their<br>
-userid).<br>
-<br>
-<br>
-===<br>
-THE&nbsp;DETAILS<br>
-===<br>
-<br>
-&nbsp;&nbsp;Ahh,&nbsp;so&nbsp;you're&nbsp;wondering&nbsp;just&nbsp;what&nbsp;to&nbsp;do&nbsp;with&nbsp;the&nbsp;information&nbsp;above?&nbsp;&nbsp;At&nbsp;the<br>
-mysql&nbsp;prompt,&nbsp;you&nbsp;can&nbsp;view&nbsp;any&nbsp;information&nbsp;about&nbsp;the&nbsp;columns&nbsp;in&nbsp;a&nbsp;table&nbsp;with<br>
-this&nbsp;command&nbsp;(where&nbsp;"table"&nbsp;is&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;table&nbsp;you&nbsp;wish&nbsp;to&nbsp;view):<br>
-<br>
-mysql&#62;&nbsp;show&nbsp;columns&nbsp;from&nbsp;table;<br>
-<br>
-&nbsp;&nbsp;You&nbsp;can&nbsp;also&nbsp;view&nbsp;all&nbsp;the&nbsp;data&nbsp;in&nbsp;a&nbsp;table&nbsp;with&nbsp;this&nbsp;command:<br>
-<br>
-mysql&#62;&nbsp;select&nbsp;*&nbsp;from&nbsp;table;<br>
-<br>
-&nbsp;&nbsp;--&nbsp;note:&nbsp;this&nbsp;is&nbsp;a&nbsp;very&nbsp;bad&nbsp;idea&nbsp;to&nbsp;do&nbsp;on,&nbsp;for&nbsp;instance,&nbsp;the&nbsp;"bugs"&nbsp;table&nbsp;if<br>
-you&nbsp;have&nbsp;50,000&nbsp;bugs.&nbsp;&nbsp;You'll&nbsp;be&nbsp;sitting&nbsp;there&nbsp;a&nbsp;while&nbsp;until&nbsp;you&nbsp;ctrl-c&nbsp;or<br>
-50,000&nbsp;bugs&nbsp;play&nbsp;across&nbsp;your&nbsp;screen.<br>
-<br>
-&nbsp;&nbsp;You&nbsp;can&nbsp;limit&nbsp;the&nbsp;display&nbsp;from&nbsp;above&nbsp;a&nbsp;little&nbsp;with&nbsp;the&nbsp;command,&nbsp;where<br>
-"column"&nbsp;is&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;column&nbsp;for&nbsp;which&nbsp;you&nbsp;wish&nbsp;to&nbsp;restrict&nbsp;information:<br>
-<br>
-mysql&#62;&nbsp;select&nbsp;*&nbsp;from&nbsp;table&nbsp;where&nbsp;(column&nbsp;=&nbsp;"some&nbsp;info");<br>
-<br>
-&nbsp;&nbsp;--&nbsp;or&nbsp;the&nbsp;reverse&nbsp;of&nbsp;this<br>
-<br>
-mysql&#62;&nbsp;select&nbsp;*&nbsp;from&nbsp;table&nbsp;where&nbsp;(column&nbsp;!=&nbsp;"some&nbsp;info");<br>
-<br>
-&nbsp;&nbsp;Let's&nbsp;take&nbsp;our&nbsp;example&nbsp;from&nbsp;the&nbsp;introduction,&nbsp;and&nbsp;assume&nbsp;you&nbsp;need&nbsp;to&nbsp;change<br>
-the&nbsp;word&nbsp;"verified"&nbsp;to&nbsp;"approved"&nbsp;in&nbsp;the&nbsp;resolution&nbsp;field.&nbsp;&nbsp;We&nbsp;know&nbsp;from&nbsp;the<br>
-above&nbsp;information&nbsp;that&nbsp;the&nbsp;resolution&nbsp;is&nbsp;likely&nbsp;to&nbsp;be&nbsp;stored&nbsp;in&nbsp;the&nbsp;"bugs"<br>
-table.&nbsp;Note&nbsp;we'll&nbsp;need&nbsp;to&nbsp;change&nbsp;a&nbsp;little&nbsp;perl&nbsp;code&nbsp;as&nbsp;well&nbsp;as&nbsp;this&nbsp;database<br>
-change,&nbsp;but&nbsp;I&nbsp;won't&nbsp;plunge&nbsp;into&nbsp;that&nbsp;in&nbsp;this&nbsp;document.&nbsp;Let's&nbsp;verify&nbsp;the<br>
-information&nbsp;is&nbsp;stored&nbsp;in&nbsp;the&nbsp;"bugs"&nbsp;table:<br>
-<br>
-mysql&#62;&nbsp;show&nbsp;columns&nbsp;from&nbsp;bugs<br>
-<br>
-&nbsp;&nbsp;(exceedingly&nbsp;long&nbsp;output&nbsp;truncated&nbsp;here)<br>
-|&nbsp;bug_status|&nbsp;enum('UNCONFIRMED','NEW','ASSIGNED','REOPENED','RESOLVED','VERIFIED','CLOSED')||MUL&nbsp;|&nbsp;UNCONFIRMED||<br>
-<br>
-&nbsp;&nbsp;Sorry&nbsp;about&nbsp;that&nbsp;long&nbsp;line.&nbsp;&nbsp;We&nbsp;see&nbsp;from&nbsp;this&nbsp;that&nbsp;the&nbsp;"bug&nbsp;status"&nbsp;column&nbsp;is<br>
-an&nbsp;"enum&nbsp;field",&nbsp;which&nbsp;is&nbsp;a&nbsp;MySQL&nbsp;peculiarity&nbsp;where&nbsp;a&nbsp;string&nbsp;type&nbsp;field&nbsp;can<br>
-only&nbsp;have&nbsp;certain&nbsp;types&nbsp;of&nbsp;entries.&nbsp;&nbsp;While&nbsp;I&nbsp;think&nbsp;this&nbsp;is&nbsp;very&nbsp;cool,&nbsp;it's&nbsp;not<br>
-standard&nbsp;SQL.&nbsp;&nbsp;Anyway,&nbsp;we&nbsp;need&nbsp;to&nbsp;add&nbsp;the&nbsp;possible&nbsp;enum&nbsp;field&nbsp;entry<br>
-'APPROVED'&nbsp;by&nbsp;altering&nbsp;the&nbsp;"bugs"&nbsp;table.<br>
-<br>
-mysql&#62;&nbsp;ALTER&nbsp;table&nbsp;bugs&nbsp;CHANGE&nbsp;bug_status&nbsp;bug_status<br>
-&nbsp;&nbsp;&nbsp;&nbsp;-&#62;&nbsp;enum("UNCONFIRMED",&nbsp;"NEW",&nbsp;"ASSIGNED",&nbsp;"REOPENED",&nbsp;"RESOLVED",<br>
-&nbsp;&nbsp;&nbsp;&nbsp;-&#62;&nbsp;"VERIFIED",&nbsp;"APPROVED",&nbsp;"CLOSED")&nbsp;not&nbsp;null;<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;(note&nbsp;we&nbsp;can&nbsp;take&nbsp;three&nbsp;lines&nbsp;or&nbsp;more&nbsp;--&nbsp;whatever&nbsp;you&nbsp;put&nbsp;in&nbsp;before&nbsp;the<br>
-semicolon&nbsp;is&nbsp;evaluated&nbsp;as&nbsp;a&nbsp;single&nbsp;expression)<br>
-<br>
-Now&nbsp;if&nbsp;you&nbsp;do&nbsp;this:<br>
-<br>
-mysql&#62;&nbsp;show&nbsp;columns&nbsp;from&nbsp;bugs;<br>
-<br>
-&nbsp;&nbsp;you'll&nbsp;see&nbsp;that&nbsp;the&nbsp;bug_status&nbsp;field&nbsp;has&nbsp;an&nbsp;extra&nbsp;"APPROVED"&nbsp;enum&nbsp;that's<br>
-available!&nbsp;&nbsp;Cool&nbsp;thing,&nbsp;too,&nbsp;is&nbsp;that&nbsp;this&nbsp;is&nbsp;reflected&nbsp;on&nbsp;your&nbsp;query&nbsp;page&nbsp;as<br>
-well&nbsp;--&nbsp;you&nbsp;can&nbsp;query&nbsp;by&nbsp;the&nbsp;new&nbsp;status.&nbsp;&nbsp;But&nbsp;how's&nbsp;it&nbsp;fit&nbsp;into&nbsp;the&nbsp;existing<br>
-scheme&nbsp;of&nbsp;things?<br>
-&nbsp;&nbsp;Looks&nbsp;like&nbsp;you&nbsp;need&nbsp;to&nbsp;go&nbsp;back&nbsp;and&nbsp;look&nbsp;for&nbsp;instances&nbsp;of&nbsp;the&nbsp;word&nbsp;"verified"<br>
-in&nbsp;the&nbsp;perl&nbsp;code&nbsp;for&nbsp;Bugzilla&nbsp;--&nbsp;wherever&nbsp;you&nbsp;find&nbsp;"verified",&nbsp;change&nbsp;it&nbsp;to<br>
-"approved"&nbsp;and&nbsp;you're&nbsp;in&nbsp;business&nbsp;(make&nbsp;sure&nbsp;that's&nbsp;a&nbsp;case-insensitive&nbsp;search).<br>
-Although&nbsp;you&nbsp;can&nbsp;query&nbsp;by&nbsp;the&nbsp;enum&nbsp;field,&nbsp;you&nbsp;can't&nbsp;give&nbsp;something&nbsp;a&nbsp;status<br>
-of&nbsp;"APPROVED"&nbsp;until&nbsp;you&nbsp;make&nbsp;the&nbsp;perl&nbsp;changes.&nbsp;&nbsp;&nbsp;Note&nbsp;that&nbsp;this&nbsp;change&nbsp;I<br>
-mentioned&nbsp;can&nbsp;also&nbsp;be&nbsp;done&nbsp;by&nbsp;editing&nbsp;checksetup.pl,&nbsp;which&nbsp;automates&nbsp;a&nbsp;lot&nbsp;of<br>
-this.&nbsp;&nbsp;But&nbsp;you&nbsp;need&nbsp;to&nbsp;know&nbsp;this&nbsp;stuff&nbsp;anyway,&nbsp;right?<br>
-<br>
-&nbsp;&nbsp;I&nbsp;hope&nbsp;this&nbsp;database&nbsp;tutorial&nbsp;has&nbsp;been&nbsp;useful&nbsp;for&nbsp;you.&nbsp;&nbsp;If&nbsp;you&nbsp;have&nbsp;comments<br>
-to&nbsp;add,&nbsp;questions,&nbsp;concerns,&nbsp;etc.&nbsp;please&nbsp;direct&nbsp;them&nbsp;to<br>
-mbarnson@excitehome.net.&nbsp;&nbsp;Please&nbsp;direct&nbsp;flames&nbsp;to&nbsp;/dev/null&nbsp;:)&nbsp;&nbsp;Have&nbsp;a&nbsp;nice<br>
-day!<br>
-<br>
-<br>
-<br>
-===<br>
-LINKS<br>
-===<br>
-<br>
-Great&nbsp;MySQL&nbsp;tutorial&nbsp;site:<br>
-http://www.devshed.com/Server_Side/MySQL/<br>
-<br>
-	</P
+><LI
+><P
+>&#13;		  Announce your patch and the associated URL
+		  (http://bugzilla.mozilla.org/show_bug.cgi?id=XXXXXX) for discussion in
+		  the newsgroup (netscape.public.mozilla.webtools).  You'll get a really
+		  good, fairly immediate reaction to the implications of your patch,
+		  which will also give us an idea how well-received the change would
+		  be.
+		</P
+></LI
+><LI
+><P
+>&#13;		  If it passes muster with minimal modification, the person to whom
+		  the bug is assigned in Bugzilla is responsible for seeing the patch
+		  is checked into CVS.
+		</P
+></LI
+><LI
+><P
+>&#13;		  Bask in the glory of the fact that you helped write the most successful
+		  open-source bug-tracking software on the planet :)
+		</P
+></LI
+></OL
+></P
+></DIV
+></DIV
 ></DIV
 ></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="appendix"
 ><HR><H1
-CLASS="SECTION"
 ><A
-NAME="GRANTTABLES"
->C.3. MySQL Permissions &#38; Grant Tables</A
-></H1
+NAME="database">Appendix B. The Bugzilla Database</H1
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -15338,1302 +11265,744 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->The following portion of documentation comes from my
-	answer to an old discussion of Keystone, a cool product that
-	does trouble-ticket tracking for IT departments.  I wrote this
-	post to the  Keystone support group regarding MySQL grant
-	table permissions, and how to use them effectively. It is
-	badly in need of updating, as I believe MySQL has added a
-	field or two to the grant tables  since this time, but it
-	serves as a decent introduction and troubleshooting document
-	for grant table issues.  I used Keynote to track my troubles
-	until I discovered Bugzilla, which gave me a whole new set of
-	troubles to work on : )  Although it is of limited use, it
-	still has SOME use, thus it's still included.</P
-><P
->	Please note, however, that I was a relatively new user to
-	MySQL at the time.  Some of my suggestions, particularly in
-	how to set up security, showed a terrible lack of
-	security-related database experience.
-      </P
+>This document really needs to be updated with more fleshed out
+    information about primary keys, interrelationships, and maybe some nifty
+    tables to document dependencies. Any takers?</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
-><P
-CLASS="LITERALLAYOUT"
->From&nbsp;matt_barnson@singletrac.com&nbsp;Wed&nbsp;Jul&nbsp;&nbsp;7&nbsp;09:00:07&nbsp;1999<br>
-Date:&nbsp;Mon,&nbsp;1&nbsp;Mar&nbsp;1999&nbsp;21:37:04&nbsp;-0700&nbsp;<br>
-From:&nbsp;Matthew&nbsp;Barnson&nbsp;matt_barnson@singletrac.com<br>
-To:&nbsp;keystone-users@homeport.org<br>
-Subject:&nbsp;[keystone-users]&nbsp;Grant&nbsp;Tables&nbsp;FAQ<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;[The&nbsp;following&nbsp;text&nbsp;is&nbsp;in&nbsp;the&nbsp;"iso-8859-1"&nbsp;character&nbsp;set]<br>
-&nbsp;&nbsp;&nbsp;&nbsp;[Your&nbsp;display&nbsp;is&nbsp;set&nbsp;for&nbsp;the&nbsp;"US-ASCII"&nbsp;character&nbsp;set]<br>
-&nbsp;&nbsp;&nbsp;&nbsp;[Some&nbsp;characters&nbsp;may&nbsp;be&nbsp;displayed&nbsp;incorrectly]<br>
-<br>
-Maybe&nbsp;we&nbsp;can&nbsp;include&nbsp;this&nbsp;rambling&nbsp;message&nbsp;in&nbsp;the&nbsp;Keystone&nbsp;FAQ?&nbsp;&nbsp;It&nbsp;gets<br>
-asked&nbsp;a&nbsp;lot,&nbsp;and&nbsp;the&nbsp;only&nbsp;option&nbsp;current&nbsp;listed&nbsp;in&nbsp;the&nbsp;FAQ&nbsp;is<br>
-"--skip-grant-tables".<br>
-<br>
-Really,&nbsp;you&nbsp;can't&nbsp;go&nbsp;wrong&nbsp;by&nbsp;reading&nbsp;section&nbsp;6&nbsp;of&nbsp;the&nbsp;MySQL&nbsp;manual,&nbsp;at<br>
-http://www.mysql.com/Manual/manual.html.&nbsp;&nbsp;I&nbsp;am&nbsp;sure&nbsp;their&nbsp;description&nbsp;is<br>
-better&nbsp;than&nbsp;mine.<br>
-<br>
-MySQL&nbsp;runs&nbsp;fine&nbsp;without&nbsp;permissions&nbsp;set&nbsp;up&nbsp;correctly&nbsp;if&nbsp;you&nbsp;run&nbsp;the&nbsp;mysql<br>
-daemon&nbsp;with&nbsp;the&nbsp;"--skip-grant-tables"&nbsp;option.&nbsp;&nbsp;Running&nbsp;this&nbsp;way&nbsp;denies<br>
-access&nbsp;to&nbsp;nobody.&nbsp;&nbsp;Unfortunately,&nbsp;unless&nbsp;you've&nbsp;got&nbsp;yourself&nbsp;firewalled&nbsp;it<br>
-also&nbsp;opens&nbsp;the&nbsp;potential&nbsp;for&nbsp;abuse&nbsp;if&nbsp;someone&nbsp;knows&nbsp;you're&nbsp;running&nbsp;it.<br>
-<br>
-Additionally,&nbsp;the&nbsp;default&nbsp;permissions&nbsp;for&nbsp;MySQL&nbsp;allow&nbsp;anyone&nbsp;at&nbsp;localhost<br>
-access&nbsp;to&nbsp;the&nbsp;database&nbsp;if&nbsp;the&nbsp;database&nbsp;name&nbsp;begins&nbsp;with&nbsp;"test_"&nbsp;or&nbsp;is&nbsp;named<br>
-"test"&nbsp;(i.e.&nbsp;"test_keystone").&nbsp;&nbsp;You&nbsp;can&nbsp;change&nbsp;the&nbsp;name&nbsp;of&nbsp;your&nbsp;database&nbsp;in<br>
-the&nbsp;keystone.conf&nbsp;file&nbsp;($sys_dbname).&nbsp;&nbsp;This&nbsp;is&nbsp;the&nbsp;way&nbsp;I&nbsp;am&nbsp;doing&nbsp;it&nbsp;for<br>
-some&nbsp;of&nbsp;my&nbsp;databases,&nbsp;and&nbsp;it&nbsp;works&nbsp;fine.<br>
-<br>
-The&nbsp;methods&nbsp;described&nbsp;below&nbsp;assume&nbsp;you're&nbsp;running&nbsp;MySQL&nbsp;on&nbsp;the&nbsp;same&nbsp;box&nbsp;as<br>
-your&nbsp;webserver,&nbsp;and&nbsp;that&nbsp;you&nbsp;don't&nbsp;mind&nbsp;if&nbsp;your&nbsp;$sys_dbuser&nbsp;for&nbsp;Keystone&nbsp;has<br>
-superuser&nbsp;access.&nbsp;&nbsp;See&nbsp;near&nbsp;the&nbsp;bottom&nbsp;of&nbsp;this&nbsp;message&nbsp;for&nbsp;a&nbsp;description&nbsp;of<br>
-what&nbsp;each&nbsp;field&nbsp;does.<br>
-<br>
-Method&nbsp;#1:<br>
-<br>
-1.&nbsp;&nbsp;cd&nbsp;/var/lib<br>
-	#location&nbsp;where&nbsp;you'll&nbsp;want&nbsp;to&nbsp;run&nbsp;/usr/bin/mysql_install_db&nbsp;shell<br>
-script&nbsp;from&nbsp;to&nbsp;get&nbsp;it&nbsp;to&nbsp;work.<br>
-<br>
-2.&nbsp;&nbsp;ln&nbsp;-s&nbsp;mysql&nbsp;data&nbsp;&nbsp;<br>
-	#&nbsp;soft&nbsp;links&nbsp;the&nbsp;"mysql"&nbsp;directory&nbsp;to&nbsp;"data",&nbsp;which&nbsp;is&nbsp;what<br>
-mysql_install_db&nbsp;expects.&nbsp;&nbsp;Alternately,&nbsp;you&nbsp;can&nbsp;edit&nbsp;mysql_install_db&nbsp;and<br>
-change&nbsp;all&nbsp;the&nbsp;"./data"&nbsp;references&nbsp;to&nbsp;"./mysql".<br>
-<br>
-3.&nbsp;&nbsp;Edit&nbsp;/usr/bin/mysql_install_db&nbsp;with&nbsp;your&nbsp;favorite&nbsp;text&nbsp;editor&nbsp;(vi,<br>
-emacs,&nbsp;jot,&nbsp;pico,&nbsp;etc.)<br>
-A)&nbsp;&nbsp;Copy&nbsp;the&nbsp;"INSERT&nbsp;INTO&nbsp;db&nbsp;VALUES<br>
-('%','test\_%','','Y','Y','Y','Y','Y','Y');"&nbsp;and&nbsp;paste&nbsp;it&nbsp;immediately&nbsp;after<br>
-itself.&nbsp;&nbsp;Chage&nbsp;the&nbsp;'test\_%'&nbsp;value&nbsp;to&nbsp;'keystone',&nbsp;or&nbsp;the&nbsp;value&nbsp;of<br>
-$sys_dbname&nbsp;in&nbsp;keystone.conf.<br>
-B)&nbsp;&nbsp;If&nbsp;you&nbsp;are&nbsp;running&nbsp;your&nbsp;keystone&nbsp;database&nbsp;with&nbsp;any&nbsp;user,&nbsp;you'll&nbsp;need&nbsp;to<br>
-copy&nbsp;the&nbsp;"INSERT&nbsp;INTO&nbsp;user&nbsp;VALUES<br>
-('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');"&nbsp;line&nbsp;after<br>
-itself&nbsp;and&nbsp;change&nbsp;'root'&nbsp;to&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;keystone&nbsp;database&nbsp;user<br>
-($sys_dbuser)&nbsp;in&nbsp;keystone.conf.<br>
-<br>
-	#&nbsp;adds&nbsp;entries&nbsp;to&nbsp;the&nbsp;script&nbsp;to&nbsp;create&nbsp;grant&nbsp;tables&nbsp;for&nbsp;specific<br>
-hosts&nbsp;and&nbsp;users.&nbsp;&nbsp;The&nbsp;user&nbsp;you&nbsp;set&nbsp;up&nbsp;has&nbsp;super-user&nbsp;access&nbsp;($sys_dbuser)&nbsp;--<br>
-you&nbsp;may&nbsp;or&nbsp;may&nbsp;not&nbsp;want&nbsp;this.&nbsp;&nbsp;The&nbsp;layout&nbsp;of&nbsp;mysql_install_db&nbsp;is&nbsp;really&nbsp;very<br>
-uncomplicated.<br>
-<br>
-4.&nbsp;&nbsp;/usr/bin/mysqladmin&nbsp;shutdown<br>
-	#&nbsp;ya&nbsp;gotta&nbsp;shut&nbsp;it&nbsp;down&nbsp;before&nbsp;you&nbsp;can&nbsp;reinstall&nbsp;the&nbsp;grant&nbsp;tables!<br>
-<br>
-5.&nbsp;&nbsp;rm&nbsp;-i&nbsp;/var/lib/mysql/mysql/*.IS?'&nbsp;and&nbsp;answer&nbsp;'Y'&nbsp;to&nbsp;the&nbsp;deletion<br>
-questions.<br>
-	#&nbsp;nuke&nbsp;your&nbsp;current&nbsp;grant&nbsp;tables.&nbsp;&nbsp;This&nbsp;WILL&nbsp;NOT&nbsp;delete&nbsp;any&nbsp;other<br>
-databases&nbsp;than&nbsp;your&nbsp;grant&nbsp;tables.<br>
-<br>
-6.&nbsp;&nbsp;/usr/bin/mysql_install_db<br>
-	#&nbsp;run&nbsp;the&nbsp;script&nbsp;you&nbsp;just&nbsp;edited&nbsp;to&nbsp;install&nbsp;your&nbsp;new&nbsp;grant&nbsp;tables.<br>
-<br>
-7.&nbsp;&nbsp;mysqladmin&nbsp;-u&nbsp;root&nbsp;password&nbsp;(new_password)&nbsp;&nbsp;<br>
-	#&nbsp;change&nbsp;the&nbsp;root&nbsp;MySQL&nbsp;password,&nbsp;or&nbsp;else&nbsp;anyone&nbsp;on&nbsp;localhost&nbsp;can<br>
-login&nbsp;to&nbsp;MySQL&nbsp;as&nbsp;root&nbsp;and&nbsp;make&nbsp;changes.&nbsp;&nbsp;You&nbsp;can&nbsp;skip&nbsp;this&nbsp;step&nbsp;if&nbsp;you&nbsp;want<br>
-keystone&nbsp;to&nbsp;connect&nbsp;as&nbsp;root&nbsp;with&nbsp;no&nbsp;password.<br>
-<br>
-8.&nbsp;&nbsp;mysqladmin&nbsp;-u&nbsp;(webserver_user_name)&nbsp;password&nbsp;(new_password)&nbsp;&nbsp;<br>
-	#&nbsp;change&nbsp;the&nbsp;password&nbsp;of&nbsp;the&nbsp;$sys_dbuser.&nbsp;&nbsp;Note&nbsp;that&nbsp;you&nbsp;will&nbsp;need<br>
-to&nbsp;change&nbsp;the&nbsp;password&nbsp;in&nbsp;the&nbsp;keystone.conf&nbsp;file&nbsp;as&nbsp;well&nbsp;in&nbsp;$sys_dbpasswd,<br>
-and&nbsp;if&nbsp;your&nbsp;permissions&nbsp;are&nbsp;set&nbsp;up&nbsp;incorrectly&nbsp;anybody&nbsp;can&nbsp;type&nbsp;the&nbsp;URL&nbsp;to<br>
-your&nbsp;keystone.conf&nbsp;file&nbsp;and&nbsp;get&nbsp;the&nbsp;password.&nbsp;&nbsp;Not&nbsp;that&nbsp;this&nbsp;will&nbsp;help&nbsp;them<br>
-much&nbsp;if&nbsp;your&nbsp;permissions&nbsp;are&nbsp;set&nbsp;to&nbsp;@localhost.<br>
-<br>
-<br>
-<br>
-Method&nbsp;#2:&nbsp;&nbsp;easier,&nbsp;but&nbsp;a&nbsp;pain&nbsp;reproducing&nbsp;if&nbsp;you&nbsp;have&nbsp;to&nbsp;delete&nbsp;your&nbsp;grant<br>
-tables.&nbsp;&nbsp;This&nbsp;is&nbsp;the&nbsp;"recommended"&nbsp;method&nbsp;for&nbsp;altering&nbsp;grant&nbsp;tables&nbsp;in<br>
-MySQL.&nbsp;&nbsp;I&nbsp;don't&nbsp;use&nbsp;it&nbsp;because&nbsp;I&nbsp;like&nbsp;the&nbsp;other&nbsp;way&nbsp;:)<br>
-<br>
-shell&#62;&nbsp;mysql&nbsp;--user=root&nbsp;keystone<br>
-<br>
-mysql&#62;&nbsp;GRANT<br>
-SELECT,INSERT,UPDATE,DELETE,INDEX,ALTER,CREATE,DROP,RELOAD,SHUTDOWN,PROCESS,<br>
-FILE,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ON&nbsp;keystone.*<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TO&nbsp;&#60;$sys_dbuser&nbsp;name&#62;@localhost<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IDENTIFIED&nbsp;BY&nbsp;'(password)'<br>
-	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WITH&nbsp;GRANT&nbsp;OPTION;<br>
-<br>
-OR<br>
-<br>
-mysql&#62;&nbsp;GRANT&nbsp;ALL&nbsp;PRIVELEGES&nbsp;<br>
-		ON&nbsp;keystone.*<br>
-		TO&nbsp;&#60;$sys_dbuser&nbsp;name&#62;@localhost<br>
-		IDENTIFIED&nbsp;BY&nbsp;'(password)'<br>
-		WITH&nbsp;GRANT&nbsp;OPTION;<br>
-<br>
-	#&nbsp;this&nbsp;grants&nbsp;the&nbsp;required&nbsp;permissions&nbsp;to&nbsp;the&nbsp;keystone&nbsp;($sys_dbuser)<br>
-account&nbsp;defined&nbsp;in&nbsp;keystone.conf.&nbsp;&nbsp;However,&nbsp;if&nbsp;you&nbsp;are&nbsp;runnning&nbsp;many<br>
-different&nbsp;MySQL-based&nbsp;apps,&nbsp;as&nbsp;we&nbsp;are,&nbsp;it's&nbsp;generally&nbsp;better&nbsp;to&nbsp;edit&nbsp;the<br>
-mysql_install_db&nbsp;script&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;quickly&nbsp;reproduce&nbsp;your&nbsp;permissions<br>
-structure&nbsp;again.&nbsp;&nbsp;Note&nbsp;that&nbsp;the&nbsp;FILE&nbsp;privelege&nbsp;and&nbsp;WITH&nbsp;GRANT&nbsp;OPTION&nbsp;may&nbsp;not<br>
-be&nbsp;in&nbsp;your&nbsp;best&nbsp;interest&nbsp;to&nbsp;include.<br>
-<br>
-<br>
-GRANT&nbsp;TABLE&nbsp;FIELDS&nbsp;EXPLANATION:<br>
-Quick&nbsp;syntax&nbsp;summary:&nbsp;&nbsp;"%"&nbsp;in&nbsp;MySQL&nbsp;is&nbsp;a&nbsp;wildcard.&nbsp;&nbsp;I.E.,&nbsp;if&nbsp;you&nbsp;are<br>
-defining&nbsp;your&nbsp;DB&nbsp;table&nbsp;and&nbsp;in&nbsp;the&nbsp;'host'&nbsp;field&nbsp;and&nbsp;enter&nbsp;'%',&nbsp;that&nbsp;means<br>
-that&nbsp;any&nbsp;host&nbsp;can&nbsp;access&nbsp;that&nbsp;database.&nbsp;&nbsp;Of&nbsp;course,&nbsp;that&nbsp;host&nbsp;must&nbsp;also&nbsp;have<br>
-a&nbsp;valid&nbsp;db&nbsp;user&nbsp;in&nbsp;order&nbsp;to&nbsp;do&nbsp;anything&nbsp;useful.&nbsp;&nbsp;'db'=name&nbsp;of&nbsp;database.&nbsp;&nbsp;In<br>
-our&nbsp;case,&nbsp;it&nbsp;should&nbsp;be&nbsp;"keystone".&nbsp;&nbsp;"user"&nbsp;should&nbsp;be&nbsp;your&nbsp;"$sys_dbuser"<br>
-defined&nbsp;in&nbsp;keystone.conf.&nbsp;&nbsp;Note&nbsp;that&nbsp;you&nbsp;CANNOT&nbsp;add&nbsp;or&nbsp;change&nbsp;a&nbsp;password&nbsp;by<br>
-using&nbsp;the&nbsp;"INSERT&nbsp;INTO&nbsp;db&nbsp;(X)"&nbsp;command&nbsp;--&nbsp;you&nbsp;must&nbsp;change&nbsp;it&nbsp;with&nbsp;the&nbsp;mysql<br>
--u&nbsp;command&nbsp;as&nbsp;defined&nbsp;above.&nbsp;&nbsp;Passwords&nbsp;are&nbsp;stored&nbsp;encrypted&nbsp;in&nbsp;the&nbsp;MySQL<br>
-database,&nbsp;and&nbsp;if&nbsp;you&nbsp;try&nbsp;to&nbsp;enter&nbsp;it&nbsp;directly&nbsp;into&nbsp;the&nbsp;table&nbsp;they&nbsp;will&nbsp;not<br>
-match.<br>
-<br>
-TABLE:&nbsp;&nbsp;USER.&nbsp;&nbsp;Everything&nbsp;after&nbsp;"password"&nbsp;is&nbsp;a&nbsp;privelege&nbsp;granted&nbsp;(Y/N).<br>
-This&nbsp;table&nbsp;controls&nbsp;individual&nbsp;user&nbsp;global&nbsp;access&nbsp;rights.<br>
-<br>
-'host','user','password','select','insert','update','delete','index','alter'<br>
-,'create','drop','grant','reload','shutdown','process','file'<br>
-<br>
-TABLE:&nbsp;&nbsp;DB.&nbsp;&nbsp;This&nbsp;controls&nbsp;access&nbsp;of&nbsp;USERS&nbsp;to&nbsp;databases.<br>
-<br>
-'host','db','user','select','insert','update','delete','index','alter','crea<br>
-te','drop','grant'<br>
-<br>
-TABLE:&nbsp;&nbsp;HOST.&nbsp;&nbsp;This&nbsp;controls&nbsp;which&nbsp;HOSTS&nbsp;are&nbsp;allowed&nbsp;what&nbsp;global&nbsp;access<br>
-rights.&nbsp;&nbsp;Note&nbsp;that&nbsp;the&nbsp;HOST&nbsp;table,&nbsp;USER&nbsp;table,&nbsp;and&nbsp;DB&nbsp;table&nbsp;are&nbsp;very&nbsp;closely<br>
-connected&nbsp;--&nbsp;if&nbsp;an&nbsp;authorized&nbsp;USER&nbsp;attempts&nbsp;an&nbsp;SQL&nbsp;request&nbsp;from&nbsp;an<br>
-unauthorized&nbsp;HOST,&nbsp;she's&nbsp;denied.&nbsp;&nbsp;If&nbsp;a&nbsp;request&nbsp;from&nbsp;an&nbsp;authorized&nbsp;HOST&nbsp;is<br>
-not&nbsp;an&nbsp;authorized&nbsp;USER,&nbsp;it&nbsp;is&nbsp;denied.&nbsp;&nbsp;If&nbsp;a&nbsp;globally&nbsp;authorized&nbsp;USER&nbsp;does<br>
-not&nbsp;have&nbsp;rights&nbsp;to&nbsp;a&nbsp;certain&nbsp;DB,&nbsp;she's&nbsp;denied.&nbsp;&nbsp;Get&nbsp;the&nbsp;picture?<br>
-<br>
-'host','db','select','insert','update','delete','index','alter','create','dr<br>
-op','grant'<br>
-<br>
-<br>
-You&nbsp;should&nbsp;now&nbsp;have&nbsp;a&nbsp;working&nbsp;knowledge&nbsp;of&nbsp;MySQL&nbsp;grant&nbsp;tables.&nbsp;&nbsp;If&nbsp;there&nbsp;is<br>
-anything&nbsp;I've&nbsp;left&nbsp;out&nbsp;of&nbsp;this&nbsp;answer&nbsp;that&nbsp;you&nbsp;feel&nbsp;is&nbsp;pertinent,&nbsp;or&nbsp;if&nbsp;my<br>
-instructions&nbsp;don't&nbsp;work&nbsp;for&nbsp;you,&nbsp;please&nbsp;let&nbsp;me&nbsp;know&nbsp;and&nbsp;I'll&nbsp;re-post&nbsp;this<br>
-letter&nbsp;again,&nbsp;corrected.&nbsp;&nbsp;I&nbsp;threw&nbsp;it&nbsp;together&nbsp;one&nbsp;night&nbsp;out&nbsp;of&nbsp;exasperation<br>
-for&nbsp;all&nbsp;the&nbsp;newbies&nbsp;who&nbsp;don't&nbsp;know&nbsp;squat&nbsp;about&nbsp;MySQL&nbsp;yet,&nbsp;so&nbsp;it&nbsp;is&nbsp;almost<br>
-guaranteed&nbsp;to&nbsp;have&nbsp;errors.<br>
-<br>
-Once&nbsp;again,&nbsp;you&nbsp;can't&nbsp;go&nbsp;wrong&nbsp;by&nbsp;reading&nbsp;section&nbsp;6&nbsp;of&nbsp;the&nbsp;MySQL&nbsp;manual.&nbsp;&nbsp;It<br>
-is&nbsp;more&nbsp;detailed&nbsp;than&nbsp;I!<br>
-http://www.mysql.com/Manual/manual.html.<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;</P
-></DIV
-></DIV
-><DIV
-CLASS="APPENDIX"
-><HR><H1
-><A
-NAME="PATCHES"
->Appendix D. Useful Patches and Utilities for Bugzilla</A
-></H1
-><P
->Are you looking for a way to put your Bugzilla into overdrive?  Catch some of the niftiest tricks here in this section.</P
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="REWRITE"
->D.1. Apache <TT
-CLASS="FILENAME"
->mod_rewrite</TT
-> magic</A
-></H1
+NAME="dbschema">B.1. Database Schema Chart</H1
 ><P
->Apache's <TT
-CLASS="FILENAME"
->mod_rewrite</TT
-> module lets you do some truly amazing things with URL rewriting.  Here are a couple of examples of what you can do.</P
-><P
-></P
-><OL
-TYPE="1"
-><LI
+>&#13;      <DIV
+CLASS="mediaobject"
 ><P
->	  Make it so if someone types
-	  <TT
-CLASS="COMPUTEROUTPUT"
->http://www.foo.com/12345</TT
->,
-	  Bugzilla spits back
-	  http://www.foo.com/show_bug.cgi?id=12345. Try setting up
-	  your VirtualHost section for Bugzilla with a rule like
-	  this:</P
-><TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="90%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
->&#60;VirtualHost 12.34.56.78&#62;
-RewriteEngine On
-RewriteRule ^/([0-9]+)$ http://foo.bar.com/show_bug.cgi?id=$1 [L,R]
-&#60;/VirtualHost&#62;
-	</PRE
-></FONT
-></TD
-></TR
-></TABLE
-></LI
-><LI
+><IMG
+SRC="../images/dbschema.jpg"><DIV
+CLASS="caption"
 ><P
->There are many, many more things you can do with
-	  mod_rewrite.  As time goes on, I will include many more in
-	  the Guide.  For now, though, please refer to the mod_rewrite
-	  documentation at <A
-HREF="http://www.apache.org"
-TARGET="_top"
->http://www.apache.org</A
+>Bugzilla database relationships chart</P
+></DIV
 ></P
-></LI
-></OL
+></DIV
+>
+    </P
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><HR><H1
-CLASS="SECTION"
+CLASS="section"
+><A
+NAME="dbdoc">B.2. MySQL Bugzilla Database Introduction</H1
+><P
+>This information comes straight from my life. I was forced to learn
+    how Bugzilla organizes database because of nitpicky requests from users
+    for tiny changes in wording, rather than having people re-educate
+    themselves or figure out how to work our procedures around the tool. It
+    sucks, but it can and will happen to you, so learn how the schema works
+    and deal with it when it comes.</P
+><P
+>So, here you are with your brand-new installation of Bugzilla.
+    You've got MySQL set up, Apache working right, Perl DBI and DBD talking
+    to the database flawlessly. Maybe you've even entered a few test bugs to
+    make sure email's working; people seem to be notified of new bugs and
+    changes, and you can enter and edit bugs to your heart's content. Perhaps
+    you've gone through the trouble of setting up a gateway for people to
+    submit bugs to your database via email, have had a few people test it,
+    and received rave reviews from your beta testers.</P
+><P
+>What's the next thing you do? Outline a training strategy for your
+    development team, of course, and bring them up to speed on the new tool
+    you've labored over for hours.</P
+><P
+>Your first training session starts off very well! You have a
+    captive audience which seems enraptured by the efficiency embodied in
+    this thing called "Bugzilla". You are caught up describing the nifty
+    features, how people can save favorite queries in the database, set them
+    up as headers and footers on their pages, customize their layouts,
+    generate reports, track status with greater efficiency than ever before,
+    leap tall buildings with a single bound and rescue Jane from the clutches
+    of Certain Death!</P
+><P
+>But Certain Death speaks up -- a tiny voice, from the dark corners
+    of the conference room. "I have a concern," the voice hisses from the
+    darkness, "about the use of the word 'verified'.</P
+><P
+>The room, previously filled with happy chatter, lapses into
+    reverential silence as Certain Death (better known as the Vice President
+    of Software Engineering) continues. "You see, for two years we've used
+    the word 'verified' to indicate that a developer or quality assurance
+    engineer has confirmed that, in fact, a bug is valid. I don't want to
+    lose two years of training to a new software product. You need to change
+    the bug status of 'verified' to 'approved' as soon as possible. To avoid
+    confusion, of course."</P
+><P
+>Oh no! Terror strikes your heart, as you find yourself mumbling
+    "yes, yes, I don't think that would be a problem," You review the changes
+    with Certain Death, and continue to jabber on, "no, it's not too big a
+    change. I mean, we have the source code, right? You know, 'Use the
+    Source, Luke' and all that... no problem," All the while you quiver
+    inside like a beached jellyfish bubbling, burbling, and boiling on a hot
+    Jamaican sand dune...</P
+><P
+>Thus begins your adventure into the heart of Bugzilla. You've been
+    forced to learn about non-portable enum() fields, varchar columns, and
+    tinyint definitions. The Adventure Awaits You!</P
+><DIV
+CLASS="section"
+><HR><H2
+CLASS="section"
 ><A
-NAME="SETPERL"
->D.2. The setperl.csh Utility</A
-></H1
-><P
->	 You can use the "setperl.csh" utility to quickly and
-      easily change the path to perl on all your Bugzilla files. This
-      is a C-shell script; if you do not have "csh" or "tcsh" in the
-      search path on your system, it will not work!
-    </P
-><DIV
-CLASS="PROCEDURE"
-><OL
-TYPE="1"
-><LI
-><P
->	  Download the "setperl.csh" utility to your Bugzilla
-	  directory and make it executable.
-	</P
-><OL
-CLASS="SUBSTEPS"
-TYPE="a"
-><LI
+NAME="AEN2077">B.2.1. Bugzilla Database Basics</H2
 ><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
->		<TT
-CLASS="PROMPT"
->bash#</TT
->
-		<B
-CLASS="COMMAND"
->cd /your/path/to/bugzilla</B
->
-	      </TT
+>If you were like me, at this point you're totally clueless about
+      the internals of MySQL, and if it weren't for this executive order from
+      the Vice President you couldn't care less about the difference between
+      a 
+      <SPAN
+CLASS="QUOTE"
+>"bigint"</SPAN
 >
-	    </P
-></LI
-><LI
-><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->bash#</TT
-> <B
-CLASS="COMMAND"
->wget -O
-		  setperl.csh
-		  'http://bugzilla.mozilla.org/showattachment.cgi?attach_id=10795'</B
-> </TT
+
+      and a 
+      <SPAN
+CLASS="QUOTE"
+>"tinyint"</SPAN
 >
-	    </P
-></LI
-><LI
-><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->bash#</TT
-> <B
-CLASS="COMMAND"
->chmod
-		  u+x setperl.csh</B
-> </TT
+
+      entry in MySQL. I recommend you refer to the MySQL documentation,
+      available at 
+      <A
+HREF="http://www.mysql.com/doc.html"
+TARGET="_top"
+>MySQL.com</A
 >
-	    </P
-></LI
-></OL
-></LI
-><LI
+
+      . Below are the basics you need to know about the Bugzilla database.
+      Check the chart above for more details.</P
 ><P
->	  Prepare (and fix) Bugzilla file permissions.
-	</P
+>&#13;        <P
+></P
 ><OL
-CLASS="SUBSTEPS"
-TYPE="a"
-><LI
-><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
->		<TT
-CLASS="PROMPT"
->bash#</TT
->
-		<B
-CLASS="COMMAND"
->chmod u+w *</B
->
-	      </TT
->
-	    </P
-></LI
-><LI
-><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->bash#</TT
-> <B
-CLASS="COMMAND"
->chmod
-		  u+x duplicates.cgi</B
-> </TT
->
-	    </P
-></LI
-><LI
-><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
->		<TT
-CLASS="PROMPT"
->bash#</TT
->
-		<B
-CLASS="COMMAND"
->chmod a-x bug_status.html</B
->
-	      </TT
->
-	    </P
-></LI
-></OL
-></LI
+TYPE="1"
 ><LI
 ><P
->	  Run the script:
-	</P
+>To connect to your database:</P
 ><P
->	  <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
+>&#13;              <TT
+CLASS="prompt"
 >bash#</TT
 >
-	    <B
-CLASS="COMMAND"
->./setperl.csh /your/path/to/perl</B
+
+              <B
+CLASS="command"
+>mysql</B
 >
-	  </TT
+
+              <TT
+CLASS="parameter"
+><I
+>-u root</I
+></TT
 >
-<DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN2439"
-></A
-><P
-><B
->Example D-1. Using Setperl to set your perl path</B
-></P
+            </P
 ><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->bash#</TT
->
-		<B
-CLASS="COMMAND"
->./setperl.csh /usr/bin/perl</B
->
-	      </TT
+>If this works without asking you for a password, 
+            <EM
+>shame on you</EM
 >
+
+            ! You should have locked your security down like the installation
+            instructions told you to. You can find details on locking down
+            your database in the Bugzilla FAQ in this directory (under
+            "Security"), or more robust security generalities in the 
+            <A
+HREF="http://www.mysql.com/php/manual.php3?section=Privilege_system"
+TARGET="_top"
+>MySQL
+            searchable documentation</A
+>.            
             </P
-></DIV
->
-	</P
 ></LI
-></OL
-></DIV
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="CMDLINE"
->D.3. Command-line Bugzilla Queries</A
-></H1
-><P
->      Users can query Bugzilla from the command line using this suite
-      of utilities.
-    </P
-><P
->      The query.conf file contains the mapping from options to field
-      names and comparison types.  Quoted option names are "grepped"
-      for, so it should be easy to edit this file.  Comments (#) have
-      no effect; you must make sure these lines do not contain any
-      quoted "option"
-    </P
-><P
->      buglist is a shell script which submits a Bugzilla query and
-      writes the resulting HTML page to stdout.  It supports both
-      short options, (such as "-Afoo" or "-Rbar") and long options
-      (such as "--assignedto=foo" or "--reporter=bar").  If the first
-      character of an option is not "-", it is treated as if it were
-      prefixed with "--default=".
-    </P
-><P
->      The columlist is taken from the COLUMNLIST environment variable.
-      This is equivalent to the "Change Columns" option when you list
-      bugs in buglist.cgi.  If you have already used Bugzilla, use
-      <B
-CLASS="COMMAND"
->grep COLUMLIST ~/.netscape/cookies</B
-> to see
-      your current COLUMNLIST setting.
-    </P
-><P
->      bugs is a simple shell script which calls buglist and extracts
-      the bug numbers from the output.  Adding the prefix
-      "http://bugzilla.mozilla.org/buglist.cgi?bug_id=" turns the bug
-      list into a working link if any bugs are found. Counting bugs is
-      easy.  Pipe the results through <B
-CLASS="COMMAND"
->sed -e 's/,/ /g' | wc |
-	awk '{printf $2 "\n"}'</B
->
-    </P
-><P
->      Akkana says she has good results piping buglist output through
-      <B
-CLASS="COMMAND"
->w3m -T text/html -dump</B
->
-    </P
-><DIV
-CLASS="PROCEDURE"
-><OL
-TYPE="1"
 ><LI
 ><P
->	  Download three files:
-	</P
-><OL
-CLASS="SUBSTEPS"
-TYPE="a"
-><LI
+>You should now be at a prompt that looks like this:</P
 ><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->bash$</TT
-> <B
-CLASS="COMMAND"
->wget -O
-		  query.conf
-		  'http://bugzilla.mozilla.org/showattachment.cgi?attach_id=26157'</B
-> </TT
+>&#13;              <TT
+CLASS="prompt"
+>mysql&#62;</TT
 >
-	    </P
-></LI
-><LI
+            </P
 ><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->bash$</TT
-> <B
-CLASS="COMMAND"
->wget -O
-		  buglist
-		  'http://bugzilla.mozilla.org/showattachment.cgi?attach_id=26944'</B
-> </TT
+>At the prompt, if 
+            <SPAN
+CLASS="QUOTE"
+>"bugs"</SPAN
 >
-	    </P
-></LI
-><LI
-><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->bash#</TT
-> <B
-CLASS="COMMAND"
->wget -O
-		  bugs
-		  'http://bugzilla.mozilla.org/showattachment.cgi?attach_id=26215'</B
-> </TT
+
+            is the name you chose in the
+            <TT
+CLASS="filename"
+>localconfig</TT
 >
-	    </P
-></LI
-></OL
-></LI
-><LI
+
+            file for your Bugzilla database, type:</P
 ><P
->	  Make your utilities executable:
-	  <TT
-CLASS="COMPUTEROUTPUT"
->	    <TT
-CLASS="PROMPT"
->bash$</TT
->
-	    <B
-CLASS="COMMAND"
->chmod u+x buglist bugs</B
+>&#13;              <TT
+CLASS="prompt"
+>mysql</TT
 >
-	  </TT
+
+              <B
+CLASS="command"
+>use bugs;</B
 >
-	</P
+            </P
 ></LI
-></OL
-></DIV
-></DIV
+></OL
+>
+      </P
 ><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
+CLASS="section"
+><HR><H3
+CLASS="section"
 ><A
-NAME="QUICKSEARCH"
->D.4. The Quicksearch Utility</A
-></H1
-><P
->      Quicksearch is a new, experimental feature of the 2.12 release.
-      It consist of two Javascript files, "quicksearch.js" and
-      "localconfig.js", and two documentation files,
-      "quicksearch.html" and "quicksearchhack.html"
-    </P
+NAME="AEN2104">B.2.1.1. Bugzilla Database Tables</H3
 ><P
->      The index.html page has been updated to include the QuickSearch
-      text box.
-    </P
+>Imagine your MySQL database as a series of spreadsheets, and
+        you won't be too far off. If you use this command:</P
 ><P
->      To take full advantage of the query power, the Bugzilla
-      maintainer must edit "localconfig.js" according to the value
-      sets used in the local installation.
-    </P
+>&#13;          <TT
+CLASS="prompt"
+>mysql&#62;</TT
+>
+          <B
+CLASS="command"
+>show tables from bugs;</B
+>
+        </P
 ><P
->      Currently, keywords must be hard-coded in localconfig.js.  If
-      they are not, keywords are not automatically recognized.  This
-      means, if localconfig.js is left unconfigured, that searching
-      for a bug with the "foo" keyword will only find bugs with "foo"
-      in the summary, status whiteboard, product or component name,
-      but not those with the keyword "foo".
-    </P
+>you'll be able to see the names of all the 
+        <SPAN
+CLASS="QUOTE"
+>"spreadsheets"</SPAN
+>
+        (tables) in your database.</P
 ><P
->      Workarounds for Bugzilla users:
-      <P
-></P
-><TABLE
+>From the command issued above, ou should have some
+	  output that looks like this:
+<TABLE
 BORDER="0"
-><TBODY
-><TR
-><TD
->search for '!foo' (this will find only bugs with the
-	  keyword "foo"</TD
-></TR
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
 ><TR
 ><TD
->search 'foo,!foo' (equivalent to 'foo OR
-	  keyword:foo')</TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+>&#13;+-------------------+
+| Tables in bugs    |
++-------------------+
+| attachments       |
+| bugs              |
+| bugs_activity     |
+| cc                |
+| components        |
+| dependencies      |
+| fielddefs         |
+| groups            |
+| keyworddefs       |
+| keywords          |
+| logincookies      |
+| longdescs         |
+| milestones        |
+| namedqueries      |
+| products          |
+| profiles          |
+| profiles_activity |
+| shadowlog         |
+| tokens            |
+| versions          |
+| votes             |
+| watch             |
++-------------------+
+</PRE
+></FONT
+></TD
 ></TR
-></TBODY
 ></TABLE
-><P
-></P
 >
-    </P
-><P
->      When this tool is ported from client-side JavaScript to
-      server-side Perl, the requirement for hard-coding keywords can
-      be fixed. <A
-HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=70907"
-TARGET="_top"
->This bug</A
-> has details.
-    </P
-></DIV
-><DIV
-CLASS="SECTION"
-><HR><H1
-CLASS="SECTION"
-><A
-NAME="BZHACKING"
->D.5. Hacking Bugzilla</A
-></H1
-><P
->      What follows are some general guidelines for changing Bugzilla, and adhering to good coding practice while doing so.  We've had some checkins in the past which ruined Bugzilla installations because of disregard for these conventions.  Sorry for the lack of formatting; I got this info into the Guide on the day of 2.14 release and haven't formatted it yet.
-    </P
+</P
 ><P
-CLASS="LITERALLAYOUT"
+CLASS="literallayout"
 ><br>
-The&nbsp;following&nbsp;is&nbsp;a&nbsp;guide&nbsp;for&nbsp;reviewers&nbsp;when&nbsp;checking&nbsp;code&nbsp;into&nbsp;Bugzilla's<br>
-CVS&nbsp;repostory&nbsp;at&nbsp;mozilla.org.&nbsp;&nbsp;If&nbsp;you&nbsp;wish&nbsp;to&nbsp;submit&nbsp;patches&nbsp;to&nbsp;Bugzilla,<br>
-you&nbsp;should&nbsp;follow&nbsp;the&nbsp;rules&nbsp;and&nbsp;style&nbsp;conventions&nbsp;below.&nbsp;&nbsp;Any&nbsp;code&nbsp;that<br>
-does&nbsp;not&nbsp;adhere&nbsp;to&nbsp;these&nbsp;basic&nbsp;rules&nbsp;will&nbsp;not&nbsp;be&nbsp;added&nbsp;to&nbsp;Bugzilla's<br>
-codebase.<br>
+&nbsp;&nbsp;Here's&nbsp;an&nbsp;overview&nbsp;of&nbsp;what&nbsp;each&nbsp;table&nbsp;does.&nbsp;&nbsp;Most&nbsp;columns&nbsp;in&nbsp;each&nbsp;table&nbsp;have<br>
+descriptive&nbsp;names&nbsp;that&nbsp;make&nbsp;it&nbsp;fairly&nbsp;trivial&nbsp;to&nbsp;figure&nbsp;out&nbsp;their&nbsp;jobs.<br>
+<br>
+attachments:&nbsp;This&nbsp;table&nbsp;stores&nbsp;all&nbsp;attachments&nbsp;to&nbsp;bugs.&nbsp;&nbsp;It&nbsp;tends&nbsp;to&nbsp;be&nbsp;your<br>
+largest&nbsp;table,&nbsp;yet&nbsp;also&nbsp;generally&nbsp;has&nbsp;the&nbsp;fewest&nbsp;entries&nbsp;because&nbsp;file<br>
+attachments&nbsp;are&nbsp;so&nbsp;(relatively)&nbsp;large.<br>
+<br>
+bugs:&nbsp;&nbsp;This&nbsp;is&nbsp;the&nbsp;core&nbsp;of&nbsp;your&nbsp;system.&nbsp;&nbsp;The&nbsp;bugs&nbsp;table&nbsp;stores&nbsp;most&nbsp;of&nbsp;the<br>
+current&nbsp;information&nbsp;about&nbsp;a&nbsp;bug,&nbsp;with&nbsp;the&nbsp;exception&nbsp;of&nbsp;the&nbsp;info&nbsp;stored&nbsp;in&nbsp;the<br>
+other&nbsp;tables.<br>
+<br>
+bugs_activity:&nbsp;&nbsp;This&nbsp;stores&nbsp;information&nbsp;regarding&nbsp;what&nbsp;changes&nbsp;are&nbsp;made&nbsp;to&nbsp;bugs<br>
+when&nbsp;--&nbsp;a&nbsp;history&nbsp;file.<br>
+<br>
+cc:&nbsp;&nbsp;This&nbsp;tiny&nbsp;table&nbsp;simply&nbsp;stores&nbsp;all&nbsp;the&nbsp;CC&nbsp;information&nbsp;for&nbsp;any&nbsp;bug&nbsp;which&nbsp;has<br>
+any&nbsp;entries&nbsp;in&nbsp;the&nbsp;CC&nbsp;field&nbsp;of&nbsp;the&nbsp;bug.&nbsp;&nbsp;Note&nbsp;that,&nbsp;like&nbsp;most&nbsp;other&nbsp;tables&nbsp;in<br>
+Bugzilla,&nbsp;it&nbsp;does&nbsp;not&nbsp;refer&nbsp;to&nbsp;users&nbsp;by&nbsp;their&nbsp;user&nbsp;names,&nbsp;but&nbsp;by&nbsp;their&nbsp;unique<br>
+userid,&nbsp;stored&nbsp;as&nbsp;a&nbsp;primary&nbsp;key&nbsp;in&nbsp;the&nbsp;profiles&nbsp;table.<br>
+<br>
+components:&nbsp;This&nbsp;stores&nbsp;the&nbsp;programs&nbsp;and&nbsp;components&nbsp;(or&nbsp;products&nbsp;and<br>
+components,&nbsp;in&nbsp;newer&nbsp;Bugzilla&nbsp;parlance)&nbsp;for&nbsp;Bugzilla.&nbsp;&nbsp;Curiously,&nbsp;the&nbsp;"program"<br>
+(product)&nbsp;field&nbsp;is&nbsp;the&nbsp;full&nbsp;name&nbsp;of&nbsp;the&nbsp;product,&nbsp;rather&nbsp;than&nbsp;some&nbsp;other&nbsp;unique<br>
+identifier,&nbsp;like&nbsp;bug_id&nbsp;and&nbsp;user_id&nbsp;are&nbsp;elsewhere&nbsp;in&nbsp;the&nbsp;database.<br>
+<br>
+dependencies:&nbsp;Stores&nbsp;data&nbsp;about&nbsp;those&nbsp;cool&nbsp;dependency&nbsp;trees.<br>
+<br>
+fielddefs:&nbsp;&nbsp;A&nbsp;nifty&nbsp;table&nbsp;that&nbsp;defines&nbsp;other&nbsp;tables.&nbsp;&nbsp;For&nbsp;instance,&nbsp;when&nbsp;you<br>
+submit&nbsp;a&nbsp;form&nbsp;that&nbsp;changes&nbsp;the&nbsp;value&nbsp;of&nbsp;"AssignedTo"&nbsp;this&nbsp;table&nbsp;allows<br>
+translation&nbsp;to&nbsp;the&nbsp;actual&nbsp;field&nbsp;name&nbsp;"assigned_to"&nbsp;for&nbsp;entry&nbsp;into&nbsp;MySQL.<br>
+<br>
+groups:&nbsp;&nbsp;defines&nbsp;bitmasks&nbsp;for&nbsp;groups.&nbsp;&nbsp;A&nbsp;bitmask&nbsp;is&nbsp;a&nbsp;number&nbsp;that&nbsp;can&nbsp;uniquely<br>
+identify&nbsp;group&nbsp;memberships.&nbsp;&nbsp;For&nbsp;instance,&nbsp;say&nbsp;the&nbsp;group&nbsp;that&nbsp;is&nbsp;allowed&nbsp;to<br>
+tweak&nbsp;parameters&nbsp;is&nbsp;assigned&nbsp;a&nbsp;value&nbsp;of&nbsp;"1",&nbsp;the&nbsp;group&nbsp;that&nbsp;is&nbsp;allowed&nbsp;to&nbsp;edit<br>
+users&nbsp;is&nbsp;assigned&nbsp;a&nbsp;"2",&nbsp;and&nbsp;the&nbsp;group&nbsp;that&nbsp;is&nbsp;allowed&nbsp;to&nbsp;create&nbsp;new&nbsp;groups&nbsp;is<br>
+assigned&nbsp;the&nbsp;bitmask&nbsp;of&nbsp;"4".&nbsp;&nbsp;By&nbsp;uniquely&nbsp;combining&nbsp;the&nbsp;group&nbsp;bitmasks&nbsp;(much<br>
+like&nbsp;the&nbsp;chmod&nbsp;command&nbsp;in&nbsp;UNIX,)&nbsp;you&nbsp;can&nbsp;identify&nbsp;a&nbsp;user&nbsp;is&nbsp;allowed&nbsp;to&nbsp;tweak<br>
+parameters&nbsp;and&nbsp;create&nbsp;groups,&nbsp;but&nbsp;not&nbsp;edit&nbsp;users,&nbsp;by&nbsp;giving&nbsp;him&nbsp;a&nbsp;bitmask&nbsp;of<br>
+"5",&nbsp;or&nbsp;a&nbsp;user&nbsp;allowed&nbsp;to&nbsp;edit&nbsp;users&nbsp;and&nbsp;create&nbsp;groups,&nbsp;but&nbsp;not&nbsp;tweak<br>
+parameters,&nbsp;by&nbsp;giving&nbsp;him&nbsp;a&nbsp;bitmask&nbsp;of&nbsp;"6"&nbsp;Simple,&nbsp;huh?<br>
+&nbsp;&nbsp;If&nbsp;this&nbsp;makes&nbsp;no&nbsp;sense&nbsp;to&nbsp;you,&nbsp;try&nbsp;this&nbsp;at&nbsp;the&nbsp;mysql&nbsp;prompt:<br>
+mysql&#62;&nbsp;select&nbsp;*&nbsp;from&nbsp;groups;<br>
+&nbsp;&nbsp;You'll&nbsp;see&nbsp;the&nbsp;list,&nbsp;it&nbsp;makes&nbsp;much&nbsp;more&nbsp;sense&nbsp;that&nbsp;way.<br>
+<br>
+keyworddefs:&nbsp;&nbsp;Definitions&nbsp;of&nbsp;keywords&nbsp;to&nbsp;be&nbsp;used<br>
+<br>
+keywords:&nbsp;Unlike&nbsp;what&nbsp;you'd&nbsp;think,&nbsp;this&nbsp;table&nbsp;holds&nbsp;which&nbsp;keywords&nbsp;are<br>
+associated&nbsp;with&nbsp;which&nbsp;bug&nbsp;id's.<br>
+<br>
+logincookies:&nbsp;This&nbsp;stores&nbsp;every&nbsp;login&nbsp;cookie&nbsp;ever&nbsp;assigned&nbsp;to&nbsp;you&nbsp;for&nbsp;every<br>
+machine&nbsp;you've&nbsp;ever&nbsp;logged&nbsp;into&nbsp;Bugzilla&nbsp;from.&nbsp;&nbsp;Curiously,&nbsp;it&nbsp;never&nbsp;does&nbsp;any<br>
+housecleaning&nbsp;--&nbsp;I&nbsp;see&nbsp;cookies&nbsp;in&nbsp;this&nbsp;file&nbsp;I've&nbsp;not&nbsp;used&nbsp;for&nbsp;months.&nbsp;&nbsp;However,<br>
+since&nbsp;Bugzilla&nbsp;never&nbsp;expires&nbsp;your&nbsp;cookie&nbsp;(for&nbsp;convenience'&nbsp;sake),&nbsp;it&nbsp;makes<br>
+sense.<br>
+<br>
+longdescs:&nbsp;&nbsp;The&nbsp;meat&nbsp;of&nbsp;bugzilla&nbsp;--&nbsp;here&nbsp;is&nbsp;where&nbsp;all&nbsp;user&nbsp;comments&nbsp;are&nbsp;stored!<br>
+You've&nbsp;only&nbsp;got&nbsp;2^24&nbsp;bytes&nbsp;per&nbsp;comment&nbsp;(it's&nbsp;a&nbsp;mediumtext&nbsp;field),&nbsp;so&nbsp;speak<br>
+sparingly&nbsp;--&nbsp;that's&nbsp;only&nbsp;the&nbsp;amount&nbsp;of&nbsp;space&nbsp;the&nbsp;Old&nbsp;Testament&nbsp;from&nbsp;the&nbsp;Bible<br>
+would&nbsp;take&nbsp;(uncompressed,&nbsp;16&nbsp;megabytes).&nbsp;&nbsp;Each&nbsp;comment&nbsp;is&nbsp;keyed&nbsp;to&nbsp;the<br>
+bug_id&nbsp;to&nbsp;which&nbsp;it's&nbsp;attached,&nbsp;so&nbsp;the&nbsp;order&nbsp;is&nbsp;necessarily&nbsp;chronological,&nbsp;for<br>
+comments&nbsp;are&nbsp;played&nbsp;back&nbsp;in&nbsp;the&nbsp;order&nbsp;in&nbsp;which&nbsp;they&nbsp;are&nbsp;received.<br>
+<br>
+milestones:&nbsp;&nbsp;Interesting&nbsp;that&nbsp;milestones&nbsp;are&nbsp;associated&nbsp;with&nbsp;a&nbsp;specific&nbsp;product<br>
+in&nbsp;this&nbsp;table,&nbsp;but&nbsp;Bugzilla&nbsp;does&nbsp;not&nbsp;yet&nbsp;support&nbsp;differing&nbsp;milestones&nbsp;by<br>
+product&nbsp;through&nbsp;the&nbsp;standard&nbsp;configuration&nbsp;interfaces.<br>
+<br>
+namedqueries:&nbsp;&nbsp;This&nbsp;is&nbsp;where&nbsp;everybody&nbsp;stores&nbsp;their&nbsp;"custom&nbsp;queries".&nbsp;&nbsp;Very<br>
+cool&nbsp;feature;&nbsp;it&nbsp;beats&nbsp;the&nbsp;tar&nbsp;out&nbsp;of&nbsp;having&nbsp;to&nbsp;bookmark&nbsp;each&nbsp;cool&nbsp;query&nbsp;you<br>
+construct.<br>
+<br>
+products:&nbsp;&nbsp;What&nbsp;products&nbsp;you&nbsp;have,&nbsp;whether&nbsp;new&nbsp;bug&nbsp;entries&nbsp;are&nbsp;allowed&nbsp;for&nbsp;the<br>
+product,&nbsp;what&nbsp;milestone&nbsp;you're&nbsp;working&nbsp;toward&nbsp;on&nbsp;that&nbsp;product,&nbsp;votes,&nbsp;etc.&nbsp;&nbsp;It<br>
+will&nbsp;be&nbsp;nice&nbsp;when&nbsp;the&nbsp;components&nbsp;table&nbsp;supports&nbsp;these&nbsp;same&nbsp;features,&nbsp;so&nbsp;you<br>
+could&nbsp;close&nbsp;a&nbsp;particular&nbsp;component&nbsp;for&nbsp;bug&nbsp;entry&nbsp;without&nbsp;having&nbsp;to&nbsp;close&nbsp;an<br>
+entire&nbsp;product...<br>
+<br>
+profiles:&nbsp;&nbsp;Ahh,&nbsp;so&nbsp;you&nbsp;were&nbsp;wondering&nbsp;where&nbsp;your&nbsp;precious&nbsp;user&nbsp;information&nbsp;was<br>
+stored?&nbsp;&nbsp;Here&nbsp;it&nbsp;is!&nbsp;&nbsp;With&nbsp;the&nbsp;passwords&nbsp;in&nbsp;plain&nbsp;text&nbsp;for&nbsp;all&nbsp;to&nbsp;see!&nbsp;(but<br>
+sshh...&nbsp;don't&nbsp;tell&nbsp;your&nbsp;users!)<br>
+<br>
+profiles_activity:&nbsp;&nbsp;Need&nbsp;to&nbsp;know&nbsp;who&nbsp;did&nbsp;what&nbsp;when&nbsp;to&nbsp;who's&nbsp;profile?&nbsp;&nbsp;This'll<br>
+tell&nbsp;you,&nbsp;it's&nbsp;a&nbsp;pretty&nbsp;complete&nbsp;history.<br>
 <br>
-&nbsp;1.&nbsp;Usage&nbsp;of&nbsp;variables&nbsp;in&nbsp;Regular&nbsp;Expressions<br>
+shadowlog:&nbsp;&nbsp;I&nbsp;could&nbsp;be&nbsp;mistaken&nbsp;here,&nbsp;but&nbsp;I&nbsp;believe&nbsp;this&nbsp;table&nbsp;tells&nbsp;you&nbsp;when<br>
+your&nbsp;shadow&nbsp;database&nbsp;is&nbsp;updated&nbsp;and&nbsp;what&nbsp;commands&nbsp;were&nbsp;used&nbsp;to&nbsp;update&nbsp;it.&nbsp;&nbsp;We<br>
+don't&nbsp;use&nbsp;a&nbsp;shadow&nbsp;database&nbsp;at&nbsp;our&nbsp;site&nbsp;yet,&nbsp;so&nbsp;it's&nbsp;pretty&nbsp;empty&nbsp;for&nbsp;us.<br>
 <br>
-&nbsp;&nbsp;&nbsp;&nbsp;It&nbsp;is&nbsp;very&nbsp;important&nbsp;that&nbsp;you&nbsp;don't&nbsp;use&nbsp;a&nbsp;variable&nbsp;in&nbsp;a&nbsp;regular<br>
-&nbsp;&nbsp;&nbsp;&nbsp;expression&nbsp;unless&nbsp;that&nbsp;variable&nbsp;is&nbsp;supposed&nbsp;to&nbsp;contain&nbsp;an&nbsp;expression.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;especially&nbsp;applies&nbsp;when&nbsp;using&nbsp;grep.&nbsp;&nbsp;You&nbsp;should&nbsp;use:<br>
+versions:&nbsp;&nbsp;Version&nbsp;information&nbsp;for&nbsp;every&nbsp;product<br>
 <br>
-&nbsp;&nbsp;&nbsp;&nbsp;grep&nbsp;($_&nbsp;eq&nbsp;$value,&nbsp;@array);<br>
+votes:&nbsp;&nbsp;Who&nbsp;voted&nbsp;for&nbsp;what&nbsp;when<br>
 <br>
-&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;NOT&nbsp;-<br>
+watch:&nbsp;&nbsp;Who&nbsp;(according&nbsp;to&nbsp;userid)&nbsp;is&nbsp;watching&nbsp;who's&nbsp;bugs&nbsp;(according&nbsp;to&nbsp;their<br>
+userid).<br>
 <br>
-&nbsp;&nbsp;&nbsp;&nbsp;grep&nbsp;(/$value/,&nbsp;@array);<br>
 <br>
-&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;you&nbsp;need&nbsp;to&nbsp;use&nbsp;a&nbsp;non-expression&nbsp;variable&nbsp;inside&nbsp;of&nbsp;an&nbsp;expression,&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;&nbsp;sure&nbsp;to&nbsp;quote&nbsp;it&nbsp;properly&nbsp;(using&nbsp;\Q..\E).<br>
+===<br>
+THE&nbsp;DETAILS<br>
+===<br>
 <br>
-Coding&nbsp;Style&nbsp;for&nbsp;Bugzilla<br>
--------------------------<br>
+&nbsp;&nbsp;Ahh,&nbsp;so&nbsp;you're&nbsp;wondering&nbsp;just&nbsp;what&nbsp;to&nbsp;do&nbsp;with&nbsp;the&nbsp;information&nbsp;above?&nbsp;&nbsp;At&nbsp;the<br>
+mysql&nbsp;prompt,&nbsp;you&nbsp;can&nbsp;view&nbsp;any&nbsp;information&nbsp;about&nbsp;the&nbsp;columns&nbsp;in&nbsp;a&nbsp;table&nbsp;with<br>
+this&nbsp;command&nbsp;(where&nbsp;"table"&nbsp;is&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;table&nbsp;you&nbsp;wish&nbsp;to&nbsp;view):<br>
 <br>
-While&nbsp;it's&nbsp;true&nbsp;that&nbsp;not&nbsp;all&nbsp;of&nbsp;the&nbsp;code&nbsp;currently&nbsp;in&nbsp;Bugzilla&nbsp;adheres&nbsp;to<br>
-this&nbsp;styleguide,&nbsp;it&nbsp;is&nbsp;something&nbsp;that&nbsp;is&nbsp;being&nbsp;worked&nbsp;toward.&nbsp;&nbsp;Therefore,<br>
-we&nbsp;ask&nbsp;that&nbsp;all&nbsp;new&nbsp;code&nbsp;(submitted&nbsp;patches&nbsp;and&nbsp;new&nbsp;files)&nbsp;follow&nbsp;this&nbsp;guide<br>
-as&nbsp;closely&nbsp;as&nbsp;possible&nbsp;(if&nbsp;you're&nbsp;only&nbsp;changing&nbsp;1&nbsp;or&nbsp;2&nbsp;lines,&nbsp;you&nbsp;don't&nbsp;have<br>
-to&nbsp;reformat&nbsp;the&nbsp;entire&nbsp;file&nbsp;:).<br>
+mysql&#62;&nbsp;show&nbsp;columns&nbsp;from&nbsp;table;<br>
 <br>
-&nbsp;1.&nbsp;Whitespace<br>
+&nbsp;&nbsp;You&nbsp;can&nbsp;also&nbsp;view&nbsp;all&nbsp;the&nbsp;data&nbsp;in&nbsp;a&nbsp;table&nbsp;with&nbsp;this&nbsp;command:<br>
 <br>
-&nbsp;&nbsp;&nbsp;&nbsp;Bugzilla's&nbsp;prefered&nbsp;indentation&nbsp;is&nbsp;4&nbsp;spaces&nbsp;(no&nbsp;tabs,&nbsp;please).<br>
+mysql&#62;&nbsp;select&nbsp;*&nbsp;from&nbsp;table;<br>
 <br>
-&nbsp;2.&nbsp;Curly&nbsp;braces.<br>
+&nbsp;&nbsp;--&nbsp;note:&nbsp;this&nbsp;is&nbsp;a&nbsp;very&nbsp;bad&nbsp;idea&nbsp;to&nbsp;do&nbsp;on,&nbsp;for&nbsp;instance,&nbsp;the&nbsp;"bugs"&nbsp;table&nbsp;if<br>
+you&nbsp;have&nbsp;50,000&nbsp;bugs.&nbsp;&nbsp;You'll&nbsp;be&nbsp;sitting&nbsp;there&nbsp;a&nbsp;while&nbsp;until&nbsp;you&nbsp;ctrl-c&nbsp;or<br>
+50,000&nbsp;bugs&nbsp;play&nbsp;across&nbsp;your&nbsp;screen.<br>
 <br>
-&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;opening&nbsp;brace&nbsp;of&nbsp;a&nbsp;block&nbsp;should&nbsp;be&nbsp;on&nbsp;the&nbsp;same&nbsp;line&nbsp;as&nbsp;the&nbsp;statement<br>
-&nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;is&nbsp;causing&nbsp;the&nbsp;block&nbsp;and&nbsp;the&nbsp;closing&nbsp;brace&nbsp;should&nbsp;be&nbsp;at&nbsp;the&nbsp;same<br>
-&nbsp;&nbsp;&nbsp;&nbsp;indentation&nbsp;level&nbsp;as&nbsp;that&nbsp;statement,&nbsp;for&nbsp;example:<br>
+&nbsp;&nbsp;You&nbsp;can&nbsp;limit&nbsp;the&nbsp;display&nbsp;from&nbsp;above&nbsp;a&nbsp;little&nbsp;with&nbsp;the&nbsp;command,&nbsp;where<br>
+"column"&nbsp;is&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;column&nbsp;for&nbsp;which&nbsp;you&nbsp;wish&nbsp;to&nbsp;restrict&nbsp;information:<br>
 <br>
-&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($var)&nbsp;{<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"The&nbsp;variable&nbsp;is&nbsp;true";<br>
-&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"Try&nbsp;again";<br>
-&nbsp;&nbsp;&nbsp;&nbsp;}<br>
+mysql&#62;&nbsp;select&nbsp;*&nbsp;from&nbsp;table&nbsp;where&nbsp;(column&nbsp;=&nbsp;"some&nbsp;info");<br>
 <br>
-&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;NOT&nbsp;-<br>
+&nbsp;&nbsp;--&nbsp;or&nbsp;the&nbsp;reverse&nbsp;of&nbsp;this<br>
 <br>
-&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($var)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;{<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"The&nbsp;variable&nbsp;is&nbsp;true";<br>
-&nbsp;&nbsp;&nbsp;&nbsp;}<br>
-&nbsp;&nbsp;&nbsp;&nbsp;else<br>
-&nbsp;&nbsp;&nbsp;&nbsp;{<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"Try&nbsp;again";<br>
-&nbsp;&nbsp;&nbsp;&nbsp;}<br>
+mysql&#62;&nbsp;select&nbsp;*&nbsp;from&nbsp;table&nbsp;where&nbsp;(column&nbsp;!=&nbsp;"some&nbsp;info");<br>
 <br>
-&nbsp;3.&nbsp;File&nbsp;Names<br>
+&nbsp;&nbsp;Let's&nbsp;take&nbsp;our&nbsp;example&nbsp;from&nbsp;the&nbsp;introduction,&nbsp;and&nbsp;assume&nbsp;you&nbsp;need&nbsp;to&nbsp;change<br>
+the&nbsp;word&nbsp;"verified"&nbsp;to&nbsp;"approved"&nbsp;in&nbsp;the&nbsp;resolution&nbsp;field.&nbsp;&nbsp;We&nbsp;know&nbsp;from&nbsp;the<br>
+above&nbsp;information&nbsp;that&nbsp;the&nbsp;resolution&nbsp;is&nbsp;likely&nbsp;to&nbsp;be&nbsp;stored&nbsp;in&nbsp;the&nbsp;"bugs"<br>
+table.&nbsp;Note&nbsp;we'll&nbsp;need&nbsp;to&nbsp;change&nbsp;a&nbsp;little&nbsp;perl&nbsp;code&nbsp;as&nbsp;well&nbsp;as&nbsp;this&nbsp;database<br>
+change,&nbsp;but&nbsp;I&nbsp;won't&nbsp;plunge&nbsp;into&nbsp;that&nbsp;in&nbsp;this&nbsp;document.&nbsp;Let's&nbsp;verify&nbsp;the<br>
+information&nbsp;is&nbsp;stored&nbsp;in&nbsp;the&nbsp;"bugs"&nbsp;table:<br>
 <br>
-&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;names&nbsp;for&nbsp;bugzilla&nbsp;code&nbsp;and&nbsp;support&nbsp;documention&nbsp;should&nbsp;be&nbsp;legal&nbsp;across<br>
-&nbsp;&nbsp;&nbsp;&nbsp;multiple&nbsp;platforms.&nbsp;&nbsp;\&nbsp;/&nbsp;:&nbsp;*&nbsp;?&nbsp;"&nbsp;&#60;&nbsp;&#62;&nbsp;and&nbsp;|&nbsp;are&nbsp;all&nbsp;illegal&nbsp;characters&nbsp;for<br>
-&nbsp;&nbsp;&nbsp;&nbsp;filenames&nbsp;on&nbsp;various&nbsp;platforms.&nbsp;&nbsp;Also,&nbsp;file&nbsp;names&nbsp;should&nbsp;not&nbsp;have&nbsp;spaces&nbsp;in<br>
-&nbsp;&nbsp;&nbsp;&nbsp;them&nbsp;as&nbsp;they&nbsp;can&nbsp;cause&nbsp;confusion&nbsp;in&nbsp;CVS&nbsp;and&nbsp;other&nbsp;mozilla.org&nbsp;utilities.<br>
+mysql&#62;&nbsp;show&nbsp;columns&nbsp;from&nbsp;bugs<br>
 <br>
-&nbsp;4.&nbsp;Variable&nbsp;Names<br>
+&nbsp;&nbsp;(exceedingly&nbsp;long&nbsp;output&nbsp;truncated&nbsp;here)<br>
+|&nbsp;bug_status|&nbsp;enum('UNCONFIRMED','NEW','ASSIGNED','REOPENED','RESOLVED','VERIFIED','CLOSED')||MUL&nbsp;|&nbsp;UNCONFIRMED||<br>
 <br>
-&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;a&nbsp;variable&nbsp;is&nbsp;scoped&nbsp;globally&nbsp;($::variable)&nbsp;its&nbsp;name&nbsp;should&nbsp;be&nbsp;descriptive<br>
-&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;what&nbsp;it&nbsp;contains.&nbsp;&nbsp;Local&nbsp;variables&nbsp;can&nbsp;be&nbsp;named&nbsp;a&nbsp;bit&nbsp;looser,&nbsp;provided&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;&nbsp;context&nbsp;makes&nbsp;their&nbsp;content&nbsp;obvious.&nbsp;&nbsp;For&nbsp;example,&nbsp;$ret&nbsp;could&nbsp;be&nbsp;used&nbsp;as&nbsp;a<br>
-&nbsp;&nbsp;&nbsp;&nbsp;staging&nbsp;variable&nbsp;for&nbsp;a&nbsp;routine's&nbsp;return&nbsp;value&nbsp;as&nbsp;the&nbsp;line&nbsp;|return&nbsp;$ret;|&nbsp;will<br>
-&nbsp;&nbsp;&nbsp;&nbsp;make&nbsp;it&nbsp;blatently&nbsp;obvious&nbsp;what&nbsp;the&nbsp;variable&nbsp;holds&nbsp;and&nbsp;most&nbsp;likely&nbsp;be&nbsp;shown<br>
-&nbsp;&nbsp;&nbsp;&nbsp;on&nbsp;the&nbsp;same&nbsp;screen&nbsp;as&nbsp;|my&nbsp;$ret&nbsp;=&nbsp;"";|.<br>
+&nbsp;&nbsp;Sorry&nbsp;about&nbsp;that&nbsp;long&nbsp;line.&nbsp;&nbsp;We&nbsp;see&nbsp;from&nbsp;this&nbsp;that&nbsp;the&nbsp;"bug&nbsp;status"&nbsp;column&nbsp;is<br>
+an&nbsp;"enum&nbsp;field",&nbsp;which&nbsp;is&nbsp;a&nbsp;MySQL&nbsp;peculiarity&nbsp;where&nbsp;a&nbsp;string&nbsp;type&nbsp;field&nbsp;can<br>
+only&nbsp;have&nbsp;certain&nbsp;types&nbsp;of&nbsp;entries.&nbsp;&nbsp;While&nbsp;I&nbsp;think&nbsp;this&nbsp;is&nbsp;very&nbsp;cool,&nbsp;it's&nbsp;not<br>
+standard&nbsp;SQL.&nbsp;&nbsp;Anyway,&nbsp;we&nbsp;need&nbsp;to&nbsp;add&nbsp;the&nbsp;possible&nbsp;enum&nbsp;field&nbsp;entry<br>
+'APPROVED'&nbsp;by&nbsp;altering&nbsp;the&nbsp;"bugs"&nbsp;table.<br>
 <br>
-&nbsp;5.&nbsp;Cross&nbsp;Database&nbsp;Compatability<br>
+mysql&#62;&nbsp;ALTER&nbsp;table&nbsp;bugs&nbsp;CHANGE&nbsp;bug_status&nbsp;bug_status<br>
+&nbsp;&nbsp;&nbsp;&nbsp;-&#62;&nbsp;enum("UNCONFIRMED",&nbsp;"NEW",&nbsp;"ASSIGNED",&nbsp;"REOPENED",&nbsp;"RESOLVED",<br>
+&nbsp;&nbsp;&nbsp;&nbsp;-&#62;&nbsp;"VERIFIED",&nbsp;"APPROVED",&nbsp;"CLOSED")&nbsp;not&nbsp;null;<br>
 <br>
-&nbsp;&nbsp;&nbsp;&nbsp;Bugzilla&nbsp;was&nbsp;originally&nbsp;written&nbsp;to&nbsp;work&nbsp;with&nbsp;MySQL&nbsp;and&nbsp;therefore&nbsp;took&nbsp;advantage<br>
-&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;some&nbsp;of&nbsp;its&nbsp;features&nbsp;that&nbsp;aren't&nbsp;contained&nbsp;in&nbsp;other&nbsp;RDBMS&nbsp;software.&nbsp;&nbsp;These<br>
-&nbsp;&nbsp;&nbsp;&nbsp;should&nbsp;be&nbsp;avoided&nbsp;in&nbsp;all&nbsp;new&nbsp;code.&nbsp;&nbsp;Examples&nbsp;of&nbsp;these&nbsp;features&nbsp;are&nbsp;enums&nbsp;and<br>
-&nbsp;&nbsp;&nbsp;&nbsp;encrypt().<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(note&nbsp;we&nbsp;can&nbsp;take&nbsp;three&nbsp;lines&nbsp;or&nbsp;more&nbsp;--&nbsp;whatever&nbsp;you&nbsp;put&nbsp;in&nbsp;before&nbsp;the<br>
+semicolon&nbsp;is&nbsp;evaluated&nbsp;as&nbsp;a&nbsp;single&nbsp;expression)<br>
 <br>
-&nbsp;6.&nbsp;Cross&nbsp;Platform&nbsp;Compatability<br>
+Now&nbsp;if&nbsp;you&nbsp;do&nbsp;this:<br>
 <br>
-&nbsp;&nbsp;&nbsp;&nbsp;While&nbsp;Bugzilla&nbsp;was&nbsp;written&nbsp;to&nbsp;be&nbsp;used&nbsp;on&nbsp;Unix&nbsp;based&nbsp;systems&nbsp;(and&nbsp;Unix/Linux&nbsp;is<br>
-&nbsp;&nbsp;&nbsp;&nbsp;still&nbsp;the&nbsp;only&nbsp;officially&nbsp;supported&nbsp;platform)&nbsp;there&nbsp;are&nbsp;many&nbsp;who&nbsp;desire/need&nbsp;to<br>
-&nbsp;&nbsp;&nbsp;&nbsp;run&nbsp;Bugzilla&nbsp;on&nbsp;Microsoft&nbsp;Windows&nbsp;boxes.&nbsp;&nbsp;Whenever&nbsp;possible,&nbsp;we&nbsp;should&nbsp;strive<br>
-&nbsp;&nbsp;&nbsp;&nbsp;not&nbsp;to&nbsp;make&nbsp;the&nbsp;lives&nbsp;of&nbsp;these&nbsp;people&nbsp;any&nbsp;more&nbsp;complicated&nbsp;and&nbsp;avoid&nbsp;doing&nbsp;things<br>
-&nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;break&nbsp;Bugzilla's&nbsp;ability&nbsp;to&nbsp;run&nbsp;on&nbsp;multiple&nbsp;operating&nbsp;systems.<br>
+mysql&#62;&nbsp;show&nbsp;columns&nbsp;from&nbsp;bugs;<br>
 <br>
-&nbsp;&nbsp;&nbsp;&nbsp;</P
+&nbsp;&nbsp;you'll&nbsp;see&nbsp;that&nbsp;the&nbsp;bug_status&nbsp;field&nbsp;has&nbsp;an&nbsp;extra&nbsp;"APPROVED"&nbsp;enum&nbsp;that's<br>
+available!&nbsp;&nbsp;Cool&nbsp;thing,&nbsp;too,&nbsp;is&nbsp;that&nbsp;this&nbsp;is&nbsp;reflected&nbsp;on&nbsp;your&nbsp;query&nbsp;page&nbsp;as<br>
+well&nbsp;--&nbsp;you&nbsp;can&nbsp;query&nbsp;by&nbsp;the&nbsp;new&nbsp;status.&nbsp;&nbsp;But&nbsp;how's&nbsp;it&nbsp;fit&nbsp;into&nbsp;the&nbsp;existing<br>
+scheme&nbsp;of&nbsp;things?<br>
+&nbsp;&nbsp;Looks&nbsp;like&nbsp;you&nbsp;need&nbsp;to&nbsp;go&nbsp;back&nbsp;and&nbsp;look&nbsp;for&nbsp;instances&nbsp;of&nbsp;the&nbsp;word&nbsp;"verified"<br>
+in&nbsp;the&nbsp;perl&nbsp;code&nbsp;for&nbsp;Bugzilla&nbsp;--&nbsp;wherever&nbsp;you&nbsp;find&nbsp;"verified",&nbsp;change&nbsp;it&nbsp;to<br>
+"approved"&nbsp;and&nbsp;you're&nbsp;in&nbsp;business&nbsp;(make&nbsp;sure&nbsp;that's&nbsp;a&nbsp;case-insensitive&nbsp;search).<br>
+Although&nbsp;you&nbsp;can&nbsp;query&nbsp;by&nbsp;the&nbsp;enum&nbsp;field,&nbsp;you&nbsp;can't&nbsp;give&nbsp;something&nbsp;a&nbsp;status<br>
+of&nbsp;"APPROVED"&nbsp;until&nbsp;you&nbsp;make&nbsp;the&nbsp;perl&nbsp;changes.&nbsp;&nbsp;&nbsp;Note&nbsp;that&nbsp;this&nbsp;change&nbsp;I<br>
+mentioned&nbsp;can&nbsp;also&nbsp;be&nbsp;done&nbsp;by&nbsp;editing&nbsp;checksetup.pl,&nbsp;which&nbsp;automates&nbsp;a&nbsp;lot&nbsp;of<br>
+this.&nbsp;&nbsp;But&nbsp;you&nbsp;need&nbsp;to&nbsp;know&nbsp;this&nbsp;stuff&nbsp;anyway,&nbsp;right?<br>
+	</P
 ></DIV
 ></DIV
-><DIV
-CLASS="APPENDIX"
-><HR><H1
-><A
-NAME="GFDL"
->Appendix E. GNU Free Documentation License</A
-></H1
-><P
->Version 1.1, March 2000</P
-><A
-NAME="AEN2499"
-></A
-><BLOCKQUOTE
-CLASS="BLOCKQUOTE"
-><P
->Copyright (C) 2000  Free Software Foundation, Inc.
-59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.</P
-></BLOCKQUOTE
-><DIV
-CLASS="SECT1"
-><HR><H1
-CLASS="SECT1"
-><A
-NAME="GFDL_0"
->0. PREAMBLE</A
-></H1
-><P
->The purpose of this License is to make a manual, textbook,
-    or other written document "free" in the sense of freedom: to
-    assure everyone the effective freedom to copy and redistribute it,
-    with or without modifying it, either commercially or
-    noncommercially.  Secondarily, this License preserves for the
-    author and publisher a way to get credit for their work, while not
-    being considered responsible for modifications made by
-    others.</P
-><P
->This License is a kind of "copyleft", which means that
-    derivative works of the document must themselves be free in the
-    same sense.  It complements the GNU General Public License, which
-    is a copyleft license designed for free software.</P
-><P
->We have designed this License in order to use it for manuals
-    for free software, because free software needs free documentation:
-    a free program should come with manuals providing the same
-    freedoms that the software does.  But this License is not limited
-    to software manuals; it can be used for any textual work,
-    regardless of subject matter or whether it is published as a
-    printed book.  We recommend this License principally for works
-    whose purpose is instruction or reference.</P
 ></DIV
-><DIV
-CLASS="SECT1"
-><HR><H1
-CLASS="SECT1"
-><A
-NAME="GFDL_1"
->1. APPLICABILITY AND DEFINITIONS</A
-></H1
-><P
->This License applies to any manual or other work that
-    contains a notice placed by the copyright holder saying it can be
-    distributed under the terms of this License.  The "Document",
-    below, refers to any such manual or work.  Any member of the
-    public is a licensee, and is addressed as "you".</P
-><P
->A "Modified Version" of the Document means any work
-    containing the Document or a portion of it, either copied
-    verbatim, or with modifications and/or translated into another
-    language.</P
-><P
->A "Secondary Section" is a named appendix or a front-matter
-    section of the Document that deals exclusively with the
-    relationship of the publishers or authors of the Document to the
-    Document's overall subject (or to related matters) and contains
-    nothing that could fall directly within that overall subject.
-    (For example, if the Document is in part a textbook of
-    mathematics, a Secondary Section may not explain any mathematics.)
-    The relationship could be a matter of historical connection with
-    the subject or with related matters, or of legal, commercial,
-    philosophical, ethical or political position regarding
-    them.</P
-><P
->The "Invariant Sections" are certain Secondary Sections
-    whose titles are designated, as being those of Invariant Sections,
-    in the notice that says that the Document is released under this
-    License.</P
-><P
->The "Cover Texts" are certain short passages of text that
-    are listed, as Front-Cover Texts or Back-Cover Texts, in the
-    notice that says that the Document is released under this
-    License.</P
-><P
->A "Transparent" copy of the Document means a
-    machine-readable copy, represented in a format whose specification
-    is available to the general public, whose contents can be viewed
-    and edited directly and straightforwardly with generic text
-    editors or (for images composed of pixels) generic paint programs
-    or (for drawings) some widely available drawing editor, and that
-    is suitable for input to text formatters or for automatic
-    translation to a variety of formats suitable for input to text
-    formatters.  A copy made in an otherwise Transparent file format
-    whose markup has been designed to thwart or discourage subsequent
-    modification by readers is not Transparent.  A copy that is not
-    "Transparent" is called "Opaque".</P
-><P
->Examples of suitable formats for Transparent copies include
-    plain ASCII without markup, Texinfo input format, LaTeX input
-    format, SGML or XML using a publicly available DTD, and
-    standard-conforming simple HTML designed for human modification.
-    Opaque formats include PostScript, PDF, proprietary formats that
-    can be read and edited only by proprietary word processors, SGML
-    or XML for which the DTD and/or processing tools are not generally
-    available, and the machine-generated HTML produced by some word
-    processors for output purposes only.</P
-><P
->The "Title Page" means, for a printed book, the title page
-    itself, plus such following pages as are needed to hold, legibly,
-    the material this License requires to appear in the title page.
-    For works in formats which do not have any title page as such,
-    "Title Page" means the text near the most prominent appearance of
-    the work's title, preceding the beginning of the body of the
-    text.</P
 ></DIV
 ><DIV
-CLASS="SECT1"
-><HR><H1
-CLASS="SECT1"
-><A
-NAME="GFDL_2"
->2. VERBATIM COPYING</A
-></H1
-><P
->You may copy and distribute the Document in any medium,
-    either commercially or noncommercially, provided that this
-    License, the copyright notices, and the license notice saying this
-    License applies to the Document are reproduced in all copies, and
-    that you add no other conditions whatsoever to those of this
-    License.  You may not use technical measures to obstruct or
-    control the reading or further copying of the copies you make or
-    distribute.  However, you may accept compensation in exchange for
-    copies.  If you distribute a large enough number of copies you
-    must also follow the conditions in section 3.</P
-><P
->You may also lend copies, under the same conditions stated
-    above, and you may publicly display copies.</P
-></DIV
-><DIV
-CLASS="SECT1"
-><HR><H1
-CLASS="SECT1"
-><A
-NAME="GFDL_3"
->3. COPYING IN QUANTITY</A
-></H1
-><P
->If you publish printed copies of the Document numbering more
-    than 100, and the Document's license notice requires Cover Texts,
-    you must enclose the copies in covers that carry, clearly and
-    legibly, all these Cover Texts: Front-Cover Texts on the front
-    cover, and Back-Cover Texts on the back cover.  Both covers must
-    also clearly and legibly identify you as the publisher of these
-    copies.  The front cover must present the full title with all
-    words of the title equally prominent and visible.  You may add
-    other material on the covers in addition.  Copying with changes
-    limited to the covers, as long as they preserve the title of the
-    Document and satisfy these conditions, can be treated as verbatim
-    copying in other respects.</P
-><P
->If the required texts for either cover are too voluminous to
-    fit legibly, you should put the first ones listed (as many as fit
-    reasonably) on the actual cover, and continue the rest onto
-    adjacent pages.</P
-><P
->If you publish or distribute Opaque copies of the Document
-    numbering more than 100, you must either include a
-    machine-readable Transparent copy along with each Opaque copy, or
-    state in or with each Opaque copy a publicly-accessible
-    computer-network location containing a complete Transparent copy
-    of the Document, free of added material, which the general
-    network-using public has access to download anonymously at no
-    charge using public-standard network protocols.  If you use the
-    latter option, you must take reasonably prudent steps, when you
-    begin distribution of Opaque copies in quantity, to ensure that
-    this Transparent copy will remain thus accessible at the stated
-    location until at least one year after the last time you
-    distribute an Opaque copy (directly or through your agents or
-    retailers) of that edition to the public.</P
-><P
->It is requested, but not required, that you contact the
-    authors of the Document well before redistributing any large
-    number of copies, to give them a chance to provide you with an
-    updated version of the Document.</P
-></DIV
-><DIV
-CLASS="SECT1"
-><HR><H1
-CLASS="SECT1"
-><A
-NAME="GFDL_4"
->4. MODIFICATIONS</A
-></H1
-><P
->You may copy and distribute a Modified Version of the
-    Document under the conditions of sections 2 and 3 above, provided
-    that you release the Modified Version under precisely this
-    License, with the Modified Version filling the role of the
-    Document, thus licensing distribution and modification of the
-    Modified Version to whoever possesses a copy of it.  In addition,
-    you must do these things in the Modified Version:</P
-><P
-></P
-><OL
-TYPE="A"
-><LI
-><P
->Use in the Title Page
-      (and on the covers, if any) a title distinct from that of the
-      Document, and from those of previous versions (which should, if
-      there were any, be listed in the History section of the
-      Document).  You may use the same title as a previous version if
-      the original publisher of that version gives permission.</P
-></LI
-><LI
-><P
->List on the Title Page,
-      as authors, one or more persons or entities responsible for
-      authorship of the modifications in the Modified Version,
-      together with at least five of the principal authors of the
-      Document (all of its principal authors, if it has less than
-      five).</P
-></LI
-><LI
-><P
->State on the Title page
-      the name of the publisher of the Modified Version, as the
-      publisher.</P
-></LI
-><LI
-><P
->Preserve all the
-      copyright notices of the Document.</P
-></LI
-><LI
+CLASS="appendix"
+><HR><H1
+><A
+NAME="patches">Appendix C. Useful Patches and Utilities for Bugzilla</H1
 ><P
->Add an appropriate
-      copyright notice for your modifications adjacent to the other
-      copyright notices.</P
-></LI
-><LI
+>Are you looking for a way to put your Bugzilla into overdrive? Catch
+  some of the niftiest tricks here in this section.</P
+><DIV
+CLASS="section"
+><HR><H1
+CLASS="section"
+><A
+NAME="rewrite">C.1. Apache 
+    <TT
+CLASS="filename"
+>mod_rewrite</TT
+>
+
+    magic</H1
 ><P
->Include, immediately
-      after the copyright notices, a license notice giving the public
-      permission to use the Modified Version under the terms of this
-      License, in the form shown in the Addendum below.</P
-></LI
-><LI
+>Apache's 
+    <TT
+CLASS="filename"
+>mod_rewrite</TT
+>
+
+    module lets you do some truly amazing things with URL rewriting. Here are
+    a couple of examples of what you can do.</P
 ><P
->Preserve in that license
-      notice the full lists of Invariant Sections and required Cover
-      Texts given in the Document's license notice.</P
-></LI
+></P
+><OL
+TYPE="1"
 ><LI
 ><P
->Include an unaltered
-      copy of this License.</P
+>Make it so if someone types 
+        <TT
+CLASS="computeroutput"
+>http://www.foo.com/12345</TT
+>
+
+        , Bugzilla spits back http://www.foo.com/show_bug.cgi?id=12345. Try
+        setting up your VirtualHost section for Bugzilla with a rule like
+        this:</P
+><TABLE
+BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
+><TR
+><TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+>&#13;&#60;VirtualHost 12.34.56.78&#62;
+RewriteEngine On
+RewriteRule ^/([0-9]+)$ http://foo.bar.com/show_bug.cgi?id=$1 [L,R]
+&#60;/VirtualHost&#62;
+</PRE
+></FONT
+></TD
+></TR
+></TABLE
 ></LI
 ><LI
 ><P
->Preserve the section
-      entitled "History", and its title, and add to it an item stating
-      at least the title, year, new authors, and publisher of the
-      Modified Version as given on the Title Page.  If there is no
-      section entitled "History" in the Document, create one stating
-      the title, year, authors, and publisher of the Document as given
-      on its Title Page, then add an item describing the Modified
-      Version as stated in the previous sentence.</P
+>There are many, many more things you can do with mod_rewrite.
+        Please refer to the mod_rewrite documentation at 
+        <A
+HREF="http://www.apache.org"
+TARGET="_top"
+>http://www.apache.org</A
+>.
+        </P
 ></LI
-><LI
+></OL
+></DIV
+><DIV
+CLASS="section"
+><HR><H1
+CLASS="section"
+><A
+NAME="cmdline">C.2. Command-line Bugzilla Queries</H1
 ><P
->Preserve the network
-      location, if any, given in the Document for public access to a
-      Transparent copy of the Document, and likewise the network
-      locations given in the Document for previous versions it was
-      based on.  These may be placed in the "History" section.  You
-      may omit a network location for a work that was published at
-      least four years before the Document itself, or if the original
-      publisher of the version it refers to gives permission.</P
-></LI
-><LI
+>There are a suite of Unix utilities for querying Bugzilla from the 
+    command line. They live in the 
+    <TT
+CLASS="filename"
+>contrib/cmdline</TT
+> 
+    directory. However, they
+    have not yet been updated to work with 2.16 (post-templatisation.).
+    There are three files - <TT
+CLASS="filename"
+>query.conf</TT
+>, 
+    <TT
+CLASS="filename"
+>buglist</TT
+> and <TT
+CLASS="filename"
+>bugs</TT
+>.</P
 ><P
->In any section entitled
-      "Acknowledgements" or "Dedications", preserve the section's
-      title, and preserve in the section all the substance and tone of
-      each of the contributor acknowledgements and/or dedications
-      given therein.</P
-></LI
-><LI
+><TT
+CLASS="filename"
+>query.conf</TT
+> 
+    contains the mapping from options to field
+    names and comparison types. Quoted option names are "grepped" for, so it
+    should be easy to edit this file. Comments (#) have no effect; you must
+    make sure these lines do not contain any quoted "option".</P
 ><P
->Preserve all the
-      Invariant Sections of the Document, unaltered in their text and
-      in their titles.  Section numbers or the equivalent are not
-      considered part of the section titles.</P
-></LI
-><LI
+><TT
+CLASS="filename"
+>buglist</TT
+>
+    is a shell script which submits a Bugzilla query and writes
+    the resulting HTML page to stdout. It supports both short options, (such
+    as "-Afoo" or "-Rbar") and long options (such as "--assignedto=foo" or
+    "--reporter=bar"). If the first character of an option is not "-", it is
+    treated as if it were prefixed with "--default=".</P
 ><P
->Delete any section
-      entitled "Endorsements".  Such a section may not be included in
-      the Modified Version.</P
-></LI
-><LI
+>The column list is taken from the COLUMNLIST environment variable.
+    This is equivalent to the "Change Columns" option when you list bugs in
+    buglist.cgi. If you have already used Bugzilla, grep for COLUMNLIST
+    in your cookies file to see your current COLUMNLIST setting.</P
 ><P
->Do not retitle any
-      existing section as "Endorsements" or to conflict in title with
-      any Invariant Section.</P
-></LI
-></OL
+><TT
+CLASS="filename"
+>bugs</TT
+> is a simple shell script which calls
+    <TT
+CLASS="filename"
+>buglist</TT
+> and extracts the
+    bug numbers from the output. Adding the prefix
+    "http://bugzilla.mozilla.org/buglist.cgi?bug_id=" turns the bug list into
+    a working link if any bugs are found. Counting bugs is easy. Pipe the
+    results through 
+    <B
+CLASS="command"
+>sed -e 's/,/ /g' | wc | awk '{printf $2 "\n"}'</B
+>
+    </P
 ><P
->If the Modified Version includes new front-matter sections
-    or appendices that qualify as Secondary Sections and contain no
-    material copied from the Document, you may at your option
-    designate some or all of these sections as invariant.  To do this,
-    add their titles to the list of Invariant Sections in the Modified
-    Version's license notice.  These titles must be distinct from any
-    other section titles.</P
-><P
->You may add a section entitled "Endorsements", provided it
-    contains nothing but endorsements of your Modified Version by
-    various parties--for example, statements of peer review or that
-    the text has been approved by an organization as the authoritative
-    definition of a standard.</P
-><P
->You may add a passage of up to five words as a Front-Cover
-    Text, and a passage of up to 25 words as a Back-Cover Text, to the
-    end of the list of Cover Texts in the Modified Version.  Only one
-    passage of Front-Cover Text and one of Back-Cover Text may be
-    added by (or through arrangements made by) any one entity.  If the
-    Document already includes a cover text for the same cover,
-    previously added by you or by arrangement made by the same entity
-    you are acting on behalf of, you may not add another; but you may
-    replace the old one, on explicit permission from the previous
-    publisher that added the old one.</P
-><P
->The author(s) and publisher(s) of the Document do not by
-    this License give permission to use their names for publicity for
-    or to assert or imply endorsement of any Modified Version.</P
-></DIV
-><DIV
-CLASS="SECT1"
+>Akkana Peck says she has good results piping 
+    <TT
+CLASS="filename"
+>buglist</TT
+> output through 
+    <B
+CLASS="command"
+>w3m -T text/html -dump</B
+>
+    </P
+></DIV
+></DIV
+><DIV
+CLASS="appendix"
 ><HR><H1
-CLASS="SECT1"
 ><A
-NAME="GFDL_5"
->5. COMBINING DOCUMENTS</A
-></H1
-><P
->You may combine the Document with other documents released
-    under this License, under the terms defined in section 4 above for
-    modified versions, provided that you include in the combination
-    all of the Invariant Sections of all of the original documents,
-    unmodified, and list them all as Invariant Sections of your
-    combined work in its license notice.</P
-><P
->The combined work need only contain one copy of this
-    License, and multiple identical Invariant Sections may be replaced
-    with a single copy.  If there are multiple Invariant Sections with
-    the same name but different contents, make the title of each such
-    section unique by adding at the end of it, in parentheses, the
-    name of the original author or publisher of that section if known,
-    or else a unique number.  Make the same adjustment to the section
-    titles in the list of Invariant Sections in the license notice of
-    the combined work.</P
+NAME="variants">Appendix D. Bugzilla Variants and Competitors</H1
 ><P
->In the combination, you must combine any sections entitled
-    "History" in the various original documents, forming one section
-    entitled "History"; likewise combine any sections entitled
-    "Acknowledgements", and any sections entitled "Dedications".  You
-    must delete all sections entitled "Endorsements."</P
-></DIV
+>I created this section to answer questions about Bugzilla competitors
+  and variants, then found a wonderful site which covers an awful lot of what
+  I wanted to discuss. Rather than quote it in its entirety, I'll simply
+  refer you here: 
+  <A
+HREF="http://linas.org/linux/pm.html"
+TARGET="_top"
+>&#13;  http://linas.org/linux/pm.html</A
+>
+  </P
 ><DIV
-CLASS="SECT1"
+CLASS="section"
 ><HR><H1
-CLASS="SECT1"
+CLASS="section"
 ><A
-NAME="GFDL_6"
->6. COLLECTIONS OF DOCUMENTS</A
-></H1
+NAME="rhbugzilla">D.1. Red Hat Bugzilla</H1
 ><P
->You may make a collection consisting of the Document and
-    other documents released under this License, and replace the
-    individual copies of this License in the various documents with a
-    single copy that is included in the collection, provided that you
-    follow the rules of this License for verbatim copying of each of
-    the documents in all other respects.</P
+>Red Hat Bugzilla is a fork of Bugzilla 2.8. 
+    One of its major benefits is the ability
+    to work with Oracle, MySQL, and PostGreSQL databases serving as the
+    back-end, instead of just MySQL. Dave Lawrence of Red Hat is 
+    active in the Bugzilla community, and we hope to see a reunification
+    of the fork before too long.</P
 ><P
->You may extract a single document from such a collection,
-    and distribute it individually under this License, provided you
-    insert a copy of this License into the extracted document, and
-    follow this License in all other respects regarding verbatim
-    copying of that document.</P
+>URL: 
+    <A
+HREF="http://bugzilla.redhat.com/bugzilla/"
+TARGET="_top"
+>&#13;    http://bugzilla.redhat.com/bugzilla/</A
+>
+    </P
 ></DIV
 ><DIV
-CLASS="SECT1"
+CLASS="section"
 ><HR><H1
-CLASS="SECT1"
+CLASS="section"
 ><A
-NAME="GFDL_7"
->7. AGGREGATION WITH INDEPENDENT WORKS</A
-></H1
+NAME="variant-fenris">D.2. Loki Bugzilla (Fenris)</H1
 ><P
->A compilation of the Document or its derivatives with other
-    separate and independent documents or works, in or on a volume of
-    a storage or distribution medium, does not as a whole count as a
-    Modified Version of the Document, provided no compilation
-    copyright is claimed for the compilation.  Such a compilation is
-    called an "aggregate", and this License does not apply to the
-    other self-contained works thus compiled with the Document, on
-    account of their being thus compiled, if they are not themselves
-    derivative works of the Document.</P
-><P
->If the Cover Text requirement of section 3 is applicable to
-    these copies of the Document, then if the Document is less than
-    one quarter of the entire aggregate, the Document's Cover Texts
-    may be placed on covers that surround only the Document within the
-    aggregate.  Otherwise they must appear on covers around the whole
-    aggregate.</P
-></DIV
-><DIV
-CLASS="SECT1"
+>Fenris was a fork from Bugzilla made by Loki Games; when
+    Loki went into receivership, it died. While Loki's other code lives on,
+    its custodians recommend Bugzilla for future bug-tracker deployments.
+    </P
+></DIV
+><DIV
+CLASS="section"
 ><HR><H1
-CLASS="SECT1"
+CLASS="section"
 ><A
-NAME="GFDL_8"
->8. TRANSLATION</A
-></H1
+NAME="variant-issuezilla">D.3. Issuezilla</H1
 ><P
->Translation is considered a kind of modification, so you may
-    distribute translations of the Document under the terms of section
-    4.  Replacing Invariant Sections with translations requires
-    special permission from their copyright holders, but you may
-    include translations of some or all Invariant Sections in addition
-    to the original versions of these Invariant Sections.  You may
-    include a translation of this License provided that you also
-    include the original English version of this License.  In case of
-    a disagreement between the translation and the original English
-    version of this License, the original English version will
-    prevail.</P
-></DIV
-><DIV
-CLASS="SECT1"
-><HR><H1
-CLASS="SECT1"
-><A
-NAME="GFDL_9"
->9. TERMINATION</A
-></H1
-><P
->You may not copy, modify, sublicense, or distribute the
-    Document except as expressly provided for under this License.  Any
-    other attempt to copy, modify, sublicense or distribute the
-    Document is void, and will automatically terminate your rights
-    under this License.  However, parties who have received copies, or
-    rights, from you under this License will not have their licenses
-    terminated so long as such parties remain in full
-    compliance.</P
+>Issuezilla was another fork from Bugzilla, made by collab.net and
+    hosted at tigris.org. It is also dead; the primary focus of bug-tracking 
+    at tigris.org is their Java-based bug-tracker, 
+    <A
+HREF="#variant-scarab"
+>Scarab</A
+>.</P
 ></DIV
 ><DIV
-CLASS="SECT1"
+CLASS="section"
 ><HR><H1
-CLASS="SECT1"
+CLASS="section"
 ><A
-NAME="GFDL_10"
->10. FUTURE REVISIONS OF THIS LICENSE</A
-></H1
-><P
->The Free Software Foundation may publish new, revised
-    versions of the GNU Free Documentation License from time to time.
-    Such new versions will be similar in spirit to the present
-    version, but may differ in detail to address new problems or
-    concerns.  See <A
-HREF="http://www.gnu.org/copyleft/"
-TARGET="_top"
->http://www.gnu.org/copyleft/</A
->.</P
+NAME="variant-scarab">D.4. Scarab</H1
 ><P
->Each version of the License is given a distinguishing
-    version number.  If the Document specifies that a particular
-    numbered version of this License "or any later version" applies to
-    it, you have the option of following the terms and conditions
-    either of that specified version or of any later version that has
-    been published (not as a draft) by the Free Software Foundation.
-    If the Document does not specify a version number of this License,
-    you may choose any version ever published (not as a draft) by the
-    Free Software Foundation.</P
+>Scarab is a new open source bug-tracking system built using Java
+    Serlet technology. It is currently at version 1.0 beta 8.</P
+><P
+>URL: 
+    <A
+HREF="http://scarab.tigris.org/"
+TARGET="_top"
+>http://scarab.tigris.org</A
+>
+    </P
 ></DIV
 ><DIV
-CLASS="SECT1"
+CLASS="section"
 ><HR><H1
-CLASS="SECT1"
+CLASS="section"
 ><A
-NAME="GFDL_HOWTO"
->How to use this License for your documents</A
-></H1
+NAME="variant-perforce">D.5. Perforce SCM</H1
 ><P
->To use this License in a document you have written, include
-    a copy of the License in the document and put the following
-    copyright and license notices just after the title page:</P
-><A
-NAME="AEN2589"
-></A
-><BLOCKQUOTE
-CLASS="BLOCKQUOTE"
+>Although Perforce isn't really a bug tracker, it can be used as
+    such through the <SPAN
+CLASS="QUOTE"
+>"jobs"</SPAN
+>
+    functionality.</P
 ><P
->      Copyright (c)  YEAR  YOUR NAME.
-      Permission is granted to copy, distribute and/or modify this document
-      under the terms of the GNU Free Documentation License, Version 1.1
-      or any later version published by the Free Software Foundation;
-      with the Invariant Sections being LIST THEIR TITLES, with the
-      Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
-      A copy of the license is included in the section entitled "GNU
-      Free Documentation License".</P
-></BLOCKQUOTE
+>URL: 
+    <A
+HREF="http://www.perforce.com/perforce/technotes/note052.html"
+TARGET="_top"
+>&#13;    http://www.perforce.com/perforce/technotes/note052.html
+    </A
+>
+    </P
+></DIV
+><DIV
+CLASS="section"
+><HR><H1
+CLASS="section"
+><A
+NAME="variant-sourceforge">D.6. SourceForge</H1
 ><P
->If you have no Invariant Sections, write "with no Invariant
-    Sections" instead of saying which ones are invariant.  If you have
-    no Front-Cover Texts, write "no Front-Cover Texts" instead of
-    "Front-Cover Texts being LIST"; likewise for Back-Cover
-    Texts.</P
+>SourceForge is a way of coordinating geographically
+    distributed free software and open source projects over the Internet.
+    It has a built-in bug tracker, but it's not highly thought of.</P
 ><P
->If your document contains nontrivial examples of program
-    code, we recommend releasing these examples in parallel under your
-    choice of free software license, such as the GNU General Public
-    License, to permit their use in free software.</P
+>URL: 
+    <A
+HREF="http://www.sourceforge.net"
+TARGET="_top"
+>&#13;    http://www.sourceforge.net</A
+>
+    </P
 ></DIV
 ></DIV
 ><DIV
 CLASS="GLOSSARY"
 ><H1
 ><A
-NAME="GLOSSARY"
->Glossary</A
-></H1
+NAME="glossary">Glossary</H1
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="AEN2594"
->0-9, high ascii</A
-></H1
+NAME="AEN2183">0-9, high ascii</H1
 ><DL
 ><DT
 ><B
@@ -16641,35 +12010,31 @@ NAME="AEN2594"
 ></DT
 ><DD
 ><P
->	    Apache web server, and other NCSA-compliant web servers,
-	    observe the convention of using files in directories
-	    called <TT
-CLASS="FILENAME"
+>Apache web server, and other NCSA-compliant web servers,
+        observe the convention of using files in directories called 
+        <TT
+CLASS="filename"
 >.htaccess</TT
-> files.  These
-	    restrict parameters of the web server.  In Bugzilla, they
-	    are used to restrict access to certain files which would
-	    otherwise compromise your installation.  For instance, the
-	    <TT
-CLASS="FILENAME"
+>
+
+        to restrict access to certain files. In Bugzilla, they are used
+        to keep secret files which would otherwise
+        compromise your installation - e.g. the 
+        <TT
+CLASS="filename"
 >localconfig</TT
-> file contains the
-	    password to your database.  If this information were
-	    generally available, and remote access to your database
-	    turned on, you risk corruption of your database by
-	    computer criminals or the curious.
-	  </P
+>
+        file contains the password to your database.
+        curious.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_A"
->A</A
-></H1
+NAME="gloss-a">A</H1
 ><DL
 ><DT
 ><B
@@ -16677,34 +12042,37 @@ NAME="GLOSS_A"
 ></DT
 ><DD
 ><P
->In this context, Apache is the web server most
-	    commonly used for serving up
-	    <I
-CLASS="GLOSSTERM"
+>In this context, Apache is the web server most commonly used
+        for serving up 
+        <I
+CLASS="glossterm"
 >Bugzilla</I
-> pages.  Contrary to
-	    popular belief, the apache web server has nothing to do
-	    with the ancient and noble Native American tribe, but
-	    instead derived its name from the fact that it was
-	    <SPAN
+>
+
+        pages. Contrary to popular belief, the apache web server has nothing
+        to do with the ancient and noble Native American tribe, but instead
+        derived its name from the fact that it was 
+        <SPAN
 CLASS="QUOTE"
 >"a patchy"</SPAN
-> version of the original
-	    <SPAN
-CLASS="ACRONYM"
+>
+
+        version of the original 
+        <SPAN
+CLASS="acronym"
 >NCSA</SPAN
-> world-wide-web server.</P
+>
+
+        world-wide-web server.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_B"
->B</A
-></H1
+NAME="gloss-b">B</H1
 ><DL
 ><DT
 ><B
@@ -16712,21 +12080,24 @@ NAME="GLOSS_B"
 ></DT
 ><DD
 ><P
->	    A <SPAN
+>A 
+        <SPAN
 CLASS="QUOTE"
->"Bug"</SPAN
-> in Bugzilla refers to an issue
-	    entered into the database which has an associated number,
-	    assignments, comments, etc. Some also refer to a
-	    <SPAN
+>"bug"</SPAN
+>
+
+        in Bugzilla refers to an issue entered into the database which has an
+        associated number, assignments, comments, etc. Some also refer to a 
+        <SPAN
 CLASS="QUOTE"
 >"tickets"</SPAN
-> or <SPAN
+>
+        or 
+        <SPAN
 CLASS="QUOTE"
 >"issues"</SPAN
->; in the
-	    context of Bugzilla, they are synonymous.
-	  </P
+>; 
+        in the context of Bugzilla, they are synonymous.</P
 ></DD
 ><DT
 ><B
@@ -16734,29 +12105,10 @@ CLASS="QUOTE"
 ></DT
 ><DD
 ><P
->	    Each Bugzilla Bug is assigned a number that uniquely
-	    identifies that Bug.  The Bug associated with a Bug Number
-	    can be pulled up via a query, or easily from the very
-	    front page by typing the number in the "Find" box.
-	  </P
-></DD
-><DT
-><B
->Bug Life Cycle</B
-></DT
-><DD
-><P
->A Bug has stages through which it must pass before
-	    becoming a <SPAN
-CLASS="QUOTE"
->"closed bug"</SPAN
->, including
-	    acceptance, resolution, and verification.  The <SPAN
-CLASS="QUOTE"
->"Bug
-	      Life Cycle"</SPAN
-> is moderately flexible according to
-	    the needs of the organization using it, though.</P
+>Each Bugzilla bug is assigned a number that uniquely identifies
+        that bug. The bug associated with a bug number can be pulled up via a
+        query, or easily from the very front page by typing the number in the
+        "Find" box.</P
 ></DD
 ><DT
 ><B
@@ -16764,76 +12116,67 @@ CLASS="QUOTE"
 ></DT
 ><DD
 ><P
->	    Bugzilla is the industry-standard bug tracking system.  It
-	    is quite popular among Open Source enthusiasts.
-	  </P
+>Bugzilla is the world-leading free software bug tracking system.
+        </P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_C"
-></A
-></H1
+NAME="gloss-c"></H1
 ><DL
 ><DT
 ><A
-NAME="GLOSS_COMPONENT"
-><B
+NAME="gloss-component"><B
 >Component</B
-></A
 ></DT
 ><DD
 ><P
->	    A Component is a subsection of a Product.  It should be a
-	    narrow category, tailored to your organization.  All
-	    Products must contain at least one Component (and, as a
-	    matter of fact, creating a Product with no Components will
-	    create an error in Bugzilla).
-	  </P
+>A Component is a subsection of a Product. It should be a narrow
+        category, tailored to your organization. All Products must contain at
+        least one Component (and, as a matter of fact, creating a Product
+        with no Components will create an error in Bugzilla).</P
 ></DD
 ><DT
 ><A
-NAME="GLOSS_CPAN"
-><B
-><SPAN
-CLASS="ACRONYM"
+NAME="gloss-cpan"><B
+>&#13;        <SPAN
+CLASS="acronym"
 >CPAN</SPAN
-></B
-></A
+>
+      </B
 ></DT
 ><DD
 ><P
-><SPAN
-CLASS="ACRONYM"
+>&#13;        <SPAN
+CLASS="acronym"
 >CPAN</SPAN
-> stands for the
-	    <SPAN
+>
+
+        stands for the 
+        <SPAN
 CLASS="QUOTE"
 >"Comprehensive Perl Archive Network"</SPAN
->.  CPAN
-	    maintains a large number of extremely useful
-	    <I
-CLASS="GLOSSTERM"
+>. 
+        CPAN maintains a large number of extremely useful 
+        <I
+CLASS="glossterm"
 >Perl</I
-> modules.  By themselves, Perl
-	    modules generally do nothing, but when used as part of a
-	    larger program, they provide much-needed algorithms and
-	    functionality.</P
+>
+        modules - encapsulated chunks of code for performing a
+        particular task.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_D"
->D</A
-></H1
+NAME="gloss-d">D</H1
 ><DL
 ><DT
 ><B
@@ -16841,29 +12184,28 @@ NAME="GLOSS_D"
 ></DT
 ><DD
 ><P
->A daemon is a computer program which runs in the
-	    background.  In general, most daemons are started at boot
-	    time via System V init scripts, or through RC scripts on
-	    BSD-based systems.  <I
-CLASS="GLOSSTERM"
+>A daemon is a computer program which runs in the background. In
+        general, most daemons are started at boot time via System V init
+        scripts, or through RC scripts on BSD-based systems. 
+        <I
+CLASS="glossterm"
 >mysqld</I
->, the
-	    MySQL server, and <I
-CLASS="GLOSSTERM"
+>, 
+        the MySQL server, and 
+        <I
+CLASS="glossterm"
 >apache</I
->, a web
-	    server, are generally run as daemons.</P
+>, 
+        a web server, are generally run as daemons.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_G"
-></A
-></H1
+NAME="gloss-g"></H1
 ><DL
 ><DT
 ><B
@@ -16871,58 +12213,34 @@ NAME="GLOSS_G"
 ></DT
 ><DD
 ><P
->The word <SPAN
+>The word 
+        <SPAN
 CLASS="QUOTE"
 >"Groups"</SPAN
-> has a very special
-	    meaning to Bugzilla.  Bugzilla's main security mechanism
-	    comes by lumping users into groups, and assigning those
-	    groups certain privileges to
-	    <I
-CLASS="GLOSSTERM"
+>
+
+        has a very special meaning to Bugzilla. Bugzilla's main security
+        mechanism comes by placing users in groups, and assigning those
+        groups certain privileges to view bugs in particular
+        <I
+CLASS="glossterm"
 >Products</I
-> and
-	    <I
-CLASS="GLOSSTERM"
->Components</I
-> in the
-	    <I
-CLASS="GLOSSTERM"
+>
+        in the 
+        <I
+CLASS="glossterm"
 >Bugzilla</I
-> database.</P
-></DD
-></DL
-></DIV
-><DIV
-CLASS="GLOSSDIV"
-><H1
-CLASS="GLOSSDIV"
-><A
-NAME="GLOSS_I"
->I</A
-></H1
-><DL
-><DT
-><A
-NAME="GLOSS_INFINITELOOP"
-><B
->Infinite Loop</B
-></A
-></DT
-><DD
-><P
->A loop of information that never ends; see recursion.</P
+>
+        database.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_M"
->M</A
-></H1
+NAME="gloss-m">M</H1
 ><DL
 ><DT
 ><B
@@ -16930,26 +12248,25 @@ NAME="GLOSS_M"
 ></DT
 ><DD
 ><P
->mysqld is the name of the
-	    <I
-CLASS="GLOSSTERM"
+>mysqld is the name of the 
+        <I
+CLASS="glossterm"
 >daemon</I
-> for the MySQL database.  In
-	    general, it is invoked automatically through the use of
-	    the System V init scripts on GNU/Linux and AT&#38;T System
-	    V-based systems, such as Solaris and HP/UX, or through the
-	    RC scripts on BSD-based systems.</P
+>
+
+        for the MySQL database. In general, it is invoked automatically
+        through the use of the System V init scripts on GNU/Linux and
+        AT&#38;T System V-based systems, such as Solaris and HP/UX, or
+        through the RC scripts on BSD-based systems.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_P"
->P</A
-></H1
+NAME="gloss-p">P</H1
 ><DL
 ><DT
 ><B
@@ -16957,57 +12274,11 @@ NAME="GLOSS_P"
 ></DT
 ><DD
 ><P
->A Product is a broad category of types of bugs.  In
-	    general, there are several Components to a Product.  A
-	    Product also defines a default Group (used for Bug
-	    Security) for all bugs entered into components beneath
-	    it.</P
-><DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN2685"
-></A
-><P
-><B
->Example 1. A Sample Product</B
-></P
-><P
->A company sells a software product called
-	      <SPAN
-CLASS="QUOTE"
->"X"</SPAN
->.  They also maintain some older
-	      software called <SPAN
-CLASS="QUOTE"
->"Y"</SPAN
->, and have a secret
-	      project <SPAN
-CLASS="QUOTE"
->"Z"</SPAN
->.  An effective use of Products
-	      might be to create Products <SPAN
-CLASS="QUOTE"
->"X"</SPAN
->,
-	      <SPAN
-CLASS="QUOTE"
->"Y"</SPAN
->, <SPAN
-CLASS="QUOTE"
->"Z"</SPAN
->, each with Components
-	      of User Interface, Database, and Business Logic.  They
-	      might also change group permissions so that only those
-	      people who are members of Group <SPAN
-CLASS="QUOTE"
->"Z"</SPAN
-> can see
-	      components and bugs under Product
-	      <SPAN
-CLASS="QUOTE"
->"Z"</SPAN
->.</P
-></DIV
+>A Product is a broad category of types of bugs, normally
+        representing a single piece of software or entity. In general,
+        there are several Components to a Product. A Product may define a
+        group (used for security) for all bugs entered into
+        its Components.</P
 ></DD
 ><DT
 ><B
@@ -17015,26 +12286,25 @@ CLASS="QUOTE"
 ></DT
 ><DD
 ><P
->First written by Larry Wall, Perl is a remarkable
-	    program language.  It has the benefits of the flexibility
-	    of an interpreted scripting language (such as shell
-	    script), combined with the speed and power of a compiled
-	    language, such as C.  <I
-CLASS="GLOSSTERM"
+>First written by Larry Wall, Perl is a remarkable program
+        language. It has the benefits of the flexibility of an interpreted
+        scripting language (such as shell script), combined with the speed
+        and power of a compiled language, such as C. 
+        <I
+CLASS="glossterm"
 >Bugzilla</I
-> is
-	    maintained in Perl.</P
+>
+
+        is maintained in Perl.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_Q"
->Q</A
-></H1
+NAME="gloss-q">Q</H1
 ><DL
 ><DT
 ><B
@@ -17042,183 +12312,159 @@ NAME="GLOSS_Q"
 ></DT
 ><DD
 ><P
-><SPAN
+>&#13;        <SPAN
 CLASS="QUOTE"
 >"QA"</SPAN
->, <SPAN
+>, 
+        <SPAN
 CLASS="QUOTE"
 >"Q/A"</SPAN
->, and
-	    <SPAN
+>, and 
+        <SPAN
 CLASS="QUOTE"
 >"Q.A."</SPAN
-> are short for <SPAN
+>
+        are short for 
+        <SPAN
 CLASS="QUOTE"
->"Quality
-	      Assurance"</SPAN
->.  In most large software development
-	    organizations, there is a team devoted to ensuring the
-	    product meets minimum standards before shipping.  This
-	    team will also generally want to track the progress of
-	    bugs over their life cycle, thus the need for the
-	    <SPAN
+>"Quality Assurance"</SPAN
+>. 
+        In most large software development organizations, there is a team
+        devoted to ensuring the product meets minimum standards before
+        shipping. This team will also generally want to track the progress of
+        bugs over their life cycle, thus the need for the 
+        <SPAN
 CLASS="QUOTE"
 >"QA Contact"</SPAN
-> field in a Bug.</P
-></DD
-></DL
-></DIV
-><DIV
-CLASS="GLOSSDIV"
-><H1
-CLASS="GLOSSDIV"
-><A
-NAME="GLOSS_R"
->R</A
-></H1
-><DL
-><DT
-><A
-NAME="GLOSS_RECURSION"
-><B
->Recursion</B
-></A
-></DT
-><DD
-><P
->The property of a function looking back at itself for
-	    something.  <SPAN
-CLASS="QUOTE"
->"GNU"</SPAN
->, for instance, stands for
-	    <SPAN
-CLASS="QUOTE"
->"GNU's Not UNIX"</SPAN
->, thus recursing upon itself
-	    for definition.  For further clarity, see Infinite
-	    Loop.</P
+>
+
+        field in a bug.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_S"
->S</A
-></H1
+NAME="gloss-s">S</H1
 ><DL
 ><DT
 ><B
-><SPAN
-CLASS="ACRONYM"
+>&#13;        <SPAN
+CLASS="acronym"
 >SGML</SPAN
-></B
+>
+      </B
 ></DT
 ><DD
 ><P
-><SPAN
-CLASS="ACRONYM"
+>&#13;        <SPAN
+CLASS="acronym"
 >SGML</SPAN
-> stands for <SPAN
-CLASS="QUOTE"
->"Standard
-	      Generalized Markup Language"</SPAN
->.  Created in the
-	    1980's to provide an extensible means to maintain
-	    documentation based upon content instead of presentation,
-	    <SPAN
-CLASS="ACRONYM"
+>
+
+        stands for 
+        <SPAN
+CLASS="QUOTE"
+>"Standard Generalized Markup Language"</SPAN
+>. 
+        Created in the 1980's to provide an extensible means to maintain
+        documentation based upon content instead of presentation, 
+        <SPAN
+CLASS="acronym"
 >SGML</SPAN
-> has withstood the test of time as
-	    a robust, powerful language.
-	    <I
-CLASS="GLOSSTERM"
-><SPAN
-CLASS="ACRONYM"
+>
+
+        has withstood the test of time as a robust, powerful language. 
+        <I
+CLASS="glossterm"
+>&#13;          <SPAN
+CLASS="acronym"
 >XML</SPAN
-></I
-> is the
-	    <SPAN
+>
+        </I
+>
+
+        is the 
+        <SPAN
 CLASS="QUOTE"
 >"baby brother"</SPAN
-> of SGML; any valid
-	    <SPAN
-CLASS="ACRONYM"
+>
+
+        of SGML; any valid 
+        <SPAN
+CLASS="acronym"
 >XML</SPAN
-> document it, by definition, a valid
-	    <SPAN
-CLASS="ACRONYM"
+>
+
+        document it, by definition, a valid 
+        <SPAN
+CLASS="acronym"
 >SGML</SPAN
-> document.  The document you are
-	    reading is written and maintained in
-	    <SPAN
-CLASS="ACRONYM"
+>
+
+        document. The document you are reading is written and maintained in 
+        <SPAN
+CLASS="acronym"
 >SGML</SPAN
->, and is also valid
-	    <SPAN
-CLASS="ACRONYM"
+>, 
+        and is also valid 
+        <SPAN
+CLASS="acronym"
 >XML</SPAN
-> if you modify the Document Type
-	    Definition.</P
+>
+
+        if you modify the Document Type Definition.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_T"
->T</A
-></H1
+NAME="gloss-t">T</H1
 ><DL
 ><DT
 ><A
-NAME="GLOSS_TARGET_MILESTONE"
-><B
+NAME="gloss-target-milestone"><B
 >Target Milestone</B
-></A
 ></DT
 ><DD
 ><P
->	    Target Milestones are Product goals.  They are
-	    configurable on a per-Product basis.  Most software
-	    development houses have a concept of
-	    <SPAN
+>Target Milestones are Product goals. They are configurable on a
+        per-Product basis. Most software development houses have a concept of
+        
+        <SPAN
 CLASS="QUOTE"
 >"milestones"</SPAN
-> where the people funding a
-	    project expect certain functionality on certain dates.
-	    Bugzilla facilitates meeting these milestones by giving
-	    you the ability to declare by which milestone a bug will be
-	    fixed, or an enhancement will be implemented.
-	  </P
+>
+
+        where the people funding a project expect certain functionality on
+        certain dates. Bugzilla facilitates meeting these milestones by
+        giving you the ability to declare by which milestone a bug will be
+        fixed, or an enhancement will be implemented.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_Z"
->Z</A
-></H1
+NAME="gloss-z">Z</H1
 ><DL
 ><DT
 ><A
-NAME="ZARRO-BOOGS-FOUND"
-><B
+NAME="zarro-boogs-found"><B
 >Zarro Boogs Found</B
-></A
 ></DT
 ><DD
 ><P
->This is the cryptic response sent by Bugzilla when a
-	    query returned no results.  It is just a goofy way of
-	    saying "Zero Bugs Found".</P
+>This is the cryptic response sent by Bugzilla when a query
+        returned no results. It is just a goofy way of saying "Zero Bugs
+        Found".</P
 ></DD
 ></DL
 ></DIV
@@ -17226,4 +12472,4 @@ NAME="ZARRO-BOOGS-FOUND"
 ></DIV
 ></BODY
 ></HTML
->
+>
\ No newline at end of file
diff --git a/docs/html/CVS/Entries b/docs/html/CVS/Entries
index d22a005da..6a7291459 100644
--- a/docs/html/CVS/Entries
+++ b/docs/html/CVS/Entries
@@ -1,70 +1,48 @@
-/Bugzilla-Guide.html/1.9/Wed Aug 29 18:13:38 2001//TBUGZILLA-2_14_5
-/about.html/1.4/Fri Aug 10 22:26:40 2001//TBUGZILLA-2_14_5
-/aboutthisguide.html/1.6/Wed Aug 29 17:25:25 2001//TBUGZILLA-2_14_5
-/administration.html/1.5/Wed Aug 22 03:44:17 2001//TBUGZILLA-2_14_5
-/bonsai.html/1.5/Wed Aug 22 03:44:17 2001//TBUGZILLA-2_14_5
-/bsdinstall.html/1.1/Fri Aug 10 22:26:42 2001//TBUGZILLA-2_14_5
-/bzhacking.html/1.1/Wed Aug 29 17:25:25 2001//TBUGZILLA-2_14_5
-/cmdline.html/1.5/Wed Aug 22 03:44:18 2001//TBUGZILLA-2_14_5
-/contributors.html/1.5/Wed Aug 29 17:25:25 2001//TBUGZILLA-2_14_5
-/conventions.html/1.5/Wed Aug 22 03:44:18 2001//TBUGZILLA-2_14_5
-/copyright.html/1.6/Wed Aug 29 17:25:26 2001//TBUGZILLA-2_14_5
-/credits.html/1.5/Wed Aug 29 17:25:26 2001//TBUGZILLA-2_14_5
-/cvs.html/1.6/Wed Aug 29 17:25:26 2001//TBUGZILLA-2_14_5
-/database.html/1.4/Fri Aug 10 22:26:44 2001//TBUGZILLA-2_14_5
-/dbdoc.html/1.6/Wed Aug 29 17:25:26 2001//TBUGZILLA-2_14_5
-/dbschema.html/1.5/Wed Aug 29 17:25:26 2001//TBUGZILLA-2_14_5
-/disclaimer.html/1.4/Fri Aug 10 22:26:46 2001//TBUGZILLA-2_14_5
-/downloadlinks.html/1.3/Fri Aug 10 22:26:46 2001//TBUGZILLA-2_14_5
-/errata.html/1.1/Fri Aug 10 22:26:47 2001//TBUGZILLA-2_14_5
-/faq.html/1.7/Wed Aug 29 17:25:27 2001//TBUGZILLA-2_14_5
-/feedback.html/1.4/Fri Aug 10 22:26:48 2001//TBUGZILLA-2_14_5
-/future.html/1.6/Wed Aug 29 17:25:28 2001//TBUGZILLA-2_14_5
-/geninstall.html/1.3/Wed Aug 29 17:25:28 2001//TBUGZILLA-2_14_5
-/gfdl.html/1.7/Wed Aug 29 17:25:28 2001//TBUGZILLA-2_14_5
-/gfdl_0.html/1.4/Fri Aug 10 22:26:49 2001//TBUGZILLA-2_14_5
-/gfdl_1.html/1.4/Fri Aug 10 22:26:49 2001//TBUGZILLA-2_14_5
-/gfdl_10.html/1.4/Fri Aug 10 22:26:50 2001//TBUGZILLA-2_14_5
-/gfdl_2.html/1.4/Fri Aug 10 22:26:50 2001//TBUGZILLA-2_14_5
-/gfdl_3.html/1.4/Fri Aug 10 22:26:51 2001//TBUGZILLA-2_14_5
-/gfdl_4.html/1.4/Fri Aug 10 22:26:51 2001//TBUGZILLA-2_14_5
-/gfdl_5.html/1.4/Fri Aug 10 22:26:52 2001//TBUGZILLA-2_14_5
-/gfdl_6.html/1.4/Fri Aug 10 22:26:52 2001//TBUGZILLA-2_14_5
-/gfdl_7.html/1.4/Fri Aug 10 22:26:52 2001//TBUGZILLA-2_14_5
-/gfdl_8.html/1.4/Fri Aug 10 22:26:53 2001//TBUGZILLA-2_14_5
-/gfdl_9.html/1.4/Fri Aug 10 22:26:53 2001//TBUGZILLA-2_14_5
-/gfdl_howto.html/1.7/Wed Aug 29 17:25:28 2001//TBUGZILLA-2_14_5
-/glossary.html/1.7/Wed Aug 29 17:25:28 2001//TBUGZILLA-2_14_5
-/granttables.html/1.6/Wed Aug 29 17:25:28 2001//TBUGZILLA-2_14_5
-/how.html/1.7/Wed Aug 29 17:25:29 2001//TBUGZILLA-2_14_5
-/index.html/1.7/Wed Aug 29 17:25:29 2001//TBUGZILLA-2_14_5
-/init4me.html/1.5/Wed Aug 22 03:44:20 2001//TBUGZILLA-2_14_5
-/installation.html/1.7/Wed Aug 29 17:25:29 2001//TBUGZILLA-2_14_5
-/integration.html/1.5/Wed Aug 22 03:44:20 2001//TBUGZILLA-2_14_5
-/newversions.html/1.5/Wed Aug 22 03:44:20 2001//TBUGZILLA-2_14_5
-/osx.html/1.1/Fri Aug 10 22:26:58 2001//TBUGZILLA-2_14_5
-/patches.html/1.6/Wed Aug 29 17:25:29 2001//TBUGZILLA-2_14_5
-/postinstall-check.html/1.5/Wed Aug 22 03:44:21 2001//TBUGZILLA-2_14_5
-/programadmin.html/1.7/Wed Aug 29 17:25:29 2001//TBUGZILLA-2_14_5
-/quicksearch.html/1.6/Wed Aug 29 17:25:29 2001//TBUGZILLA-2_14_5
-/rewrite.html/1.1/Wed Aug 22 03:44:21 2001//TBUGZILLA-2_14_5
-/rhbugzilla.html/1.5/Wed Aug 22 03:44:22 2001//TBUGZILLA-2_14_5
-/scm.html/1.5/Wed Aug 22 03:44:22 2001//TBUGZILLA-2_14_5
-/security.html/1.6/Fri Aug 10 22:27:01 2001//TBUGZILLA-2_14_5
-/setperl.html/1.7/Wed Aug 29 17:25:30 2001//TBUGZILLA-2_14_5
-/stepbystep.html/1.4/Wed Aug 29 18:13:39 2001//TBUGZILLA-2_14_5
-/tinderbox.html/1.5/Wed Aug 22 03:44:23 2001//TBUGZILLA-2_14_5
-/translations.html/1.4/Fri Aug 10 22:27:03 2001//TBUGZILLA-2_14_5
-/useradmin.html/1.5/Wed Aug 22 03:44:23 2001//TBUGZILLA-2_14_5
-/using.html/1.5/Wed Aug 22 03:44:23 2001//TBUGZILLA-2_14_5
-/usingbz-conc.html/1.5/Wed Aug 22 03:44:23 2001//TBUGZILLA-2_14_5
-/variant_fenris.html/1.1/Wed Aug 22 03:44:23 2001//TBUGZILLA-2_14_5
-/variant_issuezilla.html/1.1/Wed Aug 22 03:44:24 2001//TBUGZILLA-2_14_5
-/variant_perforce.html/1.1/Wed Aug 22 03:44:24 2001//TBUGZILLA-2_14_5
-/variant_scarab.html/1.1/Wed Aug 22 03:44:24 2001//TBUGZILLA-2_14_5
-/variant_sourceforge.html/1.2/Wed Aug 29 17:25:30 2001//TBUGZILLA-2_14_5
-/variants.html/1.5/Wed Aug 29 17:25:30 2001//TBUGZILLA-2_14_5
-/whatis.html/1.5/Wed Aug 22 03:44:25 2001//TBUGZILLA-2_14_5
-/why.html/1.5/Wed Aug 22 03:44:26 2001//TBUGZILLA-2_14_5
-/win32.html/1.3/Wed Aug 29 17:25:30 2001//TBUGZILLA-2_14_5
+/Bugzilla-Guide.html/1.15.2.1/Thu Jul 25 21:03:10 2002//TBUGZILLA-2_16
+/about.html/1.7.2.1/Sat May 11 17:59:49 2002//TBUGZILLA-2_16
+/aboutthisguide.html/1.9/Wed May  8 21:16:36 2002//TBUGZILLA-2_16
+/administration.html/1.7.2.5/Thu Jul 25 20:48:28 2002//TBUGZILLA-2_16
+/cmdline.html/1.7.2.3/Sat May 25 15:36:47 2002//TBUGZILLA-2_16
+/conventions.html/1.8.2.4/Thu Jul 25 20:48:29 2002//TBUGZILLA-2_16
+/copyright.html/1.9.2.3/Thu Jul 25 20:48:29 2002//TBUGZILLA-2_16
+/credits.html/1.8.2.1/Sat May 11 17:59:52 2002//TBUGZILLA-2_16
+/cust-templates.html/1.1.2.5/Thu Jul 25 21:03:13 2002//TBUGZILLA-2_16
+/database.html/1.6.2.3/Sat May 25 15:36:47 2002//TBUGZILLA-2_16
+/dbdoc.html/1.9.2.5/Thu Jul 25 20:48:30 2002//TBUGZILLA-2_16
+/dbschema.html/1.7.2.1/Sun May 12 16:15:16 2002//TBUGZILLA-2_16
+/disclaimer.html/1.7.2.1/Sat May 11 17:59:54 2002//TBUGZILLA-2_16
+/extraconfig.html/1.1.2.4/Thu Jul 25 20:48:30 2002//TBUGZILLA-2_16
+/faq.html/1.10.2.5/Thu Jul 25 20:48:30 2002//TBUGZILLA-2_16
+/glossary.html/1.11.2.5/Thu Jul 25 20:48:32 2002//TBUGZILLA-2_16
+/groups.html/1.1.2.2/Sat May 25 15:36:51 2002//TBUGZILLA-2_16
+/hintsandtips.html/1.1.2.3/Sat Jul 13 07:54:03 2002//TBUGZILLA-2_16
+/how.html/1.10.2.4/Thu Jul 25 20:48:33 2002//TBUGZILLA-2_16
+/index.html/1.11.2.5/Thu Jul 25 20:48:33 2002//TBUGZILLA-2_16
+/installation.html/1.10.2.5/Thu Jul 25 20:48:33 2002//TBUGZILLA-2_16
+/integration.html/1.7.2.3/Sat May 25 15:36:54 2002//TBUGZILLA-2_16
+/introduction.html/1.1.2.1/Sun May 12 16:17:40 2002//TBUGZILLA-2_16
+/newversions.html/1.8.2.1/Sat May 11 18:00:00 2002//TBUGZILLA-2_16
+/osx.html/1.3.2.3/Sat May 25 15:36:54 2002//TBUGZILLA-2_16
+/parameters.html/1.1.2.1/Sat May 25 15:39:13 2002//TBUGZILLA-2_16
+/patches.html/1.10.2.3/Sat May 25 15:36:54 2002//TBUGZILLA-2_16
+/programadmin.html/1.10.2.3/Sat May 25 15:36:55 2002//TBUGZILLA-2_16
+/rewrite.html/1.3.2.2/Sun May 12 16:15:22 2002//TBUGZILLA-2_16
+/rhbugzilla.html/1.8.2.3/Thu Jul 25 20:48:34 2002//TBUGZILLA-2_16
+/security.html/1.9.2.3/Sat May 25 15:36:55 2002//TBUGZILLA-2_16
+/stepbystep.html/1.8.2.5/Sat Jul 13 07:54:05 2002//TBUGZILLA-2_16
+/troubleshooting.html/1.1.2.4/Thu Jul 25 20:48:35 2002//TBUGZILLA-2_16
+/upgrading.html/1.1.2.2/Sat Jul 13 07:54:06 2002//TBUGZILLA-2_16
+/useradmin.html/1.8.2.2/Sat May 25 15:36:57 2002//TBUGZILLA-2_16
+/userpreferences.html/1.1.2.2/Sat May 25 15:36:57 2002//TBUGZILLA-2_16
+/using.html/1.8.2.4/Sat Jul 13 07:54:06 2002//TBUGZILLA-2_16
+/variant-fenris.html/1.3.2.2/Sun May 12 16:15:24 2002//TBUGZILLA-2_16
+/variant-issuezilla.html/1.3.2.2/Sun May 12 16:15:24 2002//TBUGZILLA-2_16
+/variant-perforce.html/1.3.2.3/Sat May 25 15:36:58 2002//TBUGZILLA-2_16
+/variant-scarab.html/1.3.2.3/Thu Jul 25 20:48:35 2002//TBUGZILLA-2_16
+/variant-sourceforge.html/1.3.2.2/Sun May 12 16:15:25 2002//TBUGZILLA-2_16
+/variants.html/1.8.2.2/Sun May 12 16:15:25 2002//TBUGZILLA-2_16
+/voting.html/1.1.2.2/Sat May 25 15:36:58 2002//TBUGZILLA-2_16
+/whatis.html/1.8.2.1/Sat May 11 18:00:07 2002//TBUGZILLA-2_16
+/why.html/1.7.2.2/Thu Jul 25 20:48:35 2002//TBUGZILLA-2_16
+/win32.html/1.7.2.5/Thu Jul 25 20:48:36 2002//TBUGZILLA-2_16
 D
diff --git a/docs/html/CVS/Tag b/docs/html/CVS/Tag
index cc64cc0c3..f2ec6389c 100644
--- a/docs/html/CVS/Tag
+++ b/docs/html/CVS/Tag
@@ -1 +1 @@
-NBUGZILLA-2_14_5
+NBUGZILLA-2_16
diff --git a/docs/html/about.html b/docs/html/about.html
index affb6046f..7f1f78467 100644
--- a/docs/html/about.html
+++ b/docs/html/about.html
@@ -4,7 +4,7 @@
 >About This Guide</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -13,10 +13,10 @@ REL="PREVIOUS"
 TITLE="The Bugzilla Guide"
 HREF="index.html"><LINK
 REL="NEXT"
-TITLE="Purpose and Scope of this Guide"
-HREF="aboutthisguide.html"></HEAD
+TITLE="Copyright Information"
+HREF="copyright.html"></HEAD
 ><BODY
-CLASS="CHAPTER"
+CLASS="chapter"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -25,6 +25,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -42,6 +43,7 @@ ALIGN="left"
 VALIGN="bottom"
 ><A
 HREF="index.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -54,7 +56,8 @@ WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="aboutthisguide.html"
+HREF="copyright.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -63,12 +66,10 @@ HREF="aboutthisguide.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="CHAPTER"
+CLASS="chapter"
 ><H1
 ><A
-NAME="ABOUT"
->Chapter 1. About This Guide</A
-></H1
+NAME="about">Chapter 1. About This Guide</H1
 ><DIV
 CLASS="TOC"
 ><DL
@@ -78,46 +79,26 @@ CLASS="TOC"
 ></DT
 ><DT
 >1.1. <A
-HREF="aboutthisguide.html"
->Purpose and Scope of this Guide</A
-></DT
-><DT
->1.2. <A
 HREF="copyright.html"
 >Copyright Information</A
 ></DT
 ><DT
->1.3. <A
+>1.2. <A
 HREF="disclaimer.html"
 >Disclaimer</A
 ></DT
 ><DT
->1.4. <A
+>1.3. <A
 HREF="newversions.html"
 >New Versions</A
 ></DT
 ><DT
->1.5. <A
+>1.4. <A
 HREF="credits.html"
 >Credits</A
 ></DT
 ><DT
->1.6. <A
-HREF="contributors.html"
->Contributors</A
-></DT
-><DT
->1.7. <A
-HREF="feedback.html"
->Feedback</A
-></DT
-><DT
->1.8. <A
-HREF="translations.html"
->Translations</A
-></DT
-><DT
->1.9. <A
+>1.5. <A
 HREF="conventions.html"
 >Document Conventions</A
 ></DT
@@ -129,6 +110,7 @@ CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -140,6 +122,7 @@ ALIGN="left"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -148,6 +131,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -155,7 +139,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="aboutthisguide.html"
+HREF="copyright.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -174,7 +159,7 @@ VALIGN="top"
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->Purpose and Scope of this Guide</TD
+>Copyright Information</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/aboutthisguide.html b/docs/html/aboutthisguide.html
index 0ed58bd19..cbd21435c 100644
--- a/docs/html/aboutthisguide.html
+++ b/docs/html/aboutthisguide.html
@@ -4,7 +4,7 @@
 >Purpose and Scope of this Guide</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -19,7 +19,7 @@ REL="NEXT"
 TITLE="Copyright Information"
 HREF="copyright.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -45,6 +46,7 @@ ALIGN="left"
 VALIGN="bottom"
 ><A
 HREF="about.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -58,6 +60,7 @@ ALIGN="right"
 VALIGN="bottom"
 ><A
 HREF="copyright.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,30 +69,21 @@ HREF="copyright.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="ABOUTTHISGUIDE"
->1.1. Purpose and Scope of this Guide</A
-></H1
+NAME="aboutthisguide">1.1. Purpose and Scope of this Guide</H1
 ><P
->      This document was started on September 17, 2000 by Matthew P.
-      Barnson after a great deal of procrastination updating the
-      Bugzilla FAQ, which I left untouched for nearly half a year.
-      After numerous complete rewrites and reformatting, it is the
-      document you see today.
-    </P
-><P
->      Bugzilla is simply the best piece of bug-tracking software the
+>&#13;      Bugzilla is simply the best piece of bug-tracking software the
       world has ever seen.  This document is intended to be the
       comprehensive guide to  the installation, administration,
       maintenance, and use of the Bugzilla bug-tracking system.
     </P
 ><P
->      This release of the Bugzilla Guide is the
+>&#13;      This release of the Bugzilla Guide is the
       <EM
->2.14</EM
+>2.16</EM
 > release. It is so named that it
       may match the current version of Bugzilla. The numbering
       tradition stems from that used for many free software projects,
@@ -108,40 +102,27 @@ NAME="ABOUTTHISGUIDE"
       developers, and those who enjoy a lot of pain. 
     </P
 ><P
->      Newer revisions of the Bugzilla Guide follow the numbering
+>&#13;      Newer revisions of the Bugzilla Guide follow the numbering
       conventions of the main-tree Bugzilla releases, available at
       <A
-HREF="http://www.mozilla.org/projects/bugzilla"
+HREF="http://www.bugzilla.org/"
 TARGET="_top"
->http://www.mozilla.org/projects/bugzilla</A
+>http://www.bugzilla.org/</A
 >.  Intermediate releases will have
       a minor revision number following a period.  The current version
-      of Bugzilla, as of this writing (August 10, 2001) is 2.14; if
+      of Bugzilla, as of this writing (April 2nd, 2002) is 2.16; if
       something were seriously wrong with that edition of the Guide,
       subsequent releases would receive an additional dotted-decimal
-      digit to indicate the update (2.14.1, 2.14.2, etc.).
+      digit to indicate the update (2.16.1, 2.16.2, etc.).
       Got it?  Good.
     </P
-><P
->      I wrote this in response to the enormous demand for decent
-      Bugzilla documentation. I have incorporated instructions from
-      the Bugzilla README, Frequently Asked Questions, Database Schema
-      Document, and various mailing lists to create it. Chances are,
-      there are glaring errors in this documentation; please contact
-      <TT
-CLASS="EMAIL"
->&#60;<A
-HREF="mailto:barnboy@trilobyte.net"
->barnboy@trilobyte.net</A
->&#62;</TT
-> to correct them.
-    </P
 ></DIV
 ><DIV
 CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -153,6 +134,7 @@ ALIGN="left"
 VALIGN="top"
 ><A
 HREF="about.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -161,6 +143,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -169,6 +152,7 @@ ALIGN="right"
 VALIGN="top"
 ><A
 HREF="copyright.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -184,6 +168,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="about.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
diff --git a/docs/html/administration.html b/docs/html/administration.html
index 6a107f712..c85d9acdd 100644
--- a/docs/html/administration.html
+++ b/docs/html/administration.html
@@ -4,19 +4,19 @@
 >Administering Bugzilla</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
 HREF="index.html"><LINK
 REL="PREVIOUS"
-TITLE="Win32 Installation Notes"
-HREF="win32.html"><LINK
+TITLE="Troubleshooting"
+HREF="troubleshooting.html"><LINK
 REL="NEXT"
-TITLE="Post-Installation Checklist"
-HREF="postinstall-check.html"></HEAD
+TITLE="Bugzilla Configuration"
+HREF="parameters.html"></HEAD
 ><BODY
-CLASS="CHAPTER"
+CLASS="chapter"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -25,6 +25,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -41,7 +42,8 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="win32.html"
+HREF="troubleshooting.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -54,7 +56,8 @@ WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="postinstall-check.html"
+HREF="parameters.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -63,12 +66,10 @@ HREF="postinstall-check.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="CHAPTER"
+CLASS="chapter"
 ><H1
 ><A
-NAME="ADMINISTRATION"
->Chapter 4. Administering Bugzilla</A
-></H1
+NAME="administration">Chapter 5. Administering Bugzilla</H1
 ><DIV
 CLASS="TOC"
 ><DL
@@ -77,127 +78,145 @@ CLASS="TOC"
 >Table of Contents</B
 ></DT
 ><DT
->4.1. <A
-HREF="postinstall-check.html"
->Post-Installation Checklist</A
+>5.1. <A
+HREF="parameters.html"
+>Bugzilla Configuration</A
 ></DT
 ><DT
->4.2. <A
+>5.2. <A
 HREF="useradmin.html"
 >User Administration</A
 ></DT
 ><DD
 ><DL
 ><DT
->4.2.1. <A
-HREF="useradmin.html#DEFAULTUSER"
+>5.2.1. <A
+HREF="useradmin.html#defaultuser"
 >Creating the Default User</A
 ></DT
 ><DT
->4.2.2. <A
-HREF="useradmin.html#MANAGEUSERS"
+>5.2.2. <A
+HREF="useradmin.html#manageusers"
 >Managing Other Users</A
 ></DT
+></DL
+></DD
+><DT
+>5.3. <A
+HREF="programadmin.html"
+>Product, Component, Milestone, and Version Administration</A
+></DT
 ><DD
 ><DL
 ><DT
->4.2.2.1. <A
-HREF="useradmin.html#LOGIN"
->Logging In</A
+>5.3.1. <A
+HREF="programadmin.html#products"
+>Products</A
 ></DT
 ><DT
->4.2.2.2. <A
-HREF="useradmin.html#CREATENEWUSERS"
->Creating new users</A
+>5.3.2. <A
+HREF="programadmin.html#components"
+>Components</A
 ></DT
 ><DT
->4.2.2.3. <A
-HREF="useradmin.html#DISABLEUSERS"
->Disabling Users</A
+>5.3.3. <A
+HREF="programadmin.html#versions"
+>Versions</A
 ></DT
 ><DT
->4.2.2.4. <A
-HREF="useradmin.html#MODIFYUSERS"
->Modifying Users</A
+>5.3.4. <A
+HREF="programadmin.html#milestones"
+>Milestones</A
 ></DT
 ></DL
 ></DD
-></DL
-></DD
 ><DT
->4.3. <A
-HREF="programadmin.html"
->Product, Component, Milestone, and Version
-      Administration</A
+>5.4. <A
+HREF="voting.html"
+>Voting</A
 ></DT
-><DD
-><DL
 ><DT
->4.3.1. <A
-HREF="programadmin.html#PRODUCTS"
->Products</A
+>5.5. <A
+HREF="groups.html"
+>Groups and Group Security</A
 ></DT
 ><DT
->4.3.2. <A
-HREF="programadmin.html#COMPONENTS"
->Components</A
+>5.6. <A
+HREF="security.html"
+>Bugzilla Security</A
 ></DT
 ><DT
->4.3.3. <A
-HREF="programadmin.html#VERSIONS"
->Versions</A
+>5.7. <A
+HREF="cust-templates.html"
+>Template Customisation</A
+></DT
+><DD
+><DL
+><DT
+>5.7.1. <A
+HREF="cust-templates.html#AEN1539"
+>What to Edit</A
 ></DT
 ><DT
->4.3.4. <A
-HREF="programadmin.html#MILESTONES"
->Milestones</A
+>5.7.2. <A
+HREF="cust-templates.html#AEN1558"
+>How To Edit Templates</A
 ></DT
 ><DT
->4.3.5. <A
-HREF="programadmin.html#VOTING"
->Voting</A
+>5.7.3. <A
+HREF="cust-templates.html#AEN1568"
+>Template Formats</A
 ></DT
 ><DT
->4.3.6. <A
-HREF="programadmin.html#GROUPS"
->Groups and Group Security</A
+>5.7.4. <A
+HREF="cust-templates.html#AEN1581"
+>Particular Templates</A
 ></DT
 ></DL
 ></DD
 ><DT
->4.4. <A
-HREF="security.html"
->Bugzilla Security</A
+>5.8. <A
+HREF="upgrading.html"
+>Upgrading to New Releases</A
+></DT
+><DT
+>5.9. <A
+HREF="integration.html"
+>Integrating Bugzilla with Third-Party Tools</A
+></DT
+><DD
+><DL
+><DT
+>5.9.1. <A
+HREF="integration.html#bonsai"
+>Bonsai</A
 ></DT
+><DT
+>5.9.2. <A
+HREF="integration.html#cvs"
+>CVS</A
+></DT
+><DT
+>5.9.3. <A
+HREF="integration.html#scm"
+>Perforce SCM</A
+></DT
+><DT
+>5.9.4. <A
+HREF="integration.html#tinderbox"
+>Tinderbox/Tinderbox2</A
+></DT
+></DL
+></DD
 ></DL
 ></DIV
-><FONT
-COLOR="RED"
->    Or, I just got this cool thing installed.  Now what the heck do I
-    do with it?
-  </FONT
-><P
->    So you followed <SPAN
-CLASS="QUOTE"
->"<A
-HREF="installation.html"
->Bugzilla Installation</A
->"</SPAN
-> to the
-    letter, and logged into Bugzilla for the very first time with your
-    super-duper god account.  You sit, contentedly staring at the
-    Bugzilla Query Screen, the worst of the whole mad business of
-    installing this terrific program behind you. It seems, though, you
-    have nothing yet to query! Your first act of business should be to
-    setup the operating parameters for Bugzilla so you can get busy
-    getting data into your bug tracker.
-  </P
 ></DIV
 ><DIV
 CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -208,7 +227,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="win32.html"
+HREF="troubleshooting.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -217,6 +237,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -224,7 +245,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="postinstall-check.html"
+HREF="parameters.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -233,7 +255,7 @@ HREF="postinstall-check.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->Win32 Installation Notes</TD
+>Troubleshooting</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
@@ -243,7 +265,7 @@ VALIGN="top"
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->Post-Installation Checklist</TD
+>Bugzilla Configuration</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/bonsai.html b/docs/html/bonsai.html
deleted file mode 100644
index 5be34aff5..000000000
--- a/docs/html/bonsai.html
+++ /dev/null
@@ -1,154 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->Bonsai</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="Integrating Bugzilla with Third-Party Tools"
-HREF="integration.html"><LINK
-REL="PREVIOUS"
-TITLE="Integrating Bugzilla with Third-Party Tools"
-HREF="integration.html"><LINK
-REL="NEXT"
-TITLE="CVS"
-HREF="cvs.html"></HEAD
-><BODY
-CLASS="SECTION"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="integration.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Chapter 5. Integrating Bugzilla with Third-Party Tools</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="cvs.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECTION"
-><H1
-CLASS="SECTION"
-><A
-NAME="BONSAI"
->5.1. Bonsai</A
-></H1
-><P
->Bonsai is a web-based tool for managing <A
-HREF="cvs.html"
->CVS, the Concurrent Versioning System</A
->
-      .  Using Bonsai, administrators can control open/closed status
-      of trees, query a fast relational database back-end for change,
-      branch, and comment information, and view changes made since the
-      last time the tree was closed.  These kinds of changes cause the
-      engineer responsible to be <SPAN
-CLASS="QUOTE"
->"on the hook"</SPAN
-> (include
-      cool URL link here for Hook policies at mozilla.org).  Bonsai
-      also includes gateways to <A
-HREF="tinderbox.html"
->Tinderbox, the Mozilla automated build management system</A
-> and Bugzilla </P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="integration.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="cvs.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->Integrating Bugzilla with Third-Party Tools</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="integration.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->CVS</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/bzhacking.html b/docs/html/bzhacking.html
deleted file mode 100644
index 5bb15b44f..000000000
--- a/docs/html/bzhacking.html
+++ /dev/null
@@ -1,231 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->Hacking Bugzilla</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="Useful Patches and Utilities for Bugzilla"
-HREF="patches.html"><LINK
-REL="PREVIOUS"
-TITLE="The Quicksearch Utility"
-HREF="quicksearch.html"><LINK
-REL="NEXT"
-TITLE="GNU Free Documentation License"
-HREF="gfdl.html"></HEAD
-><BODY
-CLASS="SECTION"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="quicksearch.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Appendix D. Useful Patches and Utilities for Bugzilla</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="gfdl.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECTION"
-><H1
-CLASS="SECTION"
-><A
-NAME="BZHACKING"
->D.5. Hacking Bugzilla</A
-></H1
-><P
->      What follows are some general guidelines for changing Bugzilla, and adhering to good coding practice while doing so.  We've had some checkins in the past which ruined Bugzilla installations because of disregard for these conventions.  Sorry for the lack of formatting; I got this info into the Guide on the day of 2.14 release and haven't formatted it yet.
-    </P
-><P
-CLASS="LITERALLAYOUT"
-><br>
-The&nbsp;following&nbsp;is&nbsp;a&nbsp;guide&nbsp;for&nbsp;reviewers&nbsp;when&nbsp;checking&nbsp;code&nbsp;into&nbsp;Bugzilla's<br>
-CVS&nbsp;repostory&nbsp;at&nbsp;mozilla.org.&nbsp;&nbsp;If&nbsp;you&nbsp;wish&nbsp;to&nbsp;submit&nbsp;patches&nbsp;to&nbsp;Bugzilla,<br>
-you&nbsp;should&nbsp;follow&nbsp;the&nbsp;rules&nbsp;and&nbsp;style&nbsp;conventions&nbsp;below.&nbsp;&nbsp;Any&nbsp;code&nbsp;that<br>
-does&nbsp;not&nbsp;adhere&nbsp;to&nbsp;these&nbsp;basic&nbsp;rules&nbsp;will&nbsp;not&nbsp;be&nbsp;added&nbsp;to&nbsp;Bugzilla's<br>
-codebase.<br>
-<br>
-&nbsp;1.&nbsp;Usage&nbsp;of&nbsp;variables&nbsp;in&nbsp;Regular&nbsp;Expressions<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;It&nbsp;is&nbsp;very&nbsp;important&nbsp;that&nbsp;you&nbsp;don't&nbsp;use&nbsp;a&nbsp;variable&nbsp;in&nbsp;a&nbsp;regular<br>
-&nbsp;&nbsp;&nbsp;&nbsp;expression&nbsp;unless&nbsp;that&nbsp;variable&nbsp;is&nbsp;supposed&nbsp;to&nbsp;contain&nbsp;an&nbsp;expression.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;especially&nbsp;applies&nbsp;when&nbsp;using&nbsp;grep.&nbsp;&nbsp;You&nbsp;should&nbsp;use:<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;grep&nbsp;($_&nbsp;eq&nbsp;$value,&nbsp;@array);<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;NOT&nbsp;-<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;grep&nbsp;(/$value/,&nbsp;@array);<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;you&nbsp;need&nbsp;to&nbsp;use&nbsp;a&nbsp;non-expression&nbsp;variable&nbsp;inside&nbsp;of&nbsp;an&nbsp;expression,&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;&nbsp;sure&nbsp;to&nbsp;quote&nbsp;it&nbsp;properly&nbsp;(using&nbsp;\Q..\E).<br>
-<br>
-Coding&nbsp;Style&nbsp;for&nbsp;Bugzilla<br>
--------------------------<br>
-<br>
-While&nbsp;it's&nbsp;true&nbsp;that&nbsp;not&nbsp;all&nbsp;of&nbsp;the&nbsp;code&nbsp;currently&nbsp;in&nbsp;Bugzilla&nbsp;adheres&nbsp;to<br>
-this&nbsp;styleguide,&nbsp;it&nbsp;is&nbsp;something&nbsp;that&nbsp;is&nbsp;being&nbsp;worked&nbsp;toward.&nbsp;&nbsp;Therefore,<br>
-we&nbsp;ask&nbsp;that&nbsp;all&nbsp;new&nbsp;code&nbsp;(submitted&nbsp;patches&nbsp;and&nbsp;new&nbsp;files)&nbsp;follow&nbsp;this&nbsp;guide<br>
-as&nbsp;closely&nbsp;as&nbsp;possible&nbsp;(if&nbsp;you're&nbsp;only&nbsp;changing&nbsp;1&nbsp;or&nbsp;2&nbsp;lines,&nbsp;you&nbsp;don't&nbsp;have<br>
-to&nbsp;reformat&nbsp;the&nbsp;entire&nbsp;file&nbsp;:).<br>
-<br>
-&nbsp;1.&nbsp;Whitespace<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Bugzilla's&nbsp;prefered&nbsp;indentation&nbsp;is&nbsp;4&nbsp;spaces&nbsp;(no&nbsp;tabs,&nbsp;please).<br>
-<br>
-&nbsp;2.&nbsp;Curly&nbsp;braces.<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;opening&nbsp;brace&nbsp;of&nbsp;a&nbsp;block&nbsp;should&nbsp;be&nbsp;on&nbsp;the&nbsp;same&nbsp;line&nbsp;as&nbsp;the&nbsp;statement<br>
-&nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;is&nbsp;causing&nbsp;the&nbsp;block&nbsp;and&nbsp;the&nbsp;closing&nbsp;brace&nbsp;should&nbsp;be&nbsp;at&nbsp;the&nbsp;same<br>
-&nbsp;&nbsp;&nbsp;&nbsp;indentation&nbsp;level&nbsp;as&nbsp;that&nbsp;statement,&nbsp;for&nbsp;example:<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($var)&nbsp;{<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"The&nbsp;variable&nbsp;is&nbsp;true";<br>
-&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"Try&nbsp;again";<br>
-&nbsp;&nbsp;&nbsp;&nbsp;}<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;NOT&nbsp;-<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($var)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;{<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"The&nbsp;variable&nbsp;is&nbsp;true";<br>
-&nbsp;&nbsp;&nbsp;&nbsp;}<br>
-&nbsp;&nbsp;&nbsp;&nbsp;else<br>
-&nbsp;&nbsp;&nbsp;&nbsp;{<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"Try&nbsp;again";<br>
-&nbsp;&nbsp;&nbsp;&nbsp;}<br>
-<br>
-&nbsp;3.&nbsp;File&nbsp;Names<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;names&nbsp;for&nbsp;bugzilla&nbsp;code&nbsp;and&nbsp;support&nbsp;documention&nbsp;should&nbsp;be&nbsp;legal&nbsp;across<br>
-&nbsp;&nbsp;&nbsp;&nbsp;multiple&nbsp;platforms.&nbsp;&nbsp;\&nbsp;/&nbsp;:&nbsp;*&nbsp;?&nbsp;"&nbsp;&#60;&nbsp;&#62;&nbsp;and&nbsp;|&nbsp;are&nbsp;all&nbsp;illegal&nbsp;characters&nbsp;for<br>
-&nbsp;&nbsp;&nbsp;&nbsp;filenames&nbsp;on&nbsp;various&nbsp;platforms.&nbsp;&nbsp;Also,&nbsp;file&nbsp;names&nbsp;should&nbsp;not&nbsp;have&nbsp;spaces&nbsp;in<br>
-&nbsp;&nbsp;&nbsp;&nbsp;them&nbsp;as&nbsp;they&nbsp;can&nbsp;cause&nbsp;confusion&nbsp;in&nbsp;CVS&nbsp;and&nbsp;other&nbsp;mozilla.org&nbsp;utilities.<br>
-<br>
-&nbsp;4.&nbsp;Variable&nbsp;Names<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;a&nbsp;variable&nbsp;is&nbsp;scoped&nbsp;globally&nbsp;($::variable)&nbsp;its&nbsp;name&nbsp;should&nbsp;be&nbsp;descriptive<br>
-&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;what&nbsp;it&nbsp;contains.&nbsp;&nbsp;Local&nbsp;variables&nbsp;can&nbsp;be&nbsp;named&nbsp;a&nbsp;bit&nbsp;looser,&nbsp;provided&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;&nbsp;context&nbsp;makes&nbsp;their&nbsp;content&nbsp;obvious.&nbsp;&nbsp;For&nbsp;example,&nbsp;$ret&nbsp;could&nbsp;be&nbsp;used&nbsp;as&nbsp;a<br>
-&nbsp;&nbsp;&nbsp;&nbsp;staging&nbsp;variable&nbsp;for&nbsp;a&nbsp;routine's&nbsp;return&nbsp;value&nbsp;as&nbsp;the&nbsp;line&nbsp;|return&nbsp;$ret;|&nbsp;will<br>
-&nbsp;&nbsp;&nbsp;&nbsp;make&nbsp;it&nbsp;blatently&nbsp;obvious&nbsp;what&nbsp;the&nbsp;variable&nbsp;holds&nbsp;and&nbsp;most&nbsp;likely&nbsp;be&nbsp;shown<br>
-&nbsp;&nbsp;&nbsp;&nbsp;on&nbsp;the&nbsp;same&nbsp;screen&nbsp;as&nbsp;|my&nbsp;$ret&nbsp;=&nbsp;"";|.<br>
-<br>
-&nbsp;5.&nbsp;Cross&nbsp;Database&nbsp;Compatability<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Bugzilla&nbsp;was&nbsp;originally&nbsp;written&nbsp;to&nbsp;work&nbsp;with&nbsp;MySQL&nbsp;and&nbsp;therefore&nbsp;took&nbsp;advantage<br>
-&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;some&nbsp;of&nbsp;its&nbsp;features&nbsp;that&nbsp;aren't&nbsp;contained&nbsp;in&nbsp;other&nbsp;RDBMS&nbsp;software.&nbsp;&nbsp;These<br>
-&nbsp;&nbsp;&nbsp;&nbsp;should&nbsp;be&nbsp;avoided&nbsp;in&nbsp;all&nbsp;new&nbsp;code.&nbsp;&nbsp;Examples&nbsp;of&nbsp;these&nbsp;features&nbsp;are&nbsp;enums&nbsp;and<br>
-&nbsp;&nbsp;&nbsp;&nbsp;encrypt().<br>
-<br>
-&nbsp;6.&nbsp;Cross&nbsp;Platform&nbsp;Compatability<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;While&nbsp;Bugzilla&nbsp;was&nbsp;written&nbsp;to&nbsp;be&nbsp;used&nbsp;on&nbsp;Unix&nbsp;based&nbsp;systems&nbsp;(and&nbsp;Unix/Linux&nbsp;is<br>
-&nbsp;&nbsp;&nbsp;&nbsp;still&nbsp;the&nbsp;only&nbsp;officially&nbsp;supported&nbsp;platform)&nbsp;there&nbsp;are&nbsp;many&nbsp;who&nbsp;desire/need&nbsp;to<br>
-&nbsp;&nbsp;&nbsp;&nbsp;run&nbsp;Bugzilla&nbsp;on&nbsp;Microsoft&nbsp;Windows&nbsp;boxes.&nbsp;&nbsp;Whenever&nbsp;possible,&nbsp;we&nbsp;should&nbsp;strive<br>
-&nbsp;&nbsp;&nbsp;&nbsp;not&nbsp;to&nbsp;make&nbsp;the&nbsp;lives&nbsp;of&nbsp;these&nbsp;people&nbsp;any&nbsp;more&nbsp;complicated&nbsp;and&nbsp;avoid&nbsp;doing&nbsp;things<br>
-&nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;break&nbsp;Bugzilla's&nbsp;ability&nbsp;to&nbsp;run&nbsp;on&nbsp;multiple&nbsp;operating&nbsp;systems.<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;</P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="quicksearch.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="gfdl.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->The Quicksearch Utility</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="patches.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->GNU Free Documentation License</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/cmdline.html b/docs/html/cmdline.html
index 7a1e1ba44..a3825c25a 100644
--- a/docs/html/cmdline.html
+++ b/docs/html/cmdline.html
@@ -4,7 +4,7 @@
 >Command-line Bugzilla Queries</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -13,13 +13,16 @@ REL="UP"
 TITLE="Useful Patches and Utilities for Bugzilla"
 HREF="patches.html"><LINK
 REL="PREVIOUS"
-TITLE="The setperl.csh Utility"
-HREF="setperl.html"><LINK
+TITLE="Apache 
+    mod_rewrite
+
+    magic"
+HREF="rewrite.html"><LINK
 REL="NEXT"
-TITLE="The Quicksearch Utility"
-HREF="quicksearch.html"></HEAD
+TITLE="Bugzilla Variants and Competitors"
+HREF="variants.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +31,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -44,20 +48,22 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="setperl.html"
+HREF="rewrite.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Appendix D. Useful Patches and Utilities for Bugzilla</TD
+>Appendix C. Useful Patches and Utilities for Bugzilla</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="quicksearch.html"
+HREF="variants.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,146 +72,91 @@ HREF="quicksearch.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="CMDLINE"
->D.3. Command-line Bugzilla Queries</A
-></H1
+NAME="cmdline">C.2. Command-line Bugzilla Queries</H1
 ><P
->      Users can query Bugzilla from the command line using this suite
-      of utilities.
-    </P
+>There are a suite of Unix utilities for querying Bugzilla from the 
+    command line. They live in the 
+    <TT
+CLASS="filename"
+>contrib/cmdline</TT
+> 
+    directory. However, they
+    have not yet been updated to work with 2.16 (post-templatisation.).
+    There are three files - <TT
+CLASS="filename"
+>query.conf</TT
+>, 
+    <TT
+CLASS="filename"
+>buglist</TT
+> and <TT
+CLASS="filename"
+>bugs</TT
+>.</P
 ><P
->      The query.conf file contains the mapping from options to field
-      names and comparison types.  Quoted option names are "grepped"
-      for, so it should be easy to edit this file.  Comments (#) have
-      no effect; you must make sure these lines do not contain any
-      quoted "option"
-    </P
+><TT
+CLASS="filename"
+>query.conf</TT
+> 
+    contains the mapping from options to field
+    names and comparison types. Quoted option names are "grepped" for, so it
+    should be easy to edit this file. Comments (#) have no effect; you must
+    make sure these lines do not contain any quoted "option".</P
 ><P
->      buglist is a shell script which submits a Bugzilla query and
-      writes the resulting HTML page to stdout.  It supports both
-      short options, (such as "-Afoo" or "-Rbar") and long options
-      (such as "--assignedto=foo" or "--reporter=bar").  If the first
-      character of an option is not "-", it is treated as if it were
-      prefixed with "--default=".
-    </P
+><TT
+CLASS="filename"
+>buglist</TT
+>
+    is a shell script which submits a Bugzilla query and writes
+    the resulting HTML page to stdout. It supports both short options, (such
+    as "-Afoo" or "-Rbar") and long options (such as "--assignedto=foo" or
+    "--reporter=bar"). If the first character of an option is not "-", it is
+    treated as if it were prefixed with "--default=".</P
 ><P
->      The columlist is taken from the COLUMNLIST environment variable.
-      This is equivalent to the "Change Columns" option when you list
-      bugs in buglist.cgi.  If you have already used Bugzilla, use
-      <B
-CLASS="COMMAND"
->grep COLUMLIST ~/.netscape/cookies</B
-> to see
-      your current COLUMNLIST setting.
-    </P
+>The column list is taken from the COLUMNLIST environment variable.
+    This is equivalent to the "Change Columns" option when you list bugs in
+    buglist.cgi. If you have already used Bugzilla, grep for COLUMNLIST
+    in your cookies file to see your current COLUMNLIST setting.</P
 ><P
->      bugs is a simple shell script which calls buglist and extracts
-      the bug numbers from the output.  Adding the prefix
-      "http://bugzilla.mozilla.org/buglist.cgi?bug_id=" turns the bug
-      list into a working link if any bugs are found. Counting bugs is
-      easy.  Pipe the results through <B
-CLASS="COMMAND"
->sed -e 's/,/ /g' | wc |
-	awk '{printf $2 "\n"}'</B
+><TT
+CLASS="filename"
+>bugs</TT
+> is a simple shell script which calls
+    <TT
+CLASS="filename"
+>buglist</TT
+> and extracts the
+    bug numbers from the output. Adding the prefix
+    "http://bugzilla.mozilla.org/buglist.cgi?bug_id=" turns the bug list into
+    a working link if any bugs are found. Counting bugs is easy. Pipe the
+    results through 
+    <B
+CLASS="command"
+>sed -e 's/,/ /g' | wc | awk '{printf $2 "\n"}'</B
 >
     </P
 ><P
->      Akkana says she has good results piping buglist output through
-      <B
-CLASS="COMMAND"
+>Akkana Peck says she has good results piping 
+    <TT
+CLASS="filename"
+>buglist</TT
+> output through 
+    <B
+CLASS="command"
 >w3m -T text/html -dump</B
 >
     </P
-><DIV
-CLASS="PROCEDURE"
-><OL
-TYPE="1"
-><LI
-><P
->	  Download three files:
-	</P
-><OL
-CLASS="SUBSTEPS"
-TYPE="a"
-><LI
-><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->bash$</TT
-> <B
-CLASS="COMMAND"
->wget -O
-		  query.conf
-		  'http://bugzilla.mozilla.org/showattachment.cgi?attach_id=26157'</B
-> </TT
->
-	    </P
-></LI
-><LI
-><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->bash$</TT
-> <B
-CLASS="COMMAND"
->wget -O
-		  buglist
-		  'http://bugzilla.mozilla.org/showattachment.cgi?attach_id=26944'</B
-> </TT
->
-	    </P
-></LI
-><LI
-><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->bash#</TT
-> <B
-CLASS="COMMAND"
->wget -O
-		  bugs
-		  'http://bugzilla.mozilla.org/showattachment.cgi?attach_id=26215'</B
-> </TT
->
-	    </P
-></LI
-></OL
-></LI
-><LI
-><P
->	  Make your utilities executable:
-	  <TT
-CLASS="COMPUTEROUTPUT"
->	    <TT
-CLASS="PROMPT"
->bash$</TT
->
-	    <B
-CLASS="COMMAND"
->chmod u+x buglist bugs</B
->
-	  </TT
->
-	</P
-></LI
-></OL
-></DIV
 ></DIV
 ><DIV
 CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -216,7 +167,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="setperl.html"
+HREF="rewrite.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -225,6 +177,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -232,7 +185,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="quicksearch.html"
+HREF="variants.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -241,20 +195,27 @@ HREF="quicksearch.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->The setperl.csh Utility</TD
+>Apache 
+    <TT
+CLASS="filename"
+>mod_rewrite</TT
+>
+
+    magic</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
 VALIGN="top"
 ><A
 HREF="patches.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->The Quicksearch Utility</TD
+>Bugzilla Variants and Competitors</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/contributors.html b/docs/html/contributors.html
deleted file mode 100644
index 6b87af19c..000000000
--- a/docs/html/contributors.html
+++ /dev/null
@@ -1,144 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->Contributors</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="About This Guide"
-HREF="about.html"><LINK
-REL="PREVIOUS"
-TITLE="Credits"
-HREF="credits.html"><LINK
-REL="NEXT"
-TITLE="Feedback"
-HREF="feedback.html"></HEAD
-><BODY
-CLASS="SECTION"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="credits.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Chapter 1. About This Guide</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="feedback.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECTION"
-><H1
-CLASS="SECTION"
-><A
-NAME="CONTRIBUTORS"
->1.6. Contributors</A
-></H1
-><P
->      Thanks go to these people for significant contributions to this
-      documentation (in no particular order):
-    </P
-><P
->      Andrew Pearson, Spencer Smith, Eric Hanson, Kevin Brannen, Ron
-      Teitelbaum, Jacob Steenhagen, Joe Robins
-    </P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="credits.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="feedback.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->Credits</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="about.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->Feedback</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/conventions.html b/docs/html/conventions.html
index c5bf9dcbc..40ce3f8c4 100644
--- a/docs/html/conventions.html
+++ b/docs/html/conventions.html
@@ -4,7 +4,7 @@
 >Document Conventions</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -13,13 +13,13 @@ REL="UP"
 TITLE="About This Guide"
 HREF="about.html"><LINK
 REL="PREVIOUS"
-TITLE="Translations"
-HREF="translations.html"><LINK
+TITLE="Credits"
+HREF="credits.html"><LINK
 REL="NEXT"
-TITLE="Using Bugzilla"
-HREF="using.html"></HEAD
+TITLE="Introduction"
+HREF="introduction.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -44,7 +45,8 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="translations.html"
+HREF="credits.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -57,7 +59,8 @@ WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="using.html"
+HREF="introduction.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,22 +69,17 @@ HREF="using.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="CONVENTIONS"
->1.9. Document Conventions</A
-></H1
+NAME="conventions">1.5. Document Conventions</H1
 ><P
->    This document uses the following conventions
-  </P
+>This document uses the following conventions:</P
 ><DIV
-CLASS="INFORMALTABLE"
+CLASS="informaltable"
 ><A
-NAME="AEN129"
-></A
-><P
+NAME="AEN178"><P
 ></P
 ><TABLE
 BORDER="0"
@@ -90,11 +88,11 @@ CLASS="CALSTABLE"
 ><TR
 ><TH
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Descriptions</TH
 ><TH
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Appearance</TH
 ></TR
 ></THEAD
@@ -102,17 +100,17 @@ VALIGN="TOP"
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Warnings</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><DIV
-CLASS="CAUTION"
+VALIGN="MIDDLE"
+>&#13;            <DIV
+CLASS="caution"
 ><P
 ></P
 ><TABLE
-CLASS="CAUTION"
+CLASS="caution"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -128,27 +126,28 @@ ALT="Caution"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->Warnings.</P
+>Don't run with scissors!</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
-></TD
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Hint</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><DIV
-CLASS="TIP"
+VALIGN="MIDDLE"
+>&#13;            <DIV
+CLASS="tip"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
+CLASS="tip"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -164,27 +163,28 @@ ALT="Tip"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->Hint.</P
+>Would you like a breath mint?</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
-></TD
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Notes</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><DIV
-CLASS="NOTE"
+VALIGN="MIDDLE"
+>&#13;            <DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -200,27 +200,28 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->Note.</P
+>Dear John...</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
-></TD
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Information requiring special attention</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><DIV
-CLASS="WARNING"
+VALIGN="MIDDLE"
+>&#13;            <DIV
+CLASS="warning"
 ><P
 ></P
 ><TABLE
-CLASS="WARNING"
+CLASS="warning"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -236,138 +237,151 @@ ALT="Warning"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->Warning.</P
+>Read this or the cat gets it.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
-></TD
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >File Names</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><TT
-CLASS="FILENAME"
->file.extension</TT
-></TD
+VALIGN="MIDDLE"
+>&#13;            <TT
+CLASS="filename"
+>filename</TT
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Directory Names</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><TT
-CLASS="FILENAME"
+VALIGN="MIDDLE"
+>&#13;            <TT
+CLASS="filename"
 >directory</TT
-></TD
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Commands to be typed</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><B
-CLASS="COMMAND"
+VALIGN="MIDDLE"
+>&#13;            <B
+CLASS="command"
 >command</B
-></TD
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Applications Names</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><SPAN
-CLASS="APPLICATION"
+VALIGN="MIDDLE"
+>&#13;            <SPAN
+CLASS="application"
 >application</SPAN
-></TD
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><I
-CLASS="FOREIGNPHRASE"
+VALIGN="MIDDLE"
+>&#13;          <I
+CLASS="foreignphrase"
 >Prompt</I
-> of users command under bash shell</TD
+>
+
+          of users command under bash shell</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >bash$</TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><I
-CLASS="FOREIGNPHRASE"
+VALIGN="MIDDLE"
+>&#13;          <I
+CLASS="foreignphrase"
 >Prompt</I
-> of root users command under bash shell</TD
+>
+
+          of root users command under bash shell</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >bash#</TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><I
-CLASS="FOREIGNPHRASE"
+VALIGN="MIDDLE"
+>&#13;          <I
+CLASS="foreignphrase"
 >Prompt</I
-> of user command under tcsh shell</TD
+>
+
+          of user command under tcsh shell</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >tcsh$</TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Environment Variables</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><TT
-CLASS="ENVAR"
+VALIGN="MIDDLE"
+>&#13;            <TT
+CLASS="envar"
 >VARIABLE</TT
-></TD
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Emphasized word</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><EM
+VALIGN="MIDDLE"
+>&#13;            <EM
 >word</EM
-></TD
+>
+          </TD
 ></TR
 ><TR
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
+VALIGN="MIDDLE"
 >Code Example</TD
 ><TD
 ALIGN="LEFT"
-VALIGN="TOP"
-><TABLE
+VALIGN="MIDDLE"
+>&#13;            <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -376,19 +390,22 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
+CLASS="programlisting"
 ><TT
-CLASS="SGMLTAG"
+CLASS="sgmltag"
 >&#60;para&#62;</TT
->Beginning and end of paragraph<TT
-CLASS="SGMLTAG"
+>
+Beginning and end of paragraph
+<TT
+CLASS="sgmltag"
 >&#60;/para&#62;</TT
 ></PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
-></TD
+>
+          </TD
 ></TR
 ></TBODY
 ></TABLE
@@ -401,6 +418,7 @@ CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -411,7 +429,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="translations.html"
+HREF="credits.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -420,6 +439,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -427,7 +447,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="using.html"
+HREF="introduction.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -436,20 +457,21 @@ HREF="using.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->Translations</TD
+>Credits</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
 VALIGN="top"
 ><A
 HREF="about.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->Using Bugzilla</TD
+>Introduction</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/copyright.html b/docs/html/copyright.html
index f480206d2..8501809e6 100644
--- a/docs/html/copyright.html
+++ b/docs/html/copyright.html
@@ -4,7 +4,7 @@
 >Copyright Information</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -13,13 +13,13 @@ REL="UP"
 TITLE="About This Guide"
 HREF="about.html"><LINK
 REL="PREVIOUS"
-TITLE="Purpose and Scope of this Guide"
-HREF="aboutthisguide.html"><LINK
+TITLE="About This Guide"
+HREF="about.html"><LINK
 REL="NEXT"
 TITLE="Disclaimer"
 HREF="disclaimer.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -44,7 +45,8 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="aboutthisguide.html"
+HREF="about.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -58,6 +60,7 @@ ALIGN="right"
 VALIGN="bottom"
 ><A
 HREF="disclaimer.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,17 +69,13 @@ HREF="disclaimer.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="COPYRIGHT"
->1.2. Copyright Information</A
-></H1
+NAME="copyright">1.1. Copyright Information</H1
 ><A
-NAME="AEN70"
-></A
-><TABLE
+NAME="AEN31"><TABLE
 BORDER="0"
 WIDTH="100%"
 CELLSPACING="0"
@@ -91,13 +90,12 @@ VALIGN="TOP"
 WIDTH="80%"
 VALIGN="TOP"
 ><P
->	Permission is granted to copy, distribute and/or modify this
+>&#13;	Permission is granted to copy, distribute and/or modify this
 	document under the terms of the GNU Free Documentation
 	License, Version 1.1 or any later version published  by the
 	Free Software Foundation; with no Invariant Sections, no
 	Front-Cover Texts, and  with no Back-Cover Texts.  A copy of
-	the license is included in the section entitled  "GNU Free
-	Documentation LIcense".
+	the license is included below.
       </P
 ></TD
 ><TD
@@ -111,8 +109,8 @@ COLSPAN="2"
 ALIGN="RIGHT"
 VALIGN="TOP"
 >--<SPAN
-CLASS="ATTRIBUTION"
->Copyright (c) 2000-2001 Matthew P. Barnson</SPAN
+CLASS="attribution"
+>Copyright (c) 2000-2002 Matthew P. Barnson and The Bugzilla Team</SPAN
 ></TD
 ><TD
 WIDTH="10%"
@@ -120,16 +118,488 @@ WIDTH="10%"
 ></TR
 ></TABLE
 ><P
->      If you have any questions regarding this document, its
+>&#13;      If you have any questions regarding this document, its
       copyright, or publishing this document in non-electronic form,
-      please contact Matthew P. Barnson. 
+      please contact The Bugzilla Team. 
     </P
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="gfdl">1.1.1. GNU Free Documentation License</H2
+><P
+>Version 1.1, March 2000</P
+><A
+NAME="AEN38"><BLOCKQUOTE
+CLASS="BLOCKQUOTE"
+><P
+>Copyright (C) 2000 Free Software Foundation, Inc. 59 Temple Place,
+    Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and
+    distribute verbatim copies of this license document, but changing it is
+    not allowed.</P
+></BLOCKQUOTE
+><DIV
+CLASS="section"
+><H3
+CLASS="section"
+><A
+NAME="gfdl-0">0. PREAMBLE</H3
+><P
+>The purpose of this License is to make a manual, textbook, or other
+    written document "free" in the sense of freedom: to assure everyone the
+    effective freedom to copy and redistribute it, with or without modifying
+    it, either commercially or noncommercially. Secondarily, this License
+    preserves for the author and publisher a way to get credit for their
+    work, while not being considered responsible for modifications made by
+    others.</P
+><P
+>This License is a kind of "copyleft", which means that derivative
+    works of the document must themselves be free in the same sense. It
+    complements the GNU General Public License, which is a copyleft license
+    designed for free software.</P
+><P
+>We have designed this License in order to use it for manuals for
+    free software, because free software needs free documentation: a free
+    program should come with manuals providing the same freedoms that the
+    software does. But this License is not limited to software manuals; it
+    can be used for any textual work, regardless of subject matter or whether
+    it is published as a printed book. We recommend this License principally
+    for works whose purpose is instruction or reference.</P
+></DIV
+><DIV
+CLASS="section"
+><H3
+CLASS="section"
+><A
+NAME="gfdl-1">1. APPLICABILITY AND DEFINITIONS</H3
+><P
+>This License applies to any manual or other work that contains a
+    notice placed by the copyright holder saying it can be distributed under
+    the terms of this License. The "Document", below, refers to any such
+    manual or work. Any member of the public is a licensee, and is addressed
+    as "you".</P
+><P
+>A "Modified Version" of the Document means any work containing the
+    Document or a portion of it, either copied verbatim, or with
+    modifications and/or translated into another language.</P
+><P
+>A "Secondary Section" is a named appendix or a front-matter section
+    of the Document that deals exclusively with the relationship of the
+    publishers or authors of the Document to the Document's overall subject
+    (or to related matters) and contains nothing that could fall directly
+    within that overall subject. (For example, if the Document is in part a
+    textbook of mathematics, a Secondary Section may not explain any
+    mathematics.) The relationship could be a matter of historical connection
+    with the subject or with related matters, or of legal, commercial,
+    philosophical, ethical or political position regarding them.</P
+><P
+>The "Invariant Sections" are certain Secondary Sections whose
+    titles are designated, as being those of Invariant Sections, in the
+    notice that says that the Document is released under this License.</P
+><P
+>The "Cover Texts" are certain short passages of text that are
+    listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says
+    that the Document is released under this License.</P
+><P
+>A "Transparent" copy of the Document means a machine-readable copy,
+    represented in a format whose specification is available to the general
+    public, whose contents can be viewed and edited directly and
+    straightforwardly with generic text editors or (for images composed of
+    pixels) generic paint programs or (for drawings) some widely available
+    drawing editor, and that is suitable for input to text formatters or for
+    automatic translation to a variety of formats suitable for input to text
+    formatters. A copy made in an otherwise Transparent file format whose
+    markup has been designed to thwart or discourage subsequent modification
+    by readers is not Transparent. A copy that is not "Transparent" is called
+    "Opaque".</P
+><P
+>Examples of suitable formats for Transparent copies include plain
+    ASCII without markup, Texinfo input format, LaTeX input format, SGML or
+    XML using a publicly available DTD, and standard-conforming simple HTML
+    designed for human modification. Opaque formats include PostScript, PDF,
+    proprietary formats that can be read and edited only by proprietary word
+    processors, SGML or XML for which the DTD and/or processing tools are not
+    generally available, and the machine-generated HTML produced by some word
+    processors for output purposes only.</P
+><P
+>The "Title Page" means, for a printed book, the title page itself,
+    plus such following pages as are needed to hold, legibly, the material
+    this License requires to appear in the title page. For works in formats
+    which do not have any title page as such, "Title Page" means the text
+    near the most prominent appearance of the work's title, preceding the
+    beginning of the body of the text.</P
+></DIV
+><DIV
+CLASS="section"
+><H3
+CLASS="section"
+><A
+NAME="gfdl-2">2. VERBATIM COPYING</H3
+><P
+>You may copy and distribute the Document in any medium, either
+    commercially or noncommercially, provided that this License, the
+    copyright notices, and the license notice saying this License applies to
+    the Document are reproduced in all copies, and that you add no other
+    conditions whatsoever to those of this License. You may not use technical
+    measures to obstruct or control the reading or further copying of the
+    copies you make or distribute. However, you may accept compensation in
+    exchange for copies. If you distribute a large enough number of copies
+    you must also follow the conditions in section 3.</P
+><P
+>You may also lend copies, under the same conditions stated above,
+    and you may publicly display copies.</P
+></DIV
+><DIV
+CLASS="section"
+><H3
+CLASS="section"
+><A
+NAME="gfdl-3">3. COPYING IN QUANTITY</H3
+><P
+>If you publish printed copies of the Document numbering more than
+    100, and the Document's license notice requires Cover Texts, you must
+    enclose the copies in covers that carry, clearly and legibly, all these
+    Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts
+    on the back cover. Both covers must also clearly and legibly identify you
+    as the publisher of these copies. The front cover must present the full
+    title with all words of the title equally prominent and visible. You may
+    add other material on the covers in addition. Copying with changes
+    limited to the covers, as long as they preserve the title of the Document
+    and satisfy these conditions, can be treated as verbatim copying in other
+    respects.</P
+><P
+>If the required texts for either cover are too voluminous to fit
+    legibly, you should put the first ones listed (as many as fit reasonably)
+    on the actual cover, and continue the rest onto adjacent pages.</P
+><P
+>If you publish or distribute Opaque copies of the Document
+    numbering more than 100, you must either include a machine-readable
+    Transparent copy along with each Opaque copy, or state in or with each
+    Opaque copy a publicly-accessible computer-network location containing a
+    complete Transparent copy of the Document, free of added material, which
+    the general network-using public has access to download anonymously at no
+    charge using public-standard network protocols. If you use the latter
+    option, you must take reasonably prudent steps, when you begin
+    distribution of Opaque copies in quantity, to ensure that this
+    Transparent copy will remain thus accessible at the stated location until
+    at least one year after the last time you distribute an Opaque copy
+    (directly or through your agents or retailers) of that edition to the
+    public.</P
+><P
+>It is requested, but not required, that you contact the authors of
+    the Document well before redistributing any large number of copies, to
+    give them a chance to provide you with an updated version of the
+    Document.</P
+></DIV
+><DIV
+CLASS="section"
+><H3
+CLASS="section"
+><A
+NAME="gfdl-4">4. MODIFICATIONS</H3
+><P
+>You may copy and distribute a Modified Version of the Document
+    under the conditions of sections 2 and 3 above, provided that you release
+    the Modified Version under precisely this License, with the Modified
+    Version filling the role of the Document, thus licensing distribution and
+    modification of the Modified Version to whoever possesses a copy of it.
+    In addition, you must do these things in the Modified Version:</P
+><P
+></P
+><OL
+TYPE="A"
+><LI
+><P
+>Use in the Title Page (and on the covers, if any) a title
+        distinct from that of the Document, and from those of previous
+        versions (which should, if there were any, be listed in the History
+        section of the Document). You may use the same title as a previous
+        version if the original publisher of that version gives
+        permission.</P
+></LI
+><LI
+><P
+>List on the Title Page, as authors, one or more persons or
+        entities responsible for authorship of the modifications in the
+        Modified Version, together with at least five of the principal
+        authors of the Document (all of its principal authors, if it has less
+        than five).</P
+></LI
+><LI
+><P
+>State on the Title page the name of the publisher of the
+        Modified Version, as the publisher.</P
+></LI
+><LI
+><P
+>Preserve all the copyright notices of the Document.</P
+></LI
+><LI
+><P
+>Add an appropriate copyright notice for your modifications
+        adjacent to the other copyright notices.</P
+></LI
+><LI
+><P
+>Include, immediately after the copyright notices, a license
+        notice giving the public permission to use the Modified Version under
+        the terms of this License, in the form shown in the Addendum
+        below.</P
+></LI
+><LI
+><P
+>Preserve in that license notice the full lists of Invariant
+        Sections and required Cover Texts given in the Document's license
+        notice.</P
+></LI
+><LI
+><P
+>Include an unaltered copy of this License.</P
+></LI
+><LI
+><P
+>Preserve the section entitled "History", and its title, and add
+        to it an item stating at least the title, year, new authors, and
+        publisher of the Modified Version as given on the Title Page. If
+        there is no section entitled "History" in the Document, create one
+        stating the title, year, authors, and publisher of the Document as
+        given on its Title Page, then add an item describing the Modified
+        Version as stated in the previous sentence.</P
+></LI
+><LI
+><P
+>Preserve the network location, if any, given in the Document
+        for public access to a Transparent copy of the Document, and likewise
+        the network locations given in the Document for previous versions it
+        was based on. These may be placed in the "History" section. You may
+        omit a network location for a work that was published at least four
+        years before the Document itself, or if the original publisher of the
+        version it refers to gives permission.</P
+></LI
+><LI
+><P
+>In any section entitled "Acknowledgements" or "Dedications",
+        preserve the section's title, and preserve in the section all the
+        substance and tone of each of the contributor acknowledgements and/or
+        dedications given therein.</P
+></LI
+><LI
+><P
+>Preserve all the Invariant Sections of the Document, unaltered
+        in their text and in their titles. Section numbers or the equivalent
+        are not considered part of the section titles.</P
+></LI
+><LI
+><P
+>Delete any section entitled "Endorsements". Such a section may
+        not be included in the Modified Version.</P
+></LI
+><LI
+><P
+>Do not retitle any existing section as "Endorsements" or to
+        conflict in title with any Invariant Section.</P
+></LI
+></OL
+><P
+>If the Modified Version includes new front-matter sections or
+    appendices that qualify as Secondary Sections and contain no material
+    copied from the Document, you may at your option designate some or all of
+    these sections as invariant. To do this, add their titles to the list of
+    Invariant Sections in the Modified Version's license notice. These titles
+    must be distinct from any other section titles.</P
+><P
+>You may add a section entitled "Endorsements", provided it contains
+    nothing but endorsements of your Modified Version by various parties--for
+    example, statements of peer review or that the text has been approved by
+    an organization as the authoritative definition of a standard.</P
+><P
+>You may add a passage of up to five words as a Front-Cover Text,
+    and a passage of up to 25 words as a Back-Cover Text, to the end of the
+    list of Cover Texts in the Modified Version. Only one passage of
+    Front-Cover Text and one of Back-Cover Text may be added by (or through
+    arrangements made by) any one entity. If the Document already includes a
+    cover text for the same cover, previously added by you or by arrangement
+    made by the same entity you are acting on behalf of, you may not add
+    another; but you may replace the old one, on explicit permission from the
+    previous publisher that added the old one.</P
+><P
+>The author(s) and publisher(s) of the Document do not by this
+    License give permission to use their names for publicity for or to assert
+    or imply endorsement of any Modified Version.</P
+></DIV
+><DIV
+CLASS="section"
+><H3
+CLASS="section"
+><A
+NAME="gfdl-5">5. COMBINING DOCUMENTS</H3
+><P
+>You may combine the Document with other documents released under
+    this License, under the terms defined in section 4 above for modified
+    versions, provided that you include in the combination all of the
+    Invariant Sections of all of the original documents, unmodified, and list
+    them all as Invariant Sections of your combined work in its license
+    notice.</P
+><P
+>The combined work need only contain one copy of this License, and
+    multiple identical Invariant Sections may be replaced with a single copy.
+    If there are multiple Invariant Sections with the same name but different
+    contents, make the title of each such section unique by adding at the end
+    of it, in parentheses, the name of the original author or publisher of
+    that section if known, or else a unique number. Make the same adjustment
+    to the section titles in the list of Invariant Sections in the license
+    notice of the combined work.</P
+><P
+>In the combination, you must combine any sections entitled
+    "History" in the various original documents, forming one section entitled
+    "History"; likewise combine any sections entitled "Acknowledgements", and
+    any sections entitled "Dedications". You must delete all sections
+    entitled "Endorsements."</P
+></DIV
+><DIV
+CLASS="section"
+><H3
+CLASS="section"
+><A
+NAME="gfdl-6">6. COLLECTIONS OF DOCUMENTS</H3
+><P
+>You may make a collection consisting of the Document and other
+    documents released under this License, and replace the individual copies
+    of this License in the various documents with a single copy that is
+    included in the collection, provided that you follow the rules of this
+    License for verbatim copying of each of the documents in all other
+    respects.</P
+><P
+>You may extract a single document from such a collection, and
+    distribute it individually under this License, provided you insert a copy
+    of this License into the extracted document, and follow this License in
+    all other respects regarding verbatim copying of that document.</P
+></DIV
+><DIV
+CLASS="section"
+><H3
+CLASS="section"
+><A
+NAME="gfdl-7">7. AGGREGATION WITH INDEPENDENT WORKS</H3
+><P
+>A compilation of the Document or its derivatives with other
+    separate and independent documents or works, in or on a volume of a
+    storage or distribution medium, does not as a whole count as a Modified
+    Version of the Document, provided no compilation copyright is claimed for
+    the compilation. Such a compilation is called an "aggregate", and this
+    License does not apply to the other self-contained works thus compiled
+    with the Document, on account of their being thus compiled, if they are
+    not themselves derivative works of the Document.</P
+><P
+>If the Cover Text requirement of section 3 is applicable to these
+    copies of the Document, then if the Document is less than one quarter of
+    the entire aggregate, the Document's Cover Texts may be placed on covers
+    that surround only the Document within the aggregate. Otherwise they must
+    appear on covers around the whole aggregate.</P
+></DIV
+><DIV
+CLASS="section"
+><H3
+CLASS="section"
+><A
+NAME="gfdl-8">8. TRANSLATION</H3
+><P
+>Translation is considered a kind of modification, so you may
+    distribute translations of the Document under the terms of section 4.
+    Replacing Invariant Sections with translations requires special
+    permission from their copyright holders, but you may include translations
+    of some or all Invariant Sections in addition to the original versions of
+    these Invariant Sections. You may include a translation of this License
+    provided that you also include the original English version of this
+    License. In case of a disagreement between the translation and the
+    original English version of this License, the original English version
+    will prevail.</P
+></DIV
+><DIV
+CLASS="section"
+><H3
+CLASS="section"
+><A
+NAME="gfdl-9">9. TERMINATION</H3
+><P
+>You may not copy, modify, sublicense, or distribute the Document
+    except as expressly provided for under this License. Any other attempt to
+    copy, modify, sublicense or distribute the Document is void, and will
+    automatically terminate your rights under this License. However, parties
+    who have received copies, or rights, from you under this License will not
+    have their licenses terminated so long as such parties remain in full
+    compliance.</P
+></DIV
+><DIV
+CLASS="section"
+><H3
+CLASS="section"
+><A
+NAME="gfdl-10">10. FUTURE REVISIONS OF THIS LICENSE</H3
+><P
+>The Free Software Foundation may publish new, revised versions of
+    the GNU Free Documentation License from time to time. Such new versions
+    will be similar in spirit to the present version, but may differ in
+    detail to address new problems or concerns. See 
+    <A
+HREF="http://www.gnu.org/copyleft/"
+TARGET="_top"
+>&#13;    http://www.gnu.org/copyleft/</A
+>
+
+    .</P
+><P
+>Each version of the License is given a distinguishing version
+    number. If the Document specifies that a particular numbered version of
+    this License "or any later version" applies to it, you have the option of
+    following the terms and conditions either of that specified version or of
+    any later version that has been published (not as a draft) by the Free
+    Software Foundation. If the Document does not specify a version number of
+    this License, you may choose any version ever published (not as a draft)
+    by the Free Software Foundation.</P
+></DIV
+><DIV
+CLASS="section"
+><H3
+CLASS="section"
+><A
+NAME="gfdl-howto">How to use this License for your documents</H3
+><P
+>To use this License in a document you have written, include a copy
+    of the License in the document and put the following copyright and
+    license notices just after the title page:</P
+><A
+NAME="AEN128"><BLOCKQUOTE
+CLASS="BLOCKQUOTE"
+><P
+>Copyright (c) YEAR YOUR NAME. Permission is granted to copy,
+      distribute and/or modify this document under the terms of the GNU Free
+      Documentation License, Version 1.1 or any later version published by
+      the Free Software Foundation; with the Invariant Sections being LIST
+      THEIR TITLES, with the Front-Cover Texts being LIST, and with the
+      Back-Cover Texts being LIST. A copy of the license is included in the
+      section entitled "GNU Free Documentation License".</P
+></BLOCKQUOTE
+><P
+>If you have no Invariant Sections, write "with no Invariant
+    Sections" instead of saying which ones are invariant. If you have no
+    Front-Cover Texts, write "no Front-Cover Texts" instead of "Front-Cover
+    Texts being LIST"; likewise for Back-Cover Texts.</P
+><P
+>If your document contains nontrivial examples of program code, we
+    recommend releasing these examples in parallel under your choice of free
+    software license, such as the GNU General Public License, to permit their
+    use in free software.</P
+></DIV
+></DIV
 ></DIV
 ><DIV
 CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -140,7 +610,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="aboutthisguide.html"
+HREF="about.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -149,6 +620,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -157,6 +629,7 @@ ALIGN="right"
 VALIGN="top"
 ><A
 HREF="disclaimer.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -165,13 +638,14 @@ HREF="disclaimer.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->Purpose and Scope of this Guide</TD
+>About This Guide</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
 VALIGN="top"
 ><A
 HREF="about.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
diff --git a/docs/html/credits.html b/docs/html/credits.html
index 1c177276b..a15f56fb7 100644
--- a/docs/html/credits.html
+++ b/docs/html/credits.html
@@ -4,7 +4,7 @@
 >Credits</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -16,10 +16,10 @@ REL="PREVIOUS"
 TITLE="New Versions"
 HREF="newversions.html"><LINK
 REL="NEXT"
-TITLE="Contributors"
-HREF="contributors.html"></HEAD
+TITLE="Document Conventions"
+HREF="conventions.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -45,6 +46,7 @@ ALIGN="left"
 VALIGN="bottom"
 ><A
 HREF="newversions.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -57,7 +59,8 @@ WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="contributors.html"
+HREF="conventions.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,21 +69,28 @@ HREF="contributors.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="CREDITS"
->1.5. Credits</A
-></H1
+NAME="credits">1.4. Credits</H1
 ><P
->      The people listed below have made enormous contributions to the
-      creation of this Guide, through their dedicated hacking efforts,
+>&#13;      The people listed below have made enormous contributions to the
+      creation of this Guide, through their writing, dedicated hacking efforts,
       numerous e-mail and IRC support sessions, and overall excellent
       contribution to the Bugzilla community:
     </P
 ><P
->      <A
+>&#13;      <A
+HREF="mailto://mbarnson@sisna.com"
+TARGET="_top"
+>Matthew P. Barnson</A
+>
+      for the Herculaean task of pulling together the Bugzilla Guide and
+      shepherding it to 2.14.
+    </P
+><P
+>&#13;      <A
 HREF="mailto://terry@mozilla.org"
 TARGET="_top"
 >Terry Weissman</A
@@ -89,26 +99,26 @@ TARGET="_top"
       README upon which the UNIX installation documentation is largely based.
     </P
 ><P
->      <A
+>&#13;      <A
 HREF="mailto://tara@tequilarista.org"
 TARGET="_top"
->Tara
-	Hernandez</A
->  for keeping Bugzilla development going
-      strong after Terry left Mozilla.org
+>Tara Hernandez</A
+>  
+      for keeping Bugzilla development going
+      strong after Terry left mozilla.org
     </P
 ><P
->      <A
+>&#13;      <A
 HREF="mailto://dkl@redhat.com"
 TARGET="_top"
 >Dave Lawrence</A
-> for
-      providing insight into the key differences between Red Hat's
+> 
+      for providing insight into the key differences between Red Hat's
       customized Bugzilla, and being largely responsible for the "Red
       Hat Bugzilla" appendix
     </P
 ><P
->      <A
+>&#13;      <A
 HREF="mailto://endico@mozilla.org"
 TARGET="_top"
 >Dawn Endico</A
@@ -117,18 +127,28 @@ TARGET="_top"
       questions and arguments on irc.mozilla.org in #mozwebtools
     </P
 ><P
->      Last but not least, all the members of the <A
+>&#13;      Last but not least, all the members of the 
+      <A
 HREF="news://news.mozilla.org/netscape/public/mozilla/webtools"
 TARGET="_top"
 > netscape.public.mozilla.webtools</A
 > newsgroup.  Without your discussions, insight, suggestions, and patches, this could never have happened.
     </P
+><P
+>&#13;      Thanks also go to the following people for significant contributions 
+      to this documentation (in no particular order):
+    </P
+><P
+>&#13;      Zach Liption, Andrew Pearson, Spencer Smith, Eric Hanson, Kevin Brannen,
+      Ron Teitelbaum, Jacob Steenhagen, Joe Robins, Gervase Markham.
+    </P
 ></DIV
 ><DIV
 CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -140,6 +160,7 @@ ALIGN="left"
 VALIGN="top"
 ><A
 HREF="newversions.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -148,6 +169,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -155,7 +177,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="contributors.html"
+HREF="conventions.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -171,13 +194,14 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="about.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->Contributors</TD
+>Document Conventions</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/cust-templates.html b/docs/html/cust-templates.html
new file mode 100644
index 000000000..7987f2aba
--- /dev/null
+++ b/docs/html/cust-templates.html
@@ -0,0 +1,585 @@
+<HTML
+><HEAD
+><TITLE
+>Template Customisation</TITLE
+><META
+NAME="GENERATOR"
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
+"><LINK
+REL="HOME"
+TITLE="The Bugzilla Guide"
+HREF="index.html"><LINK
+REL="UP"
+TITLE="Administering Bugzilla"
+HREF="administration.html"><LINK
+REL="PREVIOUS"
+TITLE="Bugzilla Security"
+HREF="security.html"><LINK
+REL="NEXT"
+TITLE="Upgrading to New Releases"
+HREF="upgrading.html"></HEAD
+><BODY
+CLASS="section"
+BGCOLOR="#FFFFFF"
+TEXT="#000000"
+LINK="#0000FF"
+VLINK="#840084"
+ALINK="#0000FF"
+><DIV
+CLASS="NAVHEADER"
+><TABLE
+SUMMARY="Header navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TH
+COLSPAN="3"
+ALIGN="center"
+>The Bugzilla Guide</TH
+></TR
+><TR
+><TD
+WIDTH="10%"
+ALIGN="left"
+VALIGN="bottom"
+><A
+HREF="security.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="80%"
+ALIGN="center"
+VALIGN="bottom"
+>Chapter 5. Administering Bugzilla</TD
+><TD
+WIDTH="10%"
+ALIGN="right"
+VALIGN="bottom"
+><A
+HREF="upgrading.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+></TABLE
+><HR
+ALIGN="LEFT"
+WIDTH="100%"></DIV
+><DIV
+CLASS="section"
+><H1
+CLASS="section"
+><A
+NAME="cust-templates">5.7. Template Customisation</H1
+><P
+>&#13;      One of the large changes for 2.16 was the templatisation of the
+      entire user-facing UI, using the 
+      <A
+HREF="http://www.template-toolkit.org"
+TARGET="_top"
+>Template Toolkit</A
+>.
+      Administrators can now configure the look and feel of Bugzilla without
+      having to edit Perl files or face the nightmare of massive merge
+      conflicts when they upgrade to a newer version in the future.
+    </P
+><P
+>&#13;      Templatisation also makes localised versions of Bugzilla possible, 
+      for the first time. In the future, a Bugzilla installation may
+      have templates installed for multiple localisations, and select
+      which ones to use based on the user's browser language setting.      
+    </P
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="AEN1539">5.7.1. What to Edit</H2
+><P
+>&#13;        There are two different ways of editing of Bugzilla's templates,
+        and which you use depends mainly on how you upgrade Bugzilla. The
+        template directory structure is that there's a top level directory,
+        <TT
+CLASS="filename"
+>template</TT
+>, which contains a directory for
+        each installed localisation. The default English templates are
+        therefore in <TT
+CLASS="filename"
+>en</TT
+>. Underneath that, there
+        is the <TT
+CLASS="filename"
+>default</TT
+> directory and optionally the 
+        <TT
+CLASS="filename"
+>custom</TT
+> directory. The <TT
+CLASS="filename"
+>default</TT
+>
+        directory contains all the templates shipped with Bugzilla, whereas
+        the <TT
+CLASS="filename"
+>custom</TT
+> directory does not exist at first and
+        must be created if you want to use it.
+      </P
+><P
+>&#13;        The first method of making customisations is to directly edit the
+        templates in <TT
+CLASS="filename"
+>template/en/default</TT
+>. This is
+        probably the best method for small changes if you are going to use
+        the CVS method of upgrading, because if you then execute a
+        <B
+CLASS="command"
+>cvs update</B
+>, any template fixes will get
+        automagically merged into your modified versions.
+      </P
+><P
+>&#13;        If you use this method, your installation will break if CVS conflicts
+        occur.
+      </P
+><P
+>&#13;        The other method is to copy the templates into a mirrored directory
+        structure under <TT
+CLASS="filename"
+>template/en/custom</TT
+>.  The templates
+        in this directory automatically override those in default.  
+        This is the technique you
+        need to use if you use the overwriting method of upgrade, because
+        otherwise your changes will be lost.  This method is also better if
+        you are using the CVS method of upgrading and are going to make major
+        changes, because it is guaranteed that the contents of this directory
+        will not be touched during an upgrade, and you can then decide whether
+        to continue using your own templates, or make the effort to merge your
+        changes into the new versions by hand.
+      </P
+><P
+>&#13;        If you use this method, your installation may break if incompatible
+        changes are made to the template interface.  If such changes are made
+        they will be documented in the release notes, provided you are using a
+        stable release of Bugzilla.  If you use using unstable code, you will
+        need to deal with this one yourself, although if possible the changes
+        will be mentioned before they occur in the deprecations section of the
+        previous stable release's release notes.
+      </P
+><DIV
+CLASS="note"
+><P
+></P
+><TABLE
+CLASS="note"
+WIDTH="100%"
+BORDER="0"
+><TR
+><TD
+WIDTH="25"
+ALIGN="CENTER"
+VALIGN="TOP"
+><IMG
+SRC="../images/note.gif"
+HSPACE="5"
+ALT="Note"></TD
+><TD
+ALIGN="LEFT"
+VALIGN="TOP"
+><P
+>&#13;          Don't directly edit the compiled templates in 
+          <TT
+CLASS="filename"
+>data/template/*</TT
+> - your
+          changes will be lost when Template Toolkit recompiles them.
+        </P
+></TD
+></TR
+></TABLE
+></DIV
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="AEN1558">5.7.2. How To Edit Templates</H2
+><P
+>&#13;        The syntax of the Template Toolkit language is beyond the scope of
+        this guide. It's reasonably easy to pick up by looking at the current 
+        templates; or, you can read the manual, available on the
+        <A
+HREF="http://www.template-toolkit.org"
+TARGET="_top"
+>Template Toolkit home
+        page</A
+>. However, you should particularly remember (for security
+        reasons) to always HTML filter things which come from the database or
+        user input, to prevent cross-site scripting attacks.
+      </P
+><P
+>&#13;        However, one thing you should take particular care about is the need
+        to properly HTML filter data that has been passed into the template.
+        This means that if the data can possibly contain special HTML characters
+        such as &#60;, and the data was not intended to be HTML, they need to be
+        converted to entity form, ie &#38;lt;.  You use the 'html' filter in the
+        Template Toolkit to do this.  If you fail to do this, you may open up
+        your installation to cross-site scripting attacks.
+      </P
+><P
+>&#13;        Also note that Bugzilla adds a few filters of its own, that are not
+        in standard Template Toolkit.  In particular, the 'url_quote' filter
+        can convert characters that are illegal or have special meaning in URLs,
+        such as &#38;, to the encoded form, ie %26.  This actually encodes most
+        characters (but not the common ones such as letters and numbers and so
+        on), including the HTML-special characters, so there's never a need to
+        HTML filter afterwards.
+      </P
+><P
+>&#13;        Editing templates is a good way of doing a "poor man's custom fields".
+        For example, if you don't use the Status Whiteboard, but want to have
+        a free-form text entry box for "Build Identifier", then you can just
+        edit the templates to change the field labels. It's still be called
+        status_whiteboard internally, but your users don't need to know that.
+      </P
+><DIV
+CLASS="note"
+><P
+></P
+><TABLE
+CLASS="note"
+WIDTH="100%"
+BORDER="0"
+><TR
+><TD
+WIDTH="25"
+ALIGN="CENTER"
+VALIGN="TOP"
+><IMG
+SRC="../images/note.gif"
+HSPACE="5"
+ALT="Note"></TD
+><TD
+ALIGN="LEFT"
+VALIGN="TOP"
+><P
+>&#13;          If you are making template changes that you intend on submitting back
+          for inclusion in standard Bugzilla, you should read the relevant
+          sections of the 
+          <A
+HREF="http://www.bugzilla.org/developerguide.html"
+TARGET="_top"
+>Developers'
+          Guide</A
+>.
+        </P
+></TD
+></TR
+></TABLE
+></DIV
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="AEN1568">5.7.3. Template Formats</H2
+><P
+>&#13;        Some CGIs have the ability to use more than one template. For
+        example, buglist.cgi can output bug lists as RDF or two
+        different forms of HTML (complex and simple). (Try this out
+        by appending <TT
+CLASS="filename"
+>&#38;format=simple</TT
+> to a buglist.cgi
+        URL on your Bugzilla installation.) This
+        mechanism, called template 'formats', is extensible.
+      </P
+><P
+>&#13;        To see if a CGI supports multiple output formats, grep the
+        CGI for "ValidateOutputFormat". If it's not present, adding
+        multiple format support isn't too hard - see how it's done in
+        other CGIs.
+      </P
+><P
+>&#13;        To make a new format template for a CGI which supports this, 
+        open a current template for
+        that CGI and take note of the INTERFACE comment (if present.) This 
+        comment defines what variables are passed into this template. If 
+        there isn't one, I'm afraid you'll have to read the template and
+        the code to find out what information you get. 
+      </P
+><P
+>&#13;        Write your template in whatever markup or text style is appropriate.
+      </P
+><P
+>&#13;        You now need to decide what content type you want your template
+        served as. Open up the <TT
+CLASS="filename"
+>localconfig</TT
+> file and find the 
+        <TT
+CLASS="filename"
+>$contenttypes</TT
+>
+        variable. If your content type is not there, add it. Remember
+        the three- or four-letter tag assigned to you content type. 
+        This tag will be part of the template filename.
+      </P
+><P
+>&#13;        Save the template as <TT
+CLASS="filename"
+>&#60;stubname&#62;-&#60;formatname&#62;.&#60;contenttypetag&#62;.tmpl</TT
+>. 
+        Try out the template by calling the CGI as 
+        <TT
+CLASS="filename"
+>&#60;cginame&#62;.cgi?format=&#60;formatname&#62;</TT
+> .
+      </P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="AEN1581">5.7.4. Particular Templates</H2
+><P
+>&#13;        There are a few templates you may be particularly interested in
+        customising for your installation.
+      </P
+><P
+>&#13;        <B
+CLASS="command"
+>index.html.tmpl</B
+>:
+        This is the Bugzilla front page.
+      </P
+><P
+>&#13;        <B
+CLASS="command"
+>global/header.html.tmpl</B
+>:
+        This defines the header that goes on all Bugzilla pages.
+        The header includes the banner, which is what appears to users
+        and is probably what you want to edit instead.  However the
+        header also includes the HTML HEAD section, so you could for
+        example add a stylesheet or META tag by editing the header.
+      </P
+><P
+>&#13;        <B
+CLASS="command"
+>global/banner.html.tmpl</B
+>:
+        This contains the "banner", the part of the header that appears
+        at the top of all Bugzilla pages.  The default banner is reasonably
+        barren, so you'll probably want to customise this to give your
+        installation a distinctive look and feel.  It is recommended you
+        preserve the Bugzilla version number in some form so the version 
+        you are running can be determined, and users know what docs to read.
+      </P
+><P
+>&#13;        <B
+CLASS="command"
+>global/footer.html.tmpl</B
+>:
+        This defines the footer that goes on all Bugzilla pages.  Editing
+        this is another way to quickly get a distinctive look and feel for
+        your Bugzilla installation.
+      </P
+><P
+>&#13;        <B
+CLASS="command"
+>bug/create/user-message.html.tmpl</B
+>:
+        This is a message that appears near the top of the bug reporting page.
+        By modifying this, you can tell your users how they should report
+        bugs.
+      </P
+><P
+>&#13;        <B
+CLASS="command"
+>bug/create/create.html.tmpl</B
+> and
+        <B
+CLASS="command"
+>bug/create/comment.txt.tmpl</B
+>:
+        You may wish to get bug submitters to give certain bits of structured
+        information, each in a separate input widget, for which there is not a
+        field in the database. The bug entry system has been designed in an
+        extensible fashion to enable you to define arbitrary fields and widgets,
+        and have their values appear formatted in the initial
+        Description, rather than in database fields. An example of this
+        is the mozilla.org 
+        <A
+HREF="http://bugzilla.mozilla.org/enter_bug.cgi?format=guided"
+TARGET="_top"
+>guided 
+        bug submission form</A
+>.
+      </P
+><P
+>&#13;        To make this work, create a custom template for 
+        <TT
+CLASS="filename"
+>enter_bug.cgi</TT
+> (the default template, on which you
+        could base it, is <TT
+CLASS="filename"
+>create.html.tmpl</TT
+>),
+        and either call it <TT
+CLASS="filename"
+>create.html.tmpl</TT
+> or use a format and
+        call it <TT
+CLASS="filename"
+>create-&#60;formatname&#62;.html.tmpl</TT
+>.
+        Put it in the <TT
+CLASS="filename"
+>custom/bug/create</TT
+>
+        directory. In it, add widgets for each piece of information you'd like
+        collected - such as a build number, or set of steps to reproduce.
+      </P
+><P
+>&#13;        Then, create a template like 
+        <TT
+CLASS="filename"
+>custom/bug/create/comment.txt.tmpl</TT
+>, also named
+        after your format if you are using one, which
+        references the form fields you have created. When a bug report is
+        submitted, the initial comment attached to the bug report will be
+        formatted according to the layout of this template.
+      </P
+><P
+>&#13;        For example, if your enter_bug template had a field
+        <TABLE
+BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
+><TR
+><TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+>&#60;input type="text" name="buildid" size="30"&#62;</PRE
+></FONT
+></TD
+></TR
+></TABLE
+>
+        and then your comment.txt.tmpl had
+        <TABLE
+BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
+><TR
+><TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+>BuildID: [% form.buildid %]</PRE
+></FONT
+></TD
+></TR
+></TABLE
+>
+        then
+        <TABLE
+BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
+><TR
+><TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+>BuildID: 20020303</PRE
+></FONT
+></TD
+></TR
+></TABLE
+>
+        would appear in the initial checkin comment.
+      </P
+></DIV
+></DIV
+><DIV
+CLASS="NAVFOOTER"
+><HR
+ALIGN="LEFT"
+WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+><A
+HREF="security.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="index.html"
+ACCESSKEY="H"
+>Home</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+><A
+HREF="upgrading.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+>Bugzilla Security</TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="administration.html"
+ACCESSKEY="U"
+>Up</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+>Upgrading to New Releases</TD
+></TR
+></TABLE
+></DIV
+></BODY
+></HTML
+>
\ No newline at end of file
diff --git a/docs/html/cvs.html b/docs/html/cvs.html
deleted file mode 100644
index 47dbc8940..000000000
--- a/docs/html/cvs.html
+++ /dev/null
@@ -1,168 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->CVS</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="Integrating Bugzilla with Third-Party Tools"
-HREF="integration.html"><LINK
-REL="PREVIOUS"
-TITLE="Bonsai"
-HREF="bonsai.html"><LINK
-REL="NEXT"
-TITLE="Perforce SCM"
-HREF="scm.html"></HEAD
-><BODY
-CLASS="SECTION"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="bonsai.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Chapter 5. Integrating Bugzilla with Third-Party Tools</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="scm.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECTION"
-><H1
-CLASS="SECTION"
-><A
-NAME="CVS"
->5.2. CVS</A
-></H1
-><P
->CVS integration is best accomplished, at this point, using
-      the Bugzilla Email Gateway.  There have been some files
-      submitted to allow greater CVS integration, but we need to make
-      certain that Bugzilla is not tied into one particular software
-      management package.</P
-><P
->      Follow the instructions in the FAQ for enabling Bugzilla e-mail
-      integration.  Ensure that your check-in script sends an email to
-      your Bugzilla e-mail gateway with the subject of <SPAN
-CLASS="QUOTE"
->"[Bug
-	XXXX]"</SPAN
->, and you can have CVS check-in comments append
-      to your Bugzilla bug.  If you have your check-in script include
-      an @resolution field, you can even change the Bugzilla bug
-      state.
-    </P
-><P
->      There is also a project, based upon somewhat dated Bugzilla
-      code, to integrate CVS and Bugzilla through CVS' ability to
-      email.  Check it out at:
-      <A
-HREF="http://homepages.kcbbs.gen.nz/~tonyg/"
-TARGET="_top"
->      http://homepages.kcbbs.gen.nz/~tonyg/</A
->, under the
-      <SPAN
-CLASS="QUOTE"
->"cvszilla"</SPAN
-> link.
-    </P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="bonsai.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="scm.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->Bonsai</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="integration.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->Perforce SCM</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/database.html b/docs/html/database.html
index 25054e2e8..95bce503e 100644
--- a/docs/html/database.html
+++ b/docs/html/database.html
@@ -4,19 +4,19 @@
 >The Bugzilla Database</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
 HREF="index.html"><LINK
 REL="PREVIOUS"
-TITLE="Software Download Links"
-HREF="downloadlinks.html"><LINK
+TITLE="The Bugzilla FAQ"
+HREF="faq.html"><LINK
 REL="NEXT"
 TITLE="Database Schema Chart"
 HREF="dbschema.html"></HEAD
 ><BODY
-CLASS="APPENDIX"
+CLASS="appendix"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -25,6 +25,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -41,7 +42,8 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="downloadlinks.html"
+HREF="faq.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -55,6 +57,7 @@ ALIGN="right"
 VALIGN="bottom"
 ><A
 HREF="dbschema.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -63,12 +66,10 @@ HREF="dbschema.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="APPENDIX"
+CLASS="appendix"
 ><H1
 ><A
-NAME="DATABASE"
->Appendix C. The Bugzilla Database</A
-></H1
+NAME="database">Appendix B. The Bugzilla Database</H1
 ><DIV
 CLASS="TOC"
 ><DL
@@ -77,28 +78,23 @@ CLASS="TOC"
 >Table of Contents</B
 ></DT
 ><DT
->C.1. <A
+>B.1. <A
 HREF="dbschema.html"
 >Database Schema Chart</A
 ></DT
 ><DT
->C.2. <A
+>B.2. <A
 HREF="dbdoc.html"
 >MySQL Bugzilla Database Introduction</A
 ></DT
-><DT
->C.3. <A
-HREF="granttables.html"
->MySQL Permissions &#38; Grant Tables</A
-></DT
 ></DL
 ></DIV
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -114,8 +110,9 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->      This document really needs to be updated with more fleshed out information about primary keys, interrelationships, and maybe some nifty tables to document dependencies.  Any takers?
-    </P
+>This document really needs to be updated with more fleshed out
+    information about primary keys, interrelationships, and maybe some nifty
+    tables to document dependencies. Any takers?</P
 ></TD
 ></TR
 ></TABLE
@@ -126,6 +123,7 @@ CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -136,7 +134,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="downloadlinks.html"
+HREF="faq.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -145,6 +144,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -153,6 +153,7 @@ ALIGN="right"
 VALIGN="top"
 ><A
 HREF="dbschema.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -161,7 +162,7 @@ HREF="dbschema.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->Software Download Links</TD
+>The Bugzilla FAQ</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
diff --git a/docs/html/dbdoc.html b/docs/html/dbdoc.html
index 44ea6aa60..49e9b6526 100644
--- a/docs/html/dbdoc.html
+++ b/docs/html/dbdoc.html
@@ -4,7 +4,7 @@
 >MySQL Bugzilla Database Introduction</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -16,10 +16,10 @@ REL="PREVIOUS"
 TITLE="Database Schema Chart"
 HREF="dbschema.html"><LINK
 REL="NEXT"
-TITLE="MySQL Permissions & Grant Tables"
-HREF="granttables.html"></HEAD
+TITLE="Useful Patches and Utilities for Bugzilla"
+HREF="patches.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -45,19 +46,21 @@ ALIGN="left"
 VALIGN="bottom"
 ><A
 HREF="dbschema.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Appendix C. The Bugzilla Database</TD
+>Appendix B. The Bugzilla Database</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="granttables.html"
+HREF="patches.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,227 +69,209 @@ HREF="granttables.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="DBDOC"
->C.2. MySQL Bugzilla Database Introduction</A
-></H1
+NAME="dbdoc">B.2. MySQL Bugzilla Database Introduction</H1
 ><P
->      This information comes straight from my life.  I was forced to learn how
-      Bugzilla organizes database because of nitpicky requests from users for tiny
-      changes in wording, rather than having people re-educate themselves or
-      figure out how to work our procedures around the tool.  It sucks, but it can
-      and will happen to you, so learn how the schema works and deal with it when it
-      comes.
-    </P
+>This information comes straight from my life. I was forced to learn
+    how Bugzilla organizes database because of nitpicky requests from users
+    for tiny changes in wording, rather than having people re-educate
+    themselves or figure out how to work our procedures around the tool. It
+    sucks, but it can and will happen to you, so learn how the schema works
+    and deal with it when it comes.</P
 ><P
->      So, here you are with your brand-new installation of Bugzilla.  You've got
-      MySQL set up, Apache working right, Perl DBI and DBD talking to the database
-      flawlessly.  Maybe you've even entered a few test bugs to make sure email's
-      working; people seem to be notified of new bugs and changes, and you can
-      enter and edit bugs to your heart's content.  Perhaps you've gone through the
-      trouble of setting up a gateway for people to submit bugs to your database via
-      email, have had a few people test it, and received rave reviews from your beta
-      testers.
-    </P
+>So, here you are with your brand-new installation of Bugzilla.
+    You've got MySQL set up, Apache working right, Perl DBI and DBD talking
+    to the database flawlessly. Maybe you've even entered a few test bugs to
+    make sure email's working; people seem to be notified of new bugs and
+    changes, and you can enter and edit bugs to your heart's content. Perhaps
+    you've gone through the trouble of setting up a gateway for people to
+    submit bugs to your database via email, have had a few people test it,
+    and received rave reviews from your beta testers.</P
 ><P
->      What's the next thing you do?  Outline a training strategy for your
-      development team, of course, and bring them up to speed on the new tool you've
-      labored over for hours.
-    </P
+>What's the next thing you do? Outline a training strategy for your
+    development team, of course, and bring them up to speed on the new tool
+    you've labored over for hours.</P
 ><P
->      Your first training session starts off very well!  You have a captive
-      audience which seems enraptured by the efficiency embodied in this thing called
-      "Bugzilla".  You are caught up describing the nifty features, how people can
-      save favorite queries in the database, set them up as headers and footers on
-      their pages, customize their layouts, generate reports, track status with
-      greater efficiency than ever before, leap tall buildings with a single bound
-      and rescue Jane from the clutches of Certain Death!
-    </P
+>Your first training session starts off very well! You have a
+    captive audience which seems enraptured by the efficiency embodied in
+    this thing called "Bugzilla". You are caught up describing the nifty
+    features, how people can save favorite queries in the database, set them
+    up as headers and footers on their pages, customize their layouts,
+    generate reports, track status with greater efficiency than ever before,
+    leap tall buildings with a single bound and rescue Jane from the clutches
+    of Certain Death!</P
 ><P
->      But Certain Death speaks up -- a tiny voice, from the dark corners of the
-      conference room.  "I have a concern," the voice hisses from the darkness,
-      "about the use of the word 'verified'.
-    </P
+>But Certain Death speaks up -- a tiny voice, from the dark corners
+    of the conference room. "I have a concern," the voice hisses from the
+    darkness, "about the use of the word 'verified'.</P
 ><P
->      The room, previously filled with happy chatter, lapses into reverential
-      silence as Certain Death (better known as the Vice President of Software
-      Engineering) continues.  "You see, for two years we've used the word 'verified'
-      to indicate that a developer or quality assurance engineer has confirmed that,
-      in fact, a bug is valid. I don't want to lose two years of training to a
-      new software product.  You need to change the bug status of 'verified' to
-      'approved' as soon as possible. To avoid confusion, of course."
-    </P
+>The room, previously filled with happy chatter, lapses into
+    reverential silence as Certain Death (better known as the Vice President
+    of Software Engineering) continues. "You see, for two years we've used
+    the word 'verified' to indicate that a developer or quality assurance
+    engineer has confirmed that, in fact, a bug is valid. I don't want to
+    lose two years of training to a new software product. You need to change
+    the bug status of 'verified' to 'approved' as soon as possible. To avoid
+    confusion, of course."</P
 ><P
->      Oh no!  Terror strikes your heart, as you find yourself mumbling "yes, yes, I
-      don't think that would be a problem," You review the changes with Certain
-      Death, and continue to jabber on, "no, it's not too big a change. I mean, we
-      have the source code, right? You know, 'Use the Source, Luke' and all that...
-      no problem," All the while you quiver inside like a beached jellyfish bubbling,
-      burbling, and boiling on a hot Jamaican sand dune...
-    </P
+>Oh no! Terror strikes your heart, as you find yourself mumbling
+    "yes, yes, I don't think that would be a problem," You review the changes
+    with Certain Death, and continue to jabber on, "no, it's not too big a
+    change. I mean, we have the source code, right? You know, 'Use the
+    Source, Luke' and all that... no problem," All the while you quiver
+    inside like a beached jellyfish bubbling, burbling, and boiling on a hot
+    Jamaican sand dune...</P
 ><P
->      Thus begins your adventure into the heart of Bugzilla.  You've been forced
-      to learn about non-portable enum() fields, varchar columns, and tinyint
-      definitions. The Adventure Awaits You!
-    </P
+>Thus begins your adventure into the heart of Bugzilla. You've been
+    forced to learn about non-portable enum() fields, varchar columns, and
+    tinyint definitions. The Adventure Awaits You!</P
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="AEN2331"
->C.2.1. Bugzilla Database Basics</A
-></H2
+NAME="AEN2077">B.2.1. Bugzilla Database Basics</H2
 ><P
->	If you were like me, at this point you're totally clueless
-	about the internals of MySQL, and if it weren't for this
-	executive order from the Vice President you couldn't care less
-	about the difference between a <SPAN
+>If you were like me, at this point you're totally clueless about
+      the internals of MySQL, and if it weren't for this executive order from
+      the Vice President you couldn't care less about the difference between
+      a 
+      <SPAN
 CLASS="QUOTE"
 >"bigint"</SPAN
-> and a
-	<SPAN
+>
+
+      and a 
+      <SPAN
 CLASS="QUOTE"
 >"tinyint"</SPAN
-> entry in MySQL.   I recommend you refer
-	to the MySQL documentation, available at <A
+>
+
+      entry in MySQL. I recommend you refer to the MySQL documentation,
+      available at 
+      <A
 HREF="http://www.mysql.com/doc.html"
 TARGET="_top"
 >MySQL.com</A
->.  Below are the basics you need to know about the Bugzilla database.  Check the chart above for more details.
-      </P
-><P
+>
+
+      . Below are the basics you need to know about the Bugzilla database.
+      Check the chart above for more details.</P
 ><P
+>&#13;        <P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->	      To connect to your database:
-	    </P
+>To connect to your database:</P
 ><P
->	      <TT
-CLASS="PROMPT"
+>&#13;              <TT
+CLASS="prompt"
 >bash#</TT
-><B
-CLASS="COMMAND"
+>
+
+              <B
+CLASS="command"
 >mysql</B
-><TT
-CLASS="PARAMETER"
+>
+
+              <TT
+CLASS="parameter"
 ><I
 >-u root</I
 ></TT
 >
-	    </P
+            </P
 ><P
->	      If this works without asking you for a password,
-	      <EM
+>If this works without asking you for a password, 
+            <EM
 >shame on you</EM
->!  You should have
-	      locked your security down like the installation
-	      instructions told you to.  You can find details on
-	      locking down your database in the Bugzilla FAQ in this
-	      directory (under "Security"), or more robust security
-	      generalities in the MySQL searchable documentation at
-	      http://www.mysql.com/php/manual.php3?section=Privilege_system .
-	    </P
+>
+
+            ! You should have locked your security down like the installation
+            instructions told you to. You can find details on locking down
+            your database in the Bugzilla FAQ in this directory (under
+            "Security"), or more robust security generalities in the 
+            <A
+HREF="http://www.mysql.com/php/manual.php3?section=Privilege_system"
+TARGET="_top"
+>MySQL
+            searchable documentation</A
+>.            
+            </P
 ></LI
 ><LI
 ><P
->You should now be at a prompt that looks like
-	      this:</P
+>You should now be at a prompt that looks like this:</P
 ><P
-><TT
-CLASS="PROMPT"
+>&#13;              <TT
+CLASS="prompt"
 >mysql&#62;</TT
-></P
+>
+            </P
 ><P
->At the prompt, if <SPAN
+>At the prompt, if 
+            <SPAN
 CLASS="QUOTE"
 >"bugs"</SPAN
-> is the name
-	      you chose in the<TT
-CLASS="FILENAME"
+>
+
+            is the name you chose in the
+            <TT
+CLASS="filename"
 >localconfig</TT
-> file
-	      for your Bugzilla database, type:</P
+>
+
+            file for your Bugzilla database, type:</P
 ><P
-><TT
-CLASS="PROMPT"
+>&#13;              <TT
+CLASS="prompt"
 >mysql</TT
-><B
-CLASS="COMMAND"
+>
+
+              <B
+CLASS="command"
 >use bugs;</B
-></P
-><DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="90%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->Don't forget the <SPAN
-CLASS="QUOTE"
->";"</SPAN
-> at the end of
-		each line, or you'll be kicking yourself later.</P
-></TD
-></TR
-></TABLE
-></DIV
+>
+            </P
 ></LI
 ></OL
 >
       </P
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H3
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="AEN2360"
->C.2.1.1. Bugzilla Database Tables</A
-></H3
+NAME="AEN2104">B.2.1.1. Bugzilla Database Tables</H3
 ><P
->  Imagine your MySQL database as a series of
-	  spreadsheets, and you won't be too far off.  If you use this
-	  command:</P
+>Imagine your MySQL database as a series of spreadsheets, and
+        you won't be too far off. If you use this command:</P
 ><P
-><TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="prompt"
 >mysql&#62;</TT
-><B
-CLASS="COMMAND"
+>
+          <B
+CLASS="command"
 >show tables from bugs;</B
-></P
+>
+        </P
 ><P
->you'll be able to see all the
-	  <SPAN
+>you'll be able to see the names of all the 
+        <SPAN
 CLASS="QUOTE"
 >"spreadsheets"</SPAN
-> (tables) in your database.  It
-	  is similar to a file system, only faster and more robust for
-	  certain types of operations.</P
+>
+        (tables) in your database.</P
 ><P
 >From the command issued above, ou should have some
 	  output that looks like this:
-	  <TABLE
+<TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -295,8 +280,8 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->+-------------------+
+CLASS="programlisting"
+>&#13;+-------------------+
 | Tables in bugs    |
 +-------------------+
 | attachments       |
@@ -322,14 +307,15 @@ CLASS="PROGRAMLISTING"
 | votes             |
 | watch             |
 +-------------------+
-	  </PRE
+</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
-></P
+>
+</P
 ><P
-CLASS="LITERALLAYOUT"
+CLASS="literallayout"
 ><br>
 &nbsp;&nbsp;Here's&nbsp;an&nbsp;overview&nbsp;of&nbsp;what&nbsp;each&nbsp;table&nbsp;does.&nbsp;&nbsp;Most&nbsp;columns&nbsp;in&nbsp;each&nbsp;table&nbsp;have<br>
 descriptive&nbsp;names&nbsp;that&nbsp;make&nbsp;it&nbsp;fairly&nbsp;trivial&nbsp;to&nbsp;figure&nbsp;out&nbsp;their&nbsp;jobs.<br>
@@ -492,21 +478,6 @@ Although&nbsp;you&nbsp;can&nbsp;query&nbsp;by&nbsp;the&nbsp;enum&nbsp;field,&nbs
 of&nbsp;"APPROVED"&nbsp;until&nbsp;you&nbsp;make&nbsp;the&nbsp;perl&nbsp;changes.&nbsp;&nbsp;&nbsp;Note&nbsp;that&nbsp;this&nbsp;change&nbsp;I<br>
 mentioned&nbsp;can&nbsp;also&nbsp;be&nbsp;done&nbsp;by&nbsp;editing&nbsp;checksetup.pl,&nbsp;which&nbsp;automates&nbsp;a&nbsp;lot&nbsp;of<br>
 this.&nbsp;&nbsp;But&nbsp;you&nbsp;need&nbsp;to&nbsp;know&nbsp;this&nbsp;stuff&nbsp;anyway,&nbsp;right?<br>
-<br>
-&nbsp;&nbsp;I&nbsp;hope&nbsp;this&nbsp;database&nbsp;tutorial&nbsp;has&nbsp;been&nbsp;useful&nbsp;for&nbsp;you.&nbsp;&nbsp;If&nbsp;you&nbsp;have&nbsp;comments<br>
-to&nbsp;add,&nbsp;questions,&nbsp;concerns,&nbsp;etc.&nbsp;please&nbsp;direct&nbsp;them&nbsp;to<br>
-mbarnson@excitehome.net.&nbsp;&nbsp;Please&nbsp;direct&nbsp;flames&nbsp;to&nbsp;/dev/null&nbsp;:)&nbsp;&nbsp;Have&nbsp;a&nbsp;nice<br>
-day!<br>
-<br>
-<br>
-<br>
-===<br>
-LINKS<br>
-===<br>
-<br>
-Great&nbsp;MySQL&nbsp;tutorial&nbsp;site:<br>
-http://www.devshed.com/Server_Side/MySQL/<br>
-<br>
 	</P
 ></DIV
 ></DIV
@@ -516,6 +487,7 @@ CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -527,6 +499,7 @@ ALIGN="left"
 VALIGN="top"
 ><A
 HREF="dbschema.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -535,6 +508,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -542,7 +516,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="granttables.html"
+HREF="patches.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -558,13 +533,14 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="database.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->MySQL Permissions &#38; Grant Tables</TD
+>Useful Patches and Utilities for Bugzilla</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/dbschema.html b/docs/html/dbschema.html
index 36f51014d..f4b0ef714 100644
--- a/docs/html/dbschema.html
+++ b/docs/html/dbschema.html
@@ -4,7 +4,7 @@
 >Database Schema Chart</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -19,7 +19,7 @@ REL="NEXT"
 TITLE="MySQL Bugzilla Database Introduction"
 HREF="dbdoc.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -45,19 +46,21 @@ ALIGN="left"
 VALIGN="bottom"
 ><A
 HREF="database.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Appendix C. The Bugzilla Database</TD
+>Appendix B. The Bugzilla Database</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
 HREF="dbdoc.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,23 +69,18 @@ HREF="dbdoc.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="DBSCHEMA"
->C.1. Database Schema Chart</A
-></H1
+NAME="dbschema">B.1. Database Schema Chart</H1
 ><P
->      <DIV
-CLASS="MEDIAOBJECT"
+>&#13;      <DIV
+CLASS="mediaobject"
 ><P
 ><IMG
-SRC="../images/dbschema.jpg"
-ALT="Database Relationships"
-></IMG
-><DIV
-CLASS="CAPTION"
+SRC="../images/dbschema.jpg"><DIV
+CLASS="caption"
 ><P
 >Bugzilla database relationships chart</P
 ></DIV
@@ -96,6 +94,7 @@ CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -107,6 +106,7 @@ ALIGN="left"
 VALIGN="top"
 ><A
 HREF="database.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -115,6 +115,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -123,6 +124,7 @@ ALIGN="right"
 VALIGN="top"
 ><A
 HREF="dbdoc.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -138,6 +140,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="database.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
diff --git a/docs/html/disclaimer.html b/docs/html/disclaimer.html
index e9874f9f4..dfec8aaab 100644
--- a/docs/html/disclaimer.html
+++ b/docs/html/disclaimer.html
@@ -4,7 +4,7 @@
 >Disclaimer</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -19,7 +19,7 @@ REL="NEXT"
 TITLE="New Versions"
 HREF="newversions.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -45,6 +46,7 @@ ALIGN="left"
 VALIGN="bottom"
 ><A
 HREF="copyright.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -58,6 +60,7 @@ ALIGN="right"
 VALIGN="bottom"
 ><A
 HREF="newversions.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,45 +69,41 @@ HREF="newversions.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="DISCLAIMER"
->1.3. Disclaimer</A
-></H1
+NAME="disclaimer">1.2. Disclaimer</H1
 ><P
->      No liability for the contents of this document can be accepted.
+>&#13;      No liability for the contents of this document can be accepted.
       Use the concepts, examples, and other content at your own risk.
-      As this is a new edition of this document, there may be errors
-      and inaccuracies that may damage your system.  Use of this
-      document may cause your girlfriend to leave you, your cats to
-      pee on your furniture and clothing, your computer to cease
-      functioning, your boss to fire you, and global thermonuclear
-      war.  Proceed with caution.
+      This document may contain errors
+      and inaccuracies that may damage your system, cause your partner 
+      to leave you, your boss to fire you, your cats to
+      pee on your furniture and clothing, and global thermonuclear
+      war. Proceed with caution.
     </P
 ><P
->      All copyrights are held by their respective owners, unless
+>&#13;      All copyrights are held by their respective owners, unless
       specifically noted otherwise.  Use of a term in this document
       should not be regarded as affecting the validity of any
       trademark or service mark.
     </P
 ><P
->      Naming of particular products or brands should not be seen as
-      endorsements, with the exception of the term "GNU/Linux".  I
+>&#13;      Naming of particular products or brands should not be seen as
+      endorsements, with the exception of the term "GNU/Linux".  We
       wholeheartedly endorse the use of GNU/Linux in every situation
       where it is appropriate.  It is an extremely versatile, stable,
       and robust operating system that offers an ideal operating
       environment for Bugzilla.
     </P
 ><P
->      You are strongly recommended to make a backup of your system
+>&#13;      You are strongly recommended to make a backup of your system
       before installing Bugzilla and at regular intervals thereafter.
-      Heaven knows it's saved my bacon time after time; if you
-      implement any suggestion in  this Guide, implement this one!
+      If you implement any suggestion in this Guide, implement this one!
     </P
 ><P
->      Although the Bugzilla development team has taken great care to
+>&#13;      Although the Bugzilla development team has taken great care to
       ensure that all easily-exploitable bugs or options are
       documented or fixed in the code, security holes surely exist.
       Great care should be taken both in the installation and usage of
@@ -113,7 +112,7 @@ NAME="DISCLAIMER"
       team members, Netscape Communications, America Online Inc., and
       any affiliated developers or sponsors assume no liability for
       your use of this product.  You have the source code to this
-      product, and are responsible for auditing it yourself to insure
+      product, and are responsible for auditing it yourself to ensure
       your security needs are met.
     </P
 ></DIV
@@ -122,6 +121,7 @@ CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -133,6 +133,7 @@ ALIGN="left"
 VALIGN="top"
 ><A
 HREF="copyright.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -141,6 +142,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -149,6 +151,7 @@ ALIGN="right"
 VALIGN="top"
 ><A
 HREF="newversions.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -164,6 +167,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="about.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
diff --git a/docs/html/downloadlinks.html b/docs/html/downloadlinks.html
deleted file mode 100644
index a6f289a75..000000000
--- a/docs/html/downloadlinks.html
+++ /dev/null
@@ -1,232 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->Software Download Links</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="PREVIOUS"
-TITLE="The Bugzilla FAQ"
-HREF="faq.html"><LINK
-REL="NEXT"
-TITLE="The Bugzilla Database"
-HREF="database.html"></HEAD
-><BODY
-CLASS="APPENDIX"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="faq.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
-></TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="database.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="APPENDIX"
-><H1
-><A
-NAME="DOWNLOADLINKS"
->Appendix B. Software Download Links</A
-></H1
-><P
->    All of these sites are current as of April, 2001.  Hopefully
-    they'll stay current for a while.
-  </P
-><P
->    Apache Web Server: <A
-HREF="http://www.apache.org/"
-TARGET="_top"
->http://www.apache.org</A
->
-    Optional web server for Bugzilla, but recommended because of broad user base and support.
-  </P
-><P
->    Bugzilla: <A
-HREF="http://www.mozilla.org/projects/bugzilla/"
-TARGET="_top"
->      http://www.mozilla.org/projects/bugzilla/</A
->
-  </P
-><P
->    MySQL: <A
-HREF="http://www.mysql.com/"
-TARGET="_top"
->http://www.mysql.com/</A
->
-  </P
-><P
->    Perl: <A
-HREF="http://www.perl.org"
-TARGET="_top"
->http://www.perl.org/</A
->
-  </P
-><P
->    CPAN: <A
-HREF="http://www.cpan.org/"
-TARGET="_top"
->http://www.cpan.org/</A
->
-  </P
-><P
->    DBI Perl module: 
-    <A
-HREF="ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/DBI/"
-TARGET="_top"
->      ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/DBI/</A
->
-  </P
-><P
->    Data::Dumper module: 
-    <A
-HREF="ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Data/"
-TARGET="_top"
->      ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Data/</A
->
-  </P
-><P
->    MySQL related Perl modules:
-    <A
-HREF="ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Mysql/"
-TARGET="_top"
->      ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Mysql/</A
->
-  </P
-><P
->    TimeDate Perl module collection:
-    <A
-HREF="ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Date/"
-TARGET="_top"
->      ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Date/</A
->
-  </P
-><P
->    GD Perl module:
-    <A
-HREF="ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/GD/"
-TARGET="_top"
->      ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/GD/</A
->
-    Alternately, you should be able to find the latest version of
-    GD at <A
-HREF="http://www.boutell.com/gd/"
-TARGET="_top"
->http://www.boutell.com/gd/</A
->
-  </P
-><P
->    Chart::Base module:
-    <A
-HREF="ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Chart/"
-TARGET="_top"
->    ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Chart/</A
->
-  </P
-><P
->    LinuxDoc Software: 
-    <A
-HREF="http://www.linuxdoc.org/"
-TARGET="_top"
->http://www.linuxdoc.org/</A
->
-    (for documentation maintenance)
-  </P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="faq.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="database.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->The Bugzilla FAQ</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
->&nbsp;</TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->The Bugzilla Database</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/errata.html b/docs/html/errata.html
deleted file mode 100644
index 4782c9758..000000000
--- a/docs/html/errata.html
+++ /dev/null
@@ -1,273 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->ERRATA</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="Installation"
-HREF="installation.html"><LINK
-REL="PREVIOUS"
-TITLE="Installation"
-HREF="installation.html"><LINK
-REL="NEXT"
-TITLE="Step-by-step Install"
-HREF="stepbystep.html"></HEAD
-><BODY
-CLASS="SECTION"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="installation.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Chapter 3. Installation</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="stepbystep.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECTION"
-><H1
-CLASS="SECTION"
-><A
-NAME="ERRATA"
->3.1. ERRATA</A
-></H1
-><P
->Here are some miscellaneous notes about possible issues you
-      main run into when you begin your Bugzilla installation.
-      Reference platforms for Bugzilla installation are Redhat Linux
-      7.2, Linux-Mandrake 8.0, and Solaris 8.</P
-><P
-></P
-><TABLE
-BORDER="0"
-><TBODY
-><TR
-><TD
->	If you are installing Bugzilla on S.u.S.e. Linux, or some
-	other distributions with <SPAN
-CLASS="QUOTE"
->"paranoid"</SPAN
-> security
-	options, it is possible that the checksetup.pl script may fail
-	with the error: <SPAN
-CLASS="ERRORNAME"
->cannot chdir(/var/spool/mqueue):
-	  Permission denied</SPAN
-> This is because your
-	<TT
-CLASS="FILENAME"
->/var/spool/mqueue</TT
-> directory has a mode of
-	<SPAN
-CLASS="QUOTE"
->"drwx------"</SPAN
->.  Type <B
-CLASS="COMMAND"
->chmod 755
-	  <TT
-CLASS="FILENAME"
->/var/spool/mqueue</TT
-></B
-> as root to
-	fix this problem.
-      </TD
-></TR
-><TR
-><TD
->	Bugzilla may be installed on Macintosh OS X (10), which is a
-	unix-based (BSD)  operating system. Everything required for
-	Bugzilla on OS X will install cleanly, but the optional GD
-	perl module which is used for bug charting requires some
-	additional setup for installation. Please see the  Mac OS X
-	installation section below for details
-      </TD
-></TR
-><TR
-><TD
->	Release Notes for Bugzilla 2.14 are available at
-	<TT
-CLASS="FILENAME"
->docs/rel_notes.txt</TT
-> in your Bugzilla
-	source distribution.
-      </TD
-></TR
-><TR
-><TD
->	  The preferred documentation for Bugzilla is available in
-	docs/, with a variety of document types available.  Please
-	refer to these documents when  installing, configuring, and
-	maintaining your Bugzilla installation.
-      </TD
-></TR
-></TBODY
-></TABLE
-><P
-></P
-><DIV
-CLASS="WARNING"
-><P
-></P
-><TABLE
-CLASS="WARNING"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/warning.gif"
-HSPACE="5"
-ALT="Warning"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	Bugzilla is not a package where you can just plop it in a directory,
-	twiddle a few things, and you're off.  Installing Bugzilla assumes you
-	know your variant of UNIX or Microsoft Windows well, are familiar with the
-	command line, and are comfortable compiling and installing a plethora
-	of third-party utilities.  To install Bugzilla on Win32 requires
-	fair Perl proficiency, and if you use a webserver other than Apache you
-	should be intimately familiar with the security mechanisms and CGI
-	environment thereof.
-      </P
-></TD
-></TR
-></TABLE
-></DIV
-><DIV
-CLASS="WARNING"
-><P
-></P
-><TABLE
-CLASS="WARNING"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/warning.gif"
-HSPACE="5"
-ALT="Warning"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	Bugzilla has not undergone a complete security review. Security holes
-	may exist in the code.  Great care should be taken both in the installation
-	and usage of this software.  Carefully consider the implications of
-	installing other network services with Bugzilla.
-      </P
-></TD
-></TR
-></TABLE
-></DIV
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="installation.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="stepbystep.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->Installation</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="installation.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->Step-by-step Install</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/extraconfig.html b/docs/html/extraconfig.html
new file mode 100644
index 000000000..fb8ceb445
--- /dev/null
+++ b/docs/html/extraconfig.html
@@ -0,0 +1,726 @@
+<HTML
+><HEAD
+><TITLE
+>Optional Additional Configuration</TITLE
+><META
+NAME="GENERATOR"
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
+"><LINK
+REL="HOME"
+TITLE="The Bugzilla Guide"
+HREF="index.html"><LINK
+REL="UP"
+TITLE="Installation"
+HREF="installation.html"><LINK
+REL="PREVIOUS"
+TITLE="Step-by-step Install"
+HREF="stepbystep.html"><LINK
+REL="NEXT"
+TITLE="Win32 Installation Notes"
+HREF="win32.html"></HEAD
+><BODY
+CLASS="section"
+BGCOLOR="#FFFFFF"
+TEXT="#000000"
+LINK="#0000FF"
+VLINK="#840084"
+ALINK="#0000FF"
+><DIV
+CLASS="NAVHEADER"
+><TABLE
+SUMMARY="Header navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TH
+COLSPAN="3"
+ALIGN="center"
+>The Bugzilla Guide</TH
+></TR
+><TR
+><TD
+WIDTH="10%"
+ALIGN="left"
+VALIGN="bottom"
+><A
+HREF="stepbystep.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="80%"
+ALIGN="center"
+VALIGN="bottom"
+>Chapter 4. Installation</TD
+><TD
+WIDTH="10%"
+ALIGN="right"
+VALIGN="bottom"
+><A
+HREF="win32.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+></TABLE
+><HR
+ALIGN="LEFT"
+WIDTH="100%"></DIV
+><DIV
+CLASS="section"
+><H1
+CLASS="section"
+><A
+NAME="extraconfig">4.2. Optional Additional Configuration</H1
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="AEN845">4.2.1. Dependency Charts</H2
+><P
+>As well as the text-based dependency graphs, Bugzilla also
+      supports dependency graphing, using a package called 'dot'.
+      Exactly how this works is controlled by the 'webdotbase' parameter,
+      which can have one of three values:
+      </P
+><P
+>&#13;        <P
+></P
+><OL
+TYPE="1"
+><LI
+><P
+>&#13;            A complete file path to the command 'dot' (part of 
+            <A
+HREF="http://www.graphviz.org/"
+TARGET="_top"
+>GraphViz</A
+>) 
+            will generate the graphs locally
+            </P
+></LI
+><LI
+><P
+>&#13;            A URL prefix pointing to an installation of the webdot package will
+            generate the graphs remotely
+            </P
+></LI
+><LI
+><P
+>&#13;            A blank value will disable dependency graphing.
+            </P
+></LI
+></OL
+>
+      </P
+><P
+>So, to get this working, install
+      <A
+HREF="http://www.graphviz.org/"
+TARGET="_top"
+>GraphViz</A
+>. If you
+      do that, you need to
+      <A
+HREF="http://httpd.apache.org/docs/mod/mod_imap.html"
+TARGET="_top"
+>enable
+      server-side image maps</A
+> in Apache.
+      Alternatively, you could set up a webdot server, or use the AT&#38;T 
+      public webdot server (the
+      default for the webdotbase param). Note that AT&#38;T's server won't work
+      if Bugzilla is only accessible using HTTPS.
+      </P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="AEN860">4.2.2. Bug Graphs</H2
+><P
+>As long as you installed the GD and Graph::Base Perl modules you
+      might as well turn on the nifty Bugzilla bug reporting graphs.</P
+><P
+>Add a cron entry like this to run 
+      <TT
+CLASS="filename"
+>collectstats.pl</TT
+> 
+      daily at 5 after midnight: 
+      <P
+></P
+><TABLE
+BORDER="0"
+><TBODY
+><TR
+><TD
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
+>bash#</TT
+>
+
+            <B
+CLASS="command"
+>crontab -e</B
+>
+          </TT
+>
+        </TD
+></TR
+><TR
+><TD
+>&#13;          <TT
+CLASS="computeroutput"
+>5 0 * * * cd &#60;your-bugzilla-directory&#62; ;
+          ./collectstats.pl</TT
+>
+        </TD
+></TR
+></TBODY
+></TABLE
+><P
+></P
+>
+      </P
+><P
+>After two days have passed you'll be able to view bug graphs from
+      the Bug Reports page.</P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="AEN873">4.2.3. The Whining Cron</H2
+><P
+>By now you have a fully functional Bugzilla, but what good are
+      bugs if they're not annoying? To help make those bugs more annoying you
+      can set up Bugzilla's automatic whining system to complain at engineers
+      which leave their bugs in the NEW state without triaging them.
+      </P
+><P
+>&#13;      This can be done by
+      adding the following command as a daily crontab entry (for help on that
+      see that crontab man page): 
+      <P
+></P
+><TABLE
+BORDER="0"
+><TBODY
+><TR
+><TD
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <B
+CLASS="command"
+>cd &#60;your-bugzilla-directory&#62; ;
+            ./whineatnews.pl</B
+>
+          </TT
+>
+        </TD
+></TR
+></TBODY
+></TABLE
+><P
+></P
+>
+      </P
+><DIV
+CLASS="tip"
+><P
+></P
+><TABLE
+CLASS="tip"
+WIDTH="100%"
+BORDER="0"
+><TR
+><TD
+WIDTH="25"
+ALIGN="CENTER"
+VALIGN="TOP"
+><IMG
+SRC="../images/tip.gif"
+HSPACE="5"
+ALT="Tip"></TD
+><TD
+ALIGN="LEFT"
+VALIGN="TOP"
+><P
+>Depending on your system, crontab may have several manpages.
+        The following command should lead you to the most useful page for
+        this purpose: 
+        <TABLE
+BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
+><TR
+><TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+>man 5 crontab</PRE
+></FONT
+></TD
+></TR
+></TABLE
+>
+        </P
+></TD
+></TR
+></TABLE
+></DIV
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="bzldap">4.2.4. LDAP Authentication</H2
+><P
+>&#13;        <DIV
+CLASS="warning"
+><P
+></P
+><TABLE
+CLASS="warning"
+WIDTH="100%"
+BORDER="0"
+><TR
+><TD
+WIDTH="25"
+ALIGN="CENTER"
+VALIGN="TOP"
+><IMG
+SRC="../images/warning.gif"
+HSPACE="5"
+ALT="Warning"></TD
+><TD
+ALIGN="LEFT"
+VALIGN="TOP"
+><P
+>This information on using the LDAP
+            authentication options with Bugzilla is old, and the authors do
+            not know of anyone who has tested it. Approach with caution.
+          </P
+></TD
+></TR
+></TABLE
+></DIV
+>
+      </P
+><P
+>&#13;      The existing authentication
+      scheme for Bugzilla uses email addresses as the primary user ID, and a
+      password to authenticate that user. All places within Bugzilla where
+      you need to deal with user ID (e.g assigning a bug) use the email
+      address. The LDAP authentication builds on top of this scheme, rather
+      than replacing it. The initial log in is done with a username and
+      password for the LDAP directory. This then fetches the email address
+      from LDAP and authenticates seamlessly in the standard Bugzilla
+      authentication scheme using this email address. If an account for this
+      address already exists in your Bugzilla system, it will log in to that
+      account. If no account for that email address exists, one is created at
+      the time of login. (In this case, Bugzilla will attempt to use the
+      "displayName" or "cn" attribute to determine the user's full name.)
+      After authentication, all other user-related tasks are still handled by
+      email address, not LDAP username. You still assign bugs by email
+      address, query on users by email address, etc.
+      </P
+><P
+>Using LDAP for Bugzilla authentication requires the 
+      Mozilla::LDAP (aka PerLDAP) Perl module. The
+      Mozilla::LDAP module in turn requires Netscape's Directory SDK for C.
+      After you have installed the SDK, then install the PerLDAP module.
+      Mozilla::LDAP and the Directory SDK for C are both 
+      <A
+HREF="http://www.mozilla.org/directory/"
+TARGET="_top"
+>available for
+      download</A
+> from mozilla.org. 
+      </P
+><P
+>&#13;      Set the Param 'useLDAP' to "On" **only** if you will be using an LDAP
+      directory for
+      authentication. Be very careful when setting up this parameter; if you
+      set LDAP authentication, but do not have a valid LDAP directory set up,
+      you will not be able to log back in to Bugzilla once you log out. (If
+      this happens, you can get back in by manually editing the data/params
+      file, and setting useLDAP back to 0.)
+      </P
+><P
+>If using LDAP, you must set the
+      three additional parameters: Set LDAPserver to the name (and optionally
+      port) of your LDAP server. If no port is specified, it defaults to the
+      default port of 389. (e.g "ldap.mycompany.com" or
+      "ldap.mycompany.com:1234") Set LDAPBaseDN to the base DN for searching
+      for users in your LDAP directory. (e.g. "ou=People,o=MyCompany") uids
+      must be unique under the DN specified here. Set LDAPmailattribute to
+      the name of the attribute in your LDAP directory which contains the
+      primary email address. On most directory servers available, this is
+      "mail", but you may need to change this.
+      </P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="content-type">4.2.5. Preventing untrusted Bugzilla content from executing malicious
+      Javascript code</H2
+><P
+>It is possible for a Bugzilla to execute malicious Javascript
+      code. Due to internationalization concerns, we are unable to
+      incorporate the code changes necessary to fulfill the CERT advisory
+      requirements mentioned in 
+      <A
+HREF="http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3"
+TARGET="_top"
+>&#13;      http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3</A
+>.
+      Executing the following code snippet from a UNIX command shell will
+      rectify the problem if your Bugzilla installation is intended for an
+      English-speaking audience. As always, be sure your Bugzilla
+      installation has a good backup before making changes, and I recommend
+      you understand what the script is doing before executing it.</P
+><P
+>&#13;        <TABLE
+BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
+><TR
+><TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+>bash# perl -pi -e "s/Content-Type\: text\/html/Content-Type\: text\/html\; charset=ISO-8859-1/i" *.cgi *.pl
+        </PRE
+></FONT
+></TD
+></TR
+></TABLE
+>
+      </P
+><P
+>All this one-liner command does is search for all instances of 
+      <SPAN
+CLASS="QUOTE"
+>"Content-type: text/html"</SPAN
+>
+
+      and replaces it with 
+      <SPAN
+CLASS="QUOTE"
+>"Content-Type: text/html; charset=ISO-8859-1"</SPAN
+>
+
+      . This specification prevents possible Javascript attacks on the
+      browser, and is suggested for all English-speaking sites. For
+      non-English-speaking Bugzilla sites, I suggest changing 
+      <SPAN
+CLASS="QUOTE"
+>"ISO-8859-1"</SPAN
+>, above, to 
+      <SPAN
+CLASS="QUOTE"
+>"UTF-8"</SPAN
+>.</P
+><P
+>Note: using &#60;meta&#62; tags to set the charset is not
+      recommended, as there's a bug in Netscape 4.x which causes pages
+      marked up in this way to load twice.</P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="htaccess">4.2.6. <TT
+CLASS="filename"
+>.htaccess</TT
+>
+      files and security</H2
+><P
+>To enhance the security of your Bugzilla installation, Bugzilla's
+      <TT
+CLASS="filename"
+>checksetup.pl</TT
+> script will generate 
+      <I
+CLASS="glossterm"
+>&#13;        <TT
+CLASS="filename"
+>.htaccess</TT
+>
+      </I
+>
+
+      files which the Apache webserver can use to restrict access to the
+      bugzilla data files. 
+      These .htaccess files will not work with Apache 1.2.x - but this
+      has security holes, so you shouldn't be using it anyway. 
+      <DIV
+CLASS="note"
+><P
+></P
+><TABLE
+CLASS="note"
+WIDTH="100%"
+BORDER="0"
+><TR
+><TD
+WIDTH="25"
+ALIGN="CENTER"
+VALIGN="TOP"
+><IMG
+SRC="../images/note.gif"
+HSPACE="5"
+ALT="Note"></TD
+><TD
+ALIGN="LEFT"
+VALIGN="TOP"
+><P
+>If you are using an alternate provider of 
+        <SPAN
+CLASS="productname"
+>webdot</SPAN
+>
+
+        services for graphing (as described when viewing 
+        <TT
+CLASS="filename"
+>editparams.cgi</TT
+>
+
+        in your web browser), you will need to change the ip address in 
+        <TT
+CLASS="filename"
+>data/webdot/.htaccess</TT
+>
+
+        to the ip address of the webdot server that you are using.</P
+></TD
+></TR
+></TABLE
+></DIV
+>
+      </P
+><P
+>The default .htaccess file may not provide adequate access
+      restrictions, depending on your web server configuration. Be sure to
+      check the &#60;Directory&#62; entries for your Bugzilla directory so that
+      the 
+      <TT
+CLASS="filename"
+>.htaccess</TT
+>
+
+      file is allowed to override web server defaults. For instance, let's
+      assume your installation of Bugzilla is installed to 
+      <TT
+CLASS="filename"
+>/usr/local/bugzilla</TT
+>
+
+      . You should have this &#60;Directory&#62; entry in your 
+      <TT
+CLASS="filename"
+>httpd.conf</TT
+>
+
+      file:</P
+><P
+>&#13;      
+<TABLE
+BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
+><TR
+><TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+>&#13;  &#60;Directory /usr/local/bugzilla/&#62;
+  Options +FollowSymLinks +Indexes +Includes +ExecCGI
+  AllowOverride All
+&#60;/Directory&#62;
+</PRE
+></FONT
+></TD
+></TR
+></TABLE
+>
+
+      </P
+><P
+>The important part above is 
+      <SPAN
+CLASS="QUOTE"
+>"AllowOverride All"</SPAN
+>
+
+      . Without that, the 
+      <TT
+CLASS="filename"
+>.htaccess</TT
+>
+
+      file created by 
+      <TT
+CLASS="filename"
+>checksetup.pl</TT
+>
+
+      will not have sufficient permissions to protect your Bugzilla
+      installation.</P
+><P
+>If you are using Internet Information Server (IIS) or another 
+      web server which does not observe 
+      <TT
+CLASS="filename"
+>.htaccess</TT
+>
+      conventions, you can disable their creation by editing 
+      <TT
+CLASS="filename"
+>localconfig</TT
+>
+      and setting the 
+      <TT
+CLASS="varname"
+>$create_htaccess</TT
+>
+      variable to 
+      <TT
+CLASS="parameter"
+><I
+>0</I
+></TT
+>.
+      </P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="mod-throttle">4.2.7. <TT
+CLASS="filename"
+>mod_throttle</TT
+>
+
+      and Security</H2
+><P
+>It is possible for a user, by mistake or on purpose, to access
+      the database many times in a row which can result in very slow access
+      speeds for other users. If your Bugzilla installation is experiencing
+      this problem , you may install the Apache module 
+      <TT
+CLASS="filename"
+>mod_throttle</TT
+>
+
+      which can limit connections by ip-address. You may download this module
+      at 
+      <A
+HREF="http://www.snert.com/Software/Throttle/"
+TARGET="_top"
+>&#13;      http://www.snert.com/Software/Throttle/</A
+>. 
+      Follow the instructions to install into your Apache install. 
+      <EM
+>This module only functions with the Apache web
+      server!</EM
+>
+      You may use the 
+      <B
+CLASS="command"
+>ThrottleClientIP</B
+>
+
+      command provided by this module to accomplish this goal. See the 
+      <A
+HREF="http://www.snert.com/Software/Throttle/"
+TARGET="_top"
+>Module
+      Instructions</A
+>
+      for more information.</P
+></DIV
+></DIV
+><DIV
+CLASS="NAVFOOTER"
+><HR
+ALIGN="LEFT"
+WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+><A
+HREF="stepbystep.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="index.html"
+ACCESSKEY="H"
+>Home</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+><A
+HREF="win32.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+>Step-by-step Install</TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="installation.html"
+ACCESSKEY="U"
+>Up</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+>Win32 Installation Notes</TD
+></TR
+></TABLE
+></DIV
+></BODY
+></HTML
+>
\ No newline at end of file
diff --git a/docs/html/faq.html b/docs/html/faq.html
index eea2d6b3d..0b0dfcca5 100644
--- a/docs/html/faq.html
+++ b/docs/html/faq.html
@@ -4,19 +4,19 @@
 >The Bugzilla FAQ</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
 HREF="index.html"><LINK
 REL="PREVIOUS"
-TITLE="SourceForge"
-HREF="variant_sourceforge.html"><LINK
+TITLE="Integrating Bugzilla with Third-Party Tools"
+HREF="integration.html"><LINK
 REL="NEXT"
-TITLE="Software Download Links"
-HREF="downloadlinks.html"></HEAD
+TITLE="The Bugzilla Database"
+HREF="database.html"></HEAD
 ><BODY
-CLASS="APPENDIX"
+CLASS="appendix"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -25,6 +25,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -41,7 +42,8 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="variant_sourceforge.html"
+HREF="integration.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -54,7 +56,8 @@ WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="downloadlinks.html"
+HREF="database.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -63,295 +66,219 @@ HREF="downloadlinks.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="APPENDIX"
+CLASS="appendix"
 ><H1
 ><A
-NAME="FAQ"
->Appendix A. The Bugzilla FAQ</A
-></H1
+NAME="faq">Appendix A. The Bugzilla FAQ</H1
+><P
+>&#13;    This FAQ includes questions not covered elsewhere in the Guide.
+  </P
 ><DIV
-CLASS="QANDASET"
+CLASS="qandaset"
 ><DL
 ><DT
 >1. <A
-HREF="faq.html#FAQ_GENERAL"
+HREF="faq.html#faq-general"
 >General Questions</A
 ></DT
 ><DD
 ><DL
 ><DT
 >A.1.1. <A
-HREF="faq.html#AEN1713"
->	    Where can I find information about Bugzilla?</A
+HREF="faq.html#AEN1649"
+>&#13;	    Where can I find information about Bugzilla?</A
 ></DT
 ><DT
 >A.1.2. <A
-HREF="faq.html#AEN1719"
->	    What license is Bugzilla distributed under?
+HREF="faq.html#AEN1655"
+>&#13;	    What license is Bugzilla distributed under?
 	  </A
 ></DT
 ><DT
 >A.1.3. <A
-HREF="faq.html#AEN1725"
->	    How do I get commercial support for Bugzilla?
+HREF="faq.html#AEN1661"
+>&#13;	    How do I get commercial support for Bugzilla?
 	  </A
 ></DT
 ><DT
 >A.1.4. <A
-HREF="faq.html#AEN1732"
->	    What major companies or projects are currently using Bugzilla
+HREF="faq.html#AEN1668"
+>&#13;	    What major companies or projects are currently using Bugzilla
 	    for bug-tracking?
 	  </A
 ></DT
 ><DT
 >A.1.5. <A
-HREF="faq.html#AEN1757"
->	    Who maintains Bugzilla?
+HREF="faq.html#AEN1693"
+>&#13;	    Who maintains Bugzilla?
 	  </A
 ></DT
 ><DT
 >A.1.6. <A
-HREF="faq.html#AEN1763"
->	    How does Bugzilla stack up against other bug-tracking databases?
+HREF="faq.html#AEN1699"
+>&#13;	    How does Bugzilla stack up against other bug-tracking databases?
 	  </A
 ></DT
 ><DT
 >A.1.7. <A
-HREF="faq.html#AEN1770"
->	    How do I change my user name in Bugzilla?
+HREF="faq.html#AEN1705"
+>&#13;	    Why doesn't Bugzilla offer this or that feature or compatability
+	    with this other tracking software?
 	  </A
 ></DT
 ><DT
 >A.1.8. <A
-HREF="faq.html#AEN1775"
->	    Why doesn't Bugzilla offer this or that feature or compatability
-	    with this other tracking software?
+HREF="faq.html#AEN1712"
+>&#13;	    Why MySQL?  I'm interested in seeing Bugzilla run on
+	    Oracle/Sybase/Msql/PostgreSQL/MSSQL.
 	  </A
 ></DT
 ><DT
 >A.1.9. <A
-HREF="faq.html#AEN1782"
->	    Why MySQL?  I'm interested in seeing Bugzilla run on
-	    Oracle/Sybase/Msql/PostgreSQL/MSSQL?
+HREF="faq.html#AEN1717"
+>&#13;	    Why do the scripts say "/usr/bonsaitools/bin/perl" instead of
+	    "/usr/bin/perl" or something else?
 	  </A
 ></DT
 ><DT
 >A.1.10. <A
-HREF="faq.html#AEN1800"
->	    Why do the scripts say "/usr/bonsaitools/bin/perl" instead of
-	    "/usr/bin/perl" or something else?
+HREF="faq.html#AEN1723"
+>&#13;	    Is there an easy way to change the Bugzilla cookie name?
 	  </A
 ></DT
 ></DL
 ></DD
 ><DT
 >2. <A
-HREF="faq.html#FAQ_REDHAT"
->Red Hat Bugzilla</A
+HREF="faq.html#faq-phb"
+>Managerial Questions</A
 ></DT
 ><DD
 ><DL
 ><DT
 >A.2.1. <A
-HREF="faq.html#AEN1817"
->	    What about Red Hat Bugzilla?
+HREF="faq.html#AEN1733"
+>&#13;	    Is Bugzilla web-based, or do you have to have specific software or
+	    a specific operating system on your machine?
 	  </A
 ></DT
 ><DT
 >A.2.2. <A
-HREF="faq.html#AEN1825"
->	    What are the primary benefits of Red Hat Bugzilla?
-	  </A
-></DT
-><DT
->A.2.3. <A
-HREF="faq.html#AEN1853"
->	    What's the current status of Red Hat Bugzilla?
-	  </A
-></DT
-></DL
-></DD
-><DT
->3. <A
-HREF="faq.html#FAQ_LOKI"
->Loki Bugzilla (AKA Fenris)</A
-></DT
-><DD
-><DL
-><DT
->A.3.1. <A
-HREF="faq.html#AEN1866"
->	    What is Loki Bugzilla (Fenris)?
-	  </A
-></DT
-></DL
-></DD
-><DT
->4. <A
-HREF="faq.html#FAQ_PHB"
->Pointy-Haired-Boss Questions</A
-></DT
-><DD
-><DL
-><DT
->A.4.1. <A
-HREF="faq.html#AEN1877"
->	    Is Bugzilla web-based or do you have to have specific software or
-	    specific operating system on your machine?
-	  </A
-></DT
-><DT
->A.4.2. <A
-HREF="faq.html#AEN1882"
->	    Has anyone you know of already done any Bugzilla integration with
+HREF="faq.html#AEN1738"
+>&#13;	    Can Bugzilla integrate with
 	    Perforce (SCM software)?
 	  </A
 ></DT
 ><DT
->A.4.3. <A
-HREF="faq.html#AEN1887"
->	    Does Bugzilla allow the user to track multiple projects?
+>A.2.3. <A
+HREF="faq.html#AEN1743"
+>&#13;	    Does Bugzilla allow the user to track multiple projects?
 	  </A
 ></DT
 ><DT
->A.4.4. <A
-HREF="faq.html#AEN1892"
->	    If I am on many projects, and search for all bugs assigned to me, will
+>A.2.4. <A
+HREF="faq.html#AEN1748"
+>&#13;	    If I am on many projects, and search for all bugs assigned to me, will
 	    Bugzilla list them for me and allow me to sort by project, severity etc?
 	  </A
 ></DT
 ><DT
->A.4.5. <A
-HREF="faq.html#AEN1897"
->	    Does Bugzilla allow attachments (text, screenshots, urls etc)? If yes,
+>A.2.5. <A
+HREF="faq.html#AEN1753"
+>&#13;	    Does Bugzilla allow attachments (text, screenshots, URLs etc)? If yes,
 	    are there any that are NOT allowed?
 	  </A
 ></DT
 ><DT
->A.4.6. <A
-HREF="faq.html#AEN1902"
->	    Does Bugzilla allow us to define our own priorities and levels? Do we
+>A.2.6. <A
+HREF="faq.html#AEN1758"
+>&#13;	    Does Bugzilla allow us to define our own priorities and levels? Do we
 	    have complete freedom to change the labels of fields and format of them, and
 	    the choice of acceptable values?
 	  </A
 ></DT
 ><DT
->A.4.7. <A
-HREF="faq.html#AEN1909"
->	    The index.html page doesn't show the footer.  It's really annoying to have
-	    to go to the querypage just to check my "my bugs" link.  How do I get a footer
-	    on static HTML pages?
-	  </A
-></DT
-><DT
->A.4.8. <A
-HREF="faq.html#AEN1931"
->	    Does Bugzilla provide any reporting features, metrics, graphs, etc? You
+>A.2.7. <A
+HREF="faq.html#AEN1765"
+>&#13;	    Does Bugzilla provide any reporting features, metrics, graphs, etc? You
 	    know, the type of stuff that management likes to see. :)
 	  </A
 ></DT
 ><DT
->A.4.9. <A
-HREF="faq.html#AEN1939"
->	    Is there email notification and if so, what do you see when you get an
-	    email? Do you see bug number and title or is it only the number?
+>A.2.8. <A
+HREF="faq.html#AEN1772"
+>&#13;	    Is there email notification and if so, what do you see when you get an
+	    email?
 	  </A
 ></DT
 ><DT
->A.4.10. <A
-HREF="faq.html#AEN1944"
->	    Can email notification be set up to send to multiple
+>A.2.9. <A
+HREF="faq.html#AEN1777"
+>&#13;	    Can email notification be set up to send to multiple
 	    people, some on the To List, CC List, BCC List etc?
 	  </A
 ></DT
 ><DT
->A.4.11. <A
-HREF="faq.html#AEN1949"
->	    If there is email notification, do users have to have any particular
+>A.2.10. <A
+HREF="faq.html#AEN1782"
+>&#13;	    Do users have to have any particular
 	    type of email application?
 	  </A
 ></DT
 ><DT
->A.4.12. <A
-HREF="faq.html#AEN1956"
->	     If I just wanted to track certain bugs, as they go through life, can I
-	    set it up to alert me via email whenever that bug changes, whether it be
-	    owner, status or description etc.?
-	  </A
-></DT
-><DT
->A.4.13. <A
-HREF="faq.html#AEN1961"
->	    Does Bugzilla allow data to be imported and exported? If I had outsiders
+>A.2.11. <A
+HREF="faq.html#AEN1789"
+>&#13;	    Does Bugzilla allow data to be imported and exported? If I had outsiders
 	    write up a bug report using a MS Word bug template, could that template be
 	    imported into "matching" fields? If I wanted to take the results of a query
 	    and export that data to MS Excel, could I do that?
 	  </A
 ></DT
 ><DT
->A.4.14. <A
-HREF="faq.html#AEN1969"
->	    Has anyone converted Bugzilla to another language to be used in other
+>A.2.12. <A
+HREF="faq.html#AEN1797"
+>&#13;	    Has anyone converted Bugzilla to another language to be used in other
 	    countries? Is it localizable?
 	  </A
 ></DT
 ><DT
->A.4.15. <A
-HREF="faq.html#AEN1974"
->	    Can a user create and save reports? Can they do this in Word format?
+>A.2.13. <A
+HREF="faq.html#AEN1802"
+>&#13;	    Can a user create and save reports? Can they do this in Word format?
 	    Excel format?
 	  </A
 ></DT
 ><DT
->A.4.16. <A
-HREF="faq.html#AEN1979"
->	    Can a user re-run a report with a new project, same query?
-	  </A
-></DT
-><DT
->A.4.17. <A
-HREF="faq.html#AEN1984"
->	    Can a user modify an existing report and then save it into another name?
-	  </A
-></DT
-><DT
->A.4.18. <A
-HREF="faq.html#AEN1989"
->	    Does Bugzilla have the ability to search by word, phrase, compound
+>A.2.14. <A
+HREF="faq.html#AEN1807"
+>&#13;	    Does Bugzilla have the ability to search by word, phrase, compound
 	    search?
 	  </A
 ></DT
 ><DT
->A.4.19. <A
-HREF="faq.html#AEN1994"
->	    Can the admin person establish separate group and individual user
-	    privileges?
-	  </A
-></DT
-><DT
->A.4.20. <A
-HREF="faq.html#AEN1999"
->	     Does Bugzilla provide record locking when there is simultaneous access
+>A.2.15. <A
+HREF="faq.html#AEN1812"
+>&#13;	     Does Bugzilla provide record locking when there is simultaneous access
 	    to the same bug? Does the second person get a notice that the bug is in use
 	    or how are they notified?
 	  </A
 ></DT
 ><DT
->A.4.21. <A
-HREF="faq.html#AEN2004"
->	    Are there any backup features provided?
+>A.2.16. <A
+HREF="faq.html#AEN1817"
+>&#13;	    Are there any backup features provided?
 	  </A
 ></DT
 ><DT
->A.4.22. <A
-HREF="faq.html#AEN2010"
->	    Can users be on the system while a backup is in progress?
+>A.2.17. <A
+HREF="faq.html#AEN1823"
+>&#13;	    Can users be on the system while a backup is in progress?
 	  </A
 ></DT
 ><DT
->A.4.23. <A
-HREF="faq.html#AEN2015"
->	    What type of human resources are needed to be on staff to install and
+>A.2.18. <A
+HREF="faq.html#AEN1828"
+>&#13;	    What type of human resources are needed to be on staff to install and
 	    maintain Bugzilla? Specifically, what type of skills does the person need to
 	    have? I need to find out if we were to go with Bugzilla, what types of
 	    individuals would we need to hire and how much would that cost vs buying an
@@ -359,9 +286,9 @@ HREF="faq.html#AEN2015"
 	  </A
 ></DT
 ><DT
->A.4.24. <A
-HREF="faq.html#AEN2022"
->	    What time frame are we looking at if we decide to hire people to install
+>A.2.19. <A
+HREF="faq.html#AEN1834"
+>&#13;	    What time frame are we looking at if we decide to hire people to install
 	    and maintain the Bugzilla? Is this something that takes hours or weeks to
 	    install and a couple of hours per week to maintain and customize or is this
 	    a multi-week install process, plus a full time job for 1 person, 2 people,
@@ -369,65 +296,38 @@ HREF="faq.html#AEN2022"
 	  </A
 ></DT
 ><DT
->A.4.25. <A
-HREF="faq.html#AEN2027"
->	    Is there any licensing fee or other fees for using Bugzilla? Any
+>A.2.20. <A
+HREF="faq.html#AEN1839"
+>&#13;	    Is there any licensing fee or other fees for using Bugzilla? Any
 	    out-of-pocket cost other than the bodies needed as identified above?
 	  </A
 ></DT
 ></DL
 ></DD
 ><DT
->5. <A
-HREF="faq.html#FAQ_INSTALL"
->Bugzilla Installation</A
-></DT
-><DD
-><DL
-><DT
->A.5.1. <A
-HREF="faq.html#AEN2034"
->	    How do I download and install Bugzilla?
-	  </A
-></DT
-><DT
->A.5.2. <A
-HREF="faq.html#AEN2040"
->	    How do I install Bugzilla on Windows NT?
-	  </A
-></DT
-><DT
->A.5.3. <A
-HREF="faq.html#AEN2045"
->	    Is there an easy way to change the Bugzilla cookie name?
-	  </A
-></DT
-></DL
-></DD
-><DT
->6. <A
-HREF="faq.html#FAQ_SECURITY"
+>3. <A
+HREF="faq.html#faq-security"
 >Bugzilla Security</A
 ></DT
 ><DD
 ><DL
 ><DT
->A.6.1. <A
-HREF="faq.html#AEN2052"
->	    How do I completely disable MySQL security if it's giving me problems
-	    (I've followed the instructions in the installation section of this guide!)?
+>A.3.1. <A
+HREF="faq.html#AEN1846"
+>&#13;	    How do I completely disable MySQL security if it's giving me problems
+	    (I've followed the instructions in the installation section of this guide)?
 	  </A
 ></DT
 ><DT
->A.6.2. <A
-HREF="faq.html#AEN2058"
->	    Are there any security problems with Bugzilla?
+>A.3.2. <A
+HREF="faq.html#AEN1852"
+>&#13;	    Are there any security problems with Bugzilla?
 	  </A
 ></DT
 ><DT
->A.6.3. <A
-HREF="faq.html#AEN2063"
->	    I've implemented the security fixes mentioned in Chris Yeh's security
+>A.3.3. <A
+HREF="faq.html#AEN1857"
+>&#13;	    I've implemented the security fixes mentioned in Chris Yeh's security
 	    advisory of 5/10/2000 advising not to run MySQL as root, and am running into
 	    problems with MySQL no longer working correctly.
 	  </A
@@ -435,320 +335,298 @@ HREF="faq.html#AEN2063"
 ></DL
 ></DD
 ><DT
->7. <A
-HREF="faq.html#FAQ_EMAIL"
+>4. <A
+HREF="faq.html#faq-email"
 >Bugzilla Email</A
 ></DT
 ><DD
 ><DL
 ><DT
->A.7.1. <A
-HREF="faq.html#AEN2070"
->	    I have a user who doesn't want to receive any more email from Bugzilla.
+>A.4.1. <A
+HREF="faq.html#AEN1864"
+>&#13;	    I have a user who doesn't want to receive any more email from Bugzilla.
 	    How do I stop it entirely for this user?
 	  </A
 ></DT
 ><DT
->A.7.2. <A
-HREF="faq.html#AEN2075"
->	    I'm evaluating/testing Bugzilla, and don't want it to send email to
+>A.4.2. <A
+HREF="faq.html#AEN1869"
+>&#13;	    I'm evaluating/testing Bugzilla, and don't want it to send email to
 	    anyone but me. How do I do it?
 	  </A
 ></DT
 ><DT
->A.7.3. <A
-HREF="faq.html#AEN2080"
->	    I want whineatnews.pl to whine at something more, or other than, only new
+>A.4.3. <A
+HREF="faq.html#AEN1874"
+>&#13;	    I want whineatnews.pl to whine at something more, or other than, only new
 	    bugs. How do I do it?
 	  </A
 ></DT
 ><DT
->A.7.4. <A
-HREF="faq.html#AEN2086"
->	    I don't like/want to use Procmail to hand mail off to bug_email.pl.
+>A.4.4. <A
+HREF="faq.html#AEN1880"
+>&#13;	    I don't like/want to use Procmail to hand mail off to bug_email.pl.
 	    What alternatives do I have?
 	  </A
 ></DT
 ><DT
->A.7.5. <A
-HREF="faq.html#AEN2093"
->	    How do I set up the email interface to submit/change bugs via email?
+>A.4.5. <A
+HREF="faq.html#AEN1887"
+>&#13;	    How do I set up the email interface to submit/change bugs via email?
 	  </A
 ></DT
 ><DT
->A.7.6. <A
-HREF="faq.html#AEN2098"
->	    Email takes FOREVER to reach me from bugzilla -- it's extremely slow.
+>A.4.6. <A
+HREF="faq.html#AEN1892"
+>&#13;	    Email takes FOREVER to reach me from Bugzilla -- it's extremely slow.
 	    What gives?
 	  </A
 ></DT
 ><DT
->A.7.7. <A
-HREF="faq.html#AEN2105"
->	     How come email never reaches me from bugzilla changes?
+>A.4.7. <A
+HREF="faq.html#AEN1899"
+>&#13;	     How come email from Bugzilla changes never reaches me?
 	  </A
 ></DT
 ></DL
 ></DD
 ><DT
->8. <A
-HREF="faq.html#FAQ_DB"
+>5. <A
+HREF="faq.html#faq-db"
 >Bugzilla Database</A
 ></DT
 ><DD
 ><DL
 ><DT
->A.8.1. <A
-HREF="faq.html#AEN2113"
->	    I've heard Bugzilla can be used with Oracle?
-	  </A
-></DT
-><DT
->A.8.2. <A
-HREF="faq.html#AEN2118"
->	    Bugs are missing from queries, but exist in the database (and I can pull
-	    them up by specifying the bug ID). What's wrong?
+>A.5.1. <A
+HREF="faq.html#AEN1907"
+>&#13;	    I've heard Bugzilla can be used with Oracle?
 	  </A
 ></DT
 ><DT
->A.8.3. <A
-HREF="faq.html#AEN2123"
->	    I think my database might be corrupted, or contain invalid entries. What
+>A.5.2. <A
+HREF="faq.html#AEN1912"
+>&#13;	    I think my database might be corrupted, or contain invalid entries. What
 	    do I do?
 	  </A
 ></DT
 ><DT
->A.8.4. <A
-HREF="faq.html#AEN2131"
->	    I want to manually edit some entries in my database. How?
+>A.5.3. <A
+HREF="faq.html#AEN1920"
+>&#13;	    I want to manually edit some entries in my database. How?
 	  </A
 ></DT
 ><DT
->A.8.5. <A
-HREF="faq.html#AEN2136"
->	    I try to add myself as a user, but Bugzilla always tells me my password is wrong.
+>A.5.4. <A
+HREF="faq.html#AEN1925"
+>&#13;	    I try to add myself as a user, but Bugzilla always tells me my password is wrong.
 	  </A
 ></DT
 ><DT
->A.8.6. <A
-HREF="faq.html#AEN2141"
->	    I think I've set up MySQL permissions correctly, but bugzilla still can't
+>A.5.5. <A
+HREF="faq.html#AEN1930"
+>&#13;	    I think I've set up MySQL permissions correctly, but Bugzilla still can't
 	    connect.
 	  </A
 ></DT
 ><DT
->A.8.7. <A
-HREF="faq.html#AEN2146"
->	    How do I synchronize bug information among multiple different Bugzilla
+>A.5.6. <A
+HREF="faq.html#AEN1935"
+>&#13;	    How do I synchronize bug information among multiple different Bugzilla
 	    databases?
 	  </A
 ></DT
-><DT
->A.8.8. <A
-HREF="faq.html#AEN2153"
->	    Why do I get bizarre errors when trying to submit data, particularly problems
-	    with "groupset"?
-	  </A
-></DT
-><DT
->A.8.9. <A
-HREF="faq.html#AEN2158"
->	    How come even after I delete bugs, the long descriptions show up?
-	  </A
-></DT
 ></DL
 ></DD
 ><DT
->9. <A
-HREF="faq.html#FAQ_NT"
+>6. <A
+HREF="faq.html#faq-nt"
 >Bugzilla and Win32</A
 ></DT
 ><DD
 ><DL
 ><DT
->A.9.1. <A
-HREF="faq.html#AEN2168"
->	    What is the easiest way to run Bugzilla on Win32 (Win98+/NT/2K)?
+>A.6.1. <A
+HREF="faq.html#AEN1944"
+>&#13;	    What is the easiest way to run Bugzilla on Win32 (Win98+/NT/2K)?
 	  </A
 ></DT
 ><DT
->A.9.2. <A
-HREF="faq.html#AEN2173"
->	    Is there a "Bundle::Bugzilla" equivalent for Win32?
+>A.6.2. <A
+HREF="faq.html#AEN1949"
+>&#13;	    Is there a "Bundle::Bugzilla" equivalent for Win32?
 	  </A
 ></DT
 ><DT
->A.9.3. <A
-HREF="faq.html#AEN2178"
->	    CGI's are failing with a "something.cgi is not a valid Windows NT
+>A.6.3. <A
+HREF="faq.html#AEN1954"
+>&#13;	    CGI's are failing with a "something.cgi is not a valid Windows NT
 	    application" error. Why?
 	  </A
 ></DT
 ><DT
->A.9.4. <A
-HREF="faq.html#AEN2186"
->	    Can I have some general instructions on how to make Bugzilla on Win32 work?
-	  </A
-></DT
-><DT
->A.9.5. <A
-HREF="faq.html#AEN2192"
->	    I'm having trouble with the perl modules for NT not being able to talk to
+>A.6.4. <A
+HREF="faq.html#AEN1962"
+>&#13;	    I'm having trouble with the perl modules for NT not being able to talk to
 	    to the database.
 	  </A
 ></DT
 ></DL
 ></DD
 ><DT
->10. <A
-HREF="faq.html#FAQ_USE"
+>7. <A
+HREF="faq.html#faq-use"
 >Bugzilla Usage</A
 ></DT
 ><DD
 ><DL
 ><DT
->A.10.1. <A
-HREF="faq.html#AEN2213"
->	    The query page is very confusing.  Isn't there a simpler way to query?
+>A.7.1. <A
+HREF="faq.html#AEN1983"
+>&#13;	    How do I change my user name (email address) in Bugzilla?
+	  </A
+></DT
+><DT
+>A.7.2. <A
+HREF="faq.html#AEN1988"
+>&#13;	    The query page is very confusing.  Isn't there a simpler way to query?
 	  </A
 ></DT
 ><DT
->A.10.2. <A
-HREF="faq.html#AEN2219"
->	    I'm confused by the behavior of the "accept" button in the Show Bug form.
+>A.7.3. <A
+HREF="faq.html#AEN1993"
+>&#13;	    I'm confused by the behavior of the "accept" button in the Show Bug form.
 	    Why doesn't it assign the bug to me when I accept it?
 	  </A
 ></DT
 ><DT
->A.10.3. <A
-HREF="faq.html#AEN2229"
->	    I can't upload anything into the database via the "Create Attachment"
+>A.7.4. <A
+HREF="faq.html#AEN2003"
+>&#13;	    I can't upload anything into the database via the "Create Attachment"
 	    link.  What am I doing wrong?
 	  </A
 ></DT
 ><DT
->A.10.4. <A
-HREF="faq.html#AEN2234"
->	    Email submissions to Bugzilla that have attachments end up asking me to
+>A.7.5. <A
+HREF="faq.html#AEN2008"
+>&#13;	    Email submissions to Bugzilla that have attachments end up asking me to
 	    save it as a "cgi" file.
 	  </A
 ></DT
 ><DT
->A.10.5. <A
-HREF="faq.html#AEN2239"
->	    How do I change a keyword in Bugzilla, once some bugs are using it?
+>A.7.6. <A
+HREF="faq.html#AEN2013"
+>&#13;	    How do I change a keyword in Bugzilla, once some bugs are using it?
 	  </A
 ></DT
 ></DL
 ></DD
 ><DT
->11. <A
-HREF="faq.html#FAQ_HACKING"
+>8. <A
+HREF="faq.html#faq-hacking"
 >Bugzilla Hacking</A
 ></DT
 ><DD
 ><DL
 ><DT
->A.11.1. <A
-HREF="faq.html#AEN2246"
->	    What bugs are in Bugzilla right now?
+>A.8.1. <A
+HREF="faq.html#AEN2020"
+>&#13;	    What bugs are in Bugzilla right now?
 	  </A
 ></DT
 ><DT
->A.11.2. <A
-HREF="faq.html#AEN2255"
->	    How can I change the default priority to a null value?  For instance, have the default
+>A.8.2. <A
+HREF="faq.html#AEN2029"
+>&#13;	    How can I change the default priority to a null value?  For instance, have the default
 	    priority be "---" instead of "P2"?
 	  </A
 ></DT
 ><DT
->A.11.3. <A
-HREF="faq.html#AEN2261"
->	    What's the best way to submit patches?  What guidelines should I follow?
+>A.8.3. <A
+HREF="faq.html#AEN2035"
+>&#13;	    What's the best way to submit patches?  What guidelines should I follow?
 	  </A
 ></DT
 ></DL
 ></DD
 ></DL
 ><DIV
-CLASS="QANDADIV"
+CLASS="qandadiv"
 ><H3
 ><A
-NAME="FAQ_GENERAL"
-></A
->1. General Questions</H3
+NAME="faq-general">1. General Questions</H3
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1713"
-></A
-><B
+NAME="AEN1649"><B
 >A.1.1. </B
->	    Where can I find information about Bugzilla?</P
+>
+	    Where can I find information about Bugzilla?</P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    You can stay up-to-date with the latest Bugzilla
+>
+	    You can stay up-to-date with the latest Bugzilla
 	    information at <A
-HREF="http://www.mozilla.org/projects/bugzilla/"
+HREF="http://www.bugzilla.org/"
 TARGET="_top"
->	    http://www.mozilla.org/projects/bugzilla/</A
+>&#13;	    http://www.bugzilla.org/</A
 >
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1719"
-></A
-><B
+NAME="AEN1655"><B
 >A.1.2. </B
->	    What license is Bugzilla distributed under?
+>
+	    What license is Bugzilla distributed under?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Bugzilla is covered by the Mozilla Public License.
+>
+	    Bugzilla is covered by the Mozilla Public License.
 	    See details at <A
 HREF="http://www.mozilla.org/MPL/"
 TARGET="_top"
->	    http://www.mozilla.org/MPL/</A
+>&#13;	    http://www.mozilla.org/MPL/</A
 >
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1725"
-></A
-><B
+NAME="AEN1661"><B
 >A.1.3. </B
->	    How do I get commercial support for Bugzilla?
+>
+	    How do I get commercial support for Bugzilla?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    <A
+>
+	    <A
 HREF="http://www.collab.net/"
 TARGET="_top"
 >www.collab.net</A
@@ -758,33 +636,33 @@ TARGET="_top"
 	    aren't interested in small projects.
 	  </P
 ><P
->	    There are several experienced
+>&#13;	    There are several experienced
 	    Bugzilla hackers on the mailing list/newsgroup who are willing
-	    to whore themselves out for generous compensation.
+	    to make themselves available for generous compensation.
 	    Try sending a message to the mailing list asking for a volunteer.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1732"
-></A
-><B
+NAME="AEN1668"><B
 >A.1.4. </B
->	    What major companies or projects are currently using Bugzilla
+>
+	    What major companies or projects are currently using Bugzilla
 	    for bug-tracking?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    There are <EM
+>
+	    There are <EM
 >dozens</EM
 > of major comapanies with public
 	    Bugzilla sites to track bugs in their products.  A few include:
@@ -803,15 +681,15 @@ BORDER="0"
 ></TR
 ><TR
 ><TD
->AtHome Corporation</TD
+>NASA</TD
 ></TR
 ><TR
 ><TD
->Red Hat Software</TD
+>AtHome Corporation</TD
 ></TR
 ><TR
 ><TD
->Loki Entertainment Software</TD
+>Red Hat Software</TD
 ></TR
 ><TR
 ><TD
@@ -823,10 +701,6 @@ BORDER="0"
 ></TR
 ><TR
 ><TD
->The Eazel Project</TD
-></TR
-><TR
-><TD
 >AbiSource</TD
 ></TR
 ><TR
@@ -859,6 +733,10 @@ BORDER="0"
 ></TR
 ><TR
 ><TD
+>Ximian</TD
+></TR
+><TR
+><TD
 >Linux-Mandrake</TD
 ></TR
 ></TBODY
@@ -868,61 +746,60 @@ BORDER="0"
 >
 	  </P
 ><P
->	    Suffice to say, there are more than enough huge projects using Bugzilla
+>&#13;	    Suffice to say, there are more than enough huge projects using Bugzilla
 	    that we can safely say it's extremely popular.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1757"
-></A
-><B
+NAME="AEN1693"><B
 >A.1.5. </B
->	    Who maintains Bugzilla?
+>
+	    Who maintains Bugzilla?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Bugzilla maintenance has been in a state of flux recently.
-	    Please check <A
-HREF="http://www.mozilla.org/projects/bugzilla/"
-TARGET="_top"
->the Bugzilla Project Page for the latest details. </A
 >
+	    A 
+      <A
+HREF="http://www.bugzilla.org/who_we_are.html"
+TARGET="_top"
+>core team</A
+>,
+      led by Dave Miller (justdave@syndicomm.com).      
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1763"
-></A
-><B
+NAME="AEN1699"><B
 >A.1.6. </B
->	    How does Bugzilla stack up against other bug-tracking databases?
+>
+	    How does Bugzilla stack up against other bug-tracking databases?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    A year has gone by, and I <EM
->still</EM
-> can't
-	    find any head-to-head comparisons of Bugzilla against
-	    other defect-tracking software.  However, from my personal
+>
+	    We can't find any head-to-head comparisons of Bugzilla against
+	    other defect-tracking software. If you know of one, please
+      get in touch. However, from the author's personal
 	    experience with other bug-trackers, Bugzilla offers
 	    superior performance on commodity hardware, better price
 	    (free!), more developer- friendly features (such as stored
@@ -931,69 +808,45 @@ CLASS="ANSWER"
 	    flexibility, and superior ease-of-use.
 	  </P
 ><P
->	    If you happen to be a commercial bug-tracker vendor, please
-	    step forward with a rebuttal so I can include it in the
-	    FAQ.  We're not in pursuit of Bugzilla ueber alles; we
-	    simply love having a powerful, open-source tool to get our
-	    jobs done.
+>&#13;	    If you happen to be a commercial bug-tracker vendor, please
+	    step forward with a list of advantages your product has over
+      Bugzilla. We'd be happy to include it in the "Competitors"
+      section.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1770"
-></A
-><B
+NAME="AEN1705"><B
 >A.1.7. </B
->	    How do I change my user name in Bugzilla?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    You can't.  However, the administrative account can, by simply opening
-	    your user account in editusers.cgi and changing the login name.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN1775"
-></A
-><B
->A.1.8. </B
->	    Why doesn't Bugzilla offer this or that feature or compatability
+>
+	    Why doesn't Bugzilla offer this or that feature or compatability
 	    with this other tracking software?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    It may be that the support has not been built yet, or that you
+>
+	    It may be that the support has not been built yet, or that you
 	    have not yet found it.  Bugzilla is making tremendous strides in
 	    usability, customizability, scalability, and user interface.  It
 	    is widely considered the most complete and popular open-source
 	    bug-tracking software in existence.
 	  </P
 ><P
->	    That doesn't mean it can't use improvement!
+>&#13;	    That doesn't mean it can't use improvement!
 	    You can help the project along by either hacking a patch yourself
 	    that supports the functionality you require, or else submitting a
 	    "Request for Enhancement" (RFE) using the bug submission interface
 	    at <A
-HREF="http://bugzilla.mozilla.org/"
+HREF="http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla"
 TARGET="_top"
 >bugzilla.mozilla.org</A
 >.
@@ -1001,138 +854,95 @@ TARGET="_top"
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1782"
-></A
-><B
->A.1.9. </B
->	    Why MySQL?  I'm interested in seeing Bugzilla run on
-	    Oracle/Sybase/Msql/PostgreSQL/MSSQL?
+NAME="AEN1712"><B
+>A.1.8. </B
+>
+	    Why MySQL?  I'm interested in seeing Bugzilla run on
+	    Oracle/Sybase/Msql/PostgreSQL/MSSQL.
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->Terry Weissman answers,
-	  <A
-NAME="AEN1786"
-></A
-><BLOCKQUOTE
-CLASS="BLOCKQUOTE"
-><P
->	      You're not the only one. But <EM
->I</EM
-> am not very interested. I'm not
-	      a real SQL or database person. I just wanted to make a useful tool,
-	      and build it on top of free software. So, I picked MySQL, and
-	      learned SQL by staring at the MySQL manual and some code lying
-	      around here, and
-	      wrote Bugzilla. I didn't know that Enum's were non-standard SQL.
-	      I'm not sure if I would have cared, but I didn't even know. So, to
-	      me, things are "portable" because it uses MySQL, and MySQL is
-	      portable enough. I fully understand (now) that people want to be
-	      portable to other databases, but that's never been a real concern
-	      of mine.
-	    </P
-></BLOCKQUOTE
 >
+      There is DB-independence work afoot. PostgreSQL support is planned
+      for 2.18, and full DB-independence can't be far further on.
 	  </P
+></DIV
+></DIV
+><DIV
+CLASS="qandaentry"
+><DIV
+CLASS="question"
 ><P
->	    Things aren't quite that grim these days, however.  Terry pretty much
-	    sums up much of the thinking many of us have for Bugzilla, but there
-	    is light on the horizon for database-independence!  Here are some options:
-	  </P
-><P
-></P
-><TABLE
-BORDER="0"
-><TBODY
-><TR
-><TD
->	      <EM
 ><A
-HREF="http://bugzilla.redhat.com/"
-TARGET="_top"
->Red Hat Bugzilla</A
-></EM
->:
-	      Runs a modified Bugzilla 2.8 atop an Oracle database.
-	    </TD
-></TR
-><TR
-><TD
->	      <EM
-><A
-HREF="http://sourceforge.net/projects/interzilla"
-TARGET="_top"
->Interzilla</A
-></EM
->:
-	      A project to run Bugzilla on Interbase.  No code released yet, however.
-	    </TD
-></TR
-><TR
-><TD
->	      <EM
->Bugzilla 3.0</EM
->: One of the primary stated goals
-	      is multiple database support.
-	    </TD
-></TR
-></TBODY
-></TABLE
+NAME="AEN1717"><B
+>A.1.9. </B
+>
+	    Why do the scripts say "/usr/bonsaitools/bin/perl" instead of
+	    "/usr/bin/perl" or something else?
+	  </P
+></DIV
+><DIV
+CLASS="answer"
 ><P
-></P
+><B
+> </B
+>
+	     Mozilla.org uses /usr/bonsaitools/bin/perl, because originally
+       Terry wanted a place to put a version of Perl and other tools 
+       that was strictly under his control. 
+    </P
+><P
+>&#13;		  We always recommend that, if possible, you keep the path
+		  as /usr/bonsaitools/bin/perl, and simply add symlink.  
+      This will make upgrading
+		  your Bugzilla much easier in the future.
+		</P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1800"
-></A
-><B
+NAME="AEN1723"><B
 >A.1.10. </B
->	    Why do the scripts say "/usr/bonsaitools/bin/perl" instead of
-	    "/usr/bin/perl" or something else?
+>
+	    Is there an easy way to change the Bugzilla cookie name?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	     Mozilla.org uses /usr/bonsaitools/bin/perl. The prime rule in making
-	    submissions is "don't break bugzilla.mozilla.org". If it breaks it, your
-	    patch will be reverted faster than you can do a diff.
+>
+	    At present, no.
 	  </P
-><P
->	    Here's Terry Weissman's comment, for some historical context:
-	    <A
-NAME="AEN1805"
-></A
-><BLOCKQUOTE
-CLASS="BLOCKQUOTE"
-><P
->		[This was] purely my own convention. I wanted a place to put a version of
-		Perl and other tools that was strictly under my control for the
-		various webtools, and not subject to anyone else. Edit it to point
-		to whatever you like.
-	      </P
+></DIV
+></DIV
+></DIV
 ><DIV
-CLASS="NOTE"
+CLASS="qandadiv"
+><H3
+><A
+NAME="faq-phb">2. Managerial Questions</H3
+><P
+>&#13;	<DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -1148,59 +958,7 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->		  We always recommend that, if possible, you keep the path
-		  as /usr/bonsaitools/bin/perl, and simply add a /usr/bonsaitools
-		  and /usr/bonsaitools/bin directory, then symlink your version
-		  of perl to /usr/bonsaitools/bin/perl.  This will make upgrading
-		  your Bugzilla much easier in the future.
-		</P
-><P
->		  Obviously, if you do not have root access to your Bugzilla
-		  box, our suggestion is irrelevant.
-		</P
-></TD
-></TR
-></TABLE
-></DIV
-></BLOCKQUOTE
->
-	  </P
-></DIV
-></DIV
-></DIV
-><DIV
-CLASS="QANDADIV"
-><H3
-><A
-NAME="FAQ_REDHAT"
-></A
->2. Red Hat Bugzilla</H3
-><P
->	<DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	    <EM
->This section is no longer up-to-date.</EM
->
-	    Please see the section on "Red Hat Bugzilla" under "Variants" in The Bugzilla Guide.
+>&#13;	    Questions likely to be asked by managers. :-)
 	  </P
 ></TD
 ></TR
@@ -1209,516 +967,154 @@ VALIGN="TOP"
 >
       </P
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1817"
-></A
-><B
+NAME="AEN1733"><B
 >A.2.1. </B
->	    What about Red Hat Bugzilla?
+>
+	    Is Bugzilla web-based, or do you have to have specific software or
+	    a specific operating system on your machine?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Red Hat Bugzilla is arguably more user-friendly, customizable, and scalable
-	    than stock Bugzilla. Check it out at
-	    http://bugzilla.redhat.com and the sources at ftp://people.redhat.com/dkl/.
-	    They've set their Bugzilla up to work with Oracle out of the box.
-	    Note that Redhat Bugzilla is based upon the 2.8 Bugzilla tree;
-	    Bugzilla has made some tremendous advances since the 2.8 release.
-	    Why not download both Bugzillas to check out the differences for
-	    yourself?
-	  </P
-><P
->	    Dave Lawrence, the original Red Hat Bugzilla maintainer, mentions:
-	    <A
-NAME="AEN1822"
-></A
-><BLOCKQUOTE
-CLASS="BLOCKQUOTE"
-><P
->		Somebody needs to take the ball and run with it.  I'm the only
-		maintainer and am very pressed for time.
-	      </P
-></BLOCKQUOTE
 >
-	    If you, or someone you know, has the time and expertise to do the integration
-	    work so main-tree Bugzilla 2.12 and higher integrates the Red
-	    Hat Bugzilla Oracle modifications, please donate your
-	    time to supporting the Bugzilla project.
+	    It is web and e-mail based.  You can edit bugs by sending specially
+	    formatted email to a properly configured Bugzilla, or control via the web.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1825"
-></A
-><B
+NAME="AEN1738"><B
 >A.2.2. </B
->	    What are the primary benefits of Red Hat Bugzilla?
+>
+	    Can Bugzilla integrate with
+	    Perforce (SCM software)?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    <EM
->Dave Lawrence</EM
->:
-	    <A
-NAME="AEN1830"
-></A
-><BLOCKQUOTE
-CLASS="BLOCKQUOTE"
-><P
->		For the record, we are not using any template type implementation for
-		the cosmetic changes maded to Bugzilla.  It is just alot of html changes
-		in the code itself.  I admit I may have gotten a little carried away with it
-		but the corporate types asked for a more standardized interface to match up
-		with other projects relating to Red Hat web sites.  A lot of other web based
-		internal tools I am working on also look like Bugzilla.
-	      </P
-><P
->		I do want to land the changes that I have made to Bugzilla but I may
-		have to back out a good deal and make a different version of Red Hat's
-		Bugzilla for checking in to CVS. Especially the cosmetic changes because it
-		seems they may not fit the general public.  I will do that as soon as I can.
-		I also still do my regular QA responsibilities along with Bugzilla so time
-		is difficult sometimes to come by.
-	      </P
-><P
->		There are also a good deal of other changes that were requested by
-		management for things like support contracts and different permission
-		groups for making bugs private. Here is a short list of the major
-		changes that have been made:
-	      </P
-><P
-></P
-><OL
-TYPE="1"
-><LI
-><P
->		    No enum types. All old enum types are now separate smaller tables.
-		  </P
-></LI
-><LI
-><P
->		    No bit wise operations. Not all databases support this so they were
-		    changed to a more generic way of doing this task
-		  </P
-></LI
-><LI
-><P
->		    Bug reports can only be altered by the reporter, assignee, or a
-		    privileged bugzilla user. The rest of the world can see the bug but in
-		    a non-changeable format (unless the bug has been marked private).  They
-		    can however add comments, add and remove themselves from the CC list
-		  </P
-></LI
-><LI
-><P
->		    Different group scheme. Each group has an id number related to it.
-		    There is a user_group table which contains userid to groupid mappings
-		    to determine which groups each user belongs to.  Additionally there is
-		    a bug_group table that has bugid to groupid mappings to show which
-		    groups can see a particular bug. If there are no entries for a bug in
-		    this table then the bug is public.
-		  </P
-></LI
-><LI
-><P
->		    Product groups. product_table created to only allow certain products to
-		    be visible for certain groups in both bug entry and query. This was
-		    particulary helpful for support contracts.
-		  </P
-></LI
-><LI
-><P
->		    Of course many (too many) changes to Bugzilla code itself to allow use
-		    with Oracle and still allow operation with Mysql if so desired.
-		    Currently if you use Mysql it is set to use Mysql's old permission
-		    scheme to keep breakage to a minimum. Hopefully one day this will
-		    standardize on one style which may of course be something completely
-		    different.
-		  </P
-></LI
-><LI
-><P
->		    Uses Text::Template perl module for rendering of the dynamic HTML pages
-		    such as enter_bug.cgi, query.cgi, bug_form.pl, and for the header and
-		    footer parts of the page. This allows the html to be separate from the
-		    perl code for customizing the look and feel of the page to one's
-		    preference.
-		  </P
-></LI
-><LI
-><P
->		    There are many other smaller changes. There is also a port to Oracle
-		    that I have been working on as time permits but is not completely
-		    finished but somewhat usable. I will merge it into our standard code
-		    base when it becomes production quality. Unfortunately there will have
-		    to be some conditionals in the code to make it work with other than
-		    Oracle due to some differences between Oracle and Mysql.
-		  </P
-></LI
-></OL
-><P
->		Both the Mysql and Oracle versions of our current code base are
-		available from ftp://people.redhat.com/dkl. If Terry/Tara wants I can submit
-		patch files for all of the changes I have made and he can determine what is
-		suitable for addition to the main bugzilla cade base. But for me to commit
-		changes to the actual CVS I will need to back out alot of things that are
-		not suitable for the rest of the Bugzilla community. I am open to
-		suggestions.
-	      </P
-></BLOCKQUOTE
 >
+	    Yes!  You can find more information elsewhere in "The Bugzilla
+	    Guide" in the "Integration with Third-Party Products" section.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1853"
-></A
-><B
+NAME="AEN1743"><B
 >A.2.3. </B
->	    What's the current status of Red Hat Bugzilla?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    <DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->		This information is somewhat dated; I last updated it
-		7 June 2000.  Please see the "Variants" section of "The Bugzilla Guide"
-		for more up-to-date information regarding Red Hat Bugzilla.
-	      </P
-></TD
-></TR
-></TABLE
-></DIV
->
-	    <EM
->Dave Lawrence</EM
->:
-	    <A
-NAME="AEN1860"
-></A
-><BLOCKQUOTE
-CLASS="BLOCKQUOTE"
-><P
->		     I suppose the current thread warrants an update on the status of
-		Oracle and bugzilla ;) We have now been running Bugzilla 2.8 on
-		Oracle for the last two days in our production environment. I
-		tried to do as much testing as possible with it before going live
-		which is some of the reason for the long delay. I did not get
-		enough feedback as I would have liked from internal developers to
-		help weed out any bugs still left so I said "Fine, i will take it
-		live and then I will get the feedback I want :)" So it is now
-		starting to stabilize and it running quite well after working
-		feverishly the last two days fixing problems as soon as they came
-		in from the outside world. The current branch in cvs is up2date if
-		anyone would like to grab it and try it out. The oracle _setup.pl
-		is broken right now due to some last minute changes but I will
-		update that soon. Therefore you would probably need to create the
-		database tables the old fashioned way using the supplied sql
-		creation scripts located in the ./oracle directory. We have heavy
-		optimizations in the database it self thanks to the in-house DBA
-		here at Red Hat so it is running quite fast. The database itself
-		is located on a dual PII450 with 1GB ram and 14 high voltage
-		differential raided scsi drives. The tables and indexes are
-		partitioned in 4 chuncks across the raided drive which is nice
-		because when ever you need to do a full table scan, it is actually
-		starting in 4 different locations on 4 different drives
-		simultaneously. And the indexes of course are on separate drives
-		from the data so that speeds things up tremendously. When  I can
-		find the time I will document all that we have done to get this
-		thing going to help others that may need it.
-	      </P
-><P
->		As Matt has mentioned it is still using out-dated code and with a
-		little help I would like to bring everything up to date for
-		eventual  incorporation with the main cvs tree. Due to other
-		duties I have with the company any help with this wiould be
-		appreciated. What we are using  now is what I call a best first
-		effort. It definitely can be improved on and may even need
-		complete rewrites in a lot of areas. A lot of changes may have to
-		be made in the way Bugzilla does things currently  to make this
-		transition to a more generic database interface.  Fortunately when
-		making the Oracle changes I made sure I didn't do  anything that I
-		would consider Oracle specific and could not be easily done with
-		other databases. Alot of the sql statements need to be broken up
-		into smaller utilities that themselves would need to make
-		decisions on what database they are using but the majority of the
-		code can be made database neutral.
-	      </P
-></BLOCKQUOTE
 >
+	    Does Bugzilla allow the user to track multiple projects?
 	  </P
 ></DIV
-></DIV
-></DIV
-><DIV
-CLASS="QANDADIV"
-><H3
-><A
-NAME="FAQ_LOKI"
-></A
->3. Loki Bugzilla (AKA Fenris)</H3
-><DIV
-CLASS="QANDAENTRY"
 ><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN1866"
-></A
-><B
->A.3.1. </B
->	    What is Loki Bugzilla (Fenris)?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Loki Games has a customized version of Bugzilla available at
-	    <A
-HREF="http://fenris.lokigames.com/"
-TARGET="_top"
->http://fenris.lokigames.com</A
->.  There are some advantages to using Fenris, chief being separation of comments based upon user privacy level, data hiding, forced login for any data retrieval, and some additional fields.  Loki has mainted their code, originally a fork from the Bugzilla 2.8 code base, and it is quite a bit different than stock Bugzilla at this point.  I recommend you stick with official Bugzilla version 2.14 rather than using a fork, but it's up to you.
-	  </P
-></DIV
-></DIV
-></DIV
-><DIV
-CLASS="QANDADIV"
-><H3
-><A
-NAME="FAQ_PHB"
-></A
->4. Pointy-Haired-Boss Questions</H3
-><P
->	<DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	    The title of this section doesn't mean you're a PHB -- it just means
-	    you probably HAVE a PHB who wants to know this :)
-	  </P
-></TD
-></TR
-></TABLE
-></DIV
 >
-      </P
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN1877"
-></A
-><B
->A.4.1. </B
->	    Is Bugzilla web-based or do you have to have specific software or
-	    specific operating system on your machine?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    It is web and e-mail based.  You can edit bugs by sending specially
-	    formatted email to a properly configured Bugzilla, or control via the web.
+	    Absolutely!  You can track any number of Products (although you
+      are limited to about 55 or so if
+      you are using Product-Based Groups), that can each be composed of any
+      number of Components.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1882"
-></A
-><B
->A.4.2. </B
->	    Has anyone you know of already done any Bugzilla integration with
-	    Perforce (SCM software)?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    Yes!  You can find more information elsewhere in "The Bugzilla
-	    Guide" in the "Integration with Third-Party Products" section.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN1887"
-></A
-><B
->A.4.3. </B
->	    Does Bugzilla allow the user to track multiple projects?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    Absolutely!  You can track up to a "soft-limit" of around
-	    64 individual "Products", that can each be composed of as
-	    many "Components" as you want.  Check the Administration
-	    section of the Bugzilla Guide for more information regarding
-	    setting up Products and Components.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN1892"
-></A
-><B
->A.4.4. </B
->	    If I am on many projects, and search for all bugs assigned to me, will
+NAME="AEN1748"><B
+>A.2.4. </B
+>
+	    If I am on many projects, and search for all bugs assigned to me, will
 	    Bugzilla list them for me and allow me to sort by project, severity etc?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Yes.
+>
+	    Yes.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1897"
-></A
-><B
->A.4.5. </B
->	    Does Bugzilla allow attachments (text, screenshots, urls etc)? If yes,
+NAME="AEN1753"><B
+>A.2.5. </B
+>
+	    Does Bugzilla allow attachments (text, screenshots, URLs etc)? If yes,
 	    are there any that are NOT allowed?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Yes.  There are many specific MIME-types that are pre-defined by Bugzilla,
+>
+	    Yes - any sort of attachment is allowed, although administrators can
+      configure a maximum size.  
+      There are many specific MIME-types that are pre-defined by Bugzilla,
 	    but you may specify any arbitrary MIME-type you need when you
-	    upload the file.  Since all attachments are stored in the database,
-	    however, I recommend storing large binary attachments elsewhere
-	    in the web server's file system and providing a hyperlink
-	    as a comment, or in the provided "URL" field in the bug report.
+	    upload the file. 
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1902"
-></A
-><B
->A.4.6. </B
->	    Does Bugzilla allow us to define our own priorities and levels? Do we
+NAME="AEN1758"><B
+>A.2.6. </B
+>
+	    Does Bugzilla allow us to define our own priorities and levels? Do we
 	    have complete freedom to change the labels of fields and format of them, and
 	    the choice of acceptable values?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Yes.  However, modifying some fields, notably those related to bug
+>
+	    Yes.  However, modifying some fields, notably those related to bug
 	    progression states, also require adjusting the program logic to
 	    compensate for the change.
 	  </P
 ><P
->	    There is no GUI for adding fields to Bugzilla at this
+>&#13;	    There is no GUI for adding fields to Bugzilla at this
 	    time.  You can follow development of this feature at
 	    <A
 HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=91037"
@@ -1729,295 +1125,116 @@ TARGET="_top"
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1909"
-></A
-><B
->A.4.7. </B
->	    The index.html page doesn't show the footer.  It's really annoying to have
-	    to go to the querypage just to check my "my bugs" link.  How do I get a footer
-	    on static HTML pages?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->            It's possible to get the footer on the static index page using
-            Server Side Includes (SSI).  The trick to doing this is making
-            sure that your web server is set up to allow SSI and specifically,
-            the #exec directive.  You should also rename <TT
-CLASS="FILENAME"
->index.html</TT
->
-            to <TT
-CLASS="FILENAME"
->index.shtml</TT
->.
-          </P
-><P
->            After you've done all that, you can add the following line to
-            <TT
-CLASS="FILENAME"
->index.shtml</TT
->:
-<TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
->&#60;!--#exec cmd="/usr/bin/perl -e &#38;quot;require 'CGI.pl'; PutFooter();&#38;quot;" --&#62;</PRE
-></FONT
-></TD
-></TR
-></TABLE
->
-          </P
-><P
-><DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->              This line will be replaced with the actual HTML for the footer
-              when the page is requested, so you should put this line where you
-              want the footer to appear.
-            </P
-></TD
-></TR
-></TABLE
-></DIV
-></P
-><P
->            Because this method depends on being able to use a #exec directive,
-            and most ISP's will not allow that, there is an alternative method.
-            You could have a small script (such as <TT
-CLASS="FILENAME"
->api.cgi</TT
->)
-            that basically looks like:
-<TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
->#!/usr/bonsaitools/bin/perl -w
-
-require 'globals.pl';
-
-if ($::FORM{sub} eq 'PutFooter') {
-    PutFooter();
-} else {
-    die 'api.cgi was incorrectly called';
-}</PRE
-></FONT
-></TD
-></TR
-></TABLE
->
-            and then put this line in <TT
-CLASS="FILENAME"
->index.shtml</TT
->.
-<TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
->&#60;!--#include virtual="api.cgi?sub=PutFooter"--&#62;</PRE
-></FONT
-></TD
-></TR
-></TABLE
->
-          </P
-><P
-> <DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->              This still requires being able to use Server Side Includes, if
-              this simply will not work for you, see <A
-HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=80183"
-TARGET="_top"
->bug 80183</A
+NAME="AEN1765"><B
+>A.2.7. </B
 >
-              for a third option.
-            </P
-></TD
-></TR
-></TABLE
-></DIV
-></P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN1931"
-></A
-><B
->A.4.8. </B
->	    Does Bugzilla provide any reporting features, metrics, graphs, etc? You
+	    Does Bugzilla provide any reporting features, metrics, graphs, etc? You
 	    know, the type of stuff that management likes to see. :)
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Yes.  Look at <A
+>
+	    Yes.  Look at <A
 HREF="http://bugzilla.mozilla.org/reports.cgi"
 TARGET="_top"
->	    http://bugzilla.mozilla.org/reports.cgi</A
+>&#13;	    http://bugzilla.mozilla.org/reports.cgi</A
 > for basic reporting
-	    facilities.
+	    and graphing facilities.
 	  </P
 ><P
->	    For more advanced reporting, I recommend hooking up a professional
+>&#13;	    For more advanced reporting, I recommend hooking up a professional
 	    reporting package, such as Crystal Reports, and use ODBC to access
 	    the MySQL database.  You can do a lot through the Query page of
 	    Bugzilla as well, but right now Advanced Reporting is much
 	    better accomplished through third-party utilities that can
 	    interface with the database directly.
 	  </P
-><P
->	    Advanced Reporting is a Bugzilla 3.X proposed feature.
-	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1939"
-></A
-><B
->A.4.9. </B
->	    Is there email notification and if so, what do you see when you get an
-	    email? Do you see bug number and title or is it only the number?
+NAME="AEN1772"><B
+>A.2.8. </B
+>
+	    Is there email notification and if so, what do you see when you get an
+	    email?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Email notification is user-configurable.  The bug id and Topic
-	    of the bug report accompany each email notification, along with
+>
+	    Email notification is user-configurable.  By default, the bug id and 
+      Summary of the bug report accompany each email notification, along with
 	    a list of the changes made.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1944"
-></A
-><B
->A.4.10. </B
->	    Can email notification be set up to send to multiple
+NAME="AEN1777"><B
+>A.2.9. </B
+>
+	    Can email notification be set up to send to multiple
 	    people, some on the To List, CC List, BCC List etc?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Yes.
+>
+	    Yes.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1949"
-></A
-><B
->A.4.11. </B
->	    If there is email notification, do users have to have any particular
+NAME="AEN1782"><B
+>A.2.10. </B
+>
+	    Do users have to have any particular
 	    type of email application?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Bugzilla email is sent in plain text, the most compatible mail format
+>
+	    Bugzilla email is sent in plain text, the most compatible mail format
 	    on the planet.
 	    <DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -2033,7 +1250,7 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->		If you decide to use the bugzilla_email integration features
+>&#13;		If you decide to use the bugzilla_email integration features
 		to allow Bugzilla to record responses to mail with the associated bug,
 		you may need to caution your users to set their mailer to "respond
 		to messages in the format in which they were sent".  For security reasons
@@ -2049,65 +1266,38 @@ VALIGN="TOP"
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1956"
-></A
-><B
->A.4.12. </B
->	     If I just wanted to track certain bugs, as they go through life, can I
-	    set it up to alert me via email whenever that bug changes, whether it be
-	    owner, status or description etc.?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    Yes.  Place yourself in the "cc" field of the bug you wish to monitor.
-	    Then change your "Notify me of changes to" field in the Email Settings
-	    tab of the User Preferences screen in Bugzilla to the "Only those
-	    bugs which I am listed on the CC line" option.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN1961"
-></A
-><B
->A.4.13. </B
->	    Does Bugzilla allow data to be imported and exported? If I had outsiders
+NAME="AEN1789"><B
+>A.2.11. </B
+>
+	    Does Bugzilla allow data to be imported and exported? If I had outsiders
 	    write up a bug report using a MS Word bug template, could that template be
 	    imported into "matching" fields? If I wanted to take the results of a query
 	    and export that data to MS Excel, could I do that?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Mozilla allows data export through a custom DTD in XML format.
+>
+	    Mozilla allows data export through a custom DTD in XML format.
 	    It does not, however, export to specific formats other than the
 	    XML Mozilla DTD.  Importing the data into Excel or any other application
 	    is left as an exercise for the reader.
 	  </P
 ><P
->	    If you create import filters to other applications from Mozilla's XML,
+>&#13;	    If you create import filters to other applications from Mozilla's XML,
 	    please submit your modifications for inclusion in future Bugzilla
 	    distributions.
 	  </P
 ><P
->	    As for data import, any application can send data to Bugzilla through
+>&#13;	    As for data import, any application can send data to Bugzilla through
 	    the HTTP protocol, or through Mozilla's XML API.  However, it seems
 	    kind of silly to put another front-end in front of Bugzilla;
 	    it makes more sense to create a simplified bug submission form in
@@ -2115,240 +1305,171 @@ CLASS="ANSWER"
 	    <A
 HREF="http://www.mozilla.org/quality/help/bugzilla-helper.html"
 TARGET="_top"
->	    http://www.mozilla.org/quality/help/bugzilla-helper.html</A
+>&#13;	    http://www.mozilla.org/quality/help/bugzilla-helper.html</A
 >
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1969"
-></A
-><B
->A.4.14. </B
->	    Has anyone converted Bugzilla to another language to be used in other
+NAME="AEN1797"><B
+>A.2.12. </B
+>
+	    Has anyone converted Bugzilla to another language to be used in other
 	    countries? Is it localizable?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Currently, no.  Internationalization support for Perl did not
-	    exist in a robust fashion until the recent release of version 5.6.0;
-	    Bugzilla is, and likely will remain (until 3.X) completely
-	    non-localized.
+>
+	    To a certain extent, yes. 2.16's templates mean that you can localise
+      the user-facing UI (and several projects are doing exactly that.) However,
+      error messages and the admin interface are currently not localisable.
+      This should be achieved by 2.18.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1974"
-></A
-><B
->A.4.15. </B
->	    Can a user create and save reports? Can they do this in Word format?
+NAME="AEN1802"><B
+>A.2.13. </B
+>
+	    Can a user create and save reports? Can they do this in Word format?
 	    Excel format?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    Yes.  No.  No.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN1979"
-></A
-><B
->A.4.16. </B
->	    Can a user re-run a report with a new project, same query?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    Yes.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN1984"
-></A
-><B
->A.4.17. </B
->	    Can a user modify an existing report and then save it into another name?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    You can save an unlimited number of queries in Bugzilla.  You are free
-	    to modify them and rename them to your heart's desire.
+>
+	    Yes.  No.  No.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1989"
-></A
-><B
->A.4.18. </B
->	    Does Bugzilla have the ability to search by word, phrase, compound
+NAME="AEN1807"><B
+>A.2.14. </B
+>
+	    Does Bugzilla have the ability to search by word, phrase, compound
 	    search?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    You have no idea.  Bugzilla's query interface, particularly with the
+>
+	    You have no idea.  Bugzilla's query interface, particularly with the
 	    advanced Boolean operators, is incredibly versatile.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN1994"
-></A
-><B
->A.4.19. </B
->	    Can the admin person establish separate group and individual user
-	    privileges?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    Yes.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN1999"
-></A
-><B
->A.4.20. </B
->	     Does Bugzilla provide record locking when there is simultaneous access
+NAME="AEN1812"><B
+>A.2.15. </B
+>
+	     Does Bugzilla provide record locking when there is simultaneous access
 	    to the same bug? Does the second person get a notice that the bug is in use
 	    or how are they notified?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Bugzilla does not lock records.  It provides mid-air collision detection,
+>
+	    Bugzilla does not lock records.  It provides mid-air collision detection,
 	    and offers the offending user a choice of options to deal with the conflict.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2004"
-></A
-><B
->A.4.21. </B
->	    Are there any backup features provided?
+NAME="AEN1817"><B
+>A.2.16. </B
+>
+	    Are there any backup features provided?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    MySQL, the database back-end for Bugzilla, allows hot-backup of data.
+>
+	    MySQL, the database back-end for Bugzilla, allows hot-backup of data.
 	    You can find strategies for dealing with backup considerations
 	    at <A
 HREF="http://www.mysql.com/doc/B/a/Backup.html"
 TARGET="_top"
->	    http://www.mysql.com/doc/B/a/Backup.html</A
+>&#13;	    http://www.mysql.com/doc/B/a/Backup.html</A
 >
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2010"
-></A
-><B
->A.4.22. </B
->	    Can users be on the system while a backup is in progress?
+NAME="AEN1823"><B
+>A.2.17. </B
+>
+	    Can users be on the system while a backup is in progress?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Yes.  However, commits to the database must wait
+>
+	    Yes.  However, commits to the database must wait
 	    until the tables are unlocked.  Bugzilla databases are typically
 	    very small, and backups routinely take less than a minute.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2015"
-></A
-><B
->A.4.23. </B
->	    What type of human resources are needed to be on staff to install and
+NAME="AEN1828"><B
+>A.2.18. </B
+>
+	    What type of human resources are needed to be on staff to install and
 	    maintain Bugzilla? Specifically, what type of skills does the person need to
 	    have? I need to find out if we were to go with Bugzilla, what types of
 	    individuals would we need to hire and how much would that cost vs buying an
@@ -2356,38 +1477,32 @@ NAME="AEN2015"
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    If Bugzilla is set up correctly from the start, continuing maintenance needs
-	    are minimal and can be completed by unskilled labor.  Things like rotate
-	    backup tapes and check log files for the word "error".
+>
+	    If Bugzilla is set up correctly from the start, continuing maintenance
+      needs are minimal and can be done easily using the web interface.
 	  </P
 ><P
->	    Commercial Bug-tracking software typically costs somewhere upwards
+>&#13;	    Commercial Bug-tracking software typically costs somewhere upwards
 	    of $20,000 or more for 5-10 floating licenses.  Bugzilla consultation
-	    is available from skilled members of the newsgroup.
-	  </P
-><P
->	    As an example, as of this writing I typically charge
-	     $115 for the first hour, and $89 each hour thereafter
-	    for consulting work.  It takes me three to five hours to make Bugzilla
-	    happy on a Development installation of Linux-Mandrake.
+	    is available from skilled members of the newsgroup. Simple questions
+      are answered there and then.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2022"
-></A
-><B
->A.4.24. </B
->	    What time frame are we looking at if we decide to hire people to install
+NAME="AEN1834"><B
+>A.2.19. </B
+>
+	    What time frame are we looking at if we decide to hire people to install
 	    and maintain the Bugzilla? Is this something that takes hours or weeks to
 	    install and a couple of hours per week to maintain and customize or is this
 	    a multi-week install process, plus a full time job for 1 person, 2 people,
@@ -2395,11 +1510,12 @@ NAME="AEN2022"
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    It all depends on your level of commitment.  Someone with much Bugzilla
+>
+	    It all depends on your level of commitment.  Someone with much Bugzilla
 	    experience can get you up and running in less than a day, and
 	    your Bugzilla install can run untended for years.  If your
 	    Bugzilla strategy is critical to your business workflow, hire somebody
@@ -2409,191 +1525,109 @@ CLASS="ANSWER"
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2027"
-></A
-><B
->A.4.25. </B
->	    Is there any licensing fee or other fees for using Bugzilla? Any
+NAME="AEN1839"><B
+>A.2.20. </B
+>
+	    Is there any licensing fee or other fees for using Bugzilla? Any
 	    out-of-pocket cost other than the bodies needed as identified above?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    No.  MySQL asks, if you find their product valuable, that you purchase
+>
+	    No.  MySQL asks, if you find their product valuable, that you purchase
 	    a support contract from them that suits your needs.
 	  </P
 ></DIV
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDADIV"
-><H3
-><A
-NAME="FAQ_INSTALL"
-></A
->5. Bugzilla Installation</H3
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2034"
-></A
-><B
->A.5.1. </B
->	    How do I download and install Bugzilla?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    Check <A
-HREF="http://www.mozilla.org/projects/bugzilla/"
-TARGET="_top"
->	    http://www.mozilla.org/projects/bugzilla/</A
-> for details.
-	    Once you download it, untar it, read the Bugzilla Guide.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2040"
-></A
-><B
->A.5.2. </B
->	    How do I install Bugzilla on Windows NT?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    Installation on Windows NT has its own section in
-	    "The Bugzilla Guide".
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2045"
-></A
-><B
->A.5.3. </B
->	    Is there an easy way to change the Bugzilla cookie name?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    At present, no.
-	  </P
-></DIV
-></DIV
-></DIV
-><DIV
-CLASS="QANDADIV"
+CLASS="qandadiv"
 ><H3
 ><A
-NAME="FAQ_SECURITY"
-></A
->6. Bugzilla Security</H3
+NAME="faq-security">3. Bugzilla Security</H3
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2052"
-></A
-><B
->A.6.1. </B
->	    How do I completely disable MySQL security if it's giving me problems
-	    (I've followed the instructions in the installation section of this guide!)?
+NAME="AEN1846"><B
+>A.3.1. </B
+>
+	    How do I completely disable MySQL security if it's giving me problems
+	    (I've followed the instructions in the installation section of this guide)?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Run mysql like this: "mysqld --skip-grant-tables".  Please remember <EM
+>
+	    Run MySQL like this: "mysqld --skip-grant-tables".  Please remember <EM
 >this
-	    makes mysql as secure as taping a $100 to the floor of a football stadium
+	    makes MySQL as secure as taping a $100 to the floor of a football stadium
 	    bathroom for safekeeping.</EM
->  Please read the Security section of the
-	    Administration chapter of "The Bugzilla Guide" before proceeding.
+> 
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2058"
-></A
-><B
->A.6.2. </B
->	    Are there any security problems with Bugzilla?
+NAME="AEN1852"><B
+>A.3.2. </B
+>
+	    Are there any security problems with Bugzilla?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    The Bugzilla code has not undergone a complete security audit.
-	    It is recommended that you closely examine permissions on your Bugzilla
+>
+	    The Bugzilla code has undergone a reasonably complete security audit,
+      and user-facing CGIs run under Perl's taint mode. However, 
+	    it is recommended that you closely examine permissions on your Bugzilla
 	    installation, and follow the recommended security guidelines found
 	    in The Bugzilla Guide.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2063"
-></A
-><B
->A.6.3. </B
->	    I've implemented the security fixes mentioned in Chris Yeh's security
+NAME="AEN1857"><B
+>A.3.3. </B
+>
+	    I've implemented the security fixes mentioned in Chris Yeh's security
 	    advisory of 5/10/2000 advising not to run MySQL as root, and am running into
 	    problems with MySQL no longer working correctly.
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    This is a common problem, related to running out of file descriptors.
+>
+	    This is a common problem, related to running out of file descriptors.
 	    Simply add "ulimit -n unlimited" to the script which starts
 	    mysqld.
 	  </P
@@ -2601,84 +1635,82 @@ CLASS="ANSWER"
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDADIV"
+CLASS="qandadiv"
 ><H3
 ><A
-NAME="FAQ_EMAIL"
-></A
->7. Bugzilla Email</H3
+NAME="faq-email">4. Bugzilla Email</H3
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2070"
-></A
-><B
->A.7.1. </B
->	    I have a user who doesn't want to receive any more email from Bugzilla.
+NAME="AEN1864"><B
+>A.4.1. </B
+>
+	    I have a user who doesn't want to receive any more email from Bugzilla.
 	    How do I stop it entirely for this user?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    With the email changes to 2.12, the user should be able to set
-	    this in user email preferences.
+>
+	    The user should be able to set
+	    this in user email preferences (uncheck all boxes.)
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2075"
-></A
-><B
->A.7.2. </B
->	    I'm evaluating/testing Bugzilla, and don't want it to send email to
+NAME="AEN1869"><B
+>A.4.2. </B
+>
+	    I'm evaluating/testing Bugzilla, and don't want it to send email to
 	    anyone but me. How do I do it?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Edit the param for the mail text. Replace "To:" with "X-Real-To:",
-	    replace "Cc:" with "X-Real-CC:", and add a "To: (myemailaddress)".
+>
+	    Edit the "changedmail" Param. Replace "To:" with "X-Real-To:",
+	    replace "Cc:" with "X-Real-CC:", and add a "To: &#60;youremailaddress&#62;".
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2080"
-></A
-><B
->A.7.3. </B
->	    I want whineatnews.pl to whine at something more, or other than, only new
+NAME="AEN1874"><B
+>A.4.3. </B
+>
+	    I want whineatnews.pl to whine at something more, or other than, only new
 	    bugs. How do I do it?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Try Klaas Freitag's excellent patch for "whineatassigned" functionality.
+>
+	    Try Klaas Freitag's excellent patch for "whineatassigned" functionality.
 	    You can find it at<A
 HREF=" http://bugzilla.mozilla.org/show_bug.cgi?id=6679"
 TARGET="_top"
->	      http://bugzilla.mozilla.org/show_bug.cgi?id=6679</A
+>&#13;	      http://bugzilla.mozilla.org/show_bug.cgi?id=6679</A
 >. This
 	    patch is against an older version of Bugzilla, so you must apply
 	    the diffs manually.
@@ -2686,33 +1718,31 @@ TARGET="_top"
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2086"
-></A
-><B
->A.7.4. </B
->	    I don't like/want to use Procmail to hand mail off to bug_email.pl.
+NAME="AEN1880"><B
+>A.4.4. </B
+>
+	    I don't like/want to use Procmail to hand mail off to bug_email.pl.
 	    What alternatives do I have?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    You can call bug_email.pl directly from your aliases file, with
+>
+	    You can call bug_email.pl directly from your aliases file, with
 	    an entry like this:
 	    <A
-NAME="AEN2090"
-></A
-><BLOCKQUOTE
+NAME="AEN1884"><BLOCKQUOTE
 CLASS="BLOCKQUOTE"
 ><P
->		bugzilla-daemon: "|/usr/local/bin/bugzilla/contrib/bug_email.pl"
+>&#13;		bugzilla-daemon: "|/usr/local/bin/bugzilla/contrib/bug_email.pl"
 	      </P
 ></BLOCKQUOTE
 >
@@ -2723,53 +1753,54 @@ CLASS="BLOCKQUOTE"
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2093"
-></A
-><B
->A.7.5. </B
->	    How do I set up the email interface to submit/change bugs via email?
+NAME="AEN1887"><B
+>A.4.5. </B
+>
+	    How do I set up the email interface to submit/change bugs via email?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    You can find an updated README.mailif file in the contrib/ directory
+>
+	    You can find an updated README.mailif file in the contrib/ directory
 	    of your Bugzilla distribution that walks you through the setup.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2098"
-></A
-><B
->A.7.6. </B
->	    Email takes FOREVER to reach me from bugzilla -- it's extremely slow.
+NAME="AEN1892"><B
+>A.4.6. </B
+>
+	    Email takes FOREVER to reach me from Bugzilla -- it's extremely slow.
 	    What gives?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    If you are using an alternate Mail Transport Agent (MTA other than
-	    sendmail), make sure the options given in the "processmail" script for all
+>
+	    If you are using an alternate Mail Transport Agent (MTA other than
+	    sendmail), make sure the options given in the "processmail" and other
+      scripts for all
 	    instances of "sendmail" are correct for your MTA.
 	  </P
 ><P
->	    If you are using Sendmail, try enabling "sendmailnow" in editparams.cgi.
+>&#13;	    If you are using Sendmail, try enabling "sendmailnow" in editparams.cgi.
             If you are using Postfix, you will also need to enable <SPAN
 CLASS="QUOTE"
 >"sendmailnow"</SPAN
@@ -2778,30 +1809,30 @@ CLASS="QUOTE"
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2105"
-></A
-><B
->A.7.7. </B
->	     How come email never reaches me from bugzilla changes?
+NAME="AEN1899"><B
+>A.4.7. </B
+>
+	     How come email from Bugzilla changes never reaches me?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Double-check that you have not turned off email in your user preferences.
+>
+	    Double-check that you have not turned off email in your user preferences.
 	    Confirm that Bugzilla is able to send email by visiting the "Log In"
 	    link of your Bugzilla installation and clicking the "Email me a password"
 	    button after entering your email address.
 	  </P
 ><P
->	    If you never receive mail from Bugzilla, chances you do not have
+>&#13;	    If you never receive mail from Bugzilla, chances you do not have
 	    sendmail in "/usr/lib/sendmail".  Ensure sendmail lives in, or is symlinked
 	    to, "/usr/lib/sendmail".
 	  </P
@@ -2809,97 +1840,60 @@ CLASS="ANSWER"
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDADIV"
+CLASS="qandadiv"
 ><H3
 ><A
-NAME="FAQ_DB"
-></A
->8. Bugzilla Database</H3
+NAME="faq-db">5. Bugzilla Database</H3
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2113"
-></A
-><B
->A.8.1. </B
->	    I've heard Bugzilla can be used with Oracle?
+NAME="AEN1907"><B
+>A.5.1. </B
+>
+	    I've heard Bugzilla can be used with Oracle?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Red Hat Bugzilla, mentioned above, works with Oracle.  The current version
+>
+	    Red Hat Bugzilla works with Oracle.  The current version
 	    from Mozilla.org does not have this capability.  Unfortunately, though
 	    you will sacrifice a lot of the really great features available in
-	    Bugzilla 2.10 and 2.12 if you go with the 2.8-based Redhat version.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2118"
-></A
-><B
->A.8.2. </B
->	    Bugs are missing from queries, but exist in the database (and I can pull
-	    them up by specifying the bug ID). What's wrong?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	     You've almost certainly enabled the "shadow database", but for some
-	    reason it hasn't been updated for all your bugs. This is the database
-	    against which queries are run, so that really complex or slow queries won't
-	    lock up portions of the database for other users. You can turn off the
-	    shadow database in editparams.cgi. If you wish to continue using the shadow
-	    database, then as your "bugs" user run "./syncshadowdb -syncall" from the
-	    command line in the bugzilla installation directory to recreate your shadow
-	    database. After it finishes, be sure to check the params and make sure that
-	    "queryagainstshadowdb" is still turned on. The syncshadowdb program turns it
-	    off if it was on, and is supposed to turn it back on when completed; that
-	    way, if it crashes in the middle of recreating the database, it will stay
-	    off forever until someone turns it back on by hand. Apparently, it doesn't
-	    always do that yet.
+	    Bugzilla 2.14 and 2.16 if you go with the 2.8-based Redhat version.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2123"
-></A
-><B
->A.8.3. </B
->	    I think my database might be corrupted, or contain invalid entries. What
+NAME="AEN1912"><B
+>A.5.2. </B
+>
+	    I think my database might be corrupted, or contain invalid entries. What
 	    do I do?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Run the <SPAN
+>
+	    Run the <SPAN
 CLASS="QUOTE"
 >"sanity check"</SPAN
 > utility
 	    (<TT
-CLASS="FILENAME"
+CLASS="filename"
 >./sanitycheck.cgi</TT
 > in the
 	    Bugzilla_home directory) from your web browser to see! If
@@ -2921,24 +1915,24 @@ CLASS="FILENAME"
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2131"
-></A
-><B
->A.8.4. </B
->	    I want to manually edit some entries in my database. How?
+NAME="AEN1920"><B
+>A.5.3. </B
+>
+	    I want to manually edit some entries in my database. How?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	     There is no facility in Bugzilla itself to do this. It's also generally
+>
+	     There is no facility in Bugzilla itself to do this. It's also generally
 	    not a smart thing to do if you don't know exactly what you're doing.
 	    However, if you understand SQL you can use the mysqladmin utility to
 	    manually insert, delete, and modify table information. Personally, I
@@ -2948,49 +1942,49 @@ CLASS="ANSWER"
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2136"
-></A
-><B
->A.8.5. </B
->	    I try to add myself as a user, but Bugzilla always tells me my password is wrong.
+NAME="AEN1925"><B
+>A.5.4. </B
+>
+	    I try to add myself as a user, but Bugzilla always tells me my password is wrong.
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Certain version of MySQL (notably, 3.23.29 and 3.23.30) accidentally disabled
+>
+	    Certain version of MySQL (notably, 3.23.29 and 3.23.30) accidentally disabled
 	    the "crypt()" function.  This prevented MySQL from storing encrypted passwords.
 	    Upgrade to the "3.23 stable" version of MySQL and you should be good to go.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2141"
-></A
-><B
->A.8.6. </B
->	    I think I've set up MySQL permissions correctly, but bugzilla still can't
+NAME="AEN1930"><B
+>A.5.5. </B
+>
+	    I think I've set up MySQL permissions correctly, but Bugzilla still can't
 	    connect.
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Try running MySQL from its binary: "mysqld --skip-grant-tables". This
+>
+	    Try running MySQL from its binary: "mysqld --skip-grant-tables". This
 	    will allow you to completely rule out grant tables as the cause of your
 	    frustration. However, I do not recommend you run it this way on a regular
 	    basis, unless you really want your web site defaced and your machine
@@ -2999,191 +1993,125 @@ CLASS="ANSWER"
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2146"
-></A
-><B
->A.8.7. </B
->	    How do I synchronize bug information among multiple different Bugzilla
+NAME="AEN1935"><B
+>A.5.6. </B
+>
+	    How do I synchronize bug information among multiple different Bugzilla
 	    databases?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Well, you can synchronize or you can move bugs.  Synchronization will
+>
+	    Well, you can synchronize or you can move bugs.  Synchronization will
 	    only work one way -- you can create a read-only copy of the database
 	    at one site, and have it regularly updated at intervals from the main
 	    database.
 	  </P
 ><P
->	    MySQL has some synchronization features builtin to the latest releases.
+>&#13;	    MySQL has some synchronization features builtin to the latest releases.
 	    It would be great if someone looked into the possibilities there
 	    and provided a report to the newsgroup on how to effectively
 	    synchronize two Bugzilla installations.
 	  </P
 ><P
->	    If you simply need to transfer bugs from one Bugzilla to another,
+>&#13;	    If you simply need to transfer bugs from one Bugzilla to another,
 	    checkout the "move.pl" script in the Bugzilla distribution.
 	  </P
 ></DIV
 ></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2153"
-></A
-><B
->A.8.8. </B
->	    Why do I get bizarre errors when trying to submit data, particularly problems
-	    with "groupset"?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    If you're sure your MySQL parameters are correct, you might want turn
-	    "strictvaluechecks" OFF in editparams.cgi.  If you have "usebugsentry" set
-	    "On", you also cannot submit a bug as readable by more than one group with
-	    "strictvaluechecks" ON.
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2158"
-></A
-><B
->A.8.9. </B
->	    How come even after I delete bugs, the long descriptions show up?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    This should only happen with Bugzilla 2.14 if you are
-	    using the <SPAN
-CLASS="QUOTE"
->"shadow database"</SPAN
-> feature, and your
-	    shadow database is out of sync.  Try running
-	    <TT
-CLASS="FILENAME"
->syncshadowdb</TT
->
-	    <TT
-CLASS="OPTION"
->-syncall</TT
-> to make sure your shadow
-	    database is in synch with your primary database.
-	  </P
-></DIV
-></DIV
 ></DIV
 ><DIV
-CLASS="QANDADIV"
+CLASS="qandadiv"
 ><H3
 ><A
-NAME="FAQ_NT"
-></A
->9. Bugzilla and Win32</H3
+NAME="faq-nt">6. Bugzilla and Win32</H3
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2168"
-></A
-><B
->A.9.1. </B
->	    What is the easiest way to run Bugzilla on Win32 (Win98+/NT/2K)?
+NAME="AEN1944"><B
+>A.6.1. </B
+>
+	    What is the easiest way to run Bugzilla on Win32 (Win98+/NT/2K)?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Remove Windows. Install Linux. Install Bugzilla.
+>
+	    Remove Windows. Install Linux. Install Bugzilla.
 	    The boss will never know the difference.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2173"
-></A
-><B
->A.9.2. </B
->	    Is there a "Bundle::Bugzilla" equivalent for Win32?
+NAME="AEN1949"><B
+>A.6.2. </B
+>
+	    Is there a "Bundle::Bugzilla" equivalent for Win32?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Not currently.  Bundle::Bugzilla enormously simplifies Bugzilla
+>
+	    Not currently.  Bundle::Bugzilla enormously simplifies Bugzilla
 	    installation on UNIX systems.  If someone can volunteer to
 	    create a suitable PPM bundle for Win32, it would be appreciated.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2178"
-></A
-><B
->A.9.3. </B
->	    CGI's are failing with a "something.cgi is not a valid Windows NT
+NAME="AEN1954"><B
+>A.6.3. </B
+>
+	    CGI's are failing with a "something.cgi is not a valid Windows NT
 	    application" error. Why?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Depending on what Web server you are using, you will have to configure
+>
+	    Depending on what Web server you are using, you will have to configure
 	    the Web server to treat *.cgi files as CGI scripts. In IIS, you do this by
 	    adding *.cgi to the App Mappings with the &#60;path&#62;\perl.exe %s %s as the
 	    executable.
 	  </P
 ><P
->	    Microsoft has some advice on this matter, as well:
+>&#13;	    Microsoft has some advice on this matter, as well:
 	    <A
-NAME="AEN2183"
-></A
-><BLOCKQUOTE
+NAME="AEN1959"><BLOCKQUOTE
 CLASS="BLOCKQUOTE"
 ><P
->		"Set application mappings. In the ISM, map the extension for the script
+>&#13;		"Set application mappings. In the ISM, map the extension for the script
 		file(s) to the executable for the script interpreter. For example, you might
 		map the extension .py to Python.exe, the executable for the Python script
 		interpreter. Note For the ActiveState Perl script interpreter, the extension
@@ -3198,167 +2126,56 @@ CLASS="BLOCKQUOTE"
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2186"
-></A
-><B
->A.9.4. </B
->	    Can I have some general instructions on how to make Bugzilla on Win32 work?
-	  </P
-></DIV
-><DIV
-CLASS="ANSWER"
-><P
-><B
-> </B
->	    The following couple entries are deprecated in favor of the Windows installation
-	    instructions available in the "Administration" portion of "The Bugzilla Guide".
-	    However, they are provided here for historical interest and insight.
-	    <P
-CLASS="LITERALLAYOUT"
->&nbsp;&nbsp;1.&nbsp;#!C:/perl/bin/perl&nbsp;had&nbsp;to&nbsp;be&nbsp;added&nbsp;to&nbsp;every&nbsp;perl&nbsp;file.<br>
-&nbsp;&nbsp;2.&nbsp;Converted&nbsp;to&nbsp;Net::SMTP&nbsp;to&nbsp;handle&nbsp;mail&nbsp;messages&nbsp;instead&nbsp;of<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/bin/sendmail.<br>
-&nbsp;&nbsp;3.&nbsp;The&nbsp;crypt&nbsp;function&nbsp;isn't&nbsp;available&nbsp;on&nbsp;Windows&nbsp;NT&nbsp;(at&nbsp;least&nbsp;none&nbsp;that&nbsp;I<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;am&nbsp;aware),&nbsp;so&nbsp;I&nbsp;made&nbsp;encrypted&nbsp;passwords&nbsp;=&nbsp;plaintext&nbsp;passwords.<br>
-&nbsp;&nbsp;4.&nbsp;The&nbsp;system&nbsp;call&nbsp;to&nbsp;diff&nbsp;had&nbsp;to&nbsp;be&nbsp;changed&nbsp;to&nbsp;the&nbsp;Cygwin&nbsp;diff.<br>
-&nbsp;&nbsp;5.&nbsp;This&nbsp;was&nbsp;just&nbsp;to&nbsp;get&nbsp;a&nbsp;demo&nbsp;running&nbsp;under&nbsp;NT,&nbsp;it&nbsp;seems&nbsp;to&nbsp;be&nbsp;working<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;good,&nbsp;and&nbsp;I&nbsp;have&nbsp;inserted&nbsp;almost&nbsp;100&nbsp;bugs&nbsp;from&nbsp;another&nbsp;bug&nbsp;tracking<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;system.&nbsp;Since&nbsp;this&nbsp;work&nbsp;was&nbsp;done&nbsp;just&nbsp;to&nbsp;get&nbsp;an&nbsp;in-house&nbsp;demo,&nbsp;I&nbsp;am&nbsp;NOT<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;planning&nbsp;on&nbsp;making&nbsp;a&nbsp;patch&nbsp;for&nbsp;submission&nbsp;to&nbsp;Bugzilla.&nbsp;If&nbsp;you&nbsp;would<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;like&nbsp;a&nbsp;zip&nbsp;file,&nbsp;let&nbsp;me&nbsp;know.<br>
-<br>
-Q:&nbsp;Hmm,&nbsp;couldn't&nbsp;figure&nbsp;it&nbsp;out&nbsp;from&nbsp;the&nbsp;general&nbsp;instructions&nbsp;above.&nbsp;&nbsp;How<br>
-about&nbsp;step-by-step?<br>
-A:&nbsp;Sure!&nbsp;Here&nbsp;ya&nbsp;go!<br>
-<br>
-&nbsp;&nbsp;1.&nbsp;Install&nbsp;IIS&nbsp;4.0&nbsp;from&nbsp;the&nbsp;NT&nbsp;Option&nbsp;Pack&nbsp;#4.<br>
-&nbsp;&nbsp;2.&nbsp;Download&nbsp;and&nbsp;install&nbsp;Active&nbsp;Perl.<br>
-&nbsp;&nbsp;3.&nbsp;Install&nbsp;the&nbsp;Windows&nbsp;GNU&nbsp;tools&nbsp;from&nbsp;Cygwin.&nbsp;Make&nbsp;sure&nbsp;to&nbsp;add&nbsp;the&nbsp;bin<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;directory&nbsp;to&nbsp;your&nbsp;system&nbsp;path.&nbsp;(Everyone&nbsp;should&nbsp;have&nbsp;these,&nbsp;whether<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;they&nbsp;decide&nbsp;to&nbsp;use&nbsp;Bugzilla&nbsp;or&nbsp;not.&nbsp;:-)&nbsp;)<br>
-&nbsp;&nbsp;4.&nbsp;Download&nbsp;relevant&nbsp;packages&nbsp;from&nbsp;ActiveState&nbsp;at<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.activestate.com/packages/zips/.&nbsp;+&nbsp;DBD-Mysql.zip<br>
-&nbsp;&nbsp;5.&nbsp;Extract&nbsp;each&nbsp;zip&nbsp;file&nbsp;with&nbsp;WinZip,&nbsp;and&nbsp;install&nbsp;each&nbsp;ppd&nbsp;file&nbsp;using&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notation:&nbsp;ppm&nbsp;install&nbsp;&#60;module&#62;.ppd<br>
-&nbsp;&nbsp;6.&nbsp;Install&nbsp;Mysql.&nbsp;&nbsp;*Note:&nbsp;If&nbsp;you&nbsp;move&nbsp;the&nbsp;default&nbsp;install&nbsp;from&nbsp;c:\mysql,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;you&nbsp;must&nbsp;add&nbsp;the&nbsp;appropriate&nbsp;startup&nbsp;parameters&nbsp;to&nbsp;the&nbsp;NT&nbsp;service.&nbsp;(ex.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-b&nbsp;e:\\programs\\mysql)<br>
-&nbsp;&nbsp;7.&nbsp;Download&nbsp;any&nbsp;Mysql&nbsp;client.&nbsp;http://www.mysql.com/download_win.html<br>
-&nbsp;&nbsp;8.&nbsp;Setup&nbsp;MySql.&nbsp;(These&nbsp;are&nbsp;the&nbsp;commands&nbsp;that&nbsp;I&nbsp;used.)<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I.&nbsp;Cleanup&nbsp;default&nbsp;database&nbsp;settings.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\mysql\bin\mysql&nbsp;-u&nbsp;root&nbsp;mysql<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;DELETE&nbsp;FROM&nbsp;user&nbsp;WHERE&nbsp;Host='localhost'&nbsp;AND&nbsp;User='';<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;quit<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\mysql\bin\mysqladmin&nbsp;reload<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;II.&nbsp;Set&nbsp;password&nbsp;for&nbsp;root.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\mysql\bin\mysql&nbsp;-u&nbsp;root&nbsp;mysql<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;UPDATE&nbsp;user&nbsp;SET&nbsp;Password=PASSWORD('new_password')<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;user='root';<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;FLUSH&nbsp;PRIVILEGES;<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;quit<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\mysql\bin\mysqladmin&nbsp;-u&nbsp;root&nbsp;reload<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;III.&nbsp;Create&nbsp;bugs&nbsp;user.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\mysql\bin\mysql&nbsp;-u&nbsp;root&nbsp;-p<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;insert&nbsp;into&nbsp;user&nbsp;(host,user,password)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;values('localhost','bugs','');<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;quit<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\mysql\bin\mysqladmin&nbsp;-u&nbsp;root&nbsp;reload<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IV.&nbsp;Create&nbsp;the&nbsp;bugs&nbsp;database.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\mysql\bin\mysql&nbsp;-u&nbsp;root&nbsp;-p<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;create&nbsp;database&nbsp;bugs;<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;V.&nbsp;Give&nbsp;the&nbsp;bugs&nbsp;user&nbsp;access&nbsp;to&nbsp;the&nbsp;bugs&nbsp;database.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;insert&nbsp;into&nbsp;db<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(host,db,user,select_priv,insert_priv,update_priv,delete_priv,create_priv,drop_priv)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;values('localhost','bugs','bugs','Y','Y','Y','Y','Y','N')<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&#62;&nbsp;quit<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\mysql\bin\mysqladmin&nbsp;-u&nbsp;root&nbsp;reload<br>
-&nbsp;&nbsp;9.&nbsp;Run&nbsp;the&nbsp;table&nbsp;scripts&nbsp;to&nbsp;setup&nbsp;the&nbsp;bugs&nbsp;database.<br>
-&nbsp;10.&nbsp;Change&nbsp;CGI.pm&nbsp;to&nbsp;use&nbsp;the&nbsp;following&nbsp;regular&nbsp;expression&nbsp;because&nbsp;of<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;differing&nbsp;backslashes&nbsp;in&nbsp;NT&nbsp;versus&nbsp;UNIX.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;$0&nbsp;=~&nbsp;m:[^\\]*$:;<br>
-&nbsp;11.&nbsp;Had&nbsp;to&nbsp;make&nbsp;the&nbsp;crypt&nbsp;password&nbsp;=&nbsp;plain&nbsp;text&nbsp;password&nbsp;in&nbsp;the&nbsp;database.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Thanks&nbsp;to&nbsp;Andrew&nbsp;Lahser"&nbsp;&#60;andrew_lahser@merck.com&#62;"&nbsp;on&nbsp;this&nbsp;one.)&nbsp;The<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files&nbsp;that&nbsp;I&nbsp;changed&nbsp;were:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;globals.pl<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;CGI.pl<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;alternately,&nbsp;you&nbsp;can&nbsp;try&nbsp;commenting&nbsp;all&nbsp;references&nbsp;to&nbsp;'crypt'<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;and&nbsp;replace&nbsp;them&nbsp;with&nbsp;similar&nbsp;lines&nbsp;but&nbsp;without&nbsp;encrypt()<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;or&nbsp;crypr()&nbsp;functions&nbsp;insida&nbsp;all&nbsp;files.<br>
-&nbsp;12.&nbsp;Replaced&nbsp;sendmail&nbsp;with&nbsp;Windmail.&nbsp;Basically,&nbsp;you&nbsp;have&nbsp;to&nbsp;come&nbsp;up&nbsp;with&nbsp;a<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendmail&nbsp;substitute&nbsp;for&nbsp;NT.&nbsp;Someone&nbsp;said&nbsp;that&nbsp;they&nbsp;used&nbsp;a&nbsp;Perl&nbsp;module<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Net::SMTP),&nbsp;but&nbsp;I&nbsp;was&nbsp;trying&nbsp;to&nbsp;save&nbsp;time&nbsp;and&nbsp;do&nbsp;as&nbsp;little&nbsp;Perl&nbsp;coding<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;as&nbsp;possible.<br>
-&nbsp;13.&nbsp;Added&nbsp;"perl"&nbsp;to&nbsp;the&nbsp;beginning&nbsp;of&nbsp;all&nbsp;Perl&nbsp;system&nbsp;calls&nbsp;that&nbsp;use&nbsp;a&nbsp;perl<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;script&nbsp;as&nbsp;an&nbsp;argument&nbsp;and&nbsp;renamed&nbsp;processmail&nbsp;to&nbsp;processmail.pl.<br>
-&nbsp;14.&nbsp;In&nbsp;processmail.pl,&nbsp;I&nbsp;added&nbsp;binmode(HANDLE)&nbsp;before&nbsp;all&nbsp;read()&nbsp;calls.&nbsp;I'm<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not&nbsp;sure&nbsp;about&nbsp;this&nbsp;one,&nbsp;but&nbsp;the&nbsp;read()&nbsp;under&nbsp;NT&nbsp;wasn't&nbsp;counting&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EOLs&nbsp;without&nbsp;the&nbsp;binary&nbsp;read."<br>
-	&nbsp;&nbsp;&nbsp;&nbsp;</P
->
-	  </P
-></DIV
-></DIV
-><DIV
-CLASS="QANDAENTRY"
-><DIV
-CLASS="QUESTION"
-><P
-><A
-NAME="AEN2192"
-></A
-><B
->A.9.5. </B
->	    I'm having trouble with the perl modules for NT not being able to talk to
+NAME="AEN1962"><B
+>A.6.4. </B
+>
+	    I'm having trouble with the perl modules for NT not being able to talk to
 	    to the database.
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Your modules may be outdated or inaccurate. Try:
+>
+	    Your modules may be outdated or inaccurate. Try:
 	    <P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->		  Hitting http://www.activestate.com/ActivePerl
+>&#13;		  Hitting http://www.activestate.com/ActivePerl
 		</P
 ></LI
 ><LI
 ><P
->		  Download ActivePerl
+>&#13;		  Download ActivePerl
 		</P
 ></LI
 ><LI
 ><P
->		  Go to your prompt
+>&#13;		  Go to your prompt
 		</P
 ></LI
 ><LI
 ><P
->		  Type 'ppm'
+>&#13;		  Type 'ppm'
 		</P
 ></LI
 ><LI
 ><P
->		  <TT
-CLASS="PROMPT"
+>&#13;		  <TT
+CLASS="prompt"
 >PPM&#62;</TT
 > <B
-CLASS="COMMAND"
+CLASS="command"
 >install DBI DBD-mysql GD</B
 >
 		</P
@@ -3370,68 +2187,85 @@ CLASS="COMMAND"
 	    <A
 HREF=" http://www.activestate.com/Packages/"
 TARGET="_top"
->	      http://www.activestate.com/Packages/</A
+>&#13;	      http://www.activestate.com/Packages/</A
 >
 	  </P
 ></DIV
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDADIV"
+CLASS="qandadiv"
 ><H3
 ><A
-NAME="FAQ_USE"
-></A
->10. Bugzilla Usage</H3
+NAME="faq-use">7. Bugzilla Usage</H3
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2213"
-></A
-><B
->A.10.1. </B
->	    The query page is very confusing.  Isn't there a simpler way to query?
+NAME="AEN1983"><B
+>A.7.1. </B
+>
+	    How do I change my user name (email address) in Bugzilla?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    We are developing in that direction.  You can follow progress on this
-	    at <A
-HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=16775"
-TARGET="_top"
->	      http://bugzilla.mozilla.org/show_bug.cgi?id=16775</A
->.  Some functionality
-	    is available in Bugzilla 2.12, and is available as "quicksearch.html"
+>
+	    New in 2.16 - go to the Account section of the Preferences. You will
+      be emailed at both addresses for confirmation.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2219"
-></A
+NAME="AEN1988"><B
+>A.7.2. </B
+>
+	    The query page is very confusing.  Isn't there a simpler way to query?
+	  </P
+></DIV
+><DIV
+CLASS="answer"
+><P
 ><B
->A.10.2. </B
->	    I'm confused by the behavior of the "accept" button in the Show Bug form.
+> </B
+>
+	    The interface was simplified by a UI designer for 2.16. Further
+      suggestions for improvement are welcome, but we won't sacrifice power for
+      simplicity.
+	  </P
+></DIV
+></DIV
+><DIV
+CLASS="qandaentry"
+><DIV
+CLASS="question"
+><P
+><A
+NAME="AEN1993"><B
+>A.7.3. </B
+>
+	    I'm confused by the behavior of the "accept" button in the Show Bug form.
 	    Why doesn't it assign the bug to me when I accept it?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    The current behavior is acceptable to bugzilla.mozilla.org and most
-	    users.  I personally don't like it.  You have your choice of patches
+>
+	    The current behavior is acceptable to bugzilla.mozilla.org and most
+	    users.  You have your choice of patches
 	    to change this behavior, however.
 	    <P
 ></P
@@ -3443,7 +2277,7 @@ BORDER="0"
 ><A
 HREF="http://bugzilla.mozilla.org/showattachment.cgi?attach_id=8029"
 TARGET="_top"
->		Add a "and accept bug" radio button</A
+>&#13;		Add a "and accept bug" radio button</A
 ></TD
 ></TR
 ><TR
@@ -3451,7 +2285,7 @@ TARGET="_top"
 ><A
 HREF="http://bugzilla.mozilla.org/showattachment.cgi?attach_id=8153"
 TARGET="_top"
->		"Accept" button automatically assigns to you</A
+>&#13;		"Accept" button automatically assigns to you</A
 ></TD
 ></TR
 ></TBODY
@@ -3459,80 +2293,80 @@ TARGET="_top"
 ><P
 ></P
 >
-	    Note that these patches are somewhat dated.  You will need to do the find
-	    and replace manually to apply them.  They are very small, though.  It is easy.
+	    Note that these patches are somewhat dated.  You will need to apply
+      them manually.  
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2229"
-></A
-><B
->A.10.3. </B
->	    I can't upload anything into the database via the "Create Attachment"
+NAME="AEN2003"><B
+>A.7.4. </B
+>
+	    I can't upload anything into the database via the "Create Attachment"
 	    link.  What am I doing wrong?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    The most likely cause is a very old browser or a browser that is
+>
+	    The most likely cause is a very old browser or a browser that is
 	    incompatible with file upload via POST.  Download the latest Netscape,
 	    Microsoft, or Mozilla browser to handle uploads correctly.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2234"
-></A
-><B
->A.10.4. </B
->	    Email submissions to Bugzilla that have attachments end up asking me to
+NAME="AEN2008"><B
+>A.7.5. </B
+>
+	    Email submissions to Bugzilla that have attachments end up asking me to
 	    save it as a "cgi" file.
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Yup.  Just rename it once you download it, or save it under a different
-	    filename.  This will not be fixed anytime too soon, because it would
+>
+	    Yup.  Just rename it once you download it, or save it under a different
+	    filename.  This will not be fixed anytime soon, because it would
 	    cripple some other functionality.
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2239"
-></A
-><B
->A.10.5. </B
->	    How do I change a keyword in Bugzilla, once some bugs are using it?
+NAME="AEN2013"><B
+>A.7.6. </B
+>
+	    How do I change a keyword in Bugzilla, once some bugs are using it?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    In the Bugzilla administrator UI, edit the keyword and it will let you
+>
+	    In the Bugzilla administrator UI, edit the keyword and it will let you
 	    replace the old keyword name with a new one.  This will cause a problem
 	    with the keyword cache.  Run sanitycheck.cgi to fix it.
 	  </P
@@ -3540,50 +2374,48 @@ CLASS="ANSWER"
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDADIV"
+CLASS="qandadiv"
 ><H3
 ><A
-NAME="FAQ_HACKING"
-></A
->11. Bugzilla Hacking</H3
+NAME="faq-hacking">8. Bugzilla Hacking</H3
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2246"
-></A
-><B
->A.11.1. </B
->	    What bugs are in Bugzilla right now?
+NAME="AEN2020"><B
+>A.8.1. </B
+>
+	    What bugs are in Bugzilla right now?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    Try <A
+>
+	    Try <A
 HREF="http://bugzilla.mozilla.org/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&product=Bugzilla"
 TARGET="_top"
->	    this link</A
+>&#13;	    this link</A
 > to view current bugs or requests for
 	    enhancement for Bugzilla.
 	  </P
 ><P
->	    You can view bugs marked for 2.16 release
+>&#13;	    You can view bugs marked for 2.18 release
 	    <A
-HREF="http://bugzilla.mozilla.org/buglist.cgi?product=Bugzilla&target_milestone=Bugzilla+2.16"
+HREF="http://bugzilla.mozilla.org/buglist.cgi?product=Bugzilla&target_milestone=Bugzilla+2.18"
 TARGET="_top"
 >here</A
 >.
-	    This list includes bugs for the 2.16 release that have already
+	    This list includes bugs for the 2.18 release that have already
 	    been fixed and checked into CVS.  Please consult the
 	    <A
 HREF="http://www.mozilla.org/projects/bugzilla/"
 TARGET="_top"
->	      Bugzilla Project Page</A
+>&#13;	      Bugzilla Project Page</A
 > for details on how to
 	    check current sources out of CVS so you can have these
 	    bug fixes early!
@@ -3591,52 +2423,49 @@ TARGET="_top"
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2255"
-></A
-><B
->A.11.2. </B
->	    How can I change the default priority to a null value?  For instance, have the default
+NAME="AEN2029"><B
+>A.8.2. </B
+>
+	    How can I change the default priority to a null value?  For instance, have the default
 	    priority be "---" instead of "P2"?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
->	    This is well-documented here: <A
+>
+	    This is well-documented here: <A
 HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=49862"
 TARGET="_top"
->	    http://bugzilla.mozilla.org/show_bug.cgi?id=49862</A
+>&#13;	    http://bugzilla.mozilla.org/show_bug.cgi?id=49862</A
 >.  Ultimately, it's as easy
 	    as adding the "---" priority field to your localconfig file in the appropriate area,
 	    re-running checksetup.pl, and then changing the default priority in your browser using
-	    "editparams.cgi".  Hmm, now that I think about it, that is kind of a klunky way to handle
-	    it, but for now it's what we have!  Although the bug has been closed "resolved wontfix",
-	    there may be a better way to handle this...
+	    "editparams.cgi". 
 	  </P
 ></DIV
 ></DIV
 ><DIV
-CLASS="QANDAENTRY"
+CLASS="qandaentry"
 ><DIV
-CLASS="QUESTION"
+CLASS="question"
 ><P
 ><A
-NAME="AEN2261"
-></A
-><B
->A.11.3. </B
->	    What's the best way to submit patches?  What guidelines should I follow?
+NAME="AEN2035"><B
+>A.8.3. </B
+>
+	    What's the best way to submit patches?  What guidelines should I follow?
 	  </P
 ></DIV
 ><DIV
-CLASS="ANSWER"
+CLASS="answer"
 ><P
 ><B
 > </B
@@ -3646,7 +2475,7 @@ CLASS="ANSWER"
 TYPE="1"
 ><LI
 ><P
->		  Enter a bug into bugzilla.mozilla.org for the <SPAN
+>&#13;		  Enter a bug into bugzilla.mozilla.org for the <SPAN
 CLASS="QUOTE"
 >"<A
 HREF="http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla"
@@ -3659,21 +2488,21 @@ TARGET="_top"
 ></LI
 ><LI
 ><P
->		  Upload your patch as a unified DIFF (having used "diff -u" against
+>&#13;		  Upload your patch as a unified diff (having used "diff -u" against
 		  the <EM
 >current sources</EM
 > checked out of CVS),
 		  or new source file by clicking
 		  "Create a new attachment" link on the bug page you've just created, and
 		  include any descriptions of database changes you may make, into the bug
-		  ID you submitted in step #1.  Be sure and click the "Patch" radio
-		  button to indicate the text you are sending is a patch!
+		  ID you submitted in step #1.  Be sure and click the "Patch" checkbox
+		  to indicate the text you are sending is a patch!
 		</P
 ></LI
 ><LI
 ><P
->		  Announce your patch and the associated URL
-		  (http://bugzilla.mozilla.org/show_bug.cgi?id=XXXX) for discussion in
+>&#13;		  Announce your patch and the associated URL
+		  (http://bugzilla.mozilla.org/show_bug.cgi?id=XXXXXX) for discussion in
 		  the newsgroup (netscape.public.mozilla.webtools).  You'll get a really
 		  good, fairly immediate reaction to the implications of your patch,
 		  which will also give us an idea how well-received the change would
@@ -3682,14 +2511,14 @@ TARGET="_top"
 ></LI
 ><LI
 ><P
->		  If it passes muster with minimal modification, the person to whom
+>&#13;		  If it passes muster with minimal modification, the person to whom
 		  the bug is assigned in Bugzilla is responsible for seeing the patch
 		  is checked into CVS.
 		</P
 ></LI
 ><LI
 ><P
->		  Bask in the glory of the fact that you helped write the most successful
+>&#13;		  Bask in the glory of the fact that you helped write the most successful
 		  open-source bug-tracking software on the planet :)
 		</P
 ></LI
@@ -3705,6 +2534,7 @@ CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -3715,7 +2545,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="variant_sourceforge.html"
+HREF="integration.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -3724,6 +2555,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -3731,7 +2563,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="downloadlinks.html"
+HREF="database.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -3740,7 +2573,7 @@ HREF="downloadlinks.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->SourceForge</TD
+>Integrating Bugzilla with Third-Party Tools</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
@@ -3750,7 +2583,7 @@ VALIGN="top"
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->Software Download Links</TD
+>The Bugzilla Database</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/feedback.html b/docs/html/feedback.html
deleted file mode 100644
index 9ef62e718..000000000
--- a/docs/html/feedback.html
+++ /dev/null
@@ -1,155 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->Feedback</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="About This Guide"
-HREF="about.html"><LINK
-REL="PREVIOUS"
-TITLE="Contributors"
-HREF="contributors.html"><LINK
-REL="NEXT"
-TITLE="Translations"
-HREF="translations.html"></HEAD
-><BODY
-CLASS="SECTION"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="contributors.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Chapter 1. About This Guide</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="translations.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECTION"
-><H1
-CLASS="SECTION"
-><A
-NAME="FEEDBACK"
->1.7. Feedback</A
-></H1
-><P
->      I welcome feedback on this document.  Without your submissions
-      and input, this Guide cannot continue to exist.  Please mail
-      additions, comments, criticisms, etc. to
-      <TT
-CLASS="EMAIL"
->&#60;<A
-HREF="mailto:barnboy@trilobyte.net"
->barnboy@trilobyte.net</A
->&#62;</TT
->.  Please send flames to
-      <TT
-CLASS="EMAIL"
->&#60;<A
-HREF="mailto:devnull@localhost"
->devnull@localhost</A
->&#62;</TT
->
-    </P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="contributors.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="translations.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->Contributors</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="about.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->Translations</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/future.html b/docs/html/future.html
deleted file mode 100644
index 99a577ff8..000000000
--- a/docs/html/future.html
+++ /dev/null
@@ -1,740 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->The Future of Bugzilla</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="PREVIOUS"
-TITLE="Tinderbox/Tinderbox2"
-HREF="tinderbox.html"><LINK
-REL="NEXT"
-TITLE="Bugzilla Variants and Competitors"
-HREF="variants.html"></HEAD
-><BODY
-CLASS="CHAPTER"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="tinderbox.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
-></TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="variants.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="CHAPTER"
-><H1
-><A
-NAME="FUTURE"
->Chapter 6. The Future of Bugzilla</A
-></H1
-><TABLE
-BORDER="0"
-BGCOLOR="#6495ED"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="SYNOPSIS"
->Bugzilla's Future.  Much of this is the present, now.</PRE
-></FONT
-></TD
-></TR
-></TABLE
-><P
->  Bugzilla's future is a constantly-changing thing, as various developers
-  <SPAN
-CLASS="QUOTE"
->"scratch an itch"</SPAN
-> when it comes to functionality.
-  Thus this section is very malleable, subject to change without notice, etc.
-  You'll probably also notice the lack of formatting.  I apologize that it's
-  not quite as readable as the rest of the Guide.
-    </P
-><P
->    <P
-CLASS="LITERALLAYOUT"
->&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bugzilla&nbsp;Blue&nbsp;Sky<br>
-<br>
-Customisability<br>
-<br>
-&nbsp;&nbsp;&nbsp;One&nbsp;of&nbsp;the&nbsp;major&nbsp;stumbling&nbsp;blocks&nbsp;of&nbsp;Bugzilla&nbsp;has&nbsp;been&nbsp;that&nbsp;it&nbsp;is&nbsp;too<br>
-&nbsp;&nbsp;&nbsp;rigid&nbsp;and&nbsp;does&nbsp;not&nbsp;adapt&nbsp;itself&nbsp;well&nbsp;enough&nbsp;to&nbsp;the&nbsp;needs&nbsp;of&nbsp;an<br>
-&nbsp;&nbsp;&nbsp;organisation.&nbsp;&nbsp;This&nbsp;has&nbsp;led&nbsp;to&nbsp;organisations&nbsp;making&nbsp;changes&nbsp;to&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;Bugzilla&nbsp;code&nbsp;that&nbsp;need&nbsp;to&nbsp;be&nbsp;redone&nbsp;each&nbsp;new&nbsp;version&nbsp;of&nbsp;Bugzilla.<br>
-&nbsp;&nbsp;&nbsp;Bugzilla&nbsp;should&nbsp;attempt&nbsp;to&nbsp;move&nbsp;away&nbsp;from&nbsp;this&nbsp;to&nbsp;a&nbsp;world&nbsp;where&nbsp;this<br>
-&nbsp;&nbsp;&nbsp;doesn't&nbsp;need&nbsp;to&nbsp;occur.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Most&nbsp;of&nbsp;the&nbsp;subsections&nbsp;in&nbsp;this&nbsp;section&nbsp;are&nbsp;currently&nbsp;explicit&nbsp;design<br>
-&nbsp;&nbsp;&nbsp;goals&nbsp;for&nbsp;the&nbsp;"Bugzilla&nbsp;3"&nbsp;rewrite.&nbsp;&nbsp;This&nbsp;does&nbsp;not&nbsp;necessarily&nbsp;mean<br>
-&nbsp;&nbsp;&nbsp;that&nbsp;they&nbsp;will&nbsp;not&nbsp;occur&nbsp;before&nbsp;them&nbsp;in&nbsp;Bugzilla&nbsp;2,&nbsp;but&nbsp;most&nbsp;are<br>
-&nbsp;&nbsp;&nbsp;significant&nbsp;undertakings.<br>
-<br>
-&nbsp;&nbsp;Field&nbsp;Customisation<br>
-<br>
-&nbsp;&nbsp;&nbsp;Many&nbsp;installations&nbsp;wish&nbsp;to&nbsp;customise&nbsp;the&nbsp;fields&nbsp;that&nbsp;appear&nbsp;on&nbsp;bug<br>
-&nbsp;&nbsp;&nbsp;reports.&nbsp;&nbsp;&nbsp;Current&nbsp;versions&nbsp;of&nbsp;Bugzilla&nbsp;offer&nbsp;limited<br>
-&nbsp;&nbsp;&nbsp;customisability.&nbsp;&nbsp;In&nbsp;particular,&nbsp;some&nbsp;fields&nbsp;can&nbsp;be&nbsp;turned&nbsp;off.<br>
-<br>
-&nbsp;&nbsp;&nbsp;However,&nbsp;many&nbsp;administrators&nbsp;wish&nbsp;to&nbsp;add&nbsp;their&nbsp;own&nbsp;fields,&nbsp;and&nbsp;rename<br>
-&nbsp;&nbsp;&nbsp;or&nbsp;otherwise&nbsp;modify&nbsp;existing&nbsp;fields.&nbsp;&nbsp;An&nbsp;architecture&nbsp;that&nbsp;supports<br>
-&nbsp;&nbsp;&nbsp;this&nbsp;would&nbsp;be&nbsp;extraordinarily&nbsp;useful.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Indeed,&nbsp;many&nbsp;fields&nbsp;work&nbsp;similarly&nbsp;and&nbsp;could&nbsp;be&nbsp;abstracted&nbsp;into&nbsp;"field<br>
-&nbsp;&nbsp;&nbsp;types",&nbsp;so&nbsp;that&nbsp;an&nbsp;administrator&nbsp;need&nbsp;write&nbsp;little&nbsp;or&nbsp;no&nbsp;code&nbsp;to<br>
-&nbsp;&nbsp;&nbsp;support&nbsp;the&nbsp;new&nbsp;fields&nbsp;they&nbsp;desire.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Possible&nbsp;field&nbsp;types&nbsp;include&nbsp;text&nbsp;(eg&nbsp;status&nbsp;whiteboard),&nbsp;numbers,<br>
-&nbsp;&nbsp;&nbsp;dates&nbsp;(eg&nbsp;report&nbsp;time),&nbsp;accounts&nbsp;(eg&nbsp;reporter,&nbsp;qa,&nbsp;cc),&nbsp;inter-bug<br>
-&nbsp;&nbsp;&nbsp;relationships&nbsp;(dependencies,&nbsp;duplicates),&nbsp;option&nbsp;groups&nbsp;(platform,&nbsp;os,<br>
-&nbsp;&nbsp;&nbsp;severity,&nbsp;priority,&nbsp;target&nbsp;milestone,&nbsp;version)&nbsp;etc.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Ideally&nbsp;an&nbsp;administrator&nbsp;could&nbsp;configure&nbsp;their&nbsp;fields&nbsp;through&nbsp;a<br>
-&nbsp;&nbsp;&nbsp;Bugzilla&nbsp;interface&nbsp;that&nbsp;requires&nbsp;no&nbsp;code&nbsp;to&nbsp;be&nbsp;added.&nbsp;&nbsp;However,&nbsp;it&nbsp;is<br>
-&nbsp;&nbsp;&nbsp;highly&nbsp;unlikely&nbsp;this&nbsp;ideal&nbsp;will&nbsp;never&nbsp;be&nbsp;met,&nbsp;and&nbsp;in&nbsp;a&nbsp;similar&nbsp;way<br>
-&nbsp;&nbsp;&nbsp;that&nbsp;office&nbsp;applications&nbsp;have&nbsp;scripting&nbsp;languages,&nbsp;Bugzilla&nbsp;should<br>
-&nbsp;&nbsp;&nbsp;allow&nbsp;new&nbsp;field&nbsp;types&nbsp;to&nbsp;be&nbsp;written.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Similarly,&nbsp;a&nbsp;common&nbsp;desire&nbsp;is&nbsp;for&nbsp;resolutions&nbsp;to&nbsp;be&nbsp;added&nbsp;or&nbsp;removed.<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Allocations<br>
-<br>
-&nbsp;&nbsp;&nbsp;?<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Option&nbsp;Groups<br>
-<br>
-&nbsp;&nbsp;&nbsp;?<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Relations<br>
-<br>
-&nbsp;&nbsp;&nbsp;?<br>
-<br>
-&nbsp;&nbsp;Database&nbsp;Integrity<br>
-<br>
-&nbsp;&nbsp;&nbsp;Furthermore,&nbsp;it&nbsp;is&nbsp;desirable&nbsp;for&nbsp;administrators&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;specify<br>
-&nbsp;&nbsp;&nbsp;rules&nbsp;that&nbsp;must&nbsp;or&nbsp;should&nbsp;apply&nbsp;between&nbsp;the&nbsp;fields&nbsp;on&nbsp;a&nbsp;bug&nbsp;report.<br>
-<br>
-&nbsp;&nbsp;&nbsp;For&nbsp;example,&nbsp;you&nbsp;might&nbsp;wish&nbsp;to&nbsp;specify&nbsp;that&nbsp;a&nbsp;bug&nbsp;with&nbsp;status&nbsp;ASSIGNED<br>
-&nbsp;&nbsp;&nbsp;must&nbsp;have&nbsp;a&nbsp;target&nbsp;milestone&nbsp;field&nbsp;that&nbsp;that&nbsp;is&nbsp;not&nbsp;untargetted.&nbsp;&nbsp;Or<br>
-&nbsp;&nbsp;&nbsp;that&nbsp;a&nbsp;bug&nbsp;with&nbsp;a&nbsp;certain&nbsp;number&nbsp;of&nbsp;votes&nbsp;should&nbsp;get&nbsp;ASSIGNED.&nbsp;&nbsp;Or<br>
-&nbsp;&nbsp;&nbsp;that&nbsp;the&nbsp;QA&nbsp;contact&nbsp;must&nbsp;be&nbsp;different&nbsp;from&nbsp;the&nbsp;assignee.<br>
-<br>
-&nbsp;&nbsp;&nbsp;"Must"&nbsp;relationships&nbsp;could&nbsp;be&nbsp;implemented&nbsp;by&nbsp;refusing&nbsp;to&nbsp;make&nbsp;changes<br>
-&nbsp;&nbsp;&nbsp;that&nbsp;violate&nbsp;the&nbsp;relationships,&nbsp;or&nbsp;alternatively,&nbsp;automatically<br>
-&nbsp;&nbsp;&nbsp;updating&nbsp;certain&nbsp;fields&nbsp;in&nbsp;order&nbsp;to&nbsp;satisfy&nbsp;the&nbsp;criteria.&nbsp;&nbsp;Which<br>
-&nbsp;&nbsp;&nbsp;occurs&nbsp;should&nbsp;be&nbsp;up&nbsp;to&nbsp;the&nbsp;administrator.<br>
-<br>
-&nbsp;&nbsp;&nbsp;"Should"&nbsp;relationships&nbsp;could&nbsp;be&nbsp;implemented&nbsp;by&nbsp;a&nbsp;combination&nbsp;of<br>
-&nbsp;&nbsp;&nbsp;emitting&nbsp;warnings&nbsp;on&nbsp;the&nbsp;process&nbsp;bug&nbsp;page,&nbsp;the&nbsp;same&nbsp;on&nbsp;notification<br>
-&nbsp;&nbsp;&nbsp;mails,&nbsp;or&nbsp;emitting&nbsp;periodic&nbsp;whine&nbsp;mails&nbsp;about&nbsp;the&nbsp;situation.&nbsp;&nbsp;Again,<br>
-&nbsp;&nbsp;&nbsp;which&nbsp;occurs&nbsp;should&nbsp;be&nbsp;up&nbsp;to&nbsp;the&nbsp;administrator.<br>
-<br>
-&nbsp;&nbsp;&nbsp;It&nbsp;should&nbsp;also&nbsp;be&nbsp;possible&nbsp;for&nbsp;whine&nbsp;mails&nbsp;to&nbsp;be&nbsp;emitted&nbsp;for&nbsp;"must"<br>
-&nbsp;&nbsp;&nbsp;relationships,&nbsp;as&nbsp;they&nbsp;might&nbsp;become&nbsp;violated&nbsp;through&nbsp;direct&nbsp;database<br>
-&nbsp;&nbsp;&nbsp;access,&nbsp;Bugzilla&nbsp;bugs,&nbsp;or&nbsp;because&nbsp;they&nbsp;were&nbsp;there&nbsp;before&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;relationship&nbsp;was&nbsp;enforced.<br>
-<br>
-&nbsp;&nbsp;&nbsp;As&nbsp;well&nbsp;as&nbsp;implementing&nbsp;intra-bug&nbsp;constraints,&nbsp;it&nbsp;would&nbsp;be&nbsp;useful&nbsp;to<br>
-&nbsp;&nbsp;&nbsp;create&nbsp;inter-bug&nbsp;constraints.&nbsp;&nbsp;For&nbsp;example,&nbsp;a&nbsp;bug&nbsp;that&nbsp;is&nbsp;dependent&nbsp;on<br>
-&nbsp;&nbsp;&nbsp;another&nbsp;bug&nbsp;should&nbsp;not&nbsp;have&nbsp;an&nbsp;earlier&nbsp;milestone&nbsp;or&nbsp;greater&nbsp;priority<br>
-&nbsp;&nbsp;&nbsp;than&nbsp;that&nbsp;bug.<br>
-<br>
-&nbsp;&nbsp;Database&nbsp;Adaptability<br>
-<br>
-&nbsp;&nbsp;&nbsp;Often&nbsp;an&nbsp;administrator&nbsp;desires&nbsp;that&nbsp;fields&nbsp;adapt&nbsp;to&nbsp;the&nbsp;values&nbsp;of<br>
-&nbsp;&nbsp;&nbsp;other&nbsp;fields.&nbsp;&nbsp;For&nbsp;example,&nbsp;the&nbsp;value&nbsp;of&nbsp;a&nbsp;field&nbsp;might&nbsp;determine&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;possible&nbsp;values&nbsp;of&nbsp;another&nbsp;field&nbsp;or&nbsp;even&nbsp;whether&nbsp;it&nbsp;appears&nbsp;(whether<br>
-&nbsp;&nbsp;&nbsp;it&nbsp;is&nbsp;"applicable").<br>
-<br>
-&nbsp;&nbsp;&nbsp;Limited&nbsp;adaptability&nbsp;is&nbsp;present&nbsp;in&nbsp;Bugzilla&nbsp;2,&nbsp;and&nbsp;only&nbsp;on&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;"Product"&nbsp;field:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;possible&nbsp;values&nbsp;of&nbsp;the&nbsp;target&nbsp;milestone,&nbsp;version&nbsp;and&nbsp;component<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fields&nbsp;depend&nbsp;on&nbsp;the&nbsp;product.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;UNCONFIRMED&nbsp;can&nbsp;be&nbsp;turned&nbsp;off&nbsp;for&nbsp;specific&nbsp;products.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Voting&nbsp;can&nbsp;be&nbsp;configured&nbsp;differently&nbsp;or&nbsp;turned&nbsp;off&nbsp;for&nbsp;different<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products,&nbsp;and&nbsp;there&nbsp;is&nbsp;a&nbsp;separate&nbsp;user&nbsp;vote&nbsp;limits&nbsp;for&nbsp;each<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product.<br>
-<br>
-&nbsp;&nbsp;&nbsp;It&nbsp;would&nbsp;be&nbsp;good&nbsp;if&nbsp;more&nbsp;adaptability&nbsp;was&nbsp;present,&nbsp;both&nbsp;in&nbsp;terms&nbsp;of<br>
-&nbsp;&nbsp;&nbsp;all&nbsp;fields&nbsp;relying&nbsp;on&nbsp;the&nbsp;product,&nbsp;as&nbsp;well&nbsp;as&nbsp;the&nbsp;ability&nbsp;to&nbsp;adapt<br>
-&nbsp;&nbsp;&nbsp;based&nbsp;on&nbsp;the&nbsp;value&nbsp;of&nbsp;all&nbsp;fields.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Example&nbsp;???<br>
-<br>
-&nbsp;&nbsp;&nbsp;General&nbsp;adaptability&nbsp;raises&nbsp;the&nbsp;issue&nbsp;of&nbsp;circular&nbsp;references&nbsp;between<br>
-&nbsp;&nbsp;&nbsp;fields&nbsp;causing&nbsp;problems.&nbsp;&nbsp;One&nbsp;possible&nbsp;solution&nbsp;to&nbsp;this&nbsp;is&nbsp;to&nbsp;place<br>
-&nbsp;&nbsp;&nbsp;the&nbsp;fields&nbsp;in&nbsp;a&nbsp;total&nbsp;ordering&nbsp;and&nbsp;require&nbsp;a&nbsp;field&nbsp;refer&nbsp;only&nbsp;to&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;previous&nbsp;fields.<br>
-<br>
-&nbsp;&nbsp;&nbsp;In&nbsp;Bugzilla&nbsp;2,&nbsp;changing&nbsp;the&nbsp;product&nbsp;of&nbsp;a&nbsp;bug&nbsp;meant&nbsp;a&nbsp;second&nbsp;page&nbsp;would<br>
-&nbsp;&nbsp;&nbsp;appear&nbsp;that&nbsp;allowed&nbsp;you&nbsp;to&nbsp;choose&nbsp;a&nbsp;new&nbsp;milestone,&nbsp;component&nbsp;and<br>
-&nbsp;&nbsp;&nbsp;version,&nbsp;as&nbsp;those&nbsp;fields&nbsp;adapted&nbsp;themselves&nbsp;to&nbsp;the&nbsp;new&nbsp;product.&nbsp;&nbsp;This<br>
-&nbsp;&nbsp;&nbsp;page&nbsp;could&nbsp;be&nbsp;generalised&nbsp;to&nbsp;support&nbsp;all&nbsp;instances&nbsp;where:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;a&nbsp;field&nbsp;value&nbsp;must&nbsp;or&nbsp;might&nbsp;be&nbsp;changed&nbsp;because&nbsp;the&nbsp;possible&nbsp;values<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;have&nbsp;changed<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;is&nbsp;going&nbsp;to&nbsp;drop&nbsp;off&nbsp;because&nbsp;it&nbsp;it&nbsp;is&nbsp;no&nbsp;longer&nbsp;applicable,&nbsp;and<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this&nbsp;should&nbsp;be&nbsp;confirmed<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;must&nbsp;be&nbsp;specified&nbsp;because&nbsp;it&nbsp;is&nbsp;suddenly&nbsp;applicable,&nbsp;and&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;value,&nbsp;if&nbsp;one&nbsp;exists,&nbsp;might&nbsp;not&nbsp;be&nbsp;acceptable<br>
-<br>
-&nbsp;&nbsp;Database&nbsp;Independence<br>
-<br>
-&nbsp;&nbsp;&nbsp;Currently&nbsp;Bugzilla&nbsp;only&nbsp;runs&nbsp;on&nbsp;the&nbsp;MySQL&nbsp;database.&nbsp;&nbsp;It&nbsp;would&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;desirable&nbsp;for&nbsp;Bugzilla&nbsp;to&nbsp;run&nbsp;on&nbsp;other&nbsp;databases,&nbsp;because:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Organisations&nbsp;may&nbsp;have&nbsp;existing&nbsp;database&nbsp;products&nbsp;they&nbsp;use&nbsp;and<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;would&nbsp;prefer&nbsp;to&nbsp;run&nbsp;a&nbsp;homogenous&nbsp;environment.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Databases&nbsp;each&nbsp;have&nbsp;their&nbsp;own&nbsp;shortcomings,&nbsp;including&nbsp;MySQL.&nbsp;&nbsp;An<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;administrator&nbsp;might&nbsp;choose&nbsp;a&nbsp;database&nbsp;that&nbsp;would&nbsp;work&nbsp;better&nbsp;with<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;their&nbsp;Bugzilla.<br>
-<br>
-&nbsp;&nbsp;&nbsp;This&nbsp;raises&nbsp;the&nbsp;possibility&nbsp;that&nbsp;we&nbsp;could&nbsp;use&nbsp;features&nbsp;that&nbsp;are&nbsp;only<br>
-&nbsp;&nbsp;&nbsp;present&nbsp;in&nbsp;some&nbsp;databases,&nbsp;by&nbsp;appropriately&nbsp;falling&nbsp;back.&nbsp;&nbsp;For<br>
-&nbsp;&nbsp;&nbsp;example,&nbsp;in&nbsp;the&nbsp;MySQL&nbsp;world,&nbsp;we&nbsp;live&nbsp;without:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;record-level&nbsp;locking,&nbsp;instead&nbsp;we&nbsp;use&nbsp;table-level&nbsp;locking<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;referential&nbsp;and&nbsp;record&nbsp;constraints,&nbsp;instead&nbsp;we&nbsp;checking&nbsp;code<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;subselects,&nbsp;instead&nbsp;we&nbsp;use&nbsp;multiple&nbsp;queries&nbsp;and&nbsp;redundant&nbsp;"caches"<br>
-<br>
-&nbsp;&nbsp;Multiple&nbsp;Front&nbsp;Ends<br>
-<br>
-&nbsp;&nbsp;&nbsp;Currently&nbsp;Bugzilla&nbsp;is&nbsp;manipulated&nbsp;via&nbsp;the&nbsp;Web,&nbsp;and&nbsp;notifies&nbsp;via<br>
-&nbsp;&nbsp;&nbsp;E-Mail.&nbsp;&nbsp;It&nbsp;would&nbsp;be&nbsp;desirable&nbsp;for&nbsp;Bugzilla&nbsp;to&nbsp;easily&nbsp;support&nbsp;various<br>
-&nbsp;&nbsp;&nbsp;front&nbsp;ends.<br>
-<br>
-&nbsp;&nbsp;&nbsp;There&nbsp;is&nbsp;no&nbsp;reason&nbsp;that&nbsp;Bugzilla&nbsp;could&nbsp;not&nbsp;be&nbsp;controlled&nbsp;via&nbsp;a&nbsp;whole<br>
-&nbsp;&nbsp;&nbsp;range&nbsp;of&nbsp;front&nbsp;ends,&nbsp;including&nbsp;Web,&nbsp;E-Mail,&nbsp;IRC,&nbsp;ICQ,&nbsp;etc,&nbsp;and<br>
-&nbsp;&nbsp;&nbsp;similarly&nbsp;for&nbsp;how&nbsp;it&nbsp;notifies.&nbsp;&nbsp;It's&nbsp;also&nbsp;possible&nbsp;that&nbsp;we&nbsp;could<br>
-&nbsp;&nbsp;&nbsp;introduce&nbsp;a&nbsp;special&nbsp;Bugzilla&nbsp;client&nbsp;that&nbsp;uses&nbsp;its&nbsp;own&nbsp;protocol,&nbsp;for<br>
-&nbsp;&nbsp;&nbsp;maximum&nbsp;user&nbsp;productivity.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Indeed&nbsp;a&nbsp;request&nbsp;reply&nbsp;might&nbsp;be&nbsp;returned&nbsp;via&nbsp;a&nbsp;totally&nbsp;different<br>
-&nbsp;&nbsp;&nbsp;transport&nbsp;method&nbsp;than&nbsp;was&nbsp;use&nbsp;to&nbsp;submit&nbsp;the&nbsp;request.<br>
-<br>
-Internationalisation<br>
-<br>
-&nbsp;&nbsp;&nbsp;Bugzilla&nbsp;currently&nbsp;supports&nbsp;only&nbsp;English.&nbsp;&nbsp;All&nbsp;of&nbsp;the&nbsp;field&nbsp;names,<br>
-&nbsp;&nbsp;&nbsp;user&nbsp;instructions,&nbsp;etc&nbsp;are&nbsp;written&nbsp;in&nbsp;English.&nbsp;&nbsp;It&nbsp;would&nbsp;be&nbsp;desirable<br>
-&nbsp;&nbsp;&nbsp;to&nbsp;allow&nbsp;"language&nbsp;packs"&nbsp;so&nbsp;Bugzilla&nbsp;can&nbsp;be&nbsp;easily&nbsp;used&nbsp;in<br>
-&nbsp;&nbsp;&nbsp;non-English&nbsp;speaking&nbsp;locales.<br>
-<br>
-&nbsp;&nbsp;&nbsp;To&nbsp;a&nbsp;degree&nbsp;field&nbsp;customisation&nbsp;supports&nbsp;this,&nbsp;because&nbsp;administrators<br>
-&nbsp;&nbsp;&nbsp;could&nbsp;specify&nbsp;their&nbsp;own&nbsp;fields&nbsp;names&nbsp;anyway.&nbsp;&nbsp;However,&nbsp;there&nbsp;will<br>
-&nbsp;&nbsp;&nbsp;always&nbsp;be&nbsp;some&nbsp;basic&nbsp;facilities&nbsp;not&nbsp;covered&nbsp;by&nbsp;this,&nbsp;and&nbsp;it&nbsp;is<br>
-&nbsp;&nbsp;&nbsp;desirable&nbsp;that&nbsp;the&nbsp;administrator's&nbsp;interface&nbsp;also&nbsp;is<br>
-&nbsp;&nbsp;&nbsp;internationalisable.<br>
-<br>
-Better&nbsp;Searching<br>
-<br>
-&nbsp;&nbsp;General&nbsp;Summary&nbsp;Reports<br>
-<br>
-&nbsp;&nbsp;&nbsp;Sometimes,&nbsp;the&nbsp;normal&nbsp;querying&nbsp;page&nbsp;leaves&nbsp;a&nbsp;lot&nbsp;to&nbsp;be&nbsp;desired.&nbsp;&nbsp;There<br>
-&nbsp;&nbsp;&nbsp;are&nbsp;other&nbsp;facilities&nbsp;already&nbsp;in&nbsp;place&nbsp;or&nbsp;which&nbsp;people&nbsp;have&nbsp;asked&nbsp;for:<br>
-<br>
-&nbsp;&nbsp;&nbsp;Most&nbsp;Doomed&nbsp;Reports&nbsp;-&nbsp;All&nbsp;Bugs&nbsp;or&nbsp;All&nbsp;Bugs&nbsp;In&nbsp;A&nbsp;Product,&nbsp;Categorised<br>
-&nbsp;&nbsp;&nbsp;On&nbsp;Assignee,&nbsp;Shows&nbsp;and&nbsp;Counts&nbsp;Number&nbsp;of&nbsp;Bugs&nbsp;For&nbsp;Each&nbsp;Assignee<br>
-&nbsp;&nbsp;&nbsp;Most&nbsp;Voted&nbsp;For&nbsp;Bugs&nbsp;-&nbsp;All&nbsp;Bugs,&nbsp;Categorised&nbsp;On&nbsp;Product,&nbsp;Shows&nbsp;Top&nbsp;Ten<br>
-&nbsp;&nbsp;&nbsp;Bugs&nbsp;Voters&nbsp;Most&nbsp;Want&nbsp;Fixed<br>
-&nbsp;&nbsp;&nbsp;Number&nbsp;of&nbsp;Open&nbsp;Bugs&nbsp;For&nbsp;An&nbsp;Assignee&nbsp;-&nbsp;Bug&nbsp;List,&nbsp;Categorised&nbsp;On<br>
-&nbsp;&nbsp;&nbsp;Developers,&nbsp;Counts&nbsp;Number&nbsp;of&nbsp;Bugs&nbsp;In&nbsp;Category<br>
-<br>
-&nbsp;&nbsp;&nbsp;The&nbsp;important&nbsp;thing&nbsp;to&nbsp;realise&nbsp;is&nbsp;that&nbsp;people&nbsp;want&nbsp;categorised&nbsp;reports<br>
-&nbsp;&nbsp;&nbsp;on&nbsp;all&nbsp;sorts&nbsp;of&nbsp;things&nbsp;-&nbsp;a&nbsp;general&nbsp;summary&nbsp;report.<br>
-<br>
-&nbsp;&nbsp;&nbsp;In&nbsp;a&nbsp;categorised&nbsp;report,&nbsp;you&nbsp;choose&nbsp;the&nbsp;subset&nbsp;of&nbsp;bugs&nbsp;you&nbsp;wish&nbsp;to<br>
-&nbsp;&nbsp;&nbsp;operate&nbsp;on&nbsp;(similar&nbsp;to&nbsp;how&nbsp;you&nbsp;would&nbsp;specify&nbsp;a&nbsp;query),&nbsp;and&nbsp;then<br>
-&nbsp;&nbsp;&nbsp;categorise&nbsp;them&nbsp;on&nbsp;one&nbsp;or&nbsp;more&nbsp;fields.<br>
-<br>
-&nbsp;&nbsp;&nbsp;For&nbsp;each&nbsp;category&nbsp;you&nbsp;display&nbsp;the&nbsp;count&nbsp;of&nbsp;the&nbsp;number&nbsp;of&nbsp;things&nbsp;in<br>
-&nbsp;&nbsp;&nbsp;that&nbsp;category.&nbsp;&nbsp;You&nbsp;can&nbsp;optionally&nbsp;display&nbsp;the&nbsp;bugs&nbsp;themselves,&nbsp;or<br>
-&nbsp;&nbsp;&nbsp;leave&nbsp;them&nbsp;out,&nbsp;just&nbsp;showing&nbsp;the&nbsp;counts.&nbsp;&nbsp;And&nbsp;you&nbsp;can&nbsp;optionally&nbsp;limit<br>
-&nbsp;&nbsp;&nbsp;the&nbsp;number&nbsp;of&nbsp;things&nbsp;(bugs&nbsp;or&nbsp;subcategories)&nbsp;that&nbsp;display&nbsp;in&nbsp;each<br>
-&nbsp;&nbsp;&nbsp;category.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Such&nbsp;a&nbsp;mechanism&nbsp;would&nbsp;let&nbsp;you&nbsp;do&nbsp;all&nbsp;of&nbsp;the&nbsp;above&nbsp;and&nbsp;more.<br>
-&nbsp;&nbsp;&nbsp;Applications&nbsp;of&nbsp;this&nbsp;mechanism&nbsp;would&nbsp;only&nbsp;be&nbsp;recognised&nbsp;once&nbsp;it&nbsp;was<br>
-&nbsp;&nbsp;&nbsp;implemented.<br>
-<br>
-&nbsp;&nbsp;Related&nbsp;Bugs<br>
-<br>
-&nbsp;&nbsp;&nbsp;It&nbsp;would&nbsp;be&nbsp;nice&nbsp;to&nbsp;have&nbsp;a&nbsp;field&nbsp;where&nbsp;you&nbsp;could&nbsp;enter&nbsp;other&nbsp;bugs<br>
-&nbsp;&nbsp;&nbsp;related&nbsp;to&nbsp;the&nbsp;current&nbsp;bug.&nbsp;&nbsp;It&nbsp;would&nbsp;be&nbsp;handy&nbsp;for&nbsp;navigation&nbsp;and<br>
-&nbsp;&nbsp;&nbsp;possibly&nbsp;even&nbsp;finding&nbsp;duplicates.<br>
-<br>
-&nbsp;&nbsp;Column&nbsp;Specification&nbsp;Support<br>
-<br>
-&nbsp;&nbsp;&nbsp;Currently&nbsp;bug&nbsp;lists&nbsp;use&nbsp;the&nbsp;columns&nbsp;that&nbsp;you&nbsp;last&nbsp;used.&nbsp;&nbsp;This&nbsp;doesn't<br>
-&nbsp;&nbsp;&nbsp;work&nbsp;well&nbsp;for&nbsp;"prepackaged&nbsp;queries",&nbsp;where&nbsp;you&nbsp;followed&nbsp;a&nbsp;link.&nbsp;&nbsp;You<br>
-&nbsp;&nbsp;&nbsp;can&nbsp;probably&nbsp;add&nbsp;a&nbsp;column&nbsp;by&nbsp;specifying&nbsp;a&nbsp;sort&nbsp;column,&nbsp;but&nbsp;this&nbsp;is<br>
-&nbsp;&nbsp;&nbsp;difficult&nbsp;and&nbsp;suboptimal.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Furthermore,&nbsp;I&nbsp;find&nbsp;that&nbsp;when&nbsp;I&nbsp;want&nbsp;to&nbsp;add&nbsp;a&nbsp;column&nbsp;to&nbsp;a&nbsp;bug&nbsp;list,<br>
-&nbsp;&nbsp;&nbsp;it's&nbsp;usually&nbsp;a&nbsp;one&nbsp;off&nbsp;and&nbsp;I&nbsp;would&nbsp;prefer&nbsp;it&nbsp;to&nbsp;go&nbsp;away&nbsp;for&nbsp;the&nbsp;next<br>
-&nbsp;&nbsp;&nbsp;query.&nbsp;&nbsp;Hence,&nbsp;it&nbsp;would&nbsp;be&nbsp;nice&nbsp;to&nbsp;specify&nbsp;the&nbsp;columns&nbsp;that&nbsp;appear&nbsp;on<br>
-&nbsp;&nbsp;&nbsp;the&nbsp;bug&nbsp;list&nbsp;(and&nbsp;general&nbsp;summary&nbsp;report)&nbsp;pages.&nbsp;&nbsp;The&nbsp;default&nbsp;query<br>
-&nbsp;&nbsp;&nbsp;mechanism&nbsp;should&nbsp;be&nbsp;able&nbsp;to&nbsp;let&nbsp;you&nbsp;specify&nbsp;your&nbsp;default&nbsp;columns.<br>
-<br>
-&nbsp;&nbsp;Advanced&nbsp;Querying&nbsp;Redesign<br>
-<br>
-&nbsp;&nbsp;&nbsp;?<br>
-<br>
-Keywords<br>
-<br>
-&nbsp;&nbsp;&nbsp;People&nbsp;have&nbsp;a&nbsp;need&nbsp;to&nbsp;apply&nbsp;tags&nbsp;to&nbsp;bugs.&nbsp;&nbsp;In&nbsp;the&nbsp;beginning,&nbsp;people<br>
-&nbsp;&nbsp;&nbsp;placed&nbsp;designators&nbsp;in&nbsp;the&nbsp;summary&nbsp;and&nbsp;status&nbsp;whiteboard.&nbsp;&nbsp;However,<br>
-&nbsp;&nbsp;&nbsp;these&nbsp;fields&nbsp;were&nbsp;not&nbsp;designed&nbsp;for&nbsp;that,&nbsp;and&nbsp;so&nbsp;there&nbsp;were&nbsp;many&nbsp;flaws<br>
-&nbsp;&nbsp;&nbsp;with&nbsp;this&nbsp;system:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;They&nbsp;pollute&nbsp;the&nbsp;field&nbsp;with&nbsp;information&nbsp;that&nbsp;was&nbsp;never&nbsp;intended&nbsp;to<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;be&nbsp;present.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Removing&nbsp;them&nbsp;with&nbsp;a&nbsp;bulk&nbsp;change&nbsp;is&nbsp;a&nbsp;difficult&nbsp;problem&nbsp;that&nbsp;has<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;too&nbsp;many&nbsp;pitfalls&nbsp;to&nbsp;implement.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;You&nbsp;can&nbsp;easily&nbsp;get&nbsp;the&nbsp;capitalisation&nbsp;wrong.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Then&nbsp;dependencies&nbsp;were&nbsp;introduced&nbsp;(when?),&nbsp;and&nbsp;people&nbsp;realised&nbsp;that<br>
-&nbsp;&nbsp;&nbsp;they&nbsp;could&nbsp;use&nbsp;them&nbsp;for&nbsp;"tracking&nbsp;bugs".&nbsp;&nbsp;Again,&nbsp;dependencies&nbsp;were&nbsp;not<br>
-&nbsp;&nbsp;&nbsp;designed&nbsp;for&nbsp;that,&nbsp;and&nbsp;so&nbsp;there&nbsp;were&nbsp;more&nbsp;flaws,&nbsp;albeit&nbsp;different<br>
-&nbsp;&nbsp;&nbsp;ones,&nbsp;including:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;They&nbsp;aren't&nbsp;really&nbsp;bugs,&nbsp;so&nbsp;it's&nbsp;difficult&nbsp;to&nbsp;distinguish&nbsp;issues<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;bugs.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;They&nbsp;can&nbsp;pollute&nbsp;bugs&nbsp;counts,&nbsp;and&nbsp;you&nbsp;must&nbsp;somehow&nbsp;exclude&nbsp;them<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;queries.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;There&nbsp;is&nbsp;a&nbsp;whole&nbsp;lot&nbsp;of&nbsp;useless&nbsp;information&nbsp;on&nbsp;them.&nbsp;&nbsp;They&nbsp;have&nbsp;an<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assignee&nbsp;but&nbsp;there&nbsp;is&nbsp;nothing&nbsp;to&nbsp;fix,&nbsp;and&nbsp;that&nbsp;person&nbsp;can&nbsp;get<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;whined&nbsp;at&nbsp;by&nbsp;Bugzilla.&nbsp;&nbsp;They&nbsp;have&nbsp;target&nbsp;milestones&nbsp;which&nbsp;must&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manually&nbsp;maintained.&nbsp;&nbsp;And&nbsp;so&nbsp;on.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Finally,&nbsp;keywords&nbsp;were&nbsp;introduced&nbsp;(when?)&nbsp;for&nbsp;this&nbsp;purpose&nbsp;to&nbsp;remove<br>
-&nbsp;&nbsp;&nbsp;the&nbsp;need&nbsp;for&nbsp;these&nbsp;two&nbsp;systems.&nbsp;&nbsp;Unfortunately,&nbsp;the&nbsp;simple&nbsp;keywords<br>
-&nbsp;&nbsp;&nbsp;implementation&nbsp;was&nbsp;itself&nbsp;lacking&nbsp;in&nbsp;certain&nbsp;features&nbsp;provided&nbsp;by&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;two&nbsp;previous&nbsp;systems,&nbsp;and&nbsp;has&nbsp;remained&nbsp;almost&nbsp;unchanged&nbsp;since&nbsp;its<br>
-&nbsp;&nbsp;&nbsp;inception.&nbsp;&nbsp;Furthermore,&nbsp;it&nbsp;could&nbsp;not&nbsp;be&nbsp;forseen&nbsp;that&nbsp;in&nbsp;large<br>
-&nbsp;&nbsp;&nbsp;installations,&nbsp;the&nbsp;sheer&nbsp;number&nbsp;of&nbsp;keywords&nbsp;could&nbsp;become&nbsp;unwieldly&nbsp;and<br>
-&nbsp;&nbsp;&nbsp;could&nbsp;lead&nbsp;to&nbsp;a&nbsp;movement&nbsp;back&nbsp;to&nbsp;the&nbsp;other&nbsp;systems.<br>
-<br>
-&nbsp;&nbsp;&nbsp;The&nbsp;keywords&nbsp;system&nbsp;was&nbsp;the&nbsp;right&nbsp;idea,&nbsp;however,&nbsp;and&nbsp;it&nbsp;remains&nbsp;so.<br>
-&nbsp;&nbsp;&nbsp;Fixing&nbsp;the&nbsp;keywords&nbsp;system&nbsp;is&nbsp;one&nbsp;of&nbsp;the&nbsp;most&nbsp;important&nbsp;Bugzilla<br>
-&nbsp;&nbsp;&nbsp;issues.<br>
-<br>
-&nbsp;&nbsp;Bringing&nbsp;Keywords&nbsp;Up&nbsp;To&nbsp;Par<br>
-<br>
-&nbsp;&nbsp;&nbsp;For&nbsp;the&nbsp;most&nbsp;part,&nbsp;keywords&nbsp;are&nbsp;very&nbsp;good&nbsp;at&nbsp;what&nbsp;they&nbsp;do.&nbsp;&nbsp;It&nbsp;is&nbsp;easy<br>
-&nbsp;&nbsp;&nbsp;to&nbsp;add&nbsp;and&nbsp;remove&nbsp;them&nbsp;(unlike&nbsp;summary/whiteboard&nbsp;designators),&nbsp;we&nbsp;can<br>
-&nbsp;&nbsp;&nbsp;simply&nbsp;see&nbsp;what&nbsp;issues&nbsp;are&nbsp;present&nbsp;on&nbsp;a&nbsp;bug&nbsp;(unlike&nbsp;tracking&nbsp;bugs),<br>
-&nbsp;&nbsp;&nbsp;and&nbsp;we&nbsp;do&nbsp;not&nbsp;confuse&nbsp;bugs&nbsp;with&nbsp;issues&nbsp;(unlike&nbsp;tracking&nbsp;bugs).<br>
-<br>
-&nbsp;&nbsp;&nbsp;However,&nbsp;there&nbsp;are&nbsp;still&nbsp;some&nbsp;"regressions"&nbsp;in&nbsp;the&nbsp;keyword&nbsp;system&nbsp;over<br>
-&nbsp;&nbsp;&nbsp;previous&nbsp;systems:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Users&nbsp;wish&nbsp;to&nbsp;view&nbsp;the&nbsp;"dependency&nbsp;forest"&nbsp;of&nbsp;a&nbsp;keyword.&nbsp;&nbsp;While&nbsp;a<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dependency&nbsp;tree&nbsp;is&nbsp;of&nbsp;one&nbsp;bug,&nbsp;a&nbsp;dependency&nbsp;forest&nbsp;is&nbsp;of&nbsp;a&nbsp;bug<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list,&nbsp;and&nbsp;consists&nbsp;of&nbsp;a&nbsp;dependency&nbsp;tree&nbsp;for&nbsp;each&nbsp;member&nbsp;of&nbsp;the&nbsp;bug<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.&nbsp;&nbsp;Users&nbsp;can&nbsp;work&nbsp;around&nbsp;this&nbsp;with&nbsp;tracking&nbsp;bugs&nbsp;by&nbsp;creating&nbsp;a<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tracking&nbsp;bug&nbsp;and&nbsp;viewing&nbsp;the&nbsp;dependency&nbsp;tree&nbsp;of&nbsp;that&nbsp;tracking&nbsp;bug.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Users&nbsp;wish&nbsp;to&nbsp;specify&nbsp;the&nbsp;keywords&nbsp;that&nbsp;initially&nbsp;apply&nbsp;to&nbsp;a&nbsp;bug,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;but&nbsp;instead&nbsp;they&nbsp;must&nbsp;edit&nbsp;the&nbsp;bug&nbsp;once&nbsp;it&nbsp;has&nbsp;already&nbsp;been<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;submitted.&nbsp;&nbsp;They&nbsp;can&nbsp;work&nbsp;around&nbsp;this&nbsp;with&nbsp;summary&nbsp;designators,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;since&nbsp;they&nbsp;specify&nbsp;the&nbsp;summary&nbsp;at&nbsp;reporting&nbsp;time.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Users&nbsp;wish&nbsp;to&nbsp;store&nbsp;or&nbsp;share&nbsp;a&nbsp;bug&nbsp;list&nbsp;that&nbsp;contains&nbsp;a&nbsp;keywords<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column.&nbsp;&nbsp;Hence&nbsp;they&nbsp;wish&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;specify&nbsp;what&nbsp;columns&nbsp;appear<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;the&nbsp;bug&nbsp;list&nbsp;URL,&nbsp;as&nbsp;mentioned&nbsp;earlier.&nbsp;&nbsp;They&nbsp;can&nbsp;work&nbsp;around<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this&nbsp;using&nbsp;summary&nbsp;designators,&nbsp;since&nbsp;almost&nbsp;all&nbsp;bug&nbsp;lists&nbsp;have&nbsp;a<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;summary&nbsp;column.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Users&nbsp;wish&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;view&nbsp;keywords&nbsp;on&nbsp;a&nbsp;bug&nbsp;list.&nbsp;&nbsp;However<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;often&nbsp;they&nbsp;are&nbsp;only&nbsp;interested&nbsp;in&nbsp;a&nbsp;small&nbsp;number&nbsp;of&nbsp;keywords.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Having&nbsp;a&nbsp;bug&nbsp;list&nbsp;with&nbsp;a&nbsp;keywords&nbsp;column&nbsp;means&nbsp;that&nbsp;all&nbsp;keywords<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;will&nbsp;appear&nbsp;on&nbsp;a&nbsp;bug&nbsp;list.&nbsp;&nbsp;This&nbsp;can&nbsp;take&nbsp;a&nbsp;substantial&nbsp;amount&nbsp;of<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;space&nbsp;where&nbsp;a&nbsp;bug&nbsp;has&nbsp;a&nbsp;lot&nbsp;of&nbsp;keywords,&nbsp;since&nbsp;the&nbsp;table&nbsp;columns<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;Bugzilla&nbsp;adjust&nbsp;to&nbsp;the&nbsp;largest&nbsp;cell&nbsp;in&nbsp;that&nbsp;column.&nbsp;&nbsp;Hence<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;users&nbsp;wish&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;specify&nbsp;which&nbsp;keywords&nbsp;should&nbsp;appear&nbsp;in<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;bug&nbsp;list.&nbsp;&nbsp;In&nbsp;a&nbsp;very&nbsp;real&nbsp;sense,&nbsp;each&nbsp;keyword&nbsp;is&nbsp;a&nbsp;field&nbsp;unto<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itself.&nbsp;&nbsp;Users&nbsp;can&nbsp;work&nbsp;around&nbsp;this&nbsp;by&nbsp;using&nbsp;summary&nbsp;designators,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;since&nbsp;they&nbsp;keywords&nbsp;will&nbsp;share&nbsp;the&nbsp;space&nbsp;in&nbsp;the&nbsp;summary&nbsp;column.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Users&nbsp;wish&nbsp;to&nbsp;know&nbsp;when&nbsp;bugs&nbsp;with&nbsp;a&nbsp;specific&nbsp;issue&nbsp;are&nbsp;resolved.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hence&nbsp;they&nbsp;wish&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;receive&nbsp;notifications&nbsp;on&nbsp;all&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bugs&nbsp;with&nbsp;a&nbsp;specific&nbsp;keyword.&nbsp;&nbsp;The&nbsp;introduction&nbsp;a&nbsp;generic&nbsp;watching<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;facility&nbsp;(also&nbsp;for&nbsp;things&nbsp;like&nbsp;watching&nbsp;all&nbsp;bugs&nbsp;in&nbsp;a&nbsp;component)<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;would&nbsp;achieve&nbsp;this.&nbsp;&nbsp;Users&nbsp;can&nbsp;work&nbsp;around&nbsp;this&nbsp;by&nbsp;using&nbsp;tracking<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bugs,&nbsp;as&nbsp;dependencies&nbsp;have&nbsp;an&nbsp;existing&nbsp;way&nbsp;of&nbsp;detecting&nbsp;fixes&nbsp;to<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bug&nbsp;a&nbsp;bug&nbsp;was&nbsp;blocked&nbsp;by.<br>
-<br>
-&nbsp;&nbsp;Dealing&nbsp;With&nbsp;The&nbsp;Keyword&nbsp;Overload<br>
-<br>
-&nbsp;&nbsp;&nbsp;At&nbsp;the&nbsp;time&nbsp;of&nbsp;writing,&nbsp;the&nbsp;mozilla.org&nbsp;installation&nbsp;has&nbsp;approximately<br>
-&nbsp;&nbsp;&nbsp;100&nbsp;keywords,&nbsp;and&nbsp;many&nbsp;more&nbsp;would&nbsp;be&nbsp;in&nbsp;use&nbsp;if&nbsp;the&nbsp;keywords&nbsp;system<br>
-&nbsp;&nbsp;&nbsp;didn't&nbsp;have&nbsp;the&nbsp;problems&nbsp;it&nbsp;does.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Such&nbsp;a&nbsp;large&nbsp;number&nbsp;of&nbsp;keywords&nbsp;introduces&nbsp;logistical&nbsp;problems:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;It&nbsp;must&nbsp;be&nbsp;easy&nbsp;for&nbsp;someone&nbsp;to&nbsp;learn&nbsp;what&nbsp;a&nbsp;keyword&nbsp;means.&nbsp;&nbsp;If&nbsp;a<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyword&nbsp;is&nbsp;buried&nbsp;within&nbsp;a&nbsp;lot&nbsp;of&nbsp;other&nbsp;keywords,&nbsp;it&nbsp;can&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;difficult&nbsp;to&nbsp;find.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;It&nbsp;must&nbsp;be&nbsp;easy&nbsp;to&nbsp;see&nbsp;what&nbsp;keywords&nbsp;are&nbsp;on&nbsp;a&nbsp;bug.&nbsp;&nbsp;If&nbsp;the&nbsp;number<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;keywords&nbsp;is&nbsp;large,&nbsp;then&nbsp;this&nbsp;can&nbsp;be&nbsp;difficult.<br>
-<br>
-&nbsp;&nbsp;&nbsp;These&nbsp;lead&nbsp;some&nbsp;people&nbsp;to&nbsp;feel&nbsp;that&nbsp;there&nbsp;are&nbsp;"too&nbsp;many&nbsp;keywords".<br>
-<br>
-&nbsp;&nbsp;&nbsp;These&nbsp;problems&nbsp;are&nbsp;not&nbsp;without&nbsp;solutions&nbsp;however.&nbsp;&nbsp;It&nbsp;is&nbsp;harder&nbsp;to<br>
-&nbsp;&nbsp;&nbsp;find&nbsp;a&nbsp;list&nbsp;of&nbsp;designators&nbsp;or&nbsp;tracking&nbsp;bugs&nbsp;than&nbsp;it&nbsp;is&nbsp;a&nbsp;list&nbsp;of<br>
-&nbsp;&nbsp;&nbsp;keywords.<br>
-<br>
-&nbsp;&nbsp;&nbsp;The&nbsp;essential&nbsp;problem&nbsp;is&nbsp;it&nbsp;needs&nbsp;to&nbsp;be&nbsp;easy&nbsp;to&nbsp;find&nbsp;the&nbsp;keywords<br>
-&nbsp;&nbsp;&nbsp;we're&nbsp;interested&nbsp;in&nbsp;through&nbsp;the&nbsp;mass&nbsp;of&nbsp;keywords.<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Keyword&nbsp;Applicability<br>
-<br>
-&nbsp;&nbsp;&nbsp;As&nbsp;has&nbsp;been&nbsp;previously&nbsp;mentioned,&nbsp;it&nbsp;is&nbsp;desirable&nbsp;for&nbsp;fields&nbsp;to&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;able&nbsp;to&nbsp;adapt&nbsp;to&nbsp;the&nbsp;values&nbsp;of&nbsp;other&nbsp;fields.&nbsp;&nbsp;This&nbsp;is&nbsp;certainly&nbsp;true<br>
-&nbsp;&nbsp;&nbsp;for&nbsp;keywords.&nbsp;&nbsp;Many&nbsp;keywords&nbsp;are&nbsp;simply&nbsp;not&nbsp;relevant&nbsp;because&nbsp;of&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;bugs&nbsp;product,&nbsp;component,&nbsp;etc.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Hence,&nbsp;by&nbsp;introducing&nbsp;keyword&nbsp;applicability,&nbsp;and&nbsp;not&nbsp;displaying<br>
-&nbsp;&nbsp;&nbsp;keywords&nbsp;that&nbsp;are&nbsp;not&nbsp;relevant&nbsp;to&nbsp;the&nbsp;current&nbsp;bug,&nbsp;or&nbsp;clearly<br>
-&nbsp;&nbsp;&nbsp;separating&nbsp;them,&nbsp;we&nbsp;can&nbsp;make&nbsp;the&nbsp;keyword&nbsp;overload&nbsp;problem&nbsp;less<br>
-&nbsp;&nbsp;&nbsp;significant.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Currently&nbsp;when&nbsp;you&nbsp;click&nbsp;on&nbsp;"keywords"&nbsp;on&nbsp;a&nbsp;bug,&nbsp;you&nbsp;get&nbsp;a&nbsp;list&nbsp;of&nbsp;all<br>
-&nbsp;&nbsp;&nbsp;bugs.&nbsp;&nbsp;It&nbsp;would&nbsp;be&nbsp;desirable&nbsp;to&nbsp;introduce&nbsp;a&nbsp;list&nbsp;of&nbsp;keywords&nbsp;tailored<br>
-&nbsp;&nbsp;&nbsp;to&nbsp;a&nbsp;specific&nbsp;bug,&nbsp;that&nbsp;reports,&nbsp;in&nbsp;order:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;keywords&nbsp;currently&nbsp;on&nbsp;the&nbsp;bug<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;keywords&nbsp;not&nbsp;currently&nbsp;on&nbsp;the&nbsp;bug,&nbsp;but&nbsp;applicable&nbsp;to&nbsp;the&nbsp;bug<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;optionally,&nbsp;the&nbsp;keywords&nbsp;not&nbsp;applicable&nbsp;to&nbsp;the&nbsp;bug<br>
-<br>
-&nbsp;&nbsp;&nbsp;This&nbsp;essentially&nbsp;orders&nbsp;the&nbsp;keywords&nbsp;into&nbsp;three&nbsp;groups,&nbsp;where&nbsp;each<br>
-&nbsp;&nbsp;&nbsp;group&nbsp;is&nbsp;more&nbsp;important&nbsp;than&nbsp;the&nbsp;previous,&nbsp;and&nbsp;therefore&nbsp;appears<br>
-&nbsp;&nbsp;&nbsp;closer&nbsp;to&nbsp;the&nbsp;top.<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Keyword&nbsp;Grouping&nbsp;&#38;&nbsp;Ordering<br>
-<br>
-&nbsp;&nbsp;&nbsp;We&nbsp;could&nbsp;further&nbsp;enhance&nbsp;both&nbsp;the&nbsp;global&nbsp;and&nbsp;bug&nbsp;specific&nbsp;keyword&nbsp;list<br>
-&nbsp;&nbsp;&nbsp;by&nbsp;grouping&nbsp;keywords.&nbsp;&nbsp;We&nbsp;should&nbsp;always&nbsp;have&nbsp;a&nbsp;"flat"&nbsp;view&nbsp;of<br>
-&nbsp;&nbsp;&nbsp;keywords,&nbsp;but&nbsp;other&nbsp;ways&nbsp;of&nbsp;viewing&nbsp;the&nbsp;keywords&nbsp;would&nbsp;be&nbsp;useful&nbsp;too.<br>
-<br>
-&nbsp;&nbsp;&nbsp;If&nbsp;keyword&nbsp;applicability&nbsp;was&nbsp;implemented,&nbsp;we&nbsp;could&nbsp;group&nbsp;keywords<br>
-&nbsp;&nbsp;&nbsp;based&nbsp;on&nbsp;their&nbsp;"applicability&nbsp;condition".&nbsp;&nbsp;Keywords&nbsp;that&nbsp;apply&nbsp;to&nbsp;all<br>
-&nbsp;&nbsp;&nbsp;bugs&nbsp;could&nbsp;be&nbsp;separated&nbsp;from&nbsp;keywords&nbsp;that&nbsp;apply&nbsp;to&nbsp;a&nbsp;specific<br>
-&nbsp;&nbsp;&nbsp;product,&nbsp;both&nbsp;on&nbsp;the&nbsp;global&nbsp;keyword&nbsp;list&nbsp;and&nbsp;the&nbsp;keyword&nbsp;list&nbsp;of&nbsp;a&nbsp;bug<br>
-&nbsp;&nbsp;&nbsp;that&nbsp;is&nbsp;in&nbsp;that&nbsp;product.<br>
-<br>
-&nbsp;&nbsp;&nbsp;We&nbsp;could&nbsp;specify&nbsp;groups&nbsp;of&nbsp;our&nbsp;own.&nbsp;&nbsp;For&nbsp;example,&nbsp;many&nbsp;keywords&nbsp;are&nbsp;in<br>
-&nbsp;&nbsp;&nbsp;a&nbsp;mutually&nbsp;exclusive&nbsp;group,&nbsp;essentially&nbsp;like&nbsp;radio&nbsp;buttons&nbsp;in&nbsp;a&nbsp;user<br>
-&nbsp;&nbsp;&nbsp;interface.&nbsp;&nbsp;This&nbsp;creates&nbsp;a&nbsp;natural&nbsp;grouping,&nbsp;although&nbsp;other&nbsp;groupings<br>
-&nbsp;&nbsp;&nbsp;occur&nbsp;(which&nbsp;depends&nbsp;on&nbsp;your&nbsp;keywords).<br>
-<br>
-&nbsp;&nbsp;&nbsp;It&nbsp;is&nbsp;possible&nbsp;that&nbsp;we&nbsp;could&nbsp;use&nbsp;collapsing/expanding&nbsp;operations&nbsp;on<br>
-&nbsp;&nbsp;&nbsp;"twisties"&nbsp;to&nbsp;only&nbsp;should&nbsp;the&nbsp;groups&nbsp;we&nbsp;are&nbsp;interested&nbsp;in.<br>
-<br>
-&nbsp;&nbsp;&nbsp;And&nbsp;instead&nbsp;of&nbsp;grouping&nbsp;keywords,&nbsp;we&nbsp;could&nbsp;order&nbsp;them&nbsp;on&nbsp;some&nbsp;metric<br>
-&nbsp;&nbsp;&nbsp;of&nbsp;usefulness,&nbsp;such&nbsp;as:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;when&nbsp;the&nbsp;keyword&nbsp;was&nbsp;last&nbsp;added&nbsp;to&nbsp;a&nbsp;bug<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;how&nbsp;many&nbsp;bugs&nbsp;the&nbsp;keyword&nbsp;is&nbsp;on<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;how&nbsp;many&nbsp;open&nbsp;bugs&nbsp;the&nbsp;keyword&nbsp;is&nbsp;on<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;Opting&nbsp;Out&nbsp;Of&nbsp;Keywords<br>
-<br>
-&nbsp;&nbsp;&nbsp;Not&nbsp;all&nbsp;people&nbsp;are&nbsp;going&nbsp;to&nbsp;care&nbsp;about&nbsp;all&nbsp;keywords.&nbsp;&nbsp;Therefore&nbsp;it<br>
-&nbsp;&nbsp;&nbsp;makes&nbsp;sense&nbsp;that&nbsp;you&nbsp;may&nbsp;wish&nbsp;to&nbsp;specify&nbsp;which&nbsp;keywords&nbsp;you&nbsp;are<br>
-&nbsp;&nbsp;&nbsp;interested&nbsp;in,&nbsp;either&nbsp;on&nbsp;the&nbsp;bug&nbsp;page,&nbsp;or&nbsp;on&nbsp;notifications.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Other&nbsp;keywords&nbsp;will&nbsp;therefore&nbsp;not&nbsp;bother&nbsp;users&nbsp;who&nbsp;are&nbsp;not&nbsp;interested<br>
-&nbsp;&nbsp;&nbsp;in&nbsp;them.<br>
-<br>
-&nbsp;&nbsp;Keyword&nbsp;Security<br>
-<br>
-&nbsp;&nbsp;&nbsp;Currently&nbsp;all&nbsp;keywords&nbsp;are&nbsp;available&nbsp;and&nbsp;editable&nbsp;to&nbsp;all&nbsp;people&nbsp;with<br>
-&nbsp;&nbsp;&nbsp;edit&nbsp;bugs&nbsp;access.&nbsp;&nbsp;This&nbsp;situation&nbsp;is&nbsp;clearly&nbsp;suboptimal.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Although&nbsp;relying&nbsp;on&nbsp;good&nbsp;behaviour&nbsp;for&nbsp;people&nbsp;to&nbsp;not&nbsp;do&nbsp;what&nbsp;they<br>
-&nbsp;&nbsp;&nbsp;shouldn't&nbsp;works&nbsp;reasonably&nbsp;well&nbsp;on&nbsp;the&nbsp;mozilla.org,&nbsp;it&nbsp;is&nbsp;better&nbsp;to<br>
-&nbsp;&nbsp;&nbsp;enforce&nbsp;that&nbsp;behaviour&nbsp;-&nbsp;it&nbsp;can&nbsp;be&nbsp;breached&nbsp;through&nbsp;malice,&nbsp;accident<br>
-&nbsp;&nbsp;&nbsp;or&nbsp;ignorance.<br>
-<br>
-&nbsp;&nbsp;&nbsp;And&nbsp;in&nbsp;the&nbsp;situation&nbsp;where&nbsp;it&nbsp;is&nbsp;desirable&nbsp;for&nbsp;the&nbsp;presence&nbsp;or&nbsp;absence<br>
-&nbsp;&nbsp;&nbsp;of&nbsp;a&nbsp;keyword&nbsp;not&nbsp;to&nbsp;be&nbsp;revealed,&nbsp;organisations&nbsp;either&nbsp;need&nbsp;to&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;content&nbsp;with&nbsp;the&nbsp;divulgence,&nbsp;or&nbsp;not&nbsp;use&nbsp;keywords&nbsp;at&nbsp;all.<br>
-<br>
-&nbsp;&nbsp;&nbsp;In&nbsp;the&nbsp;situation&nbsp;where&nbsp;they&nbsp;choose&nbsp;to&nbsp;divulge,&nbsp;introducing&nbsp;the&nbsp;ability<br>
-&nbsp;&nbsp;&nbsp;to&nbsp;restrict&nbsp;who&nbsp;can&nbsp;see&nbsp;the&nbsp;keyword&nbsp;would&nbsp;also&nbsp;reduce&nbsp;keyword<br>
-&nbsp;&nbsp;&nbsp;overload.<br>
-<br>
-&nbsp;&nbsp;Personal&nbsp;Keywords<br>
-<br>
-&nbsp;&nbsp;&nbsp;Keywords&nbsp;join&nbsp;together&nbsp;a&nbsp;set&nbsp;of&nbsp;bugs&nbsp;which&nbsp;would&nbsp;otherwise&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;unrelated&nbsp;in&nbsp;the&nbsp;bug&nbsp;system.<br>
-<br>
-&nbsp;&nbsp;&nbsp;We&nbsp;allow&nbsp;users&nbsp;to&nbsp;store&nbsp;their&nbsp;own&nbsp;queries.&nbsp;&nbsp;However&nbsp;we&nbsp;don't&nbsp;allow<br>
-&nbsp;&nbsp;&nbsp;them&nbsp;to&nbsp;store&nbsp;their&nbsp;own&nbsp;keywords&nbsp;on&nbsp;a&nbsp;bug.&nbsp;&nbsp;This&nbsp;reduces&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;usefulness&nbsp;of&nbsp;personal&nbsp;queries,&nbsp;since&nbsp;you&nbsp;cannot&nbsp;join&nbsp;a&nbsp;set&nbsp;of<br>
-&nbsp;&nbsp;&nbsp;unrelated&nbsp;bugs&nbsp;together&nbsp;in&nbsp;a&nbsp;way&nbsp;that&nbsp;you&nbsp;wish.&nbsp;&nbsp;Lists&nbsp;of&nbsp;bug&nbsp;numbers<br>
-&nbsp;&nbsp;&nbsp;can&nbsp;work,&nbsp;by&nbsp;they&nbsp;can&nbsp;only&nbsp;be&nbsp;used&nbsp;for&nbsp;small&nbsp;lists,&nbsp;and&nbsp;it&nbsp;is<br>
-&nbsp;&nbsp;&nbsp;impossible&nbsp;to&nbsp;share&nbsp;a&nbsp;list&nbsp;between&nbsp;multiple&nbsp;queries.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Personal&nbsp;keywords&nbsp;are&nbsp;necessary&nbsp;to&nbsp;replace&nbsp;personal&nbsp;tracking&nbsp;bugs,&nbsp;as<br>
-&nbsp;&nbsp;&nbsp;they&nbsp;would&nbsp;not&nbsp;pollute&nbsp;the&nbsp;keyword&nbsp;space.&nbsp;&nbsp;Indeed,&nbsp;on&nbsp;many<br>
-&nbsp;&nbsp;&nbsp;installations&nbsp;this&nbsp;could&nbsp;remove&nbsp;some&nbsp;keywords&nbsp;out&nbsp;of&nbsp;the&nbsp;global<br>
-&nbsp;&nbsp;&nbsp;keyword&nbsp;space.<br>
-<br>
-&nbsp;&nbsp;&nbsp;In&nbsp;a&nbsp;similar&nbsp;vein&nbsp;and&nbsp;with&nbsp;similar&nbsp;effects,&nbsp;group&nbsp;keywords&nbsp;could&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;introduced&nbsp;that&nbsp;are&nbsp;only&nbsp;available&nbsp;to&nbsp;members&nbsp;of&nbsp;a&nbsp;specific&nbsp;group.<br>
-<br>
-&nbsp;&nbsp;Keyword&nbsp;Restrictions<br>
-<br>
-&nbsp;&nbsp;&nbsp;Keywords&nbsp;are&nbsp;not&nbsp;islands&nbsp;unto&nbsp;themselves.&nbsp;&nbsp;Along&nbsp;with&nbsp;their&nbsp;potential<br>
-&nbsp;&nbsp;&nbsp;to&nbsp;be&nbsp;involved&nbsp;in&nbsp;the&nbsp;inter-field&nbsp;relationships&nbsp;mentioned&nbsp;earlier,<br>
-&nbsp;&nbsp;&nbsp;keywords&nbsp;can&nbsp;also&nbsp;be&nbsp;related&nbsp;to&nbsp;other&nbsp;keywords.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Essentially,&nbsp;there&nbsp;are&nbsp;two&nbsp;possibilities:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;a&nbsp;set&nbsp;of&nbsp;keywords&nbsp;are&nbsp;mutually&nbsp;exclusive<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;presence&nbsp;of&nbsp;a&nbsp;keyword&nbsp;implies&nbsp;another&nbsp;keyword&nbsp;must&nbsp;be&nbsp;present<br>
-<br>
-&nbsp;&nbsp;&nbsp;Introduction&nbsp;of&nbsp;the&nbsp;ability&nbsp;to&nbsp;specify&nbsp;these&nbsp;restrictions&nbsp;would&nbsp;have<br>
-&nbsp;&nbsp;&nbsp;benefits.<br>
-<br>
-&nbsp;&nbsp;&nbsp;If&nbsp;mutually&nbsp;exclusive&nbsp;keywords&nbsp;were&nbsp;present&nbsp;on&nbsp;a&nbsp;bug,&nbsp;their&nbsp;removal<br>
-&nbsp;&nbsp;&nbsp;would&nbsp;fix&nbsp;up&nbsp;the&nbsp;database,&nbsp;as&nbsp;well&nbsp;as&nbsp;reducing&nbsp;the&nbsp;number&nbsp;of&nbsp;keywords<br>
-&nbsp;&nbsp;&nbsp;on&nbsp;that&nbsp;bug.<br>
-<br>
-&nbsp;&nbsp;&nbsp;In&nbsp;the&nbsp;situation&nbsp;where&nbsp;a&nbsp;keyword&nbsp;implies&nbsp;another&nbsp;keyword,&nbsp;there&nbsp;are<br>
-&nbsp;&nbsp;&nbsp;two&nbsp;possiblities&nbsp;as&nbsp;to&nbsp;how&nbsp;to&nbsp;handle&nbsp;the&nbsp;situation.<br>
-<br>
-&nbsp;&nbsp;&nbsp;The&nbsp;first&nbsp;is&nbsp;automatically&nbsp;add&nbsp;the&nbsp;keyword.&nbsp;&nbsp;This&nbsp;would&nbsp;fix&nbsp;up&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;database,&nbsp;but&nbsp;it&nbsp;would&nbsp;increase&nbsp;the&nbsp;number&nbsp;of&nbsp;keywords&nbsp;on&nbsp;a&nbsp;bug.<br>
-<br>
-&nbsp;&nbsp;&nbsp;The&nbsp;second&nbsp;is&nbsp;to&nbsp;automatically&nbsp;remove&nbsp;the&nbsp;keyword,&nbsp;and&nbsp;alter&nbsp;queries<br>
-&nbsp;&nbsp;&nbsp;so&nbsp;they&nbsp;pick&nbsp;up&nbsp;the&nbsp;first&nbsp;keyword&nbsp;as&nbsp;well&nbsp;as&nbsp;the&nbsp;removed&nbsp;keyword.<br>
-&nbsp;&nbsp;&nbsp;This&nbsp;would&nbsp;fix&nbsp;up&nbsp;the&nbsp;database&nbsp;and&nbsp;reduce&nbsp;the&nbsp;number&nbsp;of&nbsp;keywords&nbsp;on&nbsp;a<br>
-&nbsp;&nbsp;&nbsp;bug,&nbsp;but&nbsp;it&nbsp;might&nbsp;confuse&nbsp;users&nbsp;who&nbsp;don't&nbsp;see&nbsp;the&nbsp;keyword.<br>
-&nbsp;&nbsp;&nbsp;Alternatively,&nbsp;the&nbsp;implied&nbsp;keywords&nbsp;could&nbsp;be&nbsp;listed&nbsp;separately.<br>
-<br>
-Notifications<br>
-<br>
-&nbsp;&nbsp;&nbsp;Every&nbsp;time&nbsp;a&nbsp;bug&nbsp;gets&nbsp;changed&nbsp;notifications&nbsp;get&nbsp;sent&nbsp;out&nbsp;to&nbsp;people<br>
-&nbsp;&nbsp;&nbsp;letting&nbsp;them&nbsp;know&nbsp;about&nbsp;what&nbsp;changes&nbsp;have&nbsp;been&nbsp;made.&nbsp;&nbsp;This&nbsp;is&nbsp;a<br>
-&nbsp;&nbsp;&nbsp;significant&nbsp;feature,&nbsp;and&nbsp;all&nbsp;sorts&nbsp;of&nbsp;questions&nbsp;can&nbsp;be&nbsp;raised,&nbsp;but<br>
-&nbsp;&nbsp;&nbsp;they&nbsp;mainly&nbsp;boil&nbsp;down&nbsp;to&nbsp;when&nbsp;they&nbsp;should&nbsp;be&nbsp;sent&nbsp;and&nbsp;what&nbsp;they&nbsp;should<br>
-&nbsp;&nbsp;&nbsp;look&nbsp;like.<br>
-<br>
-&nbsp;&nbsp;Changes&nbsp;You're&nbsp;Interested&nbsp;In<br>
-<br>
-&nbsp;&nbsp;&nbsp;As&nbsp;of&nbsp;version&nbsp;2.12&nbsp;users&nbsp;can&nbsp;specify&nbsp;what&nbsp;sort&nbsp;of&nbsp;changes&nbsp;they&nbsp;are<br>
-&nbsp;&nbsp;&nbsp;interested&nbsp;in&nbsp;receiving&nbsp;notifications&nbsp;for.&nbsp;&nbsp;However,&nbsp;this&nbsp;is&nbsp;still<br>
-&nbsp;&nbsp;&nbsp;limited.&nbsp;&nbsp;As&nbsp;yet&nbsp;there&nbsp;is&nbsp;no&nbsp;facility&nbsp;to&nbsp;specify&nbsp;which&nbsp;keywords&nbsp;you<br>
-&nbsp;&nbsp;&nbsp;care&nbsp;about,&nbsp;and&nbsp;whether&nbsp;you&nbsp;care&nbsp;about&nbsp;changes&nbsp;to&nbsp;fields&nbsp;such&nbsp;as&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;QA&nbsp;contact&nbsp;changes.<br>
-&nbsp;&nbsp;&nbsp;Furthermore,&nbsp;often&nbsp;an&nbsp;unnecessary&nbsp;comment&nbsp;will&nbsp;go&nbsp;along&nbsp;with&nbsp;a&nbsp;change,<br>
-&nbsp;&nbsp;&nbsp;either&nbsp;because&nbsp;it&nbsp;is&nbsp;required,&nbsp;or&nbsp;the&nbsp;commenter&nbsp;is&nbsp;ignorant&nbsp;of&nbsp;how&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;new&nbsp;system&nbsp;works.&nbsp;&nbsp;While&nbsp;explaining&nbsp;why&nbsp;you&nbsp;did&nbsp;something&nbsp;is&nbsp;useful,<br>
-&nbsp;&nbsp;&nbsp;merely&nbsp;commenting&nbsp;on&nbsp;what&nbsp;you&nbsp;did&nbsp;is&nbsp;not&nbsp;because&nbsp;that&nbsp;information&nbsp;is<br>
-&nbsp;&nbsp;&nbsp;already&nbsp;accessible&nbsp;view&nbsp;"Bug&nbsp;Activity".<br>
-<br>
-&nbsp;&nbsp;&nbsp;Because&nbsp;of&nbsp;this&nbsp;unnecessary&nbsp;comment,&nbsp;a&nbsp;lot&nbsp;of&nbsp;changes&nbsp;that&nbsp;would<br>
-&nbsp;&nbsp;&nbsp;otherwise&nbsp;not&nbsp;generate&nbsp;notifications&nbsp;for&nbsp;certain&nbsp;people&nbsp;do&nbsp;so,&nbsp;because<br>
-&nbsp;&nbsp;&nbsp;few&nbsp;people&nbsp;are&nbsp;willing&nbsp;to&nbsp;turn&nbsp;off&nbsp;comments.&nbsp;&nbsp;One&nbsp;way&nbsp;to&nbsp;deal&nbsp;with<br>
-&nbsp;&nbsp;&nbsp;this&nbsp;problem&nbsp;is&nbsp;to&nbsp;allow&nbsp;people&nbsp;to&nbsp;specify&nbsp;that&nbsp;their&nbsp;comments&nbsp;are<br>
-&nbsp;&nbsp;&nbsp;purely&nbsp;explanatory,&nbsp;and&nbsp;that&nbsp;anyone&nbsp;who&nbsp;is&nbsp;not&nbsp;interested&nbsp;in&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;change&nbsp;will&nbsp;not&nbsp;be&nbsp;interested&nbsp;in&nbsp;the&nbsp;comment.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Furthermore,&nbsp;one&nbsp;possible&nbsp;rationale&nbsp;for&nbsp;unnecessary&nbsp;comments&nbsp;is&nbsp;that<br>
-&nbsp;&nbsp;&nbsp;the&nbsp;bug&nbsp;activity&nbsp;does&nbsp;not&nbsp;display&nbsp;on&nbsp;the&nbsp;normal&nbsp;page&nbsp;and&nbsp;hence&nbsp;it&nbsp;is<br>
-&nbsp;&nbsp;&nbsp;difficult&nbsp;to&nbsp;cross&nbsp;reference&nbsp;comments&nbsp;and&nbsp;actions.&nbsp;&nbsp;Hence,&nbsp;it&nbsp;would&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;beneficial&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;do&nbsp;this.<br>
-<br>
-&nbsp;&nbsp;Bugs&nbsp;You're&nbsp;Watching<br>
-<br>
-&nbsp;&nbsp;&nbsp;Currently&nbsp;to&nbsp;receive&nbsp;a&nbsp;notification&nbsp;about&nbsp;a&nbsp;bug&nbsp;you&nbsp;need&nbsp;to&nbsp;have&nbsp;your<br>
-&nbsp;&nbsp;&nbsp;name&nbsp;on&nbsp;it.&nbsp;&nbsp;This&nbsp;is&nbsp;suboptimal&nbsp;because&nbsp;you&nbsp;need&nbsp;to&nbsp;know&nbsp;about&nbsp;a&nbsp;bug<br>
-&nbsp;&nbsp;&nbsp;before&nbsp;you&nbsp;can&nbsp;receive&nbsp;notifications&nbsp;on&nbsp;it.&nbsp;&nbsp;Often&nbsp;you&nbsp;are&nbsp;interested<br>
-&nbsp;&nbsp;&nbsp;in&nbsp;any&nbsp;bug&nbsp;with&nbsp;a&nbsp;field&nbsp;set&nbsp;to&nbsp;a&nbsp;specific&nbsp;value.&nbsp;&nbsp;For&nbsp;example,&nbsp;you<br>
-&nbsp;&nbsp;&nbsp;might&nbsp;be&nbsp;interested&nbsp;in&nbsp;all&nbsp;bugs&nbsp;with&nbsp;a&nbsp;specific&nbsp;product,&nbsp;component&nbsp;or<br>
-&nbsp;&nbsp;&nbsp;keyword.<br>
-<br>
-&nbsp;&nbsp;&nbsp;If&nbsp;someone&nbsp;could&nbsp;automatically&nbsp;receive&nbsp;notifications&nbsp;about&nbsp;these&nbsp;bugs,<br>
-&nbsp;&nbsp;&nbsp;it&nbsp;would&nbsp;make&nbsp;everyone's&nbsp;lives&nbsp;easier.&nbsp;&nbsp;Currently&nbsp;the&nbsp;default&nbsp;assignee<br>
-&nbsp;&nbsp;&nbsp;and&nbsp;QA&nbsp;contact&nbsp;for&nbsp;a&nbsp;component&nbsp;will&nbsp;automatically&nbsp;receive<br>
-&nbsp;&nbsp;&nbsp;notifications&nbsp;for<br>
-<br>
-&nbsp;&nbsp;&nbsp;Question:&nbsp;&nbsp;This&nbsp;moves&nbsp;half&nbsp;way&nbsp;to&nbsp;a&nbsp;BCC.<br>
-<br>
-&nbsp;&nbsp;Bulk&nbsp;Changes<br>
-<br>
-&nbsp;&nbsp;&nbsp;A&nbsp;very&nbsp;useful&nbsp;feature&nbsp;of&nbsp;Bugzilla&nbsp;is&nbsp;the&nbsp;ability&nbsp;to&nbsp;perform&nbsp;an&nbsp;action<br>
-&nbsp;&nbsp;&nbsp;on&nbsp;multiple&nbsp;bugs&nbsp;at&nbsp;once.&nbsp;&nbsp;However,&nbsp;this&nbsp;means&nbsp;that&nbsp;similar<br>
-&nbsp;&nbsp;&nbsp;notifications&nbsp;are&nbsp;currently&nbsp;generated&nbsp;for&nbsp;each&nbsp;bug&nbsp;modified.<br>
-<br>
-&nbsp;&nbsp;&nbsp;This&nbsp;can&nbsp;result&nbsp;in&nbsp;a&nbsp;torrent&nbsp;of&nbsp;notifications&nbsp;that&nbsp;can&nbsp;annoy.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Furthermore,&nbsp;since&nbsp;the&nbsp;bugs&nbsp;are&nbsp;all&nbsp;changed&nbsp;close&nbsp;to&nbsp;each&nbsp;other&nbsp;in<br>
-&nbsp;&nbsp;&nbsp;time,&nbsp;it&nbsp;is&nbsp;easy&nbsp;for&nbsp;someone&nbsp;to&nbsp;mass&nbsp;delete&nbsp;all&nbsp;the&nbsp;notifications<br>
-&nbsp;&nbsp;&nbsp;generated&nbsp;by&nbsp;a&nbsp;bulk&nbsp;change&nbsp;and&nbsp;miss&nbsp;an&nbsp;unrelated&nbsp;notification&nbsp;in&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;middle.<br>
-<br>
-&nbsp;&nbsp;&nbsp;These&nbsp;factors&nbsp;can&nbsp;lead&nbsp;to&nbsp;a&nbsp;tendency&nbsp;for&nbsp;people&nbsp;to&nbsp;delay&nbsp;bulk&nbsp;changes,<br>
-&nbsp;&nbsp;&nbsp;or&nbsp;avoid&nbsp;them&nbsp;entirely.&nbsp;&nbsp;This&nbsp;is&nbsp;suboptimal.<br>
-<br>
-&nbsp;&nbsp;&nbsp;It&nbsp;would&nbsp;be&nbsp;better&nbsp;if&nbsp;a&nbsp;bulk&nbsp;change&nbsp;generated&nbsp;only&nbsp;one&nbsp;notification<br>
-&nbsp;&nbsp;&nbsp;mail.&nbsp;&nbsp;This&nbsp;would&nbsp;vastly&nbsp;reduce&nbsp;the&nbsp;annoyance&nbsp;factor,&nbsp;and&nbsp;prevent<br>
-&nbsp;&nbsp;&nbsp;accidental&nbsp;deletion&nbsp;of&nbsp;notifications.<br>
-<br>
-&nbsp;&nbsp;&nbsp;One&nbsp;problem&nbsp;with&nbsp;this&nbsp;change&nbsp;is&nbsp;that&nbsp;some&nbsp;people&nbsp;separate&nbsp;out<br>
-&nbsp;&nbsp;&nbsp;notifications&nbsp;using&nbsp;filtering.&nbsp;&nbsp;This&nbsp;means&nbsp;that&nbsp;they&nbsp;would&nbsp;no&nbsp;longer<br>
-&nbsp;&nbsp;&nbsp;be&nbsp;match&nbsp;parts&nbsp;of&nbsp;a&nbsp;bulk&nbsp;change&nbsp;under&nbsp;different&nbsp;filtering&nbsp;rules.<br>
-<br>
-&nbsp;&nbsp;&nbsp;One&nbsp;possibility&nbsp;to&nbsp;resolve&nbsp;this&nbsp;is&nbsp;to&nbsp;allow&nbsp;people&nbsp;to&nbsp;specify&nbsp;groups<br>
-&nbsp;&nbsp;&nbsp;of&nbsp;bugs.&nbsp;&nbsp;All&nbsp;bugs&nbsp;within&nbsp;a&nbsp;group&nbsp;would&nbsp;go&nbsp;into&nbsp;the&nbsp;same<br>
-&nbsp;&nbsp;&nbsp;notification.&nbsp;&nbsp;The&nbsp;filters&nbsp;could&nbsp;then&nbsp;distinguish&nbsp;the&nbsp;different&nbsp;bug<br>
-&nbsp;&nbsp;&nbsp;groups.<br>
-<br>
-&nbsp;&nbsp;&nbsp;In&nbsp;any&nbsp;case,&nbsp;it&nbsp;is&nbsp;likely&nbsp;there&nbsp;would&nbsp;need&nbsp;to&nbsp;be&nbsp;a&nbsp;transition&nbsp;period<br>
-&nbsp;&nbsp;&nbsp;to&nbsp;allow&nbsp;people&nbsp;to&nbsp;alter&nbsp;their&nbsp;filters.<br>
-<br>
-Nominations<br>
-<br>
-&nbsp;&nbsp;&nbsp;?<br>
-<br>
-Linking&nbsp;Bugzilla&nbsp;Installations<br>
-<br>
-&nbsp;&nbsp;&nbsp;The&nbsp;first&nbsp;example&nbsp;of&nbsp;linking&nbsp;Bugzilla&nbsp;installations&nbsp;together&nbsp;has&nbsp;is<br>
-&nbsp;&nbsp;&nbsp;the&nbsp;introduction&nbsp;of&nbsp;bug&nbsp;moving&nbsp;in&nbsp;version&nbsp;2.12.&nbsp;&nbsp;However,&nbsp;it&nbsp;would&nbsp;be<br>
-&nbsp;&nbsp;&nbsp;useful&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;link&nbsp;installations&nbsp;in&nbsp;more&nbsp;ways.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Dependencies&nbsp;and&nbsp;other&nbsp;relationships&nbsp;between&nbsp;bugs&nbsp;in&nbsp;other<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;installations.&nbsp;&nbsp;This&nbsp;is&nbsp;difficult&nbsp;because&nbsp;dependencies&nbsp;are<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;synchronised&nbsp;on&nbsp;both&nbsp;bugs,&nbsp;so&nbsp;the&nbsp;installation&nbsp;that&nbsp;changes<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dependencies&nbsp;would&nbsp;need&nbsp;to&nbsp;communicate&nbsp;the&nbsp;new&nbsp;state&nbsp;to&nbsp;the&nbsp;other<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;installation.&nbsp;&nbsp;It&nbsp;would&nbsp;also&nbsp;mean&nbsp;that&nbsp;relationships&nbsp;and<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notifications&nbsp;that&nbsp;refer&nbsp;to&nbsp;other&nbsp;bugs&nbsp;would&nbsp;need&nbsp;to&nbsp;communicate<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;the&nbsp;other&nbsp;installation.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;References&nbsp;to&nbsp;bugs&nbsp;in&nbsp;other&nbsp;installations.&nbsp;&nbsp;Currently&nbsp;if&nbsp;you&nbsp;type<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"bug&nbsp;XXX"&nbsp;or&nbsp;"bug&nbsp;#XXX"&nbsp;where&nbsp;XXX&nbsp;is&nbsp;a&nbsp;number,&nbsp;you&nbsp;get&nbsp;an<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;automatic&nbsp;hyperlink&nbsp;to&nbsp;that&nbsp;bug.&nbsp;&nbsp;It&nbsp;would&nbsp;be&nbsp;useful&nbsp;if&nbsp;you&nbsp;could<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;say&nbsp;"YYY&nbsp;bug&nbsp;#XXX"&nbsp;where&nbsp;YYY&nbsp;is&nbsp;the&nbsp;name&nbsp;of&nbsp;another&nbsp;installation.<br>
-<br>
-Retirement<br>
-<br>
-&nbsp;&nbsp;&nbsp;?<br>
-<br>
-Whiny&nbsp;Reports<br>
-<br>
-&nbsp;&nbsp;&nbsp;?<br>
-<br>
-&nbsp;&nbsp;Group&nbsp;Redesign<br>
-<br>
-&nbsp;&nbsp;&nbsp;?<br>
-<br>
-&nbsp;&nbsp;Hard&nbsp;Wrapping&nbsp;Comments<br>
-<br>
-&nbsp;&nbsp;&nbsp;Currently&nbsp;Bugzilla&nbsp;"hard&nbsp;wraps"&nbsp;its&nbsp;comments&nbsp;to&nbsp;a&nbsp;specific&nbsp;line&nbsp;size,<br>
-&nbsp;&nbsp;&nbsp;similar&nbsp;to&nbsp;E-Mail.&nbsp;&nbsp;This&nbsp;has&nbsp;various&nbsp;problems:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;way&nbsp;it&nbsp;currently&nbsp;works,&nbsp;wrapping&nbsp;is&nbsp;done&nbsp;in&nbsp;the&nbsp;browser&nbsp;at<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;submission&nbsp;time&nbsp;using&nbsp;a&nbsp;non-standard&nbsp;HTML&nbsp;extension&nbsp;not&nbsp;supported<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;by&nbsp;some&nbsp;(uncommon)&nbsp;browsers.&nbsp;&nbsp;These&nbsp;browsers&nbsp;generate&nbsp;comments<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;scroll&nbsp;off&nbsp;the&nbsp;right&nbsp;side&nbsp;of&nbsp;the&nbsp;screen.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Because&nbsp;comments&nbsp;are&nbsp;of&nbsp;fixed&nbsp;width,&nbsp;when&nbsp;you&nbsp;expand&nbsp;your&nbsp;browser<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window,&nbsp;the&nbsp;comments&nbsp;do&nbsp;not&nbsp;expand&nbsp;to&nbsp;fit&nbsp;available&nbsp;space.<br>
-<br>
-&nbsp;&nbsp;&nbsp;It&nbsp;would&nbsp;be&nbsp;much&nbsp;better&nbsp;to&nbsp;move&nbsp;to&nbsp;a&nbsp;world&nbsp;of&nbsp;soft&nbsp;wrapping,&nbsp;where&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;browser&nbsp;wraps&nbsp;the&nbsp;text&nbsp;at&nbsp;display&nbsp;time,&nbsp;similar&nbsp;to&nbsp;a&nbsp;world&nbsp;processor.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;And&nbsp;as&nbsp;in&nbsp;a&nbsp;word&nbsp;processor,&nbsp;soft&nbsp;wrapping&nbsp;does&nbsp;not&nbsp;preclude&nbsp;the<br>
-&nbsp;&nbsp;&nbsp;insertion&nbsp;of&nbsp;newlines.<br>
-<br>
-&nbsp;&nbsp;&nbsp;Hard&nbsp;wrapping&nbsp;is&nbsp;too&nbsp;entrenched&nbsp;into&nbsp;text&nbsp;E-Mail&nbsp;to&nbsp;fix,&nbsp;but&nbsp;we&nbsp;can<br>
-&nbsp;&nbsp;&nbsp;fix&nbsp;Bugzilla&nbsp;without&nbsp;causing&nbsp;any&nbsp;problems.&nbsp;&nbsp;The&nbsp;old&nbsp;content&nbsp;will&nbsp;still<br>
-&nbsp;&nbsp;&nbsp;be&nbsp;wrapped&nbsp;too&nbsp;early,&nbsp;but&nbsp;at&nbsp;least&nbsp;new&nbsp;content&nbsp;will&nbsp;work.<br>
-&nbsp;&nbsp;&nbsp;</P
->
-  </P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="tinderbox.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="variants.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->Tinderbox/Tinderbox2</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
->&nbsp;</TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->Bugzilla Variants and Competitors</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/geninstall.html b/docs/html/geninstall.html
deleted file mode 100644
index 18217ef48..000000000
--- a/docs/html/geninstall.html
+++ /dev/null
@@ -1,421 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->Installation General Notes</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="Installation"
-HREF="installation.html"><LINK
-REL="PREVIOUS"
-TITLE="BSD Installation Notes"
-HREF="bsdinstall.html"><LINK
-REL="NEXT"
-TITLE="Win32 Installation Notes"
-HREF="win32.html"></HEAD
-><BODY
-CLASS="SECTION"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="bsdinstall.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Chapter 3. Installation</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="win32.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECTION"
-><H1
-CLASS="SECTION"
-><A
-NAME="GENINSTALL"
->3.5. Installation General Notes</A
-></H1
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="AEN941"
->3.5.1. Modifying Your Running System</A
-></H2
-><P
->	Bugzilla optimizes database lookups by storing all relatively static
-	information in the versioncache file, located in the data/ subdirectory
-	under your installation directory.
-      </P
-><P
->	If you make a change to the structural data in your database
-	(the versions table for example), or to the
-	<SPAN
-CLASS="QUOTE"
->"constants"</SPAN
-> encoded in defparams.pl, you will
-	need to remove the cached content from the data directory
-	(by doing a <SPAN
-CLASS="QUOTE"
->"rm data/versioncache"</SPAN
->), or your
-	changes won't show up.
-      </P
-><P
->	That file gets automatically regenerated whenever it's more than an
-	hour old, so Bugzilla will eventually notice your changes by itself, but
-	generally you want it to notice right away, so that you can test things.
-      </P
-></DIV
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="AEN948"
->3.5.2. Upgrading From Previous Versions</A
-></H2
-><P
->	The developers of Bugzilla are constantly adding new tables, columns and
-	fields.  You'll get SQL errors if you just update the code.  The strategy
-	to update is to simply always run the checksetup.pl script whenever
-	you upgrade your installation of Bugzilla.  If you want to see what has
-	changed, you can read the comments in that file, starting from the end.
-      </P
-><P
->	If you are running Bugzilla version 2.8 or lower, and wish to upgrade to
-	the latest version, please consult the file, "UPGRADING-pre-2.8" in the
-	Bugzilla root directory after untarring the archive.
-      </P
-></DIV
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="HTACCESS"
->3.5.3. <TT
-CLASS="FILENAME"
->.htaccess</TT
-> files and security</A
-></H2
-><P
->	To enhance the security of your Bugzilla installation,
-	Bugzilla  will generate
-	<I
-CLASS="GLOSSTERM"
-><TT
-CLASS="FILENAME"
->.htaccess</TT
-></I
-> files
-	which the Apache webserver can use to restrict  access to
-	the bugzilla data files. The checksetup script  will
-	generate the <TT
-CLASS="FILENAME"
->.htaccess</TT
-> files.
-	
-	<DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	    If you are using an alternate provider of
-	    <SPAN
-CLASS="PRODUCTNAME"
->webdot</SPAN
-> services for graphing
-	    (as described when viewing
-	    <TT
-CLASS="FILENAME"
->editparams.cgi</TT
-> in your web
-	    browser), you will need to change  the ip address in
-	    <TT
-CLASS="FILENAME"
->data/webdot/.htaccess</TT
-> to the ip
-	    address of the webdot server that  you are using. 
-	  </P
-></TD
-></TR
-></TABLE
-></DIV
->
-	
-      </P
-><P
->	If you are using Internet Information Server or other web
-	server which does not observe <TT
-CLASS="FILENAME"
->.htaccess</TT
->
-	conventions, you can disable their creation by editing
-	<TT
-CLASS="FILENAME"
->localconfig</TT
-> and setting the
-	<TT
-CLASS="VARNAME"
->$create_htaccess</TT
-> variable to
-	<TT
-CLASS="PARAMETER"
-><I
->0</I
-></TT
->.
-      </P
-></DIV
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="MOD_THROTTLE"
->3.5.4. <TT
-CLASS="FILENAME"
->mod_throttle</TT
-> and Security</A
-></H2
-><P
->	It is possible for a user, by mistake or on purpose, to access
-	the database many times in a row which can result in very slow
-	access speeds for other users.  If your Bugzilla installation
-	is experiencing this problem , you may install  the Apache
-	module <TT
-CLASS="FILENAME"
->mod_throttle</TT
-> which can limit
-	connections by ip-address. You may download this module at
-	<A
-HREF="http://www.snert.com/Software/Throttle/"
-TARGET="_top"
->http://www.snert.com/Software/Throttle/</A
->. Follow the instructions to install into your Apache install.  <EM
->This module only functions with the Apache web server!</EM
->. You may use the <B
-CLASS="COMMAND"
->ThrottleClientIP</B
-> command provided by this module  to accomplish this goal. See the <A
-HREF="http://www.snert.com/Software/Throttle/"
-TARGET="_top"
->Module Instructions</A
-> for more  information. </P
-></DIV
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="CONTENT_TYPE"
->3.5.5. Preventing untrusted Bugzilla content from executing malicious Javascript code</A
-></H2
-><P
->It is possible for a Bugzilla to execute malicious
-	Javascript code.  Due to internationalization concerns, we are
-	unable to incorporate the code changes necessary to fulfill
-	the CERT advisory requirements mentioned in <A
-HREF="http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3"
-TARGET="_top"
->http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3</A
->.  Executing the following code snippet from a UNIX command shell will rectify the problem if your Bugzilla installation is intended for an English-speaking audience.  As always, be sure your Bugzilla installation has a good backup before making changes, and I recommend you understand what the script is doing before executing it. </P
-><P
-><TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
->bash# cd $BUGZILLA_HOME; for i in `ls *.cgi`; \
-	  do cat $i | sed 's/Content-type\: text\/html/Content-Type: text\/html\; charset=ISO-8859-1/' &#62;$i.tmp; \
-	  mv $i.tmp $i; done
-	</PRE
-></FONT
-></TD
-></TR
-></TABLE
-></P
-><P
->	All this one-liner command does is search for all instances of
-	<SPAN
-CLASS="QUOTE"
->"Content-type: text/html"</SPAN
-> and replaces it with
-	<SPAN
-CLASS="QUOTE"
->"Content-Type: text/html; charset=ISO-8859-1"</SPAN
->.
-	This specification prevents possible Javascript attacks on the
-	browser, and is suggested for all English-speaking sites.  For
-	non-english-speaking Bugzilla sites, I suggest changing
-	<SPAN
-CLASS="QUOTE"
->"ISO-8859-1"</SPAN
->, above, to <SPAN
-CLASS="QUOTE"
->"UTF-8"</SPAN
->.
-      </P
-></DIV
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="UNIXHISTORY"
->3.5.6. UNIX Installation Instructions History</A
-></H2
-><P
->	This document was originally adapted from the Bonsai
-	installation instructions by Terry Weissman
-	&#60;terry@mozilla.org&#62;.
-      </P
-><P
->	The February 25, 1999 re-write of this page was done by Ry4an
-	Brase &#60;ry4an@ry4an.org&#62;, with some edits by Terry
-	Weissman, Bryce Nesbitt, Martin Pool, &#38; Dan Mosedale (But
-	don't send bug reports to them; report them using bugzilla, at <A
-HREF="http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla"
-TARGET="_top"
->http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla</A
-> ).
-      </P
-><P
->	This document was heavily modified again Wednesday, March 07
-	2001 to reflect changes for Bugzilla 2.12 release by Matthew
-	P. Barnson.  The securing MySQL section should be changed to
-	become standard procedure for Bugzilla installations.
-      </P
-><P
->	Finally, the README in its entirety was marked up in SGML and
-	included into the Guide on April 24, 2001 by Matt Barnson.
-	Since that time, it's undergone extensive modification as
-	Bugzilla grew.
-      </P
-><P
->	Comments from people using this Guide for the first time are
-	particularly welcome.
-      </P
-></DIV
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="bsdinstall.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="win32.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->BSD Installation Notes</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="installation.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->Win32 Installation Notes</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/gfdl.html b/docs/html/gfdl.html
deleted file mode 100644
index dfb5c69da..000000000
--- a/docs/html/gfdl.html
+++ /dev/null
@@ -1,211 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->GNU Free Documentation License</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="PREVIOUS"
-TITLE="Hacking Bugzilla"
-HREF="bzhacking.html"><LINK
-REL="NEXT"
-TITLE="PREAMBLE"
-HREF="gfdl_0.html"></HEAD
-><BODY
-CLASS="APPENDIX"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="bzhacking.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
-></TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="gfdl_0.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="APPENDIX"
-><H1
-><A
-NAME="GFDL"
->Appendix E. GNU Free Documentation License</A
-></H1
-><DIV
-CLASS="TOC"
-><DL
-><DT
-><B
->Table of Contents</B
-></DT
-><DT
->0. <A
-HREF="gfdl_0.html"
->PREAMBLE</A
-></DT
-><DT
->1. <A
-HREF="gfdl_1.html"
->APPLICABILITY AND DEFINITIONS</A
-></DT
-><DT
->2. <A
-HREF="gfdl_2.html"
->VERBATIM COPYING</A
-></DT
-><DT
->3. <A
-HREF="gfdl_3.html"
->COPYING IN QUANTITY</A
-></DT
-><DT
->4. <A
-HREF="gfdl_4.html"
->MODIFICATIONS</A
-></DT
-><DT
->5. <A
-HREF="gfdl_5.html"
->COMBINING DOCUMENTS</A
-></DT
-><DT
->6. <A
-HREF="gfdl_6.html"
->COLLECTIONS OF DOCUMENTS</A
-></DT
-><DT
->7. <A
-HREF="gfdl_7.html"
->AGGREGATION WITH INDEPENDENT WORKS</A
-></DT
-><DT
->8. <A
-HREF="gfdl_8.html"
->TRANSLATION</A
-></DT
-><DT
->9. <A
-HREF="gfdl_9.html"
->TERMINATION</A
-></DT
-><DT
->10. <A
-HREF="gfdl_10.html"
->FUTURE REVISIONS OF THIS LICENSE</A
-></DT
-><DT
-><A
-HREF="gfdl_howto.html"
->How to use this License for your documents</A
-></DT
-></DL
-></DIV
-><P
->Version 1.1, March 2000</P
-><A
-NAME="AEN2499"
-></A
-><BLOCKQUOTE
-CLASS="BLOCKQUOTE"
-><P
->Copyright (C) 2000  Free Software Foundation, Inc.
-59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.</P
-></BLOCKQUOTE
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="bzhacking.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="gfdl_0.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->Hacking Bugzilla</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
->&nbsp;</TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->PREAMBLE</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/gfdl_0.html b/docs/html/gfdl_0.html
deleted file mode 100644
index 899b444c1..000000000
--- a/docs/html/gfdl_0.html
+++ /dev/null
@@ -1,159 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->PREAMBLE</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="GNU Free Documentation License"
-HREF="gfdl.html"><LINK
-REL="PREVIOUS"
-TITLE="GNU Free Documentation License"
-HREF="gfdl.html"><LINK
-REL="NEXT"
-TITLE="APPLICABILITY AND DEFINITIONS"
-HREF="gfdl_1.html"></HEAD
-><BODY
-CLASS="SECT1"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="gfdl.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Appendix E. GNU Free Documentation License</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="gfdl_1.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECT1"
-><H1
-CLASS="SECT1"
-><A
-NAME="GFDL_0"
->0. PREAMBLE</A
-></H1
-><P
->The purpose of this License is to make a manual, textbook,
-    or other written document "free" in the sense of freedom: to
-    assure everyone the effective freedom to copy and redistribute it,
-    with or without modifying it, either commercially or
-    noncommercially.  Secondarily, this License preserves for the
-    author and publisher a way to get credit for their work, while not
-    being considered responsible for modifications made by
-    others.</P
-><P
->This License is a kind of "copyleft", which means that
-    derivative works of the document must themselves be free in the
-    same sense.  It complements the GNU General Public License, which
-    is a copyleft license designed for free software.</P
-><P
->We have designed this License in order to use it for manuals
-    for free software, because free software needs free documentation:
-    a free program should come with manuals providing the same
-    freedoms that the software does.  But this License is not limited
-    to software manuals; it can be used for any textual work,
-    regardless of subject matter or whether it is published as a
-    printed book.  We recommend this License principally for works
-    whose purpose is instruction or reference.</P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="gfdl.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="gfdl_1.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->GNU Free Documentation License</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="gfdl.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->APPLICABILITY AND DEFINITIONS</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/gfdl_1.html b/docs/html/gfdl_1.html
deleted file mode 100644
index 0b4fb7dd8..000000000
--- a/docs/html/gfdl_1.html
+++ /dev/null
@@ -1,200 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->APPLICABILITY AND DEFINITIONS</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="GNU Free Documentation License"
-HREF="gfdl.html"><LINK
-REL="PREVIOUS"
-TITLE="PREAMBLE"
-HREF="gfdl_0.html"><LINK
-REL="NEXT"
-TITLE="VERBATIM COPYING"
-HREF="gfdl_2.html"></HEAD
-><BODY
-CLASS="SECT1"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="gfdl_0.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Appendix E. GNU Free Documentation License</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="gfdl_2.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECT1"
-><H1
-CLASS="SECT1"
-><A
-NAME="GFDL_1"
->1. APPLICABILITY AND DEFINITIONS</A
-></H1
-><P
->This License applies to any manual or other work that
-    contains a notice placed by the copyright holder saying it can be
-    distributed under the terms of this License.  The "Document",
-    below, refers to any such manual or work.  Any member of the
-    public is a licensee, and is addressed as "you".</P
-><P
->A "Modified Version" of the Document means any work
-    containing the Document or a portion of it, either copied
-    verbatim, or with modifications and/or translated into another
-    language.</P
-><P
->A "Secondary Section" is a named appendix or a front-matter
-    section of the Document that deals exclusively with the
-    relationship of the publishers or authors of the Document to the
-    Document's overall subject (or to related matters) and contains
-    nothing that could fall directly within that overall subject.
-    (For example, if the Document is in part a textbook of
-    mathematics, a Secondary Section may not explain any mathematics.)
-    The relationship could be a matter of historical connection with
-    the subject or with related matters, or of legal, commercial,
-    philosophical, ethical or political position regarding
-    them.</P
-><P
->The "Invariant Sections" are certain Secondary Sections
-    whose titles are designated, as being those of Invariant Sections,
-    in the notice that says that the Document is released under this
-    License.</P
-><P
->The "Cover Texts" are certain short passages of text that
-    are listed, as Front-Cover Texts or Back-Cover Texts, in the
-    notice that says that the Document is released under this
-    License.</P
-><P
->A "Transparent" copy of the Document means a
-    machine-readable copy, represented in a format whose specification
-    is available to the general public, whose contents can be viewed
-    and edited directly and straightforwardly with generic text
-    editors or (for images composed of pixels) generic paint programs
-    or (for drawings) some widely available drawing editor, and that
-    is suitable for input to text formatters or for automatic
-    translation to a variety of formats suitable for input to text
-    formatters.  A copy made in an otherwise Transparent file format
-    whose markup has been designed to thwart or discourage subsequent
-    modification by readers is not Transparent.  A copy that is not
-    "Transparent" is called "Opaque".</P
-><P
->Examples of suitable formats for Transparent copies include
-    plain ASCII without markup, Texinfo input format, LaTeX input
-    format, SGML or XML using a publicly available DTD, and
-    standard-conforming simple HTML designed for human modification.
-    Opaque formats include PostScript, PDF, proprietary formats that
-    can be read and edited only by proprietary word processors, SGML
-    or XML for which the DTD and/or processing tools are not generally
-    available, and the machine-generated HTML produced by some word
-    processors for output purposes only.</P
-><P
->The "Title Page" means, for a printed book, the title page
-    itself, plus such following pages as are needed to hold, legibly,
-    the material this License requires to appear in the title page.
-    For works in formats which do not have any title page as such,
-    "Title Page" means the text near the most prominent appearance of
-    the work's title, preceding the beginning of the body of the
-    text.</P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="gfdl_0.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="gfdl_2.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->PREAMBLE</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="gfdl.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->VERBATIM COPYING</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/gfdl_10.html b/docs/html/gfdl_10.html
deleted file mode 100644
index 7d0af2295..000000000
--- a/docs/html/gfdl_10.html
+++ /dev/null
@@ -1,156 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->FUTURE REVISIONS OF THIS LICENSE</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="GNU Free Documentation License"
-HREF="gfdl.html"><LINK
-REL="PREVIOUS"
-TITLE="TERMINATION"
-HREF="gfdl_9.html"><LINK
-REL="NEXT"
-TITLE="How to use this License for your documents"
-HREF="gfdl_howto.html"></HEAD
-><BODY
-CLASS="SECT1"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="gfdl_9.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Appendix E. GNU Free Documentation License</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="gfdl_howto.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECT1"
-><H1
-CLASS="SECT1"
-><A
-NAME="GFDL_10"
->10. FUTURE REVISIONS OF THIS LICENSE</A
-></H1
-><P
->The Free Software Foundation may publish new, revised
-    versions of the GNU Free Documentation License from time to time.
-    Such new versions will be similar in spirit to the present
-    version, but may differ in detail to address new problems or
-    concerns.  See <A
-HREF="http://www.gnu.org/copyleft/"
-TARGET="_top"
->http://www.gnu.org/copyleft/</A
->.</P
-><P
->Each version of the License is given a distinguishing
-    version number.  If the Document specifies that a particular
-    numbered version of this License "or any later version" applies to
-    it, you have the option of following the terms and conditions
-    either of that specified version or of any later version that has
-    been published (not as a draft) by the Free Software Foundation.
-    If the Document does not specify a version number of this License,
-    you may choose any version ever published (not as a draft) by the
-    Free Software Foundation.</P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="gfdl_9.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="gfdl_howto.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->TERMINATION</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="gfdl.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->How to use this License for your documents</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/gfdl_2.html b/docs/html/gfdl_2.html
deleted file mode 100644
index db838d948..000000000
--- a/docs/html/gfdl_2.html
+++ /dev/null
@@ -1,150 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->VERBATIM COPYING</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="GNU Free Documentation License"
-HREF="gfdl.html"><LINK
-REL="PREVIOUS"
-TITLE="APPLICABILITY AND DEFINITIONS"
-HREF="gfdl_1.html"><LINK
-REL="NEXT"
-TITLE="COPYING IN QUANTITY"
-HREF="gfdl_3.html"></HEAD
-><BODY
-CLASS="SECT1"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="gfdl_1.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Appendix E. GNU Free Documentation License</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="gfdl_3.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECT1"
-><H1
-CLASS="SECT1"
-><A
-NAME="GFDL_2"
->2. VERBATIM COPYING</A
-></H1
-><P
->You may copy and distribute the Document in any medium,
-    either commercially or noncommercially, provided that this
-    License, the copyright notices, and the license notice saying this
-    License applies to the Document are reproduced in all copies, and
-    that you add no other conditions whatsoever to those of this
-    License.  You may not use technical measures to obstruct or
-    control the reading or further copying of the copies you make or
-    distribute.  However, you may accept compensation in exchange for
-    copies.  If you distribute a large enough number of copies you
-    must also follow the conditions in section 3.</P
-><P
->You may also lend copies, under the same conditions stated
-    above, and you may publicly display copies.</P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="gfdl_1.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="gfdl_3.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->APPLICABILITY AND DEFINITIONS</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="gfdl.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->COPYING IN QUANTITY</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/gfdl_3.html b/docs/html/gfdl_3.html
deleted file mode 100644
index 35bf01eec..000000000
--- a/docs/html/gfdl_3.html
+++ /dev/null
@@ -1,174 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->COPYING IN QUANTITY</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="GNU Free Documentation License"
-HREF="gfdl.html"><LINK
-REL="PREVIOUS"
-TITLE="VERBATIM COPYING"
-HREF="gfdl_2.html"><LINK
-REL="NEXT"
-TITLE="MODIFICATIONS"
-HREF="gfdl_4.html"></HEAD
-><BODY
-CLASS="SECT1"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="gfdl_2.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Appendix E. GNU Free Documentation License</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="gfdl_4.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECT1"
-><H1
-CLASS="SECT1"
-><A
-NAME="GFDL_3"
->3. COPYING IN QUANTITY</A
-></H1
-><P
->If you publish printed copies of the Document numbering more
-    than 100, and the Document's license notice requires Cover Texts,
-    you must enclose the copies in covers that carry, clearly and
-    legibly, all these Cover Texts: Front-Cover Texts on the front
-    cover, and Back-Cover Texts on the back cover.  Both covers must
-    also clearly and legibly identify you as the publisher of these
-    copies.  The front cover must present the full title with all
-    words of the title equally prominent and visible.  You may add
-    other material on the covers in addition.  Copying with changes
-    limited to the covers, as long as they preserve the title of the
-    Document and satisfy these conditions, can be treated as verbatim
-    copying in other respects.</P
-><P
->If the required texts for either cover are too voluminous to
-    fit legibly, you should put the first ones listed (as many as fit
-    reasonably) on the actual cover, and continue the rest onto
-    adjacent pages.</P
-><P
->If you publish or distribute Opaque copies of the Document
-    numbering more than 100, you must either include a
-    machine-readable Transparent copy along with each Opaque copy, or
-    state in or with each Opaque copy a publicly-accessible
-    computer-network location containing a complete Transparent copy
-    of the Document, free of added material, which the general
-    network-using public has access to download anonymously at no
-    charge using public-standard network protocols.  If you use the
-    latter option, you must take reasonably prudent steps, when you
-    begin distribution of Opaque copies in quantity, to ensure that
-    this Transparent copy will remain thus accessible at the stated
-    location until at least one year after the last time you
-    distribute an Opaque copy (directly or through your agents or
-    retailers) of that edition to the public.</P
-><P
->It is requested, but not required, that you contact the
-    authors of the Document well before redistributing any large
-    number of copies, to give them a chance to provide you with an
-    updated version of the Document.</P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="gfdl_2.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="gfdl_4.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->VERBATIM COPYING</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="gfdl.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->MODIFICATIONS</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/gfdl_4.html b/docs/html/gfdl_4.html
deleted file mode 100644
index ec3dbfc4e..000000000
--- a/docs/html/gfdl_4.html
+++ /dev/null
@@ -1,280 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->MODIFICATIONS</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="GNU Free Documentation License"
-HREF="gfdl.html"><LINK
-REL="PREVIOUS"
-TITLE="COPYING IN QUANTITY"
-HREF="gfdl_3.html"><LINK
-REL="NEXT"
-TITLE="COMBINING DOCUMENTS"
-HREF="gfdl_5.html"></HEAD
-><BODY
-CLASS="SECT1"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="gfdl_3.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Appendix E. GNU Free Documentation License</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="gfdl_5.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECT1"
-><H1
-CLASS="SECT1"
-><A
-NAME="GFDL_4"
->4. MODIFICATIONS</A
-></H1
-><P
->You may copy and distribute a Modified Version of the
-    Document under the conditions of sections 2 and 3 above, provided
-    that you release the Modified Version under precisely this
-    License, with the Modified Version filling the role of the
-    Document, thus licensing distribution and modification of the
-    Modified Version to whoever possesses a copy of it.  In addition,
-    you must do these things in the Modified Version:</P
-><P
-></P
-><OL
-TYPE="A"
-><LI
-><P
->Use in the Title Page
-      (and on the covers, if any) a title distinct from that of the
-      Document, and from those of previous versions (which should, if
-      there were any, be listed in the History section of the
-      Document).  You may use the same title as a previous version if
-      the original publisher of that version gives permission.</P
-></LI
-><LI
-><P
->List on the Title Page,
-      as authors, one or more persons or entities responsible for
-      authorship of the modifications in the Modified Version,
-      together with at least five of the principal authors of the
-      Document (all of its principal authors, if it has less than
-      five).</P
-></LI
-><LI
-><P
->State on the Title page
-      the name of the publisher of the Modified Version, as the
-      publisher.</P
-></LI
-><LI
-><P
->Preserve all the
-      copyright notices of the Document.</P
-></LI
-><LI
-><P
->Add an appropriate
-      copyright notice for your modifications adjacent to the other
-      copyright notices.</P
-></LI
-><LI
-><P
->Include, immediately
-      after the copyright notices, a license notice giving the public
-      permission to use the Modified Version under the terms of this
-      License, in the form shown in the Addendum below.</P
-></LI
-><LI
-><P
->Preserve in that license
-      notice the full lists of Invariant Sections and required Cover
-      Texts given in the Document's license notice.</P
-></LI
-><LI
-><P
->Include an unaltered
-      copy of this License.</P
-></LI
-><LI
-><P
->Preserve the section
-      entitled "History", and its title, and add to it an item stating
-      at least the title, year, new authors, and publisher of the
-      Modified Version as given on the Title Page.  If there is no
-      section entitled "History" in the Document, create one stating
-      the title, year, authors, and publisher of the Document as given
-      on its Title Page, then add an item describing the Modified
-      Version as stated in the previous sentence.</P
-></LI
-><LI
-><P
->Preserve the network
-      location, if any, given in the Document for public access to a
-      Transparent copy of the Document, and likewise the network
-      locations given in the Document for previous versions it was
-      based on.  These may be placed in the "History" section.  You
-      may omit a network location for a work that was published at
-      least four years before the Document itself, or if the original
-      publisher of the version it refers to gives permission.</P
-></LI
-><LI
-><P
->In any section entitled
-      "Acknowledgements" or "Dedications", preserve the section's
-      title, and preserve in the section all the substance and tone of
-      each of the contributor acknowledgements and/or dedications
-      given therein.</P
-></LI
-><LI
-><P
->Preserve all the
-      Invariant Sections of the Document, unaltered in their text and
-      in their titles.  Section numbers or the equivalent are not
-      considered part of the section titles.</P
-></LI
-><LI
-><P
->Delete any section
-      entitled "Endorsements".  Such a section may not be included in
-      the Modified Version.</P
-></LI
-><LI
-><P
->Do not retitle any
-      existing section as "Endorsements" or to conflict in title with
-      any Invariant Section.</P
-></LI
-></OL
-><P
->If the Modified Version includes new front-matter sections
-    or appendices that qualify as Secondary Sections and contain no
-    material copied from the Document, you may at your option
-    designate some or all of these sections as invariant.  To do this,
-    add their titles to the list of Invariant Sections in the Modified
-    Version's license notice.  These titles must be distinct from any
-    other section titles.</P
-><P
->You may add a section entitled "Endorsements", provided it
-    contains nothing but endorsements of your Modified Version by
-    various parties--for example, statements of peer review or that
-    the text has been approved by an organization as the authoritative
-    definition of a standard.</P
-><P
->You may add a passage of up to five words as a Front-Cover
-    Text, and a passage of up to 25 words as a Back-Cover Text, to the
-    end of the list of Cover Texts in the Modified Version.  Only one
-    passage of Front-Cover Text and one of Back-Cover Text may be
-    added by (or through arrangements made by) any one entity.  If the
-    Document already includes a cover text for the same cover,
-    previously added by you or by arrangement made by the same entity
-    you are acting on behalf of, you may not add another; but you may
-    replace the old one, on explicit permission from the previous
-    publisher that added the old one.</P
-><P
->The author(s) and publisher(s) of the Document do not by
-    this License give permission to use their names for publicity for
-    or to assert or imply endorsement of any Modified Version.</P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="gfdl_3.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="gfdl_5.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->COPYING IN QUANTITY</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="gfdl.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->COMBINING DOCUMENTS</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/gfdl_5.html b/docs/html/gfdl_5.html
deleted file mode 100644
index c89a77a98..000000000
--- a/docs/html/gfdl_5.html
+++ /dev/null
@@ -1,159 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->COMBINING DOCUMENTS</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="GNU Free Documentation License"
-HREF="gfdl.html"><LINK
-REL="PREVIOUS"
-TITLE="MODIFICATIONS"
-HREF="gfdl_4.html"><LINK
-REL="NEXT"
-TITLE="COLLECTIONS OF DOCUMENTS"
-HREF="gfdl_6.html"></HEAD
-><BODY
-CLASS="SECT1"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="gfdl_4.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Appendix E. GNU Free Documentation License</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="gfdl_6.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECT1"
-><H1
-CLASS="SECT1"
-><A
-NAME="GFDL_5"
->5. COMBINING DOCUMENTS</A
-></H1
-><P
->You may combine the Document with other documents released
-    under this License, under the terms defined in section 4 above for
-    modified versions, provided that you include in the combination
-    all of the Invariant Sections of all of the original documents,
-    unmodified, and list them all as Invariant Sections of your
-    combined work in its license notice.</P
-><P
->The combined work need only contain one copy of this
-    License, and multiple identical Invariant Sections may be replaced
-    with a single copy.  If there are multiple Invariant Sections with
-    the same name but different contents, make the title of each such
-    section unique by adding at the end of it, in parentheses, the
-    name of the original author or publisher of that section if known,
-    or else a unique number.  Make the same adjustment to the section
-    titles in the list of Invariant Sections in the license notice of
-    the combined work.</P
-><P
->In the combination, you must combine any sections entitled
-    "History" in the various original documents, forming one section
-    entitled "History"; likewise combine any sections entitled
-    "Acknowledgements", and any sections entitled "Dedications".  You
-    must delete all sections entitled "Endorsements."</P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="gfdl_4.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="gfdl_6.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->MODIFICATIONS</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="gfdl.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->COLLECTIONS OF DOCUMENTS</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/gfdl_6.html b/docs/html/gfdl_6.html
deleted file mode 100644
index abb433e33..000000000
--- a/docs/html/gfdl_6.html
+++ /dev/null
@@ -1,149 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->COLLECTIONS OF DOCUMENTS</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="GNU Free Documentation License"
-HREF="gfdl.html"><LINK
-REL="PREVIOUS"
-TITLE="COMBINING DOCUMENTS"
-HREF="gfdl_5.html"><LINK
-REL="NEXT"
-TITLE="AGGREGATION WITH INDEPENDENT WORKS"
-HREF="gfdl_7.html"></HEAD
-><BODY
-CLASS="SECT1"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="gfdl_5.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Appendix E. GNU Free Documentation License</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="gfdl_7.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECT1"
-><H1
-CLASS="SECT1"
-><A
-NAME="GFDL_6"
->6. COLLECTIONS OF DOCUMENTS</A
-></H1
-><P
->You may make a collection consisting of the Document and
-    other documents released under this License, and replace the
-    individual copies of this License in the various documents with a
-    single copy that is included in the collection, provided that you
-    follow the rules of this License for verbatim copying of each of
-    the documents in all other respects.</P
-><P
->You may extract a single document from such a collection,
-    and distribute it individually under this License, provided you
-    insert a copy of this License into the extracted document, and
-    follow this License in all other respects regarding verbatim
-    copying of that document.</P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="gfdl_5.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="gfdl_7.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->COMBINING DOCUMENTS</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="gfdl.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->AGGREGATION WITH INDEPENDENT WORKS</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/gfdl_7.html b/docs/html/gfdl_7.html
deleted file mode 100644
index b2aabea60..000000000
--- a/docs/html/gfdl_7.html
+++ /dev/null
@@ -1,153 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->AGGREGATION WITH INDEPENDENT WORKS</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="GNU Free Documentation License"
-HREF="gfdl.html"><LINK
-REL="PREVIOUS"
-TITLE="COLLECTIONS OF DOCUMENTS"
-HREF="gfdl_6.html"><LINK
-REL="NEXT"
-TITLE="TRANSLATION"
-HREF="gfdl_8.html"></HEAD
-><BODY
-CLASS="SECT1"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="gfdl_6.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Appendix E. GNU Free Documentation License</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="gfdl_8.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECT1"
-><H1
-CLASS="SECT1"
-><A
-NAME="GFDL_7"
->7. AGGREGATION WITH INDEPENDENT WORKS</A
-></H1
-><P
->A compilation of the Document or its derivatives with other
-    separate and independent documents or works, in or on a volume of
-    a storage or distribution medium, does not as a whole count as a
-    Modified Version of the Document, provided no compilation
-    copyright is claimed for the compilation.  Such a compilation is
-    called an "aggregate", and this License does not apply to the
-    other self-contained works thus compiled with the Document, on
-    account of their being thus compiled, if they are not themselves
-    derivative works of the Document.</P
-><P
->If the Cover Text requirement of section 3 is applicable to
-    these copies of the Document, then if the Document is less than
-    one quarter of the entire aggregate, the Document's Cover Texts
-    may be placed on covers that surround only the Document within the
-    aggregate.  Otherwise they must appear on covers around the whole
-    aggregate.</P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="gfdl_6.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="gfdl_8.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->COLLECTIONS OF DOCUMENTS</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="gfdl.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->TRANSLATION</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/gfdl_8.html b/docs/html/gfdl_8.html
deleted file mode 100644
index 6db660d9b..000000000
--- a/docs/html/gfdl_8.html
+++ /dev/null
@@ -1,148 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->TRANSLATION</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="GNU Free Documentation License"
-HREF="gfdl.html"><LINK
-REL="PREVIOUS"
-TITLE="AGGREGATION WITH INDEPENDENT WORKS"
-HREF="gfdl_7.html"><LINK
-REL="NEXT"
-TITLE="TERMINATION"
-HREF="gfdl_9.html"></HEAD
-><BODY
-CLASS="SECT1"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="gfdl_7.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Appendix E. GNU Free Documentation License</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="gfdl_9.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECT1"
-><H1
-CLASS="SECT1"
-><A
-NAME="GFDL_8"
->8. TRANSLATION</A
-></H1
-><P
->Translation is considered a kind of modification, so you may
-    distribute translations of the Document under the terms of section
-    4.  Replacing Invariant Sections with translations requires
-    special permission from their copyright holders, but you may
-    include translations of some or all Invariant Sections in addition
-    to the original versions of these Invariant Sections.  You may
-    include a translation of this License provided that you also
-    include the original English version of this License.  In case of
-    a disagreement between the translation and the original English
-    version of this License, the original English version will
-    prevail.</P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="gfdl_7.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="gfdl_9.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->AGGREGATION WITH INDEPENDENT WORKS</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="gfdl.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->TERMINATION</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/gfdl_9.html b/docs/html/gfdl_9.html
deleted file mode 100644
index 2c59ccfb1..000000000
--- a/docs/html/gfdl_9.html
+++ /dev/null
@@ -1,145 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->TERMINATION</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="GNU Free Documentation License"
-HREF="gfdl.html"><LINK
-REL="PREVIOUS"
-TITLE="TRANSLATION"
-HREF="gfdl_8.html"><LINK
-REL="NEXT"
-TITLE="FUTURE REVISIONS OF THIS LICENSE"
-HREF="gfdl_10.html"></HEAD
-><BODY
-CLASS="SECT1"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="gfdl_8.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Appendix E. GNU Free Documentation License</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="gfdl_10.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECT1"
-><H1
-CLASS="SECT1"
-><A
-NAME="GFDL_9"
->9. TERMINATION</A
-></H1
-><P
->You may not copy, modify, sublicense, or distribute the
-    Document except as expressly provided for under this License.  Any
-    other attempt to copy, modify, sublicense or distribute the
-    Document is void, and will automatically terminate your rights
-    under this License.  However, parties who have received copies, or
-    rights, from you under this License will not have their licenses
-    terminated so long as such parties remain in full
-    compliance.</P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="gfdl_8.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="gfdl_10.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->TRANSLATION</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="gfdl.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->FUTURE REVISIONS OF THIS LICENSE</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/gfdl_howto.html b/docs/html/gfdl_howto.html
deleted file mode 100644
index 775fca0c8..000000000
--- a/docs/html/gfdl_howto.html
+++ /dev/null
@@ -1,166 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->How to use this License for your documents</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="GNU Free Documentation License"
-HREF="gfdl.html"><LINK
-REL="PREVIOUS"
-TITLE="FUTURE REVISIONS OF THIS LICENSE"
-HREF="gfdl_10.html"><LINK
-REL="NEXT"
-TITLE="Glossary"
-HREF="glossary.html"></HEAD
-><BODY
-CLASS="SECT1"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="gfdl_10.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Appendix E. GNU Free Documentation License</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="glossary.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECT1"
-><H1
-CLASS="SECT1"
-><A
-NAME="GFDL_HOWTO"
->How to use this License for your documents</A
-></H1
-><P
->To use this License in a document you have written, include
-    a copy of the License in the document and put the following
-    copyright and license notices just after the title page:</P
-><A
-NAME="AEN2589"
-></A
-><BLOCKQUOTE
-CLASS="BLOCKQUOTE"
-><P
->      Copyright (c)  YEAR  YOUR NAME.
-      Permission is granted to copy, distribute and/or modify this document
-      under the terms of the GNU Free Documentation License, Version 1.1
-      or any later version published by the Free Software Foundation;
-      with the Invariant Sections being LIST THEIR TITLES, with the
-      Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
-      A copy of the license is included in the section entitled "GNU
-      Free Documentation License".</P
-></BLOCKQUOTE
-><P
->If you have no Invariant Sections, write "with no Invariant
-    Sections" instead of saying which ones are invariant.  If you have
-    no Front-Cover Texts, write "no Front-Cover Texts" instead of
-    "Front-Cover Texts being LIST"; likewise for Back-Cover
-    Texts.</P
-><P
->If your document contains nontrivial examples of program
-    code, we recommend releasing these examples in parallel under your
-    choice of free software license, such as the GNU General Public
-    License, to permit their use in free software.</P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="gfdl_10.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="glossary.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->FUTURE REVISIONS OF THIS LICENSE</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="gfdl.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->Glossary</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/glossary.html b/docs/html/glossary.html
index 7f821c83b..c6251cb60 100644
--- a/docs/html/glossary.html
+++ b/docs/html/glossary.html
@@ -4,16 +4,16 @@
 >Glossary</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
 HREF="index.html"><LINK
 REL="PREVIOUS"
-TITLE="How to use this License for your documents"
-HREF="gfdl_howto.html"></HEAD
+TITLE="SourceForge"
+HREF="variant-sourceforge.html"></HEAD
 ><BODY
-CLASS="GLOSSARY"
+CLASS="glossary"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -22,6 +22,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -38,7 +39,8 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="gfdl_howto.html"
+HREF="variant-sourceforge.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -60,17 +62,13 @@ WIDTH="100%"></DIV
 CLASS="GLOSSARY"
 ><H1
 ><A
-NAME="GLOSSARY"
->Glossary</A
-></H1
+NAME="glossary">Glossary</H1
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="AEN2594"
->0-9, high ascii</A
-></H1
+NAME="AEN2183">0-9, high ascii</H1
 ><DL
 ><DT
 ><B
@@ -78,35 +76,31 @@ NAME="AEN2594"
 ></DT
 ><DD
 ><P
->	    Apache web server, and other NCSA-compliant web servers,
-	    observe the convention of using files in directories
-	    called <TT
-CLASS="FILENAME"
+>Apache web server, and other NCSA-compliant web servers,
+        observe the convention of using files in directories called 
+        <TT
+CLASS="filename"
 >.htaccess</TT
-> files.  These
-	    restrict parameters of the web server.  In Bugzilla, they
-	    are used to restrict access to certain files which would
-	    otherwise compromise your installation.  For instance, the
-	    <TT
-CLASS="FILENAME"
+>
+
+        to restrict access to certain files. In Bugzilla, they are used
+        to keep secret files which would otherwise
+        compromise your installation - e.g. the 
+        <TT
+CLASS="filename"
 >localconfig</TT
-> file contains the
-	    password to your database.  If this information were
-	    generally available, and remote access to your database
-	    turned on, you risk corruption of your database by
-	    computer criminals or the curious.
-	  </P
+>
+        file contains the password to your database.
+        curious.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_A"
->A</A
-></H1
+NAME="gloss-a">A</H1
 ><DL
 ><DT
 ><B
@@ -114,34 +108,37 @@ NAME="GLOSS_A"
 ></DT
 ><DD
 ><P
->In this context, Apache is the web server most
-	    commonly used for serving up
-	    <I
-CLASS="GLOSSTERM"
+>In this context, Apache is the web server most commonly used
+        for serving up 
+        <I
+CLASS="glossterm"
 >Bugzilla</I
-> pages.  Contrary to
-	    popular belief, the apache web server has nothing to do
-	    with the ancient and noble Native American tribe, but
-	    instead derived its name from the fact that it was
-	    <SPAN
+>
+
+        pages. Contrary to popular belief, the apache web server has nothing
+        to do with the ancient and noble Native American tribe, but instead
+        derived its name from the fact that it was 
+        <SPAN
 CLASS="QUOTE"
 >"a patchy"</SPAN
-> version of the original
-	    <SPAN
-CLASS="ACRONYM"
+>
+
+        version of the original 
+        <SPAN
+CLASS="acronym"
 >NCSA</SPAN
-> world-wide-web server.</P
+>
+
+        world-wide-web server.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_B"
->B</A
-></H1
+NAME="gloss-b">B</H1
 ><DL
 ><DT
 ><B
@@ -149,21 +146,24 @@ NAME="GLOSS_B"
 ></DT
 ><DD
 ><P
->	    A <SPAN
+>A 
+        <SPAN
 CLASS="QUOTE"
->"Bug"</SPAN
-> in Bugzilla refers to an issue
-	    entered into the database which has an associated number,
-	    assignments, comments, etc. Some also refer to a
-	    <SPAN
+>"bug"</SPAN
+>
+
+        in Bugzilla refers to an issue entered into the database which has an
+        associated number, assignments, comments, etc. Some also refer to a 
+        <SPAN
 CLASS="QUOTE"
 >"tickets"</SPAN
-> or <SPAN
+>
+        or 
+        <SPAN
 CLASS="QUOTE"
 >"issues"</SPAN
->; in the
-	    context of Bugzilla, they are synonymous.
-	  </P
+>; 
+        in the context of Bugzilla, they are synonymous.</P
 ></DD
 ><DT
 ><B
@@ -171,29 +171,10 @@ CLASS="QUOTE"
 ></DT
 ><DD
 ><P
->	    Each Bugzilla Bug is assigned a number that uniquely
-	    identifies that Bug.  The Bug associated with a Bug Number
-	    can be pulled up via a query, or easily from the very
-	    front page by typing the number in the "Find" box.
-	  </P
-></DD
-><DT
-><B
->Bug Life Cycle</B
-></DT
-><DD
-><P
->A Bug has stages through which it must pass before
-	    becoming a <SPAN
-CLASS="QUOTE"
->"closed bug"</SPAN
->, including
-	    acceptance, resolution, and verification.  The <SPAN
-CLASS="QUOTE"
->"Bug
-	      Life Cycle"</SPAN
-> is moderately flexible according to
-	    the needs of the organization using it, though.</P
+>Each Bugzilla bug is assigned a number that uniquely identifies
+        that bug. The bug associated with a bug number can be pulled up via a
+        query, or easily from the very front page by typing the number in the
+        "Find" box.</P
 ></DD
 ><DT
 ><B
@@ -201,76 +182,67 @@ CLASS="QUOTE"
 ></DT
 ><DD
 ><P
->	    Bugzilla is the industry-standard bug tracking system.  It
-	    is quite popular among Open Source enthusiasts.
-	  </P
+>Bugzilla is the world-leading free software bug tracking system.
+        </P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_C"
-></A
-></H1
+NAME="gloss-c"></H1
 ><DL
 ><DT
 ><A
-NAME="GLOSS_COMPONENT"
-><B
+NAME="gloss-component"><B
 >Component</B
-></A
 ></DT
 ><DD
 ><P
->	    A Component is a subsection of a Product.  It should be a
-	    narrow category, tailored to your organization.  All
-	    Products must contain at least one Component (and, as a
-	    matter of fact, creating a Product with no Components will
-	    create an error in Bugzilla).
-	  </P
+>A Component is a subsection of a Product. It should be a narrow
+        category, tailored to your organization. All Products must contain at
+        least one Component (and, as a matter of fact, creating a Product
+        with no Components will create an error in Bugzilla).</P
 ></DD
 ><DT
 ><A
-NAME="GLOSS_CPAN"
-><B
-><SPAN
-CLASS="ACRONYM"
+NAME="gloss-cpan"><B
+>&#13;        <SPAN
+CLASS="acronym"
 >CPAN</SPAN
-></B
-></A
+>
+      </B
 ></DT
 ><DD
 ><P
-><SPAN
-CLASS="ACRONYM"
+>&#13;        <SPAN
+CLASS="acronym"
 >CPAN</SPAN
-> stands for the
-	    <SPAN
+>
+
+        stands for the 
+        <SPAN
 CLASS="QUOTE"
 >"Comprehensive Perl Archive Network"</SPAN
->.  CPAN
-	    maintains a large number of extremely useful
-	    <I
-CLASS="GLOSSTERM"
+>. 
+        CPAN maintains a large number of extremely useful 
+        <I
+CLASS="glossterm"
 >Perl</I
-> modules.  By themselves, Perl
-	    modules generally do nothing, but when used as part of a
-	    larger program, they provide much-needed algorithms and
-	    functionality.</P
+>
+        modules - encapsulated chunks of code for performing a
+        particular task.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_D"
->D</A
-></H1
+NAME="gloss-d">D</H1
 ><DL
 ><DT
 ><B
@@ -278,29 +250,28 @@ NAME="GLOSS_D"
 ></DT
 ><DD
 ><P
->A daemon is a computer program which runs in the
-	    background.  In general, most daemons are started at boot
-	    time via System V init scripts, or through RC scripts on
-	    BSD-based systems.  <I
-CLASS="GLOSSTERM"
+>A daemon is a computer program which runs in the background. In
+        general, most daemons are started at boot time via System V init
+        scripts, or through RC scripts on BSD-based systems. 
+        <I
+CLASS="glossterm"
 >mysqld</I
->, the
-	    MySQL server, and <I
-CLASS="GLOSSTERM"
+>, 
+        the MySQL server, and 
+        <I
+CLASS="glossterm"
 >apache</I
->, a web
-	    server, are generally run as daemons.</P
+>, 
+        a web server, are generally run as daemons.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_G"
-></A
-></H1
+NAME="gloss-g"></H1
 ><DL
 ><DT
 ><B
@@ -308,58 +279,34 @@ NAME="GLOSS_G"
 ></DT
 ><DD
 ><P
->The word <SPAN
+>The word 
+        <SPAN
 CLASS="QUOTE"
 >"Groups"</SPAN
-> has a very special
-	    meaning to Bugzilla.  Bugzilla's main security mechanism
-	    comes by lumping users into groups, and assigning those
-	    groups certain privileges to
-	    <I
-CLASS="GLOSSTERM"
+>
+
+        has a very special meaning to Bugzilla. Bugzilla's main security
+        mechanism comes by placing users in groups, and assigning those
+        groups certain privileges to view bugs in particular
+        <I
+CLASS="glossterm"
 >Products</I
-> and
-	    <I
-CLASS="GLOSSTERM"
->Components</I
-> in the
-	    <I
-CLASS="GLOSSTERM"
+>
+        in the 
+        <I
+CLASS="glossterm"
 >Bugzilla</I
-> database.</P
-></DD
-></DL
-></DIV
-><DIV
-CLASS="GLOSSDIV"
-><H1
-CLASS="GLOSSDIV"
-><A
-NAME="GLOSS_I"
->I</A
-></H1
-><DL
-><DT
-><A
-NAME="GLOSS_INFINITELOOP"
-><B
->Infinite Loop</B
-></A
-></DT
-><DD
-><P
->A loop of information that never ends; see recursion.</P
+>
+        database.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_M"
->M</A
-></H1
+NAME="gloss-m">M</H1
 ><DL
 ><DT
 ><B
@@ -367,26 +314,25 @@ NAME="GLOSS_M"
 ></DT
 ><DD
 ><P
->mysqld is the name of the
-	    <I
-CLASS="GLOSSTERM"
+>mysqld is the name of the 
+        <I
+CLASS="glossterm"
 >daemon</I
-> for the MySQL database.  In
-	    general, it is invoked automatically through the use of
-	    the System V init scripts on GNU/Linux and AT&#38;T System
-	    V-based systems, such as Solaris and HP/UX, or through the
-	    RC scripts on BSD-based systems.</P
+>
+
+        for the MySQL database. In general, it is invoked automatically
+        through the use of the System V init scripts on GNU/Linux and
+        AT&#38;T System V-based systems, such as Solaris and HP/UX, or
+        through the RC scripts on BSD-based systems.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_P"
->P</A
-></H1
+NAME="gloss-p">P</H1
 ><DL
 ><DT
 ><B
@@ -394,57 +340,11 @@ NAME="GLOSS_P"
 ></DT
 ><DD
 ><P
->A Product is a broad category of types of bugs.  In
-	    general, there are several Components to a Product.  A
-	    Product also defines a default Group (used for Bug
-	    Security) for all bugs entered into components beneath
-	    it.</P
-><DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN2685"
-></A
-><P
-><B
->Example 1. A Sample Product</B
-></P
-><P
->A company sells a software product called
-	      <SPAN
-CLASS="QUOTE"
->"X"</SPAN
->.  They also maintain some older
-	      software called <SPAN
-CLASS="QUOTE"
->"Y"</SPAN
->, and have a secret
-	      project <SPAN
-CLASS="QUOTE"
->"Z"</SPAN
->.  An effective use of Products
-	      might be to create Products <SPAN
-CLASS="QUOTE"
->"X"</SPAN
->,
-	      <SPAN
-CLASS="QUOTE"
->"Y"</SPAN
->, <SPAN
-CLASS="QUOTE"
->"Z"</SPAN
->, each with Components
-	      of User Interface, Database, and Business Logic.  They
-	      might also change group permissions so that only those
-	      people who are members of Group <SPAN
-CLASS="QUOTE"
->"Z"</SPAN
-> can see
-	      components and bugs under Product
-	      <SPAN
-CLASS="QUOTE"
->"Z"</SPAN
->.</P
-></DIV
+>A Product is a broad category of types of bugs, normally
+        representing a single piece of software or entity. In general,
+        there are several Components to a Product. A Product may define a
+        group (used for security) for all bugs entered into
+        its Components.</P
 ></DD
 ><DT
 ><B
@@ -452,26 +352,25 @@ CLASS="QUOTE"
 ></DT
 ><DD
 ><P
->First written by Larry Wall, Perl is a remarkable
-	    program language.  It has the benefits of the flexibility
-	    of an interpreted scripting language (such as shell
-	    script), combined with the speed and power of a compiled
-	    language, such as C.  <I
-CLASS="GLOSSTERM"
+>First written by Larry Wall, Perl is a remarkable program
+        language. It has the benefits of the flexibility of an interpreted
+        scripting language (such as shell script), combined with the speed
+        and power of a compiled language, such as C. 
+        <I
+CLASS="glossterm"
 >Bugzilla</I
-> is
-	    maintained in Perl.</P
+>
+
+        is maintained in Perl.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_Q"
->Q</A
-></H1
+NAME="gloss-q">Q</H1
 ><DL
 ><DT
 ><B
@@ -479,183 +378,159 @@ NAME="GLOSS_Q"
 ></DT
 ><DD
 ><P
-><SPAN
+>&#13;        <SPAN
 CLASS="QUOTE"
 >"QA"</SPAN
->, <SPAN
+>, 
+        <SPAN
 CLASS="QUOTE"
 >"Q/A"</SPAN
->, and
-	    <SPAN
+>, and 
+        <SPAN
 CLASS="QUOTE"
 >"Q.A."</SPAN
-> are short for <SPAN
+>
+        are short for 
+        <SPAN
 CLASS="QUOTE"
->"Quality
-	      Assurance"</SPAN
->.  In most large software development
-	    organizations, there is a team devoted to ensuring the
-	    product meets minimum standards before shipping.  This
-	    team will also generally want to track the progress of
-	    bugs over their life cycle, thus the need for the
-	    <SPAN
+>"Quality Assurance"</SPAN
+>. 
+        In most large software development organizations, there is a team
+        devoted to ensuring the product meets minimum standards before
+        shipping. This team will also generally want to track the progress of
+        bugs over their life cycle, thus the need for the 
+        <SPAN
 CLASS="QUOTE"
 >"QA Contact"</SPAN
-> field in a Bug.</P
+>
+
+        field in a bug.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_R"
->R</A
-></H1
+NAME="gloss-s">S</H1
 ><DL
 ><DT
-><A
-NAME="GLOSS_RECURSION"
 ><B
->Recursion</B
-></A
-></DT
-><DD
-><P
->The property of a function looking back at itself for
-	    something.  <SPAN
-CLASS="QUOTE"
->"GNU"</SPAN
->, for instance, stands for
-	    <SPAN
-CLASS="QUOTE"
->"GNU's Not UNIX"</SPAN
->, thus recursing upon itself
-	    for definition.  For further clarity, see Infinite
-	    Loop.</P
-></DD
-></DL
-></DIV
-><DIV
-CLASS="GLOSSDIV"
-><H1
-CLASS="GLOSSDIV"
-><A
-NAME="GLOSS_S"
->S</A
-></H1
-><DL
-><DT
-><B
-><SPAN
-CLASS="ACRONYM"
+>&#13;        <SPAN
+CLASS="acronym"
 >SGML</SPAN
-></B
+>
+      </B
 ></DT
 ><DD
 ><P
-><SPAN
-CLASS="ACRONYM"
+>&#13;        <SPAN
+CLASS="acronym"
 >SGML</SPAN
-> stands for <SPAN
+>
+
+        stands for 
+        <SPAN
 CLASS="QUOTE"
->"Standard
-	      Generalized Markup Language"</SPAN
->.  Created in the
-	    1980's to provide an extensible means to maintain
-	    documentation based upon content instead of presentation,
-	    <SPAN
-CLASS="ACRONYM"
+>"Standard Generalized Markup Language"</SPAN
+>. 
+        Created in the 1980's to provide an extensible means to maintain
+        documentation based upon content instead of presentation, 
+        <SPAN
+CLASS="acronym"
 >SGML</SPAN
-> has withstood the test of time as
-	    a robust, powerful language.
-	    <I
-CLASS="GLOSSTERM"
-><SPAN
-CLASS="ACRONYM"
+>
+
+        has withstood the test of time as a robust, powerful language. 
+        <I
+CLASS="glossterm"
+>&#13;          <SPAN
+CLASS="acronym"
 >XML</SPAN
-></I
-> is the
-	    <SPAN
+>
+        </I
+>
+
+        is the 
+        <SPAN
 CLASS="QUOTE"
 >"baby brother"</SPAN
-> of SGML; any valid
-	    <SPAN
-CLASS="ACRONYM"
+>
+
+        of SGML; any valid 
+        <SPAN
+CLASS="acronym"
 >XML</SPAN
-> document it, by definition, a valid
-	    <SPAN
-CLASS="ACRONYM"
+>
+
+        document it, by definition, a valid 
+        <SPAN
+CLASS="acronym"
 >SGML</SPAN
-> document.  The document you are
-	    reading is written and maintained in
-	    <SPAN
-CLASS="ACRONYM"
+>
+
+        document. The document you are reading is written and maintained in 
+        <SPAN
+CLASS="acronym"
 >SGML</SPAN
->, and is also valid
-	    <SPAN
-CLASS="ACRONYM"
+>, 
+        and is also valid 
+        <SPAN
+CLASS="acronym"
 >XML</SPAN
-> if you modify the Document Type
-	    Definition.</P
+>
+
+        if you modify the Document Type Definition.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_T"
->T</A
-></H1
+NAME="gloss-t">T</H1
 ><DL
 ><DT
 ><A
-NAME="GLOSS_TARGET_MILESTONE"
-><B
+NAME="gloss-target-milestone"><B
 >Target Milestone</B
-></A
 ></DT
 ><DD
 ><P
->	    Target Milestones are Product goals.  They are
-	    configurable on a per-Product basis.  Most software
-	    development houses have a concept of
-	    <SPAN
+>Target Milestones are Product goals. They are configurable on a
+        per-Product basis. Most software development houses have a concept of
+        
+        <SPAN
 CLASS="QUOTE"
 >"milestones"</SPAN
-> where the people funding a
-	    project expect certain functionality on certain dates.
-	    Bugzilla facilitates meeting these milestones by giving
-	    you the ability to declare by which milestone a bug will be
-	    fixed, or an enhancement will be implemented.
-	  </P
+>
+
+        where the people funding a project expect certain functionality on
+        certain dates. Bugzilla facilitates meeting these milestones by
+        giving you the ability to declare by which milestone a bug will be
+        fixed, or an enhancement will be implemented.</P
 ></DD
 ></DL
 ></DIV
 ><DIV
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><H1
-CLASS="GLOSSDIV"
+CLASS="glossdiv"
 ><A
-NAME="GLOSS_Z"
->Z</A
-></H1
+NAME="gloss-z">Z</H1
 ><DL
 ><DT
 ><A
-NAME="ZARRO-BOOGS-FOUND"
-><B
+NAME="zarro-boogs-found"><B
 >Zarro Boogs Found</B
-></A
 ></DT
 ><DD
 ><P
->This is the cryptic response sent by Bugzilla when a
-	    query returned no results.  It is just a goofy way of
-	    saying "Zero Bugs Found".</P
+>This is the cryptic response sent by Bugzilla when a query
+        returned no results. It is just a goofy way of saying "Zero Bugs
+        Found".</P
 ></DD
 ></DL
 ></DIV
@@ -665,6 +540,7 @@ CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -675,7 +551,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="gfdl_howto.html"
+HREF="variant-sourceforge.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -684,6 +561,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -697,7 +575,7 @@ VALIGN="top"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->How to use this License for your documents</TD
+>SourceForge</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
diff --git a/docs/html/granttables.html b/docs/html/granttables.html
deleted file mode 100644
index 2c5147270..000000000
--- a/docs/html/granttables.html
+++ /dev/null
@@ -1,344 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->MySQL Permissions &#38; Grant Tables</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="The Bugzilla Database"
-HREF="database.html"><LINK
-REL="PREVIOUS"
-TITLE="MySQL Bugzilla Database Introduction"
-HREF="dbdoc.html"><LINK
-REL="NEXT"
-TITLE="Useful Patches and Utilities for Bugzilla"
-HREF="patches.html"></HEAD
-><BODY
-CLASS="SECTION"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="dbdoc.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Appendix C. The Bugzilla Database</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="patches.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECTION"
-><H1
-CLASS="SECTION"
-><A
-NAME="GRANTTABLES"
->C.3. MySQL Permissions &#38; Grant Tables</A
-></H1
-><DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->The following portion of documentation comes from my
-	answer to an old discussion of Keystone, a cool product that
-	does trouble-ticket tracking for IT departments.  I wrote this
-	post to the  Keystone support group regarding MySQL grant
-	table permissions, and how to use them effectively. It is
-	badly in need of updating, as I believe MySQL has added a
-	field or two to the grant tables  since this time, but it
-	serves as a decent introduction and troubleshooting document
-	for grant table issues.  I used Keynote to track my troubles
-	until I discovered Bugzilla, which gave me a whole new set of
-	troubles to work on : )  Although it is of limited use, it
-	still has SOME use, thus it's still included.</P
-><P
->	Please note, however, that I was a relatively new user to
-	MySQL at the time.  Some of my suggestions, particularly in
-	how to set up security, showed a terrible lack of
-	security-related database experience.
-      </P
-></TD
-></TR
-></TABLE
-></DIV
-><P
-CLASS="LITERALLAYOUT"
->From&nbsp;matt_barnson@singletrac.com&nbsp;Wed&nbsp;Jul&nbsp;&nbsp;7&nbsp;09:00:07&nbsp;1999<br>
-Date:&nbsp;Mon,&nbsp;1&nbsp;Mar&nbsp;1999&nbsp;21:37:04&nbsp;-0700&nbsp;<br>
-From:&nbsp;Matthew&nbsp;Barnson&nbsp;matt_barnson@singletrac.com<br>
-To:&nbsp;keystone-users@homeport.org<br>
-Subject:&nbsp;[keystone-users]&nbsp;Grant&nbsp;Tables&nbsp;FAQ<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;[The&nbsp;following&nbsp;text&nbsp;is&nbsp;in&nbsp;the&nbsp;"iso-8859-1"&nbsp;character&nbsp;set]<br>
-&nbsp;&nbsp;&nbsp;&nbsp;[Your&nbsp;display&nbsp;is&nbsp;set&nbsp;for&nbsp;the&nbsp;"US-ASCII"&nbsp;character&nbsp;set]<br>
-&nbsp;&nbsp;&nbsp;&nbsp;[Some&nbsp;characters&nbsp;may&nbsp;be&nbsp;displayed&nbsp;incorrectly]<br>
-<br>
-Maybe&nbsp;we&nbsp;can&nbsp;include&nbsp;this&nbsp;rambling&nbsp;message&nbsp;in&nbsp;the&nbsp;Keystone&nbsp;FAQ?&nbsp;&nbsp;It&nbsp;gets<br>
-asked&nbsp;a&nbsp;lot,&nbsp;and&nbsp;the&nbsp;only&nbsp;option&nbsp;current&nbsp;listed&nbsp;in&nbsp;the&nbsp;FAQ&nbsp;is<br>
-"--skip-grant-tables".<br>
-<br>
-Really,&nbsp;you&nbsp;can't&nbsp;go&nbsp;wrong&nbsp;by&nbsp;reading&nbsp;section&nbsp;6&nbsp;of&nbsp;the&nbsp;MySQL&nbsp;manual,&nbsp;at<br>
-http://www.mysql.com/Manual/manual.html.&nbsp;&nbsp;I&nbsp;am&nbsp;sure&nbsp;their&nbsp;description&nbsp;is<br>
-better&nbsp;than&nbsp;mine.<br>
-<br>
-MySQL&nbsp;runs&nbsp;fine&nbsp;without&nbsp;permissions&nbsp;set&nbsp;up&nbsp;correctly&nbsp;if&nbsp;you&nbsp;run&nbsp;the&nbsp;mysql<br>
-daemon&nbsp;with&nbsp;the&nbsp;"--skip-grant-tables"&nbsp;option.&nbsp;&nbsp;Running&nbsp;this&nbsp;way&nbsp;denies<br>
-access&nbsp;to&nbsp;nobody.&nbsp;&nbsp;Unfortunately,&nbsp;unless&nbsp;you've&nbsp;got&nbsp;yourself&nbsp;firewalled&nbsp;it<br>
-also&nbsp;opens&nbsp;the&nbsp;potential&nbsp;for&nbsp;abuse&nbsp;if&nbsp;someone&nbsp;knows&nbsp;you're&nbsp;running&nbsp;it.<br>
-<br>
-Additionally,&nbsp;the&nbsp;default&nbsp;permissions&nbsp;for&nbsp;MySQL&nbsp;allow&nbsp;anyone&nbsp;at&nbsp;localhost<br>
-access&nbsp;to&nbsp;the&nbsp;database&nbsp;if&nbsp;the&nbsp;database&nbsp;name&nbsp;begins&nbsp;with&nbsp;"test_"&nbsp;or&nbsp;is&nbsp;named<br>
-"test"&nbsp;(i.e.&nbsp;"test_keystone").&nbsp;&nbsp;You&nbsp;can&nbsp;change&nbsp;the&nbsp;name&nbsp;of&nbsp;your&nbsp;database&nbsp;in<br>
-the&nbsp;keystone.conf&nbsp;file&nbsp;($sys_dbname).&nbsp;&nbsp;This&nbsp;is&nbsp;the&nbsp;way&nbsp;I&nbsp;am&nbsp;doing&nbsp;it&nbsp;for<br>
-some&nbsp;of&nbsp;my&nbsp;databases,&nbsp;and&nbsp;it&nbsp;works&nbsp;fine.<br>
-<br>
-The&nbsp;methods&nbsp;described&nbsp;below&nbsp;assume&nbsp;you're&nbsp;running&nbsp;MySQL&nbsp;on&nbsp;the&nbsp;same&nbsp;box&nbsp;as<br>
-your&nbsp;webserver,&nbsp;and&nbsp;that&nbsp;you&nbsp;don't&nbsp;mind&nbsp;if&nbsp;your&nbsp;$sys_dbuser&nbsp;for&nbsp;Keystone&nbsp;has<br>
-superuser&nbsp;access.&nbsp;&nbsp;See&nbsp;near&nbsp;the&nbsp;bottom&nbsp;of&nbsp;this&nbsp;message&nbsp;for&nbsp;a&nbsp;description&nbsp;of<br>
-what&nbsp;each&nbsp;field&nbsp;does.<br>
-<br>
-Method&nbsp;#1:<br>
-<br>
-1.&nbsp;&nbsp;cd&nbsp;/var/lib<br>
-	#location&nbsp;where&nbsp;you'll&nbsp;want&nbsp;to&nbsp;run&nbsp;/usr/bin/mysql_install_db&nbsp;shell<br>
-script&nbsp;from&nbsp;to&nbsp;get&nbsp;it&nbsp;to&nbsp;work.<br>
-<br>
-2.&nbsp;&nbsp;ln&nbsp;-s&nbsp;mysql&nbsp;data&nbsp;&nbsp;<br>
-	#&nbsp;soft&nbsp;links&nbsp;the&nbsp;"mysql"&nbsp;directory&nbsp;to&nbsp;"data",&nbsp;which&nbsp;is&nbsp;what<br>
-mysql_install_db&nbsp;expects.&nbsp;&nbsp;Alternately,&nbsp;you&nbsp;can&nbsp;edit&nbsp;mysql_install_db&nbsp;and<br>
-change&nbsp;all&nbsp;the&nbsp;"./data"&nbsp;references&nbsp;to&nbsp;"./mysql".<br>
-<br>
-3.&nbsp;&nbsp;Edit&nbsp;/usr/bin/mysql_install_db&nbsp;with&nbsp;your&nbsp;favorite&nbsp;text&nbsp;editor&nbsp;(vi,<br>
-emacs,&nbsp;jot,&nbsp;pico,&nbsp;etc.)<br>
-A)&nbsp;&nbsp;Copy&nbsp;the&nbsp;"INSERT&nbsp;INTO&nbsp;db&nbsp;VALUES<br>
-('%','test\_%','','Y','Y','Y','Y','Y','Y');"&nbsp;and&nbsp;paste&nbsp;it&nbsp;immediately&nbsp;after<br>
-itself.&nbsp;&nbsp;Chage&nbsp;the&nbsp;'test\_%'&nbsp;value&nbsp;to&nbsp;'keystone',&nbsp;or&nbsp;the&nbsp;value&nbsp;of<br>
-$sys_dbname&nbsp;in&nbsp;keystone.conf.<br>
-B)&nbsp;&nbsp;If&nbsp;you&nbsp;are&nbsp;running&nbsp;your&nbsp;keystone&nbsp;database&nbsp;with&nbsp;any&nbsp;user,&nbsp;you'll&nbsp;need&nbsp;to<br>
-copy&nbsp;the&nbsp;"INSERT&nbsp;INTO&nbsp;user&nbsp;VALUES<br>
-('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');"&nbsp;line&nbsp;after<br>
-itself&nbsp;and&nbsp;change&nbsp;'root'&nbsp;to&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;keystone&nbsp;database&nbsp;user<br>
-($sys_dbuser)&nbsp;in&nbsp;keystone.conf.<br>
-<br>
-	#&nbsp;adds&nbsp;entries&nbsp;to&nbsp;the&nbsp;script&nbsp;to&nbsp;create&nbsp;grant&nbsp;tables&nbsp;for&nbsp;specific<br>
-hosts&nbsp;and&nbsp;users.&nbsp;&nbsp;The&nbsp;user&nbsp;you&nbsp;set&nbsp;up&nbsp;has&nbsp;super-user&nbsp;access&nbsp;($sys_dbuser)&nbsp;--<br>
-you&nbsp;may&nbsp;or&nbsp;may&nbsp;not&nbsp;want&nbsp;this.&nbsp;&nbsp;The&nbsp;layout&nbsp;of&nbsp;mysql_install_db&nbsp;is&nbsp;really&nbsp;very<br>
-uncomplicated.<br>
-<br>
-4.&nbsp;&nbsp;/usr/bin/mysqladmin&nbsp;shutdown<br>
-	#&nbsp;ya&nbsp;gotta&nbsp;shut&nbsp;it&nbsp;down&nbsp;before&nbsp;you&nbsp;can&nbsp;reinstall&nbsp;the&nbsp;grant&nbsp;tables!<br>
-<br>
-5.&nbsp;&nbsp;rm&nbsp;-i&nbsp;/var/lib/mysql/mysql/*.IS?'&nbsp;and&nbsp;answer&nbsp;'Y'&nbsp;to&nbsp;the&nbsp;deletion<br>
-questions.<br>
-	#&nbsp;nuke&nbsp;your&nbsp;current&nbsp;grant&nbsp;tables.&nbsp;&nbsp;This&nbsp;WILL&nbsp;NOT&nbsp;delete&nbsp;any&nbsp;other<br>
-databases&nbsp;than&nbsp;your&nbsp;grant&nbsp;tables.<br>
-<br>
-6.&nbsp;&nbsp;/usr/bin/mysql_install_db<br>
-	#&nbsp;run&nbsp;the&nbsp;script&nbsp;you&nbsp;just&nbsp;edited&nbsp;to&nbsp;install&nbsp;your&nbsp;new&nbsp;grant&nbsp;tables.<br>
-<br>
-7.&nbsp;&nbsp;mysqladmin&nbsp;-u&nbsp;root&nbsp;password&nbsp;(new_password)&nbsp;&nbsp;<br>
-	#&nbsp;change&nbsp;the&nbsp;root&nbsp;MySQL&nbsp;password,&nbsp;or&nbsp;else&nbsp;anyone&nbsp;on&nbsp;localhost&nbsp;can<br>
-login&nbsp;to&nbsp;MySQL&nbsp;as&nbsp;root&nbsp;and&nbsp;make&nbsp;changes.&nbsp;&nbsp;You&nbsp;can&nbsp;skip&nbsp;this&nbsp;step&nbsp;if&nbsp;you&nbsp;want<br>
-keystone&nbsp;to&nbsp;connect&nbsp;as&nbsp;root&nbsp;with&nbsp;no&nbsp;password.<br>
-<br>
-8.&nbsp;&nbsp;mysqladmin&nbsp;-u&nbsp;(webserver_user_name)&nbsp;password&nbsp;(new_password)&nbsp;&nbsp;<br>
-	#&nbsp;change&nbsp;the&nbsp;password&nbsp;of&nbsp;the&nbsp;$sys_dbuser.&nbsp;&nbsp;Note&nbsp;that&nbsp;you&nbsp;will&nbsp;need<br>
-to&nbsp;change&nbsp;the&nbsp;password&nbsp;in&nbsp;the&nbsp;keystone.conf&nbsp;file&nbsp;as&nbsp;well&nbsp;in&nbsp;$sys_dbpasswd,<br>
-and&nbsp;if&nbsp;your&nbsp;permissions&nbsp;are&nbsp;set&nbsp;up&nbsp;incorrectly&nbsp;anybody&nbsp;can&nbsp;type&nbsp;the&nbsp;URL&nbsp;to<br>
-your&nbsp;keystone.conf&nbsp;file&nbsp;and&nbsp;get&nbsp;the&nbsp;password.&nbsp;&nbsp;Not&nbsp;that&nbsp;this&nbsp;will&nbsp;help&nbsp;them<br>
-much&nbsp;if&nbsp;your&nbsp;permissions&nbsp;are&nbsp;set&nbsp;to&nbsp;@localhost.<br>
-<br>
-<br>
-<br>
-Method&nbsp;#2:&nbsp;&nbsp;easier,&nbsp;but&nbsp;a&nbsp;pain&nbsp;reproducing&nbsp;if&nbsp;you&nbsp;have&nbsp;to&nbsp;delete&nbsp;your&nbsp;grant<br>
-tables.&nbsp;&nbsp;This&nbsp;is&nbsp;the&nbsp;"recommended"&nbsp;method&nbsp;for&nbsp;altering&nbsp;grant&nbsp;tables&nbsp;in<br>
-MySQL.&nbsp;&nbsp;I&nbsp;don't&nbsp;use&nbsp;it&nbsp;because&nbsp;I&nbsp;like&nbsp;the&nbsp;other&nbsp;way&nbsp;:)<br>
-<br>
-shell&#62;&nbsp;mysql&nbsp;--user=root&nbsp;keystone<br>
-<br>
-mysql&#62;&nbsp;GRANT<br>
-SELECT,INSERT,UPDATE,DELETE,INDEX,ALTER,CREATE,DROP,RELOAD,SHUTDOWN,PROCESS,<br>
-FILE,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ON&nbsp;keystone.*<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TO&nbsp;&#60;$sys_dbuser&nbsp;name&#62;@localhost<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IDENTIFIED&nbsp;BY&nbsp;'(password)'<br>
-	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WITH&nbsp;GRANT&nbsp;OPTION;<br>
-<br>
-OR<br>
-<br>
-mysql&#62;&nbsp;GRANT&nbsp;ALL&nbsp;PRIVELEGES&nbsp;<br>
-		ON&nbsp;keystone.*<br>
-		TO&nbsp;&#60;$sys_dbuser&nbsp;name&#62;@localhost<br>
-		IDENTIFIED&nbsp;BY&nbsp;'(password)'<br>
-		WITH&nbsp;GRANT&nbsp;OPTION;<br>
-<br>
-	#&nbsp;this&nbsp;grants&nbsp;the&nbsp;required&nbsp;permissions&nbsp;to&nbsp;the&nbsp;keystone&nbsp;($sys_dbuser)<br>
-account&nbsp;defined&nbsp;in&nbsp;keystone.conf.&nbsp;&nbsp;However,&nbsp;if&nbsp;you&nbsp;are&nbsp;runnning&nbsp;many<br>
-different&nbsp;MySQL-based&nbsp;apps,&nbsp;as&nbsp;we&nbsp;are,&nbsp;it's&nbsp;generally&nbsp;better&nbsp;to&nbsp;edit&nbsp;the<br>
-mysql_install_db&nbsp;script&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;quickly&nbsp;reproduce&nbsp;your&nbsp;permissions<br>
-structure&nbsp;again.&nbsp;&nbsp;Note&nbsp;that&nbsp;the&nbsp;FILE&nbsp;privelege&nbsp;and&nbsp;WITH&nbsp;GRANT&nbsp;OPTION&nbsp;may&nbsp;not<br>
-be&nbsp;in&nbsp;your&nbsp;best&nbsp;interest&nbsp;to&nbsp;include.<br>
-<br>
-<br>
-GRANT&nbsp;TABLE&nbsp;FIELDS&nbsp;EXPLANATION:<br>
-Quick&nbsp;syntax&nbsp;summary:&nbsp;&nbsp;"%"&nbsp;in&nbsp;MySQL&nbsp;is&nbsp;a&nbsp;wildcard.&nbsp;&nbsp;I.E.,&nbsp;if&nbsp;you&nbsp;are<br>
-defining&nbsp;your&nbsp;DB&nbsp;table&nbsp;and&nbsp;in&nbsp;the&nbsp;'host'&nbsp;field&nbsp;and&nbsp;enter&nbsp;'%',&nbsp;that&nbsp;means<br>
-that&nbsp;any&nbsp;host&nbsp;can&nbsp;access&nbsp;that&nbsp;database.&nbsp;&nbsp;Of&nbsp;course,&nbsp;that&nbsp;host&nbsp;must&nbsp;also&nbsp;have<br>
-a&nbsp;valid&nbsp;db&nbsp;user&nbsp;in&nbsp;order&nbsp;to&nbsp;do&nbsp;anything&nbsp;useful.&nbsp;&nbsp;'db'=name&nbsp;of&nbsp;database.&nbsp;&nbsp;In<br>
-our&nbsp;case,&nbsp;it&nbsp;should&nbsp;be&nbsp;"keystone".&nbsp;&nbsp;"user"&nbsp;should&nbsp;be&nbsp;your&nbsp;"$sys_dbuser"<br>
-defined&nbsp;in&nbsp;keystone.conf.&nbsp;&nbsp;Note&nbsp;that&nbsp;you&nbsp;CANNOT&nbsp;add&nbsp;or&nbsp;change&nbsp;a&nbsp;password&nbsp;by<br>
-using&nbsp;the&nbsp;"INSERT&nbsp;INTO&nbsp;db&nbsp;(X)"&nbsp;command&nbsp;--&nbsp;you&nbsp;must&nbsp;change&nbsp;it&nbsp;with&nbsp;the&nbsp;mysql<br>
--u&nbsp;command&nbsp;as&nbsp;defined&nbsp;above.&nbsp;&nbsp;Passwords&nbsp;are&nbsp;stored&nbsp;encrypted&nbsp;in&nbsp;the&nbsp;MySQL<br>
-database,&nbsp;and&nbsp;if&nbsp;you&nbsp;try&nbsp;to&nbsp;enter&nbsp;it&nbsp;directly&nbsp;into&nbsp;the&nbsp;table&nbsp;they&nbsp;will&nbsp;not<br>
-match.<br>
-<br>
-TABLE:&nbsp;&nbsp;USER.&nbsp;&nbsp;Everything&nbsp;after&nbsp;"password"&nbsp;is&nbsp;a&nbsp;privelege&nbsp;granted&nbsp;(Y/N).<br>
-This&nbsp;table&nbsp;controls&nbsp;individual&nbsp;user&nbsp;global&nbsp;access&nbsp;rights.<br>
-<br>
-'host','user','password','select','insert','update','delete','index','alter'<br>
-,'create','drop','grant','reload','shutdown','process','file'<br>
-<br>
-TABLE:&nbsp;&nbsp;DB.&nbsp;&nbsp;This&nbsp;controls&nbsp;access&nbsp;of&nbsp;USERS&nbsp;to&nbsp;databases.<br>
-<br>
-'host','db','user','select','insert','update','delete','index','alter','crea<br>
-te','drop','grant'<br>
-<br>
-TABLE:&nbsp;&nbsp;HOST.&nbsp;&nbsp;This&nbsp;controls&nbsp;which&nbsp;HOSTS&nbsp;are&nbsp;allowed&nbsp;what&nbsp;global&nbsp;access<br>
-rights.&nbsp;&nbsp;Note&nbsp;that&nbsp;the&nbsp;HOST&nbsp;table,&nbsp;USER&nbsp;table,&nbsp;and&nbsp;DB&nbsp;table&nbsp;are&nbsp;very&nbsp;closely<br>
-connected&nbsp;--&nbsp;if&nbsp;an&nbsp;authorized&nbsp;USER&nbsp;attempts&nbsp;an&nbsp;SQL&nbsp;request&nbsp;from&nbsp;an<br>
-unauthorized&nbsp;HOST,&nbsp;she's&nbsp;denied.&nbsp;&nbsp;If&nbsp;a&nbsp;request&nbsp;from&nbsp;an&nbsp;authorized&nbsp;HOST&nbsp;is<br>
-not&nbsp;an&nbsp;authorized&nbsp;USER,&nbsp;it&nbsp;is&nbsp;denied.&nbsp;&nbsp;If&nbsp;a&nbsp;globally&nbsp;authorized&nbsp;USER&nbsp;does<br>
-not&nbsp;have&nbsp;rights&nbsp;to&nbsp;a&nbsp;certain&nbsp;DB,&nbsp;she's&nbsp;denied.&nbsp;&nbsp;Get&nbsp;the&nbsp;picture?<br>
-<br>
-'host','db','select','insert','update','delete','index','alter','create','dr<br>
-op','grant'<br>
-<br>
-<br>
-You&nbsp;should&nbsp;now&nbsp;have&nbsp;a&nbsp;working&nbsp;knowledge&nbsp;of&nbsp;MySQL&nbsp;grant&nbsp;tables.&nbsp;&nbsp;If&nbsp;there&nbsp;is<br>
-anything&nbsp;I've&nbsp;left&nbsp;out&nbsp;of&nbsp;this&nbsp;answer&nbsp;that&nbsp;you&nbsp;feel&nbsp;is&nbsp;pertinent,&nbsp;or&nbsp;if&nbsp;my<br>
-instructions&nbsp;don't&nbsp;work&nbsp;for&nbsp;you,&nbsp;please&nbsp;let&nbsp;me&nbsp;know&nbsp;and&nbsp;I'll&nbsp;re-post&nbsp;this<br>
-letter&nbsp;again,&nbsp;corrected.&nbsp;&nbsp;I&nbsp;threw&nbsp;it&nbsp;together&nbsp;one&nbsp;night&nbsp;out&nbsp;of&nbsp;exasperation<br>
-for&nbsp;all&nbsp;the&nbsp;newbies&nbsp;who&nbsp;don't&nbsp;know&nbsp;squat&nbsp;about&nbsp;MySQL&nbsp;yet,&nbsp;so&nbsp;it&nbsp;is&nbsp;almost<br>
-guaranteed&nbsp;to&nbsp;have&nbsp;errors.<br>
-<br>
-Once&nbsp;again,&nbsp;you&nbsp;can't&nbsp;go&nbsp;wrong&nbsp;by&nbsp;reading&nbsp;section&nbsp;6&nbsp;of&nbsp;the&nbsp;MySQL&nbsp;manual.&nbsp;&nbsp;It<br>
-is&nbsp;more&nbsp;detailed&nbsp;than&nbsp;I!<br>
-http://www.mysql.com/Manual/manual.html.<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;</P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="dbdoc.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="patches.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->MySQL Bugzilla Database Introduction</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="database.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->Useful Patches and Utilities for Bugzilla</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/groups.html b/docs/html/groups.html
new file mode 100644
index 000000000..37d58d046
--- /dev/null
+++ b/docs/html/groups.html
@@ -0,0 +1,276 @@
+<HTML
+><HEAD
+><TITLE
+>Groups and Group Security</TITLE
+><META
+NAME="GENERATOR"
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
+"><LINK
+REL="HOME"
+TITLE="The Bugzilla Guide"
+HREF="index.html"><LINK
+REL="UP"
+TITLE="Administering Bugzilla"
+HREF="administration.html"><LINK
+REL="PREVIOUS"
+TITLE="Voting"
+HREF="voting.html"><LINK
+REL="NEXT"
+TITLE="Bugzilla Security"
+HREF="security.html"></HEAD
+><BODY
+CLASS="section"
+BGCOLOR="#FFFFFF"
+TEXT="#000000"
+LINK="#0000FF"
+VLINK="#840084"
+ALINK="#0000FF"
+><DIV
+CLASS="NAVHEADER"
+><TABLE
+SUMMARY="Header navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TH
+COLSPAN="3"
+ALIGN="center"
+>The Bugzilla Guide</TH
+></TR
+><TR
+><TD
+WIDTH="10%"
+ALIGN="left"
+VALIGN="bottom"
+><A
+HREF="voting.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="80%"
+ALIGN="center"
+VALIGN="bottom"
+>Chapter 5. Administering Bugzilla</TD
+><TD
+WIDTH="10%"
+ALIGN="right"
+VALIGN="bottom"
+><A
+HREF="security.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+></TABLE
+><HR
+ALIGN="LEFT"
+WIDTH="100%"></DIV
+><DIV
+CLASS="section"
+><H1
+CLASS="section"
+><A
+NAME="groups">5.5. Groups and Group Security</H1
+><P
+>Groups allow the administrator
+    to isolate bugs or products that should only be seen by certain people.
+    There are two types of group - Generic Groups, and Product-Based Groups.
+    </P
+><P
+>&#13;    Product-Based Groups are matched with products, and allow you to restrict
+    access to bugs on a per-product basis. They are enabled using the 
+    usebuggroups Param. Turning on the usebuggroupsentry
+    Param will mean bugs automatically get added to their product group when 
+    filed.   
+    </P
+><P
+>&#13;    Generic Groups have no special relationship to products; 
+    you create them, and put bugs in them
+    as required. One example of the use of Generic Groups 
+    is Mozilla's "Security" group,
+    into which security-sensitive bugs are placed until fixed. Only the
+    Mozilla Security Team are members of this group.
+    </P
+><P
+>To create Generic Groups:</P
+><P
+></P
+><OL
+TYPE="1"
+><LI
+><P
+>Select the "groups"
+        link in the footer.</P
+></LI
+><LI
+><P
+>Take a moment to understand the instructions on the "Edit
+        Groups" screen, then select the "Add Group" link.</P
+></LI
+><LI
+><P
+>Fill out the "New Name", "New Description", and 
+        "New User RegExp" fields. "New User RegExp" allows you to automatically
+         place all users who fulfill the Regular Expression into the new group. 
+         When you have finished, click "Add".</P
+></LI
+></OL
+><P
+>To use Product-Based Groups:</P
+><P
+></P
+><OL
+TYPE="1"
+><LI
+><P
+>Turn on "usebuggroups" and "usebuggroupsentry" in the "Edit
+        Parameters" screen.</P
+><DIV
+CLASS="warning"
+><P
+></P
+><TABLE
+CLASS="warning"
+WIDTH="100%"
+BORDER="0"
+><TR
+><TD
+WIDTH="25"
+ALIGN="CENTER"
+VALIGN="TOP"
+><IMG
+SRC="../images/warning.gif"
+HSPACE="5"
+ALT="Warning"></TD
+><TD
+ALIGN="LEFT"
+VALIGN="TOP"
+><P
+>XXX is this still true?
+          "usebuggroupsentry" has the capacity to prevent the
+          administrative user from directly altering bugs because of
+          conflicting group permissions. If you plan on using
+          "usebuggroupsentry", you should plan on restricting
+          administrative account usage to administrative duties only. In
+          other words, manage bugs with an unpriveleged user account, and
+          manage users, groups, Products, etc. with the administrative
+          account.</P
+></TD
+></TR
+></TABLE
+></DIV
+></LI
+><LI
+><P
+>In future, when you create a Product, a matching group will be
+        automatically created. If you need to add a Product Group to
+        a Product which was created before you turned on usebuggroups,
+        then simply create a new group, as outlined above, with the
+        same name as the Product.</P
+></LI
+></OL
+><DIV
+CLASS="warning"
+><P
+></P
+><TABLE
+CLASS="warning"
+WIDTH="100%"
+BORDER="0"
+><TR
+><TD
+WIDTH="25"
+ALIGN="CENTER"
+VALIGN="TOP"
+><IMG
+SRC="../images/warning.gif"
+HSPACE="5"
+ALT="Warning"></TD
+><TD
+ALIGN="LEFT"
+VALIGN="TOP"
+><P
+>Bugzilla currently has a limit of 64 groups per installation. If
+      you have more than about 50 products, you should consider
+      running multiple Bugzillas. Ask in the newsgroup for other
+      suggestions for working around this restriction.</P
+></TD
+></TR
+></TABLE
+></DIV
+><P
+>&#13;      Note that group permissions are such that you need to be a member
+      of <EM
+>all</EM
+> the groups a bug is in, for whatever
+      reason, to see that bug.
+    </P
+></DIV
+><DIV
+CLASS="NAVFOOTER"
+><HR
+ALIGN="LEFT"
+WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+><A
+HREF="voting.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="index.html"
+ACCESSKEY="H"
+>Home</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+><A
+HREF="security.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+>Voting</TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="administration.html"
+ACCESSKEY="U"
+>Up</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+>Bugzilla Security</TD
+></TR
+></TABLE
+></DIV
+></BODY
+></HTML
+>
\ No newline at end of file
diff --git a/docs/html/hintsandtips.html b/docs/html/hintsandtips.html
new file mode 100644
index 000000000..c20131bd4
--- /dev/null
+++ b/docs/html/hintsandtips.html
@@ -0,0 +1,308 @@
+<HTML
+><HEAD
+><TITLE
+>Hints and Tips</TITLE
+><META
+NAME="GENERATOR"
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
+"><LINK
+REL="HOME"
+TITLE="The Bugzilla Guide"
+HREF="index.html"><LINK
+REL="UP"
+TITLE="Using Bugzilla"
+HREF="using.html"><LINK
+REL="PREVIOUS"
+TITLE="How do I use Bugzilla?"
+HREF="how.html"><LINK
+REL="NEXT"
+TITLE="User Preferences"
+HREF="userpreferences.html"></HEAD
+><BODY
+CLASS="section"
+BGCOLOR="#FFFFFF"
+TEXT="#000000"
+LINK="#0000FF"
+VLINK="#840084"
+ALINK="#0000FF"
+><DIV
+CLASS="NAVHEADER"
+><TABLE
+SUMMARY="Header navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TH
+COLSPAN="3"
+ALIGN="center"
+>The Bugzilla Guide</TH
+></TR
+><TR
+><TD
+WIDTH="10%"
+ALIGN="left"
+VALIGN="bottom"
+><A
+HREF="how.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="80%"
+ALIGN="center"
+VALIGN="bottom"
+>Chapter 3. Using Bugzilla</TD
+><TD
+WIDTH="10%"
+ALIGN="right"
+VALIGN="bottom"
+><A
+HREF="userpreferences.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+></TABLE
+><HR
+ALIGN="LEFT"
+WIDTH="100%"></DIV
+><DIV
+CLASS="section"
+><H1
+CLASS="section"
+><A
+NAME="hintsandtips">3.2. Hints and Tips</H1
+><P
+>This section distills some Bugzilla tips and best practices
+    that have been developed.</P
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="AEN434">3.2.1. Autolinkification</H2
+><P
+>Bugzilla comments are plain text - so posting HTML will result
+      in literal HTML tags rather than being interpreted by a browser.
+      However, Bugzilla will automatically make hyperlinks out of certain
+      sorts of text in comments. For example, the text 
+      http://www.bugzilla.org will be turned into
+      <A
+HREF="http://www.bugzilla.org"
+TARGET="_top"
+>http://www.bugzilla.org</A
+>.
+      Other strings which get linkified in the obvious manner are:
+      <P
+></P
+><TABLE
+BORDER="0"
+><TBODY
+><TR
+><TD
+>bug 12345</TD
+></TR
+><TR
+><TD
+>bug 23456, comment 53</TD
+></TR
+><TR
+><TD
+>attachment 4321</TD
+></TR
+><TR
+><TD
+>mailto:george@example.com</TD
+></TR
+><TR
+><TD
+>george@example.com</TD
+></TR
+><TR
+><TD
+>ftp://ftp.mozilla.org</TD
+></TR
+><TR
+><TD
+>Most other sorts of URL</TD
+></TR
+></TBODY
+></TABLE
+><P
+></P
+>
+      </P
+><P
+>A corollary here is that if you type a bug number in a comment,
+      you should put the word "bug" before it, so it gets autolinkified
+      for the convenience of others.
+      </P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="quicksearch">3.2.2. Quicksearch</H2
+><P
+>Quicksearch is a single-text-box query tool which uses
+      metacharacters to indicate what is to be searched. For example, typing
+      "<TT
+CLASS="filename"
+>foo|bar</TT
+>" 
+      into Quicksearch would search for "foo" or "bar" in the 
+      summary and status whiteboard of a bug; adding 
+      "<TT
+CLASS="filename"
+>:BazProduct</TT
+>" would
+      search only in that product.
+      </P
+><P
+>You'll find the Quicksearch box on Bugzilla's
+      front page, along with a 
+      <A
+HREF="../../quicksearch.html"
+TARGET="_top"
+>Help</A
+> 
+      link which details how to use it.</P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="commenting">3.2.3. Comments</H2
+><P
+>If you are changing the fields on a bug, only comment if
+      either you have something pertinent to say, or Bugzilla requires it.
+      Otherwise, you may spam people unnecessarily with bug mail.
+      To take an example: a user can set up their account to filter out messages
+      where someone just adds themselves to the CC field of a bug
+      (which happens a lot.) If you come along, add yourself to the CC field,
+      and add a comment saying "Adding self to CC", then that person
+      gets a pointless piece of mail they would otherwise have avoided.
+      </P
+><P
+>&#13;      Don't use sigs in comments. Signing your name ("Bill") is acceptable,
+      particularly if you do it out of habit, but full mail/news-style
+      four line ASCII art creations are not.
+      </P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="attachments">3.2.4. Attachments</H2
+><P
+>&#13;      Use attachments, rather than comments, for large chunks of ASCII data,
+      such as trace, debugging output files, or log files. That way, it doesn't
+      bloat the bug for everyone who wants to read it, and cause people to
+      receive fat, useless mails.
+      </P
+><P
+>Trim screenshots. There's no need to show the whole screen if
+      you are pointing out a single-pixel problem.
+      </P
+><P
+>Don't attach simple test cases (e.g. one HTML file, one 
+      CSS file and an image) as a ZIP file. Instead, upload them in 
+      reverse order and edit the referring file so that they point to the
+      attached files. This way, the test case works immediately 
+      out of the bug.
+      </P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="AEN463">3.2.5. Filing Bugs</H2
+><P
+>Try to make sure that everything said in the summary is also 
+      said in the first comment. Summaries are often updated and this will
+      ensure your original information is easily accessible.
+      </P
+><P
+>&#13;      You do not need to put "any" or similar strings in the URL field.
+      If there is no specific URL associated with the bug, leave this 
+      field blank.
+      </P
+><P
+>If you feel a bug you filed was incorrectly marked as a
+      DUPLICATE of another, please question it in your bug, not      
+      the bug it was duped to. Feel free to CC the person who duped it 
+      if they are not already CCed.
+      </P
+></DIV
+></DIV
+><DIV
+CLASS="NAVFOOTER"
+><HR
+ALIGN="LEFT"
+WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+><A
+HREF="how.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="index.html"
+ACCESSKEY="H"
+>Home</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+><A
+HREF="userpreferences.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+>How do I use Bugzilla?</TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="using.html"
+ACCESSKEY="U"
+>Up</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+>User Preferences</TD
+></TR
+></TABLE
+></DIV
+></BODY
+></HTML
+>
\ No newline at end of file
diff --git a/docs/html/how.html b/docs/html/how.html
index cad748643..6d7018a0c 100644
--- a/docs/html/how.html
+++ b/docs/html/how.html
@@ -4,7 +4,7 @@
 >How do I use Bugzilla?</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -13,13 +13,13 @@ REL="UP"
 TITLE="Using Bugzilla"
 HREF="using.html"><LINK
 REL="PREVIOUS"
-TITLE="Why Should We Use Bugzilla?"
-HREF="why.html"><LINK
+TITLE="Using Bugzilla"
+HREF="using.html"><LINK
 REL="NEXT"
-TITLE="Where can I find my user preferences?"
-HREF="init4me.html"></HEAD
+TITLE="Hints and Tips"
+HREF="hintsandtips.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -44,20 +45,22 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="why.html"
+HREF="using.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Chapter 2. Using Bugzilla</TD
+>Chapter 3. Using Bugzilla</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="init4me.html"
+HREF="hintsandtips.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,116 +69,39 @@ HREF="init4me.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="HOW"
->2.3. How do I use Bugzilla?</A
-></H1
-><TABLE
-BORDER="0"
-WIDTH="100%"
-CELLSPACING="0"
-CELLPADDING="0"
-CLASS="EPIGRAPH"
-><TR
-><TD
-WIDTH="45%"
->&nbsp;</TD
-><TD
-WIDTH="45%"
-ALIGN="LEFT"
-VALIGN="TOP"
-><I
-><P
-><I
->Hey!  I'm Woody!  Howdy, Howdy, Howdy!</I
-></P
-></I
-></TD
-></TR
-></TABLE
-><P
->      Bugzilla is a large, complex system.  Describing how to use it
-      requires some time.  If you are only interested in installing or
-      administering a Bugzilla installation, please consult the
-      Installing and Administering Bugzilla portions of this Guide.
-      This section is principally aimed towards developing end-user
-      mastery of Bugzilla, so you may fully enjoy the benefits
-      afforded by using this reliable open-source bug-tracking
-      software.
-    </P
+NAME="how">3.1. How do I use Bugzilla?</H1
 ><P
->      Throughout this portion of the Guide, we will refer to user
-      account options available at the Bugzilla test installation,
-      <A
-HREF="http://landfill.tequilarista.org/"
+>This section contains information for end-users of Bugzilla. 
+    There is a Bugzilla test installation, called 
+    <A
+HREF="http://landfill.bugzilla.org/"
 TARGET="_top"
->	landfill.tequilarista.org</A
->.
-      <DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	  Some people have run into difficulties completing this
-	  tutorial.  If you run into problems, please check the
-	  updated online documentation available at <A
-HREF="http://www.trilobyte.net/barnsons/"
-TARGET="_top"
->http://www.trilobyte.net/barnsons</A
->. If you're still stumped, please subscribe to the newsgroup and provide details of exactly what's stumping you!  If enough people complain, I'll have to fix it in the next version of this Guide.  You can subscribe to the newsgroup at <A
-HREF="news://news.mozilla.org/netscape.public.mozilla.webtools"
-TARGET="_top"
-> news://news.mozilla.org/netscape.public.mozilla.webtools</A
->
-	</P
-></TD
-></TR
-></TABLE
-></DIV
-> Although Landfill serves as a great introduction to
-      Bugzilla, it does not offer all the options you would have as a
-      user on your own installation of Bugzilla, nor can it do more
-      than serve as a general introduction to Bugzilla.  Additionally,
-      Landfill often runs cutting-edge versions of Bugzilla for
-      testing, so some things may work slightly differently than
-      mentioned here.
-    </P
+>Landfill</A
+>, 
+    which you are welcome to play with (if it's up.) 
+    However, it does not necessarily
+    have all Bugzilla features enabled, and often runs cutting-edge versions
+    of Bugzilla for testing, so some things may work slightly differently
+    than mentioned here.</P
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="MYACCOUNT"
->2.3.1. Create a Bugzilla Account</A
-></H2
+NAME="myaccount">3.1.1. Create a Bugzilla Account</H2
 ><P
->	First things first!  If you want to use Bugzilla, first you
-	need to create an account.  Consult with the administrator
-	responsible for your installation of Bugzilla for the URL you
-	should use to access it. If you're test-driving the end-user
-	Bugzilla experience, use this URL: <A
-HREF="http://landfill.tequilarista.org/bugzilla-tip/"
+>If you want to use Bugzilla, first you need to create an account.
+      Consult with the administrator responsible for your installation of
+      Bugzilla for the URL you should use to access it. If you're
+      test-driving Bugzilla, use this URL: 
+      <A
+HREF="http://landfill.bugzilla.org/bugzilla-tip/"
 TARGET="_top"
-> http://landfill.tequilarista.org/bugzilla-tip/</A
+>&#13;      http://landfill.bugzilla.org/bugzilla-tip/</A
 >
       </P
 ><P
@@ -184,631 +110,413 @@ TARGET="_top"
 TYPE="1"
 ><LI
 ><P
->	    Click the "Open a new Bugzilla account" link.
-	  </P
-></LI
-><LI
-><P
->	    Enter your "E-mail address" and "Real Name" (or whatever
-	    name you want to call yourself) in the spaces provided,
-	    then select the "Create Account" button.
-	  </P
+>Click the 
+          <SPAN
+CLASS="QUOTE"
+>"Open a new Bugzilla account"</SPAN
+>
+
+          link, enter your email address and, optionally, your name in the
+          spaces provided, then click 
+          <SPAN
+CLASS="QUOTE"
+>"Create Account"</SPAN
+>
+
+          .</P
 ></LI
 ><LI
 ><P
->	    Within moments, you should receive an email to the address
-	    you provided above, which contains your login name
-	    (generally the same as the email address), and a password
-	    you can use to access your account.  This password is
-	    randomly generated, and should be changed at your nearest
-	    opportunity (we'll go into how to do it later).
-	  </P
+>Within moments, you should receive an email to the address
+          you provided above, which contains your login name (generally the
+          same as the email address), and a password you can use to access
+          your account. This password is randomly generated, and can be
+          changed to something more memorable.</P
 ></LI
 ><LI
 ><P
->	    Click the <SPAN
+>Click the 
+          <SPAN
 CLASS="QUOTE"
 >"Log In"</SPAN
-> link in the yellow area at
-	    the bottom of the page in your browser, then enter your
-	    <SPAN
-CLASS="QUOTE"
->"E-mail address"</SPAN
-> and <SPAN
-CLASS="QUOTE"
->"Password"</SPAN
 >
-	    you just received into the spaces provided, and select
-	    <SPAN
+          link in the yellow area at the bottom of the page in your browser,
+          enter your email address and password into the spaces provided, and
+          click 
+          <SPAN
 CLASS="QUOTE"
 >"Login"</SPAN
 >.
-	    <DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="90%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->		If you ever forget your password, you can come back to
-		this page, enter your <SPAN
-CLASS="QUOTE"
->"E-mail address"</SPAN
->,
-		then select the <SPAN
-CLASS="QUOTE"
->"E-mail me a password"</SPAN
->
-		button to have your password mailed to you again so
-		that you can login.
-	      </P
-></TD
-></TR
-></TABLE
-></DIV
->
-	    <DIV
-CLASS="CAUTION"
-><P
-></P
-><TABLE
-CLASS="CAUTION"
-WIDTH="90%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/caution.gif"
-HSPACE="5"
-ALT="Caution"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->		Many modern browsers include an
-		<SPAN
-CLASS="QUOTE"
->"Auto-Complete"</SPAN
-> or <SPAN
-CLASS="QUOTE"
->"Form
-		  Fill"</SPAN
-> feature to remember the user names and
-		passwords you type in at many sites.  Unfortunately,
-		sometimes they attempt to guess what you will put in
-		as your password, and guess wrong.  If you notice a
-		text box is already filled out, please overwrite the
-		contents of the text box so you can be sure to input
-		the correct information.
-	      </P
-></TD
-></TR
-></TABLE
-></DIV
->
-	  </P
+          </P
 ></LI
 ></OL
 ><P
->	Congratulations!  If you followed these directions, you now
-	are the proud owner of a user account on
-	landfill.tequilarista.org (Landfill) or your local Bugzilla
-	install.  You should now see in your browser a page called the
-	<SPAN
-CLASS="QUOTE"
->"Bugzilla Query Page"</SPAN
->.  It may look daunting, but with this
-	Guide to walk you through it, you will master it in no time.
-      </P
+>You are now logged in. Bugzilla uses cookies for authentication
+      so, unless your IP address changes, you should not have to log in
+      again.</P
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="QUERY"
->2.3.2. The Bugzilla Query Page</A
-></H2
+NAME="bug_page">3.1.2. Anatomy of a Bug</H2
 ><P
->	The Bugzilla Query Page is the heart and soul of the Bugzilla
-	user experience.  It is the master interface where you can
-	find any bug report, comment, or patch currently in the
-	Bugzilla system.  We'll go into how to create your own bug
-	report later on.
-      </P
-><P
->	There are efforts underway to simplify query usage.  If you
-	have a local installation of Bugzilla 2.12 or higher, you
-	should have <TT
-CLASS="FILENAME"
->quicksearch.html</TT
-> available to
-	use and simplify your searches.  There is also a helper for
-	the query interface, called
-	<TT
-CLASS="FILENAME"
->queryhelp.cgi</TT
->.  Landfill tends to run the
-	latest code, so these two utilities should be available there
-	for your perusal.
-      </P
-><P
->	At this point, please visit the main Bugzilla site,
-	<A
-HREF="http://bugzilla.mozilla.org/query.cgi"
+>The core of Bugzilla is the screen which displays a particular
+      bug. It's a good place to explain some Bugzilla concepts. 
+      <A
+HREF="http://landfill.bugzilla.org/bugzilla-tip/show_bug.cgi?id=1"
 TARGET="_top"
->	bugzilla.mozilla.org</A
->, to see a more fleshed-out query page.
-      </P
-><P
->	The first thing you need to notice about the Bugzilla Query
-	Page is that nearly every box you see on your screen has a
-	hyperlink nearby, explaining what it is or what it does.  Near
-	the upper-left-hand corner of your browser window you should
-	see the word <SPAN
-CLASS="QUOTE"
->"Status"</SPAN
-> underlined.  Select it.
-      </P
-><P
->	Notice the page that popped up?  Every underlined word you see
-	on your screen is a hyperlink that will take you to
-	context-sensitive help. Click around for a while, and learn
-	what everything here does.  To return to the query interface
-	after pulling up a help page, use the <SPAN
-CLASS="QUOTE"
->"Back"</SPAN
+>&#13;      Bug 1 on Landfill</A
 >
-	button in your browser.
-      </P
-><P
->	I'm sure that after checking out the online help, you are now
-	an expert on the Bugzilla Query Page.  If, however, you feel
-	you haven't mastered it yet, let me walk you through making a
-	few successful queries to find out what there are in the
-	Bugzilla bug-tracking system itself.
-      </P
+
+      is a good example. Note that the labels for most fields are hyperlinks;
+      clicking them will take you to context-sensitive help on that
+      particular field. Fields marked * may not be present on every
+      installation of Bugzilla.</P
 ><P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->	    Ensure you are back on the <SPAN
-CLASS="QUOTE"
->"Bugzilla Query
-	      Page"</SPAN
->. Do nothing in the boxes marked "Status",
-	    "Resolution", "Platform", "OpSys", "Priority", or
-	    "Severity".  The default query for "Status" is to find all
-	    bugs that are NEW, ASSIGNED, or REOPENED, which is what we
-	    want.  If you don't select anything in the other 5
-	    scrollboxes there, then you are saying that "any of these
-	    are OK"; we're not locking ourselves into only finding
-	    bugs on the "DEC" Platform, or "Windows 95" OpSys
-	    (Operating System).  You're smart, I think you have it
-	    figured out.
-	  </P
-><P
->	    Basically, selecting <EM
->anything</EM
-> on the
-	    query page narrows your search down.  Leaving stuff
-	    unselected, or text boxes unfilled, broadens your search.
-	  </P
-></LI
-><LI
-><P
->	    You see the box immediately below the top six boxes that
-	    contains an "Email" text box,  with the words "matching
-	    as", a drop-down selection box, then some checkboxes with
-	    "Assigned To" checked by default?  This allows you to
-	    filter your search down based upon email address.  Let's
-	    put my email address in there, and see what happens.
-	  </P
-><P
->	    Type "barnboy@trilobyte.net" in the top Email text box.
-	  </P
-></LI
-><LI
-><P
->	    Let's narrow the search some more.  Scroll down until you
-	    find the box with the word "Program" over the top of it.
-	    This is where we can narrow our search down to only
-	    specific products (software programs or product lines) in
-	    our Bugzilla database. Please notice the box is a
-	    <EM
->scrollbox</EM
->.  Using the down arrow on
-	    the scrollbox, scroll down until you can see an entry
-	    called "Bugzilla".  Select this entry.
-	  </P
-></LI
-><LI
-><P
->	    Did you notice that some of the boxes to the right changed
-	    when you selected "Bugzilla"? Every Program (or Product)
-	    has different Versions, Components, and Target Milestones
-	    associated with it.  A "Version" is the number of a
-	    software program.
-	    <DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN307"
-></A
-><P
-><B
->Example 2-1. Some Famous Software Versions</B
-></P
-><DIV
-CLASS="INFORMALEXAMPLE"
-><A
-NAME="AEN309"
-></A
-><P
-></P
-><P
->		  Do you remember the hype in 1995 when Microsoft
-		  Windows 95(r) was released? It may have been several
-		  years ago, but Microsoft(tm) spent over $300 Million
-		  advertising this new Version of their software.
-		  Three years later, they released Microsoft Windows
-		  98(r), another new version, to great fanfare, and
-		  then in 2000 quietly  released Microsoft Windows
-		  ME(Millenium Edition)(r). 
-		</P
-><P
->		  Software "Versions" help a manufacturer
-		  differentiate their current product from their
-		  previous products.  Most do not identify their
-		  products by the year they were released. Instead,
-		  the "original" version of their software will often
-		  be numbered "1.0", with small bug-fix releases on
-		  subsequent tenths of a digit.  In most cases, it's
-		  not a decimal number; for instance, often 1.9 is an
-		  <EM
->older</EM
-> version of the software
-		  than 1.11, but is a <EM
->newer</EM
->
-		  version than 1.1.1.
-		</P
-><P
->		  In general, a "Version" in Bugzilla should refer to
-		  <EM
->released</EM
-> products, not products
-		  that have not yet been released  to the public.
-		  Forthcoming products are what the Target Milestone
-		  field is for.
-		</P
-><P
-></P
-></DIV
-></DIV
->
-	  </P
-><P
->	    A "Component" is a piece of a Product.
-	    It may be a standalone program, or some other logical
-	    division of a Product or Program. 
-	    Normally, a Component has a single Owner, who is responsible
-	    for overseeing efforts to improve that Component.
-	    <DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN317"
-></A
-><P
-><B
->Example 2-2. Mozilla's Bugzilla Components</B
-></P
-><DIV
-CLASS="INFORMALEXAMPLE"
-><A
-NAME="AEN319"
-></A
-><P
-></P
-><P
->		  Mozilla's "Bugzilla" Product is composed of several pieces (Components):
-		  <P
+>&#13;          <EM
+>Product and Component</EM
+>: 
+          Bugs are divided up by Product and Component, with a Product
+          having one or more Components in it. For example,
+          bugzilla.mozilla.org's "Bugzilla" Product is composed of several
+          Components: 
+          <P
 ></P
 ><TABLE
 BORDER="0"
 ><TBODY
 ><TR
 ><TD
-><EM
->Administration</EM
->,
-                      Administration of a bugzilla installation, including 
-                      <TT
-CLASS="FILENAME"
->editcomponents.cgi</TT
->,
-                      <TT
-CLASS="FILENAME"
->editgroups.cgi</TT
->, 
-                      <TT
-CLASS="FILENAME"
->editkeywords.cgi</TT
->, 
-                      <TT
-CLASS="FILENAME"
->editparams.cgi</TT
->,
-                      <TT
-CLASS="FILENAME"
->editproducts.cgi</TT
->,
-                      <TT
-CLASS="FILENAME"
->editusers.cgi</TT
->,
-                      <TT
-CLASS="FILENAME"
->editversions.cgi,</TT
-> and
-                      <TT
-CLASS="FILENAME"
->sanitycheck.cgi</TT
->.
-                    </TD
+>&#13;          <EM
+>Administration:</EM
+>
+          Administration of a Bugzilla installation.</TD
 ></TR
 ><TR
 ><TD
-><EM
->Bugzilla-General</EM
->,
-                      Anything that doesn't fit in the other components, or spans
-                      multiple components.
-                    </TD
+>&#13;          <EM
+>Bugzilla-General:</EM
+>
+          Anything that doesn't fit in the other components, or spans
+          multiple components.</TD
 ></TR
 ><TR
 ><TD
-><EM
->Creating/Changing Bugs</EM
->,
-                      Creating, changing, and viewing bugs.
-                      <TT
-CLASS="FILENAME"
->enter_bug.cgi</TT
->,
-                      <TT
-CLASS="FILENAME"
->post_bug.cgi</TT
->,
-                      <TT
-CLASS="FILENAME"
->show_bug.cgi</TT
-> and
-                      <TT
-CLASS="FILENAME"
->process_bug.cgi</TT
->.
-                    </TD
+>&#13;          <EM
+>Creating/Changing Bugs:</EM
+>
+          Creating, changing, and viewing bugs.</TD
 ></TR
 ><TR
 ><TD
-><EM
->Documentation</EM
->,
-                      The bugzilla documentation, including anything in the
-                      <TT
-CLASS="FILENAME"
->docs/</TT
-> directory and The Bugzilla Guide
-                      (This document :)
-                    </TD
+>&#13;          <EM
+>Documentation:</EM
+>
+          The Bugzilla documentation, including The Bugzilla Guide.</TD
 ></TR
 ><TR
 ><TD
-><EM
->Email</EM
->,
-                      Anything to do with email sent by Bugzilla.
-                      <TT
-CLASS="FILENAME"
->processmail</TT
+>&#13;          <EM
+>Email:</EM
 >
-                    </TD
+          Anything to do with email sent by Bugzilla.</TD
 ></TR
 ><TR
 ><TD
-><EM
->Installation</EM
->,
-                      The installation process of Bugzilla. This includes
-                      <TT
-CLASS="FILENAME"
->checksetup.pl</TT
-> and whatever else it evolves into.
-                    </TD
+>&#13;          <EM
+>Installation:</EM
+>
+          The installation process of Bugzilla.</TD
 ></TR
 ><TR
 ><TD
-><EM
->Query/Buglist</EM
->,
-                      Anything to do with searching for bugs and viewing the buglists.
-                      <TT
-CLASS="FILENAME"
->query.cgi</TT
-> and
-                      <TT
-CLASS="FILENAME"
->buglist.cgi</TT
+>&#13;          <EM
+>Query/Buglist:</EM
 >
-                    </TD
+          Anything to do with searching for bugs and viewing the
+          buglists.</TD
 ></TR
 ><TR
 ><TD
-><EM
->Reporting/Charting</EM
->,
-                      Getting reports from Bugzilla.
-                      <TT
-CLASS="FILENAME"
->reports.cgi</TT
-> and
-                      <TT
-CLASS="FILENAME"
->duplicates.cgi</TT
+>&#13;          <EM
+>Reporting/Charting:</EM
 >
-                    </TD
+          Getting reports from Bugzilla.</TD
 ></TR
 ><TR
 ><TD
-><EM
->User Accounts</EM
->,
-                      Anything about managing a user account from the user's perspective.
-                      <TT
-CLASS="FILENAME"
->userprefs.cgi</TT
->, saved queries, creating accounts,
-                      changing passwords, logging in, etc. 
-                    </TD
+>&#13;          <EM
+>User Accounts:</EM
+>
+          Anything about managing a user account from the user's perspective.
+          Saved queries, creating accounts, changing passwords, logging in,
+          etc.</TD
 ></TR
 ><TR
 ><TD
-><EM
->User Interface</EM
->,
-                      General issues having to do with the user interface cosmetics (not
-                      functionality) including cosmetic issues, HTML templates, etc.
-                    </TD
+>&#13;          <EM
+>User Interface:</EM
+>
+          General issues having to do with the user interface cosmetics (not
+          functionality) including cosmetic issues, HTML templates,
+          etc.</TD
 ></TR
 ></TBODY
 ></TABLE
 ><P
 ></P
 >
-		</P
+          </P
+></LI
+><LI
 ><P
-></P
-></DIV
-></DIV
+>&#13;          <EM
+>Status and Resolution:</EM
 >
-	  </P
+
+          These define exactly what state the bug is in - from not even
+          being confirmed as a bug, through to being fixed and the fix
+          confirmed by Quality Assurance. The different possible values for
+          Status and Resolution on your installation should be documented in the
+          context-sensitive help for those items.</P
+></LI
+><LI
 ><P
->	    A "Milestone", or "Target Milestone" is a often a planned
-	    future "Version" of a product.  In many cases, though,
-	    Milestones simply represent significant dates for a
-	    developer.  Having certain features in your Product is
-	    frequently tied to revenue (money) the developer will
-	    receive if the features work by the time she  reaches the
-	    Target Milestone. Target Milestones are a great tool to
-	    organize your time. If someone will pay you $100,000 for
-	    incorporating certain features by a certain date, those
-	    features by that Milestone date become a very high
-	    priority.  Milestones tend to be highly malleable
-	    creatures, though, that appear to be in reach but are out
-	    of reach by the time the important day arrives.
-	  </P
+>&#13;          <EM
+>Assigned To:</EM
+>
+          The person responsible for fixing the bug.</P
+></LI
+><LI
 ><P
->	    The Bugzilla Project has set up Milestones for future
-	    Bugzilla versions 2.14, 2.16, 2.18, 3.0, etc.  However, a
-	    Target Milestone can just as easily be a specific date,
-	    code name, or weird alphanumeric combination, like "M19".
-	  </P
+>&#13;          <EM
+>*URL:</EM
+>
+          A URL associated with the bug, if any.</P
 ></LI
 ><LI
 ><P
->	    OK, now let's select the "Bugzilla" component from its scrollbox.
-	  </P
+>&#13;          <EM
+>Summary:</EM
+>
+          A one-sentence summary of the problem.</P
+></LI
+><LI
+><P
+>&#13;          <EM
+>*Status Whiteboard:</EM
+>
+          (a.k.a. Whiteboard) A free-form text area for adding short notes
+          and tags to a bug.</P
+></LI
+><LI
+><P
+>&#13;          <EM
+>*Keywords:</EM
+>
+          The administrator can define keywords which you can use to tag and
+          categorise bugs - e.g. The Mozilla Project has keywords like crash
+          and regression.</P
+></LI
+><LI
+><P
+>&#13;          <EM
+>Platform and OS:</EM
+>
+          These indicate the computing environment where the bug was
+          found.</P
+></LI
+><LI
+><P
+>&#13;          <EM
+>Version:</EM
+>
+          The "Version" field is usually used for versions of a product which
+          have been released, and is set to indicate which versions of a
+          Component have the particular problem the bug report is
+          about.</P
+></LI
+><LI
+><P
+>&#13;          <EM
+>Priority:</EM
+>
+          The bug assignee uses this field to prioritise his or her bugs.
+          It's a good idea not to change this on other people's bugs.</P
+></LI
+><LI
+><P
+>&#13;          <EM
+>Severity:</EM
+>
+          This indicates how severe the problem is - from blocker
+          ("application unusable") to trivial ("minor cosmetic issue"). You
+          can also use this field to indicate whether a bug is an enhancement
+          request.</P
+></LI
+><LI
+><P
+>&#13;          <EM
+>*Target:</EM
+>
+          (a.k.a. Target Milestone) A future version by which the bug is to
+          be fixed. e.g. The Bugzilla Project's milestones for future
+          Bugzilla versions are 2.18, 2.20, 3.0, etc. Milestones are not
+          restricted to numbers, thought - you can use any text strings, such
+          as dates.</P
+></LI
+><LI
+><P
+>&#13;          <EM
+>Reporter:</EM
+>
+          The person who filed the bug.</P
+></LI
+><LI
+><P
+>&#13;          <EM
+>CC list:</EM
+>
+          A list of people who get mail when the bug changes.</P
+></LI
+><LI
+><P
+>&#13;          <EM
+>Attachments:</EM
+>
+          You can attach files (e.g. testcases or patches) to bugs. If there
+          are any attachments, they are listed in this section.</P
+></LI
+><LI
+><P
+>&#13;          <EM
+>*Dependencies:</EM
+>
+          If this bug cannot be fixed unless other bugs are fixed (depends
+          on), or this bug stops other bugs being fixed (blocks), their
+          numbers are recorded here.</P
 ></LI
 ><LI
 ><P
->	    Skip down the page a bit -- do you see the "submit query" button?
-	    Select it, and let's run
-	    this query!
-	  </P
+>&#13;          <EM
+>*Votes:</EM
+>
+          Whether this bug has any votes.</P
 ></LI
 ><LI
 ><P
->	    Congratulations!  You've completed your first Query, and
-	    have before you the Bug List of the author of this Guide,
-	    Matthew P. Barnson (barnboy@trilobyte.net).  If I'm doing
-	    well, you'll have a cryptic "Zarro Boogs Found" message on
-	    your screen.  It is just a happy hacker's way of saying
-	    "Zero Bugs Found".  However, I am fairly certain I will
-	    always have some bugs assigned to me that aren't done yet,
-	    so you won't often see that message!
-	  </P
+>&#13;          <EM
+>Additional Comments:</EM
+>
+          You can add your two cents to the bug discussion here, if you have
+          something worthwhile to say.</P
 ></LI
 ></OL
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="query">3.1.3. Searching for Bugs</H2
 ><P
->	I encourage you to click the bug numbers in the left-hand
-	column and examine my bugs.  Also notice that if you click the
-	underlined  links near the top of this page, they do not take
-	you to context-sensitive help here, but instead sort the
-	columns of bugs on the screen! When you need to sort your bugs
-	by priority, severity, or the people they are assigned to,
-	this is a tremendous timesaver.
-      </P
+>The Bugzilla Search page is is the interface where you can find
+      any bug report, comment, or patch currently in the Bugzilla system. You
+      can play with it here: 
+      <A
+HREF="http://landfill.bugzilla.org/bugzilla-tip/query.cgi"
+TARGET="_top"
+>&#13;      landfill.bugzilla.org/bugzilla-tip/query.cgi</A
+>
+
+      .</P
+><P
+>The Search page has controls for selecting different possible
+      values for all of the fields in a bug, as described above. Once you've
+      defined a search, you can either run it, or save it as a Remembered
+      Query, which can optionally appear in the footer of your pages.</P
 ><P
->	A couple more interesting things about the Bug List page:
-	<P
+>Highly advanced querying is done using Boolean Charts, which have
+      their own 
+      <A
+HREF="http://landfill.bugzilla.org/bugzilla-tip/booleanchart.html"
+TARGET="_top"
+>&#13;      context-sensitive help</A
+>
+
+      .</P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="list">3.1.4. Bug Lists</H2
+><P
+>If you run a search, a list of matching bugs will be returned.
+      The default search is to return all open bugs on the system - don't try
+      running this search on a Bugzilla installation with a lot of
+      bugs!</P
+><P
+>The format of the list is configurable. For example, it can be
+      sorted by clicking the column headings. Other useful features can be
+      accessed using the links at the bottom of the list: 
+      <P
 ></P
 ><TABLE
 BORDER="0"
 ><TBODY
 ><TR
 ><TD
-><EM
->Change Columns</EM
->: by selecting
-	    this link, you can show all kinds of information in the
-	    Bug List</TD
+>&#13;        <EM
+>Long Format:</EM
+>
+
+        this gives you a large page with a non-editable summary of the fields
+        of each bug.</TD
 ></TR
 ><TR
 ><TD
-><EM
->Change several bugs at once</EM
->: If
-	    you have sufficient rights to change all the bugs shown in
-	    the Bug List, you can mass-modify them. This is a big
-	    time-saver.</TD
+>&#13;        <EM
+>Change Columns:</EM
+>
+
+        change the bug attributes which appear in the list.</TD
 ></TR
 ><TR
 ><TD
-><EM
->Send mail to bug owners</EM
->: If you
-	    have many related bugs, you can request an update from
-	    every person who owns the bugs in the Bug List asking them
-	    the status.</TD
+>&#13;        <EM
+>Change several bugs at once:</EM
+>
+
+        If your account is sufficiently empowered, you can make the same
+        change to all the bugs in the list - for example, changing their
+        owner.</TD
 ></TR
 ><TR
 ><TD
-><EM
->Edit this query</EM
->: If you didn't
-	    get exactly the results you were looking for, you can
-	    return to the Query page through this link and make small
-	    revisions to the query you just made so you get more
-	    accurate results.</TD
+>&#13;        <EM
+>Send mail to bug owners:</EM
+>
+
+        Sends mail to the owners of all bugs on the list.</TD
+></TR
+><TR
+><TD
+>&#13;        <EM
+>Edit this query:</EM
+>
+
+        If you didn't get exactly the results you were looking for, you can
+        return to the Query page through this link and make small revisions
+        to the query you just made so you get more accurate results.</TD
 ></TR
 ></TBODY
 ></TABLE
@@ -816,267 +524,64 @@ BORDER="0"
 ></P
 >
       </P
-><DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	  There are many more options to the Bugzilla Query Page  and
-	  the Bug List than I have shown you. But this should be
-	  enough for you to learn to get around. I encourage you to
-	  check out the <A
-HREF="http://www.mozilla.org/bugs/"
-TARGET="_top"
->Bugzilla Home Page</A
-> to learn about the Anatomy and Life Cycle of a Bug before continuing.
-	</P
-></TD
-></TR
-></TABLE
-></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="BUGREPORTS"
->2.3.3. Creating and Managing Bug Reports</A
-></H2
-><TABLE
-BORDER="0"
-WIDTH="100%"
-CELLSPACING="0"
-CELLPADDING="0"
-CLASS="EPIGRAPH"
-><TR
-><TD
-WIDTH="45%"
->&nbsp;</TD
-><TD
-WIDTH="45%"
-ALIGN="LEFT"
-VALIGN="TOP"
-><I
+NAME="bugreports">3.1.5. Filing Bugs</H2
 ><P
-><I
->And all this time, I thought we were taking bugs <EM
->out</EM
->...</I
-></P
-></I
-></TD
-></TR
-></TABLE
-><DIV
-CLASS="SECTION"
-><H3
-CLASS="SECTION"
-><A
-NAME="BUG_WRITING"
->2.3.3.1. Writing a Great Bug Report</A
-></H3
-><P
->	  Before we plunge into writing your first bug report, I
-	  encourage you to read some bug-writing guidelines.  If you
-	  are reading this document as part of a Bugzilla CVS checkout
-	  or un-tarred Bugzilla distribution, you should be able to
-	  read them by clicking <A
-HREF="../../bugwritinghelp.html"
-TARGET="_top"
->here</A
->.  If you are reading this online, check out the Mozilla.org bug-writing guidelines at <A
-HREF="http://www.mozilla.org/quality/bug-writing-guidelines.html"
-TARGET="_top"
->http://www.mozilla.org/quality/bug-writing-guidelines.html</A
->.  While some of the advice is Mozilla-specific, the basic principles of reporting Reproducible, Specific bugs, isolating the Product you are using, the Version of the Product, the Component which failed, the Hardware Platform, and Operating System you were using at the time of the failure go a long way toward ensuring accurate, responsible fixes for the bug that bit you.
-	</P
-><P
->	  While you are at it, why not learn how to find previously
-	  reported bugs?  Mozilla.org has published a great tutorial
-	  on finding duplicate bugs, available at <A
-HREF="http://www.mozilla.org/quality/help/beginning-duplicate-finding.html"
+>Years of bug writing experience has been distilled for your
+      reading pleasure into the 
+      <A
+HREF="http://landfill.bugzilla.org/bugzilla-tip/bugwritinghelp.html"
 TARGET="_top"
-> http://www.mozilla.org/quality/help/beginning-duplicate-finding.html</A
->.
-	</P
+>&#13;      Bug Writing Guidelines</A
+>. 
+      While some of the advice is Mozilla-specific, the basic principles of
+      reporting Reproducible, Specific bugs, isolating the Product you are
+      using, the Version of the Product, the Component which failed, the
+      Hardware Platform, and Operating System you were using at the time of
+      the failure go a long way toward ensuring accurate, responsible fixes
+      for the bug that bit you.</P
 ><P
->	  I realize this was a lot to read.  However, understanding
-	  the mentality of writing great bug reports will help us on
-	  the next part!
-	</P
+>The procedure for filing a test bug is as follows:</P
 ><P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->	      Go back to <A
-HREF="http://landfill.tequilarista.org/bugzilla-tip/"
+>Go to 
+          <A
+HREF="http://landfill.bugzilla.org/bugzilla-tip/"
 TARGET="_top"
-> http://landfill.tequilarista.org/bugzilla-tip/</A
-> in your browser.
-	    </P
-></LI
-><LI
-><P
->	      Select the  <A
-HREF="http://landfill.tequilarista.org/bugzilla-tip/enter_bug.cgi"
+>&#13;          Landfill</A
+>
+          in your browser and click 
+          <A
+HREF="http://landfill.bugzilla.org/bugzilla-tip/enter_bug.cgi"
 TARGET="_top"
-> Enter a new bug report</A
-> link.
-	    </P
-></LI
-><LI
-><P
->	      Select a product.
-	    </P
-></LI
-><LI
-><P
->	      Now you should be at the "Enter Bug" form. The
-	      "reporter" should have been automatically filled out for
-	      you (or else Bugzilla prompted you to Log In again --
-	      you did keep the email with your username and password,
-	      didn't you?).
-	    </P
-></LI
-><LI
-><P
->	      Select a Component in the scrollbox.
-	    </P
-></LI
-><LI
-><P
->	      Bugzilla should have made reasonable guesses, based upon
-	      your browser, for the "Platform" and "OS" drop-down
-	      boxes.  If those are wrong, change them -- if you're on
-	      an SGI box running IRIX, we want to know!
-	    </P
-></LI
-><LI
-><P
->	      Fill in the "Assigned To" box with the email address you
-	      provided earlier.  This way you don't end up sending
-	      copies of your bug to lots of other people, since it's
-	      just a test bug.
-	    </P
-></LI
-><LI
-><P
->	      Leave the "CC" text box blank.  Fill in the "URL" box
-	      with "http://www.mozilla.org".
-	    </P
+>&#13;          Enter a new bug report</A
+>.
+          </P
 ></LI
 ><LI
 ><P
->	      Enter "The Bugzilla Guide" in the Summary text box, and
-	      place any comments you have on this tutorial, or the
-	      Guide in general, into the Description box.
-	    </P
+>Select a product - any one will do.</P
 ></LI
-></OL
-><P
->	  Voila!  Select "Commit" and send in your bug report! Next
-	  we'll look at resolving bugs.
-	</P
-></DIV
-><DIV
-CLASS="SECTION"
-><H3
-CLASS="SECTION"
-><A
-NAME="BUG_MANAGE"
->2.3.3.2. Managing your Bug Reports</A
-></H3
-><P
->	  OK, you should have a link to the bug you just created near
-	  the top of your page. It should say "Bug XXXX posted", with
-	  a link to the right saying "Back to BUG# XXXX". Select this
-	  link.
-	</P
-><P
-></P
-><OL
-TYPE="1"
 ><LI
 ><P
->	      Scroll down a bit on the subsequent page, until you see
-	      the "Resolve bug, changing resolution to (dropdown box).
-	      Normally, you would "Accept bug (change status to
-	      ASSIGNED)", fix it, and then resolve. But in this case,
-	      we're going to short-circuit the process because this
-	      wasn't a real bug. Change the dropdown next to "Resolve
-	      Bug" to "INVALID", make sure the radio button is marked
-	      next to "Resolve Bug", then click "Commit".
-	    </P
+>Fill in the fields. Bugzilla should have made reasonable
+          guesses, based upon your browser, for the "Platform" and "OS"
+          drop-down boxes. If they are wrong, change them.</P
 ></LI
 ><LI
 ><P
->	      Hey!  It said it couldn't take the change in a big red
-	      box! That's right, you must specify a Comment in order
-	      to make this change.  Select the "Back" button in your
-	      browser, add a Comment, then try Resolving the bug with
-	      INVALID status again. This time it should work.
-	    </P
+>Select "Commit" and send in your bug report.</P
 ></LI
 ></OL
-><P
->	  You have now learned the basics of Bugzilla navigation,
-	  entering a bug, and bug maintenance. I encourage you to
-	  explore these features, and see what you can do with them!
-	  We'll spend no more time on individual Bugs or Queries from
-	  this point on, so you are on your own there.
-	</P
-><P
->	  But I'll give a few last hints!
-	</P
-><P
->	  There is a <A
-HREF="http://bugzilla.mozilla.org/help.html"
-TARGET="_top"
->CLUE</A
-> on the Query page that will teach you more how to use the form.
-	</P
-><P
->	  If you click the hyperlink on the <A
-HREF="http://bugzilla.mozilla.org/describecomponents.cgi"
-TARGET="_top"
->Component</A
-> box of the Query page, you will be presented a form that will describe what all the components are.
-	</P
-><P
->	  Possibly the most powerful feature of the Query page is the
-	  <A
-HREF="http://bugzilla.mozilla.org/booleanchart.html"
-TARGET="_top"
->Boolean Chart</A
-> section. It's a bit confusing to use the first time, but can provide unparalleled flexibility in your queries, allowing you to build extremely powerful requests.
-	</P
-><P
->	  Finally, you can build some nifty  <A
-HREF="http://bugzilla.mozilla.org/reports.cgi"
-TARGET="_top"
->Reports</A
-> using the "Bug Reports" link near the bottom of the query page, and also available via the "Reports" link at the footer of each page.
-	</P
-></DIV
 ></DIV
 ></DIV
 ><DIV
@@ -1084,6 +589,7 @@ CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -1094,7 +600,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="why.html"
+HREF="using.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -1103,6 +610,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -1110,7 +618,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="init4me.html"
+HREF="hintsandtips.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -1119,20 +628,21 @@ HREF="init4me.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->Why Should We Use Bugzilla?</TD
+>Using Bugzilla</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
 VALIGN="top"
 ><A
 HREF="using.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->Where can I find my user preferences?</TD
+>Hints and Tips</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/index.html b/docs/html/index.html
index 2e51ca844..51024b628 100644
--- a/docs/html/index.html
+++ b/docs/html/index.html
@@ -4,7 +4,7 @@
 >The Bugzilla Guide</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="NEXT"
 TITLE="About This Guide"
@@ -28,7 +28,7 @@ CONTENT="Mozilla"><META
 NAME="KEYWORD"
 CONTENT="webtools"></HEAD
 ><BODY
-CLASS="BOOK"
+CLASS="book"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -37,180 +37,43 @@ ALINK="#0000FF"
 ><DIV
 CLASS="BOOK"
 ><A
-NAME="INDEX"
-></A
-><DIV
+NAME="index"><DIV
 CLASS="TITLEPAGE"
 ><H1
-CLASS="TITLE"
+CLASS="title"
 ><A
-NAME="AEN2"
->The Bugzilla Guide</A
-></H1
+NAME="AEN2">The Bugzilla Guide</H1
 ><H3
-CLASS="AUTHOR"
+CLASS="author"
 ><A
-NAME="AEN27"
->Matthew P. Barnson</A
-></H3
-><DIV
-CLASS="AFFILIATION"
-><DIV
-CLASS="ADDRESS"
-><P
-CLASS="ADDRESS"
->barnboy@trilobyte.net</P
-></DIV
-></DIV
-><SPAN
-CLASS="COLLAB"
-><SPAN
-CLASS="COLLABNAME"
->Zach Lipton</SPAN
-><DIV
-CLASS="AFFILIATION"
-><DIV
-CLASS="ADDRESS"
-><P
-CLASS="ADDRESS"
->zach AT zachlipton DOT com</P
-></DIV
-></DIV
-><BR></SPAN
-><DIV
-CLASS="REVHISTORY"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-><TR
-><TH
-ALIGN="LEFT"
-VALIGN="TOP"
-COLSPAN="3"
-><B
->Revision History</B
-></TH
-></TR
-><TR
-><TD
-ALIGN="LEFT"
->Revision v2.11</TD
-><TD
-ALIGN="LEFT"
->20 December 2000</TD
-><TD
-ALIGN="LEFT"
->Revised by: MPB</TD
-></TR
-><TR
-><TD
-ALIGN="LEFT"
-COLSPAN="3"
->Converted the README, FAQ, and DATABASE information into
-	  SGML docbook format.</TD
-></TR
-><TR
-><TD
-ALIGN="LEFT"
->Revision 2.11.1</TD
-><TD
-ALIGN="LEFT"
->06 March 2001</TD
-><TD
-ALIGN="LEFT"
->Revised by: MPB</TD
-></TR
-><TR
-><TD
-ALIGN="LEFT"
-COLSPAN="3"
->Took way too long to revise this for 2.12 release. Updated
-	  FAQ to use qandaset tags instead of literallayout, cleaned
-	  up administration section, added User Guide section,
-	  miscellaneous FAQ updates and third-party integration
-	  information. From this point on all new tags are lowercase
-	  in preparation for the 2.13 release of the Guide in XML
-	  format instead of SGML.</TD
-></TR
-><TR
-><TD
-ALIGN="LEFT"
->Revision 2.12.0</TD
-><TD
-ALIGN="LEFT"
->24 April 2001</TD
-><TD
-ALIGN="LEFT"
->Revised by: MPB</TD
-></TR
-><TR
-><TD
-ALIGN="LEFT"
-COLSPAN="3"
->Things fixed this release: Elaborated on queryhelp
-	  interface, added FAQ regarding moving bugs from one keyword
-	  to another, clarified possible problems with the Landfill
-	  tutorial, fixed a boatload of typos and unclear sentence
-	  structures.  Incorporated the README into the UNIX
-	  installation section, and changed the README to indicate the
-	  deprecated status.  Things I know need work:  Used
-	  "simplelist" a lot, where I should have used "procedure" to
-	  tag things.  Need to lowercase all tags to be XML compliant.</TD
-></TR
-><TR
-><TD
-ALIGN="LEFT"
->Revision 2.14.0</TD
-><TD
-ALIGN="LEFT"
->07 August 2001</TD
-><TD
-ALIGN="LEFT"
->Revised by: MPB</TD
-></TR
-><TR
-><TD
-ALIGN="LEFT"
-COLSPAN="3"
->Attempted to integrate relevant portions of the UNIX and
-	  Windows installation instructions, moved some data from FAQ
-	  to Install, removed references to README from text, added
-	  Mac OS X install instructions, fixed a bunch
-	  of tpyos (Mark Harig), linked text that referenced other
-	  parts of the Guide, and nuked the old MySQL permissions
-	  section.</TD
-></TR
-></TABLE
-></DIV
+NAME="AEN5">Matthew P. Barnson</H3
+><H3
+CLASS="author"
+><A
+NAME="AEN9">The Bugzilla Team</H3
 ><DIV
 ><DIV
-CLASS="ABSTRACT"
+CLASS="abstract"
 ><A
-NAME="AEN39"
-></A
-><P
+NAME="AEN13"><P
 ></P
 ><P
->	This is the documentation for Bugzilla, the Mozilla
-	bug-tracking system.
-      </P
-><P
->	Bugzilla is an enterprise-class set of software utilities
-	that, when used together, power issue-tracking for hundreds of
-	organizations around the world, tracking millions of bugs.
-	While it is easy to use and quite flexible, it is very
-	difficult for a novice to install and maintain.  Although we
-	have provided step-by-step directions, Bugzilla is not always
-	easy to get working.  Please be sure the person responsible
-	for installing and maintaining this software is a qualified
-	professional on operating system upon which you install
-	Bugzilla.
+>&#13;	      This is the documentation for Bugzilla, the mozilla.org
+	      bug-tracking system.
+	      Bugzilla is an enterprise-class piece of software
+	      that powers issue-tracking for hundreds of
+	      organizations around the world, tracking millions of bugs.
       </P
 ><P
->	THIS DOCUMENTATION IS MAINTAINED IN DOCBOOK 4.1 SGML FORMAT.
-	IF YOU WISH TO MAKE CORRECTIONS, PLEASE MAKE THEM IN PLAIN
-	TEXT OR SGML DIFFS AGAINST THE SOURCE.  I CANNOT ACCEPT
-	ADDITIONS TO THE GUIDE WRITTEN IN HTML!
+>  
+	      This documentation is maintained in DocBook 4.1.2 XML format.
+        Changes are best submitted as plain text or SGML diffs, attached
+        to a bug filed in
+        <A
+HREF="http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla&component=Documentation"
+TARGET="_top"
+>mozilla.org's Bugzilla</A
+>.
       </P
 ><P
 ></P
@@ -233,46 +96,26 @@ HREF="about.html"
 ><DL
 ><DT
 >1.1. <A
-HREF="aboutthisguide.html"
->Purpose and Scope of this Guide</A
-></DT
-><DT
->1.2. <A
 HREF="copyright.html"
 >Copyright Information</A
 ></DT
 ><DT
->1.3. <A
+>1.2. <A
 HREF="disclaimer.html"
 >Disclaimer</A
 ></DT
 ><DT
->1.4. <A
+>1.3. <A
 HREF="newversions.html"
 >New Versions</A
 ></DT
 ><DT
->1.5. <A
+>1.4. <A
 HREF="credits.html"
 >Credits</A
 ></DT
 ><DT
->1.6. <A
-HREF="contributors.html"
->Contributors</A
-></DT
-><DT
->1.7. <A
-HREF="feedback.html"
->Feedback</A
-></DT
-><DT
->1.8. <A
-HREF="translations.html"
->Translations</A
-></DT
-><DT
->1.9. <A
+>1.5. <A
 HREF="conventions.html"
 >Document Conventions</A
 ></DT
@@ -280,8 +123,8 @@ HREF="conventions.html"
 ></DD
 ><DT
 >2. <A
-HREF="using.html"
->Using Bugzilla</A
+HREF="introduction.html"
+>Introduction</A
 ></DT
 ><DD
 ><DL
@@ -295,471 +138,117 @@ HREF="whatis.html"
 HREF="why.html"
 >Why Should We Use Bugzilla?</A
 ></DT
-><DT
->2.3. <A
-HREF="how.html"
->How do I use Bugzilla?</A
-></DT
-><DD
-><DL
-><DT
->2.3.1. <A
-HREF="how.html#MYACCOUNT"
->Create a Bugzilla Account</A
-></DT
-><DT
->2.3.2. <A
-HREF="how.html#QUERY"
->The Bugzilla Query Page</A
-></DT
-><DT
->2.3.3. <A
-HREF="how.html#BUGREPORTS"
->Creating and Managing Bug Reports</A
-></DT
-><DD
-><DL
-><DT
->2.3.3.1. <A
-HREF="how.html#BUG_WRITING"
->Writing a Great Bug Report</A
-></DT
-><DT
->2.3.3.2. <A
-HREF="how.html#BUG_MANAGE"
->Managing your Bug Reports</A
-></DT
-></DL
-></DD
 ></DL
 ></DD
 ><DT
->2.4. <A
-HREF="init4me.html"
->Where can I find my user preferences?</A
-></DT
-><DD
-><DL
-><DT
->2.4.1. <A
-HREF="init4me.html#ACCOUNTSETTINGS"
->Account Settings</A
-></DT
-><DT
->2.4.2. <A
-HREF="init4me.html#EMAILSETTINGS"
->Email Settings</A
+>3. <A
+HREF="using.html"
+>Using Bugzilla</A
 ></DT
 ><DD
 ><DL
 ><DT
->2.4.2.1. <A
-HREF="init4me.html#NOTIFICATION"
->Email Notification</A
-></DT
-><DT
->2.4.2.2. <A
-HREF="init4me.html#NEWEMAILTECH"
->New Email Technology</A
-></DT
-><DT
->2.4.2.3. <A
-HREF="init4me.html#WATCHSETTINGS"
->"Watching" Users</A
-></DT
-></DL
-></DD
-><DT
->2.4.3. <A
-HREF="init4me.html#FOOTERSETTINGS"
->Page Footer</A
+>3.1. <A
+HREF="how.html"
+>How do I use Bugzilla?</A
 ></DT
 ><DT
->2.4.4. <A
-HREF="init4me.html#PERMISSIONSETTINGS"
->Permissions</A
+>3.2. <A
+HREF="hintsandtips.html"
+>Hints and Tips</A
 ></DT
-></DL
-></DD
 ><DT
->2.5. <A
-HREF="usingbz-conc.html"
->Using Bugzilla-Conclusion</A
+>3.3. <A
+HREF="userpreferences.html"
+>User Preferences</A
 ></DT
 ></DL
 ></DD
 ><DT
->3. <A
+>4. <A
 HREF="installation.html"
 >Installation</A
 ></DT
 ><DD
 ><DL
 ><DT
->3.1. <A
-HREF="errata.html"
->ERRATA</A
-></DT
-><DT
->3.2. <A
+>4.1. <A
 HREF="stepbystep.html"
 >Step-by-step Install</A
 ></DT
-><DD
-><DL
-><DT
->3.2.1. <A
-HREF="stepbystep.html#AEN509"
->Introduction</A
-></DT
-><DT
->3.2.2. <A
-HREF="stepbystep.html#AEN515"
->Installing the Prerequisites</A
-></DT
-><DT
->3.2.3. <A
-HREF="stepbystep.html#INSTALL-MYSQL"
->Installing MySQL Database</A
-></DT
-><DT
->3.2.4. <A
-HREF="stepbystep.html#INSTALL-PERL"
->Perl (5.004 or greater)</A
-></DT
-><DT
->3.2.5. <A
-HREF="stepbystep.html#AEN602"
->DBI Perl Module</A
-></DT
-><DT
->3.2.6. <A
-HREF="stepbystep.html#AEN640"
->Data::Dumper Perl Module</A
-></DT
-><DT
->3.2.7. <A
-HREF="stepbystep.html#AEN645"
->MySQL related Perl Module Collection</A
-></DT
-><DT
->3.2.8. <A
-HREF="stepbystep.html#AEN654"
->TimeDate Perl Module Collection</A
-></DT
-><DT
->3.2.9. <A
-HREF="stepbystep.html#AEN658"
->GD Perl Module (1.8.3)</A
-></DT
-><DT
->3.2.10. <A
-HREF="stepbystep.html#AEN667"
->Chart::Base Perl Module (0.99c)</A
-></DT
-><DT
->3.2.11. <A
-HREF="stepbystep.html#AEN671"
->DB_File Perl Module</A
-></DT
-><DT
->3.2.12. <A
-HREF="stepbystep.html#AEN674"
->HTTP Server</A
-></DT
-><DT
->3.2.13. <A
-HREF="stepbystep.html#AEN692"
->Installing the Bugzilla Files</A
-></DT
-><DT
->3.2.14. <A
-HREF="stepbystep.html#AEN721"
->Setting Up the MySQL Database</A
-></DT
-><DT
->3.2.15. <A
-HREF="stepbystep.html#AEN768"
->Tweaking <TT
-CLASS="FILENAME"
->localconfig</TT
-></A
-></DT
-><DT
->3.2.16. <A
-HREF="stepbystep.html#AEN806"
->Setting Up Maintainers Manually (Optional)</A
-></DT
-><DT
->3.2.17. <A
-HREF="stepbystep.html#AEN817"
->The Whining Cron (Optional)</A
-></DT
-><DT
->3.2.18. <A
-HREF="stepbystep.html#AEN827"
->Bug Graphs (Optional)</A
-></DT
-><DT
->3.2.19. <A
-HREF="stepbystep.html#AEN839"
->Securing MySQL</A
-></DT
-></DL
-></DD
-><DT
->3.3. <A
-HREF="osx.html"
->Mac OS X Installation Notes</A
-></DT
-><DT
->3.4. <A
-HREF="bsdinstall.html"
->BSD Installation Notes</A
-></DT
-><DT
->3.5. <A
-HREF="geninstall.html"
->Installation General Notes</A
-></DT
-><DD
-><DL
-><DT
->3.5.1. <A
-HREF="geninstall.html#AEN941"
->Modifying Your Running System</A
-></DT
-><DT
->3.5.2. <A
-HREF="geninstall.html#AEN948"
->Upgrading From Previous Versions</A
-></DT
-><DT
->3.5.3. <A
-HREF="geninstall.html#HTACCESS"
-><TT
-CLASS="FILENAME"
->.htaccess</TT
-> files and security</A
-></DT
-><DT
->3.5.4. <A
-HREF="geninstall.html#MOD_THROTTLE"
-><TT
-CLASS="FILENAME"
->mod_throttle</TT
-> and Security</A
-></DT
-><DT
->3.5.5. <A
-HREF="geninstall.html#CONTENT_TYPE"
->Preventing untrusted Bugzilla content from executing malicious Javascript code</A
-></DT
 ><DT
->3.5.6. <A
-HREF="geninstall.html#UNIXHISTORY"
->UNIX Installation Instructions History</A
+>4.2. <A
+HREF="extraconfig.html"
+>Optional Additional Configuration</A
 ></DT
-></DL
-></DD
 ><DT
->3.6. <A
+>4.3. <A
 HREF="win32.html"
 >Win32 Installation Notes</A
 ></DT
-><DD
-><DL
-><DT
->3.6.1. <A
-HREF="win32.html#WININSTALL"
->Win32 Installation: Step-by-step</A
-></DT
 ><DT
->3.6.2. <A
-HREF="win32.html#ADDLWINTIPS"
->Additional Windows Tips</A
+>4.4. <A
+HREF="osx.html"
+>Mac OS X Installation Notes</A
 ></DT
 ><DT
->3.6.3. <A
-HREF="win32.html#BZLDAP"
->Bugzilla LDAP Integration</A
+>4.5. <A
+HREF="troubleshooting.html"
+>Troubleshooting</A
 ></DT
 ></DL
 ></DD
-></DL
-></DD
 ><DT
->4. <A
+>5. <A
 HREF="administration.html"
 >Administering Bugzilla</A
 ></DT
 ><DD
 ><DL
 ><DT
->4.1. <A
-HREF="postinstall-check.html"
->Post-Installation Checklist</A
+>5.1. <A
+HREF="parameters.html"
+>Bugzilla Configuration</A
 ></DT
 ><DT
->4.2. <A
+>5.2. <A
 HREF="useradmin.html"
 >User Administration</A
 ></DT
-><DD
-><DL
-><DT
->4.2.1. <A
-HREF="useradmin.html#DEFAULTUSER"
->Creating the Default User</A
-></DT
 ><DT
->4.2.2. <A
-HREF="useradmin.html#MANAGEUSERS"
->Managing Other Users</A
-></DT
-><DD
-><DL
-><DT
->4.2.2.1. <A
-HREF="useradmin.html#LOGIN"
->Logging In</A
-></DT
-><DT
->4.2.2.2. <A
-HREF="useradmin.html#CREATENEWUSERS"
->Creating new users</A
-></DT
-><DT
->4.2.2.3. <A
-HREF="useradmin.html#DISABLEUSERS"
->Disabling Users</A
-></DT
-><DT
->4.2.2.4. <A
-HREF="useradmin.html#MODIFYUSERS"
->Modifying Users</A
-></DT
-></DL
-></DD
-></DL
-></DD
-><DT
->4.3. <A
+>5.3. <A
 HREF="programadmin.html"
->Product, Component, Milestone, and Version
-      Administration</A
+>Product, Component, Milestone, and Version Administration</A
 ></DT
-><DD
-><DL
 ><DT
->4.3.1. <A
-HREF="programadmin.html#PRODUCTS"
->Products</A
-></DT
-><DT
->4.3.2. <A
-HREF="programadmin.html#COMPONENTS"
->Components</A
-></DT
-><DT
->4.3.3. <A
-HREF="programadmin.html#VERSIONS"
->Versions</A
-></DT
-><DT
->4.3.4. <A
-HREF="programadmin.html#MILESTONES"
->Milestones</A
-></DT
-><DT
->4.3.5. <A
-HREF="programadmin.html#VOTING"
+>5.4. <A
+HREF="voting.html"
 >Voting</A
 ></DT
 ><DT
->4.3.6. <A
-HREF="programadmin.html#GROUPS"
+>5.5. <A
+HREF="groups.html"
 >Groups and Group Security</A
 ></DT
-></DL
-></DD
 ><DT
->4.4. <A
+>5.6. <A
 HREF="security.html"
 >Bugzilla Security</A
 ></DT
-></DL
-></DD
-><DT
->5. <A
-HREF="integration.html"
->Integrating Bugzilla with Third-Party Tools</A
-></DT
-><DD
-><DL
-><DT
->5.1. <A
-HREF="bonsai.html"
->Bonsai</A
-></DT
-><DT
->5.2. <A
-HREF="cvs.html"
->CVS</A
-></DT
 ><DT
->5.3. <A
-HREF="scm.html"
->Perforce SCM</A
+>5.7. <A
+HREF="cust-templates.html"
+>Template Customisation</A
 ></DT
 ><DT
->5.4. <A
-HREF="tinderbox.html"
->Tinderbox/Tinderbox2</A
+>5.8. <A
+HREF="upgrading.html"
+>Upgrading to New Releases</A
 ></DT
-></DL
-></DD
 ><DT
->6. <A
-HREF="future.html"
->The Future of Bugzilla</A
-></DT
-><DT
->7. <A
-HREF="variants.html"
->Bugzilla Variants and Competitors</A
-></DT
-><DD
-><DL
-><DT
->7.1. <A
-HREF="rhbugzilla.html"
->Red Hat Bugzilla</A
-></DT
-><DT
->7.2. <A
-HREF="variant_fenris.html"
->Loki Bugzilla (Fenris)</A
-></DT
-><DT
->7.3. <A
-HREF="variant_issuezilla.html"
->Issuezilla</A
-></DT
-><DT
->7.4. <A
-HREF="variant_scarab.html"
->Scarab</A
-></DT
-><DT
->7.5. <A
-HREF="variant_perforce.html"
->Perforce SCM</A
-></DT
-><DT
->7.6. <A
-HREF="variant_sourceforge.html"
->SourceForge</A
+>5.9. <A
+HREF="integration.html"
+>Integrating Bugzilla with Third-Party Tools</A
 ></DT
 ></DL
 ></DD
@@ -770,154 +259,84 @@ HREF="faq.html"
 ></DT
 ><DT
 >B. <A
-HREF="downloadlinks.html"
->Software Download Links</A
-></DT
-><DT
->C. <A
 HREF="database.html"
 >The Bugzilla Database</A
 ></DT
 ><DD
 ><DL
 ><DT
->C.1. <A
+>B.1. <A
 HREF="dbschema.html"
 >Database Schema Chart</A
 ></DT
 ><DT
->C.2. <A
+>B.2. <A
 HREF="dbdoc.html"
 >MySQL Bugzilla Database Introduction</A
 ></DT
-><DD
-><DL
-><DT
->C.2.1. <A
-HREF="dbdoc.html#AEN2331"
->Bugzilla Database Basics</A
-></DT
-><DD
-><DL
-><DT
->C.2.1.1. <A
-HREF="dbdoc.html#AEN2360"
->Bugzilla Database Tables</A
-></DT
-></DL
-></DD
-></DL
-></DD
-><DT
->C.3. <A
-HREF="granttables.html"
->MySQL Permissions &#38; Grant Tables</A
-></DT
 ></DL
 ></DD
 ><DT
->D. <A
+>C. <A
 HREF="patches.html"
 >Useful Patches and Utilities for Bugzilla</A
 ></DT
 ><DD
 ><DL
 ><DT
->D.1. <A
+>C.1. <A
 HREF="rewrite.html"
->Apache <TT
-CLASS="FILENAME"
+>Apache 
+    <TT
+CLASS="filename"
 >mod_rewrite</TT
-> magic</A
+>
+
+    magic</A
 ></DT
 ><DT
->D.2. <A
-HREF="setperl.html"
->The setperl.csh Utility</A
-></DT
-><DT
->D.3. <A
+>C.2. <A
 HREF="cmdline.html"
 >Command-line Bugzilla Queries</A
 ></DT
-><DT
->D.4. <A
-HREF="quicksearch.html"
->The Quicksearch Utility</A
-></DT
-><DT
->D.5. <A
-HREF="bzhacking.html"
->Hacking Bugzilla</A
-></DT
 ></DL
 ></DD
 ><DT
->E. <A
-HREF="gfdl.html"
->GNU Free Documentation License</A
+>D. <A
+HREF="variants.html"
+>Bugzilla Variants and Competitors</A
 ></DT
 ><DD
 ><DL
 ><DT
->0. <A
-HREF="gfdl_0.html"
->PREAMBLE</A
-></DT
-><DT
->1. <A
-HREF="gfdl_1.html"
->APPLICABILITY AND DEFINITIONS</A
-></DT
-><DT
->2. <A
-HREF="gfdl_2.html"
->VERBATIM COPYING</A
-></DT
-><DT
->3. <A
-HREF="gfdl_3.html"
->COPYING IN QUANTITY</A
-></DT
-><DT
->4. <A
-HREF="gfdl_4.html"
->MODIFICATIONS</A
-></DT
-><DT
->5. <A
-HREF="gfdl_5.html"
->COMBINING DOCUMENTS</A
-></DT
-><DT
->6. <A
-HREF="gfdl_6.html"
->COLLECTIONS OF DOCUMENTS</A
+>D.1. <A
+HREF="rhbugzilla.html"
+>Red Hat Bugzilla</A
 ></DT
 ><DT
->7. <A
-HREF="gfdl_7.html"
->AGGREGATION WITH INDEPENDENT WORKS</A
+>D.2. <A
+HREF="variant-fenris.html"
+>Loki Bugzilla (Fenris)</A
 ></DT
 ><DT
->8. <A
-HREF="gfdl_8.html"
->TRANSLATION</A
+>D.3. <A
+HREF="variant-issuezilla.html"
+>Issuezilla</A
 ></DT
 ><DT
->9. <A
-HREF="gfdl_9.html"
->TERMINATION</A
+>D.4. <A
+HREF="variant-scarab.html"
+>Scarab</A
 ></DT
 ><DT
->10. <A
-HREF="gfdl_10.html"
->FUTURE REVISIONS OF THIS LICENSE</A
+>D.5. <A
+HREF="variant-perforce.html"
+>Perforce SCM</A
 ></DT
 ><DT
-><A
-HREF="gfdl_howto.html"
->How to use this License for your documents</A
+>D.6. <A
+HREF="variant-sourceforge.html"
+>SourceForge</A
 ></DT
 ></DL
 ></DD
@@ -937,80 +356,22 @@ CLASS="LOT"
 >List of Examples</B
 ></DT
 ><DT
->2-1. <A
-HREF="how.html#AEN307"
->Some Famous Software Versions</A
-></DT
-><DT
->2-2. <A
-HREF="how.html#AEN317"
->Mozilla's Bugzilla Components</A
-></DT
-><DT
->3-1. <A
-HREF="stepbystep.html#AEN708"
->Setting up bonsaitools symlink</A
-></DT
-><DT
->3-2. <A
-HREF="stepbystep.html#AEN799"
->Running checksetup.pl as the web user</A
-></DT
-><DT
->3-3. <A
-HREF="win32.html#AEN1038"
->Installing ActivePerl ppd Modules on Microsoft Windows</A
-></DT
-><DT
->3-4. <A
-HREF="win32.html#AEN1224"
->Removing encrypt() for Windows NT Bugzilla version
-	      2.12 or earlier</A
-></DT
-><DT
 >4-1. <A
-HREF="programadmin.html#AEN1461"
->Creating some Components</A
+HREF="win32.html#AEN989"
+>Installing ActivePerl ppd Modules on Microsoft
+            Windows</A
 ></DT
 ><DT
 >4-2. <A
-HREF="programadmin.html#AEN1490"
->Common Use of Versions</A
+HREF="win32.html#AEN1002"
+>Installing OpenInteract ppd Modules manually on Microsoft
+            Windows</A
 ></DT
 ><DT
 >4-3. <A
-HREF="programadmin.html#AEN1494"
->A Different Use of Versions</A
-></DT
-><DT
->4-4. <A
-HREF="programadmin.html#AEN1522"
->Using SortKey with Target Milestone</A
-></DT
-><DT
->4-5. <A
-HREF="programadmin.html#AEN1558"
->When to Use Group Security</A
-></DT
-><DT
->4-6. <A
-HREF="programadmin.html#AEN1575"
->Creating a New Group</A
-></DT
-><DT
->4-7. <A
-HREF="programadmin.html#AEN1592"
->Bugzilla Groups</A
-></DT
-><DT
->D-1. <A
-HREF="setperl.html#AEN2439"
->Using Setperl to set your perl path</A
-></DT
-><DT
->1. <A
-HREF="glossary.html#AEN2685"
->A Sample Product</A
+HREF="win32.html#AEN1184"
+>Removing encrypt() for Windows NT Bugzilla version 2.12 or
+          earlier</A
 ></DT
 ></DL
 ></DIV
@@ -1020,6 +381,7 @@ CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -1041,6 +403,7 @@ ALIGN="right"
 VALIGN="top"
 ><A
 HREF="about.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
diff --git a/docs/html/init4me.html b/docs/html/init4me.html
deleted file mode 100644
index d400108b2..000000000
--- a/docs/html/init4me.html
+++ /dev/null
@@ -1,459 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->Where can I find my user preferences?</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="Using Bugzilla"
-HREF="using.html"><LINK
-REL="PREVIOUS"
-TITLE="How do I use Bugzilla?"
-HREF="how.html"><LINK
-REL="NEXT"
-TITLE="Using Bugzilla-Conclusion"
-HREF="usingbz-conc.html"></HEAD
-><BODY
-CLASS="SECTION"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="how.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Chapter 2. Using Bugzilla</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="usingbz-conc.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECTION"
-><H1
-CLASS="SECTION"
-><A
-NAME="INIT4ME"
->2.4. Where can I find my user preferences?</A
-></H1
-><TABLE
-BORDER="0"
-WIDTH="100%"
-CELLSPACING="0"
-CELLPADDING="0"
-CLASS="EPIGRAPH"
-><TR
-><TD
-WIDTH="45%"
->&nbsp;</TD
-><TD
-WIDTH="45%"
-ALIGN="LEFT"
-VALIGN="TOP"
-><I
-><P
-><I
->Indiana, it feels like we walking on fortune cookies!</I
-></P
-><P
-><I
->These ain't fortune cookies, kid...</I
-></P
-></I
-></TD
-></TR
-></TABLE
-><P
->      Customized User Preferences offer tremendous versatility to your
-      individual Bugzilla experience. Let's plunge into what you can
-      do!  The first step is to click the "Edit prefs" link at the
-      footer of each page once you have logged in to <A
-HREF="http://landfill.tequilarista.org/bugzilla-tip/query.cgi?GoAheadAndLogIn=1"
-TARGET="_top"
-> Landfill</A
->.
-    </P
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="ACCOUNTSETTINGS"
->2.4.1. Account Settings</A
-></H2
-><P
->	On this page, you can change your basic Account Settings,
-	including your password and full name. For security reasons,
-	in order to change anything on this page you must type your
-	<EM
->current</EM
-> password into the <SPAN
-CLASS="QUOTE"
->"Old
-	  Password"</SPAN
-> field.  If you wish to change your
-	password, type the new password you want into the <SPAN
-CLASS="QUOTE"
->"New
-	  Password"</SPAN
-> field and again into the <SPAN
-CLASS="QUOTE"
->"Re-enter
-	  new password"</SPAN
-> field to ensure you typed your new
-	password correctly.  Select the <SPAN
-CLASS="QUOTE"
->"Submit"</SPAN
-> button
-	    and you are done.
-      </P
-></DIV
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="EMAILSETTINGS"
->2.4.2. Email Settings</A
-></H2
-><DIV
-CLASS="SECTION"
-><H3
-CLASS="SECTION"
-><A
-NAME="NOTIFICATION"
->2.4.2.1. Email Notification</A
-></H3
-><P
->	  Here you can reduce or increase the amount of email sent you
-	  from Bugzilla.  Although this is referred to as
-	  <SPAN
-CLASS="QUOTE"
->"Advanced Email Filtering Options"</SPAN
->, they are,
-	  in fact, the standard email filter set.  All of them are
-	  self-explanatory, but you can use the filters in interesting
-	  ways.  For instance, some people (notably Quality Assurance
-	  personnel) often only care to receive updates regarding a
-	  bug when the bug changes state, so they can track bugs on
-	  their flow charts and know when it is time to pull the bug
-	  onto a quality assurance platform for inspection.  Other
-	  people set up email gateways to
-	    <A
-HREF="bonsai.html"
->Bonsai, the Mozilla automated CVS management system</A
-> or <A
-HREF="tinderbox.html"
->Tinderbox, the Mozilla automated build management system</A
->, and
-	  restrict which types of Bugzilla information are fed to
-	  these systems..
-	</P
-></DIV
-><DIV
-CLASS="SECTION"
-><H3
-CLASS="SECTION"
-><A
-NAME="NEWEMAILTECH"
->2.4.2.2. New Email Technology</A
-></H3
-><DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	    This option may not be available in all Bugzilla
-	    installations, depending upon the preferences of the
-	    systems administrator responsible for the setup of your
-	    Bugzilla. However, if you really want this functionality,
-	    ask her to "enable newemailtech in Params" and "make it
-	    the default for all new users", referring her to the
-	    Administration section of this Guide.
-	  </P
-></TD
-></TR
-></TABLE
-></DIV
-><P
->	  Disregard the warnings about "experimental and bleeding
-	  edge"; the code to handle email in a cleaner manner than
-	  that historically used for Bugzilla is quite robust and
-	  well-tested now.
-	</P
-><P
->	  I recommend you enable the option, "Click here to sign up
-	  (and risk any bugs)". Your email-box will thank you for it.
-	  The fundamental shift in "newemailtech" is away from
-	  standard UNIX "diff" output, which is quite ugly, to a
-	  prettier, better laid-out email.
-	</P
-></DIV
-><DIV
-CLASS="SECTION"
-><H3
-CLASS="SECTION"
-><A
-NAME="WATCHSETTINGS"
->2.4.2.3. "Watching" Users</A
-></H3
-><DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	    This option may not be available in all Bugzilla
-	    installations, depending upon the preferences of the
-	    systems administrator responsible for the setup of your
-	    Bugzilla. However, if you really want this functionality,
-	    ask her to "enable watchers in Params".
-	  </P
-></TD
-></TR
-></TABLE
-></DIV
-><P
->	  By entering user email names into the "Users to watch" text
-	  entry box, delineated by commas, you can watch bugs of other
-	  users.  This powerful functionality enables seamless
-	  transitions as developers change projects, managers wish to
-	  get in touch with the issues faced by their direct reports,
-	  or users go on vacation.  If any of these three situations
-	  apply to you, you will undoubtedly find this feature quite
-	  convenient.
-	</P
-></DIV
-></DIV
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="FOOTERSETTINGS"
->2.4.3. Page Footer</A
-></H2
-><DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	  By default, this page is quite barren.  However, go explore
-	  the Query Page some more; you will find that you can store
-	  numerous queries on the server, so if you regularly run a
-	  particular query it is just a drop-down menu away.  On this
-	  page of Preferences, if you have many stored queries you can
-	  elect to have them always one-click away!
-	</P
-></TD
-></TR
-></TABLE
-></DIV
-><P
->	If you have many stored queries on the server, here you will
-	find individual drop-downs for each stored query.  Each
-	drop-down gives you the option of that query appearing on the
-	footer of every page in Bugzilla!  This gives you powerful
-	one-click access to any complex searches you may set up, and
-	is an excellent way to impress your boss...
-      </P
-><DIV
-CLASS="TIP"
-><P
-></P
-><TABLE
-CLASS="TIP"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/tip.gif"
-HSPACE="5"
-ALT="Tip"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->By default, the "My Bugs" link appears at the bottom of
-	  each page.  However, this query gives you both the bugs you
-	  have reported, as well as those you are assigned.  One of
-	  the most common uses for this page is to remove the "My
-	  Bugs" link, replacing it with two other queries, commonly
-	  called "My Bug Reports" and "My Bugs" (but only referencing
-	  bugs assigned to you).  This allows you to distinguish those
-	  bugs you have reported from those you are assigned.  I
-	  commonly set up complex Boolean queries in the Query page
-	  and link them to my footer in this page.  When they are
-	  significantly complex, a one-click reference can save hours
-	  of work.</P
-></TD
-></TR
-></TABLE
-></DIV
-></DIV
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="PERMISSIONSETTINGS"
->2.4.4. Permissions</A
-></H2
-><P
->	This is a purely informative page which outlines your current
-	permissions on this installation of Bugzilla.  If you have
-	permissions to grant certain permissions to other users, the
-	"other users" link appears on this page as well as the footer.
-	For more information regarding user administration, please
-	consult the Administration section of this Guide.
-      </P
-></DIV
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="how.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="usingbz-conc.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->How do I use Bugzilla?</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="using.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->Using Bugzilla-Conclusion</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/installation.html b/docs/html/installation.html
index 5725bb8b8..2f27feedf 100644
--- a/docs/html/installation.html
+++ b/docs/html/installation.html
@@ -4,19 +4,19 @@
 >Installation</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
 HREF="index.html"><LINK
 REL="PREVIOUS"
-TITLE="Using Bugzilla-Conclusion"
-HREF="usingbz-conc.html"><LINK
+TITLE="User Preferences"
+HREF="userpreferences.html"><LINK
 REL="NEXT"
-TITLE="ERRATA"
-HREF="errata.html"></HEAD
+TITLE="Step-by-step Install"
+HREF="stepbystep.html"></HEAD
 ><BODY
-CLASS="CHAPTER"
+CLASS="chapter"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -25,6 +25,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -41,7 +42,8 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="usingbz-conc.html"
+HREF="userpreferences.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -54,7 +56,8 @@ WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="errata.html"
+HREF="stepbystep.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -63,12 +66,10 @@ HREF="errata.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="CHAPTER"
+CLASS="chapter"
 ><H1
 ><A
-NAME="INSTALLATION"
->Chapter 3. Installation</A
-></H1
+NAME="installation">Chapter 4. Installation</H1
 ><DIV
 CLASS="TOC"
 ><DL
@@ -77,211 +78,183 @@ CLASS="TOC"
 >Table of Contents</B
 ></DT
 ><DT
->3.1. <A
-HREF="errata.html"
->ERRATA</A
-></DT
-><DT
->3.2. <A
+>4.1. <A
 HREF="stepbystep.html"
 >Step-by-step Install</A
 ></DT
 ><DD
 ><DL
 ><DT
->3.2.1. <A
-HREF="stepbystep.html#AEN509"
+>4.1.1. <A
+HREF="stepbystep.html#AEN492"
 >Introduction</A
 ></DT
 ><DT
->3.2.2. <A
-HREF="stepbystep.html#AEN515"
->Installing the Prerequisites</A
-></DT
-><DT
->3.2.3. <A
-HREF="stepbystep.html#INSTALL-MYSQL"
->Installing MySQL Database</A
-></DT
-><DT
->3.2.4. <A
-HREF="stepbystep.html#INSTALL-PERL"
->Perl (5.004 or greater)</A
-></DT
-><DT
->3.2.5. <A
-HREF="stepbystep.html#AEN602"
->DBI Perl Module</A
-></DT
-><DT
->3.2.6. <A
-HREF="stepbystep.html#AEN640"
->Data::Dumper Perl Module</A
-></DT
-><DT
->3.2.7. <A
-HREF="stepbystep.html#AEN645"
->MySQL related Perl Module Collection</A
+>4.1.2. <A
+HREF="stepbystep.html#AEN496"
+>Package List</A
 ></DT
 ><DT
->3.2.8. <A
-HREF="stepbystep.html#AEN654"
->TimeDate Perl Module Collection</A
+>4.1.3. <A
+HREF="stepbystep.html#install-mysql"
+>MySQL</A
 ></DT
 ><DT
->3.2.9. <A
-HREF="stepbystep.html#AEN658"
->GD Perl Module (1.8.3)</A
+>4.1.4. <A
+HREF="stepbystep.html#install-perl"
+>Perl</A
 ></DT
 ><DT
->3.2.10. <A
-HREF="stepbystep.html#AEN667"
->Chart::Base Perl Module (0.99c)</A
+>4.1.5. <A
+HREF="stepbystep.html#perl-modules"
+>Perl Modules</A
 ></DT
 ><DT
->3.2.11. <A
-HREF="stepbystep.html#AEN671"
->DB_File Perl Module</A
-></DT
-><DT
->3.2.12. <A
-HREF="stepbystep.html#AEN674"
+>4.1.6. <A
+HREF="stepbystep.html#AEN669"
 >HTTP Server</A
 ></DT
 ><DT
->3.2.13. <A
-HREF="stepbystep.html#AEN692"
->Installing the Bugzilla Files</A
+>4.1.7. <A
+HREF="stepbystep.html#AEN688"
+>Bugzilla</A
 ></DT
 ><DT
->3.2.14. <A
-HREF="stepbystep.html#AEN721"
+>4.1.8. <A
+HREF="stepbystep.html#AEN705"
 >Setting Up the MySQL Database</A
 ></DT
 ><DT
->3.2.15. <A
-HREF="stepbystep.html#AEN768"
->Tweaking <TT
-CLASS="FILENAME"
->localconfig</TT
+>4.1.9. <A
+HREF="stepbystep.html#AEN741"
+><TT
+CLASS="filename"
+>checksetup.pl</TT
 ></A
 ></DT
 ><DT
->3.2.16. <A
-HREF="stepbystep.html#AEN806"
->Setting Up Maintainers Manually (Optional)</A
-></DT
-><DT
->3.2.17. <A
-HREF="stepbystep.html#AEN817"
->The Whining Cron (Optional)</A
-></DT
-><DT
->3.2.18. <A
-HREF="stepbystep.html#AEN827"
->Bug Graphs (Optional)</A
+>4.1.10. <A
+HREF="stepbystep.html#AEN773"
+>Securing MySQL</A
 ></DT
 ><DT
->3.2.19. <A
+>4.1.11. <A
 HREF="stepbystep.html#AEN839"
->Securing MySQL</A
+>Configuring Bugzilla</A
 ></DT
 ></DL
 ></DD
 ><DT
->3.3. <A
-HREF="osx.html"
->Mac OS X Installation Notes</A
+>4.2. <A
+HREF="extraconfig.html"
+>Optional Additional Configuration</A
 ></DT
+><DD
+><DL
 ><DT
->3.4. <A
-HREF="bsdinstall.html"
->BSD Installation Notes</A
+>4.2.1. <A
+HREF="extraconfig.html#AEN845"
+>Dependency Charts</A
 ></DT
 ><DT
->3.5. <A
-HREF="geninstall.html"
->Installation General Notes</A
+>4.2.2. <A
+HREF="extraconfig.html#AEN860"
+>Bug Graphs</A
 ></DT
-><DD
-><DL
 ><DT
->3.5.1. <A
-HREF="geninstall.html#AEN941"
->Modifying Your Running System</A
+>4.2.3. <A
+HREF="extraconfig.html#AEN873"
+>The Whining Cron</A
 ></DT
 ><DT
->3.5.2. <A
-HREF="geninstall.html#AEN948"
->Upgrading From Previous Versions</A
+>4.2.4. <A
+HREF="extraconfig.html#bzldap"
+>LDAP Authentication</A
 ></DT
 ><DT
->3.5.3. <A
-HREF="geninstall.html#HTACCESS"
+>4.2.5. <A
+HREF="extraconfig.html#content-type"
+>Preventing untrusted Bugzilla content from executing malicious
+      Javascript code</A
+></DT
+><DT
+>4.2.6. <A
+HREF="extraconfig.html#htaccess"
 ><TT
-CLASS="FILENAME"
+CLASS="filename"
 >.htaccess</TT
-> files and security</A
+>
+      files and security</A
 ></DT
 ><DT
->3.5.4. <A
-HREF="geninstall.html#MOD_THROTTLE"
+>4.2.7. <A
+HREF="extraconfig.html#mod-throttle"
 ><TT
-CLASS="FILENAME"
+CLASS="filename"
 >mod_throttle</TT
-> and Security</A
-></DT
-><DT
->3.5.5. <A
-HREF="geninstall.html#CONTENT_TYPE"
->Preventing untrusted Bugzilla content from executing malicious Javascript code</A
-></DT
-><DT
->3.5.6. <A
-HREF="geninstall.html#UNIXHISTORY"
->UNIX Installation Instructions History</A
+>
+
+      and Security</A
 ></DT
 ></DL
 ></DD
 ><DT
->3.6. <A
+>4.3. <A
 HREF="win32.html"
 >Win32 Installation Notes</A
 ></DT
 ><DD
 ><DL
 ><DT
->3.6.1. <A
-HREF="win32.html#WININSTALL"
+>4.3.1. <A
+HREF="win32.html#wininstall"
 >Win32 Installation: Step-by-step</A
 ></DT
 ><DT
->3.6.2. <A
-HREF="win32.html#ADDLWINTIPS"
+>4.3.2. <A
+HREF="win32.html#addlwintips"
 >Additional Windows Tips</A
 ></DT
+></DL
+></DD
+><DT
+>4.4. <A
+HREF="osx.html"
+>Mac OS X Installation Notes</A
+></DT
+><DT
+>4.5. <A
+HREF="troubleshooting.html"
+>Troubleshooting</A
+></DT
+><DD
+><DL
+><DT
+>4.5.1. <A
+HREF="troubleshooting.html#AEN1218"
+>Bundle::Bugzilla makes me upgrade to Perl 5.6.1</A
+></DT
 ><DT
->3.6.3. <A
-HREF="win32.html#BZLDAP"
->Bugzilla LDAP Integration</A
+>4.5.2. <A
+HREF="troubleshooting.html#AEN1223"
+>DBD::Sponge::db prepare failed</A
+></DT
+><DT
+>4.5.3. <A
+HREF="troubleshooting.html#paranoid-security"
+>cannot chdir(/var/spool/mqueue)</A
 ></DT
 ></DL
 ></DD
 ></DL
 ></DIV
-><P
->      These installation instructions are presented assuming you are
-      installing on a UNIX or completely POSIX-compliant system.  If
-      you are installing on Microsoft Windows or another oddball
-      operating system, please consult the appropriate sections in
-      this installation guide for notes on how to be successful.
-    </P
 ></DIV
 ><DIV
 CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -292,7 +265,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="usingbz-conc.html"
+HREF="userpreferences.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -301,6 +275,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -308,7 +283,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="errata.html"
+HREF="stepbystep.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -317,7 +293,7 @@ HREF="errata.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->Using Bugzilla-Conclusion</TD
+>User Preferences</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
@@ -327,7 +303,7 @@ VALIGN="top"
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->ERRATA</TD
+>Step-by-step Install</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/integration.html b/docs/html/integration.html
index 69648fdf2..9a7c1c432 100644
--- a/docs/html/integration.html
+++ b/docs/html/integration.html
@@ -4,19 +4,22 @@
 >Integrating Bugzilla with Third-Party Tools</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
 HREF="index.html"><LINK
+REL="UP"
+TITLE="Administering Bugzilla"
+HREF="administration.html"><LINK
 REL="PREVIOUS"
-TITLE="Bugzilla Security"
-HREF="security.html"><LINK
+TITLE="Upgrading to New Releases"
+HREF="upgrading.html"><LINK
 REL="NEXT"
-TITLE="Bonsai"
-HREF="bonsai.html"></HEAD
+TITLE="The Bugzilla FAQ"
+HREF="faq.html"></HEAD
 ><BODY
-CLASS="CHAPTER"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -25,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -41,20 +45,22 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="security.html"
+HREF="upgrading.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
-></TD
+>Chapter 5. Administering Bugzilla</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="bonsai.html"
+HREF="faq.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -63,40 +69,112 @@ HREF="bonsai.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="CHAPTER"
+CLASS="section"
 ><H1
+CLASS="section"
 ><A
-NAME="INTEGRATION"
->Chapter 5. Integrating Bugzilla with Third-Party Tools</A
-></H1
+NAME="integration">5.9. Integrating Bugzilla with Third-Party Tools</H1
 ><DIV
-CLASS="TOC"
-><DL
-><DT
-><B
->Table of Contents</B
-></DT
-><DT
->5.1. <A
-HREF="bonsai.html"
->Bonsai</A
-></DT
-><DT
->5.2. <A
-HREF="cvs.html"
->CVS</A
-></DT
-><DT
->5.3. <A
-HREF="scm.html"
->Perforce SCM</A
-></DT
-><DT
->5.4. <A
-HREF="tinderbox.html"
->Tinderbox/Tinderbox2</A
-></DT
-></DL
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="bonsai">5.9.1. Bonsai</H2
+><P
+>Bonsai is a web-based tool for managing 
+    <A
+HREF="integration.html#cvs"
+>CVS, the Concurrent Versioning System</A
+>
+
+    . Using Bonsai, administrators can control open/closed status of trees,
+    query a fast relational database back-end for change, branch, and comment
+    information, and view changes made since the last time the tree was
+    closed. Bonsai
+    also integrates with  
+    <A
+HREF="integration.html#tinderbox"
+>Tinderbox, the Mozilla automated build management system</A
+>.
+    </P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="cvs">5.9.2. CVS</H2
+><P
+>CVS integration is best accomplished, at this point, using the
+    Bugzilla Email Gateway.</P
+><P
+>Follow the instructions in this Guide for enabling Bugzilla e-mail
+    integration. Ensure that your check-in script sends an email to your
+    Bugzilla e-mail gateway with the subject of 
+    <SPAN
+CLASS="QUOTE"
+>"[Bug XXXX]"</SPAN
+>, 
+    and you can have CVS check-in comments append to your Bugzilla bug. If
+    you have your check-in script include an @resolution field, you can even
+    change the Bugzilla bug state.</P
+><P
+>There is also a CVSZilla project, based upon somewhat dated 
+    Bugzilla code, to integrate CVS and Bugzilla through CVS' ability to 
+    email. Check it out at: 
+    <A
+HREF="http://homepages.kcbbs.gen.nz/~tonyg/"
+TARGET="_top"
+>&#13;    http://homepages.kcbbs.gen.nz/~tonyg/</A
+>.
+    </P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="scm">5.9.3. Perforce SCM</H2
+><P
+>You can find the project page for Bugzilla and Teamtrack Perforce
+    integration (p4dti) at: 
+    <A
+HREF="http://www.ravenbrook.com/project/p4dti/"
+TARGET="_top"
+>&#13;    http://www.ravenbrook.com/project/p4dti</A
+>
+
+    . 
+    <SPAN
+CLASS="QUOTE"
+>"p4dti"</SPAN
+>
+
+    is now an officially supported product from Perforce, and you can find
+    the "Perforce Public Depot" p4dti page at 
+    <A
+HREF="http://public.perforce.com/public/perforce/p4dti/index.html"
+TARGET="_top"
+>&#13;    http://public.perforce.com/public/perforce/p4dti/index.html</A
+>
+
+    .</P
+><P
+>Integration of Perforce with Bugzilla, once patches are applied, is
+    seamless. Perforce replication information will appear below the comments
+    of each bug. Be certain you have a matching set of patches for the
+    Bugzilla version you are installing. p4dti is designed to support
+    multiple defect trackers, and maintains its own documentation for it.
+    Please consult the pages linked above for further information.</P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="tinderbox">5.9.4. Tinderbox/Tinderbox2</H2
+><P
+>We need Tinderbox integration information.</P
 ></DIV
 ></DIV
 ><DIV
@@ -104,6 +182,7 @@ CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -114,7 +193,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="security.html"
+HREF="upgrading.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -123,6 +203,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -130,7 +211,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="bonsai.html"
+HREF="faq.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -139,17 +221,21 @@ HREF="bonsai.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->Bugzilla Security</TD
+>Upgrading to New Releases</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
 VALIGN="top"
->&nbsp;</TD
+><A
+HREF="administration.html"
+ACCESSKEY="U"
+>Up</A
+></TD
 ><TD
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->Bonsai</TD
+>The Bugzilla FAQ</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/bsdinstall.html b/docs/html/introduction.html
similarity index 60%
rename from docs/html/bsdinstall.html
rename to docs/html/introduction.html
index 56f68a3b1..5240be057 100644
--- a/docs/html/bsdinstall.html
+++ b/docs/html/introduction.html
@@ -1,25 +1,22 @@
 <HTML
 ><HEAD
 ><TITLE
->BSD Installation Notes</TITLE
+>Introduction</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
 HREF="index.html"><LINK
-REL="UP"
-TITLE="Installation"
-HREF="installation.html"><LINK
 REL="PREVIOUS"
-TITLE="Mac OS X Installation Notes"
-HREF="osx.html"><LINK
+TITLE="Document Conventions"
+HREF="conventions.html"><LINK
 REL="NEXT"
-TITLE="Installation General Notes"
-HREF="geninstall.html"></HEAD
+TITLE="What is Bugzilla?"
+HREF="whatis.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="chapter"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +25,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -44,20 +42,22 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="osx.html"
+HREF="conventions.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Chapter 3. Installation</TD
+></TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="geninstall.html"
+HREF="whatis.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,26 +66,36 @@ HREF="geninstall.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="chapter"
 ><H1
-CLASS="SECTION"
 ><A
-NAME="BSDINSTALL"
->3.4. BSD Installation Notes</A
-></H1
-><P
->      For instructions on how to set up Bugzilla on FreeBSD, NetBSD, OpenBSD, BSDi, etc. please
-      consult <A
-HREF="osx.html"
->Section 3.3</A
->.
-    </P
+NAME="introduction">Chapter 2. Introduction</H1
+><DIV
+CLASS="TOC"
+><DL
+><DT
+><B
+>Table of Contents</B
+></DT
+><DT
+>2.1. <A
+HREF="whatis.html"
+>What is Bugzilla?</A
+></DT
+><DT
+>2.2. <A
+HREF="why.html"
+>Why Should We Use Bugzilla?</A
+></DT
+></DL
+></DIV
 ></DIV
 ><DIV
 CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -96,7 +106,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="osx.html"
+HREF="conventions.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -105,6 +116,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -112,7 +124,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="geninstall.html"
+HREF="whatis.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -121,20 +134,17 @@ HREF="geninstall.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->Mac OS X Installation Notes</TD
+>Document Conventions</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
 VALIGN="top"
-><A
-HREF="installation.html"
->Up</A
-></TD
+>&nbsp;</TD
 ><TD
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->Installation General Notes</TD
+>What is Bugzilla?</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/newversions.html b/docs/html/newversions.html
index ab287d22e..d9e4ba4be 100644
--- a/docs/html/newversions.html
+++ b/docs/html/newversions.html
@@ -4,7 +4,7 @@
 >New Versions</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -19,7 +19,7 @@ REL="NEXT"
 TITLE="Credits"
 HREF="credits.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -45,6 +46,7 @@ ALIGN="left"
 VALIGN="bottom"
 ><A
 HREF="disclaimer.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -58,6 +60,7 @@ ALIGN="right"
 VALIGN="bottom"
 ><A
 HREF="credits.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,47 +69,37 @@ HREF="credits.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="NEWVERSIONS"
->1.4. New Versions</A
-></H1
+NAME="newversions">1.3. New Versions</H1
 ><P
->      This is the 2.14 version of The Bugzilla Guide.  If you are
+>&#13;      This is the 2.16 version of The Bugzilla Guide. It is so named 
+      to match the current version of Bugzilla. If you are
       reading this from any source other than those below, please
       check one of these mirrors to make sure you are reading an
       up-to-date version of the Guide.
     </P
 ><P
->      This document can be found in the following places:
+>&#13;      This document can be found in the following places:
     </P
 ><P
->      <P
+>&#13;      <P
 ></P
 ><UL
 ><LI
 ><P
->	    <A
-HREF="http://www.trilobyte.net/barnsons/"
+>&#13;	    <A
+HREF="http://www.bugzilla.org/"
 TARGET="_top"
->TriloBYTE</A
+>bugzilla.org</A
 >
 	  </P
 ></LI
 ><LI
 ><P
->	    <A
-HREF="http://www.mozilla.org/projects/bugzilla/"
-TARGET="_top"
->Mozilla.org</A
->
-	  </P
-></LI
-><LI
-><P
->	    <A
+>&#13;	    <A
 HREF="http://www.linuxdoc.org/"
 TARGET="_top"
 >The Linux
@@ -118,12 +111,27 @@ TARGET="_top"
 >
     </P
 ><P
->      The latest version of this document can be checked out via CVS.
-	Please follow the instructions available at <A
+>&#13;      The latest version of this document can always be checked out via CVS.
+	    Please follow the instructions available at 
+      <A
 HREF="http://www.mozilla.org/cvs.html"
 TARGET="_top"
 >the Mozilla CVS page</A
->, and check out the mozilla/webtools/bugzilla/docs/ branch.
+>,
+      and check out the <TT
+CLASS="filename"
+>mozilla/webtools/bugzilla/docs/</TT
+>
+      subtree.
+    </P
+><P
+>&#13;      The Bugzilla Guide is currently only available in English. 
+      If you would like to volunteer to translate it, please contact
+      <A
+HREF="mailto:justdave@syndicomm.com"
+TARGET="_top"
+>Dave Miller</A
+>.
     </P
 ></DIV
 ><DIV
@@ -131,6 +139,7 @@ CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -142,6 +151,7 @@ ALIGN="left"
 VALIGN="top"
 ><A
 HREF="disclaimer.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -150,6 +160,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -158,6 +169,7 @@ ALIGN="right"
 VALIGN="top"
 ><A
 HREF="credits.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -173,6 +185,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="about.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
diff --git a/docs/html/osx.html b/docs/html/osx.html
index caa9efbdf..147cf3b6c 100644
--- a/docs/html/osx.html
+++ b/docs/html/osx.html
@@ -4,7 +4,7 @@
 >Mac OS X Installation Notes</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -13,13 +13,13 @@ REL="UP"
 TITLE="Installation"
 HREF="installation.html"><LINK
 REL="PREVIOUS"
-TITLE="Step-by-step Install"
-HREF="stepbystep.html"><LINK
+TITLE="Win32 Installation Notes"
+HREF="win32.html"><LINK
 REL="NEXT"
-TITLE="BSD Installation Notes"
-HREF="bsdinstall.html"></HEAD
+TITLE="Troubleshooting"
+HREF="troubleshooting.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -44,20 +45,22 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="stepbystep.html"
+HREF="win32.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Chapter 3. Installation</TD
+>Chapter 4. Installation</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="bsdinstall.html"
+HREF="troubleshooting.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,156 +69,120 @@ HREF="bsdinstall.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="OSX"
->3.3. Mac OS X Installation Notes</A
-></H1
+NAME="osx">4.4. Mac OS X Installation Notes</H1
 ><P
->      There are a lot of common libraries and utilities out there
-      that Apple did not include with Mac OS X, but which run
-      perfectly well on it.  The GD library, which Bugzilla needs to
-      do bug graphs, is one of these.
-    </P
+>There are a lot of common libraries and utilities out there that
+    Apple did not include with Mac OS X, but which run perfectly well on it.
+    The GD library, which Bugzilla needs to do bug graphs, is one of
+    these.</P
 ><P
->      The easiest way to get a lot of these is with a program called
-      Fink, which is similar in nature to the CPAN installer, but
-      installs common GNU utilities.  Fink is available from
-      &#60;http://sourceforge.net/projects/fink/&#62;.
-    </P
+>The easiest way to get a lot of these is with a program called
+    Fink, which is similar in nature to the CPAN installer, but installs
+    common GNU utilities. Fink is available from
+    &#60;http://sourceforge.net/projects/fink/&#62;.</P
 ><P
->      Follow the instructions for setting up Fink.  Once it's
-      installed, you'll want to run the following as root:
-      <B
-CLASS="COMMAND"
+>Follow the instructions for setting up Fink. Once it's installed,
+    you'll want to run the following as root: 
+    <B
+CLASS="command"
 >fink install gd</B
 >
     </P
 ><P
->      It will prompt you for a number of dependencies, type 'y' and
-      hit enter to install all of the dependencies.  Then watch it
-      work.
-    </P
+>It will prompt you for a number of dependencies, type 'y' and hit
+    enter to install all of the dependencies. Then watch it work.</P
 ><P
->      To prevent creating conflicts with the software that Apple
-      installs by default, Fink creates its own directory tree at
-      /sw where it installs most of the software that it installs.
-      This means your libraries and headers for libgd will be at
-      /sw/lib and /sw/include instead of /usr/lib and
-      /usr/local/include.  Because of these changed locations for
-      the libraries, the Perl GD module will not install directly
-      via CPAN (it looks for the specific paths instead of getting
-      them from your environment).  But there's a way around that
-      :-)
-    </P
+>To prevent creating conflicts with the software that Apple installs
+    by default, Fink creates its own directory tree at /sw where it installs
+    most of the software that it installs. This means your libraries and
+    headers for libgd will be at /sw/lib and /sw/include instead of /usr/lib
+    and /usr/local/include. Because of these changed locations for the
+    libraries, the Perl GD module will not install directly via CPAN, because it
+    looks for the specific paths instead of getting them from your
+    environment. But there's a way around that :-)</P
 ><P
->      Instead of typing <SPAN
+>Instead of typing 
+    <SPAN
 CLASS="QUOTE"
 >"install GD"</SPAN
-> at the
-      <TT
-CLASS="PROMPT"
+>
+    at the 
+    <TT
+CLASS="prompt"
 >cpan&#62;</TT
-> prompt, type <B
-CLASS="COMMAND"
->look
-	GD</B
->.  This should go through the motions of
-      downloading the latest version of the GD module, then it will
-      open a shell and drop you into the build directory. Apply the
-      following patch to the Makefile.PL file (save the patch into a
-      file  and use the command <B
-CLASS="COMMAND"
->patch &#60;
-	patchfile</B
->:
-    </P
-><P
->      <TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
->	
---- GD-1.33/Makefile.PL Fri Aug  4 16:59:22 2000
-+++ GD-1.33-darwin/Makefile.PL  Tue Jun 26 01:29:32 2001
-@@ -3,8 +3,8 @@
- warn "NOTICE: This module requires libgd 1.8.3 or higher (shared library version 4.X).\n";
- 
- # =====&#62; PATHS: CHECK AND ADJUST &#60;=====
--my @INC     = qw(-I/usr/local/include -I/usr/local/include/gd); 
--my @LIBPATH = qw(-L/usr/lib/X11 -L/usr/X11R6/lib -L/usr/X11/lib -L/usr/local/lib );
-+my @INC     = qw(-I/sw/include -I/sw/include/gd -I/usr/local/include -I/usr/local/include/gd);
-+my @LIBPATH = qw(-L/usr/lib/X11 -L/usr/X11R6/lib -L/usr/X11/lib -L/sw/lib -L/usr/local/lib);
- my @LIBS    = qw(-lgd -lpng -lz);
- 
- # FEATURE FLAGS
-@@ -23,7 +23,7 @@
- 
- push @LIBS,'-lttf' if $TTF;
- push @LIBS,'-ljpeg' if $JPEG;
--push @LIBS, '-lm' unless $^O eq 'MSWin32';
-+push @LIBS, '-lm' unless ($^O =~ /^MSWin32|darwin$/);
- 
- # FreeBSD 3.3 with libgd built from ports croaks if -lXpm is specified 
- if ($^O ne 'freebsd' &#38;&#38; $^O ne 'MSWin32') {
-
- 
-      </PRE
-></FONT
-></TD
-></TR
-></TABLE
 >
+    prompt, type 
+    <B
+CLASS="command"
+>look GD</B
+>. 
+    This should go through the motions of downloading the latest version of
+    the GD module, then it will open a shell and drop you into the build
+    directory. Apply <A
+HREF="../sgml/gd-makefile.patch"
+TARGET="_top"
+>this patch</A
+> 
+    to the Makefile.PL file (save the
+    patch into a file and use the command 
+    <B
+CLASS="command"
+>patch &#60; patchfile</B
+>.)
     </P
 ><P
->      Then, run these commands to finish the installation of the perl module:
-      <P
+>Then, run these commands to finish the installation of the GD
+    module: 
+    <P
 ></P
 ><TABLE
 BORDER="0"
 ><TBODY
 ><TR
 ><TD
-><B
-CLASS="COMMAND"
+>&#13;        <B
+CLASS="command"
 >perl Makefile.PL</B
-></TD
+>
+      </TD
 ></TR
 ><TR
 ><TD
-><B
-CLASS="COMMAND"
+>&#13;        <B
+CLASS="command"
 >make</B
-></TD
+>
+      </TD
 ></TR
 ><TR
 ><TD
-><B
-CLASS="COMMAND"
+>&#13;        <B
+CLASS="command"
 >make test</B
-></TD
+>
+      </TD
 ></TR
 ><TR
 ><TD
-><B
-CLASS="COMMAND"
+>&#13;        <B
+CLASS="command"
 >make install</B
-></TD
+>
+      </TD
 ></TR
 ><TR
 ><TD
->And don't forget to run <B
-CLASS="COMMAND"
+>And don't forget to run 
+      <B
+CLASS="command"
 >exit</B
-> to get back to cpan.</TD
+>
+
+      to get back to CPAN.</TD
 ></TR
 ></TBODY
 ></TABLE
@@ -223,15 +190,13 @@ CLASS="COMMAND"
 ></P
 >
     </P
-><P
->      Happy Hacking!
-    </P
 ></DIV
 ><DIV
 CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -242,7 +207,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="stepbystep.html"
+HREF="win32.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -251,6 +217,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -258,7 +225,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="bsdinstall.html"
+HREF="troubleshooting.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -267,20 +235,21 @@ HREF="bsdinstall.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->Step-by-step Install</TD
+>Win32 Installation Notes</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
 VALIGN="top"
 ><A
 HREF="installation.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->BSD Installation Notes</TD
+>Troubleshooting</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/parameters.html b/docs/html/parameters.html
new file mode 100644
index 000000000..59455a082
--- /dev/null
+++ b/docs/html/parameters.html
@@ -0,0 +1,435 @@
+<HTML
+><HEAD
+><TITLE
+>Bugzilla Configuration</TITLE
+><META
+NAME="GENERATOR"
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
+"><LINK
+REL="HOME"
+TITLE="The Bugzilla Guide"
+HREF="index.html"><LINK
+REL="UP"
+TITLE="Administering Bugzilla"
+HREF="administration.html"><LINK
+REL="PREVIOUS"
+TITLE="Administering Bugzilla"
+HREF="administration.html"><LINK
+REL="NEXT"
+TITLE="User Administration"
+HREF="useradmin.html"></HEAD
+><BODY
+CLASS="section"
+BGCOLOR="#FFFFFF"
+TEXT="#000000"
+LINK="#0000FF"
+VLINK="#840084"
+ALINK="#0000FF"
+><DIV
+CLASS="NAVHEADER"
+><TABLE
+SUMMARY="Header navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TH
+COLSPAN="3"
+ALIGN="center"
+>The Bugzilla Guide</TH
+></TR
+><TR
+><TD
+WIDTH="10%"
+ALIGN="left"
+VALIGN="bottom"
+><A
+HREF="administration.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="80%"
+ALIGN="center"
+VALIGN="bottom"
+>Chapter 5. Administering Bugzilla</TD
+><TD
+WIDTH="10%"
+ALIGN="right"
+VALIGN="bottom"
+><A
+HREF="useradmin.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+></TABLE
+><HR
+ALIGN="LEFT"
+WIDTH="100%"></DIV
+><DIV
+CLASS="section"
+><H1
+CLASS="section"
+><A
+NAME="parameters">5.1. Bugzilla Configuration</H1
+><P
+>Bugzilla is configured by changing various parameters, accessed
+    from the "Edit parameters" link in the page footer. Here are
+    some of the key parameters on that page. You should run down this
+    list and set them appropriately after installing Bugzilla.</P
+><DIV
+CLASS="procedure"
+><OL
+TYPE="1"
+><LI
+><P
+> 
+        <B
+CLASS="command"
+>maintainer</B
+>:
+        The maintainer parameter is the email address of the person 
+        responsible for maintaining this
+        Bugzilla installation. The address need not be that of a valid Bugzilla
+        account.</P
+></LI
+><LI
+><P
+>&#13;        <B
+CLASS="command"
+>urlbase</B
+>:
+        This parameter defines the fully qualified domain name and web 
+        server path to your Bugzilla installation.</P
+><P
+>For example, if your Bugzilla query page is
+        <TT
+CLASS="filename"
+>http://www.foo.com/bugzilla/query.cgi</TT
+>, 
+        set your <SPAN
+CLASS="QUOTE"
+>"urlbase"</SPAN
+>
+        to <TT
+CLASS="filename"
+>http://www.foo.com/bugzilla/</TT
+>.</P
+></LI
+><LI
+><P
+>&#13;        <B
+CLASS="command"
+>usebuggroups</B
+>:
+        This dictates whether or not to implement group-based security for
+        Bugzilla. If set, Bugzilla bugs can have an associated 'group',
+        defining which users are allowed to see and edit the
+        bug.</P
+><P
+>Set "usebuggroups" to "on" 
+        <EM
+>only</EM
+>
+        if you may wish to restrict access to particular bugs to certain
+        groups of users. I suggest leaving
+        this parameter <EM
+>off</EM
+>
+        while initially testing your Bugzilla.</P
+></LI
+><LI
+><P
+>&#13;        <B
+CLASS="command"
+>usebuggroupsentry</B
+>:
+        Bugzilla Products can have a group associated with them, so that
+        certain users can only see bugs in certain products. When this parameter
+        is set to <SPAN
+CLASS="QUOTE"
+>"on"</SPAN
+>, this places all newly-created bugs in the
+        group for their product immediately.</P
+></LI
+><LI
+><P
+>&#13;        <B
+CLASS="command"
+>shadowdb</B
+>:
+        You run into an interesting problem when Bugzilla reaches a
+        high level of continuous activity. MySQL supports only table-level
+        write locking. What this means is that if someone needs to make a
+        change to a bug, they will lock the entire table until the operation
+        is complete. Locking for write also blocks reads until the write is
+        complete. The 
+        <SPAN
+CLASS="QUOTE"
+>"shadowdb"</SPAN
+>
+        parameter was designed to get around this limitation. While only a
+        single user is allowed to write to a table at a time, reads can
+        continue unimpeded on a read-only shadow copy of the database.
+        Although your database size will double, a shadow database can cause
+        an enormous performance improvement when implemented on extremely
+        high-traffic Bugzilla databases.</P
+><P
+>&#13;        As a guide, mozilla.org began needing 
+        <SPAN
+CLASS="QUOTE"
+>"shadowdb"</SPAN
+>
+        when they reached around 40,000 Bugzilla users with several hundred
+        Bugzilla bug changes and comments per day.</P
+><P
+>The value of the parameter defines the name of the 
+        shadow bug database. 
+        Set "shadowdb" to e.g. "bug_shadowdb" if you will be running a
+        *very* large installation of Bugzilla. 
+        <DIV
+CLASS="note"
+><P
+></P
+><TABLE
+CLASS="note"
+WIDTH="100%"
+BORDER="0"
+><TR
+><TD
+WIDTH="25"
+ALIGN="CENTER"
+VALIGN="TOP"
+><IMG
+SRC="../images/note.gif"
+HSPACE="5"
+ALT="Note"></TD
+><TD
+ALIGN="LEFT"
+VALIGN="TOP"
+><P
+>Enabling "shadowdb" can adversely affect the stability of
+          your installation of Bugzilla. You should regularly check that your
+          database is in sync. It is often advisable to force a shadow
+          database sync nightly via 
+          <SPAN
+CLASS="QUOTE"
+>"cron"</SPAN
+>.
+          </P
+></TD
+></TR
+></TABLE
+></DIV
+>
+        </P
+><P
+>If you use the "shadowdb" option, it is only natural that you
+        should turn the "queryagainstshadowdb" option on as well. Otherwise
+        you are replicating data into a shadow database for no reason!</P
+></LI
+><LI
+><P
+>&#13;        <B
+CLASS="command"
+>shutdownhtml</B
+>:
+
+        If you need to shut down Bugzilla to perform administration, enter
+        some descriptive HTML here and anyone who tries to use Bugzilla will
+        receive a page to that effect. Obviously, editparams.cgi will
+        still be accessible so you can remove the HTML and re-enable Bugzilla.
+        :-)
+        </P
+></LI
+><LI
+><P
+>&#13;        <B
+CLASS="command"
+>passwordmail</B
+>:
+
+        Every time a user creates an account, the text of
+        this parameter (with substitutions) is sent to the new user along with
+        their password message.</P
+><P
+>Add any text you wish to the "passwordmail" parameter box. For
+        instance, many people choose to use this box to give a quick training
+        blurb about how to use Bugzilla at your site.</P
+></LI
+><LI
+><P
+>&#13;        <B
+CLASS="command"
+>useqacontact</B
+>:
+
+        This allows you to define an email address for each component, in
+        addition
+        to that of the default owner, who will be sent carbon copies of
+        incoming bugs.</P
+></LI
+><LI
+><P
+>&#13;        <B
+CLASS="command"
+>usestatuswhiteboard</B
+>:
+        This defines whether you wish to have a free-form, overwritable field
+        associated with each bug. The advantage of the Status Whiteboard is
+        that it can be deleted or modified with ease, and provides an
+        easily-searchable field for indexing some bugs that have some trait
+        in common.         
+        </P
+></LI
+><LI
+><P
+>&#13;        <B
+CLASS="command"
+>whinedays</B
+>:
+        Set this to the number of days you want to let bugs go
+        in the NEW or REOPENED state before notifying people they have
+        untouched new bugs. If you do not plan to use this feature, simply do
+        not set up the whining cron job described in the installation
+        instructions, or set this value to "0" (never whine).</P
+></LI
+><LI
+><P
+>&#13;        <B
+CLASS="command"
+>commenton*</B
+>:
+        All these
+        fields allow you to dictate what changes can pass without comment,
+        and which must have a comment from the person who changed them.
+        Often, administrators will allow users to add themselves to the CC
+        list, accept bugs, or change the Status Whiteboard without adding a
+        comment as to their reasons for the change, yet require that most
+        other changes come with an explanation.</P
+><P
+>Set the "commenton" options according to your site policy. It
+        is a wise idea to require comments when users resolve, reassign, or
+        reopen bugs at the very least. 
+        <DIV
+CLASS="note"
+><P
+></P
+><TABLE
+CLASS="note"
+WIDTH="100%"
+BORDER="0"
+><TR
+><TD
+WIDTH="25"
+ALIGN="CENTER"
+VALIGN="TOP"
+><IMG
+SRC="../images/note.gif"
+HSPACE="5"
+ALT="Note"></TD
+><TD
+ALIGN="LEFT"
+VALIGN="TOP"
+><P
+>It is generally far better to require a developer comment
+          when resolving bugs than not. Few things are more annoying to bug
+          database users than having a developer mark a bug "fixed" without
+          any comment as to what the fix was (or even that it was truly
+          fixed!)</P
+></TD
+></TR
+></TABLE
+></DIV
+>
+        </P
+></LI
+><LI
+><P
+>&#13;        <B
+CLASS="command"
+>supportwatchers</B
+>:
+
+        Turning on this option allows users to ask to receive copies of 
+        all a particular other user's bug email. This is, of
+        course, subject to the groupset restrictions on the bug; if the 
+        <SPAN
+CLASS="QUOTE"
+>"watcher"</SPAN
+>
+        would not normally be allowed to view a bug, the watcher cannot get
+        around the system by setting herself up to watch the bugs of someone
+        with bugs outside her privileges. They would still only receive email
+        updates for those bugs she could normally view.</P
+></LI
+></OL
+></DIV
+></DIV
+><DIV
+CLASS="NAVFOOTER"
+><HR
+ALIGN="LEFT"
+WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+><A
+HREF="administration.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="index.html"
+ACCESSKEY="H"
+>Home</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+><A
+HREF="useradmin.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+>Administering Bugzilla</TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="administration.html"
+ACCESSKEY="U"
+>Up</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+>User Administration</TD
+></TR
+></TABLE
+></DIV
+></BODY
+></HTML
+>
\ No newline at end of file
diff --git a/docs/html/patches.html b/docs/html/patches.html
index 877cb9134..c2637937b 100644
--- a/docs/html/patches.html
+++ b/docs/html/patches.html
@@ -4,19 +4,22 @@
 >Useful Patches and Utilities for Bugzilla</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
 HREF="index.html"><LINK
 REL="PREVIOUS"
-TITLE="MySQL Permissions & Grant Tables"
-HREF="granttables.html"><LINK
+TITLE="MySQL Bugzilla Database Introduction"
+HREF="dbdoc.html"><LINK
 REL="NEXT"
-TITLE="Apache mod_rewrite magic"
+TITLE="Apache 
+    mod_rewrite
+
+    magic"
 HREF="rewrite.html"></HEAD
 ><BODY
-CLASS="APPENDIX"
+CLASS="appendix"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -25,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -41,7 +45,8 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="granttables.html"
+HREF="dbdoc.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -55,6 +60,7 @@ ALIGN="right"
 VALIGN="bottom"
 ><A
 HREF="rewrite.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -63,12 +69,10 @@ HREF="rewrite.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="APPENDIX"
+CLASS="appendix"
 ><H1
 ><A
-NAME="PATCHES"
->Appendix D. Useful Patches and Utilities for Bugzilla</A
-></H1
+NAME="patches">Appendix C. Useful Patches and Utilities for Bugzilla</H1
 ><DIV
 CLASS="TOC"
 ><DL
@@ -77,43 +81,33 @@ CLASS="TOC"
 >Table of Contents</B
 ></DT
 ><DT
->D.1. <A
+>C.1. <A
 HREF="rewrite.html"
->Apache <TT
-CLASS="FILENAME"
+>Apache 
+    <TT
+CLASS="filename"
 >mod_rewrite</TT
-> magic</A
+>
+
+    magic</A
 ></DT
 ><DT
->D.2. <A
-HREF="setperl.html"
->The setperl.csh Utility</A
-></DT
-><DT
->D.3. <A
+>C.2. <A
 HREF="cmdline.html"
 >Command-line Bugzilla Queries</A
 ></DT
-><DT
->D.4. <A
-HREF="quicksearch.html"
->The Quicksearch Utility</A
-></DT
-><DT
->D.5. <A
-HREF="bzhacking.html"
->Hacking Bugzilla</A
-></DT
 ></DL
 ></DIV
 ><P
->Are you looking for a way to put your Bugzilla into overdrive?  Catch some of the niftiest tricks here in this section.</P
+>Are you looking for a way to put your Bugzilla into overdrive? Catch
+  some of the niftiest tricks here in this section.</P
 ></DIV
 ><DIV
 CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -124,7 +118,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="granttables.html"
+HREF="dbdoc.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -133,6 +128,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -141,6 +137,7 @@ ALIGN="right"
 VALIGN="top"
 ><A
 HREF="rewrite.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -149,7 +146,7 @@ HREF="rewrite.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->MySQL Permissions &#38; Grant Tables</TD
+>MySQL Bugzilla Database Introduction</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
@@ -159,10 +156,13 @@ VALIGN="top"
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->Apache <TT
-CLASS="FILENAME"
+>Apache 
+    <TT
+CLASS="filename"
 >mod_rewrite</TT
-> magic</TD
+>
+
+    magic</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/postinstall-check.html b/docs/html/postinstall-check.html
deleted file mode 100644
index 5b0cbbb7a..000000000
--- a/docs/html/postinstall-check.html
+++ /dev/null
@@ -1,559 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->Post-Installation Checklist</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="Administering Bugzilla"
-HREF="administration.html"><LINK
-REL="PREVIOUS"
-TITLE="Administering Bugzilla"
-HREF="administration.html"><LINK
-REL="NEXT"
-TITLE="User Administration"
-HREF="useradmin.html"></HEAD
-><BODY
-CLASS="SECTION"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="administration.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Chapter 4. Administering Bugzilla</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="useradmin.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECTION"
-><H1
-CLASS="SECTION"
-><A
-NAME="POSTINSTALL-CHECK"
->4.1. Post-Installation Checklist</A
-></H1
-><P
->      After installation, follow the checklist below to help ensure
-      that you have a successful installation. If you do not see a
-      recommended setting for a parameter, consider leaving it at the
-      default while you perform your initial tests on your Bugzilla
-      setup.
-    </P
-><DIV
-CLASS="PROCEDURE"
-><OL
-TYPE="1"
-><LI
-><P
->	  Bring up <TT
-CLASS="FILENAME"
->editparams.cgi</TT
-> in your web
-	  browser.  This should be available as the <SPAN
-CLASS="QUOTE"
->"edit
-	    parameters"</SPAN
-> link from any Bugzilla screen once you
-	  have logged in.
-	</P
-></LI
-><LI
-><P
->The <SPAN
-CLASS="QUOTE"
->"maintainer"</SPAN
-> is the email address of
-	  the person responsible for maintaining this Bugzilla
-	  installation.  The maintainer need not be a valid Bugzilla
-	  user.  Error pages, error emails, and administrative mail
-	  will be sent with the maintainer as the return email
-	  address.</P
-><P
->	  Set <SPAN
-CLASS="QUOTE"
->"maintainer"</SPAN
-> to <EM
->your</EM
-> email address.
-	  This allows Bugzilla's error messages to display your email
-	  address and allow people to contact you for help.
-	</P
-></LI
-><LI
-><P
->The <SPAN
-CLASS="QUOTE"
->"urlbase"</SPAN
-> parameter defines the fully
-	  qualified domain name and web server path to your Bugzilla
-	  installation.</P
-><P
->	  For example, if your bugzilla query page is
-	  http://www.foo.com/bugzilla/query.cgi, set your
-	  <SPAN
-CLASS="QUOTE"
->"urlbase"</SPAN
-> is http://www.foo.com/bugzilla/.  
-	</P
-></LI
-><LI
-><P
-><SPAN
-CLASS="QUOTE"
->"usebuggroups"</SPAN
-> dictates whether or not to
-	  implement group-based security for Bugzilla.  If set,
-	  Bugzilla bugs can have an associated groupmask defining
-	  which groups of users are allowed to see and edit the
-	  bug.</P
-><P
->	  Set "usebuggroups" to "on" <EM
->only</EM
-> if you
-	  may wish to restrict access to products. I suggest leaving
-	  this parameter <EM
->off</EM
-> while initially
-	  testing your Bugzilla.  
-	</P
-></LI
-><LI
-><P
->	  <SPAN
-CLASS="QUOTE"
->"usebuggroupsentry"</SPAN
->, when set to
-	  <SPAN
-CLASS="QUOTE"
->"on"</SPAN
->, requires that all bugs have an associated
-	  groupmask when submitted.  This parameter is made for those
-	  installations where product isolation is a necessity.
-	</P
-><P
->	  Set "usebuggroupsentry" to "on" if you absolutely need to
-	  restrict access to bugs from the moment they are submitted
-	  through resolution. Once again, if you are simply testing
-	  your installation, I suggest against turning this parameter
-	  on; the strict security checking may stop you from being
-	  able to modify your new entries.
-	</P
-></LI
-><LI
-><P
->	  You run into an interesting problem when Bugzilla reaches a
-	  high level of continuous activity.  MySQL supports only
-	  table-level write locking.  What this means is that if
-	  someone needs to make a change to a bug, they will lock the
-	  entire table until the operation is complete.  Locking for
-	  write also blocks reads until the write is complete.  The
-	  <SPAN
-CLASS="QUOTE"
->"shadowdb"</SPAN
-> parameter was designed to get around
-	  this limitation.  While only a single user is allowed to
-	  write to a table at a time, reads can continue unimpeded on
-	  a read-only shadow copy of the database.  Although your
-	  database size will double, a shadow database can cause an
-	  enormous performance improvement when implemented on
-	  extremely high-traffic Bugzilla databases.
-	</P
-><P
->	  Set "shadowdb" to "bug_shadowdb" if you will be running a
-	  *very* large installation of Bugzilla. The shadow database
-	  enables many simultaneous users to read and write to the
-	  database without interfering with one another.  
-	  <DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	      Enabling "shadowdb" can adversely affect the stability
-	      of your installation of Bugzilla. You should regularly
-	      check that your database is in sync.  It is often
-	      advisable to force a shadow database sync nightly via
-	      <SPAN
-CLASS="QUOTE"
->"cron"</SPAN
->.
-	    </P
-></TD
-></TR
-></TABLE
-></DIV
-> Once again, in testing you should avoid this option
-	  -- use it if or when you <EM
->need</EM
-> to use
-	  it, and have repeatedly run into the problem it was designed
-	  to solve -- very long wait times while attempting to commit
-	  a change to the database.  Mozilla.org began needing
-	  <SPAN
-CLASS="QUOTE"
->"shadowdb"</SPAN
-> when they reached around 40,000
-	  Bugzilla users with several hundred Bugzilla bug changes and
-	  comments per day.
-        </P
-><P
->	  If you use the "shadowdb" option, it is only natural that
-	  you should turn the "queryagainstshadowdb" option "On" as
-	  well.  Otherwise you are replicating data into a shadow
-	  database for no reason!
-	</P
-></LI
-><LI
-><P
-><SPAN
-CLASS="QUOTE"
->"headerhtml"</SPAN
->, <SPAN
-CLASS="QUOTE"
->"footerhtml"</SPAN
->,
-	  <SPAN
-CLASS="QUOTE"
->"errorhtml"</SPAN
->, <SPAN
-CLASS="QUOTE"
->"bannerhtml"</SPAN
->, and
-	  <SPAN
-CLASS="QUOTE"
->"blurbhtml"</SPAN
-> are all templates which control
-	  display of headers, footers, errors, banners, and additional
-	  data.  We could go into some detail regarding the usage of
-	  these, but it is really best just to monkey around with them
-	  a bit to see what they do.  I strongly recommend you copy
-	  your <TT
-CLASS="FILENAME"
->data/params</TT
-> file somewhere safe
-	  before playing with these values, though.  If they are
-	  changed dramatically, it may make it impossible for you to
-	  display Bugzilla pages to fix the problem until you have
-	  restored your <TT
-CLASS="FILENAME"
->data/params</TT
-> file.</P
-><P
->	  If you have custom logos or HTML you must put in place to
-	  fit within your site design guidelines, place the code in
-	  the "headerhtml", "footerhtml", "errorhtml", "bannerhtml",
-	  or "blurbhtml" text boxes.
-	  <DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	      The "headerhtml" text box is the HTML printed out
-	      <EM
->before</EM
-> any other code on the page,
-	      except the CONTENT-TYPE header sent by the Bugzilla
-	      engine. If you have a special banner, put the code for
-	      it in "bannerhtml". You may want to leave these settings
-	      at the defaults initially.
-	    </P
-></TD
-></TR
-></TABLE
-></DIV
->
-	</P
-></LI
-><LI
-><P
-><SPAN
-CLASS="QUOTE"
->"passwordmail"</SPAN
-> is rather simple.  Every
-	  time a user creates an account, the text of this parameter
-	  is read as the text to send to the new user along with their
-	  password message.</P
-><P
->	  Add any text you wish to the "passwordmail" parameter box.
-	  For instance, many people choose to use this box to give a
-	  quick training blurb about how to use Bugzilla at your site.
-        </P
-></LI
-><LI
-><P
-><SPAN
-CLASS="QUOTE"
->"useqacontact"</SPAN
-> allows you to define an
-	  email address for each component, in addition to that of the
-	  default owner, who will be sent carbon copies of incoming
-	  bugs.  The critical difference between a QA Contact and an
-	  Owner is that the QA Contact follows the component.  If you
-	  reassign a bug from component A to component B, the QA
-	  Contact for that bug will change with the reassignment,
-	  regardless of owner.</P
-><P
-><SPAN
-CLASS="QUOTE"
->"usestatuswhiteboard"</SPAN
-> defines whether you
-	  wish to have a free-form, overwritable field associated with
-	  each bug.  The advantage of the Status Whiteboard is that it
-	  can be deleted or modified with ease, and provides an
-	  easily-searchable field for indexing some bugs that have
-	  some trait in common.  Many people will put <SPAN
-CLASS="QUOTE"
->"help
-	    wanted"</SPAN
->, <SPAN
-CLASS="QUOTE"
->"stalled"</SPAN
->, or <SPAN
-CLASS="QUOTE"
->"waiting
-	    on reply from somebody"</SPAN
-> messages into the Status
-	  Whiteboard field so those who peruse the bugs are aware of
-	  their status even more than that which can be indicated by
-	  the Resolution fields.</P
-><P
->	  Do you want to use the QA Contact ("useqacontact") and
-	  status whiteboard ("usestatuswhiteboard") fields? These
-	  fields are useful because they allow for more flexibility,
-	  particularly when you have an existing Quality Assurance
-	  and/or Release Engineering team,  but they may not be needed
-	  for many smaller installations.
-	</P
-></LI
-><LI
-><P
->	  Set "whinedays" to the amount of days you want to let bugs
-	  go in the "New" or "Reopened" state before notifying people
-	  they have untouched new bugs.  If you do not plan to use
-	  this feature, simply do not set up the whining cron job
-	  described in the installation instructions, or set this
-	  value to "0" (never whine).
-	</P
-></LI
-><LI
-><P
-><SPAN
-CLASS="QUOTE"
->"commenton"</SPAN
-> fields allow you to dictate
-	  what changes can pass without comment, and which must have a
-	  comment from the person who changed them.  Often,
-	  administrators will allow users to add themselves to the CC
-	  list, accept bugs, or change the Status Whiteboard without
-	  adding a comment as to their reasons for the change, yet
-	  require that most other changes come with an
-	  explanation.</P
-><P
->	  Set the "commenton" options according to your site policy.
-	  It is a wise idea to require comments when users resolve,
-	  reassign, or reopen bugs at the very least.
-	  <DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	      It is generally far better to require a developer
-	      comment when resolving bugs than not. Few things are
-	      more annoying to bug database users than having a
-	      developer mark a bug "fixed" without any comment as to
-	      what the fix was (or even that it was truly fixed!)
-	    </P
-></TD
-></TR
-></TABLE
-></DIV
->
-	</P
-></LI
-><LI
-><P
->The <SPAN
-CLASS="QUOTE"
->"supportwatchers"</SPAN
-> option can be an
-	  exceptionally powerful tool in the hands of a power Bugzilla
-	  user.  By enabling this option, you allow users to receive
-	  email updates whenever other users receive email updates.
-	  This is, of course, subject to the groupset restrictions on
-	  the bug; if the <SPAN
-CLASS="QUOTE"
->"watcher"</SPAN
-> would not normally be
-	  allowed to view a bug, the watcher cannot get around the
-	  system by setting herself up to watch the bugs of someone
-	  with bugs outside her priveleges.  She would still only
-	  receive email updates for those bugs she could normally
-	  view.</P
-><P
->For Bugzilla sites which require strong inter-Product
-	  security to prevent snooping, watchers are not a good
-	  idea.</P
-><P
->	  However, for most sites you should set
-	  <SPAN
-CLASS="QUOTE"
->"supportwatchers"</SPAN
-> to "On".  This feature is
-	  helpful for team leads to monitor progress in their
-	  respective areas, and can offer many other benefits, such as
-	  allowing a developer to pick up a former engineer's bugs
-	  without requiring her to change all the information in the
-	  bug.
-	</P
-></LI
-></OL
-></DIV
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="administration.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="useradmin.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->Administering Bugzilla</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="administration.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->User Administration</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/programadmin.html b/docs/html/programadmin.html
index ea2bcbcfc..f047dbcad 100644
--- a/docs/html/programadmin.html
+++ b/docs/html/programadmin.html
@@ -1,11 +1,10 @@
 <HTML
 ><HEAD
 ><TITLE
->Product, Component, Milestone, and Version
-      Administration</TITLE
+>Product, Component, Milestone, and Version Administration</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -17,10 +16,10 @@ REL="PREVIOUS"
 TITLE="User Administration"
 HREF="useradmin.html"><LINK
 REL="NEXT"
-TITLE="Bugzilla Security"
-HREF="security.html"></HEAD
+TITLE="Voting"
+HREF="voting.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -29,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -46,19 +46,21 @@ ALIGN="left"
 VALIGN="bottom"
 ><A
 HREF="useradmin.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Chapter 4. Administering Bugzilla</TD
+>Chapter 5. Administering Bugzilla</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="security.html"
+HREF="voting.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -67,769 +69,168 @@ HREF="security.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="PROGRAMADMIN"
->4.3. Product, Component, Milestone, and Version
-      Administration</A
-></H1
-><TABLE
-BORDER="0"
-WIDTH="100%"
-CELLSPACING="0"
-CELLPADDING="0"
-CLASS="EPIGRAPH"
-><TR
-><TD
-WIDTH="45%"
->&nbsp;</TD
-><TD
-WIDTH="45%"
-ALIGN="LEFT"
-VALIGN="TOP"
-><I
-><P
-><I
->Dear Lord, we have to get our users to do WHAT?</I
-></P
-></I
-></TD
-></TR
-></TABLE
+NAME="programadmin">5.3. Product, Component, Milestone, and Version Administration</H1
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="PRODUCTS"
->4.3.1. Products</A
-></H2
-><FONT
-COLOR="RED"
->Formerly, and in some spots still, called
-	"Programs"</FONT
+NAME="products">5.3.1. Products</H2
 ><P
->	<A
-HREF="glossary.html#GLOSS_PRODUCT"
+>&#13;      <A
+HREF="glossary.html#gloss-product"
 ><I
-CLASS="GLOSSTERM"
->Products</I
+CLASS="glossterm"
+>&#13;      Products</I
 ></A
-> are
-	the broadest category in Bugzilla, and you should have the
-	least of these. If your company makes computer games, you
-	should have one product per game, and possibly a few special
-	products (website, meetings...)
-      </P
-><P
->	A Product (formerly called "Program", and still referred to
-	that way in some portions of the source code) controls some
-	very important functions. The number of "votes" available for
-	users to vote for the most important bugs is set per-product,
-	as is the number of votes required to move a bug automatically
-	from the UNCONFIRMED status to the NEW status.  One can close
-	a Product for further bug entry and define various Versions
-	available from the Edit product screen.
-      </P
-><P
->To create a new product:</P
-><P
-></P
-><OL
-TYPE="1"
-><LI
-><P
->	    Select "components" from the yellow footer
-	  </P
-><DIV
-CLASS="TIP"
-><P
-></P
-><TABLE
-CLASS="TIP"
-WIDTH="90%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/tip.gif"
-HSPACE="5"
-ALT="Tip"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	      It may seem counterintuitive to click "components" when
-	      you want to edit the properties associated with
-	      Products.  This is one of a long list of things we want
-	      in Bugzilla 3.0...
-	    </P
-></TD
-></TR
-></TABLE
-></DIV
-></LI
-><LI
-><P
->	    Select the "Add" link to the right of "Add a new product".
-	  </P
-></LI
-><LI
-><P
->	    Enter the name of the product and a description. The
-	    Description field is free-form.
-	  </P
-></LI
-></OL
-><DIV
-CLASS="TIP"
-><P
-></P
-><TABLE
-CLASS="TIP"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/tip.gif"
-HSPACE="5"
-ALT="Tip"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	  Don't worry about the "Closed for bug entry", "Maximum Votes
-	  per person",  "Maximum votes a person can put on a single
-	  bug", "Number of votes a bug in this Product needs to
-	  automatically get out of the UNCOMFIRMED state", and
-	  "Version" options yet. We'll cover those in a few moments.
-	</P
-></TD
-></TR
-></TABLE
-></DIV
-></DIV
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="COMPONENTS"
->4.3.2. Components</A
-></H2
-><P
->	Components are subsections of a Product. 
+>
 
-	<DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN1461"
-></A
-><P
-><B
->Example 4-1. Creating some Components</B
-></P
-><DIV
-CLASS="INFORMALEXAMPLE"
-><A
-NAME="AEN1463"
-></A
-><P
-></P
+      are the broadest category in Bugzilla, and tend to represent real-world
+      shipping products. E.g. if your company makes computer games, 
+      you should have one product per game, perhaps a "Common" product for 
+      units of technology used in multiple games, and maybe a few special
+       products (Website, Administration...)</P
+><P
+>Many of Bugzilla's settings are configurable on a per-product
+      basis. The number of "votes" available to users is set per-product, 
+      as is the number of votes
+      required to move a bug automatically from the UNCONFIRMED status to the
+      NEW status.</P
 ><P
->	      The computer game you are designing may have a "UI"
-	      component, an "API" component, a "Sound System"
-	      component, and a "Plugins" component,  each overseen by
-	      a different programmer.  It often makes sense to divide
-	      Components in Bugzilla according to the natural
-	      divisions of responsibility within your Product  or
-	      company.
-	    </P
-><P
-></P
-></DIV
-></DIV
-> Each component has a owner and (if you turned it on
-	in the parameters), a QA  Contact. The owner should be the
-	primary person who fixes bugs in that component.  The  QA
-	Contact should be the person who will ensure these bugs are
-	completely fixed. The Owner, QA Contact, and Reporter will get
-	email when new bugs are created in this Component and when
-	these bugs change. Default Owner and Default QA Contact fields
-	only dictate the <EM
->default assignments</EM
->; the
-	Owner and QA Contact fields in a bug  are otherwise unrelated
-	to the Component.
-      </P
-><P
->	To create a new Component:
-      </P
+>To create a new product:</P
 ><P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->	    Select the "Edit components" link from the "Edit product"
-	    page
-	  </P
-></LI
-><LI
-><P
->	    Select the "Add" link to the right of the "Add a new
-	    component" text on the "Select Component" page.
-	  </P
-></LI
-><LI
-><P
->	    Fill out the "Component" field, a short "Description", and
-	    the "Initial Owner". The Component and Description fields
-	    are free-form; the "Initial Owner" field must be that of a
-	    user ID already existing in the database.  If the initial
-	    owner does not exist, Bugzilla will refuse to create the
-	    component.
-	    <DIV
-CLASS="TIP"
-><P
-></P
-><TABLE
-CLASS="TIP"
-WIDTH="90%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/tip.gif"
-HSPACE="5"
-ALT="Tip"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->		Is your "Default Owner" a user who is not yet in the
-		database? No problem.
-		<P
-></P
-><OL
-TYPE="a"
-><LI
-><P
->		      Select the "Log out" link on the footer of the
-		      page.
-		    </P
+>Select "products" from the footer</P
 ></LI
 ><LI
 ><P
->		      Select the "New Account" link on the footer of
-		      the "Relogin" page
-		    </P
+>Select the "Add" link in the bottom right</P
 ></LI
 ><LI
 ><P
->		      Type in the email address of the default owner
-		      you want to create in the "E-mail address"
-		      field, and her full name in the "Real name"
-		      field, then select the "Submit Query" button.
-		    </P
-></LI
-><LI
-><P
->		      Now select "Log in" again, type in your login
-		      information, and you can modify the product to
-		      use the Default Owner information you require.
-		    </P
+>Enter the name of the product and a description. The
+          Description field may contain HTML.</P
 ></LI
 ></OL
->
-	      </P
-></TD
-></TR
-></TABLE
-></DIV
->
-	  </P
-></LI
-><LI
 ><P
->	    Either Edit more components or return to the Bugzilla
-	    Query Page. To return to the Product you were editing, you
-	    must select the Components link as before.
-	  </P
-></LI
-></OL
-></DIV
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="VERSIONS"
->4.3.3. Versions</A
-></H2
-><P
->	Versions are the revisions of the product, such as "Flinders
-	3.1", "Flinders 95", and "Flinders 2000".  Using Versions
-	helps you isolate code changes and are an aid in reporting.
-
-	<DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN1490"
-></A
-><P
-><B
->Example 4-2. Common Use of Versions</B
-></P
-><DIV
-CLASS="INFORMALEXAMPLE"
-><A
-NAME="AEN1492"
-></A
-><P
-></P
-><P
->	      A user reports a bug against Version "Beta 2.0" of your
-	      product.  The current Version of your software is
-	      "Release Candidate 1", and no longer has the bug.  This
-	      will help you triage and classify bugs according to
-	      their relevance.  It is also possible people may report
-	      bugs against bleeding-edge beta versions that are not
-	      evident in older versions of the software.  This can
-	      help isolate code changes that caused the bug
-	    </P
-><P
-></P
-></DIV
-></DIV
->
-	<DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN1494"
-></A
-><P
-><B
->Example 4-3. A Different Use of Versions</B
-></P
-><DIV
-CLASS="INFORMALEXAMPLE"
-><A
-NAME="AEN1496"
-></A
-><P
-></P
-><P
->	      This field has been used to good effect by an online
-	      service provider in a slightly different way.  They had
-	      three versions of the product: "Production", "QA", and
-	      "Dev".  Although it may be the same product, a bug in
-	      the development environment is not normally as critical
-	      as a Production bug, nor does it need to be reported
-	      publicly.  When used in conjunction with Target
-	      Milestones, one can easily specify the environment where
-	      a bug can be reproduced, and the Milestone by which it
-	      will be fixed.
-	    </P
-><P
-></P
-></DIV
-></DIV
->
-       </P
-><P
->	To create and edit Versions:
+>Don't worry about the "Closed for bug entry", "Maximum Votes
+      per person", "Maximum votes a person can put on a single bug",
+      "Number of votes a bug in this Product needs to automatically get out
+      of the UNCOMFIRMED state", and "Version" options yet. We'll cover
+      those in a few moments.
       </P
-><P
-></P
-><OL
-TYPE="1"
-><LI
-><P
->	    From the "Edit product" screen, select "Edit Versions"
-	  </P
-></LI
-><LI
-><P
->	    You will notice that the product already has the default
-	    version "undefined". If your product doesn't use version
-	    numbers, you may want to leave this as it is or edit it so
-	    that it is "---". You can then go back to the edit
-	    versions page and add new versions to your product.
-	  </P
-><P
->	    Otherwise, click the "Add" button to the right of the "Add
-	    a new version" text.
-	  </P
-></LI
-><LI
-><P
->	    Enter the name of the Version.  This can be free-form
-	    characters up to the limit of the text box.  Then select
-	    the "Add" button.
-	  </P
-></LI
-><LI
-><P
->	    At this point you can select "Edit" to edit more Versions,
-	    or return to the "Query" page, from which you can navigate
-	    back to the product through the "components" link at the
-	    foot of the Query page.
-	  </P
-></LI
-></OL
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="MILESTONES"
->4.3.4. Milestones</A
-></H2
-><P
->	Milestones are "targets" that you plan to get a bug fixed by.
-	For example, you have a bug that you plan to fix for your 3.0
-	release, it would be assigned the milestone of 3.0. Or, you
-	have a bug that you plan to fix for 2.8, this would have a
-	milestone of 2.8.
-      </P
-><DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	  Milestone options will only appear for a Product if you
-	  turned the "usetargetmilestone" field in the "Edit
-	  Parameters" screen "On".
-	</P
-></TD
-></TR
-></TABLE
-></DIV
+NAME="components">5.3.2. Components</H2
+><P
+>Components are subsections of a Product. E.g. the computer game 
+      you are designing may have a "UI"
+      component, an "API" component, a "Sound System" component, and a
+      "Plugins" component, each overseen by a different programmer. It
+      often makes sense to divide Components in Bugzilla according to the
+      natural divisions of responsibility within your Product or
+      company.</P
+><P
+>&#13;      Each component has a owner and (if you turned it on in the parameters),
+      a QA Contact. The owner should be the primary person who fixes bugs in
+      that component. The QA Contact should be the person who will ensure
+      these bugs are completely fixed. The Owner, QA Contact, and Reporter
+      will get email when new bugs are created in this Component and when
+      these bugs change. Default Owner and Default QA Contact fields only
+      dictate the 
+      <EM
+>default assignments</EM
+>; 
+      these can be changed on bug submission, or at any later point in
+      a bug's life.</P
 ><P
->	To create new Milestones, set Default Milestones, and set
-	Milestone URL: 
-      </P
+>To create a new Component:</P
 ><P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->	    Select "edit milestones"
-	  </P
-></LI
-><LI
-><P
->	    Select "Add" to the right of the "Add a new milestone"
-	    text
-	  </P
-></LI
-><LI
-><P
->	    Enter the name of the Milestone in the "Milestone" field.
-	    You can optionally set the "Sortkey", which is a positive
-	    or negative number (-255 to 255) that defines where in the
-	    list this particular milestone appears. Select "Add".
-	  </P
-><DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN1522"
-></A
-><P
-><B
->Example 4-4. Using SortKey with Target Milestone</B
-></P
-><DIV
-CLASS="INFORMALEXAMPLE"
-><A
-NAME="AEN1524"
-></A
-><P
-></P
-><P
->		Let's say you create a target milestone called
-		"Release 1.0", with Sortkey set to "0". Later, you
-		realize that you will have a public beta, called
-		"Beta1". You can create a Milestone called "Beta1",
-		with a Sortkey of "-1" in order to ensure people will
-		see the Target Milestone of "Beta1" earlier on the
-		list than "Release 1.0"
-	      </P
-><P
-></P
-></DIV
-></DIV
-></LI
-><LI
-><P
->	    If you want to add more milestones, select the "Edit"
-	    link. If you don't, well shoot, you have to go back to the
-	    "query" page and select "components" again, and make your
-	    way back to the Product you were editing.
-	    <DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="90%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->		This is another in the list of unusual user interface
-		decisions that we'd like to get cleaned up.  Shouldn't
-		there be a link to the effect of "edit the Product I
-		was editing when I ended up here"?  In any case,
-		clicking "components" in the footer takes you back to
-		the "Select product" screen, from which you can begin
-		editing your product again.
-	      </P
-></TD
-></TR
-></TABLE
-></DIV
->
-	  </P
+>Select the "Edit components" link from the "Edit product"
+          page</P
 ></LI
 ><LI
 ><P
->	    From the Edit product screen again (once you've made your
-	    way back), enter the URL for a description of what your
-	    milestones are for this product in the "Milestone URL"
-	    field. It should be of the format
-	    "http://www.foo.com/bugzilla/product_milestones.html"
-	  </P
-><P
->	    Some common uses of this field include product
-	    descriptions, product roadmaps, and of course a simple
-	    description of the meaning of each milestone.
-	  </P
+>Select the "Add" link in the bottom right.</P
 ></LI
 ><LI
 ><P
->	    If you're using Target Milestones, the "Default Milestone"
-	    field must have some kind of entry.  If you really don't
-	    care if people set coherent Target Milestones,  simply
-	    leave this at the default, "---".  However, controlling
-	    and regularly updating the Default Milestone field is a
-	    powerful tool when reporting the status of projects.
-	  </P
-><P
->Select the "Update" button when you are done.</P
+>Fill out the "Component" field, a short "Description", 
+          the "Initial Owner" and "Initial QA Contact" (if enabled.) 
+          The Component and Description fields may contain HTML; 
+          the "Initial Owner" field must be a login name
+          already existing in the database. 
+          </P
 ></LI
 ></OL
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="VOTING"
->4.3.5. Voting</A
-></H2
+NAME="versions">5.3.3. Versions</H2
 ><P
->	The concept of "voting" is a poorly understood, yet powerful
-	feature for the management of open-source projects.  Each user
-	is assigned so many Votes per product, which they can freely
-	reassign (or assign multiple votes to a single bug). This
-	allows developers to gauge user need for a particular
-	enhancement or bugfix.  By allowing bugs with a certain number
-	of votes to automatically move from "UNCONFIRMED" to "NEW",
-	users of the bug system can help high-priority bugs garner
-	attention so they don't sit for a long time awaiting triage.
+>Versions are the revisions of the product, such as "Flinders
+      3.1", "Flinders 95", and "Flinders 2000". Version is not a multi-select
+      field; the usual practice is to select the most recent version with
+      the bug.
       </P
 ><P
->	The daunting challenge of Votes is deciding where you draw the
-	line for a "vocal majority".  If you only have a user base of
-	100 users, setting a low threshold for bugs to move from
-	UNCONFIRMED to NEW makes sense.  As the Bugzilla user base
-	expands, however, these thresholds must be re-evaluated.  You
-	should gauge whether this feature is worth the time and close
-	monitoring involved, and perhaps forego implementation until
-	you have a critical mass of users who demand it.
-      </P
-><P
->To modify Voting settings:</P
+>To create and edit Versions:</P
 ><P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->	    Navigate to the "Edit product" screen for the Product you
-	    wish to modify
-	  </P
+>From the "Edit product" screen, select "Edit Versions"</P
 ></LI
 ><LI
 ><P
->	    Set "Maximum Votes per person" to your calculated value.
-	    Setting this field to "0" disables voting.
-	  </P
+>You will notice that the product already has the default
+          version "undefined". Click the "Add" link in the bottom right.</P
 ></LI
 ><LI
 ><P
->	    Set "Maximum Votes a person can put on a single bug" to
-	    your calculated value.  It should probably be some number
-	    lower than the "Maximum votes per person". Setting this
-	    field to "0" disables voting, but leaves the voting
-	    options open to the user.  This is confusing.
-	  </P
-></LI
-><LI
-><P
->	    Set "Number of votes a bug in this product needs to
-	    automatically get out of the UNCONFIRMED state" to your
-	    calculated number.  Setting this field to "0"  disables
-	    the automatic move of bugs from UNCONFIRMED to NEW.  Some
-	    people advocate leaving this at "0", but of what use are
-	    Votes if your Bugzilla user base is unable to affect which
-	    bugs appear on Development radar?
-	    <DIV
-CLASS="TIP"
-><P
-></P
-><TABLE
-CLASS="TIP"
-WIDTH="90%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/tip.gif"
-HSPACE="5"
-ALT="Tip"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->		You should probably set this number to higher than a
-		small coalition of Bugzilla users can influence it.
-		Most sites use this as a "referendum" mechanism -- if
-		users are able to vote a bug out of UNCONFIRMED, it is
-		a <EM
->really</EM
-> bad bug!
-	      </P
-></TD
-></TR
-></TABLE
-></DIV
->
-	  </P
-></LI
-><LI
-><P
->	    Once you have adjusted the values to your preference,
-	    select the "Update" button.
-	  </P
+>Enter the name of the Version. This field takes text only. 
+          Then click the "Add" button.</P
 ></LI
 ></OL
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
-><A
-NAME="GROUPS"
->4.3.6. Groups and Group Security</A
-></H2
-><P
->	Groups can be very useful in bugzilla, because they allow
-	users to isolate bugs or products that should only be seen by
-	certain people.  Groups can also be a complicated minefield of
-	interdependencies and weirdness if mismanaged.
-
-	<DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN1558"
-></A
-><P
-><B
->Example 4-5. When to Use Group Security</B
-></P
-><DIV
-CLASS="INFORMALEXAMPLE"
+CLASS="section"
 ><A
-NAME="AEN1560"
-></A
-><P
-></P
-><P
->	      Many Bugzilla sites isolate "Security-related" bugs from
-	      all other bugs. This way, they can have a fix ready
-	      before the security vulnerability is announced to the
-	      world.  You can create a "Security" product which, by
-	      default, has no members, and only add members to the
-	      group (in their individual User page, as described under
-	      User Administration) who should have priveleged access
-	      to "Security" bugs.  Alternately, you may create a Group
-	      independently of any Product, and change the Group mask
-	      on individual bugs to restrict access to members only of
-	      certain Groups.
-	    </P
+NAME="milestones">5.3.4. Milestones</H2
 ><P
-></P
-></DIV
-></DIV
-> Groups only work if you enable the "usebuggroups"
-	paramater. In addition, if the "usebuggroupsentry" parameter
-	is "On", one can restrict access to products by groups, so
-	that only members of a product group are able to view bugs
-	within that product. Group security in Bugzilla can be divided
-	into two categories: Generic and Product-Based.
-      </P
+>Milestones are "targets" that you plan to get a bug fixed by. For
+      example, you have a bug that you plan to fix for your 3.0 release, it
+      would be assigned the milestone of 3.0.</P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -845,119 +246,49 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  Groups in Bugzilla are a complicated beast that evolved out
-	  of very simple user permission bitmasks, apparently itself
-	  derived from common concepts in UNIX access controls.  A
-	  "bitmask" is a fixed-length number whose value can describe
-	  one, and only one, set of states.  For instance, UNIX file
-	  permissions are assigned bitmask values:  "execute" has a
-	  value of 1, "write" has a value of 2,  and "read" has a
-	  value of 4.  Add them together, and a file can be read,
-	  written to, and executed if it has a bitmask of "7". (This
-	  is a simplified example -- anybody who knows UNIX security
-	  knows there is much more to it than this.  Please bear with
-	  me for the purpose of this note.)  The only way a bitmask
-	  scheme can work is by doubling the bit count for each value.
-	  Thus if UNIX wanted to offer another file permission, the
-	  next would have to be a value of 8, then the next 16, the
-	  next 32, etc.
-	</P
-><P
->	  Similarly, Bugzilla offers a bitmask to define group
-	  permissions, with an internal limit of 64.  Several are
-	  already occupied by built-in permissions.  The way around
-	  this limitation is to avoid assigning groups to products if
-	  you have many products, avoid bloating of group lists, and
-	  religiously prune irrelevant groups.  In reality, most
-	  installations of Bugzilla support far fewer than 64 groups,
-	  so this limitation has not hit for most sites, but it is on
-	  the table to be revised for Bugzilla 3.0 because it
-	  interferes with the security schemes of some administrators.
-	</P
+>Milestone options will only appear for a Product if you turned
+        on the "usetargetmilestone" Param in the "Edit Parameters" screen.
+        </P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ><P
->	To enable Generic Group Security ("usebuggroups"):
-      </P
+>To create new Milestones, set Default Milestones, and set
+      Milestone URL:</P
 ><P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->	    Turn "On" "usebuggroups" in the "Edit Parameters" screen.
-	  </P
+>Select "Edit milestones" from the "Edit product" page.</P
 ></LI
 ><LI
 ><P
->	    You will generally have no groups set up.  Select the
-	    "groups" link in the footer.
-	  </P
+>Select "Add" in the bottom right corner.
+          text</P
 ></LI
 ><LI
 ><P
->	    Take a moment to understand the instructions on the "Edit
-	    Groups" screen. Once you feel confident you understand
-	    what is expected of you, select the "Add Group" link.
-	  </P
+>Enter the name of the Milestone in the "Milestone" field. You
+          can optionally set the "sortkey", which is a positive or negative
+          number (-255 to 255) that defines where in the list this particular
+          milestone appears. This is because milestones often do not 
+          occur in alphanumeric order For example, "Future" might be
+          after "Release 1.2". Select "Add".</P
 ></LI
 ><LI
 ><P
->	    Fill out the "New Name" (remember, no spaces!), "New
-	    Description", and "New User RegExp" fields.  "New User
-	    RegExp" allows you to automatically place all users who
-	    fulfill the Regular Expression into the new group.
-
-	    <DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN1575"
-></A
-><P
-><B
->Example 4-6. Creating a New Group</B
-></P
+>From the Edit product screen, you can enter the URL of a 
+          page which gives information about your milestones and what
+          they mean. </P
 ><DIV
-CLASS="INFORMALEXAMPLE"
-><A
-NAME="AEN1577"
-></A
-><P
-></P
-><P
->		  I created a group called DefaultGroup with a
-		  description of <SPAN
-CLASS="QUOTE"
->"This is simply a group to play
-		  with"</SPAN
->, and a New User RegExp of <SPAN
-CLASS="QUOTE"
->".*@mydomain.tld"</SPAN
->.
-		  This new group automatically includes all Bugzilla
-		  users with "@mydomain.tld" at the end of their user id.
-		  When I finished, my new group was assigned bit #128.
-		</P
-><P
-></P
-></DIV
-></DIV
-> When you have finished, select the Add
-	    button.
-	  </P
-></LI
-></OL
-><P
->	To enable Product-Based Group Security (usebuggroupsentry):
-      </P
-><DIV
-CLASS="WARNING"
+CLASS="tip"
 ><P
 ></P
 ><TABLE
-CLASS="WARNING"
+CLASS="tip"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -966,189 +297,23 @@ WIDTH="25"
 ALIGN="CENTER"
 VALIGN="TOP"
 ><IMG
-SRC="../images/warning.gif"
-HSPACE="5"
-ALT="Warning"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	  Don't forget that you only have 64 groups masks available,
-	  total, for your installation of Bugzilla!  If you plan on
-	  having more than 50 products in your individual Bugzilla
-	  installation, and require group security for your products,
-	  you should consider either running multiple Bugzillas or
-	  using Generic Group Security instead of Product-Based
-	  ("usebuggroupsentry") Group Security.
-	</P
-></TD
-></TR
-></TABLE
-></DIV
-><P
-></P
-><OL
-TYPE="1"
-><LI
-><P
->	    Turn "On" "usebuggroups" and "usebuggroupsentry" in the
-	    "Edit Parameters" screen.
-	  </P
-><DIV
-CLASS="WARNING"
-><P
-></P
-><TABLE
-CLASS="WARNING"
-WIDTH="90%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/warning.gif"
+SRC="../images/tip.gif"
 HSPACE="5"
-ALT="Warning"></TD
+ALT="Tip"></TD
 ><TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	      "usebuggroupsentry" has the capacity to prevent the
-	      administrative user from directly altering bugs because
-	      of conflicting group permissions. If you plan on using
-	      "usebuggroupsentry", you should plan on restricting
-	      administrative account usage to administrative duties
-	      only. In other words, manage bugs with an unpriveleged
-	      user account, and manage users, groups, Products, etc.
-	      with the administrative account.
-	    </P
+>If you want your milestone document to be restricted so
+          that it can only be viewed by people in a particular Bugzilla
+          group, the best way is to attach the document to a bug in that
+          group, and make the URL the URL of that attachment.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ></LI
-><LI
-><P
->	    You will generally have no Groups set up, unless you
-	    enabled "usebuggroupsentry" prior to creating any
-	    Products.  To create "Generic Group Security" groups,
-	    follow the instructions given above.  To create
-	    Product-Based Group security, simply follow the
-	    instructions for creating a new Product.  If you need to
-	    add users to these new groups as you create them, you will
-	    find the option to add them to the group available under
-	    the "Edit User" screens.
-	  </P
-></LI
 ></OL
-><P
->	You may find this example illustrative for how bug groups work.
-	<DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN1592"
-></A
-><P
-><B
->Example 4-7. Bugzilla Groups</B
-></P
-><P
-CLASS="LITERALLAYOUT"
->Bugzilla&nbsp;Groups&nbsp;example<br>
------------------------<br>
-<br>
-For&nbsp;this&nbsp;example,&nbsp;let&nbsp;us&nbsp;suppose&nbsp;we&nbsp;have&nbsp;four&nbsp;groups,&nbsp;call&nbsp;them<br>
-Group1,&nbsp;Group2,&nbsp;Group3,&nbsp;and&nbsp;Group4.<br>
-<br>
-We&nbsp;have&nbsp;5&nbsp;users,&nbsp;User1,&nbsp;User2,&nbsp;User3,&nbsp;User4,&nbsp;User5.<br>
-<br>
-We&nbsp;have&nbsp;8&nbsp;bugs,&nbsp;Bug1,&nbsp;...,&nbsp;Bug8.<br>
-<br>
-Group&nbsp;membership&nbsp;is&nbsp;defined&nbsp;by&nbsp;this&nbsp;chart:<br>
-(X&nbsp;denotes&nbsp;that&nbsp;user&nbsp;is&nbsp;in&nbsp;that&nbsp;group.)<br>
-(I&nbsp;apologize&nbsp;for&nbsp;the&nbsp;nasty&nbsp;formatting&nbsp;of&nbsp;this&nbsp;table.&nbsp;&nbsp;Try&nbsp;viewing<br>
-it&nbsp;in&nbsp;a&nbsp;text-based&nbsp;browser&nbsp;or&nbsp;something&nbsp;for&nbsp;now.&nbsp;-MPB)<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G&nbsp;G&nbsp;G&nbsp;G<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;r&nbsp;r&nbsp;r<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;o&nbsp;o&nbsp;o<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u&nbsp;u&nbsp;u&nbsp;u<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;p&nbsp;p&nbsp;p<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;2&nbsp;3&nbsp;4<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-User1|X|&nbsp;|&nbsp;|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-User2|&nbsp;|X|&nbsp;|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-User3|X|&nbsp;|X|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-User4|X|X|X|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-User5|&nbsp;|&nbsp;|&nbsp;|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-<br>
-Bug&nbsp;restrictions&nbsp;are&nbsp;defined&nbsp;by&nbsp;this&nbsp;chart:<br>
-(X&nbsp;denotes&nbsp;that&nbsp;bug&nbsp;is&nbsp;restricted&nbsp;to&nbsp;that&nbsp;group.)<br>
-<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G&nbsp;G&nbsp;G&nbsp;G<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;r&nbsp;r&nbsp;r<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;o&nbsp;o&nbsp;o<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u&nbsp;u&nbsp;u&nbsp;u<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;p&nbsp;p&nbsp;p<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;2&nbsp;3&nbsp;4<br>
-&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-Bug1|&nbsp;|&nbsp;|&nbsp;|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-Bug2|&nbsp;|X|&nbsp;|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-Bug3|&nbsp;|&nbsp;|X|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-Bug4|&nbsp;|&nbsp;|&nbsp;|X|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-Bug5|X|X|&nbsp;|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-Bug6|X|&nbsp;|X|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-Bug7|X|X|X|&nbsp;|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-Bug8|X|X|X|X|<br>
-&nbsp;&nbsp;&nbsp;&nbsp;+-+-+-+-+<br>
-<br>
-Who&nbsp;can&nbsp;see&nbsp;each&nbsp;bug?<br>
-<br>
-Bug1&nbsp;has&nbsp;no&nbsp;group&nbsp;restrictions.&nbsp;&nbsp;Therefore,&nbsp;Bug1&nbsp;can&nbsp;be&nbsp;seen&nbsp;by&nbsp;any<br>
-user,&nbsp;whatever&nbsp;their&nbsp;group&nbsp;membership.&nbsp;&nbsp;This&nbsp;is&nbsp;going&nbsp;to&nbsp;be&nbsp;the&nbsp;only<br>
-bug&nbsp;that&nbsp;User5&nbsp;can&nbsp;see,&nbsp;because&nbsp;User5&nbsp;isn't&nbsp;in&nbsp;any&nbsp;groups.<br>
-<br>
-Bug2&nbsp;can&nbsp;be&nbsp;seen&nbsp;by&nbsp;anyone&nbsp;in&nbsp;Group2,&nbsp;that&nbsp;is&nbsp;User2&nbsp;and&nbsp;User4.<br>
-<br>
-Bug3&nbsp;can&nbsp;be&nbsp;seen&nbsp;by&nbsp;anyone&nbsp;in&nbsp;Group3,&nbsp;that&nbsp;is&nbsp;User3&nbsp;and&nbsp;User4.<br>
-<br>
-Bug4&nbsp;can&nbsp;be&nbsp;seen&nbsp;by&nbsp;anyone&nbsp;in&nbsp;Group4.&nbsp;&nbsp;Nobody&nbsp;is&nbsp;in&nbsp;Group4,&nbsp;so&nbsp;none&nbsp;of<br>
-these&nbsp;users&nbsp;can&nbsp;see&nbsp;Bug4.<br>
-<br>
-Bug5&nbsp;can&nbsp;be&nbsp;seen&nbsp;by&nbsp;anyone&nbsp;who&nbsp;is&nbsp;in&nbsp;_both_&nbsp;Group1&nbsp;and&nbsp;Group2.&nbsp;&nbsp;This<br>
-is&nbsp;only&nbsp;User4.&nbsp;&nbsp;User1&nbsp;cannot&nbsp;see&nbsp;it&nbsp;because&nbsp;he&nbsp;is&nbsp;not&nbsp;in&nbsp;Group2,&nbsp;and<br>
-User2&nbsp;cannot&nbsp;see&nbsp;it&nbsp;because&nbsp;she&nbsp;is&nbsp;not&nbsp;in&nbsp;Group1.<br>
-<br>
-Bug6&nbsp;can&nbsp;be&nbsp;seen&nbsp;by&nbsp;anyone&nbsp;who&nbsp;is&nbsp;in&nbsp;both&nbsp;Group1&nbsp;and&nbsp;Group3.&nbsp;&nbsp;This<br>
-would&nbsp;include&nbsp;User3&nbsp;and&nbsp;User4.&nbsp;&nbsp;Similar&nbsp;to&nbsp;Bug5,&nbsp;User1&nbsp;cannot&nbsp;see&nbsp;Bug6<br>
-because&nbsp;he&nbsp;is&nbsp;not&nbsp;in&nbsp;Group3.<br>
-<br>
-Bug7&nbsp;can&nbsp;be&nbsp;seen&nbsp;by&nbsp;anyone&nbsp;who&nbsp;is&nbsp;in&nbsp;Group1,&nbsp;Group2,&nbsp;and&nbsp;Group3.&nbsp;&nbsp;This<br>
-is&nbsp;only&nbsp;User4.&nbsp;&nbsp;All&nbsp;of&nbsp;the&nbsp;others&nbsp;are&nbsp;missing&nbsp;at&nbsp;least&nbsp;one&nbsp;of&nbsp;those<br>
-group&nbsp;priveleges,&nbsp;and&nbsp;thus&nbsp;cannot&nbsp;see&nbsp;the&nbsp;bug.<br>
-<br>
-Bug8&nbsp;can&nbsp;be&nbsp;seen&nbsp;by&nbsp;anyone&nbsp;who&nbsp;is&nbsp;in&nbsp;Group1,&nbsp;Group2,&nbsp;Group3,&nbsp;and<br>
-Group4.&nbsp;&nbsp;There&nbsp;is&nbsp;nobody&nbsp;in&nbsp;all&nbsp;four&nbsp;of&nbsp;these&nbsp;groups,&nbsp;so&nbsp;nobody&nbsp;can<br>
-see&nbsp;Bug8.&nbsp;&nbsp;It&nbsp;doesn't&nbsp;matter&nbsp;that&nbsp;User4&nbsp;is&nbsp;in&nbsp;Group1,&nbsp;Group2,&nbsp;and<br>
-Group3,&nbsp;since&nbsp;he&nbsp;isn't&nbsp;in&nbsp;Group4.<br>
-	&nbsp;&nbsp;</P
-></DIV
->
-      </P
 ></DIV
 ></DIV
 ><DIV
@@ -1156,6 +321,7 @@ CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -1167,6 +333,7 @@ ALIGN="left"
 VALIGN="top"
 ><A
 HREF="useradmin.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -1175,6 +342,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -1182,7 +350,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="security.html"
+HREF="voting.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -1198,13 +367,14 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="administration.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->Bugzilla Security</TD
+>Voting</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/quicksearch.html b/docs/html/quicksearch.html
deleted file mode 100644
index 43ae5c20b..000000000
--- a/docs/html/quicksearch.html
+++ /dev/null
@@ -1,191 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->The Quicksearch Utility</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="Useful Patches and Utilities for Bugzilla"
-HREF="patches.html"><LINK
-REL="PREVIOUS"
-TITLE="Command-line Bugzilla Queries"
-HREF="cmdline.html"><LINK
-REL="NEXT"
-TITLE="Hacking Bugzilla"
-HREF="bzhacking.html"></HEAD
-><BODY
-CLASS="SECTION"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="cmdline.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Appendix D. Useful Patches and Utilities for Bugzilla</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="bzhacking.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECTION"
-><H1
-CLASS="SECTION"
-><A
-NAME="QUICKSEARCH"
->D.4. The Quicksearch Utility</A
-></H1
-><P
->      Quicksearch is a new, experimental feature of the 2.12 release.
-      It consist of two Javascript files, "quicksearch.js" and
-      "localconfig.js", and two documentation files,
-      "quicksearch.html" and "quicksearchhack.html"
-    </P
-><P
->      The index.html page has been updated to include the QuickSearch
-      text box.
-    </P
-><P
->      To take full advantage of the query power, the Bugzilla
-      maintainer must edit "localconfig.js" according to the value
-      sets used in the local installation.
-    </P
-><P
->      Currently, keywords must be hard-coded in localconfig.js.  If
-      they are not, keywords are not automatically recognized.  This
-      means, if localconfig.js is left unconfigured, that searching
-      for a bug with the "foo" keyword will only find bugs with "foo"
-      in the summary, status whiteboard, product or component name,
-      but not those with the keyword "foo".
-    </P
-><P
->      Workarounds for Bugzilla users:
-      <P
-></P
-><TABLE
-BORDER="0"
-><TBODY
-><TR
-><TD
->search for '!foo' (this will find only bugs with the
-	  keyword "foo"</TD
-></TR
-><TR
-><TD
->search 'foo,!foo' (equivalent to 'foo OR
-	  keyword:foo')</TD
-></TR
-></TBODY
-></TABLE
-><P
-></P
->
-    </P
-><P
->      When this tool is ported from client-side JavaScript to
-      server-side Perl, the requirement for hard-coding keywords can
-      be fixed. <A
-HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=70907"
-TARGET="_top"
->This bug</A
-> has details.
-    </P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="cmdline.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="bzhacking.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->Command-line Bugzilla Queries</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="patches.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->Hacking Bugzilla</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/rewrite.html b/docs/html/rewrite.html
index 053474069..a64240d98 100644
--- a/docs/html/rewrite.html
+++ b/docs/html/rewrite.html
@@ -1,10 +1,13 @@
 <HTML
 ><HEAD
 ><TITLE
->Apache mod_rewrite magic</TITLE
+>Apache 
+    mod_rewrite
+
+    magic</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -16,10 +19,10 @@ REL="PREVIOUS"
 TITLE="Useful Patches and Utilities for Bugzilla"
 HREF="patches.html"><LINK
 REL="NEXT"
-TITLE="The setperl.csh Utility"
-HREF="setperl.html"></HEAD
+TITLE="Command-line Bugzilla Queries"
+HREF="cmdline.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +31,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -45,19 +49,21 @@ ALIGN="left"
 VALIGN="bottom"
 ><A
 HREF="patches.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Appendix D. Useful Patches and Utilities for Bugzilla</TD
+>Appendix C. Useful Patches and Utilities for Bugzilla</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="setperl.html"
+HREF="cmdline.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,51 +72,56 @@ HREF="setperl.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="REWRITE"
->D.1. Apache <TT
-CLASS="FILENAME"
+NAME="rewrite">C.1. Apache 
+    <TT
+CLASS="filename"
 >mod_rewrite</TT
-> magic</A
-></H1
+>
+
+    magic</H1
 ><P
->Apache's <TT
-CLASS="FILENAME"
+>Apache's 
+    <TT
+CLASS="filename"
 >mod_rewrite</TT
-> module lets you do some truly amazing things with URL rewriting.  Here are a couple of examples of what you can do.</P
+>
+
+    module lets you do some truly amazing things with URL rewriting. Here are
+    a couple of examples of what you can do.</P
 ><P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->	  Make it so if someone types
-	  <TT
-CLASS="COMPUTEROUTPUT"
+>Make it so if someone types 
+        <TT
+CLASS="computeroutput"
 >http://www.foo.com/12345</TT
->,
-	  Bugzilla spits back
-	  http://www.foo.com/show_bug.cgi?id=12345. Try setting up
-	  your VirtualHost section for Bugzilla with a rule like
-	  this:</P
+>
+
+        , Bugzilla spits back http://www.foo.com/show_bug.cgi?id=12345. Try
+        setting up your VirtualHost section for Bugzilla with a rule like
+        this:</P
 ><TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
-WIDTH="90%"
+WIDTH="100%"
 ><TR
 ><TD
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->&#60;VirtualHost 12.34.56.78&#62;
+CLASS="programlisting"
+>&#13;&#60;VirtualHost 12.34.56.78&#62;
 RewriteEngine On
 RewriteRule ^/([0-9]+)$ http://foo.bar.com/show_bug.cgi?id=$1 [L,R]
 &#60;/VirtualHost&#62;
-	</PRE
+</PRE
 ></FONT
 ></TD
 ></TR
@@ -118,14 +129,14 @@ RewriteRule ^/([0-9]+)$ http://foo.bar.com/show_bug.cgi?id=$1 [L,R]
 ></LI
 ><LI
 ><P
->There are many, many more things you can do with
-	  mod_rewrite.  As time goes on, I will include many more in
-	  the Guide.  For now, though, please refer to the mod_rewrite
-	  documentation at <A
+>There are many, many more things you can do with mod_rewrite.
+        Please refer to the mod_rewrite documentation at 
+        <A
 HREF="http://www.apache.org"
 TARGET="_top"
 >http://www.apache.org</A
-></P
+>.
+        </P
 ></LI
 ></OL
 ></DIV
@@ -134,6 +145,7 @@ CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -145,6 +157,7 @@ ALIGN="left"
 VALIGN="top"
 ><A
 HREF="patches.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -153,6 +166,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -160,7 +174,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="setperl.html"
+HREF="cmdline.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -176,13 +191,14 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="patches.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->The setperl.csh Utility</TD
+>Command-line Bugzilla Queries</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/rhbugzilla.html b/docs/html/rhbugzilla.html
index c0412cced..fb1eb3c9a 100644
--- a/docs/html/rhbugzilla.html
+++ b/docs/html/rhbugzilla.html
@@ -4,7 +4,7 @@
 >Red Hat Bugzilla</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -17,9 +17,9 @@ TITLE="Bugzilla Variants and Competitors"
 HREF="variants.html"><LINK
 REL="NEXT"
 TITLE="Loki Bugzilla (Fenris)"
-HREF="variant_fenris.html"></HEAD
+HREF="variant-fenris.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -45,19 +46,21 @@ ALIGN="left"
 VALIGN="bottom"
 ><A
 HREF="variants.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Chapter 7. Bugzilla Variants and Competitors</TD
+>Appendix D. Bugzilla Variants and Competitors</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="variant_fenris.html"
+HREF="variant-fenris.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,34 +69,33 @@ HREF="variant_fenris.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="RHBUGZILLA"
->7.1. Red Hat Bugzilla</A
-></H1
+NAME="rhbugzilla">D.1. Red Hat Bugzilla</H1
 ><P
->      Red Hat Bugzilla is probably the most popular Bugzilla variant
-      on the planet. One of the major benefits of Red Hat Bugzilla is
-      the ability to work with Oracle, MySQL, and PostGreSQL databases
-      serving as the back-end, instead of just MySQL.  Dave Lawrence
-      has worked very hard to keep Red Hat Bugzilla up-to-date, and
-      many people prefer the snappier-looking page layout of Red Hat
-      Bugzilla to the default Mozilla-standard formatting.
-    </P
+>Red Hat Bugzilla is a fork of Bugzilla 2.8. 
+    One of its major benefits is the ability
+    to work with Oracle, MySQL, and PostGreSQL databases serving as the
+    back-end, instead of just MySQL. Dave Lawrence of Red Hat is 
+    active in the Bugzilla community, and we hope to see a reunification
+    of the fork before too long.</P
 ><P
->URL: <A
+>URL: 
+    <A
 HREF="http://bugzilla.redhat.com/bugzilla/"
 TARGET="_top"
->http://bugzilla.redhat.com/bugzilla/</A
-></P
+>&#13;    http://bugzilla.redhat.com/bugzilla/</A
+>
+    </P
 ></DIV
 ><DIV
 CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -105,6 +107,7 @@ ALIGN="left"
 VALIGN="top"
 ><A
 HREF="variants.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -113,6 +116,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -120,7 +124,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="variant_fenris.html"
+HREF="variant-fenris.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -136,6 +141,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="variants.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
diff --git a/docs/html/scm.html b/docs/html/scm.html
deleted file mode 100644
index c96598b81..000000000
--- a/docs/html/scm.html
+++ /dev/null
@@ -1,160 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->Perforce SCM</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="Integrating Bugzilla with Third-Party Tools"
-HREF="integration.html"><LINK
-REL="PREVIOUS"
-TITLE="CVS"
-HREF="cvs.html"><LINK
-REL="NEXT"
-TITLE="Tinderbox/Tinderbox2"
-HREF="tinderbox.html"></HEAD
-><BODY
-CLASS="SECTION"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="cvs.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Chapter 5. Integrating Bugzilla with Third-Party Tools</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="tinderbox.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECTION"
-><H1
-CLASS="SECTION"
-><A
-NAME="SCM"
->5.3. Perforce SCM</A
-></H1
-><P
->      You can find the project page for Bugzilla and Teamtrack
-      Perforce integration (p4dti) at: <A
-HREF="http://www.ravenbrook.com/project/p4dti/"
-TARGET="_top"
-> http://www.ravenbrook.com/project/p4dti</A
-> .  <SPAN
-CLASS="QUOTE"
->"p4dti"</SPAN
-> is now an officially supported product from Perforce, and you can find the "Perforce Public Depot" p4dti page at <A
-HREF="http://public.perforce.com/public/perforce/p4dti/index.html"
-TARGET="_top"
-> http://public.perforce.com/public/perforce/p4dti/index.html</A
->.
-    </P
-><P
->      Integration of Perforce with Bugzilla, once patches are applied,
-      is seamless.  Perforce replication information will appear below
-      the comments of each bug.  Be certain you have a matching set of
-      patches for the Bugzilla version you are installing.  p4dti is
-      designed to support multiple defect trackers, and maintains its
-      own documentation for it. Please consult the pages linked above
-      for further information.
-    </P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="cvs.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="tinderbox.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->CVS</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="integration.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->Tinderbox/Tinderbox2</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/security.html b/docs/html/security.html
index 45140609d..a7433f67c 100644
--- a/docs/html/security.html
+++ b/docs/html/security.html
@@ -4,7 +4,7 @@
 >Bugzilla Security</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -13,14 +13,13 @@ REL="UP"
 TITLE="Administering Bugzilla"
 HREF="administration.html"><LINK
 REL="PREVIOUS"
-TITLE="Product, Component, Milestone, and Version
-      Administration"
-HREF="programadmin.html"><LINK
+TITLE="Groups and Group Security"
+HREF="groups.html"><LINK
 REL="NEXT"
-TITLE="Integrating Bugzilla with Third-Party Tools"
-HREF="integration.html"></HEAD
+TITLE="Template Customisation"
+HREF="cust-templates.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -29,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -45,20 +45,22 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="programadmin.html"
+HREF="groups.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Chapter 4. Administering Bugzilla</TD
+>Chapter 5. Administering Bugzilla</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="integration.html"
+HREF="cust-templates.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -67,44 +69,17 @@ HREF="integration.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="SECURITY"
->4.4. Bugzilla Security</A
-></H1
-><TABLE
-BORDER="0"
-WIDTH="100%"
-CELLSPACING="0"
-CELLPADDING="0"
-CLASS="EPIGRAPH"
-><TR
-><TD
-WIDTH="45%"
->&nbsp;</TD
-><TD
-WIDTH="45%"
-ALIGN="LEFT"
-VALIGN="TOP"
-><I
-><P
-><I
->Putting your money in a wall safe is better protection than
-	depending on the fact that no one knows that you hide your
-	money in a mayonnaise jar in your fridge.</I
-></P
-></I
-></TD
-></TR
-></TABLE
+NAME="security">5.6. Bugzilla Security</H1
 ><DIV
-CLASS="NOTE"
+CLASS="warning"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="warning"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -113,31 +88,28 @@ WIDTH="25"
 ALIGN="CENTER"
 VALIGN="TOP"
 ><IMG
-SRC="../images/note.gif"
+SRC="../images/warning.gif"
 HSPACE="5"
-ALT="Note"></TD
+ALT="Warning"></TD
 ><TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	Poorly-configured MySQL, Bugzilla, and FTP installations have
-	given attackers full access to systems in the past.  Please
-	take these guidelines seriously, even for Bugzilla machines
-	hidden away behind your firewall.  80% of all computer
-	trespassers are insiders, not anonymous crackers.
-      </P
+>Poorly-configured MySQL and Bugzilla installations have
+      given attackers full access to systems in the past. Please take these
+      guidelines seriously, even for Bugzilla machines hidden away behind
+      your firewall. 80% of all computer trespassers are insiders, not
+      anonymous crackers.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
-><P
->      Secure your installation.
-      <DIV
-CLASS="NOTE"
+><DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -153,74 +125,71 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  These instructions must, of necessity, be somewhat vague
-	  since Bugzilla runs on so many different platforms.  If you
-	  have refinements of these directions for specific platforms,
-	  please submit them to <A
+>These instructions must, of necessity, be somewhat vague since
+      Bugzilla runs on so many different platforms. If you have refinements
+      of these directions for specific platforms, please submit them to 
+      <A
 HREF="mailto://mozilla-webtools@mozilla.org"
 TARGET="_top"
->mozilla-webtools@mozilla.org</A
+>&#13;      mozilla-webtools@mozilla.org</A
 >
-	</P
+      </P
 ></TD
 ></TR
 ></TABLE
 ></DIV
->
-      <P
+><P
+>To secure your installation:
+     
+    <P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->	    Ensure you are running at least MysQL version 3.22.32 or
-	    newer.  Earlier versions had notable security holes and
-	    poorly secured default configuration choices.
-	  </P
+>Ensure you are running at least MysQL version 3.22.32 or newer.
+        Earlier versions had notable security holes and (from a security
+        point of view) poor default configuration choices.</P
 ></LI
 ><LI
 ><P
-><EM
->There is no substitute for understanding the
-	      tools on your system!</EM
-> Read <A
-HREF="http://www.mysql.com/documentation/mysql/bychapter/manual_Privilege_system.html"
+>&#13;        <EM
+>There is no substitute for understanding the tools on your
+        system!</EM
+>
+
+        Read 
+        <A
+HREF="http://www.mysql.com/doc/P/r/Privilege_system.html"
 TARGET="_top"
-> The MySQL Privilege System</A
-> until you can recite it from memory!</P
-><P
->	    At the very least, ensure you password the "mysql -u root"
-	    account and the "bugs" account, establish grant table
-	    rights (consult the Keystone guide in Appendix C: The
-	    Bugzilla Database for some easy-to-use details) that do
-	    not allow CREATE, DROP, RELOAD, SHUTDOWN, and PROCESS for
-	    user "bugs".  I wrote up the Keystone advice back when I
-	    knew far less about security than I do now : )
-	  </P
+>&#13;        The MySQL Privilege System</A
+>
+        until you can recite it from memory!</P
 ></LI
 ><LI
 ><P
->	    Lock down /etc/inetd.conf.  Heck, disable inet entirely on
-	    this box.  It should only listen to port 25 for Sendmail
-	    and port 80 for Apache.
-	  </P
+>Lock down /etc/inetd.conf. Heck, disable inet entirely on this
+        box. It should only listen to port 25 for Sendmail and port 80 for
+        Apache.</P
 ></LI
 ><LI
 ><P
->	    Do not run Apache as <SPAN
+>Do not run Apache as 
+        <SPAN
 CLASS="QUOTE"
 >"nobody"</SPAN
->.  This will
-	    require very lax permissions in your Bugzilla directories.
-	    Run it, instead, as a user with a name, set via your
-	    httpd.conf file.
-	    <DIV
-CLASS="NOTE"
+>
+
+        . This will require very lax permissions in your Bugzilla
+        directories. Run it, instead, as a user with a name, set via your
+        httpd.conf file. 
+        <DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
-WIDTH="90%"
+CLASS="note"
+WIDTH="100%"
 BORDER="0"
 ><TR
 ><TD
@@ -235,51 +204,84 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->		<SPAN
+>&#13;          <SPAN
 CLASS="QUOTE"
 >"nobody"</SPAN
-> is a real user on UNIX systems.
-		Having a process run as user id <SPAN
+>
+
+          is a real user on UNIX systems. Having a process run as user id 
+          <SPAN
 CLASS="QUOTE"
 >"nobody"</SPAN
 >
-		is absolutely no protection against system crackers
-		versus using any other user account.  As a general
-		security measure, I recommend you create unique user
-		ID's for each daemon running on your system and, if
-		possible, use "chroot" to jail that process away from
-		the rest of your system.
-	      </P
+
+          is absolutely no protection against system crackers versus using
+          any other user account. As a general security measure, I recommend
+          you create unique user ID's for each daemon running on your system
+          and, if possible, use "chroot" to jail that process away from the
+          rest of your system.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 >
-	  </P
+        </P
 ></LI
 ><LI
 ><P
->	    Ensure you have adequate access controls for the
-	    $BUGZILLA_HOME/data/ and $BUGZILLA_HOME/shadow/
-	    directories, as well as the $BUGZILLA_HOME/localconfig and
-	    $BUGZILLA_HOME/globals.pl files. The localconfig file
-	    stores your "bugs" user password, which would be terrible
-	    to have in the hands of a criminal, while the "globals.pl"
-	    stores some default information regarding your
-	    installation which could aid a system cracker. In
-	    addition, some files under $BUGZILLA_HOME/data/ store
-	    sensitive information, and $BUGZILLA_HOME/shadow/ stores
-	    bug information for faster retrieval.  If you fail to
-	    secure these directories and this file, you will expose
-	    bug information to those who may not be allowed to see it.
-	  </P
+>Ensure you have adequate access controls for the
+        $BUGZILLA_HOME/data/ directory, as well as the
+        $BUGZILLA_HOME/localconfig file.
+        The localconfig file stores your "bugs" database account password. 
+        In addition, some
+        files under $BUGZILLA_HOME/data/ store sensitive information.
+        </P
+><P
+>Bugzilla provides default .htaccess files to protect the most
+        common Apache installations. However, you should verify these are
+        adequate according to the site-wide security policy of your web
+        server, and ensure that the .htaccess files are allowed to
+        "override" default permissions set in your Apache configuration
+        files. Covering Apache security is beyond the scope of this Guide;
+        please consult the Apache documentation for details.</P
+><P
+>If you are using a web server that does not support the
+        .htaccess control method, 
+        <EM
+>you are at risk!</EM
+>
+
+        After installing, check to see if you can view the file
+        "localconfig" in your web browser (e.g.: 
+        <A
+HREF="http://bugzilla.mozilla.org/localconfig"
+TARGET="_top"
+>&#13;        http://bugzilla.mozilla.org/localconfig</A
+>
+
+        ). If you can read the contents of this file, your web server has
+        not secured your bugzilla directory properly and you must fix this
+        problem before deploying Bugzilla. If, however, it gives you a
+        "Forbidden" error, then it probably respects the .htaccess
+        conventions and you are good to go.</P
+><P
+>When you run checksetup.pl, the script will attempt to modify
+        various permissions on files which Bugzilla uses. If you do not have
+        a webservergroup set in the localconfig file, then Bugzilla will have
+        to make certain files world readable and/or writable. 
+        <EM
+>THIS IS INSECURE!</EM
+>
+
+        . This means that anyone who can get access to your system can do
+        whatever they want to your Bugzilla installation.</P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
-WIDTH="90%"
+CLASS="note"
+WIDTH="100%"
 BORDER="0"
 ><TR
 ><TD
@@ -294,77 +296,56 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	      Bugzilla provides default .htaccess files to protect the
-	      most common Apache installations.  However, you should
-	      verify these are adequate according to the site-wide
-	      security policy of your web server, and ensure that the
-	      .htaccess files are allowed to "override" default
-	      permissions set in your Apache configuration files.
-	      Covering Apache security is beyond the scope of this
-	      Guide; please consult the Apache documentation for
-	      details.
-	    </P
-><P
->	      If you are using a web server that does not support the
-	      .htaccess control method, <EM
->you are at
-		risk!</EM
->  After installing, check to see if
-	      you can view the file "localconfig" in your web browser
-	      (e.g.:  <A
-HREF="http://bugzilla.mozilla.org/localconfig"
-TARGET="_top"
-> http://bugzilla.mozilla.org/localconfig</A
->).  If you can read the contents of this file, your web server has not secured your bugzilla directory properly and you must fix this problem before deploying Bugzilla.  If, however, it gives you a "Forbidden" error, then it probably respects the .htaccess conventions and you are good to go.
-	    </P
+>This also means that if your webserver runs all cgi scripts
+          as the same user/group, anyone on the system who can run cgi
+          scripts will be able to take control of your Bugzilla
+          installation.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ><P
->	    On Apache, you can use .htaccess files to protect access
-	    to these directories, as outlined in <A
+>On Apache, you can use .htaccess files to protect access to
+        these directories, as outlined in 
+        <A
 HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=57161"
 TARGET="_top"
->Bug 57161</A
-> for the localconfig file, and <A
+>Bug
+        57161</A
+>
+
+        for the localconfig file, and 
+        <A
 HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=65572"
 TARGET="_top"
-> Bug 65572</A
-> for adequate protection in your data/ and shadow/ directories.
-	  </P
-><P
->	    Note the instructions which follow are Apache-specific.
-	    If you use IIS, Netscape, or other non-Apache web servers,
-	    please consult your system documentation for how to secure
-	    these files from being transmitted to curious users.
-	  </P
-><P
->	    Place the following text into a file named ".htaccess",
-	    readable by your web server, in your $BUGZILLA_HOME/data
-	    directory. <P
-CLASS="LITERALLAYOUT"
->&nbsp;&#60;Files&nbsp;comments&#62;&nbsp;allow<br>
-	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;all&nbsp;&#60;/Files&#62;&nbsp;deny&nbsp;from&nbsp;all&nbsp;</P
+>Bug
+        65572</A
 >
-	  </P
+
+        for adequate protection in your data/ directory.</P
+><P
+>Note the instructions which follow are Apache-specific. If you
+        use IIS, Netscape, or other non-Apache web servers, please consult
+        your system documentation for how to secure these files from being
+        transmitted to curious users.</P
 ><P
->	    Place the following text into a file named ".htaccess",
-	    readable by your web server, in your $BUGZILLA_HOME/
-	    directory. <P
-CLASS="LITERALLAYOUT"
->&nbsp;&#60;Files&nbsp;localconfig&#62;&nbsp;deny<br>
-	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;all&nbsp;&#60;/Files&#62;&nbsp;allow&nbsp;from&nbsp;all&nbsp;</P
+>Place the following text into a file named ".htaccess",
+        readable by your web server, in your $BUGZILLA_HOME/data directory. 
+        <P
+CLASS="literallayout"
+>&#60;Files&nbsp;comments&#62;&nbsp;allow&nbsp;from&nbsp;all&nbsp;&#60;/Files&#62;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deny&nbsp;from&nbsp;all</P
 >
-	  </P
+        </P
 ><P
->	    Place the following text into a file named ".htaccess",
-	    readable by your web server, in your $BUGZILLA_HOME/shadow
-	    directory. <P
-CLASS="LITERALLAYOUT"
->&nbsp;deny&nbsp;from&nbsp;all&nbsp;</P
+>Place the following text into a file named ".htaccess",
+        readable by your web server, in your $BUGZILLA_HOME/ directory. 
+        <P
+CLASS="literallayout"
+>&#60;Files&nbsp;localconfig&#62;&nbsp;deny&nbsp;from&nbsp;all&nbsp;&#60;/Files&#62;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allow&nbsp;from&nbsp;all</P
 >
-	  </P
+        </P
 ></LI
 ></OL
 >
@@ -375,6 +356,7 @@ CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -385,7 +367,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="programadmin.html"
+HREF="groups.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -394,6 +377,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -401,7 +385,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="integration.html"
+HREF="cust-templates.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -410,21 +395,21 @@ HREF="integration.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->Product, Component, Milestone, and Version
-      Administration</TD
+>Groups and Group Security</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
 VALIGN="top"
 ><A
 HREF="administration.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->Integrating Bugzilla with Third-Party Tools</TD
+>Template Customisation</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/setperl.html b/docs/html/setperl.html
deleted file mode 100644
index 1d5384be2..000000000
--- a/docs/html/setperl.html
+++ /dev/null
@@ -1,308 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->The setperl.csh Utility</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="Useful Patches and Utilities for Bugzilla"
-HREF="patches.html"><LINK
-REL="PREVIOUS"
-TITLE="Apache mod_rewrite magic"
-HREF="rewrite.html"><LINK
-REL="NEXT"
-TITLE="Command-line Bugzilla Queries"
-HREF="cmdline.html"></HEAD
-><BODY
-CLASS="SECTION"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="rewrite.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Appendix D. Useful Patches and Utilities for Bugzilla</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="cmdline.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECTION"
-><H1
-CLASS="SECTION"
-><A
-NAME="SETPERL"
->D.2. The setperl.csh Utility</A
-></H1
-><P
->	 You can use the "setperl.csh" utility to quickly and
-      easily change the path to perl on all your Bugzilla files. This
-      is a C-shell script; if you do not have "csh" or "tcsh" in the
-      search path on your system, it will not work!
-    </P
-><DIV
-CLASS="PROCEDURE"
-><OL
-TYPE="1"
-><LI
-><P
->	  Download the "setperl.csh" utility to your Bugzilla
-	  directory and make it executable.
-	</P
-><OL
-CLASS="SUBSTEPS"
-TYPE="a"
-><LI
-><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
->		<TT
-CLASS="PROMPT"
->bash#</TT
->
-		<B
-CLASS="COMMAND"
->cd /your/path/to/bugzilla</B
->
-	      </TT
->
-	    </P
-></LI
-><LI
-><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->bash#</TT
-> <B
-CLASS="COMMAND"
->wget -O
-		  setperl.csh
-		  'http://bugzilla.mozilla.org/showattachment.cgi?attach_id=10795'</B
-> </TT
->
-	    </P
-></LI
-><LI
-><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->bash#</TT
-> <B
-CLASS="COMMAND"
->chmod
-		  u+x setperl.csh</B
-> </TT
->
-	    </P
-></LI
-></OL
-></LI
-><LI
-><P
->	  Prepare (and fix) Bugzilla file permissions.
-	</P
-><OL
-CLASS="SUBSTEPS"
-TYPE="a"
-><LI
-><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
->		<TT
-CLASS="PROMPT"
->bash#</TT
->
-		<B
-CLASS="COMMAND"
->chmod u+w *</B
->
-	      </TT
->
-	    </P
-></LI
-><LI
-><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->bash#</TT
-> <B
-CLASS="COMMAND"
->chmod
-		  u+x duplicates.cgi</B
-> </TT
->
-	    </P
-></LI
-><LI
-><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
->		<TT
-CLASS="PROMPT"
->bash#</TT
->
-		<B
-CLASS="COMMAND"
->chmod a-x bug_status.html</B
->
-	      </TT
->
-	    </P
-></LI
-></OL
-></LI
-><LI
-><P
->	  Run the script:
-	</P
-><P
->	  <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->bash#</TT
->
-	    <B
-CLASS="COMMAND"
->./setperl.csh /your/path/to/perl</B
->
-	  </TT
->
-<DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN2439"
-></A
-><P
-><B
->Example D-1. Using Setperl to set your perl path</B
-></P
-><P
->	      <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->bash#</TT
->
-		<B
-CLASS="COMMAND"
->./setperl.csh /usr/bin/perl</B
->
-	      </TT
->
-            </P
-></DIV
->
-	</P
-></LI
-></OL
-></DIV
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="rewrite.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="cmdline.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->Apache <TT
-CLASS="FILENAME"
->mod_rewrite</TT
-> magic</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="patches.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->Command-line Bugzilla Queries</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/stepbystep.html b/docs/html/stepbystep.html
index b6e8e223a..6d4de5a21 100644
--- a/docs/html/stepbystep.html
+++ b/docs/html/stepbystep.html
@@ -4,7 +4,7 @@
 >Step-by-step Install</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -13,13 +13,13 @@ REL="UP"
 TITLE="Installation"
 HREF="installation.html"><LINK
 REL="PREVIOUS"
-TITLE="ERRATA"
-HREF="errata.html"><LINK
+TITLE="Installation"
+HREF="installation.html"><LINK
 REL="NEXT"
-TITLE="Mac OS X Installation Notes"
-HREF="osx.html"></HEAD
+TITLE="Optional Additional Configuration"
+HREF="extraconfig.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -44,20 +45,22 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="errata.html"
+HREF="installation.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Chapter 3. Installation</TD
+>Chapter 4. Installation</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="osx.html"
+HREF="extraconfig.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,58 +69,41 @@ HREF="osx.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="STEPBYSTEP"
->3.2. Step-by-step Install</A
-></H1
+NAME="stepbystep">4.1. Step-by-step Install</H1
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="AEN509"
->3.2.1. Introduction</A
-></H2
+NAME="AEN492">4.1.1. Introduction</H2
 ><P
->	Installation of bugzilla is pretty straightforward, particularly if your
-	machine already has MySQL and the MySQL-related perl packages installed.
-	If those aren't installed yet, then that's the first order of business.  The
-	other necessary ingredient is a web server set up to run cgi scripts.
-	While using Apache for your webserver is not required, it is recommended.
-      </P
-><P
->	Bugzilla has been successfully installed under Solaris, Linux,
-	and Win32. The peculiarities of installing on Win32 (Microsoft
-	Windows) are not included in this section of the Guide; please
-	check out the <A
+>Bugzilla has been successfully installed under Solaris, Linux,
+      and Win32. Win32 is not yet officially supported, but many people
+      have got it working fine.
+      Please see the 
+      <A
 HREF="win32.html"
 >Win32 Installation Notes</A
-> for further advice
-	on getting Bugzilla to work on Microsoft Windows.
-      </P
-><P
->	The Bugzilla Guide is contained in the "docs/" folder in your
-	Bugzilla distribution.  It is available in plain text
-	(docs/txt), HTML (docs/html), or SGML source (docs/sgml).
-      </P
+>
+      for further advice on getting Bugzilla to work on Microsoft
+      Windows.</P
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="AEN515"
->3.2.2. Installing the Prerequisites</A
-></H2
+NAME="AEN496">4.1.2. Package List</H2
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -133,89 +119,209 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->If you want to skip these manual installation steps for
-	  the CPAN dependencies listed below, and are running the very
-	  most recent version of Perl and MySQL (both the executables
-	  and development libraries) on your system, check out
-	  Bundle::Bugzilla in <A
-HREF="stepbystep.html#BUNDLEBUGZILLA"
+> If you are running the very most recent
+        version of Perl and MySQL (both the executables and development
+        libraries) on your system, you can skip these manual installation 
+        steps for the Perl modules by using Bundle::Bugzilla; see
+        <A
+HREF="stepbystep.html#bundlebugzilla"
 >Using Bundle::Bugzilla instead of manually installing Perl modules</A
-></P
+>.
+        </P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ><P
->	The software packages necessary for the proper running of bugzilla are:
-	<P
+>The software packages necessary for the proper running of
+      Bugzilla (with download links) are: 
+      <P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->	      MySQL database server and the mysql client (3.22.5 or greater)
-	    </P
+>&#13;    <A
+HREF="http://www.mysql.com/"
+TARGET="_top"
+>MySQL database server</A
+>
+    (3.22.5 or greater)
+  </P
 ></LI
 ><LI
 ><P
->	      Perl (5.004 or greater, 5.6.1 is recommended if you wish
-	      to use Bundle::Bugzilla)
-	    </P
+>&#13;    <A
+HREF="http://www.perl.org"
+TARGET="_top"
+>Perl</A
+>
+    (5.005 or greater, 5.6.1 is recommended if you wish to
+    use Bundle::Bugzilla)
+  </P
 ></LI
 ><LI
 ><P
->	      DBI Perl module
-	    </P
+>Perl Modules (minimum version):
+  <P
+></P
+><OL
+TYPE="a"
+><LI
+><P
+>&#13;        <A
+HREF="http://www.template-toolkit.org"
+TARGET="_top"
+>Template</A
+>
+        (v2.07)
+      </P
 ></LI
 ><LI
 ><P
->	      Data::Dumper Perl module
-	    </P
+>&#13;        <A
+HREF="http://www.cpan.org/modules/by-module/AppConfig/"
+TARGET="_top"
+>AppConfig 
+        </A
+>
+        (v1.52)
+      </P
 ></LI
 ><LI
 ><P
->	      Bundle::Mysql Perl module collection
-	    </P
+>&#13;        <A
+HREF="http://www.cpan.org/authors/id/MUIR/modules/Text-Tabs%2BWrap-2001.0131.tar.gz"
+TARGET="_top"
+>Text::Wrap</A
+> 
+        (v2001.0131)
+      </P
 ></LI
 ><LI
 ><P
->	      TimeDate Perl module collection
-	    </P
+>&#13;        <A
+HREF="http://search.cpan.org/search?dist=File-Spec"
+TARGET="_top"
+>File::Spec 
+        </A
+>
+        (v0.8.2)
+      </P
 ></LI
 ><LI
 ><P
->	      GD perl module (1.8.3) (optional, for bug charting)
-	    </P
+>&#13;        <A
+HREF="http://www.cpan.org/modules/by-module/Data/"
+TARGET="_top"
+>Data::Dumper 
+        </A
+> 
+        (any)
+      </P
 ></LI
 ><LI
 ><P
->	      Chart::Base Perl module (0.99c) (optional, for bug charting)
-	    </P
+>&#13;        <A
+HREF="http://www.cpan.org/modules/by-module/Mysql/"
+TARGET="_top"
+>DBD::mysql
+        </A
+> 
+        (v1.2209)
+      </P
 ></LI
 ><LI
 ><P
->	      DB_File Perl module (optional, for bug charting)
-	    </P
+>&#13;        <A
+HREF="http://www.cpan.org/modules/by-module/DBI/"
+TARGET="_top"
+>DBI</A
+> 
+        (v1.13)
+      </P
 ></LI
 ><LI
 ><P
->	      The web server of your choice.  Apache is recommended.
-	    </P
+>&#13;        <A
+HREF="http://www.cpan.org/modules/by-module/Date/"
+TARGET="_top"
+>Date::Parse
+        </A
+> 
+        (any)
+      </P
 ></LI
 ><LI
 ><P
->	      MIME::Parser Perl module (optional, for contrib/bug_email.pl interface)
-	    </P
+>&#13;        CGI::Carp 
+        (any)
+      </P
+></LI
+></OL
+>
+  and, optionally:
+  <P
+></P
+><OL
+TYPE="a"
+><LI
+><P
+>&#13;        <A
+HREF="http://www.cpan.org/modules/by-module/GD/"
+TARGET="_top"
+>GD</A
+>
+        (v1.19) for bug charting
+      </P
+></LI
+><LI
+><P
+>&#13;        <A
+HREF="http://www.cpan.org/modules/by-module/Chart/"
+TARGET="_top"
+>Chart::Base 
+        </A
+>
+        (v0.99c) for bug charting
+      </P
+></LI
+><LI
+><P
+>&#13;        XML::Parser 
+        (any) for the XML interface
+      </P
+></LI
+><LI
+><P
+>&#13;        MIME::Parser 
+        (any) for the email interface
+      </P
+></LI
+></OL
+>          
+  </P
+></LI
+><LI
+><P
+>&#13;    The web server of your choice. 
+    <A
+HREF="http://www.apache.org/"
+TARGET="_top"
+>Apache</A
+> 
+    is highly recommended.
+  </P
 ></LI
 ></OL
 >
 
-	<DIV
-CLASS="WARNING"
+      <DIV
+CLASS="warning"
 ><P
 ></P
 ><TABLE
-CLASS="WARNING"
+CLASS="warning"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -231,29 +337,25 @@ ALT="Warning"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	    It is a good idea, while installing Bugzilla, to ensure it
-	    is not <EM
->accessible</EM
-> by other machines
-	    on the Internet. Your machine may be vulnerable to attacks
-	    while you are installing. In other words, ensure there is
-	    some kind of firewall between you and the rest of the
-	    Internet.  Many installation steps require an active
-	    Internet connection to complete, but you must take care to
-	    ensure that at no point is your machine vulnerable to an
-	    attack.
-	  </P
+>It is a good idea, while installing Bugzilla, to ensure that there
+        is some kind of firewall between you and the rest of the Internet,
+        because your machine may be insecure for periods during the install.
+        Many
+        installation steps require an active Internet connection to complete,
+        but you must take care to ensure that at no point is your machine
+        vulnerable to an attack.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 >
-	<DIV
-CLASS="NOTE"
+
+      <DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -269,20 +371,23 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->Linux-Mandrake 8.0, the author's test system, includes
-	    every required and optional library for Bugzilla.  The
-	    easiest way to install them is by using the
-	    <TT
-CLASS="FILENAME"
+>Linux-Mandrake 8.0 includes every
+        required and optional library for Bugzilla. The easiest way to
+        install them is by using the 
+        <TT
+CLASS="filename"
 >urpmi</TT
-> utility.  If you follow these
-	    commands, you should have everything you need for
-	    Bugzilla, and <TT
-CLASS="FILENAME"
+>
+
+        utility. If you follow these commands, you should have everything you
+        need for Bugzilla, and 
+        <TT
+CLASS="filename"
 >checksetup.pl</TT
-> should
-	    not complain about any missing libraries.  You may already
-	    have some of these installed.</P
+>
+
+        should not complain about any missing libraries. You may already have
+        some of these installed.</P
 ><P
 ></P
 ><TABLE
@@ -290,59 +395,69 @@ BORDER="0"
 ><TBODY
 ><TR
 ><TD
-><TT
-CLASS="PROMPT"
+>&#13;            <TT
+CLASS="prompt"
 >bash#</TT
-><B
-CLASS="COMMAND"
-> urpmi
-		perl-mysql</B
-></TD
+>
+
+            <B
+CLASS="command"
+>urpmi perl-mysql</B
+>
+          </TD
 ></TR
 ><TR
 ><TD
-><TT
-CLASS="PROMPT"
+>&#13;            <TT
+CLASS="prompt"
 >bash#</TT
-><B
-CLASS="COMMAND"
-> urpmi
-		perl-chart</B
-></TD
+>
+
+            <B
+CLASS="command"
+>urpmi perl-chart</B
+>
+          </TD
 ></TR
 ><TR
 ><TD
-><TT
-CLASS="PROMPT"
+>&#13;            <TT
+CLASS="prompt"
 >bash#</TT
-><B
-CLASS="COMMAND"
-> urpmi
-		perl-gd</B
-></TD
+>
+
+            <B
+CLASS="command"
+>urpmi perl-gd</B
+>
+          </TD
 ></TR
 ><TR
 ><TD
-><TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="prompt"
 >bash#</TT
-><B
-CLASS="COMMAND"
-> urpmi
-		perl-MailTools</B
-> (for Bugzilla email
-	      integration)</TD
+>
+
+          <B
+CLASS="command"
+>urpmi perl-MailTools</B
+>
+
+          (for Bugzilla email integration)</TD
 ></TR
 ><TR
 ><TD
-><TT
-CLASS="PROMPT"
+>&#13;            <TT
+CLASS="prompt"
 >bash#</TT
-><B
-CLASS="COMMAND"
-> urpmi
-		apache-modules</B
-></TD
+>
+
+            <B
+CLASS="command"
+>urpmi apache-modules</B
+>
+          </TD
 ></TR
 ></TBODY
 ></TABLE
@@ -353,46 +468,29 @@ CLASS="COMMAND"
 ></TABLE
 ></DIV
 >
-	
       </P
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="INSTALL-MYSQL"
->3.2.3. Installing MySQL Database</A
-></H2
+NAME="install-mysql">4.1.3. MySQL</H2
 ><P
->	Visit MySQL homepage at <A
+>Visit the MySQL homepage at 
+      <A
 HREF="http://www.mysql.com"
 TARGET="_top"
 >www.mysql.com</A
-> and grab the latest stable release of the server.  Many of the binary versions of MySQL store their data files in <TT
-CLASS="FILENAME"
->/var</TT
-> which is often part of a smaller root partition. If you decide to build from sources you can easily set the dataDir as an option to <TT
-CLASS="FILENAME"
->configure</TT
->.
+>
+      to grab and install the latest stable release of the server. 
       </P
-><P
->	If you install from source or non-package (RPM, deb, etc.)
-	binaries you need to add
-	<I
-CLASS="FIRSTTERM"
->mysqld</I
-> to your
-	init scripts so the server daemon will come back up whenever
-	your machine reboots. Further discussion of UNIX init
-	sequences are beyond the scope of this guide.
-	<DIV
-CLASS="NOTE"
+><DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -408,149 +506,98 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->You should have your init script start
-	    <I
-CLASS="GLOSSTERM"
->mysqld</I
-> with the ability to accept
-	    large packets. By default, <TT
-CLASS="FILENAME"
->mysqld</TT
+> Many of the binary
+        versions of MySQL store their data files in 
+        <TT
+CLASS="filename"
+>/var</TT
+>.
+        On some Unix systems, this is part of a smaller root partition,
+        and may not have room for your bug database. You can set the data
+         directory as an option to <TT
+CLASS="filename"
+>configure</TT
 >
-	    only accepts packets up to 64K long. This limits the size
-	    of attachments you may put on bugs. If you add <TT
-CLASS="OPTION"
->-O
-	    max_allowed_packet=1M</TT
-> to the command that starts
-	    <TT
-CLASS="FILENAME"
->mysqld</TT
-> (or
-	    <TT
-CLASS="FILENAME"
->safe_mysqld</TT
->), then you will be able
-	    to have attachments up to about 1 megabyte.</P
+         if you build MySQL from source yourself.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
+><P
+>If you install from something other than an RPM or Debian 
+      package, you will need to add <TT
+CLASS="filename"
+>mysqld</TT
 >
-
+      to your init scripts so the server daemon will come back up whenever
+      your machine reboots. Further discussion of UNIX init sequences are
+      beyond the scope of this guide. 
       </P
-><DIV
-CLASS="NOTE"
 ><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	  If you plan on running Bugzilla and MySQL on the same
-	  machine, consider using the <TT
-CLASS="OPTION"
+>Change your init script to start 
+      <TT
+CLASS="filename"
+>mysqld</TT
+>
+      with the ability to accept large packets. By default, 
+      <TT
+CLASS="filename"
+>mysqld</TT
+>
+      only accepts packets up to 64K long. This limits the size of
+      attachments you may put on bugs. If you add 
+      <TT
+CLASS="option"
+>-O max_allowed_packet=1M</TT
+>
+      to the command that starts 
+      <TT
+CLASS="filename"
+>mysqld</TT
+>
+      (or <TT
+CLASS="filename"
+>safe_mysqld</TT
+>), 
+      then you will be able to have attachments up to about 1 megabyte.
+      There is a Bugzilla parameter for maximum attachment size;
+      you should configure it to match the value you choose here.</P
+><P
+>If you plan on running Bugzilla and MySQL on the same machine,
+      consider using the 
+      <TT
+CLASS="option"
 >--skip-networking</TT
 >
-	  option in the init script. This enhances security by
-	  preventing network access to MySQL.
-	</P
-></TD
-></TR
-></TABLE
-></DIV
+      option in the init script. This enhances security by preventing
+      network access to MySQL.</P
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="INSTALL-PERL"
->3.2.4. Perl (5.004 or greater)</A
-></H2
-><P
->	Any machine that doesn't have perl on it is a sad machine
-	indeed.  Perl for *nix systems can be gotten in source form
-	from http://www.perl.com.  Although Bugzilla runs with most
-	post-5.004 versions of Perl, it's a good idea to be up to the
-	very latest version if you can when running Bugzilla.  As of
-	this writing, that is perl version 5.6.1.
-      </P
+NAME="install-perl">4.1.4. Perl</H2
 ><P
->	Perl is now a far cry from the the single compiler/interpreter
-	binary it once was.  It includes a great many required modules
-	and quite a few other support files.  If you're not up to or
-	not inclined to build perl from source, you'll want to install
-	it on your machine using some sort of packaging system (be it
-	RPM, deb, or what have you) to ensure a sane install. In the
-	subsequent sections you'll be installing quite a few perl
-	modules; this can be quite ornery if your perl installation
-	isn't up to snuff.
-      </P
-><DIV
-CLASS="WARNING"
-><P
-></P
-><TABLE
-CLASS="WARNING"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/warning.gif"
-HSPACE="5"
-ALT="Warning"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->Many people complain that Perl modules will not install
-	  for them.  Most times, the error messages complain that they
-	  are missing a file in <SPAN
-CLASS="QUOTE"
->"@INC"</SPAN
->.  Virtually every
-	  time, this is due to permissions being set too restrictively
-	  for you to compile Perl modules or not having the necessary
-	  Perl development libraries installed on your system..
-	  Consult your local UNIX systems administrator for help
-	  solving these permissions issues; if you
-	  <EM
->are</EM
-> the local UNIX sysadmin, please
-	  consult the newsgroup/mailing list for further assistance or
-	  hire someone to help you out.
-	</P
-></TD
-></TR
-></TABLE
-></DIV
+>Any machine that doesn't have Perl on it is a sad machine indeed.
+      Perl can be got in source form from 
+      <A
+HREF="http://www.perl.com"
+TARGET="_top"
+>perl.com</A
+> for the rare 
+      *nix systems which don't have it. 
+      Although Bugzilla runs with all post-5.005
+      versions of Perl, it's a good idea to be up to the very latest version
+      if you can when running Bugzilla. As of this writing, that is Perl
+      version 5.6.1.</P
 ><DIV
-CLASS="TIP"
+CLASS="tip"
 ><A
-NAME="BUNDLEBUGZILLA"
-></A
-><P
+NAME="bundlebugzilla"><P
 ></P
 ><TABLE
-CLASS="TIP"
+CLASS="tip"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -566,349 +613,292 @@ ALT="Tip"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  You can skip the following Perl module installation steps by
-	  installing <SPAN
-CLASS="PRODUCTNAME"
+>You can skip the following Perl module installation steps by
+        installing 
+        <SPAN
+CLASS="productname"
 >Bundle::Bugzilla</SPAN
-> from
-	  <A
-HREF="glossary.html#GLOSS_CPAN"
+>
+
+        from 
+        <A
+HREF="glossary.html#gloss-cpan"
 ><I
-CLASS="GLOSSTERM"
+CLASS="glossterm"
 >CPAN</I
 ></A
->, which
-	  includes them. All Perl module installation steps require
-	  you have an active Internet connection.  If you wish to use
-	  Bundle::Bugzilla, however, you must be using the latest
-	  version of Perl (at this writing, version 5.6.1)
-	</P
-><P
->	  <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
+>, 
+        which installs all required modules for you.</P
+><P
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >bash#</TT
-> <B
-CLASS="COMMAND"
->perl -MCPAN
-	      -e 'install "Bundle::Bugzilla"'</B
 >
-	  </TT
+
+            <B
+CLASS="command"
+>perl -MCPAN -e 'install "Bundle::Bugzilla"'</B
+>
+          </TT
 >
-	</P
+        </P
 ><P
->	  Bundle::Bugzilla doesn't include GD, Chart::Base, or
-	  MIME::Parser, which are not essential to a basic Bugzilla
-	  install.  If installing this bundle fails, you should
-	  install each module individually to isolate the problem.
-	</P
+>Bundle::Bugzilla doesn't include GD, Chart::Base, or
+        MIME::Parser, which are not essential to a basic Bugzilla install. If
+        installing this bundle fails, you should install each module
+        individually to isolate the problem.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="AEN602"
->3.2.5. DBI Perl Module</A
-></H2
-><P
->	The DBI module is a generic Perl module used by other database related
-	Perl modules.  For our purposes it's required by the MySQL-related
-	modules.  As long as your Perl installation was done correctly the
-	DBI module should be a breeze.  It's a mixed Perl/C module, but Perl's
-	MakeMaker system simplifies the C compilation greatly.
-      </P
-><P
->	Like almost all Perl modules DBI can be found on the Comprehensive Perl
-	Archive Network (CPAN) at http://www.cpan.org.  The CPAN servers have a
-	real tendency to bog down, so please use mirrors.  The current location
-	at the time of this writing can be found in <A
-HREF="downloadlinks.html"
->Appendix B</A
->.
-      </P
+NAME="perl-modules">4.1.5. Perl Modules</H2
 ><P
->	Quality, general Perl module installation instructions can be found on
-	the CPAN website, but the easy thing to do is to just use the CPAN shell
-	which does all the hard work for you.
+> 
+      All Perl modules can be found on the
+      <A
+HREF="http://www.cpan.org"
+TARGET="_top"
+>Comprehensive Perl 
+      Archive Network</A
+> (CPAN). The
+      CPAN servers have a real tendency to bog down, so please use mirrors.
+    </P
+><P
+>Quality, general Perl module installation instructions can be
+      found on the CPAN website, but the easy thing to do is to just use the
+      CPAN shell which does all the hard work for you.
+      To use the CPAN shell to install a module: 
       </P
 ><P
->	To use the CPAN shell to install DBI:
-	<DIV
-CLASS="INFORMALEXAMPLE"
-><A
-NAME="AEN609"
-></A
-><P
-></P
-><P
->	    <TT
-CLASS="COMPUTEROUTPUT"
->	      <TT
-CLASS="PROMPT"
+>&#13;        <TT
+CLASS="computeroutput"
+>&#13;          <TT
+CLASS="prompt"
 >bash#</TT
 >
-	      <B
-CLASS="COMMAND"
->perl -MCPAN -e 'install "DBI"'</B
+          <B
+CLASS="command"
+>perl -MCPAN -e 'install "&#60;modulename&#62;"'</B
 >
-	    </TT
->
-	    <DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->Replace "DBI" with the name of whichever module you wish
-		to install, such as Data::Dumper, TimeDate, GD, etc.</P
-></TD
-></TR
-></TABLE
-></DIV
+        </TT
 >
-	  </P
-><P
-></P
-></DIV
->
-	To do it the hard way:
-	<DIV
-CLASS="INFORMALEXAMPLE"
-><A
-NAME="AEN616"
-></A
+      </P
 ><P
-></P
+>&#13;      To do it the hard way: 
+      </P
 ><P
->	    Untar the module tarball -- it should create its own directory
-	  </P
+>Untar the module tarball -- it should create its own
+      directory</P
 ><P
->	    CD to the directory just created, and enter the following commands:
-	    <P
+>CD to the directory just created, and enter the following
+      commands: 
+      <P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->		  <TT
-CLASS="COMPUTEROUTPUT"
->		    <TT
-CLASS="PROMPT"
+>&#13;            <TT
+CLASS="computeroutput"
+>&#13;              <TT
+CLASS="prompt"
 >bash#</TT
 >
-		    <B
-CLASS="COMMAND"
+
+              <B
+CLASS="command"
 >perl Makefile.PL</B
 >
-		  </TT
+            </TT
 >
-		</P
+          </P
 ></LI
 ><LI
 ><P
->		  <TT
-CLASS="COMPUTEROUTPUT"
->		    <TT
-CLASS="PROMPT"
+>&#13;            <TT
+CLASS="computeroutput"
+>&#13;              <TT
+CLASS="prompt"
 >bash#</TT
 >
-		    <B
-CLASS="COMMAND"
+
+              <B
+CLASS="command"
 >make</B
 >
-		  </TT
+            </TT
 >
-		</P
+          </P
 ></LI
 ><LI
 ><P
->		  <TT
-CLASS="COMPUTEROUTPUT"
->		    <TT
-CLASS="PROMPT"
+>&#13;            <TT
+CLASS="computeroutput"
+>&#13;              <TT
+CLASS="prompt"
 >bash#</TT
 >
-		    <B
-CLASS="COMMAND"
+
+              <B
+CLASS="command"
 >make test</B
 >
-		  </TT
+            </TT
 >
-		</P
+          </P
 ></LI
 ><LI
 ><P
->		  <TT
-CLASS="COMPUTEROUTPUT"
->		    <TT
-CLASS="PROMPT"
+>&#13;            <TT
+CLASS="computeroutput"
+>&#13;              <TT
+CLASS="prompt"
 >bash#</TT
 >
-		    <B
-CLASS="COMMAND"
+
+              <B
+CLASS="command"
 >make install</B
 >
-		  </TT
+            </TT
 >
-		</P
+          </P
 ></LI
 ></OL
 >
-	    If everything went ok that should be all it takes.  For the vast
-	    majority of perl modules this is all that's required.
-	  </P
+      </P
+><DIV
+CLASS="warning"
 ><P
 ></P
-></DIV
+><TABLE
+CLASS="warning"
+WIDTH="100%"
+BORDER="0"
+><TR
+><TD
+WIDTH="25"
+ALIGN="CENTER"
+VALIGN="TOP"
+><IMG
+SRC="../images/warning.gif"
+HSPACE="5"
+ALT="Warning"></TD
+><TD
+ALIGN="LEFT"
+VALIGN="TOP"
+><P
+>Many people complain that Perl modules will not install for
+        them. Most times, the error messages complain that they are missing a
+        file in 
+        <SPAN
+CLASS="QUOTE"
+>"@INC"</SPAN
+>. 
+        Virtually every time, this error is due to permissions being set too
+        restrictively for you to compile Perl modules or not having the
+        necessary Perl development libraries installed on your system.
+        Consult your local UNIX systems administrator for help solving these
+        permissions issues; if you 
+        <EM
+>are</EM
 >
-      </P
+        the local UNIX sysadmin, please consult the newsgroup/mailing list
+        for further assistance or hire someone to help you out.</P
+></TD
+></TR
+></TABLE
 ></DIV
 ><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
+CLASS="section"
+><H3
+CLASS="section"
 ><A
-NAME="AEN640"
->3.2.6. Data::Dumper Perl Module</A
-></H2
-><P
->	The Data::Dumper module provides data structure persistence for Perl
-	(similar to Java's serialization).  It comes with later sub-releases of
-	Perl 5.004, but a re-installation just to be sure it's available won't
-	hurt anything.
-      </P
+NAME="AEN642">4.1.5.1. DBI</H3
 ><P
->	Data::Dumper is used by the MySQL-related Perl modules.  It
-	can be found on CPAN (see <A
-HREF="downloadlinks.html"
->Appendix B</A
->) and
-	can be
-	installed by following the same four step make sequence used
-	for the DBI module.
-      </P
+>The DBI module is a generic Perl module used the
+      MySQL-related modules. As long as your Perl installation was done
+      correctly the DBI module should be a breeze. It's a mixed Perl/C
+      module, but Perl's MakeMaker system simplifies the C compilation
+      greatly.</P
 ></DIV
 ><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
+CLASS="section"
+><H3
+CLASS="section"
 ><A
-NAME="AEN645"
->3.2.7. MySQL related Perl Module Collection</A
-></H2
+NAME="AEN645">4.1.5.2. Data::Dumper</H3
 ><P
->	The Perl/MySQL interface requires a few mutually-dependent perl
-	modules.  These modules are grouped together into the the
-	Msql-Mysql-modules package.  This package can be found at CPAN.
-	After the archive file has been downloaded it should
-	be untarred.
-      </P
-><P
->	The MySQL modules are all built using one make file which is generated
-	by running:
-	<TT
-CLASS="PROMPT"
->bash#</TT
->
-	<B
-CLASS="COMMAND"
->perl Makefile.pl</B
->
-      </P
-><P
->	The MakeMaker process will ask you a few questions about the desired
-	compilation target and your MySQL installation.  For many of the questions
-	the provided default will be adequate.
+>The Data::Dumper module provides data structure persistence for
+      Perl (similar to Java's serialization). It comes with later
+      sub-releases of Perl 5.004, but a re-installation just to be sure it's
+      available won't hurt anything.</P
+></DIV
+><DIV
+CLASS="section"
+><H3
+CLASS="section"
+><A
+NAME="AEN648">4.1.5.3. MySQL-related modules</H3
+><P
+>The Perl/MySQL interface requires a few mutually-dependent Perl
+      modules. These modules are grouped together into the the
+      Msql-Mysql-modules package.</P
+><P
+>The MakeMaker process will ask you a few questions about the
+      desired compilation target and your MySQL installation. For most of the
+      questions the provided default will be adequate, but when asked if your
+      desired target is the MySQL or mSQL packages, you should
+      select the MySQL related ones. Later you will be asked if you wish to
+      provide backwards compatibility with the older MySQL packages; you
+      should answer YES to this question. The default is NO.</P
+><P
+>A host of 'localhost' should be fine and a testing user of 'test'
+      with a null password should find itself with sufficient access to run
+      tests on the 'test' database which MySQL created upon installation.
       </P
-><P
->	When asked if your desired target is the MySQL or mSQL packages,
-	select the MySQL related ones.  Later you will be asked if you wish
-	to provide backwards compatibility with the older MySQL packages; you
-	  should answer YES to this question. The default is NO.
-	</P
-><P
->	  A host of 'localhost' should be fine and a testing user of 'test' and
-	  a null password should find itself with sufficient access to run tests
-	  on the 'test' database which MySQL created upon installation.  If 'make
-	  test' and 'make install' go through without errors you should be ready
-	  to go as far as database connectivity is concerned.
-	</P
 ></DIV
 ><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
+CLASS="section"
+><H3
+CLASS="section"
 ><A
-NAME="AEN654"
->3.2.8. TimeDate Perl Module Collection</A
-></H2
+NAME="AEN653">4.1.5.4. TimeDate modules</H3
 ><P
->	  Many of the more common date/time/calendar related Perl
-	modules have been grouped into a bundle similar to the MySQL
-	modules bundle. This bundle is stored on the CPAN under the
-	name TimeDate (see link: <A
-HREF="downloadlinks.html"
->Appendix B</A
->). The
-	component module we're most interested in is the Date::Format
-	module, but installing all of them is probably a good idea
-	anyway.  The standard Perl module installation instructions
-	should work perfectly for this simple package.
-	</P
+>Many of the more common date/time/calendar related Perl modules
+      have been grouped into a bundle similar to the MySQL modules bundle.
+      This bundle is stored on the CPAN under the name TimeDate. 
+      The component module we're most interested in is the Date::Format
+      module, but installing all of them is probably a good idea anyway.
+      </P
 ></DIV
 ><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
+CLASS="section"
+><H3
+CLASS="section"
 ><A
-NAME="AEN658"
->3.2.9. GD Perl Module (1.8.3)</A
-></H2
-><P
->	  The GD library was written by Thomas Boutell a long while
-	ago to programatically generate images in C.  Since then it's
-	become the defacto standard for programatic image
-	construction.  The Perl bindings to it found in the GD library
-	are used on millions of web pages to generate graphs on the
-	fly. That's what bugzilla will be using it for so you must
-	install it if you want any of the graphing to work.
-	</P
-><P
->	  Actually bugzilla uses the Graph module which relies on GD
-	itself.  Isn't that always the way with object-oriented
-	programming?  At any rate, you can find the GD library on CPAN
-	in <A
-HREF="downloadlinks.html"
->Appendix B</A
->.  
-	</P
+NAME="AEN656">4.1.5.5. GD (optional)</H3
+><P
+>The GD library was written by Thomas Boutell a long while ago to
+      programatically generate images in C. Since then it's become the
+      defacto standard for programatic image construction. The Perl bindings
+      to it found in the GD library are used on millions of web pages to
+      generate graphs on the fly. That's what Bugzilla will be using it for
+      so you must install it if you want any of the graphing to work.</P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -924,84 +914,75 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	    The Perl GD library requires some other libraries that may
-	  or may not be installed on your system, including
-	  <TT
-CLASS="CLASSNAME"
+>The Perl GD library requires some other libraries that may or
+        may not be installed on your system, including 
+        <TT
+CLASS="classname"
 >libpng</TT
-> and
-	  <TT
-CLASS="CLASSNAME"
+>
+        and 
+        <TT
+CLASS="classname"
 >libgd</TT
->.  The full requirements are
-	  listed in the Perl GD library README.  Just realize that if
-	  compiling GD fails, it's probably because you're missing a
-	  required library.
-	  </P
+>. 
+        The full requirements are listed in the Perl GD library README.
+        If compiling GD fails, it's probably because you're
+        missing a required library.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
+CLASS="section"
+><H3
+CLASS="section"
 ><A
-NAME="AEN667"
->3.2.10. Chart::Base Perl Module (0.99c)</A
-></H2
+NAME="AEN663">4.1.5.6. Chart::Base (optional)</H3
 ><P
->	  The Chart module provides bugzilla with on-the-fly charting
-	abilities.  It can be installed in the usual fashion after it
-	has been fetched from CPAN where it is found as the
-	Chart-x.x... tarball, linked in <A
-HREF="downloadlinks.html"
->Appendix B</A
->. Note that
-	as with the GD perl module, only the version listed above, or
-	newer, will work. Earlier versions used GIF's, which are no
-	longer supported by the latest versions of GD.
-	</P
+>The Chart module provides Bugzilla with on-the-fly charting
+      abilities. It can be installed in the usual fashion after it has been
+      fetched from CPAN. 
+      Note that earlier versions that 0.99c used GIFs, which are no longer
+      supported by the latest versions of GD.</P
 ></DIV
 ><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
+CLASS="section"
+><H3
+CLASS="section"
 ><A
-NAME="AEN671"
->3.2.11. DB_File Perl Module</A
-></H2
-><P
->	  DB_File is a module which allows Perl programs to make use
-	of the facilities provided by  Berkeley DB version 1.x. This
-	module is required by collectstats.pl which is used for  bug
-	charting. If you plan to make use of bug charting, you must
-	install this module.
-	</P
+NAME="AEN666">4.1.5.7. Template Toolkit</H3
+><P
+>When you install Template Toolkit, you'll get asked various
+      questions about features to enable. The defaults are fine, except
+      that it is recommended you use the high speed XS Stash of the Template
+      Toolkit, in order to achieve best performance.  However, there are
+      known problems with XS Stash and Perl 5.005_02 and lower.  If you
+      wish to use these older versions of Perl, please use the regular
+      stash.</P
+></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="AEN674"
->3.2.12. HTTP Server</A
-></H2
+NAME="AEN669">4.1.6. HTTP Server</H2
 ><P
->	  You have a freedom of choice here - Apache, Netscape or any
-	other server on UNIX would do.  You can easily run the web
-	server on a different machine than MySQL, but need to adjust
-	the MySQL <SPAN
+>You have a freedom of choice here - Apache, Netscape or any other
+      server on UNIX would do. You can run the web server on a
+      different machine than MySQL, but need to adjust the MySQL 
+      <SPAN
 CLASS="QUOTE"
 >"bugs"</SPAN
-> user permissions accordingly.
-	<DIV
-CLASS="NOTE"
+>
+      user permissions accordingly. 
+      <DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -1017,24 +998,22 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->I strongly recommend Apache as the web server to use.
-	    The Bugzilla Guide installation instructions, in general,
-	    assume you are using Apache.  As more users use different
-	    webservers and send me information on the peculiarities of
-	    installing using their favorite webserver, I will provide
-	    notes for them.</P
+>We strongly recommend Apache as the web server to use. The
+        Bugzilla Guide installation instructions, in general, assume you are
+        using Apache. If you have got Bugzilla working using another webserver,
+        please share your experiences with us.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 >
-	</P
+      </P
 ><P
->	  You'll want to make sure that your web server will run any
-	file with the .cgi extension as a cgi and not just display it.
-	If you're using apache that means uncommenting the following
-	line in the srm.conf file:
-	<TABLE
+>You'll want to make sure that your web server will run any file
+      with the .cgi extension as a CGI and not just display it. If you're
+      using Apache that means uncommenting the following line in the httpd.conf
+      file: 
+      <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -1043,19 +1022,18 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->AddHandler cgi-script .cgi
-	</PRE
+CLASS="programlisting"
+>AddHandler cgi-script .cgi</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-	</P
+      </P
 ><P
->	  With apache you'll also want to make sure that within the
-	access.conf file the line:
- <TABLE
+>With Apache you'll also want to make sure that within the
+      httpd.conf file the line: 
+      <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -1064,22 +1042,23 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->Options ExecCGI</PRE
+CLASS="programlisting"
+>Options ExecCGI AllowOverride Limit</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-	is in the stanza that covers the directories into which
-	you intend to put the bugzilla .html and .cgi files.
-	</P
-><DIV
-CLASS="NOTE"
+
+      is in the stanza that covers the directories into which you intend to
+      put the bugzilla .html and .cgi files.
+
+        <DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -1095,20 +1074,23 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  Users of newer versions of Apache will generally find both
-	  of the above lines will be in the httpd.conf file, rather
-	  than srm.conf or access.conf.
-	</P
+>AllowOverride Limit allows the use of a Deny statement in the
+          .htaccess file generated by checksetup.pl</P
+><P
+>Users of older versions of Apache may find the above lines 
+          in the srm.conf and access.conf files, respecitvely.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
+>
+      </P
 ><DIV
-CLASS="WARNING"
+CLASS="warning"
 ><P
 ></P
 ><TABLE
-CLASS="WARNING"
+CLASS="warning"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -1124,64 +1106,63 @@ ALT="Warning"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	    There are important files and directories that should not
-	  be a served by the HTTP server. These are most files in the
-	  <SPAN
+>There are important files and directories that should not be a
+        served by the HTTP server - most files in the 
+        <SPAN
 CLASS="QUOTE"
 >"data"</SPAN
-> and <SPAN
+>
+        and 
+        <SPAN
 CLASS="QUOTE"
 >"shadow"</SPAN
->  directories
-	  and the <SPAN
+>
+        directories and the 
+        <SPAN
 CLASS="QUOTE"
 >"localconfig"</SPAN
-> file. You should
-	  configure your HTTP server to not serve content from these
-	  files. Failure to do so will expose critical passwords and
-	  other data. Please see <A
-HREF="geninstall.html#HTACCESS"
+>
+        file. You should configure your HTTP server to not serve 
+        these files. Failure to do so will expose critical passwords and
+        other data. Please see 
+        <A
+HREF="extraconfig.html#htaccess"
 >.htaccess files and security</A
-> for details
-	  on how to do this for Apache.  I appreciate notes on how to
-	  get this same functionality using other webservers.
-	  </P
+>
+        for details on how to do this for Apache; the checksetup.pl
+        script should create appropriate .htaccess files for you.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="AEN692"
->3.2.13. Installing the Bugzilla Files</A
-></H2
+NAME="AEN688">4.1.7. Bugzilla</H2
 ><P
->	  You should untar the Bugzilla files into a directory that
-	you're willing to make writable by the default web server user
-	(probably <SPAN
+>You should untar the Bugzilla files into a directory that you're
+      willing to make writable by the default web server user (probably 
+      <SPAN
 CLASS="QUOTE"
 >"nobody"</SPAN
->).  You may decide to put the
-	files off of the main web space for your web server or perhaps
-	off of <TT
-CLASS="FILENAME"
+>). 
+      You may decide to put the files in the main web space for your
+      web server or perhaps in 
+      <TT
+CLASS="filename"
 >/usr/local</TT
-> with a symbolic link in
-	the web space that points to the Bugzilla directory.  At any
-	rate, just dump all the files in the same place, and make sure
-	you can access the files in that directory through your web
-	server.
-	</P
+>
+      with a symbolic link in the web space that points to the Bugzilla
+      directory.</P
 ><DIV
-CLASS="TIP"
+CLASS="tip"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
+CLASS="tip"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -1197,352 +1178,238 @@ ALT="Tip"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	    If you symlink the bugzilla directory into your Apache's
-	  HTML heirarchy, you may receive
-	  <SPAN
-CLASS="ERRORNAME"
+>If you symlink the bugzilla directory into your Apache's HTML
+        heirarchy, you may receive 
+        <SPAN
+CLASS="errorname"
 >Forbidden</SPAN
-> errors unless you add the
-	  <SPAN
+>
+        errors unless you add the 
+        <SPAN
 CLASS="QUOTE"
 >"FollowSymLinks"</SPAN
-> directive to the
-	  &#60;Directory&#62; entry for the HTML root.
-	  </P
+>
+        directive to the &#60;Directory&#62; entry for the HTML root
+        in httpd.conf.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ><P
->	  Once all the files are in a web accessible directory, make
-	that directory writable by your webserver's user.  This is a
-	temporary step until you run the post-install
-	<TT
-CLASS="FILENAME"
+>Once all the files are in a web accessible directory, make that
+      directory writable by your webserver's user. This is a temporary step
+      until you run the post-install 
+      <TT
+CLASS="filename"
 >checksetup.pl</TT
-> script, which locks down your
-	installation.
-      </P
+>
+      script, which locks down your installation.</P
 ><P
->	Lastly, you'll need to set up a symbolic link to
-	<TT
-CLASS="FILENAME"
+>Lastly, you'll need to set up a symbolic link to 
+      <TT
+CLASS="filename"
 >/usr/bonsaitools/bin/perl</TT
-> for the correct
-	location of your perl executable (probably
-	<TT
-CLASS="FILENAME"
->/usr/bin/perl</TT
->). Otherwise you must hack
-	all the .cgi files to change where they look for perl, or use
-	<A
-HREF="setperl.html"
->The setperl.csh Utility</A
->, found in
-	<A
-HREF="patches.html"
->Useful Patches and Utilities for Bugzilla</A
->.  I suggest using the symlink
-	approach for future release compatability.
-	<DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN708"
-></A
-><P
-><B
->Example 3-1. Setting up bonsaitools symlink</B
-></P
-><P
->	      Here's how you set up the Perl symlink on Linux to make
-	    Bugzilla work. Your mileage may vary.  For some UNIX
-	    operating systems, you probably need to subsitute
-	    <SPAN
-CLASS="QUOTE"
->"/usr/local/bin/perl"</SPAN
-> for
-	    <SPAN
-CLASS="QUOTE"
->"/usr/bin/perl"</SPAN
->  below; if on certain other
-	    UNIX systems, Perl may live in weird places like
-	    <SPAN
-CLASS="QUOTE"
->"/opt/perl"</SPAN
->.  As root, run these commands:
-	    <TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
->bash# mkdir /usr/bonsaitools  
-bash# mkdir /usr/bonsaitools/bin 
-bash# ln -s /usr/bin/perl /usr/bosaitools/bin/perl
-	    </PRE
-></FONT
-></TD
-></TR
-></TABLE
 >
-	  </P
+      for the correct location of your Perl executable (probably 
+      <TT
+CLASS="filename"
+>/usr/bin/perl</TT
+>). 
+      Otherwise you must hack all the .cgi files to change where they look
+      for Perl. This can be done using the following Perl one-liner, but 
+      I suggest using the symlink approach to avoid upgrade hassles.
+      </P
 ><P
->	    Alternately, you can simply run this perl one-liner to
-	    change your path to perl in all the files in your Bugzilla
-	    installation:
-	    <TABLE
+> 
+        <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
 ><TR
 ><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
->perl -pi -e 's@#!/usr/bonsaitools/bin/perl@#!/usr/bin/perl@' *cgi *pl Bug.pm
-	    </PRE
-></FONT
-></TD
-></TR
-></TABLE
->
-	    Change the second path to perl to match your installation.
-	  </P
-></DIV
->
-	<DIV
-CLASS="TIP"
-><P
-></P
-><TABLE
-CLASS="TIP"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/tip.gif"
-HSPACE="5"
-ALT="Tip"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	    If you don't have root access to set this symlink up,
-	    check out the
-	    <A
-HREF="setperl.html"
->The setperl.csh Utility</A
->, listed in <A
-HREF="patches.html"
->Useful Patches and Utilities for Bugzilla</A
->. It will change the path to perl in all your Bugzilla files for you.
-	  </P
-></TD
-></TR
-></TABLE
-></DIV
->
-	</P
-></DIV
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="AEN721"
->3.2.14. Setting Up the MySQL Database</A
-></H2
-><P
->	  After you've gotten all the software installed and working you're ready
-	  to start preparing the database for its life as a the back end to a high
-	  quality bug tracker.
-	</P
-><P
->	  First, you'll want to fix MySQL permissions to allow access
-	from Bugzilla.  For the purpose of this Installation section,
-	the Bugzilla username will be <SPAN
-CLASS="QUOTE"
->"bugs"</SPAN
->, and will
-	have minimal permissions.
-	
-	<DIV
-CLASS="WARNING"
-><P
-></P
-><TABLE
-CLASS="WARNING"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/warning.gif"
-HSPACE="5"
-ALT="Warning"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	    Bugzilla has not undergone a thorough security audit. It
-	    may be possible for a system cracker to somehow trick
-	    Bugzilla into executing a command such as <B
-CLASS="COMMAND"
->DROP
-	      DATABASE mysql</B
->.
-	  </P
-><P
->That would be bad.</P
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+>perl -pi -e
+        's@#\!/usr/bonsaitools/bin/perl@#\!/usr/bin/perl@' *cgi *pl Bug.pm
+        processmail syncshadowdb</PRE
+></FONT
 ></TD
 ></TR
 ></TABLE
-></DIV
 >
+
+        Change <TT
+CLASS="filename"
+>/usr/bin/perl</TT
+> to match the location
+        of Perl on your machine.
+      </P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="AEN705">4.1.8. Setting Up the MySQL Database</H2
+><P
+>After you've gotten all the software installed and working you're
+      ready to start preparing the database for its life as the back end to
+      a high quality bug tracker.</P
+><P
+>First, you'll want to fix MySQL permissions to allow access from
+      Bugzilla. For the purpose of this Installation section, the Bugzilla
+      username will be 
+      <SPAN
+CLASS="QUOTE"
+>"bugs"</SPAN
+>, and will have minimal permissions. 
       </P
 ><P
->	Give the MySQL root user a password.  MySQL passwords are
-	limited to 16 characters.
-	<P
+>Begin by giving the MySQL root user a password. MySQL passwords are limited
+      to 16 characters. 
+      <P
 ></P
 ><TABLE
 BORDER="0"
 ><TBODY
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >bash#</TT
-> <B
-CLASS="COMMAND"
->mysql
-		-u root mysql</B
-> </TT
 >
-	  </TD
+
+            <B
+CLASS="command"
+>mysql -u root mysql</B
+>
+          </TT
+>
+        </TD
 ></TR
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >mysql&#62;</TT
-> <B
-CLASS="COMMAND"
->		UPDATE user SET Password=PASSWORD ('new_password')
-		WHERE user='root'; </B
-> </TT
 >
-	  </TD
+
+            <B
+CLASS="command"
+>UPDATE user SET Password=PASSWORD('&#60;new_password'&#62;)
+            WHERE user='root';</B
+>
+          </TT
+>
+        </TD
 ></TR
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >mysql&#62;</TT
-> <B
-CLASS="COMMAND"
->FLUSH
-		PRIVILEGES;</B
-> </TT
 >
-	  </TD
+
+            <B
+CLASS="command"
+>FLUSH PRIVILEGES;</B
+>
+          </TT
+>
+        </TD
 ></TR
 ></TBODY
 ></TABLE
 ><P
 ></P
-> From this point on, if you need to access
-	MySQL as the MySQL root user, you will need to use
-	<B
-CLASS="COMMAND"
+>
+
+      From this point on, if you need to access MySQL as the MySQL root user,
+      you will need to use 
+      <B
+CLASS="command"
 >mysql -u root -p</B
-> and enter your
-	new_password.  Remember that MySQL user names have nothing to
-	do with Unix user names (login names).	  
-      </P
-><P
->	Next, we create the <SPAN
+>
+
+      and enter &#60;new_password&#62;. Remember that MySQL user names have
+      nothing to do with Unix user names (login names).</P
+><P
+>Next, we use an SQL <B
+CLASS="command"
+>GRANT</B
+> command to create a 
+      <SPAN
 CLASS="QUOTE"
 >"bugs"</SPAN
-> user, and grant
-	sufficient permissions for checksetup.pl, which we'll use
-	later, to work its magic.  This also restricts the
-	<SPAN
+>
+
+      user, and grant sufficient permissions for checksetup.pl, which we'll
+      use later, to work its magic. This also restricts the 
+      <SPAN
 CLASS="QUOTE"
 >"bugs"</SPAN
-> user to operations within a database
-	called <SPAN
+>
+      user to operations within a database called 
+      <SPAN
 CLASS="QUOTE"
 >"bugs"</SPAN
->, and only allows the account to
-	connect from <SPAN
+>, and only allows the account to connect from 
+      <SPAN
 CLASS="QUOTE"
 >"localhost"</SPAN
->.  Modify it to reflect
-	your setup if you will be connecting from another machine or
-	as a different user.
-      </P
+>. 
+      Modify it to reflect your setup if you will be connecting from
+      another machine or as a different user.</P
 ><P
->	Remember to set bugs_password to some unique password.
-	<P
+>Remember to set &#60;bugs_password&#62; to some unique password. 
+      <P
 ></P
 ><TABLE
 BORDER="0"
 ><TBODY
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
->	      <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-	      <B
-CLASS="COMMAND"
+
+            <B
+CLASS="command"
 >GRANT SELECT,INSERT,UPDATE,DELETE,INDEX,
-		ALTER,CREATE,DROP,REFERENCES 
-		ON bugs.* TO bugs@localhost
-		IDENTIFIED BY 'bugs_password';</B
+            ALTER,CREATE,DROP,REFERENCES ON bugs.* TO bugs@localhost
+            IDENTIFIED BY '&#60;bugs_password&#62;';</B
 >
-	    </TT
+          </TT
 >
-	  </TD
+        </TD
 ></TR
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
->	      <TT
-CLASS="PROMPT"
->		mysql&#62;
-	      </TT
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
+>mysql&#62;</TT
 >
-	      <B
-CLASS="COMMAND"
->		FLUSH PRIVILEGES;
-	      </B
+
+            <B
+CLASS="command"
+>FLUSH PRIVILEGES;</B
 >
-	    </TT
+          </TT
 >
-	  </TD
+        </TD
 ></TR
 ></TBODY
 ></TABLE
@@ -1550,229 +1417,135 @@ CLASS="COMMAND"
 ></P
 >
       </P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="AEN741">4.1.9. <TT
+CLASS="filename"
+>checksetup.pl</TT
+></H2
 ><P
->	Next, run the magic checksetup.pl script.  (Many thanks to
-	Holger Schurig &#60;holgerschurig@nikocity.de&#62; for writing
-	this script!) It will make sure Bugzilla files and directories
-	have reasonable permissions, set up the
-	<TT
-CLASS="FILENAME"
+>Next, run the magic checksetup.pl script. (Many thanks to 
+      <A
+HREF="mailto:holgerschurig@nikocity.de"
+TARGET="_top"
+>Holger Schurig </A
+> 
+      for writing this script!) 
+      This script is designed to make sure your MySQL database and other
+      configuration options are consistent with the Bugzilla CGI files. 
+      It will make sure Bugzilla files and directories have reasonable
+      permissions, set up the 
+      <TT
+CLASS="filename"
 >data</TT
-> directory, and create all the MySQL
-	tables.
-	<P
+>
+      directory, and create all the MySQL tables. 
+      <P
 ></P
 ><TABLE
 BORDER="0"
 ><TBODY
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >bash#</TT
 >
-	      <B
-CLASS="COMMAND"
+
+            <B
+CLASS="command"
 >./checksetup.pl</B
-> </TT
 >
-	  </TD
+          </TT
+>
+        </TD
 ></TR
 ></TBODY
 ></TABLE
 ><P
 ></P
-> The first time you run it, it will create a
-	file called <TT
-CLASS="FILENAME"
->localconfig</TT
->.
-      </P
-></DIV
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="AEN768"
->3.2.15. Tweaking <TT
-CLASS="FILENAME"
+>
+
+      The first time you run it, it will create a file called 
+      <TT
+CLASS="filename"
 >localconfig</TT
-></A
-></H2
+>.</P
 ><P
->	This file contains a variety of settings you may need to tweak including
-	how Bugzilla should connect to the MySQL database.
-      </P
+>This file contains a variety of settings you may need to tweak
+      including how Bugzilla should connect to the MySQL database.</P
 ><P
->	The connection settings include:
-	<P
+>The connection settings include: 
+      <P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->	      server's host: just use <SPAN
+>server's host: just use 
+          <SPAN
 CLASS="QUOTE"
 >"localhost"</SPAN
-> if the
-	      MySQL server is local
-	    </P
+>
+          if the MySQL server is local</P
 ></LI
 ><LI
 ><P
->	      database name: <SPAN
+>database name: 
+          <SPAN
 CLASS="QUOTE"
 >"bugs"</SPAN
-> if you're following
-	      these directions
-	    </P
+>
+          if you're following these directions</P
 ></LI
 ><LI
 ><P
->	      MySQL username: <SPAN
+>MySQL username: 
+          <SPAN
 CLASS="QUOTE"
 >"bugs"</SPAN
-> if you're following
-	      these directions
-	    </P
+>
+          if you're following these directions</P
 ></LI
 ><LI
 ><P
->	      Password for the <SPAN
+>Password for the 
+          <SPAN
 CLASS="QUOTE"
 >"bugs"</SPAN
-> MySQL account above
-	    </P
+>
+          MySQL account; (&#60;bugs_password&#62;) above</P
 ></LI
 ></OL
 >
       </P
 ><P
->	You should also install .htaccess files that the Apache
-	webserver will use  to restrict access to Bugzilla data files.
-	See <A
-HREF="geninstall.html#HTACCESS"
->.htaccess files and security</A
->.
-      </P
-><P
->	Once you are happy with the settings, re-run
-	<TT
-CLASS="FILENAME"
+>Once you are happy with the settings, 
+      <TT
+CLASS="filename"
+>su</TT
+> to the user
+      your web server runs as, and re-run 
+      <TT
+CLASS="filename"
 >checksetup.pl</TT
->. On this second run, it will
-	  create the database and an administrator account for which
-	  you will be prompted to provide information.
-      </P
-><P
->	When logged into an administrator account once Bugzilla is
-	running, if you go to the query page (off of the Bugzilla main
-	menu), you'll find an <SPAN
-CLASS="QUOTE"
->"edit parameters"</SPAN
-> option
-	that is filled with editable treats.
-      </P
-><P
->	Should everything work, you will have a nearly empty Bugzilla
-	database and a newly-created <TT
-CLASS="FILENAME"
->localconfig</TT
->
-	file in your Bugzilla root directory.
-      </P
-><P
->	<DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	    The second time you run checksetup.pl, you should become
-	    the user your web server runs as, and that you ensure that
-	    you set the <SPAN
-CLASS="QUOTE"
->"webservergroup"</SPAN
-> parameter in localconfig to
-	    match the web  server's group name, if any.  I believe,
-	    for the next release of Bugzilla, this will be fixed so
-	    that Bugzilla supports a <SPAN
-CLASS="QUOTE"
->"webserveruser"</SPAN
-> parameter in
-	    localconfig as well.
-	    <DIV
-CLASS="EXAMPLE"
-><A
-NAME="AEN799"
-></A
-><P
-><B
->Example 3-2. Running checksetup.pl as the web user</B
-></P
-><P
->		  Assuming your web server runs as user "apache", and
-		Bugzilla is installed in "/usr/local/bugzilla", here's
-		one way to run checksetup.pl as the web server user.
-		As root, for the <EM
->second run</EM
-> of
-		checksetup.pl, do this: 
-		<TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
-> 
-bash# chown -R apache:apache /usr/local/bugzilla 
-bash# su - apache 
-bash# cd /usr/local/bugzilla 
-bash# ./checksetup.pl 
-		</PRE
-></FONT
-></TD
-></TR
-></TABLE
->
-	      </P
-></DIV
->
-	  </P
-></TD
-></TR
-></TABLE
-></DIV
->
-      </P
+>. (Note: on some security-conscious
+      systems, you may need to change the login shell for the webserver 
+      account before you can do this.)
+      On this second run, it will create the database and an administrator
+      account for which you will be prompted to provide information.</P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -1788,225 +1561,29 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  The checksetup.pl script is designed so that you can run
-	  it at any time without causing harm.  You should run it
-	  after any upgrade to Bugzilla.
-	</P
-></TD
-></TR
-></TABLE
-></DIV
-></DIV
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="AEN806"
->3.2.16. Setting Up Maintainers Manually (Optional)</A
-></H2
-><P
->	If you want to add someone else to every group by hand, you
-	can do it by typing the appropriate MySQL commands.  Run
-	<B
-CLASS="COMMAND"
-> mysql -u root -p bugs</B
-> You
-	may need different parameters, depending on your security
-	settings. Then:
-	  <P
-></P
-><TABLE
-BORDER="0"
-><TBODY
-><TR
-><TD
->	      <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->mysql&#62;</TT
-> <B
-CLASS="COMMAND"
->update
-		profiles set groupset=0x7fffffffffffffff where
-		login_name = 'XXX';</B
-> </TT
-> (yes, that's <EM
->fifteen</EM
-><SPAN
-CLASS="QUOTE"
->"f"</SPAN
->'s.
-	    </TD
-></TR
-></TBODY
-></TABLE
-><P
-></P
-> replacing XXX with the Bugzilla email address.
-	</P
-></DIV
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="AEN817"
->3.2.17. The Whining Cron (Optional)</A
-></H2
-><P
->	By now you have a fully functional bugzilla, but what good
-	are bugs if they're not annoying?  To help make those bugs
-	more annoying you can set up bugzilla's automatic whining
-	system.  This can be done by adding the following command as a
-	daily crontab entry (for help on that see that crontab man
-	page):
-	<P
-></P
-><TABLE
-BORDER="0"
-><TBODY
-><TR
-><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
-> <B
-CLASS="COMMAND"
->cd
-		&#60;your-bugzilla-directory&#62; ;
-		./whineatnews.pl</B
-> </TT
->
-	  </TD
-></TR
-></TBODY
-></TABLE
-><P
-></P
->
-      </P
-><DIV
-CLASS="TIP"
-><P
-></P
-><TABLE
-CLASS="TIP"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/tip.gif"
-HSPACE="5"
-ALT="Tip"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	  Depending on your system, crontab may have several manpages.
-	  The following command should  lead you to the most useful
-	  page for this purpose: 
-	  <TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
-> man 5 crontab
-	  </PRE
-></FONT
-></TD
-></TR
-></TABLE
->
-	</P
+>The checksetup.pl script is designed so that you can run it at
+        any time without causing harm. You should run it after any upgrade to
+        Bugzilla.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="AEN827"
->3.2.18. Bug Graphs (Optional)</A
-></H2
-><P
->	As long as you installed the GD and Graph::Base Perl modules
-	you might as well turn on the nifty bugzilla bug reporting
-	graphs.
-      </P
-><P
->	Add a cron entry like this to run collectstats daily at 5
-	after midnight:
-	<P
-></P
-><TABLE
-BORDER="0"
-><TBODY
-><TR
-><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
-> <TT
-CLASS="PROMPT"
->bash#</TT
-> <B
-CLASS="COMMAND"
->crontab
-		-e</B
-> </TT
->
-	  </TD
-></TR
-><TR
-><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
-> 5 0 * * * cd
-	      &#60;your-bugzilla-directory&#62; ; ./collectstats.pl
-	    </TT
->
-	  </TD
-></TR
-></TBODY
-></TABLE
-><P
-></P
->
-      </P
-><P
->	After two days have passed you'll be able to view bug graphs
-	from the Bug Reports page. 
-      </P
-></DIV
-><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="AEN839"
->3.2.19. Securing MySQL</A
-></H2
+NAME="AEN773">4.1.10. Securing MySQL</H2
 ><P
->	If you followed the installation instructions for setting up
-	your "bugs" and "root" user in MySQL, much of this should not
-	apply to you.  If you are upgrading an existing installation
-	of Bugzilla, you should pay close attention to this section.
-      </P
+>If you followed the installation instructions for setting up your
+      "bugs" and "root" user in MySQL, much of this should not apply to you.
+      If you are upgrading an existing installation of Bugzilla, you should
+      pay close attention to this section.</P
 ><P
->	Most MySQL installs have "interesting" default security parameters:
-	<P
+>Most MySQL installs have "interesting" default security
+      parameters: 
+      <P
 ></P
 ><TABLE
 BORDER="0"
@@ -2038,96 +1615,100 @@ BORDER="0"
 >
       </P
 ><P
->	This means anyone from anywhere on the internet can not only
-	drop the database with one SQL command, and they can write as
-	root to the system.
-      </P
+>This means anyone from anywhere on the internet can not only drop
+      the database with one SQL command, and they can write as root to the
+      system.</P
 ><P
->	To see your permissions do:
-	<P
+>To see your permissions do: 
+      <P
 ></P
 ><TABLE
 BORDER="0"
 ><TBODY
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
->	      <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >bash#</TT
 >
-	      <B
-CLASS="COMMAND"
+
+            <B
+CLASS="command"
 >mysql -u root -p</B
 >
-	    </TT
+          </TT
 >
-	  </TD
+        </TD
 ></TR
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
->	      <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-	      <B
-CLASS="COMMAND"
+
+            <B
+CLASS="command"
 >use mysql;</B
 >
-	    </TT
+          </TT
 >
-	  </TD
+        </TD
 ></TR
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
->	      <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-	      <B
-CLASS="COMMAND"
+
+            <B
+CLASS="command"
 >show tables;</B
 >
-	    </TT
+          </TT
 >
-	  </TD
+        </TD
 ></TR
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
->	      <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-	      <B
-CLASS="COMMAND"
+
+            <B
+CLASS="command"
 >select * from user;</B
 >
-	    </TT
+          </TT
 >
-	  </TD
+        </TD
 ></TR
 ><TR
 ><TD
->	    <TT
-CLASS="COMPUTEROUTPUT"
->	      <TT
-CLASS="PROMPT"
+>&#13;          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-	      <B
-CLASS="COMMAND"
+
+            <B
+CLASS="command"
 >select * from db;</B
 >
-	    </TT
+          </TT
 >
-	  </TD
+        </TD
 ></TR
 ></TBODY
 ></TABLE
@@ -2136,8 +1717,8 @@ CLASS="COMMAND"
 >
       </P
 ><P
->	To fix the gaping holes:
-	<P
+>To fix the gaping holes: 
+      <P
 ></P
 ><TABLE
 BORDER="0"
@@ -2148,11 +1729,12 @@ BORDER="0"
 ></TR
 ><TR
 ><TD
->UPDATE user SET Password=PASSWORD('new_password') WHERE user='root';</TD
+>UPDATE user SET Password=PASSWORD('new_password') WHERE
+        user='root';</TD
 ></TR
 ><TR
 ><TD
-> FLUSH PRIVILEGES;</TD
+>FLUSH PRIVILEGES;</TD
 ></TR
 ></TBODY
 ></TABLE
@@ -2161,8 +1743,8 @@ BORDER="0"
 >
       </P
 ><P
->	If you're not running "mit-pthreads" you can use:
-	<P
+>If you're not running "mit-pthreads" you can use: 
+      <P
 ></P
 ><TABLE
 BORDER="0"
@@ -2190,10 +1772,10 @@ BORDER="0"
 >
       </P
 ><P
->	With "mit-pthreads" you'll need to modify the "globals.pl" Mysql-&#62;Connect
-	line to specify a specific host name instead of "localhost", and accept
-	external connections:
-	<P
+>With "mit-pthreads" you'll need to modify the "globals.pl"
+      Mysql-&#62;Connect line to specify a specific host name instead of
+      "localhost", and accept external connections: 
+      <P
 ></P
 ><TABLE
 BORDER="0"
@@ -2221,67 +1803,70 @@ BORDER="0"
 >
       </P
 ><P
->	Use .htaccess files with the Apache webserver to secure your
-	bugzilla install. See <A
-HREF="geninstall.html#HTACCESS"
->.htaccess files and security</A
->
-      </P
-><P
->	Consider also:
-	<P
+>Consider also: 
+      <P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->	      Turning off external networking with "--skip-networking",
-	      unless you have "mit-pthreads", in which case you can't.
-	      Without networking, MySQL connects with a Unix domain socket.
-	    </P
+>Turning off external networking with "--skip-networking",
+          unless you have "mit-pthreads", in which case you can't. Without
+          networking, MySQL connects with a Unix domain socket.</P
 ></LI
 ><LI
 ><P
->	      using the --user= option to mysqld to run it as an unprivileged
-	      user.
-	    </P
+>using the --user= option to mysqld to run it as an
+          unprivileged user.</P
 ></LI
 ><LI
 ><P
->	      starting MySQL in a chroot jail
-	    </P
+>running MySQL in a chroot jail</P
 ></LI
 ><LI
 ><P
->	      running the httpd in a "chrooted" jail
-	    </P
+>running the httpd in a chroot jail</P
 ></LI
 ><LI
 ><P
->	      making sure the MySQL passwords are different from the OS
-	      passwords (MySQL "root" has nothing to do with system "root").
-	    </P
+>making sure the MySQL passwords are different from the OS
+          passwords (MySQL "root" has nothing to do with system
+          "root").</P
 ></LI
 ><LI
 ><P
->	      running MySQL on a separate untrusted machine
-	    </P
+>running MySQL on a separate untrusted machine</P
 ></LI
 ><LI
 ><P
->	      making backups ;-)
-	    </P
+>making backups ;-)</P
 ></LI
 ></OL
 >
       </P
 ></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="AEN839">4.1.11. Configuring Bugzilla</H2
+><P
+>&#13;      You should run through the parameters on the Edit Parameters page
+      (link in the footer) and set them all to appropriate values. 
+      They key parameters are documented in <A
+HREF="parameters.html"
+>Section 5.1</A
+>.
+      </P
+></DIV
 ></DIV
 ><DIV
 CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -2292,7 +1877,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="errata.html"
+HREF="installation.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -2301,6 +1887,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -2308,7 +1895,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="osx.html"
+HREF="extraconfig.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -2317,23 +1905,24 @@ HREF="osx.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->ERRATA</TD
+>Installation</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
 VALIGN="top"
 ><A
 HREF="installation.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->Mac OS X Installation Notes</TD
+>Optional Additional Configuration</TD
 ></TR
 ></TABLE
 ></DIV
 ></BODY
 ></HTML
->
+>
\ No newline at end of file
diff --git a/docs/html/tinderbox.html b/docs/html/tinderbox.html
deleted file mode 100644
index 239548421..000000000
--- a/docs/html/tinderbox.html
+++ /dev/null
@@ -1,138 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->Tinderbox/Tinderbox2</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="Integrating Bugzilla with Third-Party Tools"
-HREF="integration.html"><LINK
-REL="PREVIOUS"
-TITLE="Perforce SCM"
-HREF="scm.html"><LINK
-REL="NEXT"
-TITLE="The Future of Bugzilla"
-HREF="future.html"></HEAD
-><BODY
-CLASS="SECTION"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="scm.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Chapter 5. Integrating Bugzilla with Third-Party Tools</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="future.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECTION"
-><H1
-CLASS="SECTION"
-><A
-NAME="TINDERBOX"
->5.4. Tinderbox/Tinderbox2</A
-></H1
-><P
->We need Tinderbox integration information.</P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="scm.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="future.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->Perforce SCM</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="integration.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->The Future of Bugzilla</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/translations.html b/docs/html/translations.html
deleted file mode 100644
index bc3fa8890..000000000
--- a/docs/html/translations.html
+++ /dev/null
@@ -1,150 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->Translations</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="About This Guide"
-HREF="about.html"><LINK
-REL="PREVIOUS"
-TITLE="Feedback"
-HREF="feedback.html"><LINK
-REL="NEXT"
-TITLE="Document Conventions"
-HREF="conventions.html"></HEAD
-><BODY
-CLASS="SECTION"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="feedback.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Chapter 1. About This Guide</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="conventions.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECTION"
-><H1
-CLASS="SECTION"
-><A
-NAME="TRANSLATIONS"
->1.8. Translations</A
-></H1
-><P
->      The Bugzilla Guide needs translators! Please volunteer your
-      translation into the language of your choice. If you will
-      translate this Guide, please notify the members of the
-      mozilla-webtools mailing list at
-      <TT
-CLASS="EMAIL"
->&#60;<A
-HREF="mailto:mozilla-webtools@mozilla.org"
->mozilla-webtools@mozilla.org</A
->&#62;</TT
->, and arrange with
-      Matt Barnson to check it into CVS.
-    </P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="feedback.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="conventions.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->Feedback</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="about.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->Document Conventions</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/troubleshooting.html b/docs/html/troubleshooting.html
new file mode 100644
index 000000000..7a4a32d7d
--- /dev/null
+++ b/docs/html/troubleshooting.html
@@ -0,0 +1,309 @@
+<HTML
+><HEAD
+><TITLE
+>Troubleshooting</TITLE
+><META
+NAME="GENERATOR"
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
+"><LINK
+REL="HOME"
+TITLE="The Bugzilla Guide"
+HREF="index.html"><LINK
+REL="UP"
+TITLE="Installation"
+HREF="installation.html"><LINK
+REL="PREVIOUS"
+TITLE="Mac OS X Installation Notes"
+HREF="osx.html"><LINK
+REL="NEXT"
+TITLE="Administering Bugzilla"
+HREF="administration.html"></HEAD
+><BODY
+CLASS="section"
+BGCOLOR="#FFFFFF"
+TEXT="#000000"
+LINK="#0000FF"
+VLINK="#840084"
+ALINK="#0000FF"
+><DIV
+CLASS="NAVHEADER"
+><TABLE
+SUMMARY="Header navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TH
+COLSPAN="3"
+ALIGN="center"
+>The Bugzilla Guide</TH
+></TR
+><TR
+><TD
+WIDTH="10%"
+ALIGN="left"
+VALIGN="bottom"
+><A
+HREF="osx.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="80%"
+ALIGN="center"
+VALIGN="bottom"
+>Chapter 4. Installation</TD
+><TD
+WIDTH="10%"
+ALIGN="right"
+VALIGN="bottom"
+><A
+HREF="administration.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+></TABLE
+><HR
+ALIGN="LEFT"
+WIDTH="100%"></DIV
+><DIV
+CLASS="section"
+><H1
+CLASS="section"
+><A
+NAME="troubleshooting">4.5. Troubleshooting</H1
+><P
+>This section gives solutions to common Bugzilla installation
+    problems.
+    </P
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="AEN1218">4.5.1. Bundle::Bugzilla makes me upgrade to Perl 5.6.1</H2
+><P
+>&#13;      Try executing <B
+CLASS="command"
+>perl -MCPAN -e 'install CPAN'</B
+>
+      and then continuing.
+      </P
+><P
+>&#13;      Certain older versions of the CPAN toolset were somewhat naive about how
+      to upgrade Perl modules. When a couple of modules got rolled into the core
+      Perl distribution for 5.6.1, CPAN thought that the best way to get those
+      modules up to date was to haul down the Perl distribution itself and
+      build it. Needless to say, this has caused headaches for just about
+      everybody. Upgrading to a newer version of CPAN with the
+      commandline above should fix things.
+      </P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="AEN1223">4.5.2. DBD::Sponge::db prepare failed</H2
+><P
+>&#13;        The following error message may appear due to a bug in DBD::mysql
+        (over which the Bugzilla team have no control):
+      </P
+><TABLE
+BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
+><TR
+><TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+> DBD::Sponge::db prepare failed: Cannot determine NUM_OF_FIELDS at D:/Perl/site/lib/DBD/mysql.pm line 248.
+  SV = NULL(0x0) at 0x20fc444
+  REFCNT = 1
+  FLAGS = (PADBUSY,PADMY)
+</PRE
+></FONT
+></TD
+></TR
+></TABLE
+><P
+>&#13;        To fix this, go to 
+        <TT
+CLASS="filename"
+>&#60;path-to-perl&#62;/lib/DBD/sponge.pm</TT
+> 
+        in your Perl installation and replace
+      </P
+><TABLE
+BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
+><TR
+><TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+> my $numFields;
+ if ($attribs-&#62;{'NUM_OF_FIELDS'}) {
+     $numFields = $attribs-&#62;{'NUM_OF_FIELDS'};
+ } elsif ($attribs-&#62;{'NAME'}) {
+     $numFields = @{$attribs-&#62;{NAME}};
+</PRE
+></FONT
+></TD
+></TR
+></TABLE
+><P
+>&#13;        by
+      </P
+><TABLE
+BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
+><TR
+><TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+> my $numFields;
+ if ($attribs-&#62;{'NUM_OF_FIELDS'}) {
+     $numFields = $attribs-&#62;{'NUM_OF_FIELDS'};
+ } elsif ($attribs-&#62;{'NAMES'}) {
+     $numFields = @{$attribs-&#62;{NAMES}};
+</PRE
+></FONT
+></TD
+></TR
+></TABLE
+><P
+>&#13;        (note the S added to NAME.)      
+      </P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="paranoid-security">4.5.3. cannot chdir(/var/spool/mqueue)</H2
+><P
+>If you are installing Bugzilla on SuSE Linux, or some other
+      distributions with 
+      <SPAN
+CLASS="QUOTE"
+>"paranoid"</SPAN
+>
+      security options, it is possible that the checksetup.pl script may fail
+      with the error: 
+<TABLE
+BORDER="0"
+BGCOLOR="#E0E0E0"
+WIDTH="100%"
+><TR
+><TD
+><FONT
+COLOR="#000000"
+><PRE
+CLASS="programlisting"
+>cannot chdir(/var/spool/mqueue): Permission denied
+</PRE
+></FONT
+></TD
+></TR
+></TABLE
+>
+      </P
+><P
+>&#13;      This is because your 
+      <TT
+CLASS="filename"
+>/var/spool/mqueue</TT
+>
+      directory has a mode of 
+      <SPAN
+CLASS="QUOTE"
+>"drwx------"</SPAN
+>. Type 
+      <B
+CLASS="command"
+>chmod 755 
+      <TT
+CLASS="filename"
+>/var/spool/mqueue</TT
+>
+      </B
+>
+      as root to fix this problem.
+      </P
+></DIV
+></DIV
+><DIV
+CLASS="NAVFOOTER"
+><HR
+ALIGN="LEFT"
+WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+><A
+HREF="osx.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="index.html"
+ACCESSKEY="H"
+>Home</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+><A
+HREF="administration.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+>Mac OS X Installation Notes</TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="installation.html"
+ACCESSKEY="U"
+>Up</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+>Administering Bugzilla</TD
+></TR
+></TABLE
+></DIV
+></BODY
+></HTML
+>
\ No newline at end of file
diff --git a/docs/html/upgrading.html b/docs/html/upgrading.html
new file mode 100644
index 000000000..445154030
--- /dev/null
+++ b/docs/html/upgrading.html
@@ -0,0 +1,178 @@
+<HTML
+><HEAD
+><TITLE
+>Upgrading to New Releases</TITLE
+><META
+NAME="GENERATOR"
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
+"><LINK
+REL="HOME"
+TITLE="The Bugzilla Guide"
+HREF="index.html"><LINK
+REL="UP"
+TITLE="Administering Bugzilla"
+HREF="administration.html"><LINK
+REL="PREVIOUS"
+TITLE="Template Customisation"
+HREF="cust-templates.html"><LINK
+REL="NEXT"
+TITLE="Integrating Bugzilla with Third-Party Tools"
+HREF="integration.html"></HEAD
+><BODY
+CLASS="section"
+BGCOLOR="#FFFFFF"
+TEXT="#000000"
+LINK="#0000FF"
+VLINK="#840084"
+ALINK="#0000FF"
+><DIV
+CLASS="NAVHEADER"
+><TABLE
+SUMMARY="Header navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TH
+COLSPAN="3"
+ALIGN="center"
+>The Bugzilla Guide</TH
+></TR
+><TR
+><TD
+WIDTH="10%"
+ALIGN="left"
+VALIGN="bottom"
+><A
+HREF="cust-templates.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="80%"
+ALIGN="center"
+VALIGN="bottom"
+>Chapter 5. Administering Bugzilla</TD
+><TD
+WIDTH="10%"
+ALIGN="right"
+VALIGN="bottom"
+><A
+HREF="integration.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+></TABLE
+><HR
+ALIGN="LEFT"
+WIDTH="100%"></DIV
+><DIV
+CLASS="section"
+><H1
+CLASS="section"
+><A
+NAME="upgrading">5.8. Upgrading to New Releases</H1
+><P
+>A plain Bugzilla is fairly easy to upgrade from one version to a
+    newer one. Always read the release notes to see if there are any issues
+    that you might need to take note of. It is recommended that you take a 
+    backup of your database and your entire Bugzilla installation before attempting an
+    upgrade. You can upgrade a 'clean' installation by untarring a new
+    tarball over the old installation. If you are upgrading from 2.12 or
+    later, and have cvs installed, you can type <TT
+CLASS="filename"
+>cvs -z3 update</TT
+>, 
+    and resolve conflicts if there are any.
+    </P
+><P
+>However, things get a bit more complicated if you've made
+    changes to Bugzilla's code. In this case, you may have to re-make or
+    reapply those changes. One good method is to take a diff of your customised
+    version against the original, so you can survey all that you've changed.
+    Hopefully, templatisation will reduce the need for
+    this in the future.</P
+><P
+>From version 2.8 onwards, Bugzilla databases can be automatically
+    carried forward during an upgrade. However, because the developers of
+    Bugzilla are constantly adding new
+    tables, columns and fields, you'll probably get SQL errors if you just
+    update the code and attempt to use Bugzilla. Always run the
+    <TT
+CLASS="filename"
+>checksetup.pl</TT
+> 
+    script whenever you upgrade your installation.</P
+><P
+>If you are running Bugzilla version 2.8 or lower, and wish to
+    upgrade to the latest version, please consult the file,
+    "UPGRADING-pre-2.8" in the Bugzilla root directory after untarring the
+    archive.</P
+></DIV
+><DIV
+CLASS="NAVFOOTER"
+><HR
+ALIGN="LEFT"
+WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+><A
+HREF="cust-templates.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="index.html"
+ACCESSKEY="H"
+>Home</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+><A
+HREF="integration.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+>Template Customisation</TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="administration.html"
+ACCESSKEY="U"
+>Up</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+>Integrating Bugzilla with Third-Party Tools</TD
+></TR
+></TABLE
+></DIV
+></BODY
+></HTML
+>
\ No newline at end of file
diff --git a/docs/html/useradmin.html b/docs/html/useradmin.html
index a57ed8bbb..00893687e 100644
--- a/docs/html/useradmin.html
+++ b/docs/html/useradmin.html
@@ -4,7 +4,7 @@
 >User Administration</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -13,14 +13,13 @@ REL="UP"
 TITLE="Administering Bugzilla"
 HREF="administration.html"><LINK
 REL="PREVIOUS"
-TITLE="Post-Installation Checklist"
-HREF="postinstall-check.html"><LINK
+TITLE="Bugzilla Configuration"
+HREF="parameters.html"><LINK
 REL="NEXT"
-TITLE="Product, Component, Milestone, and Version
-      Administration"
+TITLE="Product, Component, Milestone, and Version Administration"
 HREF="programadmin.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -29,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -45,20 +45,22 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="postinstall-check.html"
+HREF="parameters.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Chapter 4. Administering Bugzilla</TD
+>Chapter 5. Administering Bugzilla</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
 HREF="programadmin.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -67,40 +69,29 @@ HREF="programadmin.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="USERADMIN"
->4.2. User Administration</A
-></H1
-><P
->      User administration is one of the easiest parts of Bugzilla.
-      Keeping it from getting out of hand, however, can become a
-      challenge.
-    </P
+NAME="useradmin">5.2. User Administration</H1
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="DEFAULTUSER"
->4.2.1. Creating the Default User</A
-></H2
-><P
->	When you first run checksetup.pl after installing Bugzilla, it
-	will prompt you for the administrative username (email
-	address) and password for this "super user". If for some
-	reason you were to delete the "super user" account, re-running
-	checksetup.pl will again prompt you for this username and
-	password.
-      </P
+NAME="defaultuser">5.2.1. Creating the Default User</H2
+><P
+>When you first run checksetup.pl after installing Bugzilla, it
+      will prompt you for the administrative username (email address) and
+      password for this "super user". If for some reason you delete
+      the "super user" account, re-running checksetup.pl will again prompt
+      you for this username and password.</P
 ><DIV
-CLASS="TIP"
+CLASS="tip"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
+CLASS="tip"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -116,178 +107,103 @@ ALT="Tip"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->       If you wish to add more administrative users, you must use the
-	  MySQL interface. Run "mysql" from the command line, and use
-	  these commands ("mysql&#62;" denotes the  mysql prompt, not
-	  something you should type in):
-	  <B
-CLASS="COMMAND"
-><TT
-CLASS="PROMPT"
+>If you wish to add more administrative users, you must use the
+        MySQL interface. Run "mysql" from the command line, and use these
+        commands: 
+        <P
+></P
+><TABLE
+BORDER="0"
+><TBODY
+><TR
+><TD
+>&#13;            <TT
+CLASS="prompt"
 >mysql&#62;</TT
-> use bugs;</B
 >
-	  <B
-CLASS="COMMAND"
-><TT
-CLASS="PROMPT"
+            <B
+CLASS="command"
+>use bugs;</B
+>
+          </TD
+></TR
+><TR
+><TD
+>&#13;            <TT
+CLASS="prompt"
 >mysql&#62;</TT
-> update profiles set
-	    groupset=0x7ffffffffffffff where login_name = "(user's
-	    login name)"; </B
 >
-	</P
+
+            <B
+CLASS="command"
+>&#13;              update profiles set groupset=0x7ffffffffffffff where login_name =
+              "(user's login name)";
+            </B
+>
+          </TD
+></TR
+></TBODY
+></TABLE
+><P
+></P
+>
+        </P
 ><P
->Yes, that is <EM
+>Yes, that is 
+        <EM
 >fourteen</EM
 >
-	  <SPAN
+
+        <SPAN
 CLASS="QUOTE"
 >"f"</SPAN
->'s.  A whole lot of f-ing going on if you
-	  want to create a new administator.</P
+>
+
+        's. A whole lot of f-ing going on if you want to create a new
+        administator.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="MANAGEUSERS"
->4.2.2. Managing Other Users</A
-></H2
+NAME="manageusers">5.2.2. Managing Other Users</H2
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H3
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="LOGIN"
->4.2.2.1. Logging In</A
-></H3
-><P
-></P
-><OL
-TYPE="1"
-><LI
+NAME="createnewusers">5.2.2.1. Creating new users</H3
 ><P
->	      Open the index.html page for your Bugzilla installation
-	      in your browser window.
-	    </P
-></LI
-><LI
-><P
->	      Click the "Query Existing Bug Reports" link.
-	    </P
-></LI
-><LI
-><P
->	      Click the "Log In" link at the foot of the page.
-	    </P
-></LI
-><LI
-><P
->	      Type your email address, and the password which was
-	      emailed to you when you created your Bugzilla account,
-	      into the spaces provided.
-	    </P
-></LI
-></OL
-><P
->Congratulations, you are logged in!</P
-></DIV
-><DIV
-CLASS="SECTION"
-><H3
-CLASS="SECTION"
-><A
-NAME="CREATENEWUSERS"
->4.2.2.2. Creating new users</A
-></H3
-><P
->	  Your users can create their own user accounts by clicking
-	  the "New Account" link at the bottom of each page. However,
-	  should you desire to create user accounts ahead of time,
-	  here is how you do it.
-	</P
+>Your users can create their own user accounts by clicking the
+        "New Account" link at the bottom of each page (assuming they
+        aren't logged in as someone else already.) However, should you
+        desire to create user accounts ahead of time, here is how you do
+        it.</P
 ><P
 ></P
 ><OL
 TYPE="1"
 ><LI
 ><P
->	      After logging in, click the "Users" link at the footer
-	      of the query page.
-	    </P
+>After logging in, click the "Users" link at the footer of
+            the query page, and then click "Add a new user".</P
 ></LI
 ><LI
 ><P
->	      To see a specific user, type a portion of their login
-	      name in the box provided and click "submit". To see all
-	      users, simply click the "submit" button. You must click
-	      "submit" here to be able to add a new user.
-	    </P
+>Fill out the form presented. This page is self-explanatory.
+            When done, click "Submit".</P
 ><DIV
-CLASS="TIP"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
-WIDTH="90%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/tip.gif"
-HSPACE="5"
-ALT="Tip"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->		More functionality is available via the list on the
-		right-hand side of the text entry box. You can match
-		what you type as a case-insensitive substring (the
-		default) of all users on your system, a case-sensitive
-		regular expression (please see the <B
-CLASS="COMMAND"
->man
-		  regexp</B
-> manual page for details on regular
-		expression syntax), or a <EM
->reverse</EM
->
-		regular expression match, where every user name which
-		does NOT match the regular expression is selected.
-	      </P
-></TD
-></TR
-></TABLE
-></DIV
-></LI
-><LI
-><P
->	      Click the "Add New User" link at the bottom of the user
-	      list
-	    </P
-></LI
-><LI
-><P
->	      Fill out the form presented.  This page is
-	      self-explanatory.  When done, click "submit".
-	    </P
-><DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="90%"
+CLASS="note"
+WIDTH="100%"
 BORDER="0"
 ><TR
 ><TD
@@ -302,22 +218,24 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->		Adding a user this way will <EM
+>Adding a user this way will 
+              <EM
 >not</EM
 >
-		send an email informing them of their username and
-		password. While useful for creating dummy accounts
-		(watchers which shuttle mail to another system, for
-		instance, or email addresses which are a mailing
-		list), in general it is preferable to log out and use
-		the <SPAN
+
+              send an email informing them of their username and password.
+              While useful for creating dummy accounts (watchers which
+              shuttle mail to another system, for instance, or email
+              addresses which are a mailing list), in general it is
+              preferable to log out and use the 
+              <SPAN
 CLASS="QUOTE"
 >"New Account"</SPAN
-> button to create users,
-		as it will pre-populate all the required fields and
-		also notify  the user of her account name and
-		password.
-	      </P
+>
+
+              button to create users, as it will pre-populate all the
+              required fields and also notify the user of her account name
+              and password.</P
 ></TD
 ></TR
 ></TABLE
@@ -326,215 +244,83 @@ CLASS="QUOTE"
 ></OL
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H3
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="DISABLEUSERS"
->4.2.2.3. Disabling Users</A
-></H3
-><P
->	  I bet you noticed that big "Disabled Text" entry box
-	  available from the "Add New User" screen, when you edit an
-	  account? By entering any text in this box and selecting
-	  "submit", you have prevented the user from using Bugzilla
-	  via the web interface. Your explanation, written in this
-	  text box, will be presented to the user the next time she
-	  attempts to use the system.
-	  <DIV
-CLASS="WARNING"
+NAME="modifyusers">5.2.2.2. Modifying Users</H3
 ><P
-></P
-><TABLE
-CLASS="WARNING"
-WIDTH="100%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/warning.gif"
-HSPACE="5"
-ALT="Warning"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->	      Don't disable your own administrative account, or you
-	      will hate life!
-	    </P
+>To see a specific user, search for their login name
+        in the box provided on the "Edit Users" page. To see all users, 
+        leave the box blank.</P
 ><P
->At this time, <SPAN
-CLASS="QUOTE"
->"Disabled Text"</SPAN
-> does not
-	      prevent a user from using the email interface.  If you
-	      have the email interface enabled, they can still
-	      continue to submit bugs and comments that way.  We need
-	      a patch to fix this.</P
-></TD
-></TR
-></TABLE
-></DIV
+>You can search in different ways the listbox to the right
+        of the text entry box. You can match by 
+        case-insensitive substring (the default),
+        regular expression, or a 
+        <EM
+>reverse</EM
 >
-	</P
-></DIV
-><DIV
-CLASS="SECTION"
-><H3
-CLASS="SECTION"
-><A
-NAME="MODIFYUSERS"
->4.2.2.4. Modifying Users</A
-></H3
+        regular expression match, which finds every user name which does NOT
+        match the regular expression. (Please see
+        the <B
+CLASS="command"
+>man regexp</B
+>
+        manual page for details on regular expression syntax.)
+        </P
 ><P
->	  Here I will attempt to describe the function of each option
-	  on the Edit User screen.
-	</P
+>Once you have found your user, you can change the following
+        fields:</P
 ><P
 ></P
 ><UL
 ><LI
 ><P
->	      <EM
+>&#13;            <EM
 >Login Name</EM
->: This is generally the
-	      user's email address. However, if you have edited your
-	      system parameters, this may just be the user's login
-	      name or some other identifier.
-	      <DIV
-CLASS="TIP"
-><P
-></P
-><TABLE
-CLASS="TIP"
-WIDTH="90%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/tip.gif"
-HSPACE="5"
-ALT="Tip"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->		  For compatability reasons, you should probably stick
-		  with email addresses as user login names.  It will
-		  make your life easier.
-		</P
-></TD
-></TR
-></TABLE
-></DIV
->
-	    </P
+>: 
+            This is generally the user's full email address. However, if you
+            have are using the emailsuffix Param, this may just be the user's
+            login name. Note that users can now change their login names
+            themselves (to any valid email address.)
+            </P
 ></LI
 ><LI
 ><P
->	      <EM
+>&#13;            <EM
 >Real Name</EM
->: Duh!
-	    </P
+>: The user's real name. Note that
+            Bugzilla does not require this to create an account.</P
 ></LI
 ><LI
 ><P
->	      <EM
+>&#13;            <EM
 >Password</EM
->:  You can change the user
-	      password here.  It is normal to only see asterisks.
-	    </P
-></LI
-><LI
-><P
->	      <EM
->Email Notification</EM
->: You may choose
-	      from one of three options:
-	      <P
-></P
-><OL
-TYPE="1"
-><LI
-><P
->		    All qualifying bugs except those which I change:
-		    The user will be notified of any change to any bug
-		    for which she is the reporter, assignee, QA
-		    Contact, CC recipient, or "watcher".
-		  </P
-></LI
-><LI
-><P
->		    Only those bugs which I am listed on the CC line:
-		    The user will not be notified of changes to bugs
-		    where she is the assignee, reporter, or QA
-		    Contact, but will receive them if she is on the CC
-		    list.
-		    <DIV
-CLASS="NOTE"
-><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="90%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
-><P
->			She will still receive whining cron emails if
-			you set up the "whinemail" feature.
-		      </P
-></TD
-></TR
-></TABLE
-></DIV
->
-		  </P
+>: 
+            You can change the user's password here. Users can automatically
+            request a new password, so you shouldn't need to do this often.
+            If you want to disable an account, see Disable Text below.
+            </P
 ></LI
 ><LI
 ><P
->		    <EM
->All Qualifying Bugs</EM
->: This
-		    user is a glutton for punishment. If her name is
-		    in the reporter, QA Contact, CC, assignee, or is a
-		    "watcher", she will get email updates regarding
-		    the bug.
-		  </P
-></LI
-></OL
-></P
-><P
->	      <EM
+>&#13;            <EM
 >Disable Text</EM
->: If you type anything
-	      in this box, including just a space, the user account is
-	      disabled from making any changes to bugs via the web
-	      interface, and what you type in this box is presented as
-	      the reason.
-	      <DIV
-CLASS="WARNING"
+>: 
+            If you type anything in this box, including just a space, the
+            user is prevented from logging in, or making any changes to 
+            bugs via the web interface. 
+            The HTML you type in this box is presented to the user when
+            they attempt to perform these actions, and should explain
+            why the account was disabled.
+            <DIV
+CLASS="warning"
 ><P
 ></P
 ><TABLE
-CLASS="WARNING"
-WIDTH="90%"
+CLASS="warning"
+WIDTH="100%"
 BORDER="0"
 ><TR
 ><TD
@@ -555,13 +341,14 @@ VALIGN="TOP"
 ></TABLE
 ></DIV
 >
-	      <DIV
-CLASS="NOTE"
+
+            <DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
-WIDTH="90%"
+CLASS="note"
+WIDTH="100%"
 BORDER="0"
 ><TR
 ><TD
@@ -576,143 +363,110 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->		  As of this writing, the user can still submit bugs
-		  via the e-mail gateway, if you set it up, despite
-		  the disabled text field.  The e-mail gateway should
-		  <EM
+>The user can still submit bugs via
+              the e-mail gateway, if you set it up, even if the disabled text
+              field is filled in. The e-mail gateway should 
+              <EM
 >not</EM
-> be enabled for secure
-		  installations of Bugzilla.
-		</P
+>
+              be enabled for secure installations of Bugzilla.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 >
-	    </P
+            </P
 ></LI
 ><LI
 ><P
->	      <EM
->CanConfirm</EM
->: This field is only used
-	      if you have enabled "unconfirmed" status in your
-	      parameters screen.  If you enable this for a user, that
-	      user can then move bugs from "Unconfirmed" to
-	      "Confirmed" status (e.g.: "New" status). Be judicious
-	      about allowing users to turn this bit on for other
-	      users.
-	    </P
+>&#13;            <EM
+>&#60;groupname&#62;</EM
+>: 
+            If you have created some groups, e.g. "securitysensitive", then
+            checkboxes will appear here to allow you to add users to, or
+            remove them from, these groups.
+            </P
 ></LI
 ><LI
 ><P
->	      <EM
->Creategroups</EM
->: This option will
-	      allow a user to create and destroy groups in Bugzilla.
-	      Unless you are using the Bugzilla GroupSentry security
-	      option "usebuggroupsentry" in your parameters, this
-	      setting has no effect.
-	    </P
+>&#13;            <EM
+>canconfirm</EM
+>: 
+            This field is only used if you have enabled the "unconfirmed"
+            status. If you enable this for a user,
+            that user can then move bugs from "Unconfirmed" to a "Confirmed"
+            status (e.g.: "New" status).</P
 ></LI
 ><LI
 ><P
->	      <EM
->Editbugs</EM
->: Unless a user has this
-	      bit set, they can only edit those bugs for which they
-	      are the assignee or the reporter.  
-	      <DIV
-CLASS="NOTE"
+>&#13;            <EM
+>creategroups</EM
+>: 
+            This option will allow a user to create and destroy groups in
+            Bugzilla.</P
+></LI
+><LI
 ><P
-></P
-><TABLE
-CLASS="NOTE"
-WIDTH="90%"
-BORDER="0"
-><TR
-><TD
-WIDTH="25"
-ALIGN="CENTER"
-VALIGN="TOP"
-><IMG
-SRC="../images/note.gif"
-HSPACE="5"
-ALT="Note"></TD
-><TD
-ALIGN="LEFT"
-VALIGN="TOP"
+>&#13;            <EM
+>editbugs</EM
+>: 
+            Unless a user has this bit set, they can only edit those bugs
+            for which they are the assignee or the reporter. Even if this
+            option is unchecked, users can still add comments to bugs.
+            </P
+></LI
+><LI
 ><P
->		  Leaving this option unchecked does not prevent users
-		  from adding comments to a bug!  They simply cannot
-		  change a bug priority, severity, etc. unless they
-		  are the assignee or reporter.
-		</P
-></TD
-></TR
-></TABLE
-></DIV
->
-	    </P
+>&#13;            <EM
+>editcomponents</EM
+>: 
+            This flag allows a user to create new products and components,
+            as well as modify and destroy those that have no bugs associated
+            with them. If a product or component has bugs associated with it,
+            those bugs must be moved to a different product or component
+            before Bugzilla will allow them to be destroyed.
+            </P
 ></LI
 ><LI
 ><P
->	      <EM
->Editcomponents</EM
->: This flag allows a
-	      user to create new  products and components, as well as
-	      modify and destroy those that have no bugs associated
-	      with them.  If a product or component has bugs
-	      associated with it, those bugs must be moved to a
-	      different product or component before Bugzilla will
-	      allow them to be destroyed.  The name of a product or
-	      component can be changed without affecting the
-	      associated bugs, but it tends to annoy the hell out of
-	      your users when these change a lot.
-	    </P
+>&#13;            <EM
+>editkeywords</EM
+>: 
+            If you use Bugzilla's keyword functionality, enabling this
+            feature allows a user to create and destroy keywords. As always,
+            the keywords for existing bugs containing the keyword the user
+            wishes to destroy must be changed before Bugzilla will allow it
+            to die.</P
 ></LI
 ><LI
 ><P
->	      <EM
->Editkeywords</EM
->: If you use Bugzilla's
-	      keyword functionality, enabling this feature allows a
-	      user can create and destroy keywords. As always, the
-	      keywords for existing bugs containing the keyword the
-	      user wishes to destroy must be changed before Bugzilla
-	      will allow it to die. You must be very careful about
-	      creating too many new keywords if you run a very large
-	      Bugzilla installation; keywords are global variables
-	      across products, and you can often run into a phenomenon
-	      called "keyword bloat". This confuses users, and then
-	      the feature goes unused.
-	    </P
+>&#13;            <EM
+>editusers</EM
+>: 
+            This flag allows a user to do what you're doing right now: edit
+            other users. This will allow those with the right to do so to
+            remove administrator privileges from other users or grant them to
+            themselves. Enable with care.</P
 ></LI
 ><LI
 ><P
->	      <EM
->Editusers</EM
->: This flag allows a user
-	      do what you're doing right now: edit other users. This
-	      will allow those with the right to do so to remove
-	      administrator priveleges from other users or grant them
-	      to themselves.  Enable with care.
-	    </P
+>&#13;            <EM
+>tweakparams</EM
+>: 
+            This flag allows a user to change Bugzilla's Params 
+            (using <TT
+CLASS="filename"
+>editparams.cgi</TT
+>.)</P
 ></LI
 ><LI
 ><P
->	      <EM
->PRODUCT</EM
->: PRODUCT bugs access.  This
-	      allows an administrator, with product-level granularity,
-	      to specify in which products a user can edit bugs.  The
-	      user must still have the "editbugs" privelege to edit
-	      bugs in this area; this simply restricts them from even
-	      seeing bugs outside these boundaries if the
-	      administrator has enabled the group sentry parameter
-	      "usebuggroupsentry".  Unless you are using bug groups,
-	      this option has no effect.
-	    </P
+>&#13;            <EM
+>&#60;productname&#62;</EM
+>: 
+            This allows an administrator to specify the products in which 
+            a user can see bugs. The user must still have the 
+            "editbugs" privilege to edit bugs in these products.</P
 ></LI
 ></UL
 ></DIV
@@ -723,6 +477,7 @@ CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -733,7 +488,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="postinstall-check.html"
+HREF="parameters.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -742,6 +498,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -750,6 +507,7 @@ ALIGN="right"
 VALIGN="top"
 ><A
 HREF="programadmin.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -758,21 +516,21 @@ HREF="programadmin.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->Post-Installation Checklist</TD
+>Bugzilla Configuration</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
 VALIGN="top"
 ><A
 HREF="administration.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->Product, Component, Milestone, and Version
-      Administration</TD
+>Product, Component, Milestone, and Version Administration</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/userpreferences.html b/docs/html/userpreferences.html
new file mode 100644
index 000000000..a782877f3
--- /dev/null
+++ b/docs/html/userpreferences.html
@@ -0,0 +1,240 @@
+<HTML
+><HEAD
+><TITLE
+>User Preferences</TITLE
+><META
+NAME="GENERATOR"
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
+"><LINK
+REL="HOME"
+TITLE="The Bugzilla Guide"
+HREF="index.html"><LINK
+REL="UP"
+TITLE="Using Bugzilla"
+HREF="using.html"><LINK
+REL="PREVIOUS"
+TITLE="Hints and Tips"
+HREF="hintsandtips.html"><LINK
+REL="NEXT"
+TITLE="Installation"
+HREF="installation.html"></HEAD
+><BODY
+CLASS="section"
+BGCOLOR="#FFFFFF"
+TEXT="#000000"
+LINK="#0000FF"
+VLINK="#840084"
+ALINK="#0000FF"
+><DIV
+CLASS="NAVHEADER"
+><TABLE
+SUMMARY="Header navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TH
+COLSPAN="3"
+ALIGN="center"
+>The Bugzilla Guide</TH
+></TR
+><TR
+><TD
+WIDTH="10%"
+ALIGN="left"
+VALIGN="bottom"
+><A
+HREF="hintsandtips.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="80%"
+ALIGN="center"
+VALIGN="bottom"
+>Chapter 3. Using Bugzilla</TD
+><TD
+WIDTH="10%"
+ALIGN="right"
+VALIGN="bottom"
+><A
+HREF="installation.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+></TABLE
+><HR
+ALIGN="LEFT"
+WIDTH="100%"></DIV
+><DIV
+CLASS="section"
+><H1
+CLASS="section"
+><A
+NAME="userpreferences">3.3. User Preferences</H1
+><P
+>Once you have logged in, you can customise various aspects of 
+    Bugzilla via the "Edit prefs" link in the page footer.
+    The preferences are split into four tabs:</P
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="accountsettings">3.3.1. Account Settings</H2
+><P
+>On this tab, you can change your basic account information,
+      including your password, email address and real name. For security
+      reasons, in order to change anything on this page you must type your 
+      <EM
+>current</EM
+>
+      password into the 
+      <SPAN
+CLASS="QUOTE"
+>"Password"</SPAN
+>
+      field at the top of the page. 
+      If you attempt to change your email address, a confirmation
+      email is sent to both the old and new addresses, with a link to use to
+      confirm the change. This helps to prevent account hijacking.</P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="emailsettings">3.3.2. Email Settings</H2
+><P
+>On this tab you can reduce or increase the amount of email sent
+      you from Bugzilla, opting in our out depending on your relationship to
+      the bug and the change that was made to it. (Note that you can also do
+      client-side filtering using the X-Bugzilla-Reason header which Bugzilla
+      adds to all bugmail.)</P
+><P
+>By entering user email names, delineated by commas, into the
+      "Users to watch" text entry box you can receive a copy of all the
+      bugmail of other users (security settings permitting.) This powerful
+      functionality enables seamless transitions as developers change
+      projects or users go on holiday.</P
+><DIV
+CLASS="note"
+><P
+></P
+><TABLE
+CLASS="note"
+WIDTH="100%"
+BORDER="0"
+><TR
+><TD
+WIDTH="25"
+ALIGN="CENTER"
+VALIGN="TOP"
+><IMG
+SRC="../images/note.gif"
+HSPACE="5"
+ALT="Note"></TD
+><TD
+ALIGN="LEFT"
+VALIGN="TOP"
+><P
+>The ability to watch other users may not be available in all
+        Bugzilla installations. If you can't see it, ask your 
+        administrator.</P
+></TD
+></TR
+></TABLE
+></DIV
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="footersettings">3.3.3. Page Footer</H2
+><P
+>On the Search page, you can store queries in Bugzilla, so if you
+      regularly run a particular query it is just a drop-down menu away. 
+      Once you have a stored query, you can come
+      here to request that it also be displayed in your page footer.</P
+></DIV
+><DIV
+CLASS="section"
+><H2
+CLASS="section"
+><A
+NAME="permissionsettings">3.3.4. Permissions</H2
+><P
+>This is a purely informative page which outlines your current
+      permissions on this installation of Bugzilla - what product groups you
+      are in, and whether you can edit bugs or perform various administration
+      functions.</P
+></DIV
+></DIV
+><DIV
+CLASS="NAVFOOTER"
+><HR
+ALIGN="LEFT"
+WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+><A
+HREF="hintsandtips.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="index.html"
+ACCESSKEY="H"
+>Home</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+><A
+HREF="installation.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+>Hints and Tips</TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="using.html"
+ACCESSKEY="U"
+>Up</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+>Installation</TD
+></TR
+></TABLE
+></DIV
+></BODY
+></HTML
+>
\ No newline at end of file
diff --git a/docs/html/using.html b/docs/html/using.html
index 51e333451..0d1231589 100644
--- a/docs/html/using.html
+++ b/docs/html/using.html
@@ -4,19 +4,19 @@
 >Using Bugzilla</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
 HREF="index.html"><LINK
 REL="PREVIOUS"
-TITLE="Document Conventions"
-HREF="conventions.html"><LINK
+TITLE="Why Should We Use Bugzilla?"
+HREF="why.html"><LINK
 REL="NEXT"
-TITLE="What is Bugzilla?"
-HREF="whatis.html"></HEAD
+TITLE="How do I use Bugzilla?"
+HREF="how.html"></HEAD
 ><BODY
-CLASS="CHAPTER"
+CLASS="chapter"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -25,6 +25,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -41,7 +42,8 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="conventions.html"
+HREF="why.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -54,7 +56,8 @@ WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="whatis.html"
+HREF="how.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -63,35 +66,10 @@ HREF="whatis.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="CHAPTER"
+CLASS="chapter"
 ><H1
 ><A
-NAME="USING"
->Chapter 2. Using Bugzilla</A
-></H1
-><TABLE
-BORDER="0"
-WIDTH="100%"
-CELLSPACING="0"
-CELLPADDING="0"
-CLASS="EPIGRAPH"
-><TR
-><TD
-WIDTH="45%"
->&nbsp;</TD
-><TD
-WIDTH="45%"
-ALIGN="LEFT"
-VALIGN="TOP"
-><I
-><P
-><I
->What, Why, How, &#38; Where?</I
-></P
-></I
-></TD
-></TR
-></TABLE
+NAME="using">Chapter 3. Using Bugzilla</H1
 ><DIV
 CLASS="TOC"
 ><DL
@@ -100,106 +78,102 @@ CLASS="TOC"
 >Table of Contents</B
 ></DT
 ><DT
->2.1. <A
-HREF="whatis.html"
->What is Bugzilla?</A
-></DT
-><DT
->2.2. <A
-HREF="why.html"
->Why Should We Use Bugzilla?</A
-></DT
-><DT
->2.3. <A
+>3.1. <A
 HREF="how.html"
 >How do I use Bugzilla?</A
 ></DT
 ><DD
 ><DL
 ><DT
->2.3.1. <A
-HREF="how.html#MYACCOUNT"
+>3.1.1. <A
+HREF="how.html#myaccount"
 >Create a Bugzilla Account</A
 ></DT
 ><DT
->2.3.2. <A
-HREF="how.html#QUERY"
->The Bugzilla Query Page</A
+>3.1.2. <A
+HREF="how.html#bug_page"
+>Anatomy of a Bug</A
 ></DT
 ><DT
->2.3.3. <A
-HREF="how.html#BUGREPORTS"
->Creating and Managing Bug Reports</A
+>3.1.3. <A
+HREF="how.html#query"
+>Searching for Bugs</A
 ></DT
-><DD
-><DL
 ><DT
->2.3.3.1. <A
-HREF="how.html#BUG_WRITING"
->Writing a Great Bug Report</A
+>3.1.4. <A
+HREF="how.html#list"
+>Bug Lists</A
 ></DT
 ><DT
->2.3.3.2. <A
-HREF="how.html#BUG_MANAGE"
->Managing your Bug Reports</A
+>3.1.5. <A
+HREF="how.html#bugreports"
+>Filing Bugs</A
 ></DT
 ></DL
 ></DD
-></DL
-></DD
 ><DT
->2.4. <A
-HREF="init4me.html"
->Where can I find my user preferences?</A
+>3.2. <A
+HREF="hintsandtips.html"
+>Hints and Tips</A
 ></DT
 ><DD
 ><DL
 ><DT
->2.4.1. <A
-HREF="init4me.html#ACCOUNTSETTINGS"
->Account Settings</A
+>3.2.1. <A
+HREF="hintsandtips.html#AEN434"
+>Autolinkification</A
 ></DT
 ><DT
->2.4.2. <A
-HREF="init4me.html#EMAILSETTINGS"
->Email Settings</A
+>3.2.2. <A
+HREF="hintsandtips.html#quicksearch"
+>Quicksearch</A
 ></DT
-><DD
-><DL
 ><DT
->2.4.2.1. <A
-HREF="init4me.html#NOTIFICATION"
->Email Notification</A
+>3.2.3. <A
+HREF="hintsandtips.html#commenting"
+>Comments</A
 ></DT
 ><DT
->2.4.2.2. <A
-HREF="init4me.html#NEWEMAILTECH"
->New Email Technology</A
+>3.2.4. <A
+HREF="hintsandtips.html#attachments"
+>Attachments</A
 ></DT
 ><DT
->2.4.2.3. <A
-HREF="init4me.html#WATCHSETTINGS"
->"Watching" Users</A
+>3.2.5. <A
+HREF="hintsandtips.html#AEN463"
+>Filing Bugs</A
 ></DT
 ></DL
 ></DD
 ><DT
->2.4.3. <A
-HREF="init4me.html#FOOTERSETTINGS"
+>3.3. <A
+HREF="userpreferences.html"
+>User Preferences</A
+></DT
+><DD
+><DL
+><DT
+>3.3.1. <A
+HREF="userpreferences.html#accountsettings"
+>Account Settings</A
+></DT
+><DT
+>3.3.2. <A
+HREF="userpreferences.html#emailsettings"
+>Email Settings</A
+></DT
+><DT
+>3.3.3. <A
+HREF="userpreferences.html#footersettings"
 >Page Footer</A
 ></DT
 ><DT
->2.4.4. <A
-HREF="init4me.html#PERMISSIONSETTINGS"
+>3.3.4. <A
+HREF="userpreferences.html#permissionsettings"
 >Permissions</A
 ></DT
 ></DL
 ></DD
-><DT
->2.5. <A
-HREF="usingbz-conc.html"
->Using Bugzilla-Conclusion</A
-></DT
 ></DL
 ></DIV
 ></DIV
@@ -208,6 +182,7 @@ CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -218,7 +193,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="conventions.html"
+HREF="why.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -227,6 +203,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -234,7 +211,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="whatis.html"
+HREF="how.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -243,7 +221,7 @@ HREF="whatis.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->Document Conventions</TD
+>Why Should We Use Bugzilla?</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
@@ -253,7 +231,7 @@ VALIGN="top"
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->What is Bugzilla?</TD
+>How do I use Bugzilla?</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/usingbz-conc.html b/docs/html/usingbz-conc.html
deleted file mode 100644
index ced0648ee..000000000
--- a/docs/html/usingbz-conc.html
+++ /dev/null
@@ -1,146 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->Using Bugzilla-Conclusion</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="Using Bugzilla"
-HREF="using.html"><LINK
-REL="PREVIOUS"
-TITLE="Where can I find my user preferences?"
-HREF="init4me.html"><LINK
-REL="NEXT"
-TITLE="Installation"
-HREF="installation.html"></HEAD
-><BODY
-CLASS="SECTION"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="init4me.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Chapter 2. Using Bugzilla</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="installation.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECTION"
-><H1
-CLASS="SECTION"
-><A
-NAME="USINGBZ-CONC"
->2.5. Using Bugzilla-Conclusion</A
-></H1
-><P
->      Thank you for reading through this portion of the Bugzilla
-      Guide.  I anticipate it may not yet meet the needs of all
-      readers.  If you have additional comments or corrections to
-      make, please submit your contributions to the <A
-HREF="mailto://mozilla-webtools@mozilla.org"
-TARGET="_top"
->mozilla-webtools</A
-> mailing list/newsgroup.  The mailing list is mirrored to the netscape.public.mozilla.webtools newsgroup, and the newsgroup is mirrored to mozilla-webtools@mozilla.org
-    </P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="init4me.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="installation.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->Where can I find my user preferences?</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="using.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->Installation</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/variant_fenris.html b/docs/html/variant-fenris.html
similarity index 68%
rename from docs/html/variant_fenris.html
rename to docs/html/variant-fenris.html
index 3dd120fe0..69be49b6b 100644
--- a/docs/html/variant_fenris.html
+++ b/docs/html/variant-fenris.html
@@ -4,7 +4,7 @@
 >Loki Bugzilla (Fenris)</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -17,9 +17,9 @@ TITLE="Red Hat Bugzilla"
 HREF="rhbugzilla.html"><LINK
 REL="NEXT"
 TITLE="Issuezilla"
-HREF="variant_issuezilla.html"></HEAD
+HREF="variant-issuezilla.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -45,19 +46,21 @@ ALIGN="left"
 VALIGN="bottom"
 ><A
 HREF="rhbugzilla.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Chapter 7. Bugzilla Variants and Competitors</TD
+>Appendix D. Bugzilla Variants and Competitors</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="variant_issuezilla.html"
+HREF="variant-issuezilla.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,25 +69,23 @@ HREF="variant_issuezilla.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="VARIANT_FENRIS"
->7.2. Loki Bugzilla (Fenris)</A
-></H1
+NAME="variant-fenris">D.2. Loki Bugzilla (Fenris)</H1
 ><P
->Fenris can be found at <A
-HREF="http://fenris.lokigames.com/"
-TARGET="_top"
->http://fenris.lokigames.com</A
->.  It is a fork from Bugzilla.</P
+>Fenris was a fork from Bugzilla made by Loki Games; when
+    Loki went into receivership, it died. While Loki's other code lives on,
+    its custodians recommend Bugzilla for future bug-tracker deployments.
+    </P
 ></DIV
 ><DIV
 CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -96,6 +97,7 @@ ALIGN="left"
 VALIGN="top"
 ><A
 HREF="rhbugzilla.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -104,6 +106,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -111,7 +114,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="variant_issuezilla.html"
+HREF="variant-issuezilla.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -127,6 +131,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="variants.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
diff --git a/docs/html/variant-issuezilla.html b/docs/html/variant-issuezilla.html
new file mode 100644
index 000000000..e14cc0794
--- /dev/null
+++ b/docs/html/variant-issuezilla.html
@@ -0,0 +1,150 @@
+<HTML
+><HEAD
+><TITLE
+>Issuezilla</TITLE
+><META
+NAME="GENERATOR"
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
+"><LINK
+REL="HOME"
+TITLE="The Bugzilla Guide"
+HREF="index.html"><LINK
+REL="UP"
+TITLE="Bugzilla Variants and Competitors"
+HREF="variants.html"><LINK
+REL="PREVIOUS"
+TITLE="Loki Bugzilla (Fenris)"
+HREF="variant-fenris.html"><LINK
+REL="NEXT"
+TITLE="Scarab"
+HREF="variant-scarab.html"></HEAD
+><BODY
+CLASS="section"
+BGCOLOR="#FFFFFF"
+TEXT="#000000"
+LINK="#0000FF"
+VLINK="#840084"
+ALINK="#0000FF"
+><DIV
+CLASS="NAVHEADER"
+><TABLE
+SUMMARY="Header navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TH
+COLSPAN="3"
+ALIGN="center"
+>The Bugzilla Guide</TH
+></TR
+><TR
+><TD
+WIDTH="10%"
+ALIGN="left"
+VALIGN="bottom"
+><A
+HREF="variant-fenris.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="80%"
+ALIGN="center"
+VALIGN="bottom"
+>Appendix D. Bugzilla Variants and Competitors</TD
+><TD
+WIDTH="10%"
+ALIGN="right"
+VALIGN="bottom"
+><A
+HREF="variant-scarab.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+></TABLE
+><HR
+ALIGN="LEFT"
+WIDTH="100%"></DIV
+><DIV
+CLASS="section"
+><H1
+CLASS="section"
+><A
+NAME="variant-issuezilla">D.3. Issuezilla</H1
+><P
+>Issuezilla was another fork from Bugzilla, made by collab.net and
+    hosted at tigris.org. It is also dead; the primary focus of bug-tracking 
+    at tigris.org is their Java-based bug-tracker, 
+    <A
+HREF="variant-scarab.html"
+>Scarab</A
+>.</P
+></DIV
+><DIV
+CLASS="NAVFOOTER"
+><HR
+ALIGN="LEFT"
+WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+><A
+HREF="variant-fenris.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="index.html"
+ACCESSKEY="H"
+>Home</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+><A
+HREF="variant-scarab.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+>Loki Bugzilla (Fenris)</TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="variants.html"
+ACCESSKEY="U"
+>Up</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+>Scarab</TD
+></TR
+></TABLE
+></DIV
+></BODY
+></HTML
+>
\ No newline at end of file
diff --git a/docs/html/variant_perforce.html b/docs/html/variant-perforce.html
similarity index 65%
rename from docs/html/variant_perforce.html
rename to docs/html/variant-perforce.html
index 13944a65b..6bcfc5eed 100644
--- a/docs/html/variant_perforce.html
+++ b/docs/html/variant-perforce.html
@@ -4,7 +4,7 @@
 >Perforce SCM</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -14,12 +14,12 @@ TITLE="Bugzilla Variants and Competitors"
 HREF="variants.html"><LINK
 REL="PREVIOUS"
 TITLE="Scarab"
-HREF="variant_scarab.html"><LINK
+HREF="variant-scarab.html"><LINK
 REL="NEXT"
 TITLE="SourceForge"
-HREF="variant_sourceforge.html"></HEAD
+HREF="variant-sourceforge.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -44,20 +45,22 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="variant_scarab.html"
+HREF="variant-scarab.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Chapter 7. Bugzilla Variants and Competitors</TD
+>Appendix D. Bugzilla Variants and Competitors</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="variant_sourceforge.html"
+HREF="variant-sourceforge.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,31 +69,34 @@ HREF="variant_sourceforge.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="VARIANT_PERFORCE"
->7.5. Perforce SCM</A
-></H1
+NAME="variant-perforce">D.5. Perforce SCM</H1
 ><P
->Although Perforce isn't really a bug tracker, it can be used
-      as such through the <SPAN
+>Although Perforce isn't really a bug tracker, it can be used as
+    such through the <SPAN
 CLASS="QUOTE"
 >"jobs"</SPAN
-> functionality.</P
+>
+    functionality.</P
 ><P
-><A
+>URL: 
+    <A
 HREF="http://www.perforce.com/perforce/technotes/note052.html"
 TARGET="_top"
->http://www.perforce.com/perforce/technotes/note052.html</A
->http://www.perforce.com/perforce/technotes/note052.html</P
+>&#13;    http://www.perforce.com/perforce/technotes/note052.html
+    </A
+>
+    </P
 ></DIV
 ><DIV
 CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -101,7 +107,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="variant_scarab.html"
+HREF="variant-scarab.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -110,6 +117,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -117,7 +125,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="variant_sourceforge.html"
+HREF="variant-sourceforge.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -133,6 +142,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="variants.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
diff --git a/docs/html/variant_scarab.html b/docs/html/variant-scarab.html
similarity index 67%
rename from docs/html/variant_scarab.html
rename to docs/html/variant-scarab.html
index 57a085052..14cd54afa 100644
--- a/docs/html/variant_scarab.html
+++ b/docs/html/variant-scarab.html
@@ -4,7 +4,7 @@
 >Scarab</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -14,12 +14,12 @@ TITLE="Bugzilla Variants and Competitors"
 HREF="variants.html"><LINK
 REL="PREVIOUS"
 TITLE="Issuezilla"
-HREF="variant_issuezilla.html"><LINK
+HREF="variant-issuezilla.html"><LINK
 REL="NEXT"
 TITLE="Perforce SCM"
-HREF="variant_perforce.html"></HEAD
+HREF="variant-perforce.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -44,20 +45,22 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="variant_issuezilla.html"
+HREF="variant-issuezilla.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Chapter 7. Bugzilla Variants and Competitors</TD
+>Appendix D. Bugzilla Variants and Competitors</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="variant_perforce.html"
+HREF="variant-perforce.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,31 +69,29 @@ HREF="variant_perforce.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="VARIANT_SCARAB"
->7.4. Scarab</A
-></H1
+NAME="variant-scarab">D.4. Scarab</H1
 ><P
->Scarab is a promising new bug-tracking system built using
-      Java Serlet technology.  As of this writing, no source code has
-      been released as a package, but you can obtain the code from
-      CVS.
-    </P
+>Scarab is a new open source bug-tracking system built using Java
+    Serlet technology. It is currently at version 1.0 beta 8.</P
 ><P
->URL: <A
+>URL: 
+    <A
 HREF="http://scarab.tigris.org/"
 TARGET="_top"
 >http://scarab.tigris.org</A
-></P
+>
+    </P
 ></DIV
 ><DIV
 CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -101,7 +102,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="variant_issuezilla.html"
+HREF="variant-issuezilla.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -110,6 +112,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -117,7 +120,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="variant_perforce.html"
+HREF="variant-perforce.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -133,6 +137,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="variants.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
diff --git a/docs/html/variant_sourceforge.html b/docs/html/variant-sourceforge.html
similarity index 63%
rename from docs/html/variant_sourceforge.html
rename to docs/html/variant-sourceforge.html
index cfbaffb94..1e4891f4a 100644
--- a/docs/html/variant_sourceforge.html
+++ b/docs/html/variant-sourceforge.html
@@ -4,7 +4,7 @@
 >SourceForge</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -14,12 +14,12 @@ TITLE="Bugzilla Variants and Competitors"
 HREF="variants.html"><LINK
 REL="PREVIOUS"
 TITLE="Perforce SCM"
-HREF="variant_perforce.html"><LINK
+HREF="variant-perforce.html"><LINK
 REL="NEXT"
-TITLE="The Bugzilla FAQ"
-HREF="faq.html"></HEAD
+TITLE="Glossary"
+HREF="glossary.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -44,20 +45,22 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="variant_perforce.html"
+HREF="variant-perforce.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Chapter 7. Bugzilla Variants and Competitors</TD
+>Appendix D. Bugzilla Variants and Competitors</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="faq.html"
+HREF="glossary.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,31 +69,30 @@ HREF="faq.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="VARIANT_SOURCEFORGE"
->7.6. SourceForge</A
-></H1
+NAME="variant-sourceforge">D.6. SourceForge</H1
 ><P
->SourceForge is more of a way of coordinating geographically
-      distributed free software and open source projects over the
-      Internet than strictly a bug tracker, but if you're hunting for
-      bug-tracking for your open project, it may be just what the
-      software engineer ordered!</P
+>SourceForge is a way of coordinating geographically
+    distributed free software and open source projects over the Internet.
+    It has a built-in bug tracker, but it's not highly thought of.</P
 ><P
->URL: <A
+>URL: 
+    <A
 HREF="http://www.sourceforge.net"
 TARGET="_top"
->http://www.sourceforge.net</A
-></P
+>&#13;    http://www.sourceforge.net</A
+>
+    </P
 ></DIV
 ><DIV
 CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -101,7 +103,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="variant_perforce.html"
+HREF="variant-perforce.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -110,6 +113,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -117,7 +121,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="faq.html"
+HREF="glossary.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -133,13 +138,14 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="variants.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->The Bugzilla FAQ</TD
+>Glossary</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/variant_issuezilla.html b/docs/html/variant_issuezilla.html
deleted file mode 100644
index 83cf31704..000000000
--- a/docs/html/variant_issuezilla.html
+++ /dev/null
@@ -1,153 +0,0 @@
-<HTML
-><HEAD
-><TITLE
->Issuezilla</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
-"><LINK
-REL="HOME"
-TITLE="The Bugzilla Guide"
-HREF="index.html"><LINK
-REL="UP"
-TITLE="Bugzilla Variants and Competitors"
-HREF="variants.html"><LINK
-REL="PREVIOUS"
-TITLE="Loki Bugzilla (Fenris)"
-HREF="variant_fenris.html"><LINK
-REL="NEXT"
-TITLE="Scarab"
-HREF="variant_scarab.html"></HEAD
-><BODY
-CLASS="SECTION"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="NAVHEADER"
-><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TH
-COLSPAN="3"
-ALIGN="center"
->The Bugzilla Guide</TH
-></TR
-><TR
-><TD
-WIDTH="10%"
-ALIGN="left"
-VALIGN="bottom"
-><A
-HREF="variant_fenris.html"
->Prev</A
-></TD
-><TD
-WIDTH="80%"
-ALIGN="center"
-VALIGN="bottom"
->Chapter 7. Bugzilla Variants and Competitors</TD
-><TD
-WIDTH="10%"
-ALIGN="right"
-VALIGN="bottom"
-><A
-HREF="variant_scarab.html"
->Next</A
-></TD
-></TR
-></TABLE
-><HR
-ALIGN="LEFT"
-WIDTH="100%"></DIV
-><DIV
-CLASS="SECTION"
-><H1
-CLASS="SECTION"
-><A
-NAME="VARIANT_ISSUEZILLA"
->7.3. Issuezilla</A
-></H1
-><P
->Issuezilla is another fork from Bugzilla, and seems nearly
-      as popular as the Red Hat Bugzilla fork.  Some Issuezilla team
-      members are regular contributors to the Bugzilla mailing
-      list/newsgroup.  Issuezilla is not the primary focus of
-      bug-tracking at tigris.org, however.  Their Java-based
-      bug-tracker, <A
-HREF="variant_scarab.html"
->Scarab, a newfangled Java-based issue tracker</A
->, is under heavy development
-      and looks promising!</P
-><P
->URL:  <A
-HREF="http://issuezilla.tigris.org/servlets/ProjectHome"
-TARGET="_top"
->http://issuezilla.tigris.org/servlets/ProjectHome</A
-></P
-></DIV
-><DIV
-CLASS="NAVFOOTER"
-><HR
-ALIGN="LEFT"
-WIDTH="100%"><TABLE
-WIDTH="100%"
-BORDER="0"
-CELLPADDING="0"
-CELLSPACING="0"
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
-><A
-HREF="variant_fenris.html"
->Prev</A
-></TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="index.html"
->Home</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
-><A
-HREF="variant_scarab.html"
->Next</A
-></TD
-></TR
-><TR
-><TD
-WIDTH="33%"
-ALIGN="left"
-VALIGN="top"
->Loki Bugzilla (Fenris)</TD
-><TD
-WIDTH="34%"
-ALIGN="center"
-VALIGN="top"
-><A
-HREF="variants.html"
->Up</A
-></TD
-><TD
-WIDTH="33%"
-ALIGN="right"
-VALIGN="top"
->Scarab</TD
-></TR
-></TABLE
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/docs/html/variants.html b/docs/html/variants.html
index a2405d770..f5bd22fde 100644
--- a/docs/html/variants.html
+++ b/docs/html/variants.html
@@ -4,19 +4,19 @@
 >Bugzilla Variants and Competitors</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
 HREF="index.html"><LINK
 REL="PREVIOUS"
-TITLE="The Future of Bugzilla"
-HREF="future.html"><LINK
+TITLE="Command-line Bugzilla Queries"
+HREF="cmdline.html"><LINK
 REL="NEXT"
 TITLE="Red Hat Bugzilla"
 HREF="rhbugzilla.html"></HEAD
 ><BODY
-CLASS="CHAPTER"
+CLASS="appendix"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -25,6 +25,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -41,7 +42,8 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="future.html"
+HREF="cmdline.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -55,6 +57,7 @@ ALIGN="right"
 VALIGN="bottom"
 ><A
 HREF="rhbugzilla.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -63,12 +66,10 @@ HREF="rhbugzilla.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="CHAPTER"
+CLASS="appendix"
 ><H1
 ><A
-NAME="VARIANTS"
->Chapter 7. Bugzilla Variants and Competitors</A
-></H1
+NAME="variants">Appendix D. Bugzilla Variants and Competitors</H1
 ><DIV
 CLASS="TOC"
 ><DL
@@ -77,52 +78,55 @@ CLASS="TOC"
 >Table of Contents</B
 ></DT
 ><DT
->7.1. <A
+>D.1. <A
 HREF="rhbugzilla.html"
 >Red Hat Bugzilla</A
 ></DT
 ><DT
->7.2. <A
-HREF="variant_fenris.html"
+>D.2. <A
+HREF="variant-fenris.html"
 >Loki Bugzilla (Fenris)</A
 ></DT
 ><DT
->7.3. <A
-HREF="variant_issuezilla.html"
+>D.3. <A
+HREF="variant-issuezilla.html"
 >Issuezilla</A
 ></DT
 ><DT
->7.4. <A
-HREF="variant_scarab.html"
+>D.4. <A
+HREF="variant-scarab.html"
 >Scarab</A
 ></DT
 ><DT
->7.5. <A
-HREF="variant_perforce.html"
+>D.5. <A
+HREF="variant-perforce.html"
 >Perforce SCM</A
 ></DT
 ><DT
->7.6. <A
-HREF="variant_sourceforge.html"
+>D.6. <A
+HREF="variant-sourceforge.html"
 >SourceForge</A
 ></DT
 ></DL
 ></DIV
 ><P
->I created this section to answer questions about Bugzilla
-    competitors and variants, then found a wonderful site which covers
-    an awful lot of what I wanted to discuss.  Rather than quote it in
-    its entirety, I'll simply refer you here: <A
+>I created this section to answer questions about Bugzilla competitors
+  and variants, then found a wonderful site which covers an awful lot of what
+  I wanted to discuss. Rather than quote it in its entirety, I'll simply
+  refer you here: 
+  <A
 HREF="http://linas.org/linux/pm.html"
 TARGET="_top"
->http://linas.org/linux/pm.html</A
-></P
+>&#13;  http://linas.org/linux/pm.html</A
+>
+  </P
 ></DIV
 ><DIV
 CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -133,7 +137,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="future.html"
+HREF="cmdline.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -142,6 +147,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -150,6 +156,7 @@ ALIGN="right"
 VALIGN="top"
 ><A
 HREF="rhbugzilla.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -158,7 +165,7 @@ HREF="rhbugzilla.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->The Future of Bugzilla</TD
+>Command-line Bugzilla Queries</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
diff --git a/docs/html/voting.html b/docs/html/voting.html
new file mode 100644
index 000000000..47b05647f
--- /dev/null
+++ b/docs/html/voting.html
@@ -0,0 +1,195 @@
+<HTML
+><HEAD
+><TITLE
+>Voting</TITLE
+><META
+NAME="GENERATOR"
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
+"><LINK
+REL="HOME"
+TITLE="The Bugzilla Guide"
+HREF="index.html"><LINK
+REL="UP"
+TITLE="Administering Bugzilla"
+HREF="administration.html"><LINK
+REL="PREVIOUS"
+TITLE="Product, Component, Milestone, and Version Administration"
+HREF="programadmin.html"><LINK
+REL="NEXT"
+TITLE="Groups and Group Security"
+HREF="groups.html"></HEAD
+><BODY
+CLASS="section"
+BGCOLOR="#FFFFFF"
+TEXT="#000000"
+LINK="#0000FF"
+VLINK="#840084"
+ALINK="#0000FF"
+><DIV
+CLASS="NAVHEADER"
+><TABLE
+SUMMARY="Header navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TH
+COLSPAN="3"
+ALIGN="center"
+>The Bugzilla Guide</TH
+></TR
+><TR
+><TD
+WIDTH="10%"
+ALIGN="left"
+VALIGN="bottom"
+><A
+HREF="programadmin.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="80%"
+ALIGN="center"
+VALIGN="bottom"
+>Chapter 5. Administering Bugzilla</TD
+><TD
+WIDTH="10%"
+ALIGN="right"
+VALIGN="bottom"
+><A
+HREF="groups.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+></TABLE
+><HR
+ALIGN="LEFT"
+WIDTH="100%"></DIV
+><DIV
+CLASS="section"
+><H1
+CLASS="section"
+><A
+NAME="voting">5.4. Voting</H1
+><P
+>Voting allows users to be given a pot of votes which they can allocate
+    to bugs, to indicate that they'd like them fixed. 
+    This allows developers to gauge
+    user need for a particular enhancement or bugfix. By allowing bugs with
+    a certain number of votes to automatically move from "UNCONFIRMED" to
+    "NEW", users of the bug system can help high-priority bugs garner
+    attention so they don't sit for a long time awaiting triage.</P
+><P
+>To modify Voting settings:</P
+><P
+></P
+><OL
+TYPE="1"
+><LI
+><P
+>Navigate to the "Edit product" screen for the Product you
+        wish to modify</P
+></LI
+><LI
+><P
+><EM
+>Maximum Votes per person</EM
+>:
+        Setting this field to "0" disables voting.</P
+></LI
+><LI
+><P
+><EM
+>Maximum Votes a person can put on a single
+         bug"</EM
+>: 
+         It should probably be some number lower than the
+        "Maximum votes per person". Don't set this field to "0" if
+        "Maximum votes per person" is non-zero; that doesn't make
+        any sense.</P
+></LI
+><LI
+><P
+><EM
+>Number of votes a bug in this product needs to
+        automatically get out of the UNCONFIRMED state</EM
+>: 
+        Setting this field to "0" disables the automatic move of
+        bugs from UNCONFIRMED to NEW. 
+        </P
+></LI
+><LI
+><P
+>Once you have adjusted the values to your preference, click
+        "Update".</P
+></LI
+></OL
+></DIV
+><DIV
+CLASS="NAVFOOTER"
+><HR
+ALIGN="LEFT"
+WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+><A
+HREF="programadmin.html"
+ACCESSKEY="P"
+>Prev</A
+></TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="index.html"
+ACCESSKEY="H"
+>Home</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+><A
+HREF="groups.html"
+ACCESSKEY="N"
+>Next</A
+></TD
+></TR
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+>Product, Component, Milestone, and Version Administration</TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="administration.html"
+ACCESSKEY="U"
+>Up</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+>Groups and Group Security</TD
+></TR
+></TABLE
+></DIV
+></BODY
+></HTML
+>
\ No newline at end of file
diff --git a/docs/html/whatis.html b/docs/html/whatis.html
index 248467ef5..85ec72202 100644
--- a/docs/html/whatis.html
+++ b/docs/html/whatis.html
@@ -4,22 +4,22 @@
 >What is Bugzilla?</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
 HREF="index.html"><LINK
 REL="UP"
-TITLE="Using Bugzilla"
-HREF="using.html"><LINK
+TITLE="Introduction"
+HREF="introduction.html"><LINK
 REL="PREVIOUS"
-TITLE="Using Bugzilla"
-HREF="using.html"><LINK
+TITLE="Introduction"
+HREF="introduction.html"><LINK
 REL="NEXT"
 TITLE="Why Should We Use Bugzilla?"
 HREF="why.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -44,20 +45,22 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="using.html"
+HREF="introduction.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Chapter 2. Using Bugzilla</TD
+>Chapter 2. Introduction</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
 HREF="why.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,112 +69,81 @@ HREF="why.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="WHATIS"
->2.1. What is Bugzilla?</A
-></H1
+NAME="whatis">2.1. What is Bugzilla?</H1
 ><P
->      Bugzilla is one example of a class of programs called "Defect
-Tracking Systems", or, more commonly, "Bug-Tracking Systems".  Defect
-Tracking Systems allow individual or groups of developers to keep
-track of outstanding bugs in their product effectively. Bugzilla was
-originally written by Terry Weissman in a programming language called
-"TCL", to replace a crappy bug-tracking database used internally for
-Netscape Communications.  Terry later ported Bugzilla to Perl from
-TCL, and in Perl it remains to this day. Most commercial
-defect-tracking software vendors at the time charged enormous
-licensing fees, and Bugzilla quickly became a favorite of the
-open-source crowd (with its genesis in the open-source browser
-project, Mozilla).  It is now the de-facto standard defect-tracking
-system against which all others are measured.
+>&#13;    Bugzilla is a bug- or issue-tracking system. Bug-tracking
+    systems allow individual or groups of developers effectively to keep track
+    of outstanding problems with their product. 
+    Bugzilla was originally
+    written by Terry Weissman in a programming language called TCL, to
+    replace a rudimentary bug-tracking database used internally by Netscape
+    Communications. Terry later ported Bugzilla to Perl from TCL, and in Perl
+    it remains to this day. Most commercial defect-tracking software vendors
+    at the time charged enormous licensing fees, and Bugzilla quickly became
+    a favorite of the open-source crowd (with its genesis in the open-source
+    browser project, Mozilla). It is now the de-facto standard
+    defect-tracking system against which all others are measured.
     </P
 ><P
->      Bugzilla has matured immensely, and now boasts many advanced features.  These include:
-      <P
+>Bugzilla boasts many advanced features. These include: 
+    <P
 ></P
 ><UL
 ><LI
 ><P
->	    integrated, product-based granular security schema
-	  </P
+>Powerful searching</P
 ></LI
 ><LI
 ><P
->	    inter-bug dependencies and dependency graphing
-	  </P
+>User-configurable email notifications of bug changes</P
 ></LI
 ><LI
 ><P
->	    advanced reporting capabilities
-	  </P
+>Full change history</P
 ></LI
 ><LI
 ><P
->	    a robust, stable RDBMS back-end
-	  </P
+>Inter-bug dependency tracking and graphing</P
 ></LI
 ><LI
 ><P
->	    extensive configurability
-	  </P
+>Excellent attachment management</P
 ></LI
 ><LI
 ><P
->	    a very well-understood and well-thought-out natural bug resolution protocol
-	  </P
+>Integrated, product-based, granular security schema</P
 ></LI
 ><LI
 ><P
->	    email, XML, console, and HTTP APIs
-	  </P
+>Fully security-audited, and runs under Perl's taint mode</P
 ></LI
 ><LI
 ><P
->	    available integration with automated software
-	    configuration management systems, including Perforce and
-	    CVS (through the Bugzilla email interface and
-	    checkin/checkout scripts)
-	  </P
+>A robust, stable RDBMS back-end</P
 ></LI
 ><LI
 ><P
->	    too many more features to list
-	  </P
+>Web, XML, email and console interfaces</P
 ></LI
-></UL
->
-    </P
+><LI
 ><P
->      Despite its current robustness and popularity, Bugzilla faces
-      some near-term challenges, such as reliance on a single
-      database, a lack of abstraction of the user interface and
-      program logic, verbose email bug notifications, a powerful but
-      daunting query interface, little reporting configurability,
-      problems with extremely large queries, some unsupportable bug
-      resolution options, little internationalization (although non-US
-      character sets are accepted for comments), and dependence on
-      some nonstandard libraries.
-    </P
+>Completely customisable and/or localisable web user
+        interface</P
+></LI
+><LI
 ><P
->      Some recent headway has been made on the query front, however.
-      If you are using the latest version of Bugzilla, you should see
-      a <SPAN
-CLASS="QUOTE"
->"simple search"</SPAN
-> form on the default front page of
-      your Bugzilla install.  Type in two or three search terms and
-      you should pull up some relevant information.  This is also
-      available as "queryhelp.cgi".
-    </P
+>Extensive configurability</P
+></LI
+><LI
 ><P
->      Despite these small problems, Bugzilla is very hard to beat.  It
-      is under <EM
->very</EM
-> active development to address
-      the current issues, and continually gains new features.
+>Smooth upgrade pathway between versions</P
+></LI
+></UL
+>
     </P
 ></DIV
 ><DIV
@@ -179,6 +151,7 @@ CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -189,7 +162,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="using.html"
+HREF="introduction.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -198,6 +172,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -206,6 +181,7 @@ ALIGN="right"
 VALIGN="top"
 ><A
 HREF="why.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -214,13 +190,14 @@ HREF="why.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->Using Bugzilla</TD
+>Introduction</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
 VALIGN="top"
 ><A
-HREF="using.html"
+HREF="introduction.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
diff --git a/docs/html/why.html b/docs/html/why.html
index dbbb4668b..1baa4042e 100644
--- a/docs/html/why.html
+++ b/docs/html/why.html
@@ -4,22 +4,22 @@
 >Why Should We Use Bugzilla?</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
 HREF="index.html"><LINK
 REL="UP"
-TITLE="Using Bugzilla"
-HREF="using.html"><LINK
+TITLE="Introduction"
+HREF="introduction.html"><LINK
 REL="PREVIOUS"
 TITLE="What is Bugzilla?"
 HREF="whatis.html"><LINK
 REL="NEXT"
-TITLE="How do I use Bugzilla?"
-HREF="how.html"></HEAD
+TITLE="Using Bugzilla"
+HREF="using.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -45,19 +46,21 @@ ALIGN="left"
 VALIGN="bottom"
 ><A
 HREF="whatis.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Chapter 2. Using Bugzilla</TD
+>Chapter 2. Introduction</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="how.html"
+HREF="using.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,99 +69,83 @@ HREF="how.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="WHY"
->2.2. Why Should We Use Bugzilla?</A
-></H1
-><TABLE
-BORDER="0"
-WIDTH="100%"
-CELLSPACING="0"
-CELLPADDING="0"
-CLASS="EPIGRAPH"
-><TR
-><TD
-WIDTH="45%"
->&nbsp;</TD
-><TD
-WIDTH="45%"
-ALIGN="LEFT"
-VALIGN="TOP"
-><I
+NAME="why">2.2. Why Should We Use Bugzilla?</H1
 ><P
-><I
->No, Who's on first...</I
-></P
-></I
-></TD
-></TR
-></TABLE
-><P
->      For many years, defect-tracking software has remained
-      principally the domain of large software development houses.
-      Even then, most shops never bothered with bug-tracking software,
-      and instead simply relied on shared lists and email to monitor
-      the status of defects.  This procedure is error-prone and tends
-      to cause those bugs judged least significant by developers to be
-      dropped or ignored.
-    </P
+>For many years, defect-tracking software has remained principally
+    the domain of large software development houses. Even then, most shops
+    never bothered with bug-tracking software, and instead simply relied on
+    shared lists and email to monitor the status of defects. This procedure
+    is error-prone and tends to cause those bugs judged least significant by
+    developers to be dropped or ignored.</P
 ><P
->      These days, many companies are finding that integrated
-      defect-tracking systems reduce downtime, increase productivity,
-      and raise customer  satisfaction with their systems.  Along with
-      full disclosure, an open bug-tracker allows manufacturers to
-      keep in touch with their clients and resellers, to communicate
-      about problems effectively throughout the data management chain.
-      Many corporations have also discovered that defect-tracking
-      helps reduce costs by providing IT support accountability,
-      telephone support knowledge bases, and a common, well-understood
-      system for accounting for unusual system or software issues.
-    </P
+>These days, many companies are finding that integrated
+    defect-tracking systems reduce downtime, increase productivity, and raise
+    customer satisfaction with their systems. Along with full disclosure, an
+    open bug-tracker allows manufacturers to keep in touch with their clients
+    and resellers, to communicate about problems effectively throughout the
+    data management chain. Many corporations have also discovered that
+    defect-tracking helps reduce costs by providing IT support
+    accountability, telephone support knowledge bases, and a common,
+    well-understood system for accounting for unusual system or software
+    issues.</P
 ><P
->      But why should <EM
+>But why should 
+    <EM
 >you</EM
-> use Bugzilla?
-    </P
+>
+
+    use Bugzilla?</P
 ><P
->      Bugzilla is very adaptable to various situations.  Known uses
-      currently include IT support queues, Systems Administration
-      deployment management, chip design and development problem
-      tracking (both pre-and-post fabrication), and software and
-      hardware bug tracking for luminaries such as Redhat, Loki
-      software, Linux-Mandrake, and VA Systems.  Combined with systems
-      such as CVS, Bonsai, or Perforce SCM, Bugzilla provides a
-      powerful, easy-to-use  solution to configuration management and
-      replication problems
-    </P
+>Bugzilla is very adaptable to various situations. Known uses
+    currently include IT support queues, Systems Administration deployment
+    management, chip design and development problem tracking (both
+    pre-and-post fabrication), and software and hardware bug tracking for
+    luminaries such as Redhat, NASA, Linux-Mandrake, and VA Systems.
+    Combined with systems such as 
+    <A
+HREF="http://www.cvshome.org"
+TARGET="_top"
+>CVS</A
+>, 
+    <A
+HREF="http://www.mozilla.org/bonsai.html"
+TARGET="_top"
+>Bonsai</A
+>, or 
+    <A
+HREF="http://www.perforce.com"
+TARGET="_top"
+>Perforce SCM</A
+>, Bugzilla
+    provides a powerful, easy-to-use solution to configuration management and
+    replication problems.</P
 ><P
->      Bugzilla can dramatically increase the productivity and
-      accountability of individual employees by providing a documented
-      workflow and positive feedback for good performance.  How many
-      times do you wake up in the morning, remembering that you were
-      supposed to do <EM
+>Bugzilla can dramatically increase the productivity and
+    accountability of individual employees by providing a documented workflow
+    and positive feedback for good performance. How many times do you wake up
+    in the morning, remembering that you were supposed to do 
+    <EM
 >something</EM
-> today, but you
-      just can't quite remember?  Put it in Bugzilla, and you have a
-      record of it from which you can extrapolate milestones, predict
-      product versions for integration, and by using Bugzilla's e-mail
-      integration features be able to follow the discussion trail that
-      led to critical decisions.
-    </P
+>
+    today, but you just can't quite remember? Put it in Bugzilla, and you
+    have a record of it from which you can extrapolate milestones, predict
+    product versions for integration, and  follow the discussion trail 
+    that led to critical decisions.</P
 ><P
->      Ultimately, Bugzilla puts the power in your hands to improve
-      your value to your employer or business while providing a usable
-      framework for your natural attention to detail and knowledge
-      store to flourish.
-    </P
+>Ultimately, Bugzilla puts the power in your hands to improve your
+    value to your employer or business while providing a usable framework for
+    your natural attention to detail and knowledge store to flourish.</P
 ></DIV
 ><DIV
 CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -170,6 +157,7 @@ ALIGN="left"
 VALIGN="top"
 ><A
 HREF="whatis.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -178,6 +166,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -185,7 +174,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="how.html"
+HREF="using.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -200,14 +190,15 @@ WIDTH="34%"
 ALIGN="center"
 VALIGN="top"
 ><A
-HREF="using.html"
+HREF="introduction.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->How do I use Bugzilla?</TD
+>Using Bugzilla</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/html/win32.html b/docs/html/win32.html
index 6b639622d..575bf8f4b 100644
--- a/docs/html/win32.html
+++ b/docs/html/win32.html
@@ -4,7 +4,7 @@
 >Win32 Installation Notes</TITLE
 ><META
 NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.61
+CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
 "><LINK
 REL="HOME"
 TITLE="The Bugzilla Guide"
@@ -13,13 +13,13 @@ REL="UP"
 TITLE="Installation"
 HREF="installation.html"><LINK
 REL="PREVIOUS"
-TITLE="Installation General Notes"
-HREF="geninstall.html"><LINK
+TITLE="Optional Additional Configuration"
+HREF="extraconfig.html"><LINK
 REL="NEXT"
-TITLE="Administering Bugzilla"
-HREF="administration.html"></HEAD
+TITLE="Mac OS X Installation Notes"
+HREF="osx.html"></HEAD
 ><BODY
-CLASS="SECTION"
+CLASS="section"
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
@@ -28,6 +28,7 @@ ALINK="#0000FF"
 ><DIV
 CLASS="NAVHEADER"
 ><TABLE
+SUMMARY="Header navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -44,20 +45,22 @@ WIDTH="10%"
 ALIGN="left"
 VALIGN="bottom"
 ><A
-HREF="geninstall.html"
+HREF="extraconfig.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
 WIDTH="80%"
 ALIGN="center"
 VALIGN="bottom"
->Chapter 3. Installation</TD
+>Chapter 4. Installation</TD
 ><TD
 WIDTH="10%"
 ALIGN="right"
 VALIGN="bottom"
 ><A
-HREF="administration.html"
+HREF="osx.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -66,47 +69,94 @@ HREF="administration.html"
 ALIGN="LEFT"
 WIDTH="100%"></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H1
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="WIN32"
->3.6. Win32 Installation Notes</A
-></H1
-><P
->This section covers installation on Microsoft Windows 95,
-      98, ME, NT, and 2000.  Bugzilla works fine on Win32 platforms,
-      but please remember that the Bugzilla team and the author of the
-      Guide neither endorse nor support installation on Microsoft
-      Windows.  Bugzilla installs and runs <EM
->best</EM
->
-      and <EM
->easiest</EM
-> on UNIX-like operating systems,
-      and that is the way it will stay for the foreseeable future. The
-      Bugzilla team is considering supporting Win32 for the 2.16
-      release and later.</P
-><P
->The easiest way to install Bugzilla on Intel-archiecture
-      machines is to install some variant of GNU/Linux, then follow
-      the UNIX installation instructions in this Guide.  If you have
-      any influence in the platform choice for running this system,
-      please choose GNU/Linux instead of Microsoft Windows.</P
+NAME="win32">4.3. Win32 Installation Notes</H1
+><P
+>This section covers installation on Microsoft Windows. 
+    Bugzilla has been made to work on Win32 platforms, but the Bugzilla team
+    wish to emphasise that The easiest way to install Bugzilla on
+    Intel-archiecture machines
+    is to install some variant of GNU/Linux, then follow the UNIX
+    installation instructions in this Guide. If you have any influence in the
+    platform choice for running this system, please choose GNU/Linux instead
+    of Microsoft Windows.</P
 ><DIV
-CLASS="SECTION"
+CLASS="warning"
+><P
+></P
+><TABLE
+CLASS="warning"
+WIDTH="100%"
+BORDER="0"
+><TR
+><TD
+WIDTH="25"
+ALIGN="CENTER"
+VALIGN="TOP"
+><IMG
+SRC="../images/warning.gif"
+HSPACE="5"
+ALT="Warning"></TD
+><TD
+ALIGN="LEFT"
+VALIGN="TOP"
+><P
+>After that warning, here's the situation for 2.16
+      and Windows. It doesn't work at all out of the box. 
+      You are almost certainly better off getting
+      the 2.17 version from CVS (after consultation with the Bugzilla Team to
+      make sure you are pulling on a stable day) because we'll be doing a load
+      of work to make the Win32 experience more pleasant than it is now.
+      </P
+></TD
+></TR
+></TABLE
+></DIV
+><P
+>&#13;    If you still want to try this, to have any hope of getting it to work,
+    you'll need to apply the 
+    <A
+HREF=""
+TARGET="_top"
+>mail patch</A
+> from 
+    <A
+HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=124174"
+TARGET="_top"
+>bug 124174</A
+>.
+    After that, you'll need to read the (outdated) installation 
+    instructions below, some (probably a lot better) <A
+HREF="http://bugzilla.mozilla.org/attachment.cgi?id=84430&action=view"
+TARGET="_top"
+>more
+     recent ones</A
+> kindly provided by Toms Baugis and Jean-Sebastien 
+     Guay, and also check the 
+     <A
+HREF="http://www.bugzilla.org/releases/2.16/docs/win32.html"
+TARGET="_top"
+>Bugzilla 2.16 Win32 update page
+     </A
+>. If we get time,
+     we'll write some better installation instructions for 2.16 and put
+     them up there. But no promises.
+    </P
+><DIV
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="WININSTALL"
->3.6.1. Win32 Installation: Step-by-step</A
-></H2
+NAME="wininstall">4.3.1. Win32 Installation: Step-by-step</H2
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -122,68 +172,77 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  You should be familiar with, and cross-reference, the rest
-	  of the  
-	  <A
+>You should be familiar with, and cross-reference, the rest of
+        the 
+        <A
 HREF="installation.html"
 >Bugzilla Installation</A
-> section while performing your
-	  Win32 installation.
-	</P
-><P
->  Making Bugzilla work on Microsoft Windows is no
-	  picnic.  Support for Win32 has improved dramatically in the
-	  last few releases, but, if you choose to proceed, you should
-	  be a <EM
+>
+
+        section while performing your Win32 installation.</P
+><P
+>Making Bugzilla work on Microsoft Windows is no picnic. Support
+        for Win32 has improved dramatically in the last few releases, but, if
+        you choose to proceed, you should be a 
+        <EM
 >very</EM
-> skilled Windows Systems
-	  Administrator with strong troubleshooting abilities, a high
-	  tolerance for pain, and moderate perl skills. Bugzilla on NT
-	  requires hacking source code and implementing some advanced
-	  utilities.  What follows is the recommended installation
-	  procedure for Win32; additional suggestions are provided in
-	  <A
+>
+
+        skilled Windows Systems Administrator with strong troubleshooting
+        abilities, a high tolerance for pain, and moderate perl skills.
+        Bugzilla on NT requires hacking source code and implementing some
+        advanced utilities. What follows is the recommended installation
+        procedure for Win32; additional suggestions are provided in 
+        <A
 HREF="faq.html"
 >Appendix A</A
->.
-	</P
+>
+
+        .</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ><DIV
-CLASS="PROCEDURE"
+CLASS="procedure"
 ><OL
 TYPE="1"
 ><LI
 ><P
->	    Install <A
+>Install 
+          <A
 HREF="http://www.apache.org/"
 TARGET="_top"
->Apache Web
-	      Server</A
-> for Windows, and copy the Bugzilla files
-	    somewhere Apache can serve them.  Please follow all the
-	    instructions referenced in <A
+>Apache Web Server</A
+>
+
+          for Windows, and copy the Bugzilla files somewhere Apache can serve
+          them. Please follow all the instructions referenced in 
+          <A
 HREF="installation.html"
 >Bugzilla Installation</A
 >
-	    regarding your Apache configuration, particularly
-	    instructions regarding the <SPAN
+
+          regarding your Apache configuration, particularly instructions
+          regarding the 
+          <SPAN
 CLASS="QUOTE"
 >"AddHandler"</SPAN
 >
-	    parameter and <SPAN
+
+          parameter and 
+          <SPAN
 CLASS="QUOTE"
 >"ExecCGI"</SPAN
->.
-	  </P
+>
+
+          .</P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -199,20 +258,20 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	      You may also use Internet Information Server or Personal
-	      Web Server for this purpose.  However, setup is quite
-	      different.  If ActivePerl doesn't seem to handle your
-	      file associations correctly (for .cgi and .pl files),
-	      please consult <A
+>You may also use Internet Information Server or Personal
+            Web Server for this purpose. However, setup is quite different.
+            If ActivePerl doesn't seem to handle your file associations
+            correctly (for .cgi and .pl files), please consult 
+            <A
 HREF="faq.html"
 >Appendix A</A
->.
-	    </P
+>
+
+            .</P
 ><P
->	      If you are going to use IIS, if on Windows NT you must
-	      be updated to at least Service Pack 4.  Windows 2000
-	      ships with a sufficient version of IIS.
-	    </P
+>If you are going to use IIS, if on Windows NT you must be
+            updated to at least Service Pack 4. Windows 2000 ships with a
+            sufficient version of IIS.</P
 ></TD
 ></TR
 ></TABLE
@@ -220,44 +279,60 @@ HREF="faq.html"
 ></LI
 ><LI
 ><P
->	    Install <A
+>Install 
+          <A
 HREF="http://www.activestate.com/"
 TARGET="_top"
 >ActivePerl</A
-> for Windows.  Check <A
+>
+
+          for Windows. Check 
+          <A
 HREF="http://aspn.activestate.com/ASPN/Downloads/ActivePerl/"
 TARGET="_top"
->http://aspn.activestate.com/ASPN/Downloads/ActivePerl</A
-> for a current compiled binary.
-	  </P
+>&#13;          http://aspn.activestate.com/ASPN/Downloads/ActivePerl</A
+>
+
+          for a current compiled binary.</P
 ><P
->	    Please also check the following links to fully understand the status
-	    of ActivePerl on Win32:
-	    <A
+>Please also check the following links to fully understand the
+          status of ActivePerl on Win32: 
+          <A
 HREF="http://language.perl.com/newdocs/pod/perlport.html"
 TARGET="_top"
->	      Perl Porting</A
->, and
-	    <A
+>&#13;          Perl Porting</A
+>
+
+          , and 
+          <A
 HREF="http://ftp.univie.ac.at/packages/perl/ports/nt/FAQ/perlwin32faq5.html"
 TARGET="_top"
->	      Perl on Win32 FAQ</A
+>&#13;          Perl on Win32 FAQ</A
 >
-	  </P
+          </P
 ></LI
 ><LI
 ><P
->	    Use ppm from your perl\bin directory to install the following packs: DBI,
-	    DBD-Mysql, TimeDate, Chart, Date-Calc, Date-Manip, and GD.  You may need
-	    to extract them from .zip format using Winzip or other unzip program first.
-	    These additional ppm modules can be downloaded from ActiveState.
-	  </P
+>Use ppm from your perl\bin directory to install the following
+          packs: DBI, DBD-Mysql, TimeDate, Chart, Date-Calc, Date-Manip, GD,
+          AppConfig, and Template. You may need to extract them from .zip
+          format using Winzip or other unzip program first. Most of these
+          additional ppm modules can be downloaded from ActiveState, but
+          AppConfig and Template should be obtained from OpenInteract using 
+          <A
+HREF="http://openinteract.sourceforge.net/"
+TARGET="_top"
+>the
+          instructions on the Template Toolkit web site</A
+>
+
+          .</P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -273,73 +348,134 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	      You can find a list of modules at
-	      <A
+>You can find a list of modules at 
+            <A
 HREF="http://www.activestate.com/PPMPackages/zips/5xx-builds-only"
 TARGET="_top"
->		http://www.activestate.com/PPMPackages/zips/5xx-builds-only/</A
+>&#13;            http://www.activestate.com/PPMPackages/zips/5xx-builds-only/</A
 >
-	    </P
+
+            or 
+            <A
+HREF="http://www.activestate.com/PPMPackages/5.6plus"
+TARGET="_top"
+>&#13;            http://www.activestate.com/PPMPackages/5.6plus</A
+>
+            </P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ><P
->	    The syntax for ppm is:
-	    <TT
-CLASS="COMPUTEROUTPUT"
->	      <TT
-CLASS="PROMPT"
->C:&#62; </TT
-><B
-CLASS="COMMAND"
+>The syntax for ppm is: 
+          <TT
+CLASS="computeroutput"
+>&#13;            <TT
+CLASS="prompt"
+>C:&#62;</TT
+>
+
+            <B
+CLASS="command"
 >ppm &#60;modulename&#62;</B
 >
-	    </TT
+          </TT
 >
-	  </P
+          </P
 ><DIV
-CLASS="EXAMPLE"
+CLASS="example"
 ><A
-NAME="AEN1038"
-></A
-><P
+NAME="AEN989"><P
 ><B
->Example 3-3. Installing ActivePerl ppd Modules on Microsoft Windows</B
+>Example 4-1. Installing ActivePerl ppd Modules on Microsoft
+            Windows</B
 ></P
 ><P
-><TT
-CLASS="PROMPT"
+>&#13;              <TT
+CLASS="prompt"
 >C:&#62;</TT
-><B
-CLASS="COMMAND"
->ppm
-		<TT
-CLASS="OPTION"
+>
+
+              <B
+CLASS="command"
+>ppm 
+              <TT
+CLASS="option"
 >DBD-Mysql</TT
-></B
-></P
+>
+              </B
+>
+            </P
 ><P
 >Watch your capitalization!</P
 ></DIV
 ><P
->	    You can find ActiveState ppm modules at
-	    <A
-HREF="http://www.activestate.com/PPMPackages/5.6plus/"
+>ActiveState's 5.6Plus directory also contains an AppConfig
+          ppm, so you might see the following error when trying to install
+          the version at OpenInteract:</P
+><P
+>&#13;            <TT
+CLASS="computeroutput"
+>Error installing package 'AppConfig': Read a PPD
+            for 'AppConfig', but it is not intended for this build of Perl
+            (MSWin32-x86-multi-thread)</TT
+>
+          </P
+><P
+>If so, download both 
+          <A
+HREF="http://openinteract.sourceforge.net/ppmpackages/AppConfig.tar.gz"
+TARGET="_top"
+>&#13;          the tarball</A
+>
+
+          and 
+          <A
+HREF="http://openinteract.sourceforge.net/ppmpackages/AppConfig.ppd"
 TARGET="_top"
->	      http://www.activestate.com/PPMPackages/5.6plus</A
+>&#13;          the ppd</A
+>
+
+          directly from OpenInteract, then run ppm from within the same
+          directory to which you downloaded those files and install the
+          package by referencing the ppd file explicitly via in the install
+          command, f.e.: 
+          <DIV
+CLASS="example"
+><A
+NAME="AEN1002"><P
+><B
+>Example 4-2. Installing OpenInteract ppd Modules manually on Microsoft
+            Windows</B
+></P
+><P
+>&#13;              <TT
+CLASS="computeroutput"
+>&#13;                <B
+CLASS="command"
+>install 
+                <TT
+CLASS="filename"
+>C:\AppConfig.ppd</TT
+>
+                </B
+>
+              </TT
 >
-	  </P
+            </P
+></DIV
+>
+          </P
 ></LI
 ><LI
 ><P
->	    Install MySQL for NT.
-	    <DIV
-CLASS="NOTE"
+>Install MySQL for NT. 
+          <DIV
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -355,193 +491,211 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->		You can download MySQL for Windows NT from <A
+>You can download MySQL for Windows NT from 
+            <A
 HREF="http://www.mysql.com/"
 TARGET="_top"
 >MySQL.com</A
->.  Some find it helpful to use the WinMySqlAdmin utility, included with the download, to set up the database.
-	      </P
+>
+
+            . Some find it helpful to use the WinMySqlAdmin utility, included
+            with the download, to set up the database.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 >
-	  </P
+          </P
 ></LI
 ><LI
 ><P
->	    Setup MySQL
-	  </P
+>Setup MySQL</P
 ><OL
 CLASS="SUBSTEPS"
 TYPE="a"
 ><LI
 ><P
->		<TT
-CLASS="COMPUTEROUTPUT"
->		  <TT
-CLASS="PROMPT"
->C:&#62; </TT
+>&#13;                <TT
+CLASS="computeroutput"
+>&#13;                  <TT
+CLASS="prompt"
+>C:&#62;</TT
 >
-		  <B
-CLASS="COMMAND"
+
+                  <B
+CLASS="command"
 >C:\mysql\bin\mysql -u root mysql</B
 >
-		</TT
+                </TT
 >
-	      </P
+              </P
 ></LI
 ><LI
 ><P
->		<TT
-CLASS="COMPUTEROUTPUT"
->		  <TT
-CLASS="PROMPT"
+>&#13;                <TT
+CLASS="computeroutput"
+>&#13;                  <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-		  <B
-CLASS="COMMAND"
->DELETE FROM user WHERE Host='localhost' AND User='';</B
+
+                  <B
+CLASS="command"
+>DELETE FROM user WHERE Host='localhost' AND
+                  User='';</B
 >
-		</TT
+                </TT
 >
-	      </P
+              </P
 ></LI
 ><LI
 ><P
->		<TT
-CLASS="COMPUTEROUTPUT"
->		  <TT
-CLASS="PROMPT"
+>&#13;                <TT
+CLASS="computeroutput"
+>&#13;                  <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-		  <B
-CLASS="COMMAND"
+
+                  <B
+CLASS="command"
 >UPDATE user SET Password=PASSWORD ('new_password')
-		    WHERE user='root';</B
+                  WHERE user='root';</B
 >
-		</TT
+                </TT
 >
-	      </P
+              </P
 ><P
-><SPAN
+>&#13;              <SPAN
 CLASS="QUOTE"
 >"new_password"</SPAN
->, above, indicates
-		whatever password you wish to use for your
-		<SPAN
+>
+
+              , above, indicates whatever password you wish to use for your 
+              <SPAN
 CLASS="QUOTE"
 >"root"</SPAN
-> user.</P
+>
+
+              user.</P
 ></LI
 ><LI
 ><A
-NAME="NTBUGS-PASSWORD"
+NAME="ntbugs-password"
 ></A
 ><P
->		<TT
-CLASS="COMPUTEROUTPUT"
->		  <TT
-CLASS="PROMPT"
+>&#13;                <TT
+CLASS="computeroutput"
+>&#13;                  <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-		  <B
-CLASS="COMMAND"
->GRANT SELECT, INSERT, UPDATE, DELETE,
-		    INDEX, ALTER, CREATE, DROP, REFERENCES
-		    ON bugs.* to bugs@localhost
-		    IDENTIFIED BY 'bugs_password';</B
+
+                  <B
+CLASS="command"
+>GRANT SELECT, INSERT, UPDATE, DELETE, INDEX,
+                  ALTER, CREATE, DROP, REFERENCES ON bugs.* to bugs@localhost
+                  IDENTIFIED BY 'bugs_password';</B
 >
-		</TT
+                </TT
 >
-	      </P
+              </P
 ><P
-><SPAN
+>&#13;              <SPAN
 CLASS="QUOTE"
 >"bugs_password"</SPAN
->, above, indicates
-		whatever password you wish to use for your
-		<SPAN
+>
+
+              , above, indicates whatever password you wish to use for your 
+              <SPAN
 CLASS="QUOTE"
 >"bugs"</SPAN
-> user.</P
+>
+
+              user.</P
 ></LI
 ><LI
 ><P
->		<TT
-CLASS="COMPUTEROUTPUT"
->		  <TT
-CLASS="PROMPT"
+>&#13;                <TT
+CLASS="computeroutput"
+>&#13;                  <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-		  <B
-CLASS="COMMAND"
+
+                  <B
+CLASS="command"
 >FLUSH PRIVILEGES;</B
 >
-		</TT
+                </TT
 >
-	      </P
+              </P
 ></LI
 ><LI
 ><P
->		<TT
-CLASS="COMPUTEROUTPUT"
->		  <TT
-CLASS="PROMPT"
+>&#13;                <TT
+CLASS="computeroutput"
+>&#13;                  <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-		  <B
-CLASS="COMMAND"
+
+                  <B
+CLASS="command"
 >create database bugs;</B
 >
-		</TT
+                </TT
 >
-	      </P
+              </P
 ></LI
 ><LI
 ><P
->		<TT
-CLASS="COMPUTEROUTPUT"
->		  <TT
-CLASS="PROMPT"
+>&#13;                <TT
+CLASS="computeroutput"
+>&#13;                  <TT
+CLASS="prompt"
 >mysql&#62;</TT
 >
-		  <B
-CLASS="COMMAND"
+
+                  <B
+CLASS="command"
 >exit;</B
 >
-		</TT
+                </TT
 >
-	      </P
+              </P
 ></LI
 ><LI
 ><P
->		<TT
-CLASS="COMPUTEROUTPUT"
->		  <TT
-CLASS="PROMPT"
+>&#13;                <TT
+CLASS="computeroutput"
+>&#13;                  <TT
+CLASS="prompt"
 >C:&#62;</TT
 >
-		  <B
-CLASS="COMMAND"
->C:\mysql\bin\mysqladmin -u root -p reload</B
+
+                  <B
+CLASS="command"
+>C:\mysql\bin\mysqladmin -u root -p
+                  reload</B
 >
-		</TT
+                </TT
 >
-	      </P
+              </P
 ></LI
 ></OL
 ></LI
 ><LI
 ><P
->	    Edit <TT
-CLASS="FILENAME"
+>Edit 
+          <TT
+CLASS="filename"
 >checksetup.pl</TT
-> in your Bugzilla directory.  Change
-	    this line:
-	  </P
+>
+
+          in your Bugzilla directory. Change this line:</P
 ><P
->	    <TABLE
+>&#13;            <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -550,20 +704,19 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->my $webservergid = getgrnam($my_webservergroup);
-	    </PRE
+CLASS="programlisting"
+>my $webservergid =
+            getgrnam($my_webservergroup);</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-	  </P
+          </P
 ><P
->	    to
-	  </P
+>to</P
 ><P
->	    <TABLE
+>&#13;          <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -572,16 +725,17 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->my $webservergid = $my_webservergroup;
-	    </PRE
+CLASS="programlisting"
+>my $webservergid =
+          $my_webservergroup;</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-or the name of the group you wish to own the files explicitly:
-	    <TABLE
+
+          or the name of the group you wish to own the files explicitly: 
+          <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -590,53 +744,71 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->my $webservergid = 'Administrators'
-	    </PRE
+CLASS="programlisting"
+>my $webservergid =
+          'Administrators'</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-	  </P
+          </P
 ></LI
 ><LI
 ><P
->	    Run <TT
-CLASS="FILENAME"
+>Run 
+          <TT
+CLASS="filename"
 >checksetup.pl</TT
-> from the Bugzilla directory.
-	  </P
+>
+
+          from the Bugzilla directory.</P
 ></LI
 ><LI
 ><P
->Edit <TT
-CLASS="FILENAME"
+>Edit 
+          <TT
+CLASS="filename"
 >localconfig</TT
-> to suit your
-	    requirements.  Set <TT
-CLASS="VARNAME"
+>
+
+          to suit your requirements. Set 
+          <TT
+CLASS="varname"
 >$db_pass</TT
-> to your
-	    <SPAN
+>
+
+          to your 
+          <SPAN
 CLASS="QUOTE"
 >"bugs_password"</SPAN
-> from <A
-HREF="win32.html#NTBUGS-PASSWORD"
+>
+
+          from 
+          <A
+HREF="win32.html#ntbugs-password"
 >step 5.d</A
->, and <TT
-CLASS="VARNAME"
+>
+
+          , and 
+          <TT
+CLASS="varname"
 >$webservergroup</TT
-> to <SPAN
+>
+
+          to 
+          <SPAN
 CLASS="QUOTE"
 >"8"</SPAN
->.</P
+>
+
+          .</P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -652,15 +824,19 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->Not sure on the <SPAN
+>Not sure on the 
+            <SPAN
 CLASS="QUOTE"
 >"8"</SPAN
-> for
-	      <TT
-CLASS="VARNAME"
+>
+
+            for 
+            <TT
+CLASS="varname"
 >$webservergroup</TT
-> above.  If it's
-	      wrong, please send corrections.</P
+>
+
+            above. If it's wrong, please send corrections.</P
 ></TD
 ></TR
 ></TABLE
@@ -668,27 +844,30 @@ CLASS="VARNAME"
 ></LI
 ><LI
 ><P
->	    Edit <TT
-CLASS="FILENAME"
+>Edit 
+          <TT
+CLASS="filename"
 >defparams.pl</TT
-> to suit your
-	    requirements.  Particularly, set
-	    <TT
-CLASS="VARNAME"
+>
+
+          to suit your requirements. Particularly, set 
+          <TT
+CLASS="varname"
 >DefParam("maintainer")</TT
-> and
-	    <TT
-CLASS="VARNAME"
->DefParam("urlbase") to match your
-	      install.</TT
 >
-	  </P
+
+          and 
+          <TT
+CLASS="varname"
+>DefParam("urlbase") to match your install.</TT
+>
+          </P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -705,9 +884,9 @@ ALIGN="LEFT"
 VALIGN="TOP"
 ><P
 >This is yet another step I'm not sure of, since the
-	      maintainer of this documentation does not maintain
-	      Bugzilla on NT.  If you can confirm or deny that this
-	      step is required, please let me know.</P
+            maintainer of this documentation does not maintain Bugzilla on
+            NT. If you can confirm or deny that this step is required, please
+            let me know.</P
 ></TD
 ></TR
 ></TABLE
@@ -715,11 +894,11 @@ VALIGN="TOP"
 ></LI
 ><LI
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -735,46 +914,58 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	      There are several alternatives to Sendmail that will work on Win32.
-	      The one mentioned here is a <EM
+>There are several alternatives to Sendmail that will work
+            on Win32. The one mentioned here is a 
+            <EM
 >suggestion</EM
->, not
-	      a requirement.  Some other mail packages that can work include
-	      <A
+>
+
+            , not a requirement. Some other mail packages that can work
+            include 
+            <A
 HREF="http://www.blat.net/"
 TARGET="_top"
 >BLAT</A
->,
-	      <A
+>
+
+            , 
+            <A
 HREF="http://www.geocel.com/windmail/"
 TARGET="_top"
 >Windmail</A
->,
-	      <A
+>
+
+            , 
+            <A
 HREF="http://www.dynamicstate.com/"
 TARGET="_top"
->Mercury Sendmail</A
->,
-	      and the CPAN Net::SMTP Perl module (available in .ppm).
-	      Every option requires some hacking of the Perl scripts for Bugzilla
-	      to make it work.  The option here simply requires the least.
-	    </P
+>Mercury
+            Sendmail</A
+>
+
+            , and the CPAN Net::SMTP Perl module (available in .ppm). Every
+            option requires some hacking of the Perl scripts for Bugzilla to
+            make it work. The option here simply requires the least.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ><DIV
-CLASS="PROCEDURE"
+CLASS="procedure"
 ><OL
 TYPE="1"
 ><LI
 ><P
->		Download NTsendmail, available from<A
+>Download NTsendmail, available from
+              <A
 HREF="http://www.ntsendmail.com/"
 TARGET="_top"
-> www.ntsendmail.com</A
->. You must have a "real" mail server which allows you to relay off it in your $ENV{"NTsendmail"} (which you should probably place in globals.pl)
-	      </P
+>&#13;              www.ntsendmail.com</A
+>
+
+              . You must have a "real" mail server which allows you to relay
+              off it in your $ENV{"NTsendmail"} (which you should probably
+              place in globals.pl)</P
 ></LI
 ><LI
 ><P
@@ -792,23 +983,22 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
-># these settings configure the NTsendmail process
-use NTsendmail;
-$ENV{"NTsendmail"}="your.smtpserver.box";
-$ENV{"NTsendmail_debug"}=1;
-$ENV{"NTsendmail_max_tries"}=5;
-	      </PRE
+CLASS="programlisting"
+># these settings configure the NTsendmail
+              process use NTsendmail;
+              $ENV{"NTsendmail"}="your.smtpserver.box";
+              $ENV{"NTsendmail_debug"}=1;
+              $ENV{"NTsendmail_max_tries"}=5;</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -824,28 +1014,34 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->		  Some mention to also edit
-		  <TT
-CLASS="VARNAME"
+>Some mention to also edit 
+                <TT
+CLASS="varname"
 >$db_pass</TT
-> in
-		  <TT
-CLASS="FILENAME"
+>
+
+                in 
+                <TT
+CLASS="filename"
 >globals.pl</TT
-> to be your
-		  <SPAN
+>
+
+                to be your 
+                <SPAN
 CLASS="QUOTE"
 >"bugs_password"</SPAN
->.  Although this may get
-		  you around some problem authenticating to your
-		  database, since globals.pl is not normally
-		  restricted by <TT
-CLASS="FILENAME"
+>
+
+                . Although this may get you around some problem
+                authenticating to your database, since globals.pl is not
+                normally restricted by 
+                <TT
+CLASS="filename"
 >.htaccess</TT
->, your
-		  database password is exposed to whoever uses your
-		  web server.
-		</P
+>
+
+                , your database password is exposed to whoever uses your web
+                server.</P
 ></TD
 ></TR
 ></TABLE
@@ -853,16 +1049,19 @@ CLASS="FILENAME"
 ></LI
 ><LI
 ><P
->		Find and comment out all occurences of
-		<SPAN
+>Find and comment out all occurences of 
+              <SPAN
 CLASS="QUOTE"
->"<B
-CLASS="COMMAND"
+>"
+                <B
+CLASS="command"
 >open(SENDMAIL</B
->"</SPAN
-> in
-		your Bugzilla directory.  Then replace them with:
-		<TABLE
+>
+              "</SPAN
+>
+
+              in your Bugzilla directory. Then replace them with: 
+              <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -871,26 +1070,23 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
-># new sendmail functionality
-my $mail=new NTsendmail;
-my $from="bugzilla\@your.machine.name.tld";
-my $to=$login;
-my $subject=$urlbase;
-$mail-&#62;send($from,$to,$subject,$msg);
-		</PRE
+CLASS="programlisting"
+># new sendmail functionality my $mail=new
+              NTsendmail; my $from="bugzilla\@your.machine.name.tld"; my
+              $to=$login; my $subject=$urlbase;
+              $mail-&#62;send($from,$to,$subject,$msg);</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-	      </P
+              </P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -906,13 +1102,14 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->		  Some have found success using the commercial product, 
-		  <SPAN
-CLASS="PRODUCTNAME"
+>Some have found success using the commercial product, 
+                <SPAN
+CLASS="productname"
 >Windmail</SPAN
->.
-		  You could try replacing your sendmail calls with:
-		  <TABLE
+>
+
+                . You could try replacing your sendmail calls with: 
+                <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -921,16 +1118,17 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->open SENDMAIL, "|\"C:/General/Web/tools/Windmail 4.0 Beta/windmail\" -t &#62; mail.log";
-		  </PRE
+CLASS="programlisting"
+>open SENDMAIL,
+                "|\"C:/General/Web/tools/Windmail 4.0 Beta/windmail\" -t &#62;
+                mail.log";</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-		or something to that effect.
-		</P
+
+                or something to that effect.</P
 ></TD
 ></TR
 ></TABLE
@@ -941,30 +1139,37 @@ CLASS="PROGRAMLISTING"
 ></LI
 ><LI
 ><P
->	    Change all references in all files from
-	    <TT
-CLASS="FILENAME"
+>Change all references in all files from 
+          <TT
+CLASS="filename"
 >processmail</TT
-> to
-	    <TT
-CLASS="FILENAME"
+>
+
+          to 
+          <TT
+CLASS="filename"
 >processmail.pl</TT
->, and
-	    rename <TT
-CLASS="FILENAME"
+>
+
+          , and rename 
+          <TT
+CLASS="filename"
 >processmail</TT
-> to
-	    <TT
-CLASS="FILENAME"
+>
+
+          to 
+          <TT
+CLASS="filename"
 >processmail.pl</TT
->.
-	  </P
+>
+
+          .</P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -980,20 +1185,19 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	      Many think this may be a change we want to make for
-	      main-tree Bugzilla.  It's painless for the UNIX folks,
-	      and will make the Win32 people happier.
-	    </P
+>Many think this may be a change we want to make for
+            main-tree Bugzilla. It's painless for the UNIX folks, and will
+            make the Win32 people happier.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -1009,8 +1213,10 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	      Some people have suggested using the Net::SMTP Perl module instead of NTsendmail or the other options listed here.  You can change processmail.pl to make this work.
-	    <TABLE
+>Some people have suggested using the Net::SMTP Perl module
+            instead of NTsendmail or the other options listed here. You can
+            change processmail.pl to make this work. 
+            <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -1019,8 +1225,10 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->&#13;my $smtp = Net::SMTP-&#62;new('&#60;Name of your SMTP server&#62;');   #connect to SMTP server
+CLASS="programlisting"
+>&#13;
+
+my $smtp = Net::SMTP-&#62;new('&#60;Name of your SMTP server&#62;');   #connect to SMTP server
 $smtp-&#62;mail('&#60;your name&#62;@&#60;you smpt server&#62;');# use the sender's adress here
 $smtp-&#62;to($tolist); # recipient's address
 $smtp-&#62;data();  # Start the mail
@@ -1028,14 +1236,18 @@ $smtp-&#62;datasend($msg);
 $smtp-&#62;dataend();   # Finish sending the mail
 $smtp-&#62;quit;    # Close the SMTP connection
 $logstr = "$logstr; mail sent to $tolist $cclist";
-}&#13;</PRE
+}
+
+
+            </PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-here is a test mail program for Net::SMTP:
-<TABLE
+
+            here is a test mail program for Net::SMTP: 
+            <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -1044,8 +1256,10 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->&#13;use Net::SMTP;
+CLASS="programlisting"
+>&#13;
+
+use Net::SMTP;
  my $smtp = Net::SMTP-&#62;new('&#60;Name of your SMTP server', Timeout =&#62; 30, Debug
 =&#62; 1, ); # connect to SMTP server
                  $smtp-&#62;auth;
@@ -1057,13 +1271,16 @@ recipient's address
                 $smtp-&#62;datasend('test');
                 $smtp-&#62;dataend();   # Finish sending the mail
                 $smtp-&#62;quit;    # Close the SMTP connection
-exit;&#13;</PRE
+exit;
+
+
+            </PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-	    </P
+            </P
 ></TD
 ></TR
 ></TABLE
@@ -1071,11 +1288,11 @@ exit;&#13;</PRE
 ></LI
 ><LI
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -1091,49 +1308,58 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	      This step is optional if you are using IIS or another
-	      web server which only decides on an interpreter based
-	      upon the file extension (.pl), rather than the
-	      <SPAN
+>This step is optional if you are using IIS or another web
+            server which only decides on an interpreter based upon the file
+            extension (.pl), rather than the 
+            <SPAN
 CLASS="QUOTE"
 >"shebang"</SPAN
-> line (#/usr/bonsaitools/bin/perl)
-	    </P
+>
+
+            line (#/usr/bonsaitools/bin/perl)</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ><P
->	    Modify the path to perl on the first line (#!) of all
-	    files to point to your Perl installation, and add
-	    <SPAN
+>Modify the path to perl on the first line (#!) of all files
+          to point to your Perl installation, and add 
+          <SPAN
 CLASS="QUOTE"
 >"perl"</SPAN
-> to the beginning of all Perl system
-	    calls that use a perl script as an argument.  This may
-	    take you a while. There is a <SPAN
+>
+
+          to the beginning of all Perl system calls that use a perl script as
+          an argument. This may take you a while. There is a 
+          <SPAN
 CLASS="QUOTE"
 >"setperl.csh"</SPAN
 >
-	    utility to speed part of this procedure, available in the
-	    <A
+
+          utility to speed part of this procedure, available in the 
+          <A
 HREF="patches.html"
 >Useful Patches and Utilities for Bugzilla</A
-> section of The Bugzilla Guide.
-	    However, it requires the Cygwin GNU-compatible environment
-	    for Win32 be set up in order to work.  See <A
+>
+
+          section of The Bugzilla Guide. However, it requires the Cygwin
+          GNU-compatible environment for Win32 be set up in order to work.
+          See 
+          <A
 HREF="http://www.cygwin.com/"
 TARGET="_top"
 >http://www.cygwin.com/</A
-> for details on obtaining Cygwin.
-	  </P
+>
+
+          for details on obtaining Cygwin.</P
 ></LI
 ><LI
 ><P
->	    Modify the invocation of all system() calls in all perl
-	    scripts in your Bugzilla directory.  For instance, change
-	    this line in processmail: 
-	    <TABLE
+>Modify the invocation of all system() calls in all perl
+          scripts in your Bugzilla directory. You should specify the full
+          path to perl for each system() call. For instance, change this line
+          in processmail: 
+          <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -1142,65 +1368,62 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
-> 
-system ("./processmail.pl",@ARGLIST); 
-	    </PRE
-></FONT
-></TD
-></TR
-></TABLE
-> to
-	    <TABLE
-BORDER="0"
-BGCOLOR="#E0E0E0"
-WIDTH="100%"
-><TR
-><TD
-><FONT
-COLOR="#000000"
-><PRE
-CLASS="PROGRAMLISTING"
-> 
-system ("perl processmail.pl",@ARGLIST);
-	    </PRE
+CLASS="programlisting"
+>&#13; 
+system ("./processmail",@ARGLIST); 
+        &#60;/programlisting&#62; to
+        &#60;programlisting&#62; 
+system ("C:\\perl\\bin\\perl", "processmail", @ARGLIST);
+
+          </PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-	  </P
+          </P
 ></LI
 ><LI
 ><P
->            Add <TT
-CLASS="FUNCTION"
+>Add 
+          <TT
+CLASS="function"
 >binmode()</TT
-> calls so attachments
-	    will work (<A
+>
+
+          calls so attachments will work (
+          <A
 HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=62000"
 TARGET="_top"
->bug 62000</A
->).
-          </P
-><P
->            Because Microsoft Windows based systems handle binary
-	    files different than Unix based systems, you need to add
-	    the following lines to
-	    <TT
-CLASS="FILENAME"
+>bug
+          62000</A
+>
+
+          ).</P
+><P
+>Because Microsoft Windows based systems handle binary files
+          different than Unix based systems, you need to add the following
+          lines to 
+          <TT
+CLASS="filename"
 >createattachment.cgi</TT
->  and
-	    <TT
-CLASS="FILENAME"
+>
+
+          and 
+          <TT
+CLASS="filename"
 >showattachment.cgi</TT
-> before the
-	    <TT
-CLASS="FUNCTION"
+>
+
+          before the 
+          <TT
+CLASS="function"
 >require 'CGI.pl';</TT
-> line.</P
+>
+
+          line.</P
 ><P
-><TABLE
+>&#13;            <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -1209,9 +1432,12 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->binmode(STDIN);
-binmode(STDOUT);</PRE
+CLASS="programlisting"
+>&#13;
+binmode(STDIN);
+binmode(STDOUT);
+
+            </PRE
 ></FONT
 ></TD
 ></TR
@@ -1219,11 +1445,11 @@ binmode(STDOUT);</PRE
 >
           </P
 ><DIV
-CLASS="NOTE"
+CLASS="note"
 ><P
 ></P
 ><TABLE
-CLASS="NOTE"
+CLASS="note"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -1239,21 +1465,35 @@ ALT="Note"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->              According to <A
+>According to 
+            <A
 HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=62000"
 TARGET="_top"
->bug 62000</A
->, the perl documentation says that you should always use <TT
-CLASS="FUNCTION"
+>&#13;            bug 62000</A
+>
+
+            , the perl documentation says that you should always use 
+            <TT
+CLASS="function"
 >binmode()</TT
-> when dealing with binary files, but never when dealing with text files.  That seems to suggest that rather than aribtrarily putting <TT
-CLASS="FUNCTION"
+>
+
+            when dealing with binary files, but never when dealing with text
+            files. That seems to suggest that rather than arbitrarily putting
+            
+            <TT
+CLASS="function"
 >binmode()</TT
-> at the begining of the attachment files, there should be logic to determine if <TT
-CLASS="FUNCTION"
+>
+
+            at the beginning of the attachment files, there should be logic
+            to determine if 
+            <TT
+CLASS="function"
 >binmode()</TT
-> is needed or not.
-            </P
+>
+
+            is needed or not.</P
 ></TD
 ></TR
 ></TABLE
@@ -1262,11 +1502,11 @@ CLASS="FUNCTION"
 ></OL
 ></DIV
 ><DIV
-CLASS="TIP"
+CLASS="tip"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
+CLASS="tip"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -1282,13 +1522,12 @@ ALT="Tip"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  If you are using IIS or Personal Web Server, you must add cgi
-	  relationships to Properties -&#62; Home directory (tab) -&#62;
-	  Application Settings (section) -&#62; Configuration (button),
-	  such as: 
-	</P
+>If you are using IIS or Personal Web Server, you must add cgi
+        relationships to Properties -&#62; Home directory (tab) -&#62;
+        Application Settings (section) -&#62; Configuration (button), such
+        as:</P
 ><P
->	  <TABLE
+>&#13;        <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -1297,39 +1536,34 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
-> 
-.cgi to: &#60;perl install directory&#62;\perl.exe %s %s
-.pl to: &#60;perl install directory&#62;\perl.exe %s %s
-GET,HEAD,POST
-	  </PRE
+CLASS="programlisting"
+>.cgi to: &#60;perl install directory&#62;\perl.exe %s
+        %s .pl to: &#60;perl install directory&#62;\perl.exe %s %s
+        GET,HEAD,POST</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
-> 
-	  Change the path to Perl to match your
-	  install, of course.
-	</P
+>
+
+        Change the path to Perl to match your install, of course.</P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ></DIV
 ><DIV
-CLASS="SECTION"
+CLASS="section"
 ><H2
-CLASS="SECTION"
+CLASS="section"
 ><A
-NAME="ADDLWINTIPS"
->3.6.2. Additional Windows Tips</A
-></H2
+NAME="addlwintips">4.3.2. Additional Windows Tips</H2
 ><DIV
-CLASS="TIP"
+CLASS="tip"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
+CLASS="tip"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -1345,27 +1579,25 @@ ALT="Tip"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  From Andrew Pearson:
-	  <A
-NAME="AEN1212"
-></A
-><BLOCKQUOTE
+>From Andrew Pearson: 
+        <A
+NAME="AEN1172"><BLOCKQUOTE
 CLASS="BLOCKQUOTE"
 ><P
->	      You can make Bugzilla work with Personal Web Server for
-	      Windows 98 and higher, as well as for IIS 4.0.
-	      Microsoft has information available at <A
-HREF="            http://support.microsoft.com/support/kb/articles/Q231/9/98.ASP"
+>You can make Bugzilla work with Personal Web Server for
+          Windows 98 and higher, as well as for IIS 4.0. Microsoft has
+          information available at 
+          <A
+HREF=" http://support.microsoft.com/support/kb/articles/Q231/9/98.ASP"
 TARGET="_top"
-> http://support.microsoft.com/support/kb/articles/Q231/9/98.ASP</A
+>&#13;          http://support.microsoft.com/support/kb/articles/Q231/9/98.ASP</A
 >
-	    </P
+          </P
 ><P
->	      Basically you need to add two String Keys in the
-	      registry at the following location:
-	    </P
+>Basically you need to add two String Keys in the registry at
+          the following location:</P
 ><P
->	      <TABLE
+>&#13;            <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -1374,40 +1606,38 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\ScriptMap
-	      </PRE
+CLASS="programlisting"
+>&#13;            HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\ScriptMap</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
 >
-	    </P
+          </P
 ><P
->	      The keys should be called ".pl" and ".cgi", and both
-	      should have a value something like:
-	      <B
-CLASS="COMMAND"
+>The keys should be called ".pl" and ".cgi", and both should
+          have a value something like: 
+          <B
+CLASS="command"
 >c:/perl/bin/perl.exe "%s" "%s"</B
 >
-	    </P
+          </P
 ><P
->	      The KB article only talks about .pl, but it goes into
-	      more detail and provides a perl test script.
-	    </P
+>The KB article only talks about .pl, but it goes into more
+          detail and provides a perl test script.</P
 ></BLOCKQUOTE
 >
-	</P
+        </P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ><DIV
-CLASS="TIP"
+CLASS="tip"
 ><P
 ></P
 ><TABLE
-CLASS="TIP"
+CLASS="tip"
 WIDTH="100%"
 BORDER="0"
 ><TR
@@ -1423,26 +1653,25 @@ ALT="Tip"></TD
 ALIGN="LEFT"
 VALIGN="TOP"
 ><P
->	  If attempting to run Bugzilla 2.12 or older, you will need
-	  to remove encrypt() calls from the Perl source. This is
-	  <EM
+>If attempting to run Bugzilla 2.12 or older, you will need to
+        remove encrypt() calls from the Perl source. This is 
+        <EM
 >not necessary</EM
-> for Bugzilla 2.13 and
-	  later, which includes the current release, Bugzilla
-	  2.14.
-	  <DIV
-CLASS="EXAMPLE"
+>
+
+        for Bugzilla 2.13 and later, which includes the current release,
+        Bugzilla &#38;bz-ver;. 
+        <DIV
+CLASS="example"
 ><A
-NAME="AEN1224"
-></A
-><P
+NAME="AEN1184"><P
 ><B
->Example 3-4. Removing encrypt() for Windows NT Bugzilla version
-	      2.12 or earlier</B
+>Example 4-3. Removing encrypt() for Windows NT Bugzilla version 2.12 or
+          earlier</B
 ></P
 ><P
->	      Replace this:   
-	      <TABLE
+>Replace this: 
+          <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -1451,18 +1680,18 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->  
-SendSQL("SELECT encrypt(" . SqlQuote($enteredpwd) . ", " . SQLQuote(substr($realcryptpwd, 0, 2)) . ")");
-my $enteredcryptpwd = FetchOneColumn();
-	      </PRE
+CLASS="programlisting"
+>SendSQL("SELECT encrypt(" . SqlQuote($enteredpwd) .
+          ", " . SQLQuote(substr($realcryptpwd, 0, 2)) . ")"); my
+          $enteredcryptpwd = FetchOneColumn();</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
-> 
-with this:   
-	      <TABLE
+>
+
+          with this: 
+          <TABLE
 BORDER="0"
 BGCOLOR="#E0E0E0"
 WIDTH="100%"
@@ -1471,112 +1700,30 @@ WIDTH="100%"
 ><FONT
 COLOR="#000000"
 ><PRE
-CLASS="PROGRAMLISTING"
->  
-my $enteredcryptpwd = $enteredpwd   
-	      </PRE
+CLASS="programlisting"
+>my $enteredcryptpwd = $enteredpwd</PRE
 ></FONT
 ></TD
 ></TR
 ></TABLE
-> 
-	      in cgi.pl.
-	    </P
+>
+
+          in cgi.pl.</P
 ></DIV
 >
-	</P
+        </P
 ></TD
 ></TR
 ></TABLE
 ></DIV
 ></DIV
-><DIV
-CLASS="SECTION"
-><H2
-CLASS="SECTION"
-><A
-NAME="BZLDAP"
->3.6.3. Bugzilla LDAP Integration</A
-></H2
-><P
->	What follows is some late-breaking information on using the
-	LDAP authentication options with Bugzilla.  The author has not
-	tested these (nor even formatted this section!) so please
-	contribute feedback to the newsgroup.
-      </P
-><P
-CLASS="LITERALLAYOUT"
->Mozilla::LDAP&nbsp;module<br>
-<br>
-The&nbsp;Mozilla::LDAP&nbsp;module&nbsp;allows&nbsp;you&nbsp;to&nbsp;use&nbsp;LDAP&nbsp;for&nbsp;authentication&nbsp;to<br>
-the&nbsp;Bugzilla&nbsp;system.&nbsp;&nbsp;This&nbsp;module&nbsp;is&nbsp;not&nbsp;required&nbsp;if&nbsp;you&nbsp;are&nbsp;not&nbsp;using<br>
-LDAP.<br>
-<br>
-Mozilla::LDAP&nbsp;(aka&nbsp;PerLDAP)&nbsp;is&nbsp;available&nbsp;for&nbsp;download&nbsp;from<br>
-http://www.mozilla.org/directory.<br>
-<br>
-NOTE:&nbsp;The&nbsp;Mozilla::LDAP&nbsp;module&nbsp;requires&nbsp;Netscape's&nbsp;Directory&nbsp;SDK.<br>
-Follow&nbsp;the&nbsp;link&nbsp;for&nbsp;"Directory&nbsp;SDK&nbsp;for&nbsp;C"&nbsp;on&nbsp;that&nbsp;same&nbsp;page&nbsp;to<br>
-download&nbsp;the&nbsp;SDK&nbsp;first.&nbsp;&nbsp;After&nbsp;you&nbsp;have&nbsp;installed&nbsp;this&nbsp;SDK,&nbsp;then<br>
-install&nbsp;the&nbsp;PerLDAP&nbsp;module.<br>
-----------------------------------------------------------------------<br>
-<br>
-Post-Installation&nbsp;Checklist<br>
-----------------------------------------------------------------------<br>
-Set&nbsp;useLDAP&nbsp;to&nbsp;"On"&nbsp;**only**&nbsp;if&nbsp;you&nbsp;will&nbsp;be&nbsp;using&nbsp;an&nbsp;LDAP&nbsp;directory<br>
-for&nbsp;authentication.&nbsp;&nbsp;Be&nbsp;very&nbsp;careful&nbsp;when&nbsp;setting&nbsp;up&nbsp;this&nbsp;parameter;<br>
-if&nbsp;you&nbsp;set&nbsp;LDAP&nbsp;authentication,&nbsp;but&nbsp;do&nbsp;not&nbsp;have&nbsp;a&nbsp;valid&nbsp;LDAP&nbsp;directory<br>
-set&nbsp;up,&nbsp;you&nbsp;will&nbsp;not&nbsp;be&nbsp;able&nbsp;to&nbsp;log&nbsp;back&nbsp;in&nbsp;to&nbsp;Bugzilla&nbsp;once&nbsp;you&nbsp;log<br>
-out.&nbsp;&nbsp;(If&nbsp;this&nbsp;happens,&nbsp;you&nbsp;can&nbsp;get&nbsp;back&nbsp;in&nbsp;by&nbsp;manually&nbsp;editing&nbsp;the<br>
-data/params&nbsp;file,&nbsp;and&nbsp;setting&nbsp;useLDAP&nbsp;back&nbsp;to&nbsp;0.)<br>
-<br>
-If&nbsp;using&nbsp;LDAP,&nbsp;you&nbsp;must&nbsp;set&nbsp;the&nbsp;three&nbsp;additional&nbsp;parameters:<br>
-<br>
-Set&nbsp;LDAPserver&nbsp;to&nbsp;the&nbsp;name&nbsp;(and&nbsp;optionally&nbsp;port)&nbsp;of&nbsp;your&nbsp;LDAP&nbsp;server.<br>
-If&nbsp;no&nbsp;port&nbsp;is&nbsp;specified,&nbsp;it&nbsp;defaults&nbsp;to&nbsp;the&nbsp;default&nbsp;port&nbsp;of&nbsp;389.&nbsp;&nbsp;(e.g<br>
-"ldap.mycompany.com"&nbsp;or&nbsp;"ldap.mycompany.com:1234")<br>
-<br>
-Set&nbsp;LDAPBaseDN&nbsp;to&nbsp;the&nbsp;base&nbsp;DN&nbsp;for&nbsp;searching&nbsp;for&nbsp;users&nbsp;in&nbsp;your&nbsp;LDAP<br>
-directory.&nbsp;&nbsp;(e.g.&nbsp;"ou=People,o=MyCompany")&nbsp;&nbsp;uids&nbsp;must&nbsp;be&nbsp;unique&nbsp;under<br>
-the&nbsp;DN&nbsp;specified&nbsp;here.<br>
-<br>
-Set&nbsp;LDAPmailattribute&nbsp;to&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;attribute&nbsp;in&nbsp;your&nbsp;LDAP<br>
-directory&nbsp;which&nbsp;contains&nbsp;the&nbsp;primary&nbsp;email&nbsp;address.&nbsp;&nbsp;On&nbsp;most&nbsp;directory<br>
-servers&nbsp;available,&nbsp;this&nbsp;is&nbsp;"mail",&nbsp;but&nbsp;you&nbsp;may&nbsp;need&nbsp;to&nbsp;change&nbsp;this.<br>
-----------------------------------------------------------------------<br>
-<br>
-(Not&nbsp;sure&nbsp;where&nbsp;this&nbsp;bit&nbsp;should&nbsp;go,&nbsp;but&nbsp;it's&nbsp;important&nbsp;that&nbsp;it&nbsp;be&nbsp;in<br>
-there&nbsp;somewhere...)<br>
-----------------------------------------------------------------------<br>
-Using&nbsp;LDAP&nbsp;authentication&nbsp;for&nbsp;Bugzilla:<br>
-<br>
-The&nbsp;existing&nbsp;authentication&nbsp;scheme&nbsp;for&nbsp;Bugzilla&nbsp;uses&nbsp;email&nbsp;addresses<br>
-as&nbsp;the&nbsp;primary&nbsp;user&nbsp;ID,&nbsp;and&nbsp;a&nbsp;password&nbsp;to&nbsp;authenticate&nbsp;that&nbsp;user.&nbsp;&nbsp;All<br>
-places&nbsp;within&nbsp;Bugzilla&nbsp;where&nbsp;you&nbsp;need&nbsp;to&nbsp;deal&nbsp;with&nbsp;user&nbsp;ID&nbsp;(e.g<br>
-assigning&nbsp;a&nbsp;bug)&nbsp;use&nbsp;the&nbsp;email&nbsp;address.<br>
-<br>
-The&nbsp;LDAP&nbsp;authentication&nbsp;builds&nbsp;on&nbsp;top&nbsp;of&nbsp;this&nbsp;scheme,&nbsp;rather&nbsp;than<br>
-replacing&nbsp;it.&nbsp;&nbsp;The&nbsp;initial&nbsp;log&nbsp;in&nbsp;is&nbsp;done&nbsp;with&nbsp;a&nbsp;username&nbsp;and&nbsp;password<br>
-for&nbsp;the&nbsp;LDAP&nbsp;directory.&nbsp;&nbsp;This&nbsp;then&nbsp;fetches&nbsp;the&nbsp;email&nbsp;address&nbsp;from&nbsp;LDAP<br>
-and&nbsp;authenticates&nbsp;seamlessly&nbsp;in&nbsp;the&nbsp;standard&nbsp;Bugzilla&nbsp;authentication<br>
-scheme&nbsp;using&nbsp;this&nbsp;email&nbsp;address.&nbsp;&nbsp;If&nbsp;an&nbsp;account&nbsp;for&nbsp;this&nbsp;address<br>
-already&nbsp;exists&nbsp;in&nbsp;your&nbsp;Bugzilla&nbsp;system,&nbsp;it&nbsp;will&nbsp;log&nbsp;in&nbsp;to&nbsp;that<br>
-account.&nbsp;&nbsp;If&nbsp;no&nbsp;account&nbsp;for&nbsp;that&nbsp;email&nbsp;address&nbsp;exists,&nbsp;one&nbsp;is&nbsp;created<br>
-at&nbsp;the&nbsp;time&nbsp;of&nbsp;login.&nbsp;&nbsp;(In&nbsp;this&nbsp;case,&nbsp;Bugzilla&nbsp;will&nbsp;attempt&nbsp;to&nbsp;use&nbsp;the<br>
-"displayName"&nbsp;or&nbsp;"cn"&nbsp;attribute&nbsp;to&nbsp;determine&nbsp;the&nbsp;user's&nbsp;full&nbsp;name.)<br>
-<br>
-After&nbsp;authentication,&nbsp;all&nbsp;other&nbsp;user-related&nbsp;tasks&nbsp;are&nbsp;still&nbsp;handled<br>
-by&nbsp;email&nbsp;address,&nbsp;not&nbsp;LDAP&nbsp;username.&nbsp;&nbsp;You&nbsp;still&nbsp;assign&nbsp;bugs&nbsp;by&nbsp;email<br>
-address,&nbsp;query&nbsp;on&nbsp;users&nbsp;by&nbsp;email&nbsp;address,&nbsp;etc.<br>
-----------------------------------------------------------------------<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P
-></DIV
 ></DIV
 ><DIV
 CLASS="NAVFOOTER"
 ><HR
 ALIGN="LEFT"
 WIDTH="100%"><TABLE
+SUMMARY="Footer navigation table"
 WIDTH="100%"
 BORDER="0"
 CELLPADDING="0"
@@ -1587,7 +1734,8 @@ WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
 ><A
-HREF="geninstall.html"
+HREF="extraconfig.html"
+ACCESSKEY="P"
 >Prev</A
 ></TD
 ><TD
@@ -1596,6 +1744,7 @@ ALIGN="center"
 VALIGN="top"
 ><A
 HREF="index.html"
+ACCESSKEY="H"
 >Home</A
 ></TD
 ><TD
@@ -1603,7 +1752,8 @@ WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
 ><A
-HREF="administration.html"
+HREF="osx.html"
+ACCESSKEY="N"
 >Next</A
 ></TD
 ></TR
@@ -1612,20 +1762,21 @@ HREF="administration.html"
 WIDTH="33%"
 ALIGN="left"
 VALIGN="top"
->Installation General Notes</TD
+>Optional Additional Configuration</TD
 ><TD
 WIDTH="34%"
 ALIGN="center"
 VALIGN="top"
 ><A
 HREF="installation.html"
+ACCESSKEY="U"
 >Up</A
 ></TD
 ><TD
 WIDTH="33%"
 ALIGN="right"
 VALIGN="top"
->Administering Bugzilla</TD
+>Mac OS X Installation Notes</TD
 ></TR
 ></TABLE
 ></DIV
diff --git a/docs/images/CVS/Entries b/docs/images/CVS/Entries
index 3588514ef..0a580a42c 100644
--- a/docs/images/CVS/Entries
+++ b/docs/images/CVS/Entries
@@ -1,7 +1,7 @@
-/caution.gif/1.1/Thu Aug 23 14:30:18 2001/-kb/TBUGZILLA-2_14_5
-/dbschema.jpg/1.1/Wed Aug 29 17:25:34 2001/-kb/TBUGZILLA-2_14_5
-/dbschema.ps/1.1/Wed Aug 29 17:25:34 2001/-kb/TBUGZILLA-2_14_5
-/note.gif/1.1/Thu Aug 23 14:30:18 2001/-kb/TBUGZILLA-2_14_5
-/tip.gif/1.1/Thu Aug 23 14:30:19 2001/-kb/TBUGZILLA-2_14_5
-/warning.gif/1.1/Thu Aug 23 14:30:20 2001/-kb/TBUGZILLA-2_14_5
+/caution.gif/1.2/Wed May  8 21:16:44 2002/-kb/TBUGZILLA-2_16
+/dbschema.jpg/1.1/Wed Aug 29 17:25:34 2001/-kb/TBUGZILLA-2_16
+/dbschema.ps/1.1/Wed Aug 29 17:25:34 2001/-kb/TBUGZILLA-2_16
+/note.gif/1.1/Thu Aug 23 14:30:18 2001/-kb/TBUGZILLA-2_16
+/tip.gif/1.2/Wed May  8 21:16:44 2002/-kb/TBUGZILLA-2_16
+/warning.gif/1.2/Wed May  8 21:16:44 2002/-kb/TBUGZILLA-2_16
 D
diff --git a/docs/images/CVS/Tag b/docs/images/CVS/Tag
index cc64cc0c3..f2ec6389c 100644
--- a/docs/images/CVS/Tag
+++ b/docs/images/CVS/Tag
@@ -1 +1 @@
-NBUGZILLA-2_14_5
+NBUGZILLA-2_16
diff --git a/docs/images/caution.gif b/docs/images/caution.gif
index c6bfd65bc004747cafb403ebde3845df0cbc9eb3..a48223013719fb656fefe7905b059259d1c5c4ac 100644
GIT binary patch
literal 134
zcmZ?wbhEHb<Y$m!IK;rf@SoxTe};mF2_WWw1W^3R!pOkDz@P&nKx!G7y*YMCo!hWe
zL234uD1+AfGt4srUQC=`yeQMGY1Id}XYS?S-frTaH{CEUfBQp$MC~O$J1ow2H49#z
bp_#<wn&nnu8@cQJwJfb)u9GIRFjxZsjp8{E

literal 260
zcmZ?wbhEHblxJ{YSjfP@@SoxTe};mF2@DJjia%Kx85kHCbU*}1o`LCVOaIE#Z}}I`
z5owLSdsk6kj$=l8!)y<xGzqSGnwy%U*KRUMS#9yyO8hl%nus+2_1SNtJZ7<o%;D|y
zipYM|6VZA_{llTRS=-O*uy9T5I-arh=N&!q{XTDO?ABg9T(#o&Ux&2v<3Zbxm3_Ki
zUNqH3;_8>rPt`cDRd9q$ut``*Mpl}vVAqT~>cLrc@@A#-_o9|rmmX_bCs@xeGU$HE
zdZe3U(xxq^c6~__F>=|_zU9ue>)Jn7Z&;EQHN$Oo<tmHg$uA;|tEJ-_le<lMH%9B-
Op2sb(|383%!5RR{hi<L_

diff --git a/docs/images/tip.gif b/docs/images/tip.gif
index fe2a1d56597d8bef0fbe49f532ab0a9f7f4dac26..c8d5ae9bd68fbef4488eeb9433d7755654384e04 100644
GIT binary patch
delta 591
zcmZn=KFi7J?&)S>nW)4dvXQfgss8@}0mYvzj0_C_>lt(y7#J9o7(^HtIQ}t|O5PAn
zaBE2XFQgT7Vnd>H>>RZpkGAB@)Qhca>n%KSapAhI(>1!k4{LI{_%U*n#Qc2!cz&#?
z){>P9E*$Ey?He4L)lU1H`s#?XMI7@yaoRn;L*w_SXU~?}?^-0mA#xzhbed~x%bt>x
zZKg8uS8mKucu~(8*mZaV%Ymy3TwRj9(_@7q9}2bUndPKdx;<%XvKL(}u~@oQ*wp3B
z3RWRSB}KMWmqYs`4=nZz;@Ft9HZra3rXquY-b<~o9W1IoyO>xWeDLSx3tfM^##2m%
zTfw0`AeQl&_p}8;l^#>MgpPJ8dWJ1~<8kSYyqv?KO;?^Jo;+GF>pb)Qjs>iWzU(Q&
z0;?Uh7PKewTiMPr-?>29TUmCl$KE92gOes|Yx2bIa9VwHhMc>?m5FkDPB=1V^Gtly
z#JzDr(g~r4KSA!Shj|39c$LLmI4Rh9!095FI7d^fv`NefK>>r74GtXgOCE7+#VdSn
zkya}+IjOd?V8cOHd7VN=8&lIwBEH6Rau)S)USkn>;?*Hx)WBg@Qs}7aUDnbr-|;88
eL*ZaRpsIV?%9JB)5(+<3-F<6>T-+HM8LR<%o-Ymn

delta 1803
zcmX@h*&xj6?&)S>ndr)(yOFbpsh(kgfZ|UUMh1qIdIlYk16&z&85}tNF`VR(@z}87
zU^9oXR!l^|^mVBMwYtJeg*WHh@3L_1O!5wA@bkB@<O*nO&}-8O=86e>7{nScRJ*mL
z)6rWzz--dZ0~1wG82Y#v#WpN?aPesBrfDy`7M;GK96x8;$v?uWZ0cE8;uN@!@JMY{
zZw%>}p?auZVV<sUM(l<q$-dM0dZk_#TwE!v$+`Z<hK<4xr>ly)am9E}JTytsS)3<!
zr<1p%aZ2*1FE<KQE*eaoVa#u1`0{|7_)3?;2OAb1W#y4))A1}_C}^rWD>=EYDCs6Q
z6VqLZpPLT~v>D5oSerb^o<5zSHth^o!HZ3Ao@?4`J^kX|QNN~px14R&XH`kT)KhEz
z)&Bg%wn`_qPjBwe!<m^=oY|OIwS*Je*0Nn)z#Y=ee4Ib@ui!#2<6Mo;N10DP5MWV=
zT*KJG*AP+UuD*hy;HcDr11`-vGdLD`Yc73qkVSL-ltpd=!Y+YLqPh}EEh@7k43COT
zcr(FU=!i*kcO9!|qI<oL_#dZ-f_f@NTsnCLM#qfiuK949)rKR8Q!I7IM<!mIG)n;`
zZw)gBNhOISX7yNwX+EmP87rU7%GtJZlAiDu^Tv<>N0y1s#uiW9nGeetwH4<XJrQuJ
zpRmE3wIl3<ht#n>Dn}MO6<nI9*Z!yRsPKh747?_r0v@(2UkzF8$(&Q~rh3H1P_+D{
z-gJg!=Zb%&4;+qEWN9Qj8w>wXI-%$Pr!k~DP*?b<!L9(w296yP7aX*u7d|-7Q@5an
zQEi*h#53Y&S2UiKHsd+K%wO8_yOq~PfU!|^;}Y*vQfC#euAVzbriq<_%i+LbRpA$x
z95h*MoR~Nl2V7!Q^YT3q!=S}dZ!RDg>7wBy7O5d{<go7tfg|yH9xs{{U+$XlPF8P6
z0i&*z!vr@etC9(9MovBn+)AttlRO#czStPRUvi<*fuHs6B6q_*ClpOs`3f9PICV^L
z>N+lW{1dm<A_=1tLf#BXC-lRwG&U|eEMU-J*tm+Nh1Fn>Ad?3748cQ6@@o#xs@HE^
zpma=ppF;3K;ffuCW&d(6MqKhSp0j4tNzqdd$%k04#RxfQRv&LWu29#|)ZxG^!PKZA
z&LYep+PnH@i|TwG!4{>t)B7aV*;Jl(sIB{wWL47cQ8iI#lgRdN7vV30hZWmh9NpyB
zYl~Ee7=(Ut51Q;|cuYd-XHw6>udMbL6zi8Om2&!s-uNrzB9&_5`2O%0PY2bmABu;5
zDxGm?6<)II<%v0gb2py;BbqS5P5Sn-#>Tt-9G^H&&)ISAV@+a1Z;lGXXU9IZUrSUi
zZgOfl{b2qk_mL@}L5cCChnvBqj||cYOw9flSVhlmkYm<Sj!!;u!i_Jm&4_0)|L-Qg
zxhco%Ii-F)66!T_Gv;w&5&OWv{!bvFZFQ4lw};GQA92fjODr~a2XB4OKfQs?IAa6P
z8Uttk91SMks2vlGITrEeGPM2Mmd3*~L4o(c0T#7?Y8;L{3j_re4oT^4Xo(Ox%JAl4
zi;_qp19ON2<0%D3gNBQ2em9i3))pMmTeM&z=NWyjdXDC1t|LJcq-q*D{${f9%PD9p
zeMn$<e5=#ohyqWdMgx0fL6lC=hPITLrn0z-rYgITuFMIC1j=7{NVNrarG+fyx}MO;
zml4ux>2gT;w1nHbQ%V9hKNL7D7zFqxE$oul(BLQ*naRzu*>}QHZ;|?)41#ivjgMZq
za7b#la`+U~ua@1Q#F^m0Bvll^p|_@qXV1TcBfJd;O}+*TSPU8tAKLW6(t*K=NAPpw
z_M(N1tTB#R8z;1xL>X|1|4?OR*l<MD=mKM*lLGUEh-OKTfJVa`k65%{9FfaWlXjW2
zl!3K_RqIk|s}RQl$z=^p=edO1RF^b}teCM<HRu5o!<Gl)^=%uD=m!-r$_hBLoen;t
z?H9oOlJ|+&+zD;R>mF{2*U%MPV&SSF!_XZf;Usaqg88T1!d9t@gR4?@9OZ~=;Ns75
z<lp_mNm;Jo5dVt=&h-|o3@wG6%nD5mj2;KLA81WTKd?wlpny@qV?qy8MS?&xg9B4m
z$CW4-Cgy_{jLCvV6}@6C$&xyEniWeX@aP^;V$EtucGHkBztvoFNMPm*htT&4o!$jW
z+zbj#oGqcZn+=jV<un-NSe&}F_c#dbIO41j5D?RR;1F}*k7h0wBbLk%Cc(ChHXV_$
kyUlwZ2r%z#;Bhcy<w;n%N8{mPV+R3twFhj*jEoG{0R2>iyZ`_I

diff --git a/docs/images/warning.gif b/docs/images/warning.gif
index c6f3ea9c9c3295e6c51c014ce5f029e1fc605e9c..693ffc3e8a2c014046fb3a5c78ee069a2ef9d479 100644
GIT binary patch
literal 140
zcmZ?wbhEHblwy!%SjYeZ{}~wmgMs2t7DfgJW(FOQC`g`xDRxf3*u=Lxugx~NB>lEF
z^4+z}`+`-ECvZBIEt+_$Z{@D88{7<AJ<nR^Jl?~yUv{y%%Bu#OfK3^5&V*c;YqD~Q
n>s;=&)5V;9R(cl{`21^&y}RBzrt7rmC#%za=U<DnGFSrus;@fc

literal 151
zcmZ?wbhEHblwpuzSjYeZ{}~wm|Np;#|9-`vEQ|~c%nUjpQII?XQ^uVBm8T`-XZaYM
zi@ZPeX5Q6IdC@*UjaeDLQky2Myehr@Gk3U|3WEdR%^g+t3f+cZE|$!Z77TZ`ntFP{
zl=j78{p}CEv%k#Qu)}DIW!;Q}i9(jqI_~Uon{9WUn*QR~zGM6n94FK}i~<-KtO4(W
BI_v-d

diff --git a/docs/rel_notes.txt b/docs/rel_notes.txt
index 7d51670ad..06fbcf844 100644
--- a/docs/rel_notes.txt
+++ b/docs/rel_notes.txt
@@ -1,18 +1,11 @@
-The 2.14.5 release fixes some security issues in 2.14.4.  Please see the
-upgrade procedure below for details on how to upgrade to 2.14.5.
-
-*** PLEASE NOTE ***: The Bugzilla team no longer supports the 2.14 branch.
-This is the last point release of 2.14, there will not be any more.   From
-this point onwards if any additional security holes are discovered, you
-will need to upgrade to a newer branch (i.e. 2.16.2 or later) or you will 
-be on your own in patching your installation. 
-
-Regarding security issues, please note that the 2.16 line (2.16.2 was 
-released simultaneous with 2.14.5) incorporates various rearchitectures 
-that make failure-to-validate and failure-to-filter errors harder to 
-insert and easier to spot.  In particular this means there may be holes 
-in the 2.14 line that have not been discovered, yet are fixed in the 
-2.16 line.
+After (as usual) far too long a period, the Bugzilla Team
+is relieved to finally announce Bugzilla 2.16.
+
+This release adds significant new abilities to Bugzilla,
+both for the administrator and the user. The most important,
+and time-consuming of these features is the templatisation
+of all user-facing scripts, allowing administrators to 
+easily customise the look and feel of their Bugzilla.
 
 **************************
 *** ABOUT THIS VERSION ***
@@ -23,7 +16,7 @@ bugzilla.mozilla.org unless otherwise specified.
 
 *** Recommended Practice For The Upgrade ***
 
-As always, please ensure you have run checksetup.pl after
+As always, please ensure you have ran checksetup.pl after
 replacing the files in your installation.
 
 It is recommended that you view the sanity check page
@@ -34,9 +27,8 @@ problems with your installation.
 It is also recommended that if you can, you immediately fix
 any problems you find.  Be aware that if the sanity check page
 contains more errors after an upgrade, it doesn't necessarily
-mean there are more errors in your database, as additional
-tests are added to the sanity check over time, and it is likely
-those errors weren't being checked for in the old version.
+mean there are more errors in your database, as it is likely
+they weren't being checked for in the old version.
 
 Failure to do this may mean that bugzilla will not
 work correctly.
@@ -47,24 +39,42 @@ available to enterprising individuals.  This includes the
 localconfig file and the entire data directory.  Please
 see the Bugzilla Guide for more information.
 
-*** Deprecated Features ***
-
-- The 2.16 line is the last stable release that will work with
-  MySQL version 3.22.  Bugzilla in CVS requires at least 
-  version 3.23.6.  (bug 87958)
+*** Dependency Requirements ***
+
+MySQL v3.22.5
+Perl v5.005
+DBI v1.13
+DBD::MySQL v1.2209
+AppConfig v1.52
+Template Toolkit v2.07
+Text::Wrap v20001.0131
+File::Spec v0.82
+Data::Dumper, Date::Parse, CGI::Carp (any)
+GD v1.19 (optional)
+Chart::Base v0.99 (optional)
+XML::Parser (any)
 
-- The 2.16 line is the last stable release to support the
-  "shadow" database.  The replacement (using MySQL's built-in
-  replication) is not present in 2.14.5 or 2.16.2, but we
-  expect that very few sites use this feature, so we are not
-  planning a transition period.  If this would cause a problem
-  for you, please comment on the below bug.  (bug 124589)
+*** Deprecated Features ***
 
-- Placing comments in localconfig is deprecated.  If you have
-  done this, they will likely get nuked with some post-2.16
-  version of Bugzilla, as checksetup.pl will likely
-  automatically rewrite localconfig to automatically get the
-  latest instructional comments.  (bug 147776)
+- This is possibly the last stable release that will work with
+  MySQL version 3.22.  Soon Bugzilla will require at least
+  version 3.23.x.  The exact minimum version number required
+  has not yet been decided.
+  (bug 87958)
+
+- This is possibly the last stable release to support the
+  shadow database.  The replacement (using MySQL's built in
+  replication) is not present in 2.16, but we expect that
+  very few sites use this feature, so we are not planning a
+  transition period.  If this would cause a problem for you,
+  please comment on the below bug.
+  (bug 124589)
+
+- Placing comments in localconfig is deprecated.  If you have done
+  this, they will likely get nuked with future version of
+  Bugzilla, as checksetup.pl will likely automatically rewrite localconfig
+  to automatically get the latest comments.
+  (bug 147776)
 
 *** Outstanding Issues Of Note ***
 
@@ -74,12 +84,6 @@ bugs, please see the bug report numbers listed to find out the
 status of the fix for these bugs, or to obtain a patch that can
 fix the problem on your installation.
 
-- Bug counts (on reports.cgi) can be very slow if you have to
-  count a lot of bugs.  In this case the connection can time
-  out before the page finishes loading.  Extending the cgi
-  timeout on your web server might help this situation.
-  (bug 63249)
-
 - Renaming or removing keywords that are in use will not update
   the "keyword cache" on bugs, and queries on keywords may not work
   properly, until you rebuild the cache on the sanity check page
@@ -96,13 +100,6 @@ fix the problem on your installation.
   parameter on the Edit Parameters page (editparams.cgi).
   (bug 37765)
 
-- The new options to let people see a bug when their name
-  is on it but who aren't in the groups the bug is restricted
-  to only allow people to view bugs if they know the bug number.
-  It still will not show up in these people's buglists and
-  they will not receive email about changes to the bugs.
-  (bugs 95024, 97469)
-
 - Users behind rotating transparent proxies or otherwise having
   an IP that changes each URL fetch will find they need to log in
   regularly.
@@ -114,78 +111,241 @@ fix the problem on your installation.
   the MySQL optimiser.
   (bug 96101)
 
+- It is recommended you use the high speed XS Stash of the Template
+  Toolkit, in order to achieve best performance.  However, there are
+  known problems with XS Stash and Perl 5.005_02 and lower.  If you
+  wish to use these older versions of Perl, please use the regular
+  stash.  You are asked which stash you want to use at Template Toolkit
+  installation time.
+  (bug 140674)
+
 - Querying on CC takes too long on big databases.
   (bug 127200)
 
+- Attachment changes have no midair collision detection, unlike bug changes.
+  (bug 99215)
+
 - The email preferences option "Priority, status, severity, and/or milestone
   changes" does not actually report status changes.  You can however use the
   option "The bug is resolved or verified" to achieve part of this.
   (bug 130821)
 
 ***********************************************
-*** USERS UPGRADING FROM 2.14.4 OR EARLIER  ***
+*** USERS UPGRADING FROM 2.14.2 OR EARLIER  ***
 ***********************************************
 
 *** SECURITY ISSUES RESOLVED ***
 
-- Fixed a cross site scriptability issue in quips.  This is only a problem
-  if quips with HTML could have been inserted into your quips files.  Bugzilla
-  has not allowed this since 2.12.
-  (bug 179329)
-- checksetup.pl will now attempt to prevent access to "editor backups" of
-  localconfig.
-  (bug 186383)
-- collectstats.pl no longer makes data/mining (which contains graphing
-  information) world writeable.
-  (bug 183188)
+- The bug reporter could set the priority even when
+  'letsubmitterchoosepriority' was off.
+  (bug 63018)
 
-***********************************************
-*** USERS UPGRADING FROM 2.14.3 OR EARLIER  ***
-***********************************************
+- Most CGIs are now templatised.  This helps to make it
+  easier to remember to HTML filter values and easier to spot
+  when they are not, preventing cross site scripting attacks.
+  (bug 86168)
 
-*** SECURITY ISSUES RESOLVED ***
-
-- When a new product is added to an installation with 47 groups or more and
-  "usebuggroups" is enabled, the new group will be assigned a groupset bit
-  using Perl math that is not exact beyond 2^48.  This results in the new
-  group being defined with a "bit" that has several bits set.  As users are
-  given access to the new group, those users will also gain access to
-  spurious lower group privileges.  Also, group bits were not always reused
-  when groups were deleted.
-  (bug 167485)
-
-- The email interface had another insecure single parameter system call.  This
-  could potentially allow arbitrary shell commands to be run.  This file is
-  not supported at this time, but as long as we knew about the problem, we
-  couldn't overlook it.
-  (bug 163024)
+- Most CGIs now run in taint mode.  This helps to prevent
+  failure to validate errors.
+  (bug 108982)
 
-*** Bug fixes of note ***
+*** IMPORTANT CHANGES ***
 
-- The email interface was broken.  This was a 2.14.3 regression.  This file
-  is not supported at this time, but as long as we knew about the problem, we
-  couldn't overlook it.
-  (bug 160631)
+- 2.16 introduces "templatisation", a new feature that allows
+  administrators to easily customise the HTML output (the "look and feel")
+  of Bugzilla without altering Perl code.  Bugzilla uses the
+  "Template Toolkit" for this.  Please see the "Template Customisation"
+  section of the Bugzilla Guide for more details.
+
+  Administrators who ran the 2.15 development version and customised
+  templates should check the templates are still valid, as file names
+  and file paths have changed.
+
+  Most output is now templatised.  This process will be complete next
+  milestone.
+
+  For speed, compiled templates are cached on disk.  If you modify the
+  templates, the toolkit will normally detect the changes, and recompile the
+  changed templates.
+
+  Adding new directories anywhere inside the template directory may cause 
+  permission errors if you don't have a webservergroup specified in
+  localconfig.  If you see these, rerun checksetup.pl as root.  If you do not
+  have root access, or cannot get someone who does to do this for you, you can
+  rename the data/template directory to data/template.old (or any other name
+  Bugzilla doesn't use).  Then rerun checksetup.pl to regenerate the compiled
+  templates.
+  (bug 86168, 97832)
+
+- Administrators can now configure maximum attachment sizes.  These
+  should remain below the maximum size for your MySQL server, or you
+  will get obscure MySQL errors if you attach a bigger attachment.
+
+  To find out the current size attachment that MySQL can accept, type
+  the command 'mysqladmin variables' and find out the value of the
+  'max_allowed_packet' varible in bytes.
+
+  To change the maximum size that MySQL can accept you can alter this
+  variable in your 'my.cnf' file.
+  (bug 91664)
+
+- Perl 5.004 is no longer supported because the Template Toolkit
+  requires 5.005.
+  (bug 97721)
+
+- New module requirements: Text::Wrap, Template [requires AppConfig],
+                           File::Spec.
+  (bugs 97784, 84338, 103778)
+
+- The index page is now a CGI instead of an HTML page.  You should remove
+  any existing index.html file and make sure your web server allows index.cgi
+  to be the default page in a directory.  If you are not able to do that you
+  can instead set index_html in the 'localconfig' file to 1 and checksetup.pl
+  will create a redirect page for you.
+  (bug 80183)
+
+- It is now recommended that administrators run "processmail rescanall"
+  after upgrading to 2.16 or beyond.
+
+  This will send out notification emails for changes that were
+  made but not emailed, due to Bugzilla bugs.  All known
+  causes of this have been fixed in this version (bug 104589 and 99519).
+
+  It is also recommended that this be run nightly to avoid
+  lengthy delays in future if this problem reoccurs.
+  (bug 106377)
+
+- In parallel with templatisation, a lot of changes have been made to the HTML
+  output of the Bugzilla CGIs.  This could break code that attempts to parse
+  such code.  For example, this breaks mozbot.
+  (no bug number)
+
+- The "HTML template" parameters (headerhtml, bodyhtml, footerhtml,
+  errorhtml, bannerhtml, blurbhtml, mostfreqhtml, entryheaderhtml) have now
+  been moved to Template Toolkit templates.  If you have modified these
+  parameters you will need to make corresponding changes to the corresponding
+  templates.  Your old parameter values will be moved to a file called
+  old-params.txt by checksetup.pl.
+
+  The old parameters correspond to files in template/en/default as follows:
+
+  headerhtml:      global/header.html.tmpl
+  footerhtml:      global/footer.html.tmpl
+  bannerhtml:      global/banner.html.tmpl
+  blurbhtml:       global/banner.html.tmpl
+  mostfreqhtml:    reports/duplicates*.html.tmpl
+  entryheaderhtml: bug/create/user-message.html.tmpl
+
+  (bug 140437)
 
-***********************************************
-*** USERS UPGRADING FROM 2.14.2 OR EARLIER  ***
-***********************************************
-
-*** SECURITY ISSUES RESOLVED ***
+*** Other changes of note ***
 
-- Basic maintenance on contrib/bug_email.pl and
-  contrib/bugzilla_email_append.pl which also fixes a
-  possible security hole with a misuse of a system() call.
-  These files are not supported at this time, but as long
-  as we knew about the problem, we couldn't overlook it.
-  (bug 154008)
+- The query page has been redesigned for better user friendliness.
+  (bug 98707)
+- Users can now change their email account.
+  (bug 23067)
+- "Dependent Bug Changed" notification emails now contain the
+  dependent bug's summary and URL.
+  (bug 28736, 113383)
+- Bugs with severity "critical", "blocker", and "enhancement" are
+  visually differentiated on bug lists for browsers with sufficient
+  CSS support.
+  (bug 28884)
+- Bugzilla now has a sidebar for the Mozilla browser.
+  (bug 37339)
+- A link to just created attachments now appears in notification
+  email.
+  (bug 66651)
+- Comments now have numbers and can be referenced with
+  autohyperlinkifying similar to bugs.
+  (bug 71840)
+- The attachment system has been rewritten, supporting new
+  "attachment statuses" (like keywords, but for attachments),
+  the ability to obsolete attachments, edit attachment MIME type,
+  and edit whether the attachment is a patch.
+  (bugs 84338, 75176)
+- syncshadowdb now supports a configurable temp file location,
+  and properly shuts down Bugzilla while running.
+  (bug 75840)
+- Dependency tree now lets you exclude resolved bugs and bugs
+  below a specified depth.
+  (bugs 83058)
+- The "strictvaluechecks" parameter has gone away.  These checks
+  are now always done.
+  (bug 119715)
+- The midair collision page now shows all changes since the bug
+  page was loaded, not just the last one.
+  (bug 108312)
+- Added support for making dependency graphs with 'dot', which
+  is better at creating complex graphs than 'webdot'.
+  (bug 120537)
 
 *** Bug fixes of note ***
 
-- The fix for bug 130821 in 2.14.2 broke being able to sort
-  bug lists on more than one field.  buglist.cgi now allows
-  you to sort on more than one field again.
-  (bug 152138)
+- Bugzilla scripts are now usually not terminated when the browser
+  window they are running in is closed.  This caused hard to
+  reproduce bugs.
+  (bug 104589)
+- On browsers that "reflow" the page, large component / milestone /
+  version fields were extremely slow to reflow when you altered
+  the product field.
+  (bug 96534)
+- The selection in the component / milestone / version fields is
+  no longer lost when you change the selection in the product
+  field or use the back/forward buttons in your browser to return
+  to the page.
+  (bug 97966)
+- You could not reverse dependencies in one step.
+  (bug 82143)
+- Mass reassignment of non-open bugs will no longer reopen them.
+  (bug 30731)
+- Attempting to bulk change no bugs will now give a user-friendly
+  error message.
+  (bug 90333)
+- If you make a change to a bug where you only add yourself to CC,
+  email notifications are now properly sent out for MySQL 3.23.
+  (bug 99519)
+- Bug entry now properly validates the data it has been sent.
+  (bug 107743)
+- Midair collision checks will now properly work in all situations
+  where dependencies have changed.
+  (bug 73502)
+- Browsers can no longer corrupt the params file if they use the "wrong"
+  end-of-line markers.
+  (bug 92500)
+- The MySQL port defined in localconfig is now properly honoured.
+  (bug 98368)
+- Apostrophes in component/milestone/version names no longer cause
+  a problem on the query page.
+  (bug 30689/42810)
+- File attachment comments will now wrap.
+  (bug 52060)
+- Saved queries are no longer mangled if you need to log in again,
+  for example if you had cookies off.
+  (bug 38835)
+- Bug counts (on reports.cgi) were very slow if you had to
+  count a lot of bugs.
+  (bug 63249)
+- 2.14 introduced options to let people see a bug when their name
+  is on it but who aren't in the groups the bug is restricted
+  to.  These only allowed the people to view the bugs directly,
+  and not see them on buglists and receive email about them.
+  (bugs 95024, 97469)
+- A new 'cookiepath' parameter on editparams.cgi allows multiple
+  Bugzilla installations to exist on one host without problems.
+  (bug 19910)
+- whineatnews.pl now respects the 'sendmailnow' parameter.
+  (bug 52782)
+- The query page came up even when Bugzilla was shut down.
+  (bug 121747)
+- Quicksearch gave a weird error message when Bugzilla was
+  shut down.
+  (bug 121741)
+- Operating system detection fixes.
+  (bugs 92763, 135666)
+- QA contacts now receive emails when a new bug is created and
+  their only email preference was being added or removed from QA.
+  (bug 143091)
 
 ***********************************************
 *** USERS UPGRADING FROM 2.14.1 OR EARLIER  ***
diff --git a/docs/sgml/Bugzilla-Guide.sgml b/docs/sgml/Bugzilla-Guide.sgml
index 8f2136bd8..b8868a618 100644
--- a/docs/sgml/Bugzilla-Guide.sgml
+++ b/docs/sgml/Bugzilla-Guide.sgml
@@ -1,4 +1,4 @@
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" [
 
 <!-- Include macros -->
 <!ENTITY about SYSTEM "about.sgml">
@@ -16,17 +16,17 @@
 <!ENTITY database SYSTEM "database.sgml">
 <!ENTITY patches SYSTEM "patches.sgml">
 <!ENTITY variants SYSTEM "variants.sgml">
-<!ENTITY requiredsoftware SYSTEM "requiredsoftware.sgml">
+<!ENTITY introduction SYSTEM "introduction.sgml">
 <!ENTITY revhistory SYSTEM "revhistory.sgml">
 
-<!ENTITY bz "http://www.mozilla.org/projects/bugzilla">
-<!ENTITY bz-ver "2.14">
-<!ENTITY bz-cvs-ver "2.15">
-<!ENTITY bzg-date "August 10, 2001">
-<!ENTITY bzg-ver "2.14">
-<!ENTITY bzg-cvs-ver "2.15.0">
-<!ENTITY bzg-auth "Matthew P. Barnson">
-<!ENTITY bzg-auth-email "<email>barnboy@trilobyte.net</email>">
+<!ENTITY bz "http://www.bugzilla.org/">
+<!ENTITY bz-ver "2.16">
+<!ENTITY bz-cvs-ver "2.17">
+<!ENTITY bzg-date "April 2nd, 2002">
+<!ENTITY bzg-ver "2.16">
+<!ENTITY bzg-cvs-ver "2.17.0">
+<!ENTITY bzg-auth "The Bugzilla Team">
+<!ENTITY bzg-bugs "<ulink url='http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla&amp;component=Documentation'>Bugzilla</ulink>">
 <!ENTITY mysql "http://www.mysql.com/">
 <!ENTITY perl-ver "5.6.1">
 
@@ -59,128 +59,56 @@ try to avoid clutter and feel free to waste space in the code to make it more re
 
   <bookinfo>
     <title>The Bugzilla Guide</title>
-    <pubdate>2001-04-25</pubdate>
-    <revhistory>
-      <revision>
-	<revnumber>v2.11</revnumber>
-	<date>20 December 2000</date>
-	<authorinitials>MPB</authorinitials>
-	<revremark>
-	  Converted the README, FAQ, and DATABASE information into
-	  SGML docbook format.
-	</revremark>
-      </revision>
-
-      <revision>
-	<revnumber>2.11.1</revnumber>
-	<date>06 March 2001</date>
-	<authorinitials>MPB</authorinitials>
-	<revremark>
-	  Took way too long to revise this for 2.12 release. Updated
-	  FAQ to use qandaset tags instead of literallayout, cleaned
-	  up administration section, added User Guide section,
-	  miscellaneous FAQ updates and third-party integration
-	  information. From this point on all new tags are lowercase
-	  in preparation for the 2.13 release of the Guide in XML
-	  format instead of SGML.
-	</revremark>
-      </revision>
-      
-      <revision>
-	<revnumber>2.12.0</revnumber>
-	<date>24 April 2001</date>
-	<authorinitials>MPB</authorinitials>
-	<revremark>
-	  Things fixed this release: Elaborated on queryhelp
-	  interface, added FAQ regarding moving bugs from one keyword
-	  to another, clarified possible problems with the Landfill
-	  tutorial, fixed a boatload of typos and unclear sentence
-	  structures.  Incorporated the README into the UNIX
-	  installation section, and changed the README to indicate the
-	  deprecated status.  Things I know need work:  Used
-	  "simplelist" a lot, where I should have used "procedure" to
-	  tag things.  Need to lowercase all tags to be XML compliant.
-	</revremark>
-      </revision>
-      
-      <revision>
-	<revnumber>2.14.0</revnumber>
-	<date>07 August 2001</date>
-	<authorinitials>MPB</authorinitials>
-	<revremark>
-	  Attempted to integrate relevant portions of the UNIX and
-	  Windows installation instructions, moved some data from FAQ
-	  to Install, removed references to README from text, added
-	  Mac OS X install instructions, fixed a bunch
-	  of tpyos (Mark Harig), linked text that referenced other
-	  parts of the Guide, and nuked the old MySQL permissions
-	  section.
-	</revremark>
-      </revision>
-    </revhistory>
 
     <authorgroup>
-
       <author>
-	<firstname>Matthew</firstname>
-	<othername>P.</othername>
-	<surname>Barnson</surname>
-	<affiliation>
-	  <address><email>barnboy@trilobyte.net</email></address>
-	</affiliation>
+        <firstname>Matthew</firstname>
+        <othername>P.</othername>
+        <surname>Barnson</surname>
+      </author>
+      <author>
+        <firstname>The</firstname>
+        <othername>Bugzilla</othername>
+        <surname>Team</surname>
       </author>
-
-      <collab>
-	<collabname>Zach Lipton</collabname>
-	<affiliation>
-	  <address><email>zach AT zachlipton DOT com</email></address>
-	</affiliation>
-      </collab>
-
     </authorgroup>
 
     <abstract>
       <para>
-	This is the documentation for Bugzilla, the Mozilla
-	bug-tracking system.
+	      This is the documentation for Bugzilla, the mozilla.org
+	      bug-tracking system.
+	      Bugzilla is an enterprise-class piece of software
+	      that powers issue-tracking for hundreds of
+	      organizations around the world, tracking millions of bugs.
       </para>
-      <para>
-	Bugzilla is an enterprise-class set of software utilities
-	that, when used together, power issue-tracking for hundreds of
-	organizations around the world, tracking millions of bugs.
-	While it is easy to use and quite flexible, it is very
-	difficult for a novice to install and maintain.  Although we
-	have provided step-by-step directions, Bugzilla is not always
-	easy to get working.  Please be sure the person responsible
-	for installing and maintaining this software is a qualified
-	professional on operating system upon which you install
-	Bugzilla.
-      </para>
-      <para>
-	THIS DOCUMENTATION IS MAINTAINED IN DOCBOOK 4.1 SGML FORMAT.
-	IF YOU WISH TO MAKE CORRECTIONS, PLEASE MAKE THEM IN PLAIN
-	TEXT OR SGML DIFFS AGAINST THE SOURCE.  I CANNOT ACCEPT
-	ADDITIONS TO THE GUIDE WRITTEN IN HTML!
+
+      <para>  
+	      This documentation is maintained in DocBook 4.1.2 XML format.
+        Changes are best submitted as plain text or SGML diffs, attached
+        to a bug filed in
+        <ulink url="http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla&amp;component=Documentation">mozilla.org's Bugzilla</ulink>.
       </para>
     </abstract>
 
-
-    <KEYWORDSET>
-      <KEYWORD>Bugzilla</KEYWORD>
-      <KEYWORD>Guide</KEYWORD>
-      <KEYWORD>installation</KEYWORD>
-      <KEYWORD>FAQ</KEYWORD>
-      <KEYWORD>administration</KEYWORD>
-      <KEYWORD>integration</KEYWORD>
-      <KEYWORD>MySQL</KEYWORD>
-      <KEYWORD>Mozilla</KEYWORD>
-      <KEYWORD>webtools</KEYWORD>
-    </KEYWORDSET>
-  </BOOKINFO>
+    <keywordset>
+      <keyword>Bugzilla</keyword>
+      <keyword>Guide</keyword>
+      <keyword>installation</keyword>
+      <keyword>FAQ</keyword>
+      <keyword>administration</keyword>
+      <keyword>integration</keyword>
+      <keyword>MySQL</keyword>
+      <keyword>Mozilla</keyword>
+      <keyword>webtools</keyword>
+    </keywordset>
+  </bookinfo>
 
 <!-- About This Guide -->
 &about;
 
+<!-- Introduction -->
+&introduction;
+
 <!-- Using Bugzilla -->
 &using;
 
@@ -190,29 +118,17 @@ try to avoid clutter and feel free to waste space in the code to make it more re
 <!-- Administering Bugzilla -->
 &administration;
 
-<!-- Integrating Bugzilla with Third-Party Tools -->
-&integration;
-
-<!-- The Future of Bugzilla -->
-&future;
-
-<!-- Major Bugzilla Variants -->
-&variants;
-
 <!-- Appendix: The Frequently Asked Questions -->
 &faq;
 
-<!-- Appendix: Required Bugzilla Software Links -->
-&requiredsoftware
-
 <!-- Appendix: The Database Schema -->
 &database;
 
 <!-- Appendix: Custom Patches -->
 &patches;
 
-<!-- Appendix: The GNU Free Documentation License -->
-&gfdl;
+<!-- Appendix: Major Bugzilla Variants -->
+&variants;
 
 <!-- Glossary -->
 &glossary;
diff --git a/docs/sgml/CVS/Entries b/docs/sgml/CVS/Entries
index bb3acff08..7072af724 100644
--- a/docs/sgml/CVS/Entries
+++ b/docs/sgml/CVS/Entries
@@ -1,18 +1,18 @@
-/Bugzilla-Guide.sgml/1.6/Wed Aug 29 17:25:36 2001//TBUGZILLA-2_14_5
-/about.sgml/1.5/Wed Aug 29 17:25:36 2001//TBUGZILLA-2_14_5
-/administration.sgml/1.7/Wed Aug 29 17:25:36 2001//TBUGZILLA-2_14_5
-/conventions.sgml/1.2/Fri Aug 10 22:13:50 2001//TBUGZILLA-2_14_5
-/database.sgml/1.4/Wed Aug 29 17:25:36 2001//TBUGZILLA-2_14_5
-/dbschema.mysql/1.1/Fri Aug 10 22:13:50 2001//TBUGZILLA-2_14_5
-/faq.sgml/1.6/Wed Aug 29 17:25:38 2001//TBUGZILLA-2_14_5
-/future.sgml/1.5/Wed Aug 29 17:25:38 2001//TBUGZILLA-2_14_5
-/gfdl.sgml/1.2/Fri Aug 10 22:13:52 2001//TBUGZILLA-2_14_5
-/glossary.sgml/1.3/Wed Aug 22 03:44:31 2001//TBUGZILLA-2_14_5
-/index.sgml/1.2/Fri Aug 10 22:13:53 2001//TBUGZILLA-2_14_5
-/installation.sgml/1.7/Wed Aug 29 18:13:41 2001//TBUGZILLA-2_14_5
-/integration.sgml/1.5/Wed Aug 29 17:25:38 2001//TBUGZILLA-2_14_5
-/patches.sgml/1.5/Wed Aug 29 17:25:39 2001//TBUGZILLA-2_14_5
-/requiredsoftware.sgml/1.2/Fri Aug 10 22:13:54 2001//TBUGZILLA-2_14_5
-/using.sgml/1.5/Wed Aug 29 17:25:39 2001//TBUGZILLA-2_14_5
-/variants.sgml/1.4/Wed Aug 22 03:44:32 2001//TBUGZILLA-2_14_5
+/Bugzilla-Guide.sgml/1.11.2.4/Thu Jul 25 21:03:27 2002//TBUGZILLA-2_16
+/about.sgml/1.6.2.2/Sun May 12 16:15:29 2002//TBUGZILLA-2_16
+/administration.sgml/1.13.2.5/Thu Jul 25 21:03:28 2002//TBUGZILLA-2_16
+/conventions.sgml/1.4.2.4/Thu Jul 25 21:03:28 2002//TBUGZILLA-2_16
+/database.sgml/1.7.2.1/Sat May 25 15:36:06 2002//TBUGZILLA-2_16
+/dbschema.mysql/1.2/Wed May  8 23:19:09 2002//TBUGZILLA-2_16
+/faq.sgml/1.8.2.2/Sat Jul 13 07:53:28 2002//TBUGZILLA-2_16
+/gd-makefile.patch/1.1.2.1/Sun May 12 13:16:48 2002//TBUGZILLA-2_16
+/gfdl.sgml/1.4.2.1/Sun May 12 16:15:29 2002//TBUGZILLA-2_16
+/glossary.sgml/1.5.2.2/Sun May 12 16:15:29 2002//TBUGZILLA-2_16
+/index.sgml/1.3/Wed May  8 23:19:09 2002//TBUGZILLA-2_16
+/installation.sgml/1.18.2.5/Thu Jul 25 21:03:29 2002//TBUGZILLA-2_16
+/integration.sgml/1.7.2.2/Sat May 25 15:36:08 2002//TBUGZILLA-2_16
+/introduction.sgml/1.1.2.2/Thu Jul 25 21:03:29 2002//TBUGZILLA-2_16
+/patches.sgml/1.13.2.3/Sat May 25 15:36:10 2002//TBUGZILLA-2_16
+/using.sgml/1.10.2.5/Thu Jul 25 21:03:29 2002//TBUGZILLA-2_16
+/variants.sgml/1.6.2.5/Thu Jul 25 21:03:30 2002//TBUGZILLA-2_16
 D
diff --git a/docs/sgml/CVS/Tag b/docs/sgml/CVS/Tag
index cc64cc0c3..f2ec6389c 100644
--- a/docs/sgml/CVS/Tag
+++ b/docs/sgml/CVS/Tag
@@ -1 +1 @@
-NBUGZILLA-2_14_5
+NBUGZILLA-2_16
diff --git a/docs/sgml/about.sgml b/docs/sgml/about.sgml
index 04e054bc2..b4349644a 100644
--- a/docs/sgml/about.sgml
+++ b/docs/sgml/about.sgml
@@ -4,67 +4,17 @@
 <chapter id="about">
 <title>About This Guide</title>
 
-  <section id="aboutthisguide">
-    <title>Purpose and Scope of this Guide</title>
-    <para>
-      This document was started on September 17, 2000 by Matthew P.
-      Barnson after a great deal of procrastination updating the
-      Bugzilla FAQ, which I left untouched for nearly half a year.
-      After numerous complete rewrites and reformatting, it is the
-      document you see today.
-    </para>
-    <para>
-      Bugzilla is simply the best piece of bug-tracking software the
-      world has ever seen.  This document is intended to be the
-      comprehensive guide to  the installation, administration,
-      maintenance, and use of the Bugzilla bug-tracking system.
-    </para>
-    <para>
-      This release of the Bugzilla Guide is the
-      <emphasis>&bzg-ver;</emphasis> release. It is so named that it
-      may match the current version of Bugzilla. The numbering
-      tradition stems from that used for many free software projects,
-      in which <emphasis>even-numbered</emphasis> point releases (1.2,
-      1.14, etc.) are considered "stable releases", intended for
-      public consumption; on the other  hand,
-      <emphasis>odd-numbered</emphasis> point releases (1.3, 2.09,
-      etc.) are considered unstable <emphasis>development</emphasis>
-      releases intended for advanced users, systems administrators,
-      developers, and those who enjoy a lot of pain. 
-    </para>
-    <para>
-      Newer revisions of the Bugzilla Guide follow the numbering
-      conventions of the main-tree Bugzilla releases, available at
-      <ulink url="&bz;">&bz;</ulink>.  Intermediate releases will have
-      a minor revision number following a period.  The current version
-      of Bugzilla, as of this writing (&bzg-date;) is &bz-ver;; if
-      something were seriously wrong with that edition of the Guide,
-      subsequent releases would receive an additional dotted-decimal
-      digit to indicate the update (&bzg-ver;.1, &bzg-ver;.2, etc.).
-      Got it?  Good.
-    </para>
-    <para>
-      I wrote this in response to the enormous demand for decent
-      Bugzilla documentation. I have incorporated instructions from
-      the Bugzilla README, Frequently Asked Questions, Database Schema
-      Document, and various mailing lists to create it. Chances are,
-      there are glaring errors in this documentation; please contact
-      &bzg-auth-email; to correct them.
-    </para>
-  </section>
-
   <section id="copyright">
     <title>Copyright Information</title>
     <blockquote>
-      <attribution>Copyright (c) 2000-2001 &bzg-auth;</attribution>
+      <attribution>Copyright (c) 2000-2002 Matthew P. Barnson and &bzg-auth;</attribution>
       <para>
 	Permission is granted to copy, distribute and/or modify this
 	document under the terms of the GNU Free Documentation
 	License, Version 1.1 or any later version published  by the
 	Free Software Foundation; with no Invariant Sections, no
 	Front-Cover Texts, and  with no Back-Cover Texts.  A copy of
-	the license is included in the section entitled  "GNU Free
-	Documentation LIcense".
+	the license is included below.
       </para>
     </blockquote>
     <para>
@@ -72,6 +22,11 @@
       copyright, or publishing this document in non-electronic form,
       please contact &bzg-auth;. 
     </para>
+
+
+    <!-- The GNU Free Documentation License -->
+    &gfdl;
+
   </section>
 
   <section id="disclaimer">
@@ -79,12 +34,11 @@
     <para>
       No liability for the contents of this document can be accepted.
       Use the concepts, examples, and other content at your own risk.
-      As this is a new edition of this document, there may be errors
-      and inaccuracies that may damage your system.  Use of this
-      document may cause your girlfriend to leave you, your cats to
-      pee on your furniture and clothing, your computer to cease
-      functioning, your boss to fire you, and global thermonuclear
-      war.  Proceed with caution.
+      This document may contain errors
+      and inaccuracies that may damage your system, cause your partner 
+      to leave you, your boss to fire you, your cats to
+      pee on your furniture and clothing, and global thermonuclear
+      war. Proceed with caution.
     </para>
     <para>
       All copyrights are held by their respective owners, unless
@@ -94,7 +48,7 @@
     </para>
     <para>
       Naming of particular products or brands should not be seen as
-      endorsements, with the exception of the term "GNU/Linux".  I
+      endorsements, with the exception of the term "GNU/Linux".  We
       wholeheartedly endorse the use of GNU/Linux in every situation
       where it is appropriate.  It is an extremely versatile, stable,
       and robust operating system that offers an ideal operating
@@ -103,8 +57,7 @@
     <para>
       You are strongly recommended to make a backup of your system
       before installing Bugzilla and at regular intervals thereafter.
-      Heaven knows it's saved my bacon time after time; if you
-      implement any suggestion in  this Guide, implement this one!
+      If you implement any suggestion in this Guide, implement this one!
     </para>
     <para>
       Although the Bugzilla development team has taken great care to
@@ -116,7 +69,7 @@
       team members, Netscape Communications, America Online Inc., and
       any affiliated developers or sponsors assume no liability for
       your use of this product.  You have the source code to this
-      product, and are responsible for auditing it yourself to insure
+      product, and are responsible for auditing it yourself to ensure
       your security needs are met.
     </para>
   </section>
@@ -126,7 +79,8 @@
   <section id="newversions">
     <title>New Versions</title>
     <para>
-      This is the &bzg-ver; version of The Bugzilla Guide.  If you are
+      This is the &bzg-ver; version of The Bugzilla Guide. It is so named 
+      to match the current version of Bugzilla. If you are
       reading this from any source other than those below, please
       check one of these mirrors to make sure you are reading an
       up-to-date version of the Guide.
@@ -138,12 +92,7 @@
       <itemizedlist>
 	<listitem>
 	  <para>
-	    <ulink url="http://www.trilobyte.net/barnsons/">TriloBYTE</ulink>
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    <ulink url="http://www.mozilla.org/projects/bugzilla/">Mozilla.org</ulink>
+	    <ulink url="http://www.bugzilla.org/">bugzilla.org</ulink>
 	  </para>
 	</listitem>
 	<listitem>
@@ -155,9 +104,16 @@
       </itemizedlist>
     </para>
     <para>
-      The latest version of this document can be checked out via CVS.
-	Please follow the instructions available at <ulink
-							   url="http://www.mozilla.org/cvs.html">the Mozilla CVS page</ulink>, and check out the mozilla/webtools/bugzilla/docs/ branch.
+      The latest version of this document can always be checked out via CVS.
+	    Please follow the instructions available at 
+      <ulink url="http://www.mozilla.org/cvs.html">the Mozilla CVS page</ulink>,
+      and check out the <filename>mozilla/webtools/bugzilla/docs/</filename>
+      subtree.
+    </para>
+    <para>
+      The Bugzilla Guide is currently only available in English. 
+      If you would like to volunteer to translate it, please contact
+      <ulink url="mailto:justdave@syndicomm.com">Dave Miller</ulink>.
     </para>
   </section>
 
@@ -165,23 +121,28 @@
     <title>Credits</title>
     <para>
       The people listed below have made enormous contributions to the
-      creation of this Guide, through their dedicated hacking efforts,
+      creation of this Guide, through their writing, dedicated hacking efforts,
       numerous e-mail and IRC support sessions, and overall excellent
       contribution to the Bugzilla community:
     </para>
+    <para>
+      <ulink url="mailto://mbarnson@sisna.com">Matthew P. Barnson</ulink>
+      for the Herculaean task of pulling together the Bugzilla Guide and
+      shepherding it to 2.14.
+    </para>
     <para>
       <ulink url="mailto://terry@mozilla.org">Terry Weissman</ulink>
       for initially writing Bugzilla and creating the
       README upon which the UNIX installation documentation is largely based.
     </para>
     <para>
-      <ulink url="mailto://tara@tequilarista.org">Tara
-	Hernandez</ulink>  for keeping Bugzilla development going
-      strong after Terry left Mozilla.org
+      <ulink url="mailto://tara@tequilarista.org">Tara Hernandez</ulink>  
+      for keeping Bugzilla development going
+      strong after Terry left mozilla.org
     </para>
     <para>
-      <ulink url="mailto://dkl@redhat.com">Dave Lawrence</ulink> for
-      providing insight into the key differences between Red Hat's
+      <ulink url="mailto://dkl@redhat.com">Dave Lawrence</ulink> 
+      for providing insight into the key differences between Red Hat's
       customized Bugzilla, and being largely responsible for the "Red
       Hat Bugzilla" appendix
     </para>
@@ -191,42 +152,16 @@
       questions and arguments on irc.mozilla.org in #mozwebtools
     </para>
     <para>
-      Last but not least, all the members of the <ulink
-							url="news://news.mozilla.org/netscape/public/mozilla/webtools"> netscape.public.mozilla.webtools</ulink> newsgroup.  Without your discussions, insight, suggestions, and patches, this could never have happened.
+      Last but not least, all the members of the 
+      <ulink url="news://news.mozilla.org/netscape/public/mozilla/webtools"> netscape.public.mozilla.webtools</ulink> newsgroup.  Without your discussions, insight, suggestions, and patches, this could never have happened.
     </para>
-  </section>
-
-  <section id="contributors">
-<title>Contributors</title>
     <para>
-      Thanks go to these people for significant contributions to this
-      documentation (in no particular order):
+      Thanks also go to the following people for significant contributions 
+      to this documentation (in no particular order):
     </para>
     <para>
-      Andrew Pearson, Spencer Smith, Eric Hanson, Kevin Brannen, Ron
-      Teitelbaum, Jacob Steenhagen, Joe Robins
-    </para>
-  </section>
-  <section id="feedback">
-    <title>Feedback</title>
-    <para>
-      I welcome feedback on this document.  Without your submissions
-      and input, this Guide cannot continue to exist.  Please mail
-      additions, comments, criticisms, etc. to
-      <email>barnboy@trilobyte.net</email>.  Please send flames to
-      <email>devnull@localhost</email>
-    </para>
-  </section>
-
-  <section id="translations">
-    <title>Translations</title>
-    <para>
-      The Bugzilla Guide needs translators! Please volunteer your
-      translation into the language of your choice. If you will
-      translate this Guide, please notify the members of the
-      mozilla-webtools mailing list at
-      <email>mozilla-webtools@mozilla.org</email>, and arrange with
-      Matt Barnson to check it into CVS.
+      Zach Liption, Andrew Pearson, Spencer Smith, Eric Hanson, Kevin Brannen,
+      Ron Teitelbaum, Jacob Steenhagen, Joe Robins, Gervase Markham.
     </para>
   </section>
 
diff --git a/docs/sgml/administration.sgml b/docs/sgml/administration.sgml
index 98e726312..f932beb25 100644
--- a/docs/sgml/administration.sgml
+++ b/docs/sgml/administration.sgml
@@ -1,1441 +1,1220 @@
 <!-- <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> -->
-
 <chapter id="administration">
   <title>Administering Bugzilla</title>
-  <subtitle>
-    Or, I just got this cool thing installed.  Now what the heck do I
-    do with it?
-  </subtitle>
-  
-  <para>
-    So you followed <quote><xref linkend="installation"></quote> to the
-    letter, and logged into Bugzilla for the very first time with your
-    super-duper god account.  You sit, contentedly staring at the
-    Bugzilla Query Screen, the worst of the whole mad business of
-    installing this terrific program behind you. It seems, though, you
-    have nothing yet to query! Your first act of business should be to
-    setup the operating parameters for Bugzilla so you can get busy
-    getting data into your bug tracker.
-  </para>
-
-  <section id="postinstall-check">
-    <title>Post-Installation Checklist</title>
-    <para>
-      After installation, follow the checklist below to help ensure
-      that you have a successful installation. If you do not see a
-      recommended setting for a parameter, consider leaving it at the
-      default while you perform your initial tests on your Bugzilla
-      setup.
-    </para>
-      <indexterm>
-	<primary>checklist</primary>
-      </indexterm>
+
+  <section id="parameters">
+    <title>Bugzilla Configuration</title>
+
+    <para>Bugzilla is configured by changing various parameters, accessed
+    from the "Edit parameters" link in the page footer. Here are
+    some of the key parameters on that page. You should run down this
+    list and set them appropriately after installing Bugzilla.</para>
+
+    <indexterm>
+      <primary>checklist</primary>
+    </indexterm>
+
     <procedure>
       <step>
-	<para>
-	  Bring up <filename>editparams.cgi</filename> in your web
-	  browser.  This should be available as the <quote>edit
-	    parameters</quote> link from any Bugzilla screen once you
-	  have logged in.
-	</para>
+        <para> 
+        <command>maintainer</command>:
+        The maintainer parameter is the email address of the person 
+        responsible for maintaining this
+        Bugzilla installation. The address need not be that of a valid Bugzilla
+        account.</para>
       </step>
+
       <step>
-	<para>The <quote>maintainer</quote> is the email address of
-	  the person responsible for maintaining this Bugzilla
-	  installation.  The maintainer need not be a valid Bugzilla
-	  user.  Error pages, error emails, and administrative mail
-	  will be sent with the maintainer as the return email
-	  address.</para>
-	<para>
-	  Set <quote>maintainer</quote> to <emphasis>your</emphasis> email address.
-	  This allows Bugzilla's error messages to display your email
-	  address and allow people to contact you for help.
-	</para>
+        <para>
+        <command>urlbase</command>:
+        This parameter defines the fully qualified domain name and web 
+        server path to your Bugzilla installation.</para>
+
+        <para>For example, if your Bugzilla query page is
+        <filename>http://www.foo.com/bugzilla/query.cgi</filename>, 
+        set your <quote>urlbase</quote>
+        to <filename>http://www.foo.com/bugzilla/</filename>.</para>
       </step>
+
       <step>
-	<para>The <quote>urlbase</quote> parameter defines the fully
-	  qualified domain name and web server path to your Bugzilla
-	  installation.</para>
-	<para>
-	  For example, if your bugzilla query page is
-	  http://www.foo.com/bugzilla/query.cgi, set your
-	  <quote>urlbase</quote> is http://www.foo.com/bugzilla/.  
-	</para>
+        <para>
+        <command>usebuggroups</command>:
+        This dictates whether or not to implement group-based security for
+        Bugzilla. If set, Bugzilla bugs can have an associated 'group',
+        defining which users are allowed to see and edit the
+        bug.</para>
+
+        <para>Set "usebuggroups" to "on" 
+        <emphasis>only</emphasis>
+        if you may wish to restrict access to particular bugs to certain
+        groups of users. I suggest leaving
+        this parameter <emphasis>off</emphasis>
+        while initially testing your Bugzilla.</para>
       </step>
+
       <step>
-	<para><quote>usebuggroups</quote> dictates whether or not to
-	  implement group-based security for Bugzilla.  If set,
-	  Bugzilla bugs can have an associated groupmask defining
-	  which groups of users are allowed to see and edit the
-	  bug.</para>
-	<para>
-	  Set "usebuggroups" to "on" <emphasis>only</emphasis> if you
-	  may wish to restrict access to products. I suggest leaving
-	  this parameter <emphasis>off</emphasis> while initially
-	  testing your Bugzilla.  
-	</para>
+        <para>
+        <command>usebuggroupsentry</command>:
+        Bugzilla Products can have a group associated with them, so that
+        certain users can only see bugs in certain products. When this parameter
+        is set to <quote>on</quote>, this places all newly-created bugs in the
+        group for their product immediately.</para>
       </step>
+
       <step>
-	<para>
-	  <quote>usebuggroupsentry</quote>, when set to
-	  <quote>on</quote>, requires that all bugs have an associated
-	  groupmask when submitted.  This parameter is made for those
-	  installations where product isolation is a necessity.
-	</para>
-	<para>
-	  Set "usebuggroupsentry" to "on" if you absolutely need to
-	  restrict access to bugs from the moment they are submitted
-	  through resolution. Once again, if you are simply testing
-	  your installation, I suggest against turning this parameter
-	  on; the strict security checking may stop you from being
-	  able to modify your new entries.
-	</para>
+        <para>
+        <command>shadowdb</command>:
+        You run into an interesting problem when Bugzilla reaches a
+        high level of continuous activity. MySQL supports only table-level
+        write locking. What this means is that if someone needs to make a
+        change to a bug, they will lock the entire table until the operation
+        is complete. Locking for write also blocks reads until the write is
+        complete. The 
+        <quote>shadowdb</quote>
+        parameter was designed to get around this limitation. While only a
+        single user is allowed to write to a table at a time, reads can
+        continue unimpeded on a read-only shadow copy of the database.
+        Although your database size will double, a shadow database can cause
+        an enormous performance improvement when implemented on extremely
+        high-traffic Bugzilla databases.</para>
+        
+        <para>
+        As a guide, mozilla.org began needing 
+        <quote>shadowdb</quote>
+        when they reached around 40,000 Bugzilla users with several hundred
+        Bugzilla bug changes and comments per day.</para>
+
+        <para>The value of the parameter defines the name of the 
+        shadow bug database. 
+        Set "shadowdb" to e.g. "bug_shadowdb" if you will be running a
+        *very* large installation of Bugzilla. 
+        <note>
+          <para>Enabling "shadowdb" can adversely affect the stability of
+          your installation of Bugzilla. You should regularly check that your
+          database is in sync. It is often advisable to force a shadow
+          database sync nightly via 
+          <quote>cron</quote>.
+          </para>
+        </note>
+        </para>
+        
+        <para>If you use the "shadowdb" option, it is only natural that you
+        should turn the "queryagainstshadowdb" option on as well. Otherwise
+        you are replicating data into a shadow database for no reason!</para>
+
       </step>
+
       <step>
-	<para>
-	  You run into an interesting problem when Bugzilla reaches a
-	  high level of continuous activity.  MySQL supports only
-	  table-level write locking.  What this means is that if
-	  someone needs to make a change to a bug, they will lock the
-	  entire table until the operation is complete.  Locking for
-	  write also blocks reads until the write is complete.  The
-	  <quote>shadowdb</quote> parameter was designed to get around
-	  this limitation.  While only a single user is allowed to
-	  write to a table at a time, reads can continue unimpeded on
-	  a read-only shadow copy of the database.  Although your
-	  database size will double, a shadow database can cause an
-	  enormous performance improvement when implemented on
-	  extremely high-traffic Bugzilla databases.
-	</para>
         <para>
-	  Set "shadowdb" to "bug_shadowdb" if you will be running a
-	  *very* large installation of Bugzilla. The shadow database
-	  enables many simultaneous users to read and write to the
-	  database without interfering with one another.  
-	  <note>
-	    <para>
-	      Enabling "shadowdb" can adversely affect the stability
-	      of your installation of Bugzilla. You should regularly
-	      check that your database is in sync.  It is often
-	      advisable to force a shadow database sync nightly via
-	      <quote>cron</quote>.
-	    </para>
-	  </note> Once again, in testing you should avoid this option
-	  -- use it if or when you <emphasis>need</emphasis> to use
-	  it, and have repeatedly run into the problem it was designed
-	  to solve -- very long wait times while attempting to commit
-	  a change to the database.  Mozilla.org began needing
-	  <quote>shadowdb</quote> when they reached around 40,000
-	  Bugzilla users with several hundred Bugzilla bug changes and
-	  comments per day.
+        <command>shutdownhtml</command>:
+
+        If you need to shut down Bugzilla to perform administration, enter
+        some descriptive HTML here and anyone who tries to use Bugzilla will
+        receive a page to that effect. Obviously, editparams.cgi will
+        still be accessible so you can remove the HTML and re-enable Bugzilla.
+        :-)
         </para>
-	<para>
-	  If you use the "shadowdb" option, it is only natural that
-	  you should turn the "queryagainstshadowdb" option "On" as
-	  well.  Otherwise you are replicating data into a shadow
-	  database for no reason!
-	</para>
       </step>
+
       <step>
-	<para><quote>headerhtml</quote>, <quote>footerhtml</quote>,
-	  <quote>errorhtml</quote>, <quote>bannerhtml</quote>, and
-	  <quote>blurbhtml</quote> are all templates which control
-	  display of headers, footers, errors, banners, and additional
-	  data.  We could go into some detail regarding the usage of
-	  these, but it is really best just to monkey around with them
-	  a bit to see what they do.  I strongly recommend you copy
-	  your <filename>data/params</filename> file somewhere safe
-	  before playing with these values, though.  If they are
-	  changed dramatically, it may make it impossible for you to
-	  display Bugzilla pages to fix the problem until you have
-	  restored your <filename>data/params</filename> file.</para>
         <para>
-	  If you have custom logos or HTML you must put in place to
-	  fit within your site design guidelines, place the code in
-	  the "headerhtml", "footerhtml", "errorhtml", "bannerhtml",
-	  or "blurbhtml" text boxes.
-	  <note>
-	    <para>
-	      The "headerhtml" text box is the HTML printed out
-	      <emphasis>before</emphasis> any other code on the page,
-	      except the CONTENT-TYPE header sent by the Bugzilla
-	      engine. If you have a special banner, put the code for
-	      it in "bannerhtml". You may want to leave these settings
-	      at the defaults initially.
-	    </para>
-	  </note>
-	</para>
+        <command>passwordmail</command>:
+
+        Every time a user creates an account, the text of
+        this parameter (with substitutions) is sent to the new user along with
+        their password message.</para>
+
+        <para>Add any text you wish to the "passwordmail" parameter box. For
+        instance, many people choose to use this box to give a quick training
+        blurb about how to use Bugzilla at your site.</para>
       </step>
+
       <step>
-	<para><quote>passwordmail</quote> is rather simple.  Every
-	  time a user creates an account, the text of this parameter
-	  is read as the text to send to the new user along with their
-	  password message.</para>
         <para>
-	  Add any text you wish to the "passwordmail" parameter box.
-	  For instance, many people choose to use this box to give a
-	  quick training blurb about how to use Bugzilla at your site.
-        </para>
+        <command>useqacontact</command>:
+
+        This allows you to define an email address for each component, in
+        addition
+        to that of the default owner, who will be sent carbon copies of
+        incoming bugs.</para>
       </step>
       <step>
-	<para><quote>useqacontact</quote> allows you to define an
-	  email address for each component, in addition to that of the
-	  default owner, who will be sent carbon copies of incoming
-	  bugs.  The critical difference between a QA Contact and an
-	  Owner is that the QA Contact follows the component.  If you
-	  reassign a bug from component A to component B, the QA
-	  Contact for that bug will change with the reassignment,
-	  regardless of owner.</para>
-	<para><quote>usestatuswhiteboard</quote> defines whether you
-	  wish to have a free-form, overwritable field associated with
-	  each bug.  The advantage of the Status Whiteboard is that it
-	  can be deleted or modified with ease, and provides an
-	  easily-searchable field for indexing some bugs that have
-	  some trait in common.  Many people will put <quote>help
-	    wanted</quote>, <quote>stalled</quote>, or <quote>waiting
-	    on reply from somebody</quote> messages into the Status
-	  Whiteboard field so those who peruse the bugs are aware of
-	  their status even more than that which can be indicated by
-	  the Resolution fields.</para>
-	<para>
-	  Do you want to use the QA Contact ("useqacontact") and
-	  status whiteboard ("usestatuswhiteboard") fields? These
-	  fields are useful because they allow for more flexibility,
-	  particularly when you have an existing Quality Assurance
-	  and/or Release Engineering team,  but they may not be needed
-	  for many smaller installations.
-	</para>
+        <para>
+        <command>usestatuswhiteboard</command>:
+        This defines whether you wish to have a free-form, overwritable field
+        associated with each bug. The advantage of the Status Whiteboard is
+        that it can be deleted or modified with ease, and provides an
+        easily-searchable field for indexing some bugs that have some trait
+        in common.         
+        </para>
       </step>
+
       <step>
-	<para>
-	  Set "whinedays" to the amount of days you want to let bugs
-	  go in the "New" or "Reopened" state before notifying people
-	  they have untouched new bugs.  If you do not plan to use
-	  this feature, simply do not set up the whining cron job
-	  described in the installation instructions, or set this
-	  value to "0" (never whine).
-	</para>
+        <para>
+        <command>whinedays</command>:
+        Set this to the number of days you want to let bugs go
+        in the NEW or REOPENED state before notifying people they have
+        untouched new bugs. If you do not plan to use this feature, simply do
+        not set up the whining cron job described in the installation
+        instructions, or set this value to "0" (never whine).</para>
       </step>
+
       <step>
-	<para><quote>commenton</quote> fields allow you to dictate
-	  what changes can pass without comment, and which must have a
-	  comment from the person who changed them.  Often,
-	  administrators will allow users to add themselves to the CC
-	  list, accept bugs, or change the Status Whiteboard without
-	  adding a comment as to their reasons for the change, yet
-	  require that most other changes come with an
-	  explanation.</para>
-	<para>
-	  Set the "commenton" options according to your site policy.
-	  It is a wise idea to require comments when users resolve,
-	  reassign, or reopen bugs at the very least.
-	  <note>
-	    <para>
-	      It is generally far better to require a developer
-	      comment when resolving bugs than not. Few things are
-	      more annoying to bug database users than having a
-	      developer mark a bug "fixed" without any comment as to
-	      what the fix was (or even that it was truly fixed!)
-	    </para>
-	  </note>
-	</para>
+        <para>
+        <command>commenton*</command>:
+        All these
+        fields allow you to dictate what changes can pass without comment,
+        and which must have a comment from the person who changed them.
+        Often, administrators will allow users to add themselves to the CC
+        list, accept bugs, or change the Status Whiteboard without adding a
+        comment as to their reasons for the change, yet require that most
+        other changes come with an explanation.</para>
+
+        <para>Set the "commenton" options according to your site policy. It
+        is a wise idea to require comments when users resolve, reassign, or
+        reopen bugs at the very least. 
+        <note>
+          <para>It is generally far better to require a developer comment
+          when resolving bugs than not. Few things are more annoying to bug
+          database users than having a developer mark a bug "fixed" without
+          any comment as to what the fix was (or even that it was truly
+          fixed!)</para>
+        </note>
+        </para>
       </step>
+
       <step>
-	<para>The <quote>supportwatchers</quote> option can be an
-	  exceptionally powerful tool in the hands of a power Bugzilla
-	  user.  By enabling this option, you allow users to receive
-	  email updates whenever other users receive email updates.
-	  This is, of course, subject to the groupset restrictions on
-	  the bug; if the <quote>watcher</quote> would not normally be
-	  allowed to view a bug, the watcher cannot get around the
-	  system by setting herself up to watch the bugs of someone
-	  with bugs outside her priveleges.  She would still only
-	  receive email updates for those bugs she could normally
-	  view.</para>
-	<para>For Bugzilla sites which require strong inter-Product
-	  security to prevent snooping, watchers are not a good
-	  idea.</para>
-	<para>
-	  However, for most sites you should set
-	  <quote>supportwatchers</quote> to "On".  This feature is
-	  helpful for team leads to monitor progress in their
-	  respective areas, and can offer many other benefits, such as
-	  allowing a developer to pick up a former engineer's bugs
-	  without requiring her to change all the information in the
-	  bug.
-	</para>
+        <para>
+        <command>supportwatchers</command>:
+
+        Turning on this option allows users to ask to receive copies of 
+        all a particular other user's bug email. This is, of
+        course, subject to the groupset restrictions on the bug; if the 
+        <quote>watcher</quote>
+        would not normally be allowed to view a bug, the watcher cannot get
+        around the system by setting herself up to watch the bugs of someone
+        with bugs outside her privileges. They would still only receive email
+        updates for those bugs she could normally view.</para>        
       </step>
     </procedure>
   </section>
 
   <section id="useradmin">
     <title>User Administration</title>
-    <para>
-      User administration is one of the easiest parts of Bugzilla.
-      Keeping it from getting out of hand, however, can become a
-      challenge.
-    </para>
 
     <section id="defaultuser">
       <title>Creating the Default User</title>
 
-      <para>
-	When you first run checksetup.pl after installing Bugzilla, it
-	will prompt you for the administrative username (email
-	address) and password for this "super user". If for some
-	reason you were to delete the "super user" account, re-running
-	checksetup.pl will again prompt you for this username and
-	password.
-      </para>
+      <para>When you first run checksetup.pl after installing Bugzilla, it
+      will prompt you for the administrative username (email address) and
+      password for this "super user". If for some reason you delete
+      the "super user" account, re-running checksetup.pl will again prompt
+      you for this username and password.</para>
+
       <tip>
-	<para>
-       If you wish to add more administrative users, you must use the
-	  MySQL interface. Run "mysql" from the command line, and use
-	  these commands ("mysql>" denotes the  mysql prompt, not
-	  something you should type in):
-	  <command><prompt>mysql></prompt> use bugs;</command>
-	  <command><prompt>mysql></prompt> update profiles set
-	    groupset=0x7ffffffffffffff where login_name = "(user's
-	    login name)"; </command>
-	</para>
-	<para>Yes, that is <emphasis>fourteen</emphasis>
-	  <quote>f</quote>'s.  A whole lot of f-ing going on if you
-	  want to create a new administator.</para>
+        <para>If you wish to add more administrative users, you must use the
+        MySQL interface. Run "mysql" from the command line, and use these
+        commands: 
+        <simplelist>
+          <member>
+            <prompt>mysql&gt;</prompt>
+            <command>use bugs;</command>
+          </member>
+
+          <member>
+            <prompt>mysql&gt;</prompt>
+
+            <command>
+              update profiles set groupset=0x7ffffffffffffff where login_name =
+              "(user's login name)";
+            </command>
+          </member>
+        </simplelist>
+        </para>
+
+        <para>Yes, that is 
+        <emphasis>fourteen</emphasis>
+
+        <quote>f</quote>
+
+        's. A whole lot of f-ing going on if you want to create a new
+        administator.</para>
       </tip>
     </section>
 
     <section id="manageusers">
       <title>Managing Other Users</title>
 
-      <section id="login">
-	<title>Logging In</title>
-	<orderedlist>
-	  <listitem>
-	    <para>
-	      Open the index.html page for your Bugzilla installation
-	      in your browser window.
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Click the "Query Existing Bug Reports" link.
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Click the "Log In" link at the foot of the page.
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Type your email address, and the password which was
-	      emailed to you when you created your Bugzilla account,
-	      into the spaces provided.
-	    </para>
-	  </listitem>
-	</orderedlist>
-	<para>Congratulations, you are logged in!</para>
-      </section>
-
       <section id="createnewusers">
-	<title>Creating new users</title>
-	<para>
-	  Your users can create their own user accounts by clicking
-	  the "New Account" link at the bottom of each page. However,
-	  should you desire to create user accounts ahead of time,
-	  here is how you do it.
-	</para>
-	<orderedlist>
-	  <listitem>
-	    <para>
-	      After logging in, click the "Users" link at the footer
-	      of the query page.
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      To see a specific user, type a portion of their login
-	      name in the box provided and click "submit". To see all
-	      users, simply click the "submit" button. You must click
-	      "submit" here to be able to add a new user.
-	    </para>
-	    <tip>
-	      <para>
-		More functionality is available via the list on the
-		right-hand side of the text entry box. You can match
-		what you type as a case-insensitive substring (the
-		default) of all users on your system, a case-sensitive
-		regular expression (please see the <command>man
-		  regexp</command> manual page for details on regular
-		expression syntax), or a <emphasis>reverse</emphasis>
-		regular expression match, where every user name which
-		does NOT match the regular expression is selected.
-	      </para>
-	    </tip>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Click the "Add New User" link at the bottom of the user
-	      list
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Fill out the form presented.  This page is
-	      self-explanatory.  When done, click "submit".
-	    </para>
-	    <note>
-	      <para>
-		Adding a user this way will <emphasis>not</emphasis>
-		send an email informing them of their username and
-		password. While useful for creating dummy accounts
-		(watchers which shuttle mail to another system, for
-		instance, or email addresses which are a mailing
-		list), in general it is preferable to log out and use
-		the <quote>New Account</quote> button to create users,
-		as it will pre-populate all the required fields and
-		also notify  the user of her account name and
-		password.
-	      </para>
-	    </note>
-	  </listitem>
-	</orderedlist>
-      </section>
+        <title>Creating new users</title>
+
+        <para>Your users can create their own user accounts by clicking the
+        "New Account" link at the bottom of each page (assuming they
+        aren't logged in as someone else already.) However, should you
+        desire to create user accounts ahead of time, here is how you do
+        it.</para>
+
+        <orderedlist>
+          <listitem>
+            <para>After logging in, click the "Users" link at the footer of
+            the query page, and then click "Add a new user".</para>
+          </listitem>
+
+          <listitem>
+            <para>Fill out the form presented. This page is self-explanatory.
+            When done, click "Submit".</para>
+
+            <note>
+              <para>Adding a user this way will 
+              <emphasis>not</emphasis>
 
-      <section id="disableusers">
-	<title>Disabling Users</title>
-	<para>
-	  I bet you noticed that big "Disabled Text" entry box
-	  available from the "Add New User" screen, when you edit an
-	  account? By entering any text in this box and selecting
-	  "submit", you have prevented the user from using Bugzilla
-	  via the web interface. Your explanation, written in this
-	  text box, will be presented to the user the next time she
-	  attempts to use the system.
-	  <warning>
-	    <para>
-	      Don't disable your own administrative account, or you
-	      will hate life!
-	    </para>
-	    <para>At this time, <quote>Disabled Text</quote> does not
-	      prevent a user from using the email interface.  If you
-	      have the email interface enabled, they can still
-	      continue to submit bugs and comments that way.  We need
-	      a patch to fix this.</para>
-	  </warning>
-	</para>
+              send an email informing them of their username and password.
+              While useful for creating dummy accounts (watchers which
+              shuttle mail to another system, for instance, or email
+              addresses which are a mailing list), in general it is
+              preferable to log out and use the 
+              <quote>New Account</quote>
+
+              button to create users, as it will pre-populate all the
+              required fields and also notify the user of her account name
+              and password.</para>
+            </note>
+          </listitem>
+        </orderedlist>
       </section>
 
       <section id="modifyusers">
-	<title>Modifying Users</title>
-	<para>
-	  Here I will attempt to describe the function of each option
-	  on the Edit User screen.
-	</para>
-	<itemizedlist>
-	  <listitem>
-	    <para>
-	      <emphasis>Login Name</emphasis>: This is generally the
-	      user's email address. However, if you have edited your
-	      system parameters, this may just be the user's login
-	      name or some other identifier.
-	      <tip>
-		<para>
-		  For compatability reasons, you should probably stick
-		  with email addresses as user login names.  It will
-		  make your life easier.
-		</para>
-	      </tip>
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      <emphasis>Real Name</emphasis>: Duh!
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      <emphasis>Password</emphasis>:  You can change the user
-	      password here.  It is normal to only see asterisks.
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      <emphasis>Email Notification</emphasis>: You may choose
-	      from one of three options:
-	      <orderedlist>
-		<listitem>
-		  <para>
-		    All qualifying bugs except those which I change:
-		    The user will be notified of any change to any bug
-		    for which she is the reporter, assignee, QA
-		    Contact, CC recipient, or "watcher".
-		  </para>
-		</listitem>
-		<listitem>
-		  <para>
-		    Only those bugs which I am listed on the CC line:
-		    The user will not be notified of changes to bugs
-		    where she is the assignee, reporter, or QA
-		    Contact, but will receive them if she is on the CC
-		    list.
-		    <note>
-		      <para>
-			She will still receive whining cron emails if
-			you set up the "whinemail" feature.
-		      </para>
-		    </note>
-		  </para>
-		</listitem>
-		<listitem>
-		  <para>
-		    <emphasis>All Qualifying Bugs</emphasis>: This
-		    user is a glutton for punishment. If her name is
-		    in the reporter, QA Contact, CC, assignee, or is a
-		    "watcher", she will get email updates regarding
-		    the bug.
-		  </para>
-		</listitem>
-	      </orderedlist>
-</para>
-	    <para>
-	      <emphasis>Disable Text</emphasis>: If you type anything
-	      in this box, including just a space, the user account is
-	      disabled from making any changes to bugs via the web
-	      interface, and what you type in this box is presented as
-	      the reason.
-	      <warning>
-		<para>Don't disable the administrator account!</para>
-	      </warning>
-	      <note>
-		<para>
-		  As of this writing, the user can still submit bugs
-		  via the e-mail gateway, if you set it up, despite
-		  the disabled text field.  The e-mail gateway should
-		  <emphasis>not</emphasis> be enabled for secure
-		  installations of Bugzilla.
-		</para>
-	      </note>
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      <emphasis>CanConfirm</emphasis>: This field is only used
-	      if you have enabled "unconfirmed" status in your
-	      parameters screen.  If you enable this for a user, that
-	      user can then move bugs from "Unconfirmed" to
-	      "Confirmed" status (e.g.: "New" status). Be judicious
-	      about allowing users to turn this bit on for other
-	      users.
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      <emphasis>Creategroups</emphasis>: This option will
-	      allow a user to create and destroy groups in Bugzilla.
-	      Unless you are using the Bugzilla GroupSentry security
-	      option "usebuggroupsentry" in your parameters, this
-	      setting has no effect.
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      <emphasis>Editbugs</emphasis>: Unless a user has this
-	      bit set, they can only edit those bugs for which they
-	      are the assignee or the reporter.  
-	      <note>
-		<para>
-		  Leaving this option unchecked does not prevent users
-		  from adding comments to a bug!  They simply cannot
-		  change a bug priority, severity, etc. unless they
-		  are the assignee or reporter.
-		</para>
-	      </note>
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      <emphasis>Editcomponents</emphasis>: This flag allows a
-	      user to create new  products and components, as well as
-	      modify and destroy those that have no bugs associated
-	      with them.  If a product or component has bugs
-	      associated with it, those bugs must be moved to a
-	      different product or component before Bugzilla will
-	      allow them to be destroyed.  The name of a product or
-	      component can be changed without affecting the
-	      associated bugs, but it tends to annoy the hell out of
-	      your users when these change a lot.
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      <emphasis>Editkeywords</emphasis>: If you use Bugzilla's
-	      keyword functionality, enabling this feature allows a
-	      user can create and destroy keywords. As always, the
-	      keywords for existing bugs containing the keyword the
-	      user wishes to destroy must be changed before Bugzilla
-	      will allow it to die. You must be very careful about
-	      creating too many new keywords if you run a very large
-	      Bugzilla installation; keywords are global variables
-	      across products, and you can often run into a phenomenon
-	      called "keyword bloat". This confuses users, and then
-	      the feature goes unused.
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      <emphasis>Editusers</emphasis>: This flag allows a user
-	      do what you're doing right now: edit other users. This
-	      will allow those with the right to do so to remove
-	      administrator priveleges from other users or grant them
-	      to themselves.  Enable with care.
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      <emphasis>PRODUCT</emphasis>: PRODUCT bugs access.  This
-	      allows an administrator, with product-level granularity,
-	      to specify in which products a user can edit bugs.  The
-	      user must still have the "editbugs" privelege to edit
-	      bugs in this area; this simply restricts them from even
-	      seeing bugs outside these boundaries if the
-	      administrator has enabled the group sentry parameter
-	      "usebuggroupsentry".  Unless you are using bug groups,
-	      this option has no effect.
-	    </para>
-	  </listitem>
-	</itemizedlist>
+        <title>Modifying Users</title>
+
+        <para>To see a specific user, search for their login name
+        in the box provided on the "Edit Users" page. To see all users, 
+        leave the box blank.</para>
+
+        <para>You can search in different ways the listbox to the right
+        of the text entry box. You can match by 
+        case-insensitive substring (the default),
+        regular expression, or a 
+        <emphasis>reverse</emphasis>
+        regular expression match, which finds every user name which does NOT
+        match the regular expression. (Please see
+        the <command>man regexp</command>
+        manual page for details on regular expression syntax.)
+        </para>
+
+        <para>Once you have found your user, you can change the following
+        fields:</para>
+
+        <itemizedlist>
+          <listitem>
+            <para>
+            <emphasis>Login Name</emphasis>: 
+            This is generally the user's full email address. However, if you
+            have are using the emailsuffix Param, this may just be the user's
+            login name. Note that users can now change their login names
+            themselves (to any valid email address.)
+            </para>
+          </listitem>
+
+          <listitem>
+            <para>
+            <emphasis>Real Name</emphasis>: The user's real name. Note that
+            Bugzilla does not require this to create an account.</para>
+          </listitem>
+
+          <listitem>
+            <para>
+            <emphasis>Password</emphasis>: 
+            You can change the user's password here. Users can automatically
+            request a new password, so you shouldn't need to do this often.
+            If you want to disable an account, see Disable Text below.
+            </para>
+          </listitem>
+
+          <listitem>
+            <para>
+            <emphasis>Disable Text</emphasis>: 
+            If you type anything in this box, including just a space, the
+            user is prevented from logging in, or making any changes to 
+            bugs via the web interface. 
+            The HTML you type in this box is presented to the user when
+            they attempt to perform these actions, and should explain
+            why the account was disabled.
+            <warning>
+              <para>Don't disable the administrator account!</para>
+            </warning>
+
+            <note>
+              <para>The user can still submit bugs via
+              the e-mail gateway, if you set it up, even if the disabled text
+              field is filled in. The e-mail gateway should 
+              <emphasis>not</emphasis>
+              be enabled for secure installations of Bugzilla.</para>
+            </note>
+            </para>
+          </listitem>
+
+          <listitem>
+            <para>
+            <emphasis>&lt;groupname&gt;</emphasis>: 
+            If you have created some groups, e.g. "securitysensitive", then
+            checkboxes will appear here to allow you to add users to, or
+            remove them from, these groups.
+            </para>
+          </listitem>
+
+          <listitem>
+            <para>
+            <emphasis>canconfirm</emphasis>: 
+            This field is only used if you have enabled the "unconfirmed"
+            status. If you enable this for a user,
+            that user can then move bugs from "Unconfirmed" to a "Confirmed"
+            status (e.g.: "New" status).</para>
+          </listitem>
+
+          <listitem>
+            <para>
+            <emphasis>creategroups</emphasis>: 
+            This option will allow a user to create and destroy groups in
+            Bugzilla.</para>
+          </listitem>
+
+          <listitem>
+            <para>
+            <emphasis>editbugs</emphasis>: 
+            Unless a user has this bit set, they can only edit those bugs
+            for which they are the assignee or the reporter. Even if this
+            option is unchecked, users can still add comments to bugs.
+            </para>
+          </listitem>
+
+          <listitem>
+            <para>
+            <emphasis>editcomponents</emphasis>: 
+            This flag allows a user to create new products and components,
+            as well as modify and destroy those that have no bugs associated
+            with them. If a product or component has bugs associated with it,
+            those bugs must be moved to a different product or component
+            before Bugzilla will allow them to be destroyed.
+            </para>
+          </listitem>
+
+          <listitem>
+            <para>
+            <emphasis>editkeywords</emphasis>: 
+            If you use Bugzilla's keyword functionality, enabling this
+            feature allows a user to create and destroy keywords. As always,
+            the keywords for existing bugs containing the keyword the user
+            wishes to destroy must be changed before Bugzilla will allow it
+            to die.</para>
+          </listitem>
+
+          <listitem>
+            <para>
+            <emphasis>editusers</emphasis>: 
+            This flag allows a user to do what you're doing right now: edit
+            other users. This will allow those with the right to do so to
+            remove administrator privileges from other users or grant them to
+            themselves. Enable with care.</para>
+          </listitem>
+
+
+          <listitem>
+            <para>
+            <emphasis>tweakparams</emphasis>: 
+            This flag allows a user to change Bugzilla's Params 
+            (using <filename>editparams.cgi</filename>.)</para>
+          </listitem>
+
+          <listitem>
+            <para>
+            <emphasis>&lt;productname&gt;</emphasis>: 
+            This allows an administrator to specify the products in which 
+            a user can see bugs. The user must still have the 
+            "editbugs" privilege to edit bugs in these products.</para>
+          </listitem>
+        </itemizedlist>
       </section>
     </section>
   </section>
 
   <section id="programadmin">
-    <title>Product, Component, Milestone, and Version
-      Administration</title>
-    <epigraph>
-      <para>
-	Dear Lord, we have to get our users to do WHAT?
-      </para>
-    </epigraph>
+    <title>Product, Component, Milestone, and Version Administration</title>
 
     <section id="products">
       <title>Products</title>
-      <subtitle>Formerly, and in some spots still, called
-	"Programs"</subtitle>
-      <para>
-	<glossterm linkend="gloss_product" baseform="product">Products</glossterm> are
-	the broadest category in Bugzilla, and you should have the
-	least of these. If your company makes computer games, you
-	should have one product per game, and possibly a few special
-	products (website, meetings...)
-      </para>
+
       <para>
-	A Product (formerly called "Program", and still referred to
-	that way in some portions of the source code) controls some
-	very important functions. The number of "votes" available for
-	users to vote for the most important bugs is set per-product,
-	as is the number of votes required to move a bug automatically
-	from the UNCONFIRMED status to the NEW status.  One can close
-	a Product for further bug entry and define various Versions
-	available from the Edit product screen.
-      </para>
+      <glossterm linkend="gloss-product" baseform="product">
+      Products</glossterm>
+
+      are the broadest category in Bugzilla, and tend to represent real-world
+      shipping products. E.g. if your company makes computer games, 
+      you should have one product per game, perhaps a "Common" product for 
+      units of technology used in multiple games, and maybe a few special
+       products (Website, Administration...)</para>
+
+      <para>Many of Bugzilla's settings are configurable on a per-product
+      basis. The number of "votes" available to users is set per-product, 
+      as is the number of votes
+      required to move a bug automatically from the UNCONFIRMED status to the
+      NEW status.</para>
+
       <para>To create a new product:</para>
+
       <orderedlist>
-	<listitem>
-	  <para>
-	    Select "components" from the yellow footer
-	  </para>
-	  <tip>
-	    <para>
-	      It may seem counterintuitive to click "components" when
-	      you want to edit the properties associated with
-	      Products.  This is one of a long list of things we want
-	      in Bugzilla 3.0...
-	    </para>
-	  </tip>
-	</listitem>
-	<listitem>
-	  <para>
-	    Select the "Add" link to the right of "Add a new product".
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Enter the name of the product and a description. The
-	    Description field is free-form.
-	  </para>
-	</listitem>
+        <listitem>
+          <para>Select "products" from the footer</para>
+
+        </listitem>
+
+        <listitem>
+          <para>Select the "Add" link in the bottom right</para>
+        </listitem>
+
+        <listitem>
+          <para>Enter the name of the product and a description. The
+          Description field may contain HTML.</para>
+        </listitem>
       </orderedlist>
-      <tip>
-	<para>
-	  Don't worry about the "Closed for bug entry", "Maximum Votes
-	  per person",  "Maximum votes a person can put on a single
-	  bug", "Number of votes a bug in this Product needs to
-	  automatically get out of the UNCOMFIRMED state", and
-	  "Version" options yet. We'll cover those in a few moments.
-	</para>
-      </tip>
+
+      <para>Don't worry about the "Closed for bug entry", "Maximum Votes
+      per person", "Maximum votes a person can put on a single bug",
+      "Number of votes a bug in this Product needs to automatically get out
+      of the UNCOMFIRMED state", and "Version" options yet. We'll cover
+      those in a few moments.
+      </para>
     </section>
-    
+
     <section id="components">
       <title>Components</title>
-      <para>
-	Components are subsections of a Product. 
-
-	<example>
-	  <title>Creating some Components</title>
-	  <informalexample>
-	    <para>
-	      The computer game you are designing may have a "UI"
-	      component, an "API" component, a "Sound System"
-	      component, and a "Plugins" component,  each overseen by
-	      a different programmer.  It often makes sense to divide
-	      Components in Bugzilla according to the natural
-	      divisions of responsibility within your Product  or
-	      company.
-	    </para>
-	  </informalexample>
-	</example> Each component has a owner and (if you turned it on
-	in the parameters), a QA  Contact. The owner should be the
-	primary person who fixes bugs in that component.  The  QA
-	Contact should be the person who will ensure these bugs are
-	completely fixed. The Owner, QA Contact, and Reporter will get
-	email when new bugs are created in this Component and when
-	these bugs change. Default Owner and Default QA Contact fields
-	only dictate the <emphasis>default assignments</emphasis>; the
-	Owner and QA Contact fields in a bug  are otherwise unrelated
-	to the Component.
-      </para>
 
+      <para>Components are subsections of a Product. E.g. the computer game 
+      you are designing may have a "UI"
+      component, an "API" component, a "Sound System" component, and a
+      "Plugins" component, each overseen by a different programmer. It
+      often makes sense to divide Components in Bugzilla according to the
+      natural divisions of responsibility within your Product or
+      company.</para>
+      
       <para>
-	To create a new Component:
-      </para>
+      Each component has a owner and (if you turned it on in the parameters),
+      a QA Contact. The owner should be the primary person who fixes bugs in
+      that component. The QA Contact should be the person who will ensure
+      these bugs are completely fixed. The Owner, QA Contact, and Reporter
+      will get email when new bugs are created in this Component and when
+      these bugs change. Default Owner and Default QA Contact fields only
+      dictate the 
+      <emphasis>default assignments</emphasis>; 
+      these can be changed on bug submission, or at any later point in
+      a bug's life.</para>
+
+      <para>To create a new Component:</para>
+
       <orderedlist>
-	<listitem>
-	  <para>
-	    Select the "Edit components" link from the "Edit product"
-	    page
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Select the "Add" link to the right of the "Add a new
-	    component" text on the "Select Component" page.
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Fill out the "Component" field, a short "Description", and
-	    the "Initial Owner". The Component and Description fields
-	    are free-form; the "Initial Owner" field must be that of a
-	    user ID already existing in the database.  If the initial
-	    owner does not exist, Bugzilla will refuse to create the
-	    component.
-	    <tip>
-	      <para>
-		Is your "Default Owner" a user who is not yet in the
-		database? No problem.
-		<orderedlist>
-		  <listitem>
-		    <para>
-		      Select the "Log out" link on the footer of the
-		      page.
-		    </para>
-		  </listitem>
-		  <listitem>
-		    <para>
-		      Select the "New Account" link on the footer of
-		      the "Relogin" page
-		    </para>
-		  </listitem>
-		  <listitem>
-		    <para>
-		      Type in the email address of the default owner
-		      you want to create in the "E-mail address"
-		      field, and her full name in the "Real name"
-		      field, then select the "Submit Query" button.
-		    </para>
-		  </listitem>
-		  <listitem>
-		    <para>
-		      Now select "Log in" again, type in your login
-		      information, and you can modify the product to
-		      use the Default Owner information you require.
-		    </para>
-		  </listitem>
-		</orderedlist>
-	      </para>
-	    </tip>
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Either Edit more components or return to the Bugzilla
-	    Query Page. To return to the Product you were editing, you
-	    must select the Components link as before.
-	  </para>
-	</listitem>
+        <listitem>
+          <para>Select the "Edit components" link from the "Edit product"
+          page</para>
+        </listitem>
+
+        <listitem>
+          <para>Select the "Add" link in the bottom right.</para>
+        </listitem>
+
+        <listitem>
+          <para>Fill out the "Component" field, a short "Description", 
+          the "Initial Owner" and "Initial QA Contact" (if enabled.) 
+          The Component and Description fields may contain HTML; 
+          the "Initial Owner" field must be a login name
+          already existing in the database. 
+          </para>
+        </listitem>
       </orderedlist>
     </section>
-    
+
     <section id="versions">
       <title>Versions</title>
-      <para>
-	Versions are the revisions of the product, such as "Flinders
-	3.1", "Flinders 95", and "Flinders 2000".  Using Versions
-	helps you isolate code changes and are an aid in reporting.
-
-	<example>
-	  <title>Common Use of Versions</title>
-	  <informalexample>
-	    <para>
-	      A user reports a bug against Version "Beta 2.0" of your
-	      product.  The current Version of your software is
-	      "Release Candidate 1", and no longer has the bug.  This
-	      will help you triage and classify bugs according to
-	      their relevance.  It is also possible people may report
-	      bugs against bleeding-edge beta versions that are not
-	      evident in older versions of the software.  This can
-	      help isolate code changes that caused the bug
-	    </para>
-	  </informalexample>
-	</example>
-	<example>
-	  <title>A Different Use of Versions</title>
-	  <informalexample>
-	    <para>
-	      This field has been used to good effect by an online
-	      service provider in a slightly different way.  They had
-	      three versions of the product: "Production", "QA", and
-	      "Dev".  Although it may be the same product, a bug in
-	      the development environment is not normally as critical
-	      as a Production bug, nor does it need to be reported
-	      publicly.  When used in conjunction with Target
-	      Milestones, one can easily specify the environment where
-	      a bug can be reproduced, and the Milestone by which it
-	      will be fixed.
-	    </para>
-	  </informalexample>
-	</example>
-       </para>
-      <para>
-	To create and edit Versions:
+
+      <para>Versions are the revisions of the product, such as "Flinders
+      3.1", "Flinders 95", and "Flinders 2000". Version is not a multi-select
+      field; the usual practice is to select the most recent version with
+      the bug.
       </para>
+
+      <para>To create and edit Versions:</para>
+
       <orderedlist>
-	<listitem>
-	  <para>
-	    From the "Edit product" screen, select "Edit Versions"
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    You will notice that the product already has the default
-	    version "undefined". If your product doesn't use version
-	    numbers, you may want to leave this as it is or edit it so
-	    that it is "---". You can then go back to the edit
-	    versions page and add new versions to your product.
-	  </para>
-	  <para>
-	    Otherwise, click the "Add" button to the right of the "Add
-	    a new version" text.
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Enter the name of the Version.  This can be free-form
-	    characters up to the limit of the text box.  Then select
-	    the "Add" button.
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    At this point you can select "Edit" to edit more Versions,
-	    or return to the "Query" page, from which you can navigate
-	    back to the product through the "components" link at the
-	    foot of the Query page.
-	  </para>
-	</listitem>
+        <listitem>
+          <para>From the "Edit product" screen, select "Edit Versions"</para>
+        </listitem>
+
+        <listitem>
+          <para>You will notice that the product already has the default
+          version "undefined". Click the "Add" link in the bottom right.</para>
+        </listitem>
+
+        <listitem>
+          <para>Enter the name of the Version. This field takes text only. 
+          Then click the "Add" button.</para>
+        </listitem>
+
       </orderedlist>
     </section>
-    
+
     <section id="milestones">
       <title>Milestones</title>
-      <para>
-	Milestones are "targets" that you plan to get a bug fixed by.
-	For example, you have a bug that you plan to fix for your 3.0
-	release, it would be assigned the milestone of 3.0. Or, you
-	have a bug that you plan to fix for 2.8, this would have a
-	milestone of 2.8.
-      </para>
+
+      <para>Milestones are "targets" that you plan to get a bug fixed by. For
+      example, you have a bug that you plan to fix for your 3.0 release, it
+      would be assigned the milestone of 3.0.</para>
+
       <note>
-	<para>
-	  Milestone options will only appear for a Product if you
-	  turned the "usetargetmilestone" field in the "Edit
-	  Parameters" screen "On".
-	</para>
+        <para>Milestone options will only appear for a Product if you turned
+        on the "usetargetmilestone" Param in the "Edit Parameters" screen.
+        </para>
       </note>
-      <para>
-	To create new Milestones, set Default Milestones, and set
-	Milestone URL: 
-      </para>
+
+      <para>To create new Milestones, set Default Milestones, and set
+      Milestone URL:</para>
+
       <orderedlist>
-	<listitem>
-	  <para>
-	    Select "edit milestones"
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Select "Add" to the right of the "Add a new milestone"
-	    text
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Enter the name of the Milestone in the "Milestone" field.
-	    You can optionally set the "Sortkey", which is a positive
-	    or negative number (-255 to 255) that defines where in the
-	    list this particular milestone appears. Select "Add".
-	  </para>
-	  <example>
-	    <title>Using SortKey with Target Milestone</title>
-	    <informalexample>
-	      <para>
-		Let's say you create a target milestone called
-		"Release 1.0", with Sortkey set to "0". Later, you
-		realize that you will have a public beta, called
-		"Beta1". You can create a Milestone called "Beta1",
-		with a Sortkey of "-1" in order to ensure people will
-		see the Target Milestone of "Beta1" earlier on the
-		list than "Release 1.0"
-	      </para>
-	    </informalexample>
-	  </example>
-	</listitem>
-	<listitem>
-	  <para>
-	    If you want to add more milestones, select the "Edit"
-	    link. If you don't, well shoot, you have to go back to the
-	    "query" page and select "components" again, and make your
-	    way back to the Product you were editing.
-	    <note>
-	      <para>
-		This is another in the list of unusual user interface
-		decisions that we'd like to get cleaned up.  Shouldn't
-		there be a link to the effect of "edit the Product I
-		was editing when I ended up here"?  In any case,
-		clicking "components" in the footer takes you back to
-		the "Select product" screen, from which you can begin
-		editing your product again.
-	      </para>
-	    </note>
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    From the Edit product screen again (once you've made your
-	    way back), enter the URL for a description of what your
-	    milestones are for this product in the "Milestone URL"
-	    field. It should be of the format
-	    "http://www.foo.com/bugzilla/product_milestones.html"
-	  </para>
-	  <para>
-	    Some common uses of this field include product
-	    descriptions, product roadmaps, and of course a simple
-	    description of the meaning of each milestone.
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    If you're using Target Milestones, the "Default Milestone"
-	    field must have some kind of entry.  If you really don't
-	    care if people set coherent Target Milestones,  simply
-	    leave this at the default, "---".  However, controlling
-	    and regularly updating the Default Milestone field is a
-	    powerful tool when reporting the status of projects.
-	  </para>
-	  <para>Select the "Update" button when you are done.</para>
-	</listitem>
+        <listitem>
+          <para>Select "Edit milestones" from the "Edit product" page.</para>
+        </listitem>
+
+        <listitem>
+          <para>Select "Add" in the bottom right corner.
+          text</para>
+        </listitem>
+
+        <listitem>
+          <para>Enter the name of the Milestone in the "Milestone" field. You
+          can optionally set the "sortkey", which is a positive or negative
+          number (-255 to 255) that defines where in the list this particular
+          milestone appears. This is because milestones often do not 
+          occur in alphanumeric order For example, "Future" might be
+          after "Release 1.2". Select "Add".</para>
+        </listitem>
+
+        <listitem>
+          <para>From the Edit product screen, you can enter the URL of a 
+          page which gives information about your milestones and what
+          they mean. </para>
+
+        <tip>
+          <para>If you want your milestone document to be restricted so
+          that it can only be viewed by people in a particular Bugzilla
+          group, the best way is to attach the document to a bug in that
+          group, and make the URL the URL of that attachment.</para>
+        </tip>
+        </listitem>
       </orderedlist>
     </section>
+  </section>
+  
+  <section id="voting">
+    <title>Voting</title>
+
+    <para>Voting allows users to be given a pot of votes which they can allocate
+    to bugs, to indicate that they'd like them fixed. 
+    This allows developers to gauge
+    user need for a particular enhancement or bugfix. By allowing bugs with
+    a certain number of votes to automatically move from "UNCONFIRMED" to
+    "NEW", users of the bug system can help high-priority bugs garner
+    attention so they don't sit for a long time awaiting triage.</para>
+
+    <para>To modify Voting settings:</para>
+
+    <orderedlist>
+      <listitem>
+        <para>Navigate to the "Edit product" screen for the Product you
+        wish to modify</para>
+      </listitem>
+
+      <listitem>
+        <para><emphasis>Maximum Votes per person</emphasis>:
+        Setting this field to "0" disables voting.</para>
+      </listitem>
+
+      <listitem>
+        <para><emphasis>Maximum Votes a person can put on a single
+         bug"</emphasis>: 
+         It should probably be some number lower than the
+        "Maximum votes per person". Don't set this field to "0" if
+        "Maximum votes per person" is non-zero; that doesn't make
+        any sense.</para>
+      </listitem>
+
+      <listitem>
+        <para><emphasis>Number of votes a bug in this product needs to
+        automatically get out of the UNCONFIRMED state</emphasis>: 
+        Setting this field to "0" disables the automatic move of
+        bugs from UNCONFIRMED to NEW. 
+        </para>
+      </listitem>
+
+      <listitem>
+        <para>Once you have adjusted the values to your preference, click
+        "Update".</para>
+      </listitem>
+    </orderedlist>
+  </section>
+
+  <section id="groups">
+    <title>Groups and Group Security</title>
+
+    <para>Groups allow the administrator
+    to isolate bugs or products that should only be seen by certain people.
+    There are two types of group - Generic Groups, and Product-Based Groups.
+    </para>
+    
+    <para>
+    Product-Based Groups are matched with products, and allow you to restrict
+    access to bugs on a per-product basis. They are enabled using the 
+    usebuggroups Param. Turning on the usebuggroupsentry
+    Param will mean bugs automatically get added to their product group when 
+    filed.   
+    </para>
+    
+    <para>
+    Generic Groups have no special relationship to products; 
+    you create them, and put bugs in them
+    as required. One example of the use of Generic Groups 
+    is Mozilla's "Security" group,
+    into which security-sensitive bugs are placed until fixed. Only the
+    Mozilla Security Team are members of this group.
+    </para>
+    
+    <para>To create Generic Groups:</para>
+
+    <orderedlist>
+      <listitem>
+        <para>Select the "groups"
+        link in the footer.</para>
+      </listitem>
+
+      <listitem>
+        <para>Take a moment to understand the instructions on the "Edit
+        Groups" screen, then select the "Add Group" link.</para>
+      </listitem>
+
+      <listitem>
+        <para>Fill out the "New Name", "New Description", and 
+        "New User RegExp" fields. "New User RegExp" allows you to automatically
+         place all users who fulfill the Regular Expression into the new group. 
+         When you have finished, click "Add".</para>
+      </listitem>
+    </orderedlist>
+
+    <para>To use Product-Based Groups:</para>
+
+    <orderedlist>
+      <listitem>
+        <para>Turn on "usebuggroups" and "usebuggroupsentry" in the "Edit
+        Parameters" screen.</para>
+
+        <warning>
+          <para>XXX is this still true?
+          "usebuggroupsentry" has the capacity to prevent the
+          administrative user from directly altering bugs because of
+          conflicting group permissions. If you plan on using
+          "usebuggroupsentry", you should plan on restricting
+          administrative account usage to administrative duties only. In
+          other words, manage bugs with an unpriveleged user account, and
+          manage users, groups, Products, etc. with the administrative
+          account.</para>
+        </warning>
+      </listitem>
+
+      <listitem>
+        <para>In future, when you create a Product, a matching group will be
+        automatically created. If you need to add a Product Group to
+        a Product which was created before you turned on usebuggroups,
+        then simply create a new group, as outlined above, with the
+        same name as the Product.</para>
+      </listitem>
+    </orderedlist>
+
+    <warning>
+      <para>Bugzilla currently has a limit of 64 groups per installation. If
+      you have more than about 50 products, you should consider
+      running multiple Bugzillas. Ask in the newsgroup for other
+      suggestions for working around this restriction.</para>
+    </warning>
+
+    <para>
+      Note that group permissions are such that you need to be a member
+      of <emphasis>all</emphasis> the groups a bug is in, for whatever
+      reason, to see that bug.
+    </para>    
+  </section>
+
+
+  <section id="security">
+    <title>Bugzilla Security</title>
+
+    <warning>
+      <para>Poorly-configured MySQL and Bugzilla installations have
+      given attackers full access to systems in the past. Please take these
+      guidelines seriously, even for Bugzilla machines hidden away behind
+      your firewall. 80% of all computer trespassers are insiders, not
+      anonymous crackers.</para>
+    </warning>
+
+    <note>
+      <para>These instructions must, of necessity, be somewhat vague since
+      Bugzilla runs on so many different platforms. If you have refinements
+      of these directions for specific platforms, please submit them to 
+      <ulink url="mailto://mozilla-webtools@mozilla.org">
+      mozilla-webtools@mozilla.org</ulink>
+      </para>
+    </note>
+
+    <para>To secure your installation:
+     
+    <orderedlist>
+      <listitem>
+        <para>Ensure you are running at least MysQL version 3.22.32 or newer.
+        Earlier versions had notable security holes and (from a security
+        point of view) poor default configuration choices.</para>
+      </listitem>
+
+      <listitem>
+        <para>
+        <emphasis>There is no substitute for understanding the tools on your
+        system!</emphasis>
+
+        Read 
+        <ulink url="http://www.mysql.com/doc/P/r/Privilege_system.html">
+        The MySQL Privilege System</ulink>
+        until you can recite it from memory!</para>
+      </listitem>
+
+      <listitem>
+        <para>Lock down /etc/inetd.conf. Heck, disable inet entirely on this
+        box. It should only listen to port 25 for Sendmail and port 80 for
+        Apache.</para>
+      </listitem>
+
+      <listitem>
+        <para>Do not run Apache as 
+        <quote>nobody</quote>
+
+        . This will require very lax permissions in your Bugzilla
+        directories. Run it, instead, as a user with a name, set via your
+        httpd.conf file. 
+        <note>
+          <para>
+          <quote>nobody</quote>
+
+          is a real user on UNIX systems. Having a process run as user id 
+          <quote>nobody</quote>
+
+          is absolutely no protection against system crackers versus using
+          any other user account. As a general security measure, I recommend
+          you create unique user ID's for each daemon running on your system
+          and, if possible, use "chroot" to jail that process away from the
+          rest of your system.</para>
+        </note>
+        </para>
+      </listitem>
+
+      <listitem>
+        <para>Ensure you have adequate access controls for the
+        $BUGZILLA_HOME/data/ directory, as well as the
+        $BUGZILLA_HOME/localconfig file.
+        The localconfig file stores your "bugs" database account password. 
+        In addition, some
+        files under $BUGZILLA_HOME/data/ store sensitive information.
+        </para>
+
+        <para>Bugzilla provides default .htaccess files to protect the most
+        common Apache installations. However, you should verify these are
+        adequate according to the site-wide security policy of your web
+        server, and ensure that the .htaccess files are allowed to
+        "override" default permissions set in your Apache configuration
+        files. Covering Apache security is beyond the scope of this Guide;
+        please consult the Apache documentation for details.</para>
+
+        <para>If you are using a web server that does not support the
+        .htaccess control method, 
+        <emphasis>you are at risk!</emphasis>
+
+        After installing, check to see if you can view the file
+        "localconfig" in your web browser (e.g.: 
+        <ulink url="http://bugzilla.mozilla.org/localconfig">
+        http://bugzilla.mozilla.org/localconfig</ulink>
+
+        ). If you can read the contents of this file, your web server has
+        not secured your bugzilla directory properly and you must fix this
+        problem before deploying Bugzilla. If, however, it gives you a
+        "Forbidden" error, then it probably respects the .htaccess
+        conventions and you are good to go.</para>
+
+        <para>When you run checksetup.pl, the script will attempt to modify
+        various permissions on files which Bugzilla uses. If you do not have
+        a webservergroup set in the localconfig file, then Bugzilla will have
+        to make certain files world readable and/or writable. 
+        <emphasis>THIS IS INSECURE!</emphasis>
+
+        . This means that anyone who can get access to your system can do
+        whatever they want to your Bugzilla installation.</para>
+
+        <note>
+          <para>This also means that if your webserver runs all cgi scripts
+          as the same user/group, anyone on the system who can run cgi
+          scripts will be able to take control of your Bugzilla
+          installation.</para>
+        </note>
+
+        <para>On Apache, you can use .htaccess files to protect access to
+        these directories, as outlined in 
+        <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=57161">Bug
+        57161</ulink>
+
+        for the localconfig file, and 
+        <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=65572">Bug
+        65572</ulink>
+
+        for adequate protection in your data/ directory.</para>
+
+        <para>Note the instructions which follow are Apache-specific. If you
+        use IIS, Netscape, or other non-Apache web servers, please consult
+        your system documentation for how to secure these files from being
+        transmitted to curious users.</para>
+
+        <para>Place the following text into a file named ".htaccess",
+        readable by your web server, in your $BUGZILLA_HOME/data directory. 
+        <literallayout>&lt;Files comments&gt; allow from all &lt;/Files&gt;
+        deny from all</literallayout>
+        </para>
+
+        <para>Place the following text into a file named ".htaccess",
+        readable by your web server, in your $BUGZILLA_HOME/ directory. 
+        <literallayout>&lt;Files localconfig&gt; deny from all &lt;/Files&gt;
+        allow from all</literallayout>
+        </para>
+
+      </listitem>
+    </orderedlist>
+    </para>
+  </section>
+
+  <section id="cust-templates">
+    <title>Template Customisation</title>
+    
+    <para>
+      One of the large changes for 2.16 was the templatisation of the
+      entire user-facing UI, using the 
+      <ulink url="http://www.template-toolkit.org">Template Toolkit</ulink>.
+      Administrators can now configure the look and feel of Bugzilla without
+      having to edit Perl files or face the nightmare of massive merge
+      conflicts when they upgrade to a newer version in the future.
+    </para>
+    
+    <para>
+      Templatisation also makes localised versions of Bugzilla possible, 
+      for the first time. In the future, a Bugzilla installation may
+      have templates installed for multiple localisations, and select
+      which ones to use based on the user's browser language setting.      
+    </para>
     
-    <section id="voting">
-      <title>Voting</title>
+    <section>
+      <title>What to Edit</title>
       <para>
-	The concept of "voting" is a poorly understood, yet powerful
-	feature for the management of open-source projects.  Each user
-	is assigned so many Votes per product, which they can freely
-	reassign (or assign multiple votes to a single bug). This
-	allows developers to gauge user need for a particular
-	enhancement or bugfix.  By allowing bugs with a certain number
-	of votes to automatically move from "UNCONFIRMED" to "NEW",
-	users of the bug system can help high-priority bugs garner
-	attention so they don't sit for a long time awaiting triage.
+        There are two different ways of editing of Bugzilla's templates,
+        and which you use depends mainly on how you upgrade Bugzilla. The
+        template directory structure is that there's a top level directory,
+        <filename>template</filename>, which contains a directory for
+        each installed localisation. The default English templates are
+        therefore in <filename>en</filename>. Underneath that, there
+        is the <filename>default</filename> directory and optionally the 
+        <filename>custom</filename> directory. The <filename>default</filename>
+        directory contains all the templates shipped with Bugzilla, whereas
+        the <filename>custom</filename> directory does not exist at first and
+        must be created if you want to use it.
       </para>
+
       <para>
-	The daunting challenge of Votes is deciding where you draw the
-	line for a "vocal majority".  If you only have a user base of
-	100 users, setting a low threshold for bugs to move from
-	UNCONFIRMED to NEW makes sense.  As the Bugzilla user base
-	expands, however, these thresholds must be re-evaluated.  You
-	should gauge whether this feature is worth the time and close
-	monitoring involved, and perhaps forego implementation until
-	you have a critical mass of users who demand it.
+        The first method of making customisations is to directly edit the
+        templates in <filename>template/en/default</filename>. This is
+        probably the best method for small changes if you are going to use
+        the CVS method of upgrading, because if you then execute a
+        <command>cvs update</command>, any template fixes will get
+        automagically merged into your modified versions.
       </para>
-      <para>To modify Voting settings:</para>
-      <orderedlist>
-	<listitem>
-	  <para>
-	    Navigate to the "Edit product" screen for the Product you
-	    wish to modify
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Set "Maximum Votes per person" to your calculated value.
-	    Setting this field to "0" disables voting.
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Set "Maximum Votes a person can put on a single bug" to
-	    your calculated value.  It should probably be some number
-	    lower than the "Maximum votes per person". Setting this
-	    field to "0" disables voting, but leaves the voting
-	    options open to the user.  This is confusing.
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Set "Number of votes a bug in this product needs to
-	    automatically get out of the UNCONFIRMED state" to your
-	    calculated number.  Setting this field to "0"  disables
-	    the automatic move of bugs from UNCONFIRMED to NEW.  Some
-	    people advocate leaving this at "0", but of what use are
-	    Votes if your Bugzilla user base is unable to affect which
-	    bugs appear on Development radar?
-	    <tip>
-	      <para>
-		You should probably set this number to higher than a
-		small coalition of Bugzilla users can influence it.
-		Most sites use this as a "referendum" mechanism -- if
-		users are able to vote a bug out of UNCONFIRMED, it is
-		a <emphasis>really</emphasis> bad bug!
-	      </para>
-	    </tip>
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Once you have adjusted the values to your preference,
-	    select the "Update" button.
-	  </para>
-	</listitem>
-      </orderedlist>
-    </section>    
 
-    <section id="groups">
-      <title>Groups and Group Security</title>
       <para>
-	Groups can be very useful in bugzilla, because they allow
-	users to isolate bugs or products that should only be seen by
-	certain people.  Groups can also be a complicated minefield of
-	interdependencies and weirdness if mismanaged.
-
-	<example>
-	  <title>When to Use Group Security</title>
-	  <informalexample>
-	    <para>
-	      Many Bugzilla sites isolate "Security-related" bugs from
-	      all other bugs. This way, they can have a fix ready
-	      before the security vulnerability is announced to the
-	      world.  You can create a "Security" product which, by
-	      default, has no members, and only add members to the
-	      group (in their individual User page, as described under
-	      User Administration) who should have priveleged access
-	      to "Security" bugs.  Alternately, you may create a Group
-	      independently of any Product, and change the Group mask
-	      on individual bugs to restrict access to members only of
-	      certain Groups.
-	    </para>
-	  </informalexample>
-	</example> Groups only work if you enable the "usebuggroups"
-	paramater. In addition, if the "usebuggroupsentry" parameter
-	is "On", one can restrict access to products by groups, so
-	that only members of a product group are able to view bugs
-	within that product. Group security in Bugzilla can be divided
-	into two categories: Generic and Product-Based.
+        If you use this method, your installation will break if CVS conflicts
+        occur.
       </para>
+
+      <para>
+        The other method is to copy the templates into a mirrored directory
+        structure under <filename>template/en/custom</filename>.  The templates
+        in this directory automatically override those in default.  
+        This is the technique you
+        need to use if you use the overwriting method of upgrade, because
+        otherwise your changes will be lost.  This method is also better if
+        you are using the CVS method of upgrading and are going to make major
+        changes, because it is guaranteed that the contents of this directory
+        will not be touched during an upgrade, and you can then decide whether
+        to continue using your own templates, or make the effort to merge your
+        changes into the new versions by hand.
+      </para>
+
+      <para>
+        If you use this method, your installation may break if incompatible
+        changes are made to the template interface.  If such changes are made
+        they will be documented in the release notes, provided you are using a
+        stable release of Bugzilla.  If you use using unstable code, you will
+        need to deal with this one yourself, although if possible the changes
+        will be mentioned before they occur in the deprecations section of the
+        previous stable release's release notes.
+      </para>
+
       <note>
-	<para>
-	  Groups in Bugzilla are a complicated beast that evolved out
-	  of very simple user permission bitmasks, apparently itself
-	  derived from common concepts in UNIX access controls.  A
-	  "bitmask" is a fixed-length number whose value can describe
-	  one, and only one, set of states.  For instance, UNIX file
-	  permissions are assigned bitmask values:  "execute" has a
-	  value of 1, "write" has a value of 2,  and "read" has a
-	  value of 4.  Add them together, and a file can be read,
-	  written to, and executed if it has a bitmask of "7". (This
-	  is a simplified example -- anybody who knows UNIX security
-	  knows there is much more to it than this.  Please bear with
-	  me for the purpose of this note.)  The only way a bitmask
-	  scheme can work is by doubling the bit count for each value.
-	  Thus if UNIX wanted to offer another file permission, the
-	  next would have to be a value of 8, then the next 16, the
-	  next 32, etc.
-	</para>
-	<para>
-	  Similarly, Bugzilla offers a bitmask to define group
-	  permissions, with an internal limit of 64.  Several are
-	  already occupied by built-in permissions.  The way around
-	  this limitation is to avoid assigning groups to products if
-	  you have many products, avoid bloating of group lists, and
-	  religiously prune irrelevant groups.  In reality, most
-	  installations of Bugzilla support far fewer than 64 groups,
-	  so this limitation has not hit for most sites, but it is on
-	  the table to be revised for Bugzilla 3.0 because it
-	  interferes with the security schemes of some administrators.
-	</para>
+        <para>
+          Don't directly edit the compiled templates in 
+          <filename class="directory">data/template/*</filename> - your
+          changes will be lost when Template Toolkit recompiles them.
+        </para>
       </note>
+    </section>
+    
+    <section>
+      <title>How To Edit Templates</title>
+      
+     <para>
+        The syntax of the Template Toolkit language is beyond the scope of
+        this guide. It's reasonably easy to pick up by looking at the current 
+        templates; or, you can read the manual, available on the
+        <ulink url="http://www.template-toolkit.org">Template Toolkit home
+        page</ulink>. However, you should particularly remember (for security
+        reasons) to always HTML filter things which come from the database or
+        user input, to prevent cross-site scripting attacks.
+      </para>
+      
       <para>
-	To enable Generic Group Security ("usebuggroups"):
+        However, one thing you should take particular care about is the need
+        to properly HTML filter data that has been passed into the template.
+        This means that if the data can possibly contain special HTML characters
+        such as &lt;, and the data was not intended to be HTML, they need to be
+        converted to entity form, ie &amp;lt;.  You use the 'html' filter in the
+        Template Toolkit to do this.  If you fail to do this, you may open up
+        your installation to cross-site scripting attacks.
       </para>
-      <orderedlist>
-	<listitem>
-	  <para>
-	    Turn "On" "usebuggroups" in the "Edit Parameters" screen.
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    You will generally have no groups set up.  Select the
-	    "groups" link in the footer.
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Take a moment to understand the instructions on the "Edit
-	    Groups" screen. Once you feel confident you understand
-	    what is expected of you, select the "Add Group" link.
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Fill out the "New Name" (remember, no spaces!), "New
-	    Description", and "New User RegExp" fields.  "New User
-	    RegExp" allows you to automatically place all users who
-	    fulfill the Regular Expression into the new group.
-
-	    <example>
-	      <title>Creating a New Group</title>
-	      <informalexample>
-		<para>
-		  I created a group called DefaultGroup with a
-		  description of <quote>This is simply a group to play
-		  with</quote>, and a New User RegExp of <quote>.*@mydomain.tld</quote>.
-		  This new group automatically includes all Bugzilla
-		  users with "@mydomain.tld" at the end of their user id.
-		  When I finished, my new group was assigned bit #128.
-		</para>
-	      </informalexample>
-	    </example> When you have finished, select the Add
-	    button.
-	  </para>
-	</listitem>
-      </orderedlist>
 
       <para>
-	To enable Product-Based Group Security (usebuggroupsentry):
+        Also note that Bugzilla adds a few filters of its own, that are not
+        in standard Template Toolkit.  In particular, the 'url_quote' filter
+        can convert characters that are illegal or have special meaning in URLs,
+        such as &amp;, to the encoded form, ie %26.  This actually encodes most
+        characters (but not the common ones such as letters and numbers and so
+        on), including the HTML-special characters, so there's never a need to
+        HTML filter afterwards.
       </para>
-      <warning>
-	<para>
-	  Don't forget that you only have 64 groups masks available,
-	  total, for your installation of Bugzilla!  If you plan on
-	  having more than 50 products in your individual Bugzilla
-	  installation, and require group security for your products,
-	  you should consider either running multiple Bugzillas or
-	  using Generic Group Security instead of Product-Based
-	  ("usebuggroupsentry") Group Security.
-	</para>
-      </warning>
-      <orderedlist>
-	<listitem>
-	  <para>
-	    Turn "On" "usebuggroups" and "usebuggroupsentry" in the
-	    "Edit Parameters" screen.
-	  </para>
-	  <warning>
-	    <para>
-	      "usebuggroupsentry" has the capacity to prevent the
-	      administrative user from directly altering bugs because
-	      of conflicting group permissions. If you plan on using
-	      "usebuggroupsentry", you should plan on restricting
-	      administrative account usage to administrative duties
-	      only. In other words, manage bugs with an unpriveleged
-	      user account, and manage users, groups, Products, etc.
-	      with the administrative account.
-	    </para>
-	  </warning>
-	</listitem>
-	<listitem>
-	  <para>
-	    You will generally have no Groups set up, unless you
-	    enabled "usebuggroupsentry" prior to creating any
-	    Products.  To create "Generic Group Security" groups,
-	    follow the instructions given above.  To create
-	    Product-Based Group security, simply follow the
-	    instructions for creating a new Product.  If you need to
-	    add users to these new groups as you create them, you will
-	    find the option to add them to the group available under
-	    the "Edit User" screens.
-	  </para>
-	</listitem>
-      </orderedlist>
+ 
       <para>
-	You may find this example illustrative for how bug groups work.
-	<example>
-	  <title>Bugzilla Groups</title>
-	  <literallayout>
-Bugzilla Groups example
------------------------
-
-For this example, let us suppose we have four groups, call them
-Group1, Group2, Group3, and Group4.
-
-We have 5 users, User1, User2, User3, User4, User5.
-
-We have 8 bugs, Bug1, ..., Bug8.
-
-Group membership is defined by this chart:
-(X denotes that user is in that group.)
-(I apologize for the nasty formatting of this table.  Try viewing
-it in a text-based browser or something for now. -MPB)
-
-      G G G G
-      r r r r
-      o o o o
-      u u u u
-      p p p p
-      1 2 3 4
-     +-+-+-+-+
-User1|X| | | |
-     +-+-+-+-+
-User2| |X| | |
-     +-+-+-+-+
-User3|X| |X| |
-     +-+-+-+-+
-User4|X|X|X| |
-     +-+-+-+-+
-User5| | | | |
-     +-+-+-+-+
-
-Bug restrictions are defined by this chart:
-(X denotes that bug is restricted to that group.)
-
-     G G G G
-     r r r r
-     o o o o
-     u u u u
-     p p p p
-     1 2 3 4
-    +-+-+-+-+
-Bug1| | | | |
-    +-+-+-+-+
-Bug2| |X| | |
-    +-+-+-+-+
-Bug3| | |X| |
-    +-+-+-+-+
-Bug4| | | |X|
-    +-+-+-+-+
-Bug5|X|X| | |
-    +-+-+-+-+
-Bug6|X| |X| |
-    +-+-+-+-+
-Bug7|X|X|X| |
-    +-+-+-+-+
-Bug8|X|X|X|X|
-    +-+-+-+-+
-
-Who can see each bug?
-
-Bug1 has no group restrictions.  Therefore, Bug1 can be seen by any
-user, whatever their group membership.  This is going to be the only
-bug that User5 can see, because User5 isn't in any groups.
-
-Bug2 can be seen by anyone in Group2, that is User2 and User4.
-
-Bug3 can be seen by anyone in Group3, that is User3 and User4.
-
-Bug4 can be seen by anyone in Group4.  Nobody is in Group4, so none of
-these users can see Bug4.
-
-Bug5 can be seen by anyone who is in _both_ Group1 and Group2.  This
-is only User4.  User1 cannot see it because he is not in Group2, and
-User2 cannot see it because she is not in Group1.
-
-Bug6 can be seen by anyone who is in both Group1 and Group3.  This
-would include User3 and User4.  Similar to Bug5, User1 cannot see Bug6
-because he is not in Group3.
-
-Bug7 can be seen by anyone who is in Group1, Group2, and Group3.  This
-is only User4.  All of the others are missing at least one of those
-group priveleges, and thus cannot see the bug.
-
-Bug8 can be seen by anyone who is in Group1, Group2, Group3, and
-Group4.  There is nobody in all four of these groups, so nobody can
-see Bug8.  It doesn't matter that User4 is in Group1, Group2, and
-Group3, since he isn't in Group4.
-	  </literallayout>
-	</example>
+        Editing templates is a good way of doing a "poor man's custom fields".
+        For example, if you don't use the Status Whiteboard, but want to have
+        a free-form text entry box for "Build Identifier", then you can just
+        edit the templates to change the field labels. It's still be called
+        status_whiteboard internally, but your users don't need to know that.
       </para>
+      
+      <note>
+        <para>
+          If you are making template changes that you intend on submitting back
+          for inclusion in standard Bugzilla, you should read the relevant
+          sections of the 
+          <ulink url="http://www.bugzilla.org/developerguide.html">Developers'
+          Guide</ulink>.
+        </para>
+      </note>
     </section>
-  </section>
+            
+    
+    <section>
+      <title>Template Formats</title>
+      
+      <para>
+        Some CGIs have the ability to use more than one template. For
+        example, buglist.cgi can output bug lists as RDF or two
+        different forms of HTML (complex and simple). (Try this out
+        by appending <filename>&amp;format=simple</filename> to a buglist.cgi
+        URL on your Bugzilla installation.) This
+        mechanism, called template 'formats', is extensible.
+      </para>
+      
+      <para>
+        To see if a CGI supports multiple output formats, grep the
+        CGI for "ValidateOutputFormat". If it's not present, adding
+        multiple format support isn't too hard - see how it's done in
+        other CGIs.
+      </para>
+      
+      <para>
+        To make a new format template for a CGI which supports this, 
+        open a current template for
+        that CGI and take note of the INTERFACE comment (if present.) This 
+        comment defines what variables are passed into this template. If 
+        there isn't one, I'm afraid you'll have to read the template and
+        the code to find out what information you get. 
+      </para>     
   
-  <section id="security">
-    <title>Bugzilla Security</title>
-    <epigraph>
       <para>
-	Putting your money in a wall safe is better protection than
-	depending on the fact that no one knows that you hide your
-	money in a mayonnaise jar in your fridge.
+        Write your template in whatever markup or text style is appropriate.
       </para>
-    </epigraph>
-    <note>
+      
       <para>
-	Poorly-configured MySQL, Bugzilla, and FTP installations have
-	given attackers full access to systems in the past.  Please
-	take these guidelines seriously, even for Bugzilla machines
-	hidden away behind your firewall.  80% of all computer
-	trespassers are insiders, not anonymous crackers.
+        You now need to decide what content type you want your template
+        served as. Open up the <filename>localconfig</filename> file and find the 
+        <filename>$contenttypes</filename>
+        variable. If your content type is not there, add it. Remember
+        the three- or four-letter tag assigned to you content type. 
+        This tag will be part of the template filename.
       </para>
-    </note>
-    <para>
-      Secure your installation.
-      <note>
-	<para>
-	  These instructions must, of necessity, be somewhat vague
-	  since Bugzilla runs on so many different platforms.  If you
-	  have refinements of these directions for specific platforms,
-	  please submit them to <ulink url="mailto://mozilla-webtools@mozilla.org">mozilla-webtools@mozilla.org</ulink>
-	</para>
-      </note>
-      <orderedlist>
-	<listitem>
-	  <para>
-	    Ensure you are running at least MysQL version 3.22.32 or
-	    newer.  Earlier versions had notable security holes and
-	    poorly secured default configuration choices.
-	  </para>
-	</listitem>
-	<listitem>
-	  <para><emphasis>There is no substitute for understanding the
-	      tools on your system!</emphasis> Read <ulink url="http://www.mysql.com/documentation/mysql/bychapter/manual_Privilege_system.html"> The MySQL Privilege System</ulink> until you can recite it from memory!</para>
-	  <para>
-	    At the very least, ensure you password the "mysql -u root"
-	    account and the "bugs" account, establish grant table
-	    rights (consult the Keystone guide in Appendix C: The
-	    Bugzilla Database for some easy-to-use details) that do
-	    not allow CREATE, DROP, RELOAD, SHUTDOWN, and PROCESS for
-	    user "bugs".  I wrote up the Keystone advice back when I
-	    knew far less about security than I do now : )
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Lock down /etc/inetd.conf.  Heck, disable inet entirely on
-	    this box.  It should only listen to port 25 for Sendmail
-	    and port 80 for Apache.
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Do not run Apache as <quote>nobody</quote>.  This will
-	    require very lax permissions in your Bugzilla directories.
-	    Run it, instead, as a user with a name, set via your
-	    httpd.conf file.
-	    <note>
-	      <para>
-		<quote>nobody</quote> is a real user on UNIX systems.
-		Having a process run as user id <quote>nobody</quote>
-		is absolutely no protection against system crackers
-		versus using any other user account.  As a general
-		security measure, I recommend you create unique user
-		ID's for each daemon running on your system and, if
-		possible, use "chroot" to jail that process away from
-		the rest of your system.
-	      </para>
-	    </note>
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Ensure you have adequate access controls for the
-	    $BUGZILLA_HOME/data/ and $BUGZILLA_HOME/shadow/
-	    directories, as well as the $BUGZILLA_HOME/localconfig and
-	    $BUGZILLA_HOME/globals.pl files. The localconfig file
-	    stores your "bugs" user password, which would be terrible
-	    to have in the hands of a criminal, while the "globals.pl"
-	    stores some default information regarding your
-	    installation which could aid a system cracker. In
-	    addition, some files under $BUGZILLA_HOME/data/ store
-	    sensitive information, and $BUGZILLA_HOME/shadow/ stores
-	    bug information for faster retrieval.  If you fail to
-	    secure these directories and this file, you will expose
-	    bug information to those who may not be allowed to see it.
-	  </para>
-	  <note>
-	    <para>
-	      Bugzilla provides default .htaccess files to protect the
-	      most common Apache installations.  However, you should
-	      verify these are adequate according to the site-wide
-	      security policy of your web server, and ensure that the
-	      .htaccess files are allowed to "override" default
-	      permissions set in your Apache configuration files.
-	      Covering Apache security is beyond the scope of this
-	      Guide; please consult the Apache documentation for
-	      details.
-	    </para>
-	    <para>
-	      If you are using a web server that does not support the
-	      .htaccess control method, <emphasis>you are at
-		risk!</emphasis>  After installing, check to see if
-	      you can view the file "localconfig" in your web browser
-	      (e.g.:  <ulink url="http://bugzilla.mozilla.org/localconfig"> http://bugzilla.mozilla.org/localconfig</ulink>).  If you can read the contents of this file, your web server has not secured your bugzilla directory properly and you must fix this problem before deploying Bugzilla.  If, however, it gives you a "Forbidden" error, then it probably respects the .htaccess conventions and you are good to go.
-	    </para>
-	  </note>
-	  <para>
-	    On Apache, you can use .htaccess files to protect access
-	    to these directories, as outlined in <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=57161">Bug 57161</ulink> for the localconfig file, and <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=65572"> Bug 65572</ulink> for adequate protection in your data/ and shadow/ directories.
-	  </para>
-	  <para>
-	    Note the instructions which follow are Apache-specific.
-	    If you use IIS, Netscape, or other non-Apache web servers,
-	    please consult your system documentation for how to secure
-	    these files from being transmitted to curious users.
-	  </para>
-	  <para>
-	    Place the following text into a file named ".htaccess",
-	    readable by your web server, in your $BUGZILLA_HOME/data
-	    directory. <literallayout> &lt;Files comments&gt; allow
-	      from all &lt;/Files&gt; deny from all </literallayout>
-	  </para>
-	  <para>
-	    Place the following text into a file named ".htaccess",
-	    readable by your web server, in your $BUGZILLA_HOME/
-	    directory. <literallayout> &lt;Files localconfig&gt; deny
-	      from all &lt;/Files&gt; allow from all </literallayout>
-	  </para>
-	  <para>
-	    Place the following text into a file named ".htaccess",
-	    readable by your web server, in your $BUGZILLA_HOME/shadow
-	    directory. <literallayout> deny from all </literallayout>
-	  </para>
-	</listitem>
-      </orderedlist>
+      
+      <para>
+        Save the template as <filename>&lt;stubname&gt;-&lt;formatname&gt;.&lt;contenttypetag&gt;.tmpl</filename>. 
+        Try out the template by calling the CGI as 
+        <filename>&lt;cginame&gt;.cgi?format=&lt;formatname&gt;</filename> .
+      </para>       
+    </section>
+    
+    
+    <section>
+      <title>Particular Templates</title>
+      
+      <para>
+        There are a few templates you may be particularly interested in
+        customising for your installation.
+      </para>
+      
+      <para>
+        <command>index.html.tmpl</command>:
+        This is the Bugzilla front page.
+      </para>      
+
+      <para>
+        <command>global/header.html.tmpl</command>:
+        This defines the header that goes on all Bugzilla pages.
+        The header includes the banner, which is what appears to users
+        and is probably what you want to edit instead.  However the
+        header also includes the HTML HEAD section, so you could for
+        example add a stylesheet or META tag by editing the header.
+      </para>
+
+      <para>
+        <command>global/banner.html.tmpl</command>:
+        This contains the "banner", the part of the header that appears
+        at the top of all Bugzilla pages.  The default banner is reasonably
+        barren, so you'll probably want to customise this to give your
+        installation a distinctive look and feel.  It is recommended you
+        preserve the Bugzilla version number in some form so the version 
+        you are running can be determined, and users know what docs to read.
+      </para>
+
+      <para>
+        <command>global/footer.html.tmpl</command>:
+        This defines the footer that goes on all Bugzilla pages.  Editing
+        this is another way to quickly get a distinctive look and feel for
+        your Bugzilla installation.
+      </para>
+
+      <para>
+        <command>bug/create/user-message.html.tmpl</command>:
+        This is a message that appears near the top of the bug reporting page.
+        By modifying this, you can tell your users how they should report
+        bugs.
+      </para>
+        
+      <para>
+        <command>bug/create/create.html.tmpl</command> and
+        <command>bug/create/comment.txt.tmpl</command>:
+        You may wish to get bug submitters to give certain bits of structured
+        information, each in a separate input widget, for which there is not a
+        field in the database. The bug entry system has been designed in an
+        extensible fashion to enable you to define arbitrary fields and widgets,
+        and have their values appear formatted in the initial
+        Description, rather than in database fields. An example of this
+        is the mozilla.org 
+        <ulink url="http://bugzilla.mozilla.org/enter_bug.cgi?format=guided">guided 
+        bug submission form</ulink>.
+      </para>
+
+      <para>
+        To make this work, create a custom template for 
+        <filename>enter_bug.cgi</filename> (the default template, on which you
+        could base it, is <filename>create.html.tmpl</filename>),
+        and either call it <filename>create.html.tmpl</filename> or use a format and
+        call it <filename>create-&lt;formatname&gt;.html.tmpl</filename>.
+        Put it in the <filename class="directory">custom/bug/create</filename>
+        directory. In it, add widgets for each piece of information you'd like
+        collected - such as a build number, or set of steps to reproduce.
+      </para>
+
+      <para>
+        Then, create a template like 
+        <filename>custom/bug/create/comment.txt.tmpl</filename>, also named
+        after your format if you are using one, which
+        references the form fields you have created. When a bug report is
+        submitted, the initial comment attached to the bug report will be
+        formatted according to the layout of this template.
+      </para> 
+
+      <para>
+        For example, if your enter_bug template had a field
+        <programlisting>&lt;input type="text" name="buildid" size="30"&gt;</programlisting>
+        and then your comment.txt.tmpl had
+        <programlisting>BuildID: [% form.buildid %]</programlisting>
+        then
+        <programlisting>BuildID: 20020303</programlisting>
+        would appear in the initial checkin comment.
+      </para>        
+    </section>          
+    
+  </section>
+
+  <section id="upgrading">
+    <title>Upgrading to New Releases</title>
+
+    <para>A plain Bugzilla is fairly easy to upgrade from one version to a
+    newer one. Always read the release notes to see if there are any issues
+    that you might need to take note of. It is recommended that you take a 
+    backup of your database and your entire Bugzilla installation before attempting an
+    upgrade. You can upgrade a 'clean' installation by untarring a new
+    tarball over the old installation. If you are upgrading from 2.12 or
+    later, and have cvs installed, you can type <filename>cvs -z3 update</filename>, 
+    and resolve conflicts if there are any.
     </para>
+    
+    <para>However, things get a bit more complicated if you've made
+    changes to Bugzilla's code. In this case, you may have to re-make or
+    reapply those changes. One good method is to take a diff of your customised
+    version against the original, so you can survey all that you've changed.
+    Hopefully, templatisation will reduce the need for
+    this in the future.</para>
+
+    <para>From version 2.8 onwards, Bugzilla databases can be automatically
+    carried forward during an upgrade. However, because the developers of
+    Bugzilla are constantly adding new
+    tables, columns and fields, you'll probably get SQL errors if you just
+    update the code and attempt to use Bugzilla. Always run the
+    <filename>checksetup.pl</filename> 
+    script whenever you upgrade your installation.</para>
+
+    <para>If you are running Bugzilla version 2.8 or lower, and wish to
+    upgrade to the latest version, please consult the file,
+    "UPGRADING-pre-2.8" in the Bugzilla root directory after untarring the
+    archive.</para>
   </section>
+
+  <!-- Integrating Bugzilla with Third-Party Tools -->
+  &integration;
+
 </chapter>
+
 <!-- Keep this comment at the end of the file
 Local variables:
 mode: sgml
@@ -1456,3 +1235,4 @@ sgml-shorttag:t
 sgml-tag-region-if-active:t
 End:
 -->
+
diff --git a/docs/sgml/conventions.sgml b/docs/sgml/conventions.sgml
index 71f2b0c5e..7334b02b8 100644
--- a/docs/sgml/conventions.sgml
+++ b/docs/sgml/conventions.sgml
@@ -1,99 +1,153 @@
 <!-- <!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> -->
-
 <section id="conventions">
   <title>Document Conventions</title>
-  
+
   <indexterm zone="conventions">
     <primary>conventions</primary>
   </indexterm>
-  
-  <para>
-    This document uses the following conventions
-  </para>
-  
+
+  <para>This document uses the following conventions:</para>
+
   <informaltable frame="none">
     <tgroup cols="2">
       <thead>
         <row>
           <entry>Descriptions</entry>
+
           <entry>Appearance</entry>
         </row>
       </thead>
+
       <tbody>
         <row>
           <entry>Warnings</entry>
-          <entry><caution>
-              <para>Warnings.</para>
-            </caution></entry>
+
+          <entry>
+            <caution>
+              <para>Don't run with scissors!</para>
+            </caution>
+          </entry>
         </row>
+
         <row>
           <entry>Hint</entry>
-          <entry><tip>
-              <para>Hint.</para>
-            </tip></entry>
+
+          <entry>
+            <tip>
+              <para>Would you like a breath mint?</para>
+            </tip>
+          </entry>
         </row>
+
         <row>
           <entry>Notes</entry>
-          <entry><note>
-              <para>Note.</para>
-            </note></entry>
+
+          <entry>
+            <note>
+              <para>Dear John...</para>
+            </note>
+          </entry>
         </row>
+
         <row>
           <entry>Information requiring special attention</entry>
-          <entry><warning>
-              <para>Warning.</para>
-            </warning></entry>
+
+          <entry>
+            <warning>
+              <para>Read this or the cat gets it.</para>
+            </warning>
+          </entry>
         </row>
+
         <row>
           <entry>File Names</entry>
-          <entry><filename>file.extension</filename></entry>
+
+          <entry>
+            <filename>filename</filename>
+          </entry>
         </row>
+
         <row>
           <entry>Directory Names</entry>
-          <entry><filename class="directory">directory</filename></entry>
+
+          <entry>
+            <filename class="directory">directory</filename>
+          </entry>
         </row>
+
         <row>
           <entry>Commands to be typed</entry>
-          <entry><command>command</command></entry>
+
+          <entry>
+            <command>command</command>
+          </entry>
         </row>
+
         <row>
           <entry>Applications Names</entry>
-          <entry><application>application</application></entry>
+
+          <entry>
+            <application>application</application>
+          </entry>
         </row>
+
         <row>
-          <entry><foreignphrase>Prompt</foreignphrase> of users command under bash shell</entry>
+          <entry>
+          <foreignphrase>Prompt</foreignphrase>
+
+          of users command under bash shell</entry>
+
           <entry>bash$</entry>
         </row>
+
         <row>
-          <entry><foreignphrase>Prompt</foreignphrase> of root users command under bash shell</entry>
+          <entry>
+          <foreignphrase>Prompt</foreignphrase>
+
+          of root users command under bash shell</entry>
+
           <entry>bash#</entry>
         </row>
-	<row>
-	  <entry><foreignphrase>Prompt</foreignphrase> of user command under tcsh shell</entry>
-	  <entry>tcsh$</entry>
-	</row>
+
+        <row>
+          <entry>
+          <foreignphrase>Prompt</foreignphrase>
+
+          of user command under tcsh shell</entry>
+
+          <entry>tcsh$</entry>
+        </row>
+
         <row>
           <entry>Environment Variables</entry>
-          <entry><envar>VARIABLE</envar></entry>
+
+          <entry>
+            <envar>VARIABLE</envar>
+          </entry>
         </row>
+
         <row>
           <entry>Emphasized word</entry>
-          <entry><emphasis>word</emphasis></entry>
+
+          <entry>
+            <emphasis>word</emphasis>
+          </entry>
         </row>
+
         <row>
           <entry>Code Example</entry>
-          <entry><programlisting><sgmltag class="starttag">para</sgmltag>Beginning and end of paragraph<sgmltag class="endtag">para</sgmltag></programlisting></entry> 
+
+          <entry>
+            <programlisting><sgmltag class="starttag">para</sgmltag>
+Beginning and end of paragraph
+<sgmltag class="endtag">para</sgmltag></programlisting>
+          </entry>
         </row>
       </tbody>
     </tgroup>
   </informaltable>
-  
 </section>
 
-
-
-
-
 <!-- Keep this comment at the end of the file
 Local variables:
 mode: sgml
@@ -114,3 +168,4 @@ sgml-shorttag:t
 sgml-tag-region-if-active:t
 End:
 -->
+
diff --git a/docs/sgml/database.sgml b/docs/sgml/database.sgml
index 7ff52134c..d758259da 100644
--- a/docs/sgml/database.sgml
+++ b/docs/sgml/database.sgml
@@ -1,153 +1,177 @@
 <!-- <!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> -->
-
 <appendix id="database">
+  <title>The Bugzilla Database</title>
 
-<title>The Bugzilla Database</title>
-<note>
-<para>
-      This document really needs to be updated with more fleshed out information about primary keys, interrelationships, and maybe some nifty tables to document dependencies.  Any takers?
-    </para>
+  <note>
+    <para>This document really needs to be updated with more fleshed out
+    information about primary keys, interrelationships, and maybe some nifty
+    tables to document dependencies. Any takers?</para>
   </note>
+
   <section id="dbschema">
     <title>Database Schema Chart</title>
+
     <para>
       <mediaobject>
-	<imageobject>
-	  <imagedata fileref="../images/dbschema.jpg" format="jpg">
-	</imageobject>
-	
-	<textobject>
-	  <phrase>Database Relationships</phrase>
-	</textobject>
-
-	<caption>
-	  <para>Bugzilla database relationships chart</para>
-	</caption>
+        <imageobject>
+          <imagedata fileref="../images/dbschema.jpg" format="JPG" />
+        </imageobject>
+
+        <textobject>
+          <phrase>Database Relationships</phrase>
+        </textobject>
+
+        <caption>
+          <para>Bugzilla database relationships chart</para>
+        </caption>
       </mediaobject>
     </para>
   </section>
 
   <section id="dbdoc">
-<title>MySQL Bugzilla Database Introduction</title>
-    <para>
-      This information comes straight from my life.  I was forced to learn how
-      Bugzilla organizes database because of nitpicky requests from users for tiny
-      changes in wording, rather than having people re-educate themselves or
-      figure out how to work our procedures around the tool.  It sucks, but it can
-      and will happen to you, so learn how the schema works and deal with it when it
-      comes.
-    </para>
-
-  <para>
-      So, here you are with your brand-new installation of Bugzilla.  You've got
-      MySQL set up, Apache working right, Perl DBI and DBD talking to the database
-      flawlessly.  Maybe you've even entered a few test bugs to make sure email's
-      working; people seem to be notified of new bugs and changes, and you can
-      enter and edit bugs to your heart's content.  Perhaps you've gone through the
-      trouble of setting up a gateway for people to submit bugs to your database via
-      email, have had a few people test it, and received rave reviews from your beta
-      testers.
-    </para>
-    <para>
-      What's the next thing you do?  Outline a training strategy for your
-      development team, of course, and bring them up to speed on the new tool you've
-      labored over for hours.
-    </para>
-    <para>
-      Your first training session starts off very well!  You have a captive
-      audience which seems enraptured by the efficiency embodied in this thing called
-      "Bugzilla".  You are caught up describing the nifty features, how people can
-      save favorite queries in the database, set them up as headers and footers on
-      their pages, customize their layouts, generate reports, track status with
-      greater efficiency than ever before, leap tall buildings with a single bound
-      and rescue Jane from the clutches of Certain Death!
-    </para>
-    <para>
-      But Certain Death speaks up -- a tiny voice, from the dark corners of the
-      conference room.  "I have a concern," the voice hisses from the darkness,
-      "about the use of the word 'verified'.
-    </para>
-    <para>
-      The room, previously filled with happy chatter, lapses into reverential
-      silence as Certain Death (better known as the Vice President of Software
-      Engineering) continues.  "You see, for two years we've used the word 'verified'
-      to indicate that a developer or quality assurance engineer has confirmed that,
-      in fact, a bug is valid. I don't want to lose two years of training to a
-      new software product.  You need to change the bug status of 'verified' to
-      'approved' as soon as possible. To avoid confusion, of course."
-    </para>
-    <para>
-      Oh no!  Terror strikes your heart, as you find yourself mumbling "yes, yes, I
-      don't think that would be a problem," You review the changes with Certain
-      Death, and continue to jabber on, "no, it's not too big a change. I mean, we
-      have the source code, right? You know, 'Use the Source, Luke' and all that...
-      no problem," All the while you quiver inside like a beached jellyfish bubbling,
-      burbling, and boiling on a hot Jamaican sand dune...
-    </para>
-    <para>
-      Thus begins your adventure into the heart of Bugzilla.  You've been forced
-      to learn about non-portable enum() fields, varchar columns, and tinyint
-      definitions. The Adventure Awaits You!
-    </para>
+    <title>MySQL Bugzilla Database Introduction</title>
+
+    <para>This information comes straight from my life. I was forced to learn
+    how Bugzilla organizes database because of nitpicky requests from users
+    for tiny changes in wording, rather than having people re-educate
+    themselves or figure out how to work our procedures around the tool. It
+    sucks, but it can and will happen to you, so learn how the schema works
+    and deal with it when it comes.</para>
+
+    <para>So, here you are with your brand-new installation of Bugzilla.
+    You've got MySQL set up, Apache working right, Perl DBI and DBD talking
+    to the database flawlessly. Maybe you've even entered a few test bugs to
+    make sure email's working; people seem to be notified of new bugs and
+    changes, and you can enter and edit bugs to your heart's content. Perhaps
+    you've gone through the trouble of setting up a gateway for people to
+    submit bugs to your database via email, have had a few people test it,
+    and received rave reviews from your beta testers.</para>
+
+    <para>What's the next thing you do? Outline a training strategy for your
+    development team, of course, and bring them up to speed on the new tool
+    you've labored over for hours.</para>
+
+    <para>Your first training session starts off very well! You have a
+    captive audience which seems enraptured by the efficiency embodied in
+    this thing called "Bugzilla". You are caught up describing the nifty
+    features, how people can save favorite queries in the database, set them
+    up as headers and footers on their pages, customize their layouts,
+    generate reports, track status with greater efficiency than ever before,
+    leap tall buildings with a single bound and rescue Jane from the clutches
+    of Certain Death!</para>
+
+    <para>But Certain Death speaks up -- a tiny voice, from the dark corners
+    of the conference room. "I have a concern," the voice hisses from the
+    darkness, "about the use of the word 'verified'.</para>
+
+    <para>The room, previously filled with happy chatter, lapses into
+    reverential silence as Certain Death (better known as the Vice President
+    of Software Engineering) continues. "You see, for two years we've used
+    the word 'verified' to indicate that a developer or quality assurance
+    engineer has confirmed that, in fact, a bug is valid. I don't want to
+    lose two years of training to a new software product. You need to change
+    the bug status of 'verified' to 'approved' as soon as possible. To avoid
+    confusion, of course."</para>
+
+    <para>Oh no! Terror strikes your heart, as you find yourself mumbling
+    "yes, yes, I don't think that would be a problem," You review the changes
+    with Certain Death, and continue to jabber on, "no, it's not too big a
+    change. I mean, we have the source code, right? You know, 'Use the
+    Source, Luke' and all that... no problem," All the while you quiver
+    inside like a beached jellyfish bubbling, burbling, and boiling on a hot
+    Jamaican sand dune...</para>
+
+    <para>Thus begins your adventure into the heart of Bugzilla. You've been
+    forced to learn about non-portable enum() fields, varchar columns, and
+    tinyint definitions. The Adventure Awaits You!</para>
 
     <section>
       <title>Bugzilla Database Basics</title>
+
+      <para>If you were like me, at this point you're totally clueless about
+      the internals of MySQL, and if it weren't for this executive order from
+      the Vice President you couldn't care less about the difference between
+      a 
+      <quote>bigint</quote>
+
+      and a 
+      <quote>tinyint</quote>
+
+      entry in MySQL. I recommend you refer to the MySQL documentation,
+      available at 
+      <ulink url="http://www.mysql.com/doc.html">MySQL.com</ulink>
+
+      . Below are the basics you need to know about the Bugzilla database.
+      Check the chart above for more details.</para>
+
       <para>
-	If you were like me, at this point you're totally clueless
-	about the internals of MySQL, and if it weren't for this
-	executive order from the Vice President you couldn't care less
-	about the difference between a <quote>bigint</quote> and a
-	<quote>tinyint</quote> entry in MySQL.   I recommend you refer
-	to the MySQL documentation, available at <ulink url="http://www.mysql.com/doc.html">MySQL.com</ulink>.  Below are the basics you need to know about the Bugzilla database.  Check the chart above for more details.
-      </para>
-      <para><orderedlist>
-	  <listitem>
-	    <para>
-	      To connect to your database:
-	    </para>
-	    <para>
-	      <prompt>bash#</prompt><command>mysql</command><parameter>-u root</parameter>
-	    </para>
-	    <para>
-	      If this works without asking you for a password,
-	      <emphasis>shame on you</emphasis>!  You should have
-	      locked your security down like the installation
-	      instructions told you to.  You can find details on
-	      locking down your database in the Bugzilla FAQ in this
-	      directory (under "Security"), or more robust security
-	      generalities in the MySQL searchable documentation at
-	      http://www.mysql.com/php/manual.php3?section=Privilege_system .
-	    </para>
-	  </listitem>
-
-	  <listitem>
-	    <para>You should now be at a prompt that looks like
-	      this:</para>
-	    <para><prompt>mysql></prompt></para>
-	    <para>At the prompt, if <quote>bugs</quote> is the name
-	      you chose in the<filename>localconfig</filename> file
-	      for your Bugzilla database, type:</para>
-	    <para><prompt>mysql</prompt><command>use bugs;</command></para>
-	    <note>
-	      <para>Don't forget the <quote>;</quote> at the end of
-		each line, or you'll be kicking yourself later.</para>
-	    </note>
-	  </listitem>
-	</orderedlist>
+        <orderedlist>
+          <listitem>
+            <para>To connect to your database:</para>
+
+            <para>
+              <prompt>bash#</prompt>
+
+              <command>mysql</command>
+
+              <parameter>-u root</parameter>
+            </para>
+
+            <para>If this works without asking you for a password, 
+            <emphasis>shame on you</emphasis>
+
+            ! You should have locked your security down like the installation
+            instructions told you to. You can find details on locking down
+            your database in the Bugzilla FAQ in this directory (under
+            "Security"), or more robust security generalities in the 
+            <ulink url="http://www.mysql.com/php/manual.php3?section=Privilege_system">MySQL
+            searchable documentation</ulink>.            
+            </para>
+          </listitem>
+
+          <listitem>
+            <para>You should now be at a prompt that looks like this:</para>
+
+            <para>
+              <prompt>mysql&gt;</prompt>
+            </para>
+
+            <para>At the prompt, if 
+            <quote>bugs</quote>
+
+            is the name you chose in the
+            <filename>localconfig</filename>
+
+            file for your Bugzilla database, type:</para>
+
+            <para>
+              <prompt>mysql</prompt>
+
+              <command>use bugs;</command>
+            </para>
+
+          </listitem>
+        </orderedlist>
       </para>
+
       <section>
-	<title>Bugzilla Database Tables</title>
-	<para>  Imagine your MySQL database as a series of
-	  spreadsheets, and you won't be too far off.  If you use this
-	  command:</para>
-	<para><prompt>mysql></prompt><command>show tables from bugs;</command></para>
-	<para>you'll be able to see all the
-	  <quote>spreadsheets</quote> (tables) in your database.  It
-	  is similar to a file system, only faster and more robust for
-	  certain types of operations.</para>
-	<para>From the command issued above, ou should have some
+        <title>Bugzilla Database Tables</title>
+
+        <para>Imagine your MySQL database as a series of spreadsheets, and
+        you won't be too far off. If you use this command:</para>
+
+        <para>
+          <prompt>mysql&gt;</prompt>
+          <command>show tables from bugs;</command>
+        </para>
+
+        <para>you'll be able to see the names of all the 
+        <quote>spreadsheets</quote>
+        (tables) in your database.</para>
+
+ 	<para>From the command issued above, ou should have some
 	  output that looks like this:
-	  <programlisting>
+<programlisting>
 +-------------------+
 | Tables in bugs    |
 +-------------------+
@@ -174,9 +198,10 @@
 | votes             |
 | watch             |
 +-------------------+
-	  </programlisting></para>
-<literallayout>
+</programlisting>
+</para>
 
+<literallayout>
   Here's an overview of what each table does.  Most columns in each table have
 descriptive names that make it fairly trivial to figure out their jobs.
 
@@ -338,216 +363,11 @@ Although you can query by the enum field, you can't give something a status
 of "APPROVED" until you make the perl changes.   Note that this change I
 mentioned can also be done by editing checksetup.pl, which automates a lot of
 this.  But you need to know this stuff anyway, right?
-
-  I hope this database tutorial has been useful for you.  If you have comments
-to add, questions, concerns, etc. please direct them to
-mbarnson@excitehome.net.  Please direct flames to /dev/null :)  Have a nice
-day!
-
-
-
-===
-LINKS
-===
-
-Great MySQL tutorial site:
-http://www.devshed.com/Server_Side/MySQL/
-
 	</literallayout>
       </section>
     </section>
   </section>
 
-  <section id="granttables">
-    <title>MySQL Permissions & Grant Tables</title>
-    
-    <note>
-      <para>The following portion of documentation comes from my
-	answer to an old discussion of Keystone, a cool product that
-	does trouble-ticket tracking for IT departments.  I wrote this
-	post to the  Keystone support group regarding MySQL grant
-	table permissions, and how to use them effectively. It is
-	badly in need of updating, as I believe MySQL has added a
-	field or two to the grant tables  since this time, but it
-	serves as a decent introduction and troubleshooting document
-	for grant table issues.  I used Keynote to track my troubles
-	until I discovered Bugzilla, which gave me a whole new set of
-	troubles to work on : )  Although it is of limited use, it
-	still has SOME use, thus it's still included.</para>
-      <para>
-	Please note, however, that I was a relatively new user to
-	MySQL at the time.  Some of my suggestions, particularly in
-	how to set up security, showed a terrible lack of
-	security-related database experience.
-      </para>
-    </note>
-    
-    <literallayout>
-From matt_barnson@singletrac.com Wed Jul  7 09:00:07 1999
-Date: Mon, 1 Mar 1999 21:37:04 -0700 
-From: Matthew Barnson matt_barnson@singletrac.com
-To: keystone-users@homeport.org
-Subject: [keystone-users] Grant Tables FAQ
-
-    [The following text is in the "iso-8859-1" character set]
-    [Your display is set for the "US-ASCII" character set]
-    [Some characters may be displayed incorrectly]
-
-Maybe we can include this rambling message in the Keystone FAQ?  It gets
-asked a lot, and the only option current listed in the FAQ is
-"--skip-grant-tables".
-
-Really, you can't go wrong by reading section 6 of the MySQL manual, at
-http://www.mysql.com/Manual/manual.html.  I am sure their description is
-better than mine.
-
-MySQL runs fine without permissions set up correctly if you run the mysql
-daemon with the "--skip-grant-tables" option.  Running this way denies
-access to nobody.  Unfortunately, unless you've got yourself firewalled it
-also opens the potential for abuse if someone knows you're running it.
-
-Additionally, the default permissions for MySQL allow anyone at localhost
-access to the database if the database name begins with "test_" or is named
-"test" (i.e. "test_keystone").  You can change the name of your database in
-the keystone.conf file ($sys_dbname).  This is the way I am doing it for
-some of my databases, and it works fine.
-
-The methods described below assume you're running MySQL on the same box as
-your webserver, and that you don't mind if your $sys_dbuser for Keystone has
-superuser access.  See near the bottom of this message for a description of
-what each field does.
-
-Method #1:
-
-1.  cd /var/lib
-	#location where you'll want to run /usr/bin/mysql_install_db shell
-script from to get it to work.
-
-2.  ln -s mysql data  
-	# soft links the "mysql" directory to "data", which is what
-mysql_install_db expects.  Alternately, you can edit mysql_install_db and
-change all the "./data" references to "./mysql".
-
-3.  Edit /usr/bin/mysql_install_db with your favorite text editor (vi,
-emacs, jot, pico, etc.)
-A)  Copy the "INSERT INTO db VALUES
-('%','test\_%','','Y','Y','Y','Y','Y','Y');" and paste it immediately after
-itself.  Chage the 'test\_%' value to 'keystone', or the value of
-$sys_dbname in keystone.conf.
-B)  If you are running your keystone database with any user, you'll need to
-copy the "INSERT INTO user VALUES
-('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');" line after
-itself and change 'root' to the name of the keystone database user
-($sys_dbuser) in keystone.conf.
-
-	# adds entries to the script to create grant tables for specific
-hosts and users.  The user you set up has super-user access ($sys_dbuser) --
-you may or may not want this.  The layout of mysql_install_db is really very
-uncomplicated.
-
-4.  /usr/bin/mysqladmin shutdown
-	# ya gotta shut it down before you can reinstall the grant tables!
-
-5.  rm -i /var/lib/mysql/mysql/*.IS?' and answer 'Y' to the deletion
-questions.
-	# nuke your current grant tables.  This WILL NOT delete any other
-databases than your grant tables.
-
-6.  /usr/bin/mysql_install_db
-	# run the script you just edited to install your new grant tables.
-
-7.  mysqladmin -u root password (new_password)  
-	# change the root MySQL password, or else anyone on localhost can
-login to MySQL as root and make changes.  You can skip this step if you want
-keystone to connect as root with no password.
-
-8.  mysqladmin -u (webserver_user_name) password (new_password)  
-	# change the password of the $sys_dbuser.  Note that you will need
-to change the password in the keystone.conf file as well in $sys_dbpasswd,
-and if your permissions are set up incorrectly anybody can type the URL to
-your keystone.conf file and get the password.  Not that this will help them
-much if your permissions are set to @localhost.
-
-
-
-Method #2:  easier, but a pain reproducing if you have to delete your grant
-tables.  This is the "recommended" method for altering grant tables in
-MySQL.  I don't use it because I like the other way :)
-
-shell> mysql --user=root keystone
-
-mysql> GRANT
-SELECT,INSERT,UPDATE,DELETE,INDEX,ALTER,CREATE,DROP,RELOAD,SHUTDOWN,PROCESS,
-FILE,
-           ON keystone.*
-           TO <$sys_dbuser name>@localhost
-           IDENTIFIED BY '(password)'
-	     WITH GRANT OPTION;
-
-OR
-
-mysql> GRANT ALL PRIVELEGES 
-		ON keystone.*
-		TO <$sys_dbuser name>@localhost
-		IDENTIFIED BY '(password)'
-		WITH GRANT OPTION;
-
-	# this grants the required permissions to the keystone ($sys_dbuser)
-account defined in keystone.conf.  However, if you are runnning many
-different MySQL-based apps, as we are, it's generally better to edit the
-mysql_install_db script to be able to quickly reproduce your permissions
-structure again.  Note that the FILE privelege and WITH GRANT OPTION may not
-be in your best interest to include.
-
-
-GRANT TABLE FIELDS EXPLANATION:
-Quick syntax summary:  "%" in MySQL is a wildcard.  I.E., if you are
-defining your DB table and in the 'host' field and enter '%', that means
-that any host can access that database.  Of course, that host must also have
-a valid db user in order to do anything useful.  'db'=name of database.  In
-our case, it should be "keystone".  "user" should be your "$sys_dbuser"
-defined in keystone.conf.  Note that you CANNOT add or change a password by
-using the "INSERT INTO db (X)" command -- you must change it with the mysql
--u command as defined above.  Passwords are stored encrypted in the MySQL
-database, and if you try to enter it directly into the table they will not
-match.
-
-TABLE:  USER.  Everything after "password" is a privelege granted (Y/N).
-This table controls individual user global access rights.
-
-'host','user','password','select','insert','update','delete','index','alter'
-,'create','drop','grant','reload','shutdown','process','file'
-
-TABLE:  DB.  This controls access of USERS to databases.
-
-'host','db','user','select','insert','update','delete','index','alter','crea
-te','drop','grant'
-
-TABLE:  HOST.  This controls which HOSTS are allowed what global access
-rights.  Note that the HOST table, USER table, and DB table are very closely
-connected -- if an authorized USER attempts an SQL request from an
-unauthorized HOST, she's denied.  If a request from an authorized HOST is
-not an authorized USER, it is denied.  If a globally authorized USER does
-not have rights to a certain DB, she's denied.  Get the picture?
-
-'host','db','select','insert','update','delete','index','alter','create','dr
-op','grant'
-
-
-You should now have a working knowledge of MySQL grant tables.  If there is
-anything I've left out of this answer that you feel is pertinent, or if my
-instructions don't work for you, please let me know and I'll re-post this
-letter again, corrected.  I threw it together one night out of exasperation
-for all the newbies who don't know squat about MySQL yet, so it is almost
-guaranteed to have errors.
-
-Once again, you can't go wrong by reading section 6 of the MySQL manual.  It
-is more detailed than I!
-http://www.mysql.com/Manual/manual.html.
-
-    </literallayout>
-  </section>
-  
 </appendix>
 
 <!-- Keep this comment at the end of the file
@@ -570,3 +390,4 @@ sgml-shorttag:t
 sgml-tag-region-if-active:t
 End:
 -->
+
diff --git a/docs/sgml/dbschema.mysql b/docs/sgml/dbschema.mysql
index c75c4caa4..8b1378917 100644
--- a/docs/sgml/dbschema.mysql
+++ b/docs/sgml/dbschema.mysql
@@ -1,309 +1 @@
-# MySQL dump 7.1
-#
-# Host: localhost    Database: bugs
-#--------------------------------------------------------
-# Server version	3.22.32
 
-#
-# Table structure for table 'attachments'
-#
-CREATE TABLE attachments (
-  attach_id mediumint(9) DEFAULT '0' NOT NULL auto_increment,
-  bug_id mediumint(9) DEFAULT '0' NOT NULL,
-  creation_ts timestamp(14),
-  description mediumtext NOT NULL,
-  mimetype mediumtext NOT NULL,
-  ispatch tinyint(4),
-  filename mediumtext NOT NULL,
-  thedata longblob NOT NULL,
-  submitter_id mediumint(9) DEFAULT '0' NOT NULL,
-  PRIMARY KEY (attach_id)
-);
-create index index_41 on attachments (bug_id); 
-create index index_42 on attachments (creation_ts);
-
-#
-# Table structure for table 'bugs'
-#
-CREATE TABLE bugs (
-  bug_id mediumint(9) DEFAULT '0' NOT NULL auto_increment,
-  groupset bigint(20) DEFAULT '0' NOT NULL,
-  assigned_to mediumint(9) DEFAULT '0' NOT NULL,
-  bug_file_loc text,
-  bug_severity enum DEFAULT 'blocker' NOT NULL,
-  bug_status enum DEFAULT 'UNCONFIRMED' NOT NULL,
-  creation_ts datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
-  delta_ts timestamp(14),
-  short_desc mediumtext,
-  op_sys enum DEFAULT 'All' NOT NULL,
-  priority enum DEFAULT 'P1' NOT NULL,
-  product varchar(64) DEFAULT '' NOT NULL,
-  rep_platform enum,
-  reporter mediumint(9) DEFAULT '0' NOT NULL,
-  version varchar(16) DEFAULT '' NOT NULL,
-  component varchar(50) DEFAULT '' NOT NULL,
-  resolution enum DEFAULT '' NOT NULL,
-  target_milestone varchar(20) DEFAULT '---' NOT NULL,
-  qa_contact mediumint(9) DEFAULT '0' NOT NULL,
-  status_whiteboard mediumtext NOT NULL,
-  votes mediumint(9) DEFAULT '0' NOT NULL,
-  keywords mediumtext NOT NULL,
-  lastdiffed datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
-  everconfirmed tinyint(4) DEFAULT '0' NOT NULL,
-  PRIMARY KEY (bug_id)
-);
-create index index_7 on bugs (assigned_to);
-create index index_8 on bugs (creation_ts);
-create index index_9 on bugs (delta_ts);
-create index index_10 on bugs (bug_severity);
-create index index_11 on bugs (bug_status);
-create index index_12 on bugs (op_sys);
-create index index_13 on bugs (priority);
-create index index_14 on bugs (product);
-create index index_15 on bugs (reporter);
-create index index_16 on bugs (version);
-create index index_17 on bugs (component);
-create index index_18 on bugs (resolution);
-create index index_19 on bugs (target_milestone); 
-create index index_20 on bugs (qa_contact);
-create index index_21 on bugs (votes);
-
-#
-# Table structure for table 'bugs_activity'
-#
-CREATE TABLE bugs_activity (
-  bug_id mediumint(9) DEFAULT '0' NOT NULL,
-  who mediumint(9) DEFAULT '0' NOT NULL,
-  bug_when datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
-  fieldid mediumint(9) DEFAULT '0' NOT NULL,
-  oldvalue tinytext,
-  newvalue tinytext
-);
-create index index_43 on bugs_activity (bug_id); 
-create index index_44 on bugs_activity (bug_when); 
-create index index_45 on bugs_activity (fieldid);
-
-#
-# Table structure for table 'cc'
-#
-CREATE TABLE cc (
-  bug_id mediumint(9) DEFAULT '0' NOT NULL,
-  who mediumint(9) DEFAULT '0' NOT NULL
-);
-create index index_31 on cc (who);
-create unique index index_32 on cc (bug_id,who);
-
-#
-# Table structure for table 'components'
-#
-CREATE TABLE components (
-  value tinytext,
-  program varchar(64),
-  initialowner tinytext NOT NULL,
-  initialqacontact tinytext NOT NULL,
-  description mediumtext NOT NULL
-);
-
-#
-# Table structure for table 'dependencies'
-#
-CREATE TABLE dependencies (
-  blocked mediumint(9) DEFAULT '0' NOT NULL,
-  dependson mediumint(9) DEFAULT '0' NOT NULL
-);
-create index index_34 on dependencies (blocked); 
-create index index_35 on dependencies (dependson);
-
-#
-# Table structure for table 'duplicates'
-#
-CREATE TABLE duplicates (
-  dupe_of mediumint(9) DEFAULT '0' NOT NULL,
-  dupe mediumint(9) DEFAULT '0' NOT NULL,
-  PRIMARY KEY (dupe)
-);
-
-#
-# Table structure for table 'fielddefs'
-#
-CREATE TABLE fielddefs (
-  fieldid mediumint(9) DEFAULT '0' NOT NULL auto_increment,
-  name varchar(64) DEFAULT '' NOT NULL,
-  description mediumtext NOT NULL,
-  mailhead tinyint(4) DEFAULT '0' NOT NULL,
-  sortkey smallint(6) DEFAULT '0' NOT NULL,
-  PRIMARY KEY (fieldid)
-);
-create unique index index_28 on fielddefs (name); 
-create index index_29 on fielddefs (sortkey);
-
-#
-# Table structure for table 'groups'
-#
-CREATE TABLE groups (
-  bit bigint(20) DEFAULT '0' NOT NULL,
-  name varchar(255) DEFAULT '' NOT NULL,
-  description text NOT NULL,
-  isbuggroup tinyint(4) DEFAULT '0' NOT NULL,
-  userregexp tinytext NOT NULL
-);
-create unique index index_3 on groups (bit);
-create unique index index_4 on groups (name);
-
-#
-# Table structure for table 'keyworddefs'
-#
-CREATE TABLE keyworddefs (
-  id smallint(6) DEFAULT '0' NOT NULL,
-  name varchar(64) DEFAULT '' NOT NULL,
-  description mediumtext,
-  PRIMARY KEY (id)
-);
-create unique index index_33 on keyworddefs (name);
-
-#
-# Table structure for table 'keywords'
-#
-CREATE TABLE keywords (
-  bug_id mediumint(9) DEFAULT '0' NOT NULL,
-  keywordid smallint(6) DEFAULT '0' NOT NULL
-);
-create index index_39 on keywords (keywordid); 
-create unique index index_40 on keywords (bug_id, keywordid);
-
-#
-# Table structure for table 'logincookies'
-#
-CREATE TABLE logincookies (
-  cookie mediumint(9) DEFAULT '0' NOT NULL auto_increment,
-  userid mediumint(9) DEFAULT '0' NOT NULL,
-  cryptpassword varchar(64),
-  hostname varchar(128),
-  lastused timestamp(14),
-  PRIMARY KEY (cookie)
-);
-create index index_30 on logincookies (lastused);
-
-#
-# Table structure for table 'longdescs'
-#
-CREATE TABLE longdescs (
-  bug_id mediumint(9) DEFAULT '0' NOT NULL,
-  who mediumint(9) DEFAULT '0' NOT NULL,
-  bug_when datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
-  thetext mediumtext
-);
-create index index_22 on longdescs (bug_id);
-create index index_23 on longdescs (bug_when);
-
-#
-# Table structure for table 'milestones'
-#
-CREATE TABLE milestones (
-  value varchar(20) DEFAULT '' NOT NULL,
-  product varchar(64) DEFAULT '' NOT NULL,
-  sortkey smallint(6) DEFAULT '0' NOT NULL,
-);
-create unique index index_24 on milestones (product, value);
-
-#
-# Table structure for table 'namedqueries'
-#
-CREATE TABLE namedqueries (
-  userid mediumint(9) DEFAULT '0' NOT NULL,
-  name varchar(64) DEFAULT '' NOT NULL,
-  watchfordiffs tinyint(4) DEFAULT '0' NOT NULL,
-  linkinfooter tinyint(4) DEFAULT '0' NOT NULL,
-  query mediumtext NOT NULL
-);
-create unique index index_25 on namedqueries (userid, name);
-create index index_26 on namedqueries (watchfordiffs);
-
-#
-# Table structure for table 'products'
-#
-CREATE TABLE products (
-  product varchar(64),
-  description mediumtext,
-  milestoneurl tinytext NOT NULL,
-  disallownew tinyint(4) DEFAULT '0' NOT NULL,
-  votesperuser smallint(6) DEFAULT '0' NOT NULL,
-  maxvotesperbug smallint(6) DEFAULT '10000' NOT NULL,
-  votestoconfirm smallint(6) DEFAULT '0' NOT NULL,
-  defaultmilestone varchar(20) DEFAULT '---' NOT NULL
-);
-
-#
-# Table structure for table 'profiles'
-#
-CREATE TABLE profiles (
-  userid mediumint(9) DEFAULT '0' NOT NULL auto_increment,
-  login_name varchar(255) DEFAULT '' NOT NULL,
-  password varchar(16),
-  cryptpassword varchar(64),
-  realname varchar(255),
-  groupset bigint(20) DEFAULT '0' NOT NULL,
-  emailnotification enum DEFAULT 'ExcludeSelfChanges' NOT NULL,
-  disabledtext mediumtext NOT NULL,
-  newemailtech tinyint(4) DEFAULT '0' NOT NULL,
-  mybugslink tinyint(4) DEFAULT '1' NOT NULL,
-  blessgroupset bigint(20) DEFAULT '0' NOT NULL,
-  PRIMARY KEY (userid)
-);
-create unique index index_27 on profiles (login_name);
-
-#
-# Table structure for table 'profiles_activity'
-#
-CREATE TABLE profiles_activity (
-  userid mediumint(9) DEFAULT '0' NOT NULL,
-  who mediumint(9) DEFAULT '0' NOT NULL,
-  profiles_when datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
-  fieldid mediumint(9) DEFAULT '0' NOT NULL,
-  oldvalue tinytext,
-  newvalue tinytext
-);
-create index index_0 on profiles_activity (userid); 
-create index index_1 on profiles_activity (profiles_when); 
-create index index_2 on profiles_activity (fieldid);
-
-#
-# Table structure for table 'shadowlog'
-#
-CREATE TABLE shadowlog (
-  id int(11) DEFAULT '0' NOT NULL auto_increment,
-  ts timestamp(14),
-  reflected tinyint(4) DEFAULT '0' NOT NULL,
-  command mediumtext NOT NULL,
-  PRIMARY KEY (id)
-);
-create index index_38 on shadowlog (reflected);
-
-#
-# Table structure for table 'versions'
-#
-CREATE TABLE versions (
-  value tinytext,
-  program varchar(64) DEFAULT '' NOT NULL
-);
-
-#
-# Table structure for table 'votes'
-#
-CREATE TABLE votes (
-  who mediumint(9) DEFAULT '0' NOT NULL,
-  bug_id mediumint(9) DEFAULT '0' NOT NULL,
-  count smallint(6) DEFAULT '0' NOT NULL
-);
-create index index_5 on votes (who);
-create index index_6 on votes (bug_id);
-
-#
-# Table structure for table 'watch'
-#
-CREATE TABLE watch (
-  watcher mediumint(9) DEFAULT '0' NOT NULL,
-  watched mediumint(9) DEFAULT '0' NOT NULL
-);
-create index index_36 on watch (watched);
-create unique index index_37 on watch (watcher, watched);
diff --git a/docs/sgml/faq.sgml b/docs/sgml/faq.sgml
index 79fa528c4..91380863f 100644
--- a/docs/sgml/faq.sgml
+++ b/docs/sgml/faq.sgml
@@ -3,10 +3,14 @@
 <appendix id="faq">
   <title>The Bugzilla FAQ</title>
 
+  <para>
+    This FAQ includes questions not covered elsewhere in the Guide.
+  </para>
+  
   <qandaset>
 
 
-    <qandadiv id="faq_general">
+    <qandadiv id="faq-general">
       <title>General Questions</title>
 
       <qandaentry>
@@ -17,8 +21,8 @@
 	<answer>
 	  <para>
 	    You can stay up-to-date with the latest Bugzilla
-	    information at <ulink url="http://www.mozilla.org/projects/bugzilla/">
-	    http://www.mozilla.org/projects/bugzilla/</ulink>
+	    information at <ulink url="http://www.bugzilla.org/">
+	    http://www.bugzilla.org/</ulink>
 	  </para>
 	</answer>
       </qandaentry>
@@ -54,7 +58,7 @@
 	  <para>
 	    There are several experienced
 	    Bugzilla hackers on the mailing list/newsgroup who are willing
-	    to whore themselves out for generous compensation.
+	    to make themselves available for generous compensation.
 	    Try sending a message to the mailing list asking for a volunteer.
 	  </para>
 	</answer>
@@ -74,12 +78,11 @@
 	    <simplelist>
 	      <member>Netscape/AOL</member>
 	      <member>Mozilla.org</member>
+	      <member>NASA</member>
 	      <member>AtHome Corporation</member>
 	      <member>Red Hat Software</member>
-	      <member>Loki Entertainment Software</member>
 	      <member>SuSe Corp</member>
 	      <member>The Horde Project</member>
-	      <member>The Eazel Project</member>
 	      <member>AbiSource</member>
 	      <member>Real Time Enterprises, Inc</member>
 	      <member>Eggheads.org</member>
@@ -88,6 +91,7 @@
 	      <member>Creative Labs (makers of SoundBlaster)</member>
 	      <member>The Apache Foundation</member>
 	      <member>The Gnome Foundation</member>
+	      <member>Ximian</member>
 	      <member>Linux-Mandrake</member>
 	    </simplelist>
 	  </para>
@@ -106,9 +110,9 @@
 	</question>
 	<answer>
 	  <para>
-	    Bugzilla maintenance has been in a state of flux recently.
-	    Please check <ulink
-				    url="http://www.mozilla.org/projects/bugzilla/">the Bugzilla Project Page for the latest details. </ulink>
+	    A 
+      <ulink url="http://www.bugzilla.org/who_we_are.html">core team</ulink>,
+      led by Dave Miller (justdave@syndicomm.com).      
 	  </para>
 	</answer>
       </qandaentry>
@@ -121,9 +125,9 @@
 	</question>
 	<answer>
 	  <para>
-	    A year has gone by, and I <emphasis>still</emphasis> can't
-	    find any head-to-head comparisons of Bugzilla against
-	    other defect-tracking software.  However, from my personal
+	    We can't find any head-to-head comparisons of Bugzilla against
+	    other defect-tracking software. If you know of one, please
+      get in touch. However, from the author's personal
 	    experience with other bug-trackers, Bugzilla offers
 	    superior performance on commodity hardware, better price
 	    (free!), more developer- friendly features (such as stored
@@ -133,24 +137,9 @@
 	  </para>
 	  <para>
 	    If you happen to be a commercial bug-tracker vendor, please
-	    step forward with a rebuttal so I can include it in the
-	    FAQ.  We're not in pursuit of Bugzilla ueber alles; we
-	    simply love having a powerful, open-source tool to get our
-	    jobs done.
-	  </para>
-	</answer>
-      </qandaentry>
-
-      <qandaentry>
-	<question>
-	  <para>
-	    How do I change my user name in Bugzilla?
-	  </para>
-	</question>
-	<answer>
-	  <para>
-	    You can't.  However, the administrative account can, by simply opening
-	    your user account in editusers.cgi and changing the login name.
+	    step forward with a list of advantages your product has over
+      Bugzilla. We'd be happy to include it in the "Competitors"
+      section.
 	  </para>
 	</answer>
       </qandaentry>
@@ -175,7 +164,7 @@
 	    You can help the project along by either hacking a patch yourself
 	    that supports the functionality you require, or else submitting a
 	    "Request for Enhancement" (RFE) using the bug submission interface
-	    at <ulink url="http://bugzilla.mozilla.org/">bugzilla.mozilla.org</ulink>.
+	    at <ulink url="http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla">bugzilla.mozilla.org</ulink>.
 	  </para>
 	</answer>
       </qandaentry>
@@ -184,46 +173,14 @@
 	<question>
 	  <para>
 	    Why MySQL?  I'm interested in seeing Bugzilla run on
-	    Oracle/Sybase/Msql/PostgreSQL/MSSQL?
+	    Oracle/Sybase/Msql/PostgreSQL/MSSQL.
 	  </para>
 	</question>
 	<answer>
-	  <para>Terry Weissman answers,
-	  <blockquote>
-	    <para>
-	      You're not the only one. But <emphasis>I</emphasis> am not very interested. I'm not
-	      a real SQL or database person. I just wanted to make a useful tool,
-	      and build it on top of free software. So, I picked MySQL, and
-	      learned SQL by staring at the MySQL manual and some code lying
-	      around here, and
-	      wrote Bugzilla. I didn't know that Enum's were non-standard SQL.
-	      I'm not sure if I would have cared, but I didn't even know. So, to
-	      me, things are "portable" because it uses MySQL, and MySQL is
-	      portable enough. I fully understand (now) that people want to be
-	      portable to other databases, but that's never been a real concern
-	      of mine.
-	    </para>
-	  </blockquote>
-	  </para>
 	  <para>
-	    Things aren't quite that grim these days, however.  Terry pretty much
-	    sums up much of the thinking many of us have for Bugzilla, but there
-	    is light on the horizon for database-independence!  Here are some options:
-	  </para>
-	  <simplelist>
-	    <member>
-	      <emphasis><ulink url="http://bugzilla.redhat.com/">Red Hat Bugzilla</ulink></emphasis>:
-	      Runs a modified Bugzilla 2.8 atop an Oracle database.
-	    </member>
-	    <member>
-	      <emphasis><ulink url="http://sourceforge.net/projects/interzilla">Interzilla</ulink></emphasis>:
-	      A project to run Bugzilla on Interbase.  No code released yet, however.
-	    </member>
-	    <member>
-	      <emphasis>Bugzilla 3.0</emphasis>: One of the primary stated goals
-	      is multiple database support.
-	    </member>
-	  </simplelist>
+      There is DB-independence work afoot. PostgreSQL support is planned
+      for 2.18, and full DB-independence can't be far further on.
+	  </para>
 	</answer>
       </qandaentry>
 
@@ -236,292 +193,41 @@
 	</question>
 	<answer>
 	  <para>
-	     Mozilla.org uses /usr/bonsaitools/bin/perl. The prime rule in making
-	    submissions is "don't break bugzilla.mozilla.org". If it breaks it, your
-	    patch will be reverted faster than you can do a diff.
-	  </para>
-	  <para>
-	    Here's Terry Weissman's comment, for some historical context:
-	    <blockquote>
-	      <para>
-		[This was] purely my own convention. I wanted a place to put a version of
-		Perl and other tools that was strictly under my control for the
-		various webtools, and not subject to anyone else. Edit it to point
-		to whatever you like.
-	      </para>
-	      <note>
+	     Mozilla.org uses /usr/bonsaitools/bin/perl, because originally
+       Terry wanted a place to put a version of Perl and other tools 
+       that was strictly under his control. 
+    </para>
 		<para>
 		  We always recommend that, if possible, you keep the path
-		  as /usr/bonsaitools/bin/perl, and simply add a /usr/bonsaitools
-		  and /usr/bonsaitools/bin directory, then symlink your version
-		  of perl to /usr/bonsaitools/bin/perl.  This will make upgrading
+		  as /usr/bonsaitools/bin/perl, and simply add symlink.  
+      This will make upgrading
 		  your Bugzilla much easier in the future.
 		</para>
-		<para>
-		  Obviously, if you do not have root access to your Bugzilla
-		  box, our suggestion is irrelevant.
-		</para>
-	      </note>
-	    </blockquote>
-	  </para>
 	</answer>
       </qandaentry>
 
-    </qandadiv>
-
 
-    <qandadiv id="faq_redhat">
-      <title>Red Hat Bugzilla</title>
-      <para>
-	<note>
-	  <para>
-	    <emphasis>This section is no longer up-to-date.</emphasis>
-	    Please see the section on "Red Hat Bugzilla" under "Variants" in The Bugzilla Guide.
-	  </para>
-	</note>
-      </para>
       <qandaentry>
 	<question>
 	  <para>
-	    What about Red Hat Bugzilla?
-	  </para>
-	</question>
-	<answer>
-	  <para>
-	    Red Hat Bugzilla is arguably more user-friendly, customizable, and scalable
-	    than stock Bugzilla. Check it out at
-	    http://bugzilla.redhat.com and the sources at ftp://people.redhat.com/dkl/.
-	    They've set their Bugzilla up to work with Oracle out of the box.
-	    Note that Redhat Bugzilla is based upon the 2.8 Bugzilla tree;
-	    Bugzilla has made some tremendous advances since the 2.8 release.
-	    Why not download both Bugzillas to check out the differences for
-	    yourself?
-	  </para>
-	  <para>
-	    Dave Lawrence, the original Red Hat Bugzilla maintainer, mentions:
-	    <blockquote>
-	      <para>
-		Somebody needs to take the ball and run with it.  I'm the only
-		maintainer and am very pressed for time.
-	      </para>
-	    </blockquote>
-	    If you, or someone you know, has the time and expertise to do the integration
-	    work so main-tree Bugzilla 2.12 and higher integrates the Red
-	    Hat Bugzilla Oracle modifications, please donate your
-	    time to supporting the Bugzilla project.
-	  </para>
-	</answer>
-      </qandaentry>
-
-      <qandaentry>
-	<question>
-	  <para>
-	    What are the primary benefits of Red Hat Bugzilla?
-	  </para>
-	</question>
-	<answer>
-	  <para>
-	    <emphasis>Dave Lawrence</emphasis>:
-	    <blockquote>
-	      <para>
-		For the record, we are not using any template type implementation for
-		the cosmetic changes maded to Bugzilla.  It is just alot of html changes
-		in the code itself.  I admit I may have gotten a little carried away with it
-		but the corporate types asked for a more standardized interface to match up
-		with other projects relating to Red Hat web sites.  A lot of other web based
-		internal tools I am working on also look like Bugzilla.
-	      </para>
-	      <para>
-		I do want to land the changes that I have made to Bugzilla but I may
-		have to back out a good deal and make a different version of Red Hat's
-		Bugzilla for checking in to CVS. Especially the cosmetic changes because it
-		seems they may not fit the general public.  I will do that as soon as I can.
-		I also still do my regular QA responsibilities along with Bugzilla so time
-		is difficult sometimes to come by.
-	      </para>
-	      <para>
-		There are also a good deal of other changes that were requested by
-		management for things like support contracts and different permission
-		groups for making bugs private. Here is a short list of the major
-		changes that have been made:
-	      </para>
-	      <orderedlist>
-		<listitem>
-		  <para>
-		    No enum types. All old enum types are now separate smaller tables.
-		  </para>
-		</listitem>
-		<listitem>
-		  <para>
-		    No bit wise operations. Not all databases support this so they were
-		    changed to a more generic way of doing this task
-		  </para>
-		</listitem>
-		<listitem>
-		  <para>
-		    Bug reports can only be altered by the reporter, assignee, or a
-		    privileged bugzilla user. The rest of the world can see the bug but in
-		    a non-changeable format (unless the bug has been marked private).  They
-		    can however add comments, add and remove themselves from the CC list
-		  </para>
-		</listitem>
-		<listitem>
-		  <para>
-		    Different group scheme. Each group has an id number related to it.
-		    There is a user_group table which contains userid to groupid mappings
-		    to determine which groups each user belongs to.  Additionally there is
-		    a bug_group table that has bugid to groupid mappings to show which
-		    groups can see a particular bug. If there are no entries for a bug in
-		    this table then the bug is public.
-		  </para>
-		</listitem>
-		<listitem>
-		  <para>
-		    Product groups. product_table created to only allow certain products to
-		    be visible for certain groups in both bug entry and query. This was
-		    particulary helpful for support contracts.
-		  </para>
-		</listitem>
-		<listitem>
-		  <para>
-		    Of course many (too many) changes to Bugzilla code itself to allow use
-		    with Oracle and still allow operation with Mysql if so desired.
-		    Currently if you use Mysql it is set to use Mysql's old permission
-		    scheme to keep breakage to a minimum. Hopefully one day this will
-		    standardize on one style which may of course be something completely
-		    different.
-		  </para>
-		</listitem>
-		<listitem>
-		  <para>
-		    Uses Text::Template perl module for rendering of the dynamic HTML pages
-		    such as enter_bug.cgi, query.cgi, bug_form.pl, and for the header and
-		    footer parts of the page. This allows the html to be separate from the
-		    perl code for customizing the look and feel of the page to one's
-		    preference.
-		  </para>
-		</listitem>
-		<listitem>
-		  <para>
-		    There are many other smaller changes. There is also a port to Oracle
-		    that I have been working on as time permits but is not completely
-		    finished but somewhat usable. I will merge it into our standard code
-		    base when it becomes production quality. Unfortunately there will have
-		    to be some conditionals in the code to make it work with other than
-		    Oracle due to some differences between Oracle and Mysql.
-		  </para>
-		</listitem>
-	      </orderedlist>
-	      <para>
-		Both the Mysql and Oracle versions of our current code base are
-		available from ftp://people.redhat.com/dkl. If Terry/Tara wants I can submit
-		patch files for all of the changes I have made and he can determine what is
-		suitable for addition to the main bugzilla cade base. But for me to commit
-		changes to the actual CVS I will need to back out alot of things that are
-		not suitable for the rest of the Bugzilla community. I am open to
-		suggestions.
-	      </para>
-	    </blockquote>
-	  </para>
-	</answer>
-      </qandaentry>
-
-      <qandaentry>
-	<question>
-	  <para>
-	    What's the current status of Red Hat Bugzilla?
-	  </para>
-	</question>
-	<answer>
-	  <para>
-	    <note>
-	      <para>
-		This information is somewhat dated; I last updated it
-		7 June 2000.  Please see the "Variants" section of "The Bugzilla Guide"
-		for more up-to-date information regarding Red Hat Bugzilla.
-	      </para>
-	    </note>
-	    <emphasis>Dave Lawrence</emphasis>:
-	    <blockquote>
-	      <para>
-		     I suppose the current thread warrants an update on the status of
-		Oracle and bugzilla ;) We have now been running Bugzilla 2.8 on
-		Oracle for the last two days in our production environment. I
-		tried to do as much testing as possible with it before going live
-		which is some of the reason for the long delay. I did not get
-		enough feedback as I would have liked from internal developers to
-		help weed out any bugs still left so I said "Fine, i will take it
-		live and then I will get the feedback I want :)" So it is now
-		starting to stabilize and it running quite well after working
-		feverishly the last two days fixing problems as soon as they came
-		in from the outside world. The current branch in cvs is up2date if
-		anyone would like to grab it and try it out. The oracle _setup.pl
-		is broken right now due to some last minute changes but I will
-		update that soon. Therefore you would probably need to create the
-		database tables the old fashioned way using the supplied sql
-		creation scripts located in the ./oracle directory. We have heavy
-		optimizations in the database it self thanks to the in-house DBA
-		here at Red Hat so it is running quite fast. The database itself
-		is located on a dual PII450 with 1GB ram and 14 high voltage
-		differential raided scsi drives. The tables and indexes are
-		partitioned in 4 chuncks across the raided drive which is nice
-		because when ever you need to do a full table scan, it is actually
-		starting in 4 different locations on 4 different drives
-		simultaneously. And the indexes of course are on separate drives
-		from the data so that speeds things up tremendously. When  I can
-		find the time I will document all that we have done to get this
-		thing going to help others that may need it.
-	      </para>
-	      <para>
-		As Matt has mentioned it is still using out-dated code and with a
-		little help I would like to bring everything up to date for
-		eventual  incorporation with the main cvs tree. Due to other
-		duties I have with the company any help with this wiould be
-		appreciated. What we are using  now is what I call a best first
-		effort. It definitely can be improved on and may even need
-		complete rewrites in a lot of areas. A lot of changes may have to
-		be made in the way Bugzilla does things currently  to make this
-		transition to a more generic database interface.  Fortunately when
-		making the Oracle changes I made sure I didn't do  anything that I
-		would consider Oracle specific and could not be easily done with
-		other databases. Alot of the sql statements need to be broken up
-		into smaller utilities that themselves would need to make
-		decisions on what database they are using but the majority of the
-		code can be made database neutral.
-	      </para>
-	    </blockquote>
-	  </para>
-	</answer>
-      </qandaentry>
-    </qandadiv>
-
-
-    <qandadiv id="faq_loki">
-      <title>Loki Bugzilla (AKA Fenris)</title>
-
-      <qandaentry>
-	<question>
-	  <para>
-	    What is Loki Bugzilla (Fenris)?
+	    Is there an easy way to change the Bugzilla cookie name?
 	  </para>
 	</question>
 	<answer>
 	  <para>
-	    Loki Games has a customized version of Bugzilla available at
-	    <ulink url="http://fenris.lokigames.com/">http://fenris.lokigames.com</ulink>.  There are some advantages to using Fenris, chief being separation of comments based upon user privacy level, data hiding, forced login for any data retrieval, and some additional fields.  Loki has mainted their code, originally a fork from the Bugzilla 2.8 code base, and it is quite a bit different than stock Bugzilla at this point.  I recommend you stick with official Bugzilla version &bz-ver; rather than using a fork, but it's up to you.
+	    At present, no.
 	  </para>
 	</answer>
       </qandaentry>
-
+      
     </qandadiv>
 
-    <qandadiv id="faq_phb">
-      <title>Pointy-Haired-Boss Questions</title>
+    <qandadiv id="faq-phb">
+      <title>Managerial Questions</title>
       <para>
 	<note>
 	  <para>
-	    The title of this section doesn't mean you're a PHB -- it just means
-	    you probably HAVE a PHB who wants to know this :)
+	    Questions likely to be asked by managers. :-)
 	  </para>
 	</note>
       </para>
@@ -529,8 +235,8 @@
       <qandaentry>
 	<question>
 	  <para>
-	    Is Bugzilla web-based or do you have to have specific software or
-	    specific operating system on your machine?
+	    Is Bugzilla web-based, or do you have to have specific software or
+	    a specific operating system on your machine?
 	  </para>
 	</question>
 	<answer>
@@ -544,7 +250,7 @@
       <qandaentry>
 	<question>
 	  <para>
-	    Has anyone you know of already done any Bugzilla integration with
+	    Can Bugzilla integrate with
 	    Perforce (SCM software)?
 	  </para>
 	</question>
@@ -564,11 +270,10 @@
 	</question>
 	<answer>
 	  <para>
-	    Absolutely!  You can track up to a "soft-limit" of around
-	    64 individual "Products", that can each be composed of as
-	    many "Components" as you want.  Check the Administration
-	    section of the Bugzilla Guide for more information regarding
-	    setting up Products and Components.
+	    Absolutely!  You can track any number of Products (although you
+      are limited to about 55 or so if
+      you are using Product-Based Groups), that can each be composed of any
+      number of Components.
 	  </para>
 	</answer>
       </qandaentry>
@@ -590,18 +295,17 @@
       <qandaentry>
 	<question>
 	  <para>
-	    Does Bugzilla allow attachments (text, screenshots, urls etc)? If yes,
+	    Does Bugzilla allow attachments (text, screenshots, URLs etc)? If yes,
 	    are there any that are NOT allowed?
 	  </para>
 	</question>
 	<answer>
 	  <para>
-	    Yes.  There are many specific MIME-types that are pre-defined by Bugzilla,
+	    Yes - any sort of attachment is allowed, although administrators can
+      configure a maximum size.  
+      There are many specific MIME-types that are pre-defined by Bugzilla,
 	    but you may specify any arbitrary MIME-type you need when you
-	    upload the file.  Since all attachments are stored in the database,
-	    however, I recommend storing large binary attachments elsewhere
-	    in the web server's file system and providing a hyperlink
-	    as a comment, or in the provided "URL" field in the bug report.
+	    upload the file. 
 	  </para>
 	</answer>
       </qandaentry>
@@ -629,74 +333,6 @@
 	</answer>
       </qandaentry>
 
-
-      <qandaentry>
-	<question>
-	  <para>
-	    The index.html page doesn't show the footer.  It's really annoying to have
-	    to go to the querypage just to check my "my bugs" link.  How do I get a footer
-	    on static HTML pages?
-	  </para>
-	</question>
-	<answer>
-          <para>
-            It's possible to get the footer on the static index page using
-            Server Side Includes (SSI).  The trick to doing this is making
-            sure that your web server is set up to allow SSI and specifically,
-            the #exec directive.  You should also rename <filename>index.html</filename>
-            to <filename>index.shtml</filename>.
-          </para>
-          <para>
-            After you've done all that, you can add the following line to
-            <filename>index.shtml</filename>:
-<programlisting>
-<![CDATA[
-<!--#exec cmd="/usr/bin/perl -e &quot;require 'CGI.pl'; PutFooter();&quot;" -->
-]]>
-</programlisting>
-          </para>
-          <para><note>
-            <para>
-              This line will be replaced with the actual HTML for the footer
-              when the page is requested, so you should put this line where you
-              want the footer to appear.
-            </para>
-          </note></para>
-          <para>
-            Because this method depends on being able to use a #exec directive,
-            and most ISP's will not allow that, there is an alternative method.
-            You could have a small script (such as <filename>api.cgi</filename>)
-            that basically looks like:
-<programlisting>
-<![CDATA[
-#!/usr/bonsaitools/bin/perl -w
-
-require 'globals.pl';
-
-if ($::FORM{sub} eq 'PutFooter') {
-    PutFooter();
-} else {
-    die 'api.cgi was incorrectly called';
-}
-]]>
-</programlisting>
-            and then put this line in <filename>index.shtml</filename>.
-<programlisting>
-<![CDATA[
-<!--#include virtual="api.cgi?sub=PutFooter"-->
-]]>
-</programlisting>
-          </para>
-         <para> <note>
-            <para>
-              This still requires being able to use Server Side Includes, if
-              this simply will not work for you, see <ulink
-              url="http://bugzilla.mozilla.org/show_bug.cgi?id=80183">bug 80183</ulink>
-              for a third option.
-            </para>
-          </note></para>
-	</answer>
-      </qandaentry>
       <qandaentry>
 	<question>
 	  <para>
@@ -708,7 +344,7 @@ if ($::FORM{sub} eq 'PutFooter') {
 	  <para>
 	    Yes.  Look at <ulink url="http://bugzilla.mozilla.org/reports.cgi">
 	    http://bugzilla.mozilla.org/reports.cgi</ulink> for basic reporting
-	    facilities.
+	    and graphing facilities.
 	  </para>
 	  <para>
 	    For more advanced reporting, I recommend hooking up a professional
@@ -718,9 +354,6 @@ if ($::FORM{sub} eq 'PutFooter') {
 	    better accomplished through third-party utilities that can
 	    interface with the database directly.
 	  </para>
-	  <para>
-	    Advanced Reporting is a Bugzilla 3.X proposed feature.
-	  </para>
 	</answer>
       </qandaentry>
 
@@ -728,13 +361,13 @@ if ($::FORM{sub} eq 'PutFooter') {
 	<question>
 	  <para>
 	    Is there email notification and if so, what do you see when you get an
-	    email? Do you see bug number and title or is it only the number?
+	    email?
 	  </para>
 	</question>
 	<answer>
 	  <para>
-	    Email notification is user-configurable.  The bug id and Topic
-	    of the bug report accompany each email notification, along with
+	    Email notification is user-configurable.  By default, the bug id and 
+      Summary of the bug report accompany each email notification, along with
 	    a list of the changes made.
 	  </para>
 	</answer>
@@ -757,7 +390,7 @@ if ($::FORM{sub} eq 'PutFooter') {
       <qandaentry>
 	<question>
 	  <para>
-	    If there is email notification, do users have to have any particular
+	    Do users have to have any particular
 	    type of email application?
 	  </para>
 	</question>
@@ -779,24 +412,6 @@ if ($::FORM{sub} eq 'PutFooter') {
 	</answer>
       </qandaentry>
 
-      <qandaentry>
-	<question>
-	  <para>
-	     If I just wanted to track certain bugs, as they go through life, can I
-	    set it up to alert me via email whenever that bug changes, whether it be
-	    owner, status or description etc.?
-	  </para>
-	</question>
-	<answer>
-	  <para>
-	    Yes.  Place yourself in the "cc" field of the bug you wish to monitor.
-	    Then change your "Notify me of changes to" field in the Email Settings
-	    tab of the User Preferences screen in Bugzilla to the "Only those
-	    bugs which I am listed on the CC line" option.
-	  </para>
-	</answer>
-      </qandaentry>
-
       <qandaentry>
 	<question>
 	  <para>
@@ -839,10 +454,10 @@ if ($::FORM{sub} eq 'PutFooter') {
 	</question>
 	<answer>
 	  <para>
-	    Currently, no.  Internationalization support for Perl did not
-	    exist in a robust fashion until the recent release of version 5.6.0;
-	    Bugzilla is, and likely will remain (until 3.X) completely
-	    non-localized.
+	    To a certain extent, yes. 2.16's templates mean that you can localise
+      the user-facing UI (and several projects are doing exactly that.) However,
+      error messages and the admin interface are currently not localisable.
+      This should be achieved by 2.18.
 	  </para>
 	</answer>
       </qandaentry>
@@ -861,33 +476,6 @@ if ($::FORM{sub} eq 'PutFooter') {
 	</answer>
       </qandaentry>
 
-      <qandaentry>
-	<question>
-	  <para>
-	    Can a user re-run a report with a new project, same query?
-	  </para>
-	</question>
-	<answer>
-	  <para>
-	    Yes.
-	  </para>
-	</answer>
-      </qandaentry>
-
-      <qandaentry>
-	<question>
-	  <para>
-	    Can a user modify an existing report and then save it into another name?
-	  </para>
-	</question>
-	<answer>
-	  <para>
-	    You can save an unlimited number of queries in Bugzilla.  You are free
-	    to modify them and rename them to your heart's desire.
-	  </para>
-	</answer>
-      </qandaentry>
-
       <qandaentry>
 	<question>
 	  <para>
@@ -903,20 +491,6 @@ if ($::FORM{sub} eq 'PutFooter') {
 	</answer>
       </qandaentry>
 
-      <qandaentry>
-	<question>
-	  <para>
-	    Can the admin person establish separate group and individual user
-	    privileges?
-	  </para>
-	</question>
-	<answer>
-	  <para>
-	    Yes.
-	  </para>
-	</answer>
-      </qandaentry>
-
       <qandaentry>
 	<question>
 	  <para>
@@ -976,20 +550,14 @@ if ($::FORM{sub} eq 'PutFooter') {
 	</question>
 	<answer>
 	  <para>
-	    If Bugzilla is set up correctly from the start, continuing maintenance needs
-	    are minimal and can be completed by unskilled labor.  Things like rotate
-	    backup tapes and check log files for the word "error".
+	    If Bugzilla is set up correctly from the start, continuing maintenance
+      needs are minimal and can be done easily using the web interface.
 	  </para>
 	  <para>
 	    Commercial Bug-tracking software typically costs somewhere upwards
 	    of $20,000 or more for 5-10 floating licenses.  Bugzilla consultation
-	    is available from skilled members of the newsgroup.
-	  </para>
-	  <para>
-	    As an example, as of this writing I typically charge
-	     $115 for the first hour, and $89 each hour thereafter
-	    for consulting work.  It takes me three to five hours to make Bugzilla
-	    happy on a Development installation of Linux-Mandrake.
+	    is available from skilled members of the newsgroup. Simple questions
+      are answered there and then.
 	  </para>
 	</answer>
       </qandaentry>
@@ -1011,7 +579,7 @@ if ($::FORM{sub} eq 'PutFooter') {
 	    your Bugzilla install can run untended for years.  If your
 	    Bugzilla strategy is critical to your business workflow, hire somebody
 	    with reasonable UNIX or Perl skills to handle your process management and
-	    bug-tracking maintenance & customization.
+	    bug-tracking maintenance &amp; customization.
 	  </para>
 	</answer>
       </qandaentry>
@@ -1032,68 +600,21 @@ if ($::FORM{sub} eq 'PutFooter') {
       </qandaentry>
     </qandadiv>
 
-    <qandadiv id="faq_install">
-      <title>Bugzilla Installation</title>
-      <qandaentry>
-	<question>
-	  <para>
-	    How do I download and install Bugzilla?
-	  </para>
-	</question>
-	<answer>
-	  <para>
-	    Check <ulink url="http://www.mozilla.org/projects/bugzilla/">
-	    http://www.mozilla.org/projects/bugzilla/</ulink> for details.
-	    Once you download it, untar it, read the Bugzilla Guide.
-	  </para>
-	</answer>
-      </qandaentry>
-
-      <qandaentry>
-	<question>
-	  <para>
-	    How do I install Bugzilla on Windows NT?
-	  </para>
-	</question>
-	<answer>
-	  <para>
-	    Installation on Windows NT has its own section in
-	    "The Bugzilla Guide".
-	  </para>
-	</answer>
-      </qandaentry>
-
-      <qandaentry>
-	<question>
-	  <para>
-	    Is there an easy way to change the Bugzilla cookie name?
-	  </para>
-	</question>
-	<answer>
-	  <para>
-	    At present, no.
-	  </para>
-	</answer>
-      </qandaentry>
-
-    </qandadiv>
-
-    <qandadiv id="faq_security">
+    <qandadiv id="faq-security">
       <title>Bugzilla Security</title>
 
       <qandaentry>
 	<question>
 	  <para>
 	    How do I completely disable MySQL security if it's giving me problems
-	    (I've followed the instructions in the installation section of this guide!)?
+	    (I've followed the instructions in the installation section of this guide)?
 	  </para>
 	</question>
 	<answer>
 	  <para>
-	    Run mysql like this: "mysqld --skip-grant-tables".  Please remember <emphasis>this
-	    makes mysql as secure as taping a $100 to the floor of a football stadium
-	    bathroom for safekeeping.</emphasis>  Please read the Security section of the
-	    Administration chapter of "The Bugzilla Guide" before proceeding.
+	    Run MySQL like this: "mysqld --skip-grant-tables".  Please remember <emphasis>this
+	    makes MySQL as secure as taping a $100 to the floor of a football stadium
+	    bathroom for safekeeping.</emphasis> 
 	  </para>
 	</answer>
       </qandaentry>
@@ -1106,8 +627,9 @@ if ($::FORM{sub} eq 'PutFooter') {
 	</question>
 	<answer>
 	  <para>
-	    The Bugzilla code has not undergone a complete security audit.
-	    It is recommended that you closely examine permissions on your Bugzilla
+	    The Bugzilla code has undergone a reasonably complete security audit,
+      and user-facing CGIs run under Perl's taint mode. However, 
+	    it is recommended that you closely examine permissions on your Bugzilla
 	    installation, and follow the recommended security guidelines found
 	    in The Bugzilla Guide.
 	  </para>
@@ -1133,7 +655,7 @@ if ($::FORM{sub} eq 'PutFooter') {
       </qandaentry>
     </qandadiv>
 
-    <qandadiv id="faq_email">
+    <qandadiv id="faq-email">
       <title>Bugzilla Email</title>
 
       <qandaentry>
@@ -1145,8 +667,8 @@ if ($::FORM{sub} eq 'PutFooter') {
 	</question>
 	<answer>
 	  <para>
-	    With the email changes to 2.12, the user should be able to set
-	    this in user email preferences.
+	    The user should be able to set
+	    this in user email preferences (uncheck all boxes.)
 	  </para>
 	</answer>
       </qandaentry>
@@ -1160,8 +682,8 @@ if ($::FORM{sub} eq 'PutFooter') {
 	</question>
 	<answer>
 	  <para>
-	    Edit the param for the mail text. Replace "To:" with "X-Real-To:",
-	    replace "Cc:" with "X-Real-CC:", and add a "To: (myemailaddress)".
+	    Edit the "changedmail" Param. Replace "To:" with "X-Real-To:",
+	    replace "Cc:" with "X-Real-CC:", and add a "To: &lt;youremailaddress&gt;".
 	  </para>
 	</answer>
       </qandaentry>
@@ -1224,14 +746,15 @@ if ($::FORM{sub} eq 'PutFooter') {
       <qandaentry>
 	<question>
 	  <para>
-	    Email takes FOREVER to reach me from bugzilla -- it's extremely slow.
+	    Email takes FOREVER to reach me from Bugzilla -- it's extremely slow.
 	    What gives?
 	  </para>
 	</question>
 	<answer>
 	  <para>
 	    If you are using an alternate Mail Transport Agent (MTA other than
-	    sendmail), make sure the options given in the "processmail" script for all
+	    sendmail), make sure the options given in the "processmail" and other
+      scripts for all
 	    instances of "sendmail" are correct for your MTA.
 	  </para>
 	  <para>
@@ -1244,7 +767,7 @@ if ($::FORM{sub} eq 'PutFooter') {
       <qandaentry>
 	<question>
 	  <para>
-	     How come email never reaches me from bugzilla changes?
+	     How come email from Bugzilla changes never reaches me?
 	  </para>
 	</question>
 	<answer>
@@ -1263,7 +786,7 @@ if ($::FORM{sub} eq 'PutFooter') {
       </qandaentry>
     </qandadiv>
 
-    <qandadiv id="faq_db">
+    <qandadiv id="faq-db">
       <title>Bugzilla Database</title>
 
       <qandaentry>
@@ -1274,36 +797,10 @@ if ($::FORM{sub} eq 'PutFooter') {
 	</question>
 	<answer>
 	  <para>
-	    Red Hat Bugzilla, mentioned above, works with Oracle.  The current version
+	    Red Hat Bugzilla works with Oracle.  The current version
 	    from Mozilla.org does not have this capability.  Unfortunately, though
 	    you will sacrifice a lot of the really great features available in
-	    Bugzilla 2.10 and 2.12 if you go with the 2.8-based Redhat version.
-	  </para>
-	</answer>
-      </qandaentry>
-
-      <qandaentry>
-	<question>
-	  <para>
-	    Bugs are missing from queries, but exist in the database (and I can pull
-	    them up by specifying the bug ID). What's wrong?
-	  </para>
-	</question>
-	<answer>
-	  <para>
-	     You've almost certainly enabled the "shadow database", but for some
-	    reason it hasn't been updated for all your bugs. This is the database
-	    against which queries are run, so that really complex or slow queries won't
-	    lock up portions of the database for other users. You can turn off the
-	    shadow database in editparams.cgi. If you wish to continue using the shadow
-	    database, then as your "bugs" user run "./syncshadowdb -syncall" from the
-	    command line in the bugzilla installation directory to recreate your shadow
-	    database. After it finishes, be sure to check the params and make sure that
-	    "queryagainstshadowdb" is still turned on. The syncshadowdb program turns it
-	    off if it was on, and is supposed to turn it back on when completed; that
-	    way, if it crashes in the middle of recreating the database, it will stay
-	    off forever until someone turns it back on by hand. Apparently, it doesn't
-	    always do that yet.
+	    Bugzilla 2.14 and 2.16 if you go with the 2.8-based Redhat version.
 	  </para>
 	</answer>
       </qandaentry>
@@ -1372,7 +869,7 @@ if ($::FORM{sub} eq 'PutFooter') {
       <qandaentry>
 	<question>
 	  <para>
-	    I think I've set up MySQL permissions correctly, but bugzilla still can't
+	    I think I've set up MySQL permissions correctly, but Bugzilla still can't
 	    connect.
 	  </para>
 	</question>
@@ -1413,45 +910,9 @@ if ($::FORM{sub} eq 'PutFooter') {
 	  </para>
 	</answer>
       </qandaentry>
-
-      <qandaentry>
-	<question>
-	  <para>
-	    Why do I get bizarre errors when trying to submit data, particularly problems
-	    with "groupset"?
-	  </para>
-	</question>
-	<answer>
-	  <para>
-	    If you're sure your MySQL parameters are correct, you might want turn
-	    "strictvaluechecks" OFF in editparams.cgi.  If you have "usebugsentry" set
-	    "On", you also cannot submit a bug as readable by more than one group with
-	    "strictvaluechecks" ON.
-	  </para>
-	</answer>
-      </qandaentry>
-
-      <qandaentry>
-	<question>
-	  <para>
-	    How come even after I delete bugs, the long descriptions show up?
-	  </para>
-	</question>
-	<answer>
-	  <para>
-	    This should only happen with Bugzilla &bz-ver; if you are
-	    using the <quote>shadow database</quote> feature, and your
-	    shadow database is out of sync.  Try running
-	    <filename>syncshadowdb</filename>
-	    <option>-syncall</option> to make sure your shadow
-	    database is in synch with your primary database.
-	  </para>
-	</answer>
-      </qandaentry>
-
     </qandadiv>
 
-    <qandadiv id="faq_nt">
+    <qandadiv id="faq-nt">
       <title>Bugzilla and Win32</title>
 
       <qandaentry>
@@ -1515,106 +976,6 @@ if ($::FORM{sub} eq 'PutFooter') {
 	</answer>
       </qandaentry>
 
-      <qandaentry>
-	<question>
-	  <para>
-	    Can I have some general instructions on how to make Bugzilla on Win32 work?
-	  </para>
-	</question>
-	<answer>
-	  <para>
-	    The following couple entries are deprecated in favor of the Windows installation
-	    instructions available in the "Administration" portion of "The Bugzilla Guide".
-	    However, they are provided here for historical interest and insight.
-	    <literallayout>
-  1. #!C:/perl/bin/perl had to be added to every perl file.
-  2. Converted to Net::SMTP to handle mail messages instead of
-     /usr/bin/sendmail.
-  3. The crypt function isn't available on Windows NT (at least none that I
-     am aware), so I made encrypted passwords = plaintext passwords.
-  4. The system call to diff had to be changed to the Cygwin diff.
-  5. This was just to get a demo running under NT, it seems to be working
-     good, and I have inserted almost 100 bugs from another bug tracking
-     system. Since this work was done just to get an in-house demo, I am NOT
-     planning on making a patch for submission to Bugzilla. If you would
-     like a zip file, let me know.
-
-Q: Hmm, couldn't figure it out from the general instructions above.  How
-about step-by-step?
-A: Sure! Here ya go!
-
-  1. Install IIS 4.0 from the NT Option Pack #4.
-  2. Download and install Active Perl.
-  3. Install the Windows GNU tools from Cygwin. Make sure to add the bin
-     directory to your system path. (Everyone should have these, whether
-     they decide to use Bugzilla or not. :-) )
-  4. Download relevant packages from ActiveState at
-     http://www.activestate.com/packages/zips/. + DBD-Mysql.zip
-  5. Extract each zip file with WinZip, and install each ppd file using the
-     notation: ppm install &lt;module&gt;.ppd
-  6. Install Mysql.  *Note: If you move the default install from c:\mysql,
-     you must add the appropriate startup parameters to the NT service. (ex.
-     -b e:\\programs\\mysql)
-  7. Download any Mysql client. http://www.mysql.com/download_win.html
-  8. Setup MySql. (These are the commands that I used.)
-
-          I. Cleanup default database settings.
-           C:\mysql\bin\mysql -u root mysql
-           mysql> DELETE FROM user WHERE Host='localhost' AND User='';
-           mysql> quit
-          C:\mysql\bin\mysqladmin reload
-
-          II. Set password for root.
-           C:\mysql\bin\mysql -u root mysql
-           mysql> UPDATE user SET Password=PASSWORD('new_password')
-           WHERE user='root';
-           mysql> FLUSH PRIVILEGES;
-           mysql> quit
-           C:\mysql\bin\mysqladmin -u root reload
-
-          III. Create bugs user.
-           C:\mysql\bin\mysql -u root -p
-           mysql> insert into user (host,user,password)
-          values('localhost','bugs','');
-           mysql> quit
-           C:\mysql\bin\mysqladmin -u root reload
-
-          IV. Create the bugs database.
-           C:\mysql\bin\mysql -u root -p
-           mysql> create database bugs;
-
-          V. Give the bugs user access to the bugs database.
-           mysql> insert into db
-          (host,db,user,select_priv,insert_priv,update_priv,delete_priv,create_priv,drop_priv)
-          values('localhost','bugs','bugs','Y','Y','Y','Y','Y','N')
-           mysql> quit
-           C:\mysql\bin\mysqladmin -u root reload
-  9. Run the table scripts to setup the bugs database.
- 10. Change CGI.pm to use the following regular expression because of
-     differing backslashes in NT versus UNIX.
-        o $0 =~ m:[^\\]*$:;
- 11. Had to make the crypt password = plain text password in the database.
-     (Thanks to Andrew Lahser" &lt;andrew_lahser@merck.com&gt;" on this one.) The
-     files that I changed were:
-        o globals.pl
-        o CGI.pl
-        o alternately, you can try commenting all references to 'crypt'
-          string and replace them with similar lines but without encrypt()
-          or crypr() functions insida all files.
- 12. Replaced sendmail with Windmail. Basically, you have to come up with a
-     sendmail substitute for NT. Someone said that they used a Perl module
-     (Net::SMTP), but I was trying to save time and do as little Perl coding
-     as possible.
- 13. Added "perl" to the beginning of all Perl system calls that use a perl
-     script as an argument and renamed processmail to processmail.pl.
- 14. In processmail.pl, I added binmode(HANDLE) before all read() calls. I'm
-     not sure about this one, but the read() under NT wasn't counting the
-     EOLs without the binary read."
-	    </literallayout>
-	  </para>
-	</answer>
-      </qandaentry>
-
       <qandaentry>
 	<question>
 	  <para>
@@ -1662,9 +1023,23 @@ A: Sure! Here ya go!
 
     </qandadiv>
 
-    <qandadiv id="faq_use">
+    <qandadiv id="faq-use">
       <title>Bugzilla Usage</title>
 
+      <qandaentry>
+	<question>
+	  <para>
+	    How do I change my user name (email address) in Bugzilla?
+	  </para>
+	</question>
+	<answer>
+	  <para>
+	    New in 2.16 - go to the Account section of the Preferences. You will
+      be emailed at both addresses for confirmation.
+	  </para>
+	</answer>
+      </qandaentry>
+
       <qandaentry>
 	<question>
 	  <para>
@@ -1673,10 +1048,9 @@ A: Sure! Here ya go!
 	</question>
 	<answer>
 	  <para>
-	    We are developing in that direction.  You can follow progress on this
-	    at <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=16775">
-	      http://bugzilla.mozilla.org/show_bug.cgi?id=16775</ulink>.  Some functionality
-	    is available in Bugzilla 2.12, and is available as "quicksearch.html"
+	    The interface was simplified by a UI designer for 2.16. Further
+      suggestions for improvement are welcome, but we won't sacrifice power for
+      simplicity.
 	  </para>
 	</answer>
       </qandaentry>
@@ -1691,7 +1065,7 @@ A: Sure! Here ya go!
 	<answer>
 	  <para>
 	    The current behavior is acceptable to bugzilla.mozilla.org and most
-	    users.  I personally don't like it.  You have your choice of patches
+	    users.  You have your choice of patches
 	    to change this behavior, however.
 	    <simplelist>
 	      <member><ulink url="http://bugzilla.mozilla.org/showattachment.cgi?attach_id=8029">
@@ -1699,8 +1073,8 @@ A: Sure! Here ya go!
 	      <member><ulink url="http://bugzilla.mozilla.org/showattachment.cgi?attach_id=8153">
 		"Accept" button automatically assigns to you</ulink></member>
 	    </simplelist>
-	    Note that these patches are somewhat dated.  You will need to do the find
-	    and replace manually to apply them.  They are very small, though.  It is easy.
+	    Note that these patches are somewhat dated.  You will need to apply
+      them manually.  
 	  </para>
 	</answer>
       </qandaentry>
@@ -1731,7 +1105,7 @@ A: Sure! Here ya go!
 	<answer>
 	  <para>
 	    Yup.  Just rename it once you download it, or save it under a different
-	    filename.  This will not be fixed anytime too soon, because it would
+	    filename.  This will not be fixed anytime soon, because it would
 	    cripple some other functionality.
 	  </para>
 	</answer>
@@ -1754,7 +1128,7 @@ A: Sure! Here ya go!
 
     </qandadiv>
 
-    <qandadiv id="faq_hacking">
+    <qandadiv id="faq-hacking">
       <title>Bugzilla Hacking</title>
 
       <qandaentry>
@@ -1770,9 +1144,9 @@ A: Sure! Here ya go!
 	    enhancement for Bugzilla.
 	  </para>
 	  <para>
-	    You can view bugs marked for 2.16 release
-	    <ulink url="http://bugzilla.mozilla.org/buglist.cgi?product=Bugzilla&amp;target_milestone=Bugzilla+2.16">here</ulink>.
-	    This list includes bugs for the 2.16 release that have already
+	    You can view bugs marked for 2.18 release
+	    <ulink url="http://bugzilla.mozilla.org/buglist.cgi?product=Bugzilla&amp;target_milestone=Bugzilla+2.18">here</ulink>.
+	    This list includes bugs for the 2.18 release that have already
 	    been fixed and checked into CVS.  Please consult the
 	    <ulink url="http://www.mozilla.org/projects/bugzilla/">
 	      Bugzilla Project Page</ulink> for details on how to
@@ -1795,9 +1169,7 @@ A: Sure! Here ya go!
 	    http://bugzilla.mozilla.org/show_bug.cgi?id=49862</ulink>.  Ultimately, it's as easy
 	    as adding the "---" priority field to your localconfig file in the appropriate area,
 	    re-running checksetup.pl, and then changing the default priority in your browser using
-	    "editparams.cgi".  Hmm, now that I think about it, that is kind of a klunky way to handle
-	    it, but for now it's what we have!  Although the bug has been closed "resolved wontfix",
-	    there may be a better way to handle this...
+	    "editparams.cgi". 
 	  </para>
 	</answer>
       </qandaentry>
@@ -1820,19 +1192,19 @@ A: Sure! Here ya go!
 	      </listitem>
 	      <listitem>
 		<para>
-		  Upload your patch as a unified DIFF (having used "diff -u" against
+		  Upload your patch as a unified diff (having used "diff -u" against
 		  the <emphasis>current sources</emphasis> checked out of CVS),
 		  or new source file by clicking
 		  "Create a new attachment" link on the bug page you've just created, and
 		  include any descriptions of database changes you may make, into the bug
-		  ID you submitted in step #1.  Be sure and click the "Patch" radio
-		  button to indicate the text you are sending is a patch!
+		  ID you submitted in step #1.  Be sure and click the "Patch" checkbox
+		  to indicate the text you are sending is a patch!
 		</para>
 	      </listitem>
 	      <listitem>
 		<para>
 		  Announce your patch and the associated URL
-		  (http://bugzilla.mozilla.org/show_bug.cgi?id=XXXX) for discussion in
+		  (http://bugzilla.mozilla.org/show_bug.cgi?id=XXXXXX) for discussion in
 		  the newsgroup (netscape.public.mozilla.webtools).  You'll get a really
 		  good, fairly immediate reaction to the implications of your patch,
 		  which will also give us an idea how well-received the change would
@@ -1862,7 +1234,7 @@ A: Sure! Here ya go!
 
   </qandaset>
 
-</APPENDIX>
+</appendix>
 
 
 <!-- Keep this comment at the end of the file
diff --git a/docs/sgml/future.sgml b/docs/sgml/future.sgml
deleted file mode 100644
index 54f191349..000000000
--- a/docs/sgml/future.sgml
+++ /dev/null
@@ -1,619 +0,0 @@
-<!-- <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook V4.1//EN" > -->
-
-<chapter id="future">
-  <title>The Future of Bugzilla</title>
-  <synopsis>Bugzilla's Future.  Much of this is the present, now.</synopsis>
-  <para>
-  Bugzilla's future is a constantly-changing thing, as various developers
-  <quote>scratch an itch</quote> when it comes to functionality.
-  Thus this section is very malleable, subject to change without notice, etc.
-  You'll probably also notice the lack of formatting.  I apologize that it's
-  not quite as readable as the rest of the Guide.
-    </para>
-    <para>
-    <literallayout>
-                               Bugzilla Blue Sky
-
-Customisability
-
-   One of the major stumbling blocks of Bugzilla has been that it is too
-   rigid and does not adapt itself well enough to the needs of an
-   organisation.  This has led to organisations making changes to the
-   Bugzilla code that need to be redone each new version of Bugzilla.
-   Bugzilla should attempt to move away from this to a world where this
-   doesn't need to occur.
-
-   Most of the subsections in this section are currently explicit design
-   goals for the "Bugzilla 3" rewrite.  This does not necessarily mean
-   that they will not occur before them in Bugzilla 2, but most are
-   significant undertakings.
-
-  Field Customisation
-
-   Many installations wish to customise the fields that appear on bug
-   reports.   Current versions of Bugzilla offer limited
-   customisability.  In particular, some fields can be turned off.
-
-   However, many administrators wish to add their own fields, and rename
-   or otherwise modify existing fields.  An architecture that supports
-   this would be extraordinarily useful.
-
-   Indeed, many fields work similarly and could be abstracted into "field
-   types", so that an administrator need write little or no code to
-   support the new fields they desire.
-
-   Possible field types include text (eg status whiteboard), numbers,
-   dates (eg report time), accounts (eg reporter, qa, cc), inter-bug
-   relationships (dependencies, duplicates), option groups (platform, os,
-   severity, priority, target milestone, version) etc.
-
-   Ideally an administrator could configure their fields through a
-   Bugzilla interface that requires no code to be added.  However, it is
-   highly unlikely this ideal will never be met, and in a similar way
-   that office applications have scripting languages, Bugzilla should
-   allow new field types to be written.
-
-   Similarly, a common desire is for resolutions to be added or removed.
-
-    Allocations
-
-   ?
-
-    Option Groups
-
-   ?
-
-    Relations
-
-   ?
-
-  Database Integrity
-
-   Furthermore, it is desirable for administrators to be able to specify
-   rules that must or should apply between the fields on a bug report.
-
-   For example, you might wish to specify that a bug with status ASSIGNED
-   must have a target milestone field that that is not untargetted.  Or
-   that a bug with a certain number of votes should get ASSIGNED.  Or
-   that the QA contact must be different from the assignee.
-
-   "Must" relationships could be implemented by refusing to make changes
-   that violate the relationships, or alternatively, automatically
-   updating certain fields in order to satisfy the criteria.  Which
-   occurs should be up to the administrator.
-
-   "Should" relationships could be implemented by a combination of
-   emitting warnings on the process bug page, the same on notification
-   mails, or emitting periodic whine mails about the situation.  Again,
-   which occurs should be up to the administrator.
-
-   It should also be possible for whine mails to be emitted for "must"
-   relationships, as they might become violated through direct database
-   access, Bugzilla bugs, or because they were there before the
-   relationship was enforced.
-
-   As well as implementing intra-bug constraints, it would be useful to
-   create inter-bug constraints.  For example, a bug that is dependent on
-   another bug should not have an earlier milestone or greater priority
-   than that bug.
-
-  Database Adaptability
-
-   Often an administrator desires that fields adapt to the values of
-   other fields.  For example, the value of a field might determine the
-   possible values of another field or even whether it appears (whether
-   it is "applicable").
-
-   Limited adaptability is present in Bugzilla 2, and only on the
-   "Product" field:
-     * The possible values of the target milestone, version and component
-       fields depend on the product.
-     * UNCONFIRMED can be turned off for specific products.
-     * Voting can be configured differently or turned off for different
-       products, and there is a separate user vote limits for each
-       product.
-
-   It would be good if more adaptability was present, both in terms of
-   all fields relying on the product, as well as the ability to adapt
-   based on the value of all fields.
-
-   Example ???
-
-   General adaptability raises the issue of circular references between
-   fields causing problems.  One possible solution to this is to place
-   the fields in a total ordering and require a field refer only to the
-   previous fields.
-
-   In Bugzilla 2, changing the product of a bug meant a second page would
-   appear that allowed you to choose a new milestone, component and
-   version, as those fields adapted themselves to the new product.  This
-   page could be generalised to support all instances where:
-     * a field value must or might be changed because the possible values
-       have changed
-     * is going to drop off because it it is no longer applicable, and
-       this should be confirmed
-     * must be specified because it is suddenly applicable, and the
-       default value, if one exists, might not be acceptable
-
-  Database Independence
-
-   Currently Bugzilla only runs on the MySQL database.  It would be
-   desirable for Bugzilla to run on other databases, because:
-     * Organisations may have existing database products they use and
-       would prefer to run a homogenous environment.
-     * Databases each have their own shortcomings, including MySQL.  An
-       administrator might choose a database that would work better with
-       their Bugzilla.
-
-   This raises the possibility that we could use features that are only
-   present in some databases, by appropriately falling back.  For
-   example, in the MySQL world, we live without:
-     * record-level locking, instead we use table-level locking
-     * referential and record constraints, instead we checking code
-     * subselects, instead we use multiple queries and redundant "caches"
-
-  Multiple Front Ends
-
-   Currently Bugzilla is manipulated via the Web, and notifies via
-   E-Mail.  It would be desirable for Bugzilla to easily support various
-   front ends.
-
-   There is no reason that Bugzilla could not be controlled via a whole
-   range of front ends, including Web, E-Mail, IRC, ICQ, etc, and
-   similarly for how it notifies.  It's also possible that we could
-   introduce a special Bugzilla client that uses its own protocol, for
-   maximum user productivity.
-
-   Indeed a request reply might be returned via a totally different
-   transport method than was use to submit the request.
-
-Internationalisation
-
-   Bugzilla currently supports only English.  All of the field names,
-   user instructions, etc are written in English.  It would be desirable
-   to allow "language packs" so Bugzilla can be easily used in
-   non-English speaking locales.
-
-   To a degree field customisation supports this, because administrators
-   could specify their own fields names anyway.  However, there will
-   always be some basic facilities not covered by this, and it is
-   desirable that the administrator's interface also is
-   internationalisable.
-
-Better Searching
-
-  General Summary Reports
-
-   Sometimes, the normal querying page leaves a lot to be desired.  There
-   are other facilities already in place or which people have asked for:
-
-   Most Doomed Reports - All Bugs or All Bugs In A Product, Categorised
-   On Assignee, Shows and Counts Number of Bugs For Each Assignee
-   Most Voted For Bugs - All Bugs, Categorised On Product, Shows Top Ten
-   Bugs Voters Most Want Fixed
-   Number of Open Bugs For An Assignee - Bug List, Categorised On
-   Developers, Counts Number of Bugs In Category
-
-   The important thing to realise is that people want categorised reports
-   on all sorts of things - a general summary report.
-
-   In a categorised report, you choose the subset of bugs you wish to
-   operate on (similar to how you would specify a query), and then
-   categorise them on one or more fields.
-
-   For each category you display the count of the number of things in
-   that category.  You can optionally display the bugs themselves, or
-   leave them out, just showing the counts.  And you can optionally limit
-   the number of things (bugs or subcategories) that display in each
-   category.
-
-   Such a mechanism would let you do all of the above and more.
-   Applications of this mechanism would only be recognised once it was
-   implemented.
-
-  Related Bugs
-
-   It would be nice to have a field where you could enter other bugs
-   related to the current bug.  It would be handy for navigation and
-   possibly even finding duplicates.
-
-  Column Specification Support
-
-   Currently bug lists use the columns that you last used.  This doesn't
-   work well for "prepackaged queries", where you followed a link.  You
-   can probably add a column by specifying a sort column, but this is
-   difficult and suboptimal.
-
-   Furthermore, I find that when I want to add a column to a bug list,
-   it's usually a one off and I would prefer it to go away for the next
-   query.  Hence, it would be nice to specify the columns that appear on
-   the bug list (and general summary report) pages.  The default query
-   mechanism should be able to let you specify your default columns.
-
-  Advanced Querying Redesign
-
-   ?
-
-Keywords
-
-   People have a need to apply tags to bugs.  In the beginning, people
-   placed designators in the summary and status whiteboard.  However,
-   these fields were not designed for that, and so there were many flaws
-   with this system:
-     * They pollute the field with information that was never intended to
-       be present.
-     * Removing them with a bulk change is a difficult problem that has
-       too many pitfalls to implement.
-     * You can easily get the capitalisation wrong.
-
-   Then dependencies were introduced (when?), and people realised that
-   they could use them for "tracking bugs".  Again, dependencies were not
-   designed for that, and so there were more flaws, albeit different
-   ones, including:
-     * They aren't really bugs, so it's difficult to distinguish issues
-       from bugs.
-     * They can pollute bugs counts, and you must somehow exclude them
-       from queries.
-     * There is a whole lot of useless information on them.  They have an
-       assignee but there is nothing to fix, and that person can get
-       whined at by Bugzilla.  They have target milestones which must be
-       manually maintained.  And so on.
-
-   Finally, keywords were introduced (when?) for this purpose to remove
-   the need for these two systems.  Unfortunately, the simple keywords
-   implementation was itself lacking in certain features provided by the
-   two previous systems, and has remained almost unchanged since its
-   inception.  Furthermore, it could not be forseen that in large
-   installations, the sheer number of keywords could become unwieldly and
-   could lead to a movement back to the other systems.
-
-   The keywords system was the right idea, however, and it remains so.
-   Fixing the keywords system is one of the most important Bugzilla
-   issues.
-
-  Bringing Keywords Up To Par
-
-   For the most part, keywords are very good at what they do.  It is easy
-   to add and remove them (unlike summary/whiteboard designators), we can
-   simply see what issues are present on a bug (unlike tracking bugs),
-   and we do not confuse bugs with issues (unlike tracking bugs).
-
-   However, there are still some "regressions" in the keyword system over
-   previous systems:
-     * Users wish to view the "dependency forest" of a keyword.  While a
-       dependency tree is of one bug, a dependency forest is of a bug
-       list, and consists of a dependency tree for each member of the bug
-       list.  Users can work around this with tracking bugs by creating a
-       tracking bug and viewing the dependency tree of that tracking bug.
-     * Users wish to specify the keywords that initially apply to a bug,
-       but instead they must edit the bug once it has already been
-       submitted.  They can work around this with summary designators,
-       since they specify the summary at reporting time.
-     * Users wish to store or share a bug list that contains a keywords
-       column.  Hence they wish to be able to specify what columns appear
-       in the bug list URL, as mentioned earlier.  They can work around
-       this using summary designators, since almost all bug lists have a
-       summary column.
-     * Users wish to be able to view keywords on a bug list.  However
-       often they are only interested in a small number of keywords.
-       Having a bug list with a keywords column means that all keywords
-       will appear on a bug list.  This can take a substantial amount of
-       space where a bug has a lot of keywords, since the table columns
-       in Bugzilla adjust to the largest cell in that column.  Hence
-       users wish to be able to specify which keywords should appear in
-       the bug list.  In a very real sense, each keyword is a field unto
-       itself.  Users can work around this by using summary designators,
-       since they keywords will share the space in the summary column.
-     * Users wish to know when bugs with a specific issue are resolved.
-       Hence they wish to be able to receive notifications on all the
-       bugs with a specific keyword.  The introduction a generic watching
-       facility (also for things like watching all bugs in a component)
-       would achieve this.  Users can work around this by using tracking
-       bugs, as dependencies have an existing way of detecting fixes to
-       bug a bug was blocked by.
-
-  Dealing With The Keyword Overload
-
-   At the time of writing, the mozilla.org installation has approximately
-   100 keywords, and many more would be in use if the keywords system
-   didn't have the problems it does.
-
-   Such a large number of keywords introduces logistical problems:
-     * It must be easy for someone to learn what a keyword means.  If a
-       keyword is buried within a lot of other keywords, it can be
-       difficult to find.
-     * It must be easy to see what keywords are on a bug.  If the number
-       of keywords is large, then this can be difficult.
-
-   These lead some people to feel that there are "too many keywords".
-
-   These problems are not without solutions however.  It is harder to
-   find a list of designators or tracking bugs than it is a list of
-   keywords.
-
-   The essential problem is it needs to be easy to find the keywords
-   we're interested in through the mass of keywords.
-
-    Keyword Applicability
-
-   As has been previously mentioned, it is desirable for fields to be
-   able to adapt to the values of other fields.  This is certainly true
-   for keywords.  Many keywords are simply not relevant because of the
-   bugs product, component, etc.
-
-   Hence, by introducing keyword applicability, and not displaying
-   keywords that are not relevant to the current bug, or clearly
-   separating them, we can make the keyword overload problem less
-   significant.
-
-   Currently when you click on "keywords" on a bug, you get a list of all
-   bugs.  It would be desirable to introduce a list of keywords tailored
-   to a specific bug, that reports, in order:
-     * the keywords currently on the bug
-     * the keywords not currently on the bug, but applicable to the bug
-     * optionally, the keywords not applicable to the bug
-
-   This essentially orders the keywords into three groups, where each
-   group is more important than the previous, and therefore appears
-   closer to the top.
-
-    Keyword Grouping & Ordering
-
-   We could further enhance both the global and bug specific keyword list
-   by grouping keywords.  We should always have a "flat" view of
-   keywords, but other ways of viewing the keywords would be useful too.
-
-   If keyword applicability was implemented, we could group keywords
-   based on their "applicability condition".  Keywords that apply to all
-   bugs could be separated from keywords that apply to a specific
-   product, both on the global keyword list and the keyword list of a bug
-   that is in that product.
-
-   We could specify groups of our own.  For example, many keywords are in
-   a mutually exclusive group, essentially like radio buttons in a user
-   interface.  This creates a natural grouping, although other groupings
-   occur (which depends on your keywords).
-
-   It is possible that we could use collapsing/expanding operations on
-   "twisties" to only should the groups we are interested in.
-
-   And instead of grouping keywords, we could order them on some metric
-   of usefulness, such as:
-     * when the keyword was last added to a bug
-     * how many bugs the keyword is on
-     * how many open bugs the keyword is on
-
-    Opting Out Of Keywords
-
-   Not all people are going to care about all keywords.  Therefore it
-   makes sense that you may wish to specify which keywords you are
-   interested in, either on the bug page, or on notifications.
-
-   Other keywords will therefore not bother users who are not interested
-   in them.
-
-  Keyword Security
-
-   Currently all keywords are available and editable to all people with
-   edit bugs access.  This situation is clearly suboptimal.
-
-   Although relying on good behaviour for people to not do what they
-   shouldn't works reasonably well on the mozilla.org, it is better to
-   enforce that behaviour - it can be breached through malice, accident
-   or ignorance.
-
-   And in the situation where it is desirable for the presence or absence
-   of a keyword not to be revealed, organisations either need to be
-   content with the divulgence, or not use keywords at all.
-
-   In the situation where they choose to divulge, introducing the ability
-   to restrict who can see the keyword would also reduce keyword
-   overload.
-
-  Personal Keywords
-
-   Keywords join together a set of bugs which would otherwise be
-   unrelated in the bug system.
-
-   We allow users to store their own queries.  However we don't allow
-   them to store their own keywords on a bug.  This reduces the
-   usefulness of personal queries, since you cannot join a set of
-   unrelated bugs together in a way that you wish.  Lists of bug numbers
-   can work, by they can only be used for small lists, and it is
-   impossible to share a list between multiple queries.
-
-   Personal keywords are necessary to replace personal tracking bugs, as
-   they would not pollute the keyword space.  Indeed, on many
-   installations this could remove some keywords out of the global
-   keyword space.
-
-   In a similar vein and with similar effects, group keywords could be
-   introduced that are only available to members of a specific group.
-
-  Keyword Restrictions
-
-   Keywords are not islands unto themselves.  Along with their potential
-   to be involved in the inter-field relationships mentioned earlier,
-   keywords can also be related to other keywords.
-
-   Essentially, there are two possibilities:
-     * a set of keywords are mutually exclusive
-     * the presence of a keyword implies another keyword must be present
-
-   Introduction of the ability to specify these restrictions would have
-   benefits.
-
-   If mutually exclusive keywords were present on a bug, their removal
-   would fix up the database, as well as reducing the number of keywords
-   on that bug.
-
-   In the situation where a keyword implies another keyword, there are
-   two possiblities as to how to handle the situation.
-
-   The first is automatically add the keyword.  This would fix up the
-   database, but it would increase the number of keywords on a bug.
-
-   The second is to automatically remove the keyword, and alter queries
-   so they pick up the first keyword as well as the removed keyword.
-   This would fix up the database and reduce the number of keywords on a
-   bug, but it might confuse users who don't see the keyword.
-   Alternatively, the implied keywords could be listed separately.
-
-Notifications
-
-   Every time a bug gets changed notifications get sent out to people
-   letting them know about what changes have been made.  This is a
-   significant feature, and all sorts of questions can be raised, but
-   they mainly boil down to when they should be sent and what they should
-   look like.
-
-  Changes You're Interested In
-
-   As of version 2.12 users can specify what sort of changes they are
-   interested in receiving notifications for.  However, this is still
-   limited.  As yet there is no facility to specify which keywords you
-   care about, and whether you care about changes to fields such as the
-   QA contact changes.
-   Furthermore, often an unnecessary comment will go along with a change,
-   either because it is required, or the commenter is ignorant of how the
-   new system works.  While explaining why you did something is useful,
-   merely commenting on what you did is not because that information is
-   already accessible view "Bug Activity".
-
-   Because of this unnecessary comment, a lot of changes that would
-   otherwise not generate notifications for certain people do so, because
-   few people are willing to turn off comments.  One way to deal with
-   this problem is to allow people to specify that their comments are
-   purely explanatory, and that anyone who is not interested in the
-   change will not be interested in the comment.
-
-   Furthermore, one possible rationale for unnecessary comments is that
-   the bug activity does not display on the normal page and hence it is
-   difficult to cross reference comments and actions.  Hence, it would be
-   beneficial to be able to do this.
-
-  Bugs You're Watching
-
-   Currently to receive a notification about a bug you need to have your
-   name on it.  This is suboptimal because you need to know about a bug
-   before you can receive notifications on it.  Often you are interested
-   in any bug with a field set to a specific value.  For example, you
-   might be interested in all bugs with a specific product, component or
-   keyword.
-
-   If someone could automatically receive notifications about these bugs,
-   it would make everyone's lives easier.  Currently the default assignee
-   and QA contact for a component will automatically receive
-   notifications for
-
-   Question:  This moves half way to a BCC.
-
-  Bulk Changes
-
-   A very useful feature of Bugzilla is the ability to perform an action
-   on multiple bugs at once.  However, this means that similar
-   notifications are currently generated for each bug modified.
-
-   This can result in a torrent of notifications that can annoy.
-
-   Furthermore, since the bugs are all changed close to each other in
-   time, it is easy for someone to mass delete all the notifications
-   generated by a bulk change and miss an unrelated notification in the
-   middle.
-
-   These factors can lead to a tendency for people to delay bulk changes,
-   or avoid them entirely.  This is suboptimal.
-
-   It would be better if a bulk change generated only one notification
-   mail.  This would vastly reduce the annoyance factor, and prevent
-   accidental deletion of notifications.
-
-   One problem with this change is that some people separate out
-   notifications using filtering.  This means that they would no longer
-   be match parts of a bulk change under different filtering rules.
-
-   One possibility to resolve this is to allow people to specify groups
-   of bugs.  All bugs within a group would go into the same
-   notification.  The filters could then distinguish the different bug
-   groups.
-
-   In any case, it is likely there would need to be a transition period
-   to allow people to alter their filters.
-
-Nominations
-
-   ?
-
-Linking Bugzilla Installations
-
-   The first example of linking Bugzilla installations together has is
-   the introduction of bug moving in version 2.12.  However, it would be
-   useful to be able to link installations in more ways.
-     * Dependencies and other relationships between bugs in other
-       installations.  This is difficult because dependencies are
-       synchronised on both bugs, so the installation that changes
-       dependencies would need to communicate the new state to the other
-       installation.  It would also mean that relationships and
-       notifications that refer to other bugs would need to communicate
-       with the other installation.
-     * References to bugs in other installations.  Currently if you type
-       "bug XXX" or "bug #XXX" where XXX is a number, you get an
-       automatic hyperlink to that bug.  It would be useful if you could
-       say "YYY bug #XXX" where YYY is the name of another installation.
-
-Retirement
-
-   ?
-
-Whiny Reports
-
-   ?
-
-  Group Redesign
-
-   ?
-
-  Hard Wrapping Comments
-
-   Currently Bugzilla "hard wraps" its comments to a specific line size,
-   similar to E-Mail.  This has various problems:
-     * The way it currently works, wrapping is done in the browser at
-       submission time using a non-standard HTML extension not supported
-       by some (uncommon) browsers.  These browsers generate comments
-       that scroll off the right side of the screen.
-     * Because comments are of fixed width, when you expand your browser
-       window, the comments do not expand to fit available space.
-
-   It would be much better to move to a world of soft wrapping, where the
-   browser wraps the text at display time, similar to a world processor.
-    And as in a word processor, soft wrapping does not preclude the
-   insertion of newlines.
-
-   Hard wrapping is too entrenched into text E-Mail to fix, but we can
-   fix Bugzilla without causing any problems.  The old content will still
-   be wrapped too early, but at least new content will work.
-   </literallayout>
-  </para>
-</chapter>
-
-<!-- Keep this comment at the end of the file
-Local variables:
-mode: sgml
-sgml-always-quote-attributes:t
-sgml-auto-insert-required-elements:t
-sgml-balanced-tag-edit:t
-sgml-exposed-tags:nil
-sgml-general-insert-case:lower
-sgml-indent-data:t
-sgml-indent-step:2
-sgml-local-catalogs:nil
-sgml-local-ecat-files:nil
-sgml-minimize-attributes:nil
-sgml-namecase-general:t
-sgml-omittag:t
-sgml-parent-document:("Bugzilla-Guide.sgml" "book" "chapter")
-sgml-shorttag:t
-sgml-tag-region-if-active:t
-End:
--->
-
diff --git a/docs/sgml/gd-makefile.patch b/docs/sgml/gd-makefile.patch
new file mode 100644
index 000000000..8ec35a23a
--- /dev/null
+++ b/docs/sgml/gd-makefile.patch
@@ -0,0 +1,22 @@
+--- GD-1.33/Makefile.PL Fri Aug  4 16:59:22 2000
++++ GD-1.33-darwin/Makefile.PL  Tue Jun 26 01:29:32 2001
+@@ -3,8 +3,8 @@
+ warn "NOTICE: This module requires libgd 1.8.3 or higher (shared library version 4.X).\n";
+ 
+ # =====> PATHS: CHECK AND ADJUST <=====
+-my @INC     = qw(-I/usr/local/include -I/usr/local/include/gd); 
+-my @LIBPATH = qw(-L/usr/lib/X11 -L/usr/X11R6/lib -L/usr/X11/lib -L/usr/local/lib );
++my @INC     = qw(-I/sw/include -I/sw/include/gd -I/usr/local/include -I/usr/local/include/gd);
++my @LIBPATH = qw(-L/usr/lib/X11 -L/usr/X11R6/lib -L/usr/X11/lib -L/sw/lib -L/usr/local/lib);
+ my @LIBS    = qw(-lgd -lpng -lz);
+ 
+ # FEATURE FLAGS
+@@ -23,7 +23,7 @@
+ 
+ push @LIBS,'-lttf' if $TTF;
+ push @LIBS,'-ljpeg' if $JPEG;
+-push @LIBS, '-lm' unless $^O eq 'MSWin32';
++push @LIBS, '-lm' unless ($^O =~ /^MSWin32|darwin$/);
+ 
+ # FreeBSD 3.3 with libgd built from ports croaks if -lXpm is specified 
+ if ($^O ne 'freebsd' && $^O ne 'MSWin32') {
diff --git a/docs/sgml/gfdl.sgml b/docs/sgml/gfdl.sgml
index 7d8d9967f..047646411 100644
--- a/docs/sgml/gfdl.sgml
+++ b/docs/sgml/gfdl.sgml
@@ -1,456 +1,429 @@
 <!-- <!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> -->
+<section id="gfdl">
+  <title>GNU Free Documentation License</title>
 
-<appendix id="gfdl">
-<title>GNU Free Documentation License</title>
 <!-- - GNU Project - Free Software Foundation (FSF) -->
 <!-- LINK REV="made" HREF="mailto:webmasters@gnu.org" -->
-
-
-  <!-- sect1>
+<!-- section>
     <title>GNU Free Documentation License</title -->
+  <para>Version 1.1, March 2000</para>
 
-    <para>Version 1.1, March 2000</para>
-
-    <blockquote>
-      <para>Copyright (C) 2000  Free Software Foundation, Inc.
-59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.</para>
-    </blockquote>
+  <blockquote>
+    <para>Copyright (C) 2000 Free Software Foundation, Inc. 59 Temple Place,
+    Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and
+    distribute verbatim copies of this license document, but changing it is
+    not allowed.</para>
+  </blockquote>
 
-  <sect1 label="0" id="gfdl_0">
+  <section label="0" id="gfdl-0">
     <title>PREAMBLE</title>
 
-    <para>The purpose of this License is to make a manual, textbook,
-    or other written document "free" in the sense of freedom: to
-    assure everyone the effective freedom to copy and redistribute it,
-    with or without modifying it, either commercially or
-    noncommercially.  Secondarily, this License preserves for the
-    author and publisher a way to get credit for their work, while not
-    being considered responsible for modifications made by
+    <para>The purpose of this License is to make a manual, textbook, or other
+    written document "free" in the sense of freedom: to assure everyone the
+    effective freedom to copy and redistribute it, with or without modifying
+    it, either commercially or noncommercially. Secondarily, this License
+    preserves for the author and publisher a way to get credit for their
+    work, while not being considered responsible for modifications made by
     others.</para>
 
-    <para>This License is a kind of "copyleft", which means that
-    derivative works of the document must themselves be free in the
-    same sense.  It complements the GNU General Public License, which
-    is a copyleft license designed for free software.</para>
-
-    <para>We have designed this License in order to use it for manuals
-    for free software, because free software needs free documentation:
-    a free program should come with manuals providing the same
-    freedoms that the software does.  But this License is not limited
-    to software manuals; it can be used for any textual work,
-    regardless of subject matter or whether it is published as a
-    printed book.  We recommend this License principally for works
-    whose purpose is instruction or reference.</para>
-  </sect1>
-
-  <sect1 label="1" id="gfdl_1">
+    <para>This License is a kind of "copyleft", which means that derivative
+    works of the document must themselves be free in the same sense. It
+    complements the GNU General Public License, which is a copyleft license
+    designed for free software.</para>
+
+    <para>We have designed this License in order to use it for manuals for
+    free software, because free software needs free documentation: a free
+    program should come with manuals providing the same freedoms that the
+    software does. But this License is not limited to software manuals; it
+    can be used for any textual work, regardless of subject matter or whether
+    it is published as a printed book. We recommend this License principally
+    for works whose purpose is instruction or reference.</para>
+  </section>
+
+  <section label="1" id="gfdl-1">
     <title>APPLICABILITY AND DEFINITIONS</title>
 
-    <para>This License applies to any manual or other work that
-    contains a notice placed by the copyright holder saying it can be
-    distributed under the terms of this License.  The "Document",
-    below, refers to any such manual or work.  Any member of the
-    public is a licensee, and is addressed as "you".</para>
-
-    <para>A "Modified Version" of the Document means any work
-    containing the Document or a portion of it, either copied
-    verbatim, or with modifications and/or translated into another
-    language.</para>
-
-    <para>A "Secondary Section" is a named appendix or a front-matter
-    section of the Document that deals exclusively with the
-    relationship of the publishers or authors of the Document to the
-    Document's overall subject (or to related matters) and contains
-    nothing that could fall directly within that overall subject.
-    (For example, if the Document is in part a textbook of
-    mathematics, a Secondary Section may not explain any mathematics.)
-    The relationship could be a matter of historical connection with
-    the subject or with related matters, or of legal, commercial,
-    philosophical, ethical or political position regarding
-    them.</para>
-
-    <para>The "Invariant Sections" are certain Secondary Sections
-    whose titles are designated, as being those of Invariant Sections,
-    in the notice that says that the Document is released under this
-    License.</para>
-
-    <para>The "Cover Texts" are certain short passages of text that
-    are listed, as Front-Cover Texts or Back-Cover Texts, in the
-    notice that says that the Document is released under this
-    License.</para>
-
-    <para>A "Transparent" copy of the Document means a
-    machine-readable copy, represented in a format whose specification
-    is available to the general public, whose contents can be viewed
-    and edited directly and straightforwardly with generic text
-    editors or (for images composed of pixels) generic paint programs
-    or (for drawings) some widely available drawing editor, and that
-    is suitable for input to text formatters or for automatic
-    translation to a variety of formats suitable for input to text
-    formatters.  A copy made in an otherwise Transparent file format
-    whose markup has been designed to thwart or discourage subsequent
-    modification by readers is not Transparent.  A copy that is not
-    "Transparent" is called "Opaque".</para>
-
-    <para>Examples of suitable formats for Transparent copies include
-    plain ASCII without markup, Texinfo input format, LaTeX input
-    format, SGML or XML using a publicly available DTD, and
-    standard-conforming simple HTML designed for human modification.
-    Opaque formats include PostScript, PDF, proprietary formats that
-    can be read and edited only by proprietary word processors, SGML
-    or XML for which the DTD and/or processing tools are not generally
-    available, and the machine-generated HTML produced by some word
+    <para>This License applies to any manual or other work that contains a
+    notice placed by the copyright holder saying it can be distributed under
+    the terms of this License. The "Document", below, refers to any such
+    manual or work. Any member of the public is a licensee, and is addressed
+    as "you".</para>
+
+    <para>A "Modified Version" of the Document means any work containing the
+    Document or a portion of it, either copied verbatim, or with
+    modifications and/or translated into another language.</para>
+
+    <para>A "Secondary Section" is a named appendix or a front-matter section
+    of the Document that deals exclusively with the relationship of the
+    publishers or authors of the Document to the Document's overall subject
+    (or to related matters) and contains nothing that could fall directly
+    within that overall subject. (For example, if the Document is in part a
+    textbook of mathematics, a Secondary Section may not explain any
+    mathematics.) The relationship could be a matter of historical connection
+    with the subject or with related matters, or of legal, commercial,
+    philosophical, ethical or political position regarding them.</para>
+
+    <para>The "Invariant Sections" are certain Secondary Sections whose
+    titles are designated, as being those of Invariant Sections, in the
+    notice that says that the Document is released under this License.</para>
+
+    <para>The "Cover Texts" are certain short passages of text that are
+    listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says
+    that the Document is released under this License.</para>
+
+    <para>A "Transparent" copy of the Document means a machine-readable copy,
+    represented in a format whose specification is available to the general
+    public, whose contents can be viewed and edited directly and
+    straightforwardly with generic text editors or (for images composed of
+    pixels) generic paint programs or (for drawings) some widely available
+    drawing editor, and that is suitable for input to text formatters or for
+    automatic translation to a variety of formats suitable for input to text
+    formatters. A copy made in an otherwise Transparent file format whose
+    markup has been designed to thwart or discourage subsequent modification
+    by readers is not Transparent. A copy that is not "Transparent" is called
+    "Opaque".</para>
+
+    <para>Examples of suitable formats for Transparent copies include plain
+    ASCII without markup, Texinfo input format, LaTeX input format, SGML or
+    XML using a publicly available DTD, and standard-conforming simple HTML
+    designed for human modification. Opaque formats include PostScript, PDF,
+    proprietary formats that can be read and edited only by proprietary word
+    processors, SGML or XML for which the DTD and/or processing tools are not
+    generally available, and the machine-generated HTML produced by some word
     processors for output purposes only.</para>
 
-    <para>The "Title Page" means, for a printed book, the title page
-    itself, plus such following pages as are needed to hold, legibly,
-    the material this License requires to appear in the title page.
-    For works in formats which do not have any title page as such,
-    "Title Page" means the text near the most prominent appearance of
-    the work's title, preceding the beginning of the body of the
-    text.</para>
-  </sect1>
+    <para>The "Title Page" means, for a printed book, the title page itself,
+    plus such following pages as are needed to hold, legibly, the material
+    this License requires to appear in the title page. For works in formats
+    which do not have any title page as such, "Title Page" means the text
+    near the most prominent appearance of the work's title, preceding the
+    beginning of the body of the text.</para>
+  </section>
 
-  <sect1 label="2" id="gfdl_2">
+  <section label="2" id="gfdl-2">
     <title>VERBATIM COPYING</title>
 
-    <para>You may copy and distribute the Document in any medium,
-    either commercially or noncommercially, provided that this
-    License, the copyright notices, and the license notice saying this
-    License applies to the Document are reproduced in all copies, and
-    that you add no other conditions whatsoever to those of this
-    License.  You may not use technical measures to obstruct or
-    control the reading or further copying of the copies you make or
-    distribute.  However, you may accept compensation in exchange for
-    copies.  If you distribute a large enough number of copies you
-    must also follow the conditions in section 3.</para>
-
-    <para>You may also lend copies, under the same conditions stated
-    above, and you may publicly display copies.</para>
-  </sect1>
-
-  <sect1 label="3" id="gfdl_3">
+    <para>You may copy and distribute the Document in any medium, either
+    commercially or noncommercially, provided that this License, the
+    copyright notices, and the license notice saying this License applies to
+    the Document are reproduced in all copies, and that you add no other
+    conditions whatsoever to those of this License. You may not use technical
+    measures to obstruct or control the reading or further copying of the
+    copies you make or distribute. However, you may accept compensation in
+    exchange for copies. If you distribute a large enough number of copies
+    you must also follow the conditions in section 3.</para>
+
+    <para>You may also lend copies, under the same conditions stated above,
+    and you may publicly display copies.</para>
+  </section>
+
+  <section label="3" id="gfdl-3">
     <title>COPYING IN QUANTITY</title>
 
-    <para>If you publish printed copies of the Document numbering more
-    than 100, and the Document's license notice requires Cover Texts,
-    you must enclose the copies in covers that carry, clearly and
-    legibly, all these Cover Texts: Front-Cover Texts on the front
-    cover, and Back-Cover Texts on the back cover.  Both covers must
-    also clearly and legibly identify you as the publisher of these
-    copies.  The front cover must present the full title with all
-    words of the title equally prominent and visible.  You may add
-    other material on the covers in addition.  Copying with changes
-    limited to the covers, as long as they preserve the title of the
-    Document and satisfy these conditions, can be treated as verbatim
-    copying in other respects.</para>
-
-    <para>If the required texts for either cover are too voluminous to
-    fit legibly, you should put the first ones listed (as many as fit
-    reasonably) on the actual cover, and continue the rest onto
-    adjacent pages.</para>
+    <para>If you publish printed copies of the Document numbering more than
+    100, and the Document's license notice requires Cover Texts, you must
+    enclose the copies in covers that carry, clearly and legibly, all these
+    Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts
+    on the back cover. Both covers must also clearly and legibly identify you
+    as the publisher of these copies. The front cover must present the full
+    title with all words of the title equally prominent and visible. You may
+    add other material on the covers in addition. Copying with changes
+    limited to the covers, as long as they preserve the title of the Document
+    and satisfy these conditions, can be treated as verbatim copying in other
+    respects.</para>
+
+    <para>If the required texts for either cover are too voluminous to fit
+    legibly, you should put the first ones listed (as many as fit reasonably)
+    on the actual cover, and continue the rest onto adjacent pages.</para>
 
     <para>If you publish or distribute Opaque copies of the Document
-    numbering more than 100, you must either include a
-    machine-readable Transparent copy along with each Opaque copy, or
-    state in or with each Opaque copy a publicly-accessible
-    computer-network location containing a complete Transparent copy
-    of the Document, free of added material, which the general
-    network-using public has access to download anonymously at no
-    charge using public-standard network protocols.  If you use the
-    latter option, you must take reasonably prudent steps, when you
-    begin distribution of Opaque copies in quantity, to ensure that
-    this Transparent copy will remain thus accessible at the stated
-    location until at least one year after the last time you
-    distribute an Opaque copy (directly or through your agents or
-    retailers) of that edition to the public.</para>
-
-    <para>It is requested, but not required, that you contact the
-    authors of the Document well before redistributing any large
-    number of copies, to give them a chance to provide you with an
-    updated version of the Document.</para>
-  </sect1>
-
-  <sect1 label="4" id="gfdl_4">
+    numbering more than 100, you must either include a machine-readable
+    Transparent copy along with each Opaque copy, or state in or with each
+    Opaque copy a publicly-accessible computer-network location containing a
+    complete Transparent copy of the Document, free of added material, which
+    the general network-using public has access to download anonymously at no
+    charge using public-standard network protocols. If you use the latter
+    option, you must take reasonably prudent steps, when you begin
+    distribution of Opaque copies in quantity, to ensure that this
+    Transparent copy will remain thus accessible at the stated location until
+    at least one year after the last time you distribute an Opaque copy
+    (directly or through your agents or retailers) of that edition to the
+    public.</para>
+
+    <para>It is requested, but not required, that you contact the authors of
+    the Document well before redistributing any large number of copies, to
+    give them a chance to provide you with an updated version of the
+    Document.</para>
+  </section>
+
+  <section label="4" id="gfdl-4">
     <title>MODIFICATIONS</title>
 
-    <para>You may copy and distribute a Modified Version of the
-    Document under the conditions of sections 2 and 3 above, provided
-    that you release the Modified Version under precisely this
-    License, with the Modified Version filling the role of the
-    Document, thus licensing distribution and modification of the
-    Modified Version to whoever possesses a copy of it.  In addition,
-    you must do these things in the Modified Version:</para>
+    <para>You may copy and distribute a Modified Version of the Document
+    under the conditions of sections 2 and 3 above, provided that you release
+    the Modified Version under precisely this License, with the Modified
+    Version filling the role of the Document, thus licensing distribution and
+    modification of the Modified Version to whoever possesses a copy of it.
+    In addition, you must do these things in the Modified Version:</para>
 
     <orderedlist numeration="upperalpha">
-      <listitem><para>Use in the Title Page
-      (and on the covers, if any) a title distinct from that of the
-      Document, and from those of previous versions (which should, if
-      there were any, be listed in the History section of the
-      Document).  You may use the same title as a previous version if
-      the original publisher of that version gives permission.</para>
+      <listitem>
+        <para>Use in the Title Page (and on the covers, if any) a title
+        distinct from that of the Document, and from those of previous
+        versions (which should, if there were any, be listed in the History
+        section of the Document). You may use the same title as a previous
+        version if the original publisher of that version gives
+        permission.</para>
       </listitem>
 
-      <listitem><para>List on the Title Page,
-      as authors, one or more persons or entities responsible for
-      authorship of the modifications in the Modified Version,
-      together with at least five of the principal authors of the
-      Document (all of its principal authors, if it has less than
-      five).</para>
+      <listitem>
+        <para>List on the Title Page, as authors, one or more persons or
+        entities responsible for authorship of the modifications in the
+        Modified Version, together with at least five of the principal
+        authors of the Document (all of its principal authors, if it has less
+        than five).</para>
       </listitem>
 
-      <listitem><para>State on the Title page
-      the name of the publisher of the Modified Version, as the
-      publisher.</para>
+      <listitem>
+        <para>State on the Title page the name of the publisher of the
+        Modified Version, as the publisher.</para>
       </listitem>
 
-      <listitem><para>Preserve all the
-      copyright notices of the Document.</para>
+      <listitem>
+        <para>Preserve all the copyright notices of the Document.</para>
       </listitem>
 
-      <listitem><para>Add an appropriate
-      copyright notice for your modifications adjacent to the other
-      copyright notices.</para>
+      <listitem>
+        <para>Add an appropriate copyright notice for your modifications
+        adjacent to the other copyright notices.</para>
       </listitem>
 
-      <listitem><para>Include, immediately
-      after the copyright notices, a license notice giving the public
-      permission to use the Modified Version under the terms of this
-      License, in the form shown in the Addendum below.</para>
+      <listitem>
+        <para>Include, immediately after the copyright notices, a license
+        notice giving the public permission to use the Modified Version under
+        the terms of this License, in the form shown in the Addendum
+        below.</para>
       </listitem>
 
-      <listitem><para>Preserve in that license
-      notice the full lists of Invariant Sections and required Cover
-      Texts given in the Document's license notice.</para>
+      <listitem>
+        <para>Preserve in that license notice the full lists of Invariant
+        Sections and required Cover Texts given in the Document's license
+        notice.</para>
       </listitem>
 
-      <listitem><para>Include an unaltered
-      copy of this License.</para>
+      <listitem>
+        <para>Include an unaltered copy of this License.</para>
       </listitem>
 
-      <listitem><para>Preserve the section
-      entitled "History", and its title, and add to it an item stating
-      at least the title, year, new authors, and publisher of the
-      Modified Version as given on the Title Page.  If there is no
-      section entitled "History" in the Document, create one stating
-      the title, year, authors, and publisher of the Document as given
-      on its Title Page, then add an item describing the Modified
-      Version as stated in the previous sentence.</para>
+      <listitem>
+        <para>Preserve the section entitled "History", and its title, and add
+        to it an item stating at least the title, year, new authors, and
+        publisher of the Modified Version as given on the Title Page. If
+        there is no section entitled "History" in the Document, create one
+        stating the title, year, authors, and publisher of the Document as
+        given on its Title Page, then add an item describing the Modified
+        Version as stated in the previous sentence.</para>
       </listitem>
 
-      <listitem><para>Preserve the network
-      location, if any, given in the Document for public access to a
-      Transparent copy of the Document, and likewise the network
-      locations given in the Document for previous versions it was
-      based on.  These may be placed in the "History" section.  You
-      may omit a network location for a work that was published at
-      least four years before the Document itself, or if the original
-      publisher of the version it refers to gives permission.</para>
+      <listitem>
+        <para>Preserve the network location, if any, given in the Document
+        for public access to a Transparent copy of the Document, and likewise
+        the network locations given in the Document for previous versions it
+        was based on. These may be placed in the "History" section. You may
+        omit a network location for a work that was published at least four
+        years before the Document itself, or if the original publisher of the
+        version it refers to gives permission.</para>
       </listitem>
 
-      <listitem><para>In any section entitled
-      "Acknowledgements" or "Dedications", preserve the section's
-      title, and preserve in the section all the substance and tone of
-      each of the contributor acknowledgements and/or dedications
-      given therein.</para>
+      <listitem>
+        <para>In any section entitled "Acknowledgements" or "Dedications",
+        preserve the section's title, and preserve in the section all the
+        substance and tone of each of the contributor acknowledgements and/or
+        dedications given therein.</para>
       </listitem>
 
-      <listitem><para>Preserve all the
-      Invariant Sections of the Document, unaltered in their text and
-      in their titles.  Section numbers or the equivalent are not
-      considered part of the section titles.</para>
+      <listitem>
+        <para>Preserve all the Invariant Sections of the Document, unaltered
+        in their text and in their titles. Section numbers or the equivalent
+        are not considered part of the section titles.</para>
       </listitem>
 
-      <listitem><para>Delete any section
-      entitled "Endorsements".  Such a section may not be included in
-      the Modified Version.</para>
+      <listitem>
+        <para>Delete any section entitled "Endorsements". Such a section may
+        not be included in the Modified Version.</para>
       </listitem>
 
-      <listitem><para>Do not retitle any
-      existing section as "Endorsements" or to conflict in title with
-      any Invariant Section.</para>
+      <listitem>
+        <para>Do not retitle any existing section as "Endorsements" or to
+        conflict in title with any Invariant Section.</para>
       </listitem>
     </orderedlist>
-    
-    <para>If the Modified Version includes new front-matter sections
-    or appendices that qualify as Secondary Sections and contain no
-    material copied from the Document, you may at your option
-    designate some or all of these sections as invariant.  To do this,
-    add their titles to the list of Invariant Sections in the Modified
-    Version's license notice.  These titles must be distinct from any
-    other section titles.</para>
-
-    <para>You may add a section entitled "Endorsements", provided it
-    contains nothing but endorsements of your Modified Version by
-    various parties--for example, statements of peer review or that
-    the text has been approved by an organization as the authoritative
-    definition of a standard.</para>
-
-    <para>You may add a passage of up to five words as a Front-Cover
-    Text, and a passage of up to 25 words as a Back-Cover Text, to the
-    end of the list of Cover Texts in the Modified Version.  Only one
-    passage of Front-Cover Text and one of Back-Cover Text may be
-    added by (or through arrangements made by) any one entity.  If the
-    Document already includes a cover text for the same cover,
-    previously added by you or by arrangement made by the same entity
-    you are acting on behalf of, you may not add another; but you may
-    replace the old one, on explicit permission from the previous
-    publisher that added the old one.</para>
-
-    <para>The author(s) and publisher(s) of the Document do not by
-    this License give permission to use their names for publicity for
-    or to assert or imply endorsement of any Modified Version.</para>
-  </sect1>
-
-  <sect1 label="5" id="gfdl_5">
+
+    <para>If the Modified Version includes new front-matter sections or
+    appendices that qualify as Secondary Sections and contain no material
+    copied from the Document, you may at your option designate some or all of
+    these sections as invariant. To do this, add their titles to the list of
+    Invariant Sections in the Modified Version's license notice. These titles
+    must be distinct from any other section titles.</para>
+
+    <para>You may add a section entitled "Endorsements", provided it contains
+    nothing but endorsements of your Modified Version by various parties--for
+    example, statements of peer review or that the text has been approved by
+    an organization as the authoritative definition of a standard.</para>
+
+    <para>You may add a passage of up to five words as a Front-Cover Text,
+    and a passage of up to 25 words as a Back-Cover Text, to the end of the
+    list of Cover Texts in the Modified Version. Only one passage of
+    Front-Cover Text and one of Back-Cover Text may be added by (or through
+    arrangements made by) any one entity. If the Document already includes a
+    cover text for the same cover, previously added by you or by arrangement
+    made by the same entity you are acting on behalf of, you may not add
+    another; but you may replace the old one, on explicit permission from the
+    previous publisher that added the old one.</para>
+
+    <para>The author(s) and publisher(s) of the Document do not by this
+    License give permission to use their names for publicity for or to assert
+    or imply endorsement of any Modified Version.</para>
+  </section>
+
+  <section label="5" id="gfdl-5">
     <title>COMBINING DOCUMENTS</title>
 
-    <para>You may combine the Document with other documents released
-    under this License, under the terms defined in section 4 above for
-    modified versions, provided that you include in the combination
-    all of the Invariant Sections of all of the original documents,
-    unmodified, and list them all as Invariant Sections of your
-    combined work in its license notice.</para>
-
-    <para>The combined work need only contain one copy of this
-    License, and multiple identical Invariant Sections may be replaced
-    with a single copy.  If there are multiple Invariant Sections with
-    the same name but different contents, make the title of each such
-    section unique by adding at the end of it, in parentheses, the
-    name of the original author or publisher of that section if known,
-    or else a unique number.  Make the same adjustment to the section
-    titles in the list of Invariant Sections in the license notice of
-    the combined work.</para>
+    <para>You may combine the Document with other documents released under
+    this License, under the terms defined in section 4 above for modified
+    versions, provided that you include in the combination all of the
+    Invariant Sections of all of the original documents, unmodified, and list
+    them all as Invariant Sections of your combined work in its license
+    notice.</para>
+
+    <para>The combined work need only contain one copy of this License, and
+    multiple identical Invariant Sections may be replaced with a single copy.
+    If there are multiple Invariant Sections with the same name but different
+    contents, make the title of each such section unique by adding at the end
+    of it, in parentheses, the name of the original author or publisher of
+    that section if known, or else a unique number. Make the same adjustment
+    to the section titles in the list of Invariant Sections in the license
+    notice of the combined work.</para>
 
     <para>In the combination, you must combine any sections entitled
-    "History" in the various original documents, forming one section
-    entitled "History"; likewise combine any sections entitled
-    "Acknowledgements", and any sections entitled "Dedications".  You
-    must delete all sections entitled "Endorsements."</para>
-  </sect1>
+    "History" in the various original documents, forming one section entitled
+    "History"; likewise combine any sections entitled "Acknowledgements", and
+    any sections entitled "Dedications". You must delete all sections
+    entitled "Endorsements."</para>
+  </section>
 
-  <sect1 label="6" id="gfdl_6">
+  <section label="6" id="gfdl-6">
     <title>COLLECTIONS OF DOCUMENTS</title>
 
-    <para>You may make a collection consisting of the Document and
-    other documents released under this License, and replace the
-    individual copies of this License in the various documents with a
-    single copy that is included in the collection, provided that you
-    follow the rules of this License for verbatim copying of each of
-    the documents in all other respects.</para>
-
-    <para>You may extract a single document from such a collection,
-    and distribute it individually under this License, provided you
-    insert a copy of this License into the extracted document, and
-    follow this License in all other respects regarding verbatim
-    copying of that document.</para>
-  </sect1>
-
-  <sect1 label="7" id="gfdl_7">
+    <para>You may make a collection consisting of the Document and other
+    documents released under this License, and replace the individual copies
+    of this License in the various documents with a single copy that is
+    included in the collection, provided that you follow the rules of this
+    License for verbatim copying of each of the documents in all other
+    respects.</para>
+
+    <para>You may extract a single document from such a collection, and
+    distribute it individually under this License, provided you insert a copy
+    of this License into the extracted document, and follow this License in
+    all other respects regarding verbatim copying of that document.</para>
+  </section>
+
+  <section label="7" id="gfdl-7">
     <title>AGGREGATION WITH INDEPENDENT WORKS</title>
-    
+
     <para>A compilation of the Document or its derivatives with other
-    separate and independent documents or works, in or on a volume of
-    a storage or distribution medium, does not as a whole count as a
-    Modified Version of the Document, provided no compilation
-    copyright is claimed for the compilation.  Such a compilation is
-    called an "aggregate", and this License does not apply to the
-    other self-contained works thus compiled with the Document, on
-    account of their being thus compiled, if they are not themselves
-    derivative works of the Document.</para>
-
-    <para>If the Cover Text requirement of section 3 is applicable to
-    these copies of the Document, then if the Document is less than
-    one quarter of the entire aggregate, the Document's Cover Texts
-    may be placed on covers that surround only the Document within the
-    aggregate.  Otherwise they must appear on covers around the whole
-    aggregate.</para>
-  </sect1>
-
-  <sect1 label="8" id="gfdl_8">
+    separate and independent documents or works, in or on a volume of a
+    storage or distribution medium, does not as a whole count as a Modified
+    Version of the Document, provided no compilation copyright is claimed for
+    the compilation. Such a compilation is called an "aggregate", and this
+    License does not apply to the other self-contained works thus compiled
+    with the Document, on account of their being thus compiled, if they are
+    not themselves derivative works of the Document.</para>
+
+    <para>If the Cover Text requirement of section 3 is applicable to these
+    copies of the Document, then if the Document is less than one quarter of
+    the entire aggregate, the Document's Cover Texts may be placed on covers
+    that surround only the Document within the aggregate. Otherwise they must
+    appear on covers around the whole aggregate.</para>
+  </section>
+
+  <section label="8" id="gfdl-8">
     <title>TRANSLATION</title>
 
     <para>Translation is considered a kind of modification, so you may
-    distribute translations of the Document under the terms of section
-    4.  Replacing Invariant Sections with translations requires
-    special permission from their copyright holders, but you may
-    include translations of some or all Invariant Sections in addition
-    to the original versions of these Invariant Sections.  You may
-    include a translation of this License provided that you also
-    include the original English version of this License.  In case of
-    a disagreement between the translation and the original English
-    version of this License, the original English version will
-    prevail.</para>
-  </sect1>
-
-  <sect1 label="9" id="gfdl_9">
+    distribute translations of the Document under the terms of section 4.
+    Replacing Invariant Sections with translations requires special
+    permission from their copyright holders, but you may include translations
+    of some or all Invariant Sections in addition to the original versions of
+    these Invariant Sections. You may include a translation of this License
+    provided that you also include the original English version of this
+    License. In case of a disagreement between the translation and the
+    original English version of this License, the original English version
+    will prevail.</para>
+  </section>
+
+  <section label="9" id="gfdl-9">
     <title>TERMINATION</title>
-    
-    <para>You may not copy, modify, sublicense, or distribute the
-    Document except as expressly provided for under this License.  Any
-    other attempt to copy, modify, sublicense or distribute the
-    Document is void, and will automatically terminate your rights
-    under this License.  However, parties who have received copies, or
-    rights, from you under this License will not have their licenses
-    terminated so long as such parties remain in full
+
+    <para>You may not copy, modify, sublicense, or distribute the Document
+    except as expressly provided for under this License. Any other attempt to
+    copy, modify, sublicense or distribute the Document is void, and will
+    automatically terminate your rights under this License. However, parties
+    who have received copies, or rights, from you under this License will not
+    have their licenses terminated so long as such parties remain in full
     compliance.</para>
-  </sect1>
+  </section>
 
-  <sect1 label="10" id="gfdl_10">
+  <section label="10" id="gfdl-10">
     <title>FUTURE REVISIONS OF THIS LICENSE</title>
 
-    <para>The Free Software Foundation may publish new, revised
-    versions of the GNU Free Documentation License from time to time.
-    Such new versions will be similar in spirit to the present
-    version, but may differ in detail to address new problems or
-    concerns.  See <ulink
-    url="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</ulink>.</para>
-
-    <para>Each version of the License is given a distinguishing
-    version number.  If the Document specifies that a particular
-    numbered version of this License "or any later version" applies to
-    it, you have the option of following the terms and conditions
-    either of that specified version or of any later version that has
-    been published (not as a draft) by the Free Software Foundation.
-    If the Document does not specify a version number of this License,
-    you may choose any version ever published (not as a draft) by the
-    Free Software Foundation.</para>
-  </sect1>
-
-  <sect1 label="" id="gfdl_howto">
+    <para>The Free Software Foundation may publish new, revised versions of
+    the GNU Free Documentation License from time to time. Such new versions
+    will be similar in spirit to the present version, but may differ in
+    detail to address new problems or concerns. See 
+    <ulink url="http://www.gnu.org/copyleft/">
+    http://www.gnu.org/copyleft/</ulink>
+
+    .</para>
+
+    <para>Each version of the License is given a distinguishing version
+    number. If the Document specifies that a particular numbered version of
+    this License "or any later version" applies to it, you have the option of
+    following the terms and conditions either of that specified version or of
+    any later version that has been published (not as a draft) by the Free
+    Software Foundation. If the Document does not specify a version number of
+    this License, you may choose any version ever published (not as a draft)
+    by the Free Software Foundation.</para>
+  </section>
+
+  <section label="" id="gfdl-howto">
     <title>How to use this License for your documents</title>
 
-    <para>To use this License in a document you have written, include
-    a copy of the License in the document and put the following
-    copyright and license notices just after the title page:</para>
-
-<blockquote><para>
-      Copyright (c)  YEAR  YOUR NAME.
-      Permission is granted to copy, distribute and/or modify this document
-      under the terms of the GNU Free Documentation License, Version 1.1
-      or any later version published by the Free Software Foundation;
-      with the Invariant Sections being LIST THEIR TITLES, with the
-      Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
-      A copy of the license is included in the section entitled "GNU
-      Free Documentation License".
-</para></blockquote>
-
-    <para>If you have no Invariant Sections, write "with no Invariant
-    Sections" instead of saying which ones are invariant.  If you have
-    no Front-Cover Texts, write "no Front-Cover Texts" instead of
-    "Front-Cover Texts being LIST"; likewise for Back-Cover
-    Texts.</para>
+    <para>To use this License in a document you have written, include a copy
+    of the License in the document and put the following copyright and
+    license notices just after the title page:</para>
 
-    <para>If your document contains nontrivial examples of program
-    code, we recommend releasing these examples in parallel under your
-    choice of free software license, such as the GNU General Public
-    License, to permit their use in free software.</para>
-  </sect1>
+    <blockquote>
+      <para>Copyright (c) YEAR YOUR NAME. Permission is granted to copy,
+      distribute and/or modify this document under the terms of the GNU Free
+      Documentation License, Version 1.1 or any later version published by
+      the Free Software Foundation; with the Invariant Sections being LIST
+      THEIR TITLES, with the Front-Cover Texts being LIST, and with the
+      Back-Cover Texts being LIST. A copy of the license is included in the
+      section entitled "GNU Free Documentation License".</para>
+    </blockquote>
 
-</appendix>
+    <para>If you have no Invariant Sections, write "with no Invariant
+    Sections" instead of saying which ones are invariant. If you have no
+    Front-Cover Texts, write "no Front-Cover Texts" instead of "Front-Cover
+    Texts being LIST"; likewise for Back-Cover Texts.</para>
 
+    <para>If your document contains nontrivial examples of program code, we
+    recommend releasing these examples in parallel under your choice of free
+    software license, such as the GNU General Public License, to permit their
+    use in free software.</para>
+  </section>
+</section>
 
 <!-- Keep this comment at the end of the file
 Local variables:
@@ -472,3 +445,4 @@ sgml-shorttag:t
 sgml-tag-region-if-active:t
 End:
 -->
+
diff --git a/docs/sgml/glossary.sgml b/docs/sgml/glossary.sgml
index faa4d1781..cc5d4fb69 100644
--- a/docs/sgml/glossary.sgml
+++ b/docs/sgml/glossary.sgml
@@ -1,304 +1,313 @@
 <!-- <!DOCTYPE glossary PUBLIC "-//OASIS//DTD DocBook V4.1//EN" > -->
+<glossary id="glossary">
+  <glossdiv>
+    <title>0-9, high ascii</title>
+
+    <glossentry>
+      <glossterm>.htaccess</glossterm>
+
+      <glossdef>
+        <para>Apache web server, and other NCSA-compliant web servers,
+        observe the convention of using files in directories called 
+        <filename>.htaccess</filename>
+
+        to restrict access to certain files. In Bugzilla, they are used
+        to keep secret files which would otherwise
+        compromise your installation - e.g. the 
+        <filename>localconfig</filename>
+        file contains the password to your database.
+        curious.</para>
+      </glossdef>
+    </glossentry>
+  </glossdiv>
+
+  <glossdiv id="gloss-a">
+    <title>A</title>
+
+    <glossentry>
+      <glossterm>Apache</glossterm>
+
+      <glossdef>
+        <para>In this context, Apache is the web server most commonly used
+        for serving up 
+        <glossterm>Bugzilla</glossterm>
+
+        pages. Contrary to popular belief, the apache web server has nothing
+        to do with the ancient and noble Native American tribe, but instead
+        derived its name from the fact that it was 
+        <quote>a patchy</quote>
+
+        version of the original 
+        <acronym>NCSA</acronym>
+
+        world-wide-web server.</para>
+      </glossdef>
+    </glossentry>
+  </glossdiv>
+
+  <glossdiv id="gloss-b">
+    <title>B</title>
+
+    <glossentry>
+      <glossterm>Bug</glossterm>
+
+      <glossdef>
+        <para>A 
+        <quote>bug</quote>
+
+        in Bugzilla refers to an issue entered into the database which has an
+        associated number, assignments, comments, etc. Some also refer to a 
+        <quote>tickets</quote>
+        or 
+        <quote>issues</quote>; 
+        in the context of Bugzilla, they are synonymous.</para>
+      </glossdef>
+    </glossentry>
+
+    <glossentry>
+      <glossterm>Bug Number</glossterm>
+
+      <glossdef>
+        <para>Each Bugzilla bug is assigned a number that uniquely identifies
+        that bug. The bug associated with a bug number can be pulled up via a
+        query, or easily from the very front page by typing the number in the
+        "Find" box.</para>
+      </glossdef>
+    </glossentry>
+
+    <glossentry>
+      <glossterm>Bugzilla</glossterm>
+
+      <glossdef>
+        <para>Bugzilla is the world-leading free software bug tracking system.
+        </para>
+      </glossdef>
+    </glossentry>
+  </glossdiv>
+
+  <glossdiv id="gloss-c">
+    <title>
+    </title>
+
+    <glossentry id="gloss-component">
+      <glossterm>Component</glossterm>
+
+      <glossdef>
+        <para>A Component is a subsection of a Product. It should be a narrow
+        category, tailored to your organization. All Products must contain at
+        least one Component (and, as a matter of fact, creating a Product
+        with no Components will create an error in Bugzilla).</para>
+      </glossdef>
+    </glossentry>
+
+    <glossentry id="gloss-cpan">
+      <glossterm>
+        <acronym>CPAN</acronym>
+      </glossterm>
+
+      <glossdef>
+        <para>
+        <acronym>CPAN</acronym>
+
+        stands for the 
+        <quote>Comprehensive Perl Archive Network</quote>. 
+        CPAN maintains a large number of extremely useful 
+        <glossterm>Perl</glossterm>
+        modules - encapsulated chunks of code for performing a
+        particular task.</para>
+      </glossdef>
+    </glossentry>
+  </glossdiv>
+
+  <glossdiv id="gloss-d">
+    <title>D</title>
+
+    <glossentry>
+      <glossterm>daemon</glossterm>
+
+      <glossdef>
+        <para>A daemon is a computer program which runs in the background. In
+        general, most daemons are started at boot time via System V init
+        scripts, or through RC scripts on BSD-based systems. 
+        <glossterm>mysqld</glossterm>, 
+        the MySQL server, and 
+        <glossterm>apache</glossterm>, 
+        a web server, are generally run as daemons.</para>
+      </glossdef>
+    </glossentry>
+  </glossdiv>
+
+  <glossdiv id="gloss-g">
+    <title>
+    </title>
+
+    <glossentry>
+      <glossterm>Groups</glossterm>
+
+      <glossdef>
+        <para>The word 
+        <quote>Groups</quote>
+
+        has a very special meaning to Bugzilla. Bugzilla's main security
+        mechanism comes by placing users in groups, and assigning those
+        groups certain privileges to view bugs in particular
+        <glossterm>Products</glossterm>
+        in the 
+        <glossterm>Bugzilla</glossterm>
+        database.</para>
+      </glossdef>
+    </glossentry>
+  </glossdiv>
+
+  <glossdiv id="gloss-m">
+    <title>M</title>
+
+    <glossentry>
+      <glossterm>mysqld</glossterm>
+
+      <glossdef>
+        <para>mysqld is the name of the 
+        <glossterm>daemon</glossterm>
+
+        for the MySQL database. In general, it is invoked automatically
+        through the use of the System V init scripts on GNU/Linux and
+        AT&amp;T System V-based systems, such as Solaris and HP/UX, or
+        through the RC scripts on BSD-based systems.</para>
+      </glossdef>
+    </glossentry>
+  </glossdiv>
+
+  <glossdiv id="gloss-p">
+    <title>P</title>
+
+    <glossentry>
+      <glossterm id="gloss-product">Product</glossterm>
+
+      <glossdef>
+        <para>A Product is a broad category of types of bugs, normally
+        representing a single piece of software or entity. In general,
+        there are several Components to a Product. A Product may define a
+        group (used for security) for all bugs entered into
+        its Components.</para>
+      </glossdef>
+    </glossentry>
+
+    <glossentry>
+      <glossterm>Perl</glossterm>
+
+      <glossdef>
+        <para>First written by Larry Wall, Perl is a remarkable program
+        language. It has the benefits of the flexibility of an interpreted
+        scripting language (such as shell script), combined with the speed
+        and power of a compiled language, such as C. 
+        <glossterm>Bugzilla</glossterm>
+
+        is maintained in Perl.</para>
+      </glossdef>
+    </glossentry>
+  </glossdiv>
+
+  <glossdiv id="gloss-q">
+    <title>Q</title>
+
+    <glossentry>
+      <glossterm>QA</glossterm>
+
+      <glossdef>
+        <para>
+        <quote>QA</quote>, 
+        <quote>Q/A</quote>, and 
+        <quote>Q.A.</quote>
+        are short for 
+        <quote>Quality Assurance</quote>. 
+        In most large software development organizations, there is a team
+        devoted to ensuring the product meets minimum standards before
+        shipping. This team will also generally want to track the progress of
+        bugs over their life cycle, thus the need for the 
+        <quote>QA Contact</quote>
+
+        field in a bug.</para>
+      </glossdef>
+    </glossentry>
+  </glossdiv>
+
+  <glossdiv id="gloss-s">
+    <title>S</title>
+
+    <glossentry>
+      <glossterm>
+        <acronym>SGML</acronym>
+      </glossterm>
+
+      <glossdef>
+        <para>
+        <acronym>SGML</acronym>
+
+        stands for 
+        <quote>Standard Generalized Markup Language</quote>. 
+        Created in the 1980's to provide an extensible means to maintain
+        documentation based upon content instead of presentation, 
+        <acronym>SGML</acronym>
+
+        has withstood the test of time as a robust, powerful language. 
+        <glossterm>
+          <acronym>XML</acronym>
+        </glossterm>
+
+        is the 
+        <quote>baby brother</quote>
+
+        of SGML; any valid 
+        <acronym>XML</acronym>
+
+        document it, by definition, a valid 
+        <acronym>SGML</acronym>
+
+        document. The document you are reading is written and maintained in 
+        <acronym>SGML</acronym>, 
+        and is also valid 
+        <acronym>XML</acronym>
+
+        if you modify the Document Type Definition.</para>
+      </glossdef>
+    </glossentry>
+  </glossdiv>
+
+  <glossdiv id="gloss-t">
+    <title>T</title>
+
+    <glossentry id="gloss-target-milestone" xreflabel="Target Milestone">
+      <glossterm>Target Milestone</glossterm>
+
+      <glossdef>
+        <para>Target Milestones are Product goals. They are configurable on a
+        per-Product basis. Most software development houses have a concept of
+        
+        <quote>milestones</quote>
+
+        where the people funding a project expect certain functionality on
+        certain dates. Bugzilla facilitates meeting these milestones by
+        giving you the ability to declare by which milestone a bug will be
+        fixed, or an enhancement will be implemented.</para>
+      </glossdef>
+    </glossentry>
+  </glossdiv>
+
+  <glossdiv id="gloss-z">
+    <title>Z</title>
+
+    <glossentry id="zarro-boogs-found" xreflabel="Zarro Boogs Found">
+      <glossterm>Zarro Boogs Found</glossterm>
+
+      <glossdef>
+        <para>This is the cryptic response sent by Bugzilla when a query
+        returned no results. It is just a goofy way of saying "Zero Bugs
+        Found".</para>
+      </glossdef>
+    </glossentry>
+  </glossdiv>
+</glossary>
 
-  <glossary id="glossary">
-    <glossdiv>
-      <title>0-9, high ascii</title>
-      <glossentry>
-	<glossterm>.htaccess</glossterm>
-	<glossdef>
-	  <para>
-	    Apache web server, and other NCSA-compliant web servers,
-	    observe the convention of using files in directories
-	    called <filename>.htaccess</filename> files.  These
-	    restrict parameters of the web server.  In Bugzilla, they
-	    are used to restrict access to certain files which would
-	    otherwise compromise your installation.  For instance, the
-	    <filename>localconfig</filename> file contains the
-	    password to your database.  If this information were
-	    generally available, and remote access to your database
-	    turned on, you risk corruption of your database by
-	    computer criminals or the curious.
-	  </para>
-	</glossdef>
-      </glossentry>
-    </glossdiv>
-    
-    <glossdiv id="gloss_a">
-      <title>A</title>
-      <glossentry>
-	<glossterm>Apache</glossterm>
-	<glossdef>
-	  <para>In this context, Apache is the web server most
-	    commonly used for serving up
-	    <glossterm>Bugzilla</glossterm> pages.  Contrary to
-	    popular belief, the apache web server has nothing to do
-	    with the ancient and noble Native American tribe, but
-	    instead derived its name from the fact that it was
-	    <quote>a patchy</quote> version of the original
-	    <acronym>NCSA</acronym> world-wide-web server.</para>
-	</glossdef>
-      </glossentry>
-    </glossdiv>
-    
-    <glossdiv id="gloss_b">
-      <title>B</title>
-      <glossentry>
-	<glossterm>Bug</glossterm>
-	<glossdef>
-	<para>
-	    A <quote>Bug</quote> in Bugzilla refers to an issue
-	    entered into the database which has an associated number,
-	    assignments, comments, etc. Some also refer to a
-	    <quote>tickets</quote> or <quote>issues</quote>; in the
-	    context of Bugzilla, they are synonymous.
-	  </para>
-	</glossdef>
-      </glossentry>
-      
-      <glossentry>
-	<glossterm>Bug Number</glossterm>
-	<glossdef>
-	  <para>
-	    Each Bugzilla Bug is assigned a number that uniquely
-	    identifies that Bug.  The Bug associated with a Bug Number
-	    can be pulled up via a query, or easily from the very
-	    front page by typing the number in the "Find" box.
-	  </para>
-	</glossdef>
-      </glossentry>
-      
-      <glossentry>
-	<glossterm>Bug Life Cycle</glossterm>
-	<glossdef>
-	  <para>A Bug has stages through which it must pass before
-	    becoming a <quote>closed bug</quote>, including
-	    acceptance, resolution, and verification.  The <quote>Bug
-	      Life Cycle</quote> is moderately flexible according to
-	    the needs of the organization using it, though.</para>
-	</glossdef>
-      </glossentry>
-
-      <glossentry>
-	<glossterm>Bugzilla</glossterm>
-	<glossdef>
-	  <para>
-	    Bugzilla is the industry-standard bug tracking system.  It
-	    is quite popular among Open Source enthusiasts.
-	  </para>
-	</glossdef>
-      </glossentry>
-    </glossdiv>
-
-    <glossdiv id="gloss_c">
-      <title></title>
-      <glossentry id="gloss_component">
-	<glossterm>Component</glossterm>
-	<glossdef>
-	  <para>
-	    A Component is a subsection of a Product.  It should be a
-	    narrow category, tailored to your organization.  All
-	    Products must contain at least one Component (and, as a
-	    matter of fact, creating a Product with no Components will
-	    create an error in Bugzilla).
-	  </para>
-	</glossdef>
-      </glossentry>
-      <glossentry id="gloss_cpan">
-	<glossterm><acronym>CPAN</acronym></glossterm>
-	<glossdef>
-	  <para><acronym>CPAN</acronym> stands for the
-	    <quote>Comprehensive Perl Archive Network</quote>.  CPAN
-	    maintains a large number of extremely useful
-	    <glossterm>Perl</glossterm> modules.  By themselves, Perl
-	    modules generally do nothing, but when used as part of a
-	    larger program, they provide much-needed algorithms and
-	    functionality.</para>
-	</glossdef>
-      </glossentry>
-    </glossdiv>
-    
-    <glossdiv id="gloss_d">
-      <title>D</title>
-      <glossentry>
-	<glossterm>daemon</glossterm>
-	<glossdef>
-	  <para>A daemon is a computer program which runs in the
-	    background.  In general, most daemons are started at boot
-	    time via System V init scripts, or through RC scripts on
-	    BSD-based systems.  <glossterm>mysqld</glossterm>, the
-	    MySQL server, and <glossterm>apache</glossterm>, a web
-	    server, are generally run as daemons.</para>
-	</glossdef>
-      </glossentry>
-    </glossdiv>
-
-    <glossdiv id="gloss_g">
-      <title></title>
-      <glossentry>
-	<glossterm>Groups</glossterm>
-	<glossdef>
-	  <para>The word <quote>Groups</quote> has a very special
-	    meaning to Bugzilla.  Bugzilla's main security mechanism
-	    comes by lumping users into groups, and assigning those
-	    groups certain privileges to
-	    <glossterm>Products</glossterm> and
-	    <glossterm>Components</glossterm> in the
-	    <glossterm>Bugzilla</glossterm> database.</para>
-	</glossdef>
-      </glossentry>
-    </glossdiv>
-
-    <glossdiv id="gloss_i">
-      <title>I</title>
-      <glossentry id="gloss_infiniteloop">
-	<glossterm>Infinite Loop</glossterm>
-	<glossdef>
-	  <para>A loop of information that never ends; see recursion.</para>
-	</glossdef>
-      </glossentry>
-    </glossdiv>
-
-    <glossdiv id="gloss_m">
-      <title>M</title>
-      <glossentry>
-	<glossterm>mysqld</glossterm>
-	<glossdef>
-	  <para>mysqld is the name of the
-	    <glossterm>daemon</glossterm> for the MySQL database.  In
-	    general, it is invoked automatically through the use of
-	    the System V init scripts on GNU/Linux and AT&amp;T System
-	    V-based systems, such as Solaris and HP/UX, or through the
-	    RC scripts on BSD-based systems.</para>
-	</glossdef>
-      </glossentry>
-    </glossdiv>
-
-    <glossdiv id="gloss_p">
-      <title>P</title>
-      <glossentry>
-	<glossterm id="gloss_product">Product</glossterm>
-	<glossdef>
-	  <para>A Product is a broad category of types of bugs.  In
-	    general, there are several Components to a Product.  A
-	    Product also defines a default Group (used for Bug
-	    Security) for all bugs entered into components beneath
-	    it.</para>
-	  <example>
-	    <title>A Sample Product</title>
-	    <para>A company sells a software product called
-	      <quote>X</quote>.  They also maintain some older
-	      software called <quote>Y</quote>, and have a secret
-	      project <quote>Z</quote>.  An effective use of Products
-	      might be to create Products <quote>X</quote>,
-	      <quote>Y</quote>, <quote>Z</quote>, each with Components
-	      of User Interface, Database, and Business Logic.  They
-	      might also change group permissions so that only those
-	      people who are members of Group <quote>Z</quote> can see
-	      components and bugs under Product
-	      <quote>Z</quote>.</para>
-	  </example>
-	</glossdef>
-      </glossentry>
-      <glossentry>
-	<glossterm>Perl</glossterm>
-	<glossdef>
-	  <para>First written by Larry Wall, Perl is a remarkable
-	    program language.  It has the benefits of the flexibility
-	    of an interpreted scripting language (such as shell
-	    script), combined with the speed and power of a compiled
-	    language, such as C.  <glossterm>Bugzilla</glossterm> is
-	    maintained in Perl.</para>
-	</glossdef>
-      </glossentry>
-    </glossdiv>
-    
-    <glossdiv id="gloss_q">
-      <title>Q</title>
-      <glossentry>
-	<glossterm>QA</glossterm>
-	<glossdef>
-	  <para><quote>QA</quote>, <quote>Q/A</quote>, and
-	    <quote>Q.A.</quote> are short for <quote>Quality
-	      Assurance</quote>.  In most large software development
-	    organizations, there is a team devoted to ensuring the
-	    product meets minimum standards before shipping.  This
-	    team will also generally want to track the progress of
-	    bugs over their life cycle, thus the need for the
-	    <quote>QA Contact</quote> field in a Bug.</para>
-	</glossdef>
-      </glossentry>
-    </glossdiv>
-    
-    <glossdiv id="gloss_r">
-      <title>R</title>
-      <glossentry id="gloss_recursion" xreflabel="Recursion">
-	<glossterm>Recursion</glossterm>
-	<glossdef>
-	  <para>The property of a function looking back at itself for
-	    something.  <quote>GNU</quote>, for instance, stands for
-	    <quote>GNU's Not UNIX</quote>, thus recursing upon itself
-	    for definition.  For further clarity, see Infinite
-	    Loop.</para>
-	</glossdef>
-      </glossentry>
-    </glossdiv>
-
-    <glossdiv id="gloss_s">
-      <title>S</title>
-      <glossentry>
-	<glossterm><acronym>SGML</acronym></glossterm>
-	<glossdef>
-	  <para><acronym>SGML</acronym> stands for <quote>Standard
-	      Generalized Markup Language</quote>.  Created in the
-	    1980's to provide an extensible means to maintain
-	    documentation based upon content instead of presentation,
-	    <acronym>SGML</acronym> has withstood the test of time as
-	    a robust, powerful language.
-	    <glossterm><acronym>XML</acronym></glossterm> is the
-	    <quote>baby brother</quote> of SGML; any valid
-	    <acronym>XML</acronym> document it, by definition, a valid
-	    <acronym>SGML</acronym> document.  The document you are
-	    reading is written and maintained in
-	    <acronym>SGML</acronym>, and is also valid
-	    <acronym>XML</acronym> if you modify the Document Type
-	    Definition.</para>
-	</glossdef>
-      </glossentry>
-    </glossdiv>
-
-    <glossdiv id="gloss_t">
-      <title>T</title>
-      <glossentry id="gloss_target_milestone" xreflabel="Target Milestone">
-	<glossterm>Target Milestone</glossterm>
-	<glossdef>
-	  <para>
-	    Target Milestones are Product goals.  They are
-	    configurable on a per-Product basis.  Most software
-	    development houses have a concept of
-	    <quote>milestones</quote> where the people funding a
-	    project expect certain functionality on certain dates.
-	    Bugzilla facilitates meeting these milestones by giving
-	    you the ability to declare by which milestone a bug will be
-	    fixed, or an enhancement will be implemented.
-	  </para>
-	</glossdef>
-      </glossentry>
-    </glossdiv>
-    
-    <glossdiv id="gloss_z">
-      <title>Z</title>
-      <glossentry id="zarro-boogs-found" xreflabel="Zarro Boogs Found">
-	<glossterm>Zarro Boogs Found</glossterm>
-	<glossdef>
-	  <para>This is the cryptic response sent by Bugzilla when a
-	    query returned no results.  It is just a goofy way of
-	    saying "Zero Bugs Found".</para>
-	</glossdef>
-      </glossentry>
-    </glossdiv>
-    
-  </glossary>
-  
 <!-- Keep this comment at the end of the file
 Local variables:
 mode: sgml
@@ -319,3 +328,4 @@ sgml-shorttag:t
 sgml-tag-region-if-active:t
 End:
 -->
+
diff --git a/docs/sgml/index.sgml b/docs/sgml/index.sgml
index 7ca578cfc..3b3516e14 100644
--- a/docs/sgml/index.sgml
+++ b/docs/sgml/index.sgml
@@ -18,3 +18,4 @@ sgml-shorttag:t
 sgml-tag-region-if-active:t
 End:
 -->
+
diff --git a/docs/sgml/installation.sgml b/docs/sgml/installation.sgml
index 79b402c5c..0433b4b52 100644
--- a/docs/sgml/installation.sgml
+++ b/docs/sgml/installation.sgml
@@ -1,1648 +1,1766 @@
-<!-- <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> -->
+<!-- <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"> -->
+<chapter id="installation" xreflabel="Bugzilla Installation">
+  <title>Installation</title>
 
-  <chapter id="installation" xreflabel="Bugzilla Installation">
-    <title>Installation</title>
-    <para>
-      These installation instructions are presented assuming you are
-      installing on a UNIX or completely POSIX-compliant system.  If
-      you are installing on Microsoft Windows or another oddball
-      operating system, please consult the appropriate sections in
-      this installation guide for notes on how to be successful.
-    </para>
-    <section id="errata">
-      <title>ERRATA</title>
-    <para>Here are some miscellaneous notes about possible issues you
-      main run into when you begin your Bugzilla installation.
-      Reference platforms for Bugzilla installation are Redhat Linux
-      7.2, Linux-Mandrake 8.0, and Solaris 8.</para>
-  
-    <simplelist>
-      <member>
-	If you are installing Bugzilla on S.u.S.e. Linux, or some
-	other distributions with <quote>paranoid</quote> security
-	options, it is possible that the checksetup.pl script may fail
-	with the error: <errorname>cannot chdir(/var/spool/mqueue):
-	  Permission denied</errorname> This is because your
-	<filename>/var/spool/mqueue</filename> directory has a mode of
-	<quote>drwx------</quote>.  Type <command>chmod 755
-	  <filename>/var/spool/mqueue</filename></command> as root to
-	fix this problem.
-      </member>
-      
-      <member>
-	Bugzilla may be installed on Macintosh OS X (10), which is a
-	unix-based (BSD)  operating system. Everything required for
-	Bugzilla on OS X will install cleanly, but the optional GD
-	perl module which is used for bug charting requires some
-	additional setup for installation. Please see the  Mac OS X
-	installation section below for details
-      </member>
-      
-      <member>
-	Release Notes for Bugzilla &bz-ver; are available at
-	<filename>docs/rel_notes.txt</filename> in your Bugzilla
-	source distribution.
-      </member>
-      
-      <member>
-	  The preferred documentation for Bugzilla is available in
-	docs/, with a variety of document types available.  Please
-	refer to these documents when  installing, configuring, and
-	maintaining your Bugzilla installation.
-      </member>
-
-    </simplelist>
-    
-    <warning>
-      <para>
-	Bugzilla is not a package where you can just plop it in a directory,
-	twiddle a few things, and you're off.  Installing Bugzilla assumes you
-	know your variant of UNIX or Microsoft Windows well, are familiar with the
-	command line, and are comfortable compiling and installing a plethora
-	of third-party utilities.  To install Bugzilla on Win32 requires
-	fair Perl proficiency, and if you use a webserver other than Apache you
-	should be intimately familiar with the security mechanisms and CGI
-	environment thereof.
-      </para>
-    </warning>
-    
-    <warning>
-      <para>
-	Bugzilla has not undergone a complete security review. Security holes
-	may exist in the code.  Great care should be taken both in the installation
-	and usage of this software.  Carefully consider the implications of
-	installing other network services with Bugzilla.
-      </para>
-    </warning>
-  </section>
-  
   <section id="stepbystep" xreflabel="Bugzilla Installation Step-by-step">
     <title>Step-by-step Install</title>
+
     <section>
       <title>Introduction</title>
-      <para>
-	Installation of bugzilla is pretty straightforward, particularly if your
-	machine already has MySQL and the MySQL-related perl packages installed.
-	If those aren't installed yet, then that's the first order of business.  The
-	other necessary ingredient is a web server set up to run cgi scripts.
-	While using Apache for your webserver is not required, it is recommended.
-      </para>
-      
-      <para>
-	Bugzilla has been successfully installed under Solaris, Linux,
-	and Win32. The peculiarities of installing on Win32 (Microsoft
-	Windows) are not included in this section of the Guide; please
-	check out the <xref linkend="win32"> for further advice
-	on getting Bugzilla to work on Microsoft Windows.
-      </para>
-      
-      <para>
-	The Bugzilla Guide is contained in the "docs/" folder in your
-	Bugzilla distribution.  It is available in plain text
-	(docs/txt), HTML (docs/html), or SGML source (docs/sgml).
-      </para>
+
+      <para>Bugzilla has been successfully installed under Solaris, Linux,
+      and Win32. Win32 is not yet officially supported, but many people
+      have got it working fine.
+      Please see the 
+      <xref linkend="win32" />
+      for further advice on getting Bugzilla to work on Microsoft
+      Windows.</para>
+
     </section>
+
     <section>
-      <title>Installing the Prerequisites</title>
+      <title>Package List</title>
+
       <note>
-	<para>If you want to skip these manual installation steps for
-	  the CPAN dependencies listed below, and are running the very
-	  most recent version of Perl and MySQL (both the executables
-	  and development libraries) on your system, check out
-	  Bundle::Bugzilla in <xref linkend="bundlebugzilla"></para>
+        <para> If you are running the very most recent
+        version of Perl and MySQL (both the executables and development
+        libraries) on your system, you can skip these manual installation 
+        steps for the Perl modules by using Bundle::Bugzilla; see
+        <xref linkend="bundlebugzilla" />.
+        </para>
       </note>
+
+      <para>The software packages necessary for the proper running of
+      Bugzilla (with download links) are: 
+      <orderedlist>
+      
+      
+<listitem>
+  <para>
+    <ulink url="http://www.mysql.com/">MySQL database server</ulink>
+    (3.22.5 or greater)
+  </para>
+</listitem>
+
+<listitem>
+  <para>
+    <ulink url="http://www.perl.org">Perl</ulink>
+    (5.005 or greater, 5.6.1 is recommended if you wish to
+    use Bundle::Bugzilla)
+  </para>
+</listitem>
+
+<listitem>
+  <para>Perl Modules (minimum version):
+  <orderedlist>
+    <listitem>
       <para>
-	The software packages necessary for the proper running of bugzilla are:
-	<orderedlist>
-	  <listitem>
-	    <para>
-	      MySQL database server and the mysql client (3.22.5 or greater)
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Perl (5.004 or greater, 5.6.1 is recommended if you wish
-	      to use Bundle::Bugzilla)
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      DBI Perl module
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Data::Dumper Perl module
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Bundle::Mysql Perl module collection
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      TimeDate Perl module collection
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      GD perl module (1.8.3) (optional, for bug charting)
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Chart::Base Perl module (0.99c) (optional, for bug charting)
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      DB_File Perl module (optional, for bug charting)
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      The web server of your choice.  Apache is recommended.
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      MIME::Parser Perl module (optional, for contrib/bug_email.pl interface)
-	    </para>
-	  </listitem>
-	</orderedlist>
-
-	<warning>
-	  <para>
-	    It is a good idea, while installing Bugzilla, to ensure it
-	    is not <emphasis>accessible</emphasis> by other machines
-	    on the Internet. Your machine may be vulnerable to attacks
-	    while you are installing. In other words, ensure there is
-	    some kind of firewall between you and the rest of the
-	    Internet.  Many installation steps require an active
-	    Internet connection to complete, but you must take care to
-	    ensure that at no point is your machine vulnerable to an
-	    attack.
-	  </para>
-	</warning>
-	<note>
-	  <para>Linux-Mandrake 8.0, the author's test system, includes
-	    every required and optional library for Bugzilla.  The
-	    easiest way to install them is by using the
-	    <filename>urpmi</filename> utility.  If you follow these
-	    commands, you should have everything you need for
-	    Bugzilla, and <filename>checksetup.pl</filename> should
-	    not complain about any missing libraries.  You may already
-	    have some of these installed.</para>
-	  <simplelist>
-	    <member><prompt>bash#</prompt><command> urpmi
-		perl-mysql</command></member>
-	    <member><prompt>bash#</prompt><command> urpmi
-		perl-chart</command></member>
-	    <member><prompt>bash#</prompt><command> urpmi
-		perl-gd</command></member>
-	    <member><prompt>bash#</prompt><command> urpmi
-		perl-MailTools</command> (for Bugzilla email
-	      integration)</member>
-	    <member><prompt>bash#</prompt><command> urpmi
-		apache-modules</command></member>
-	  </simplelist>
-	</note>
-	
+        <ulink url="http://www.template-toolkit.org">Template</ulink>
+        (v2.07)
       </para>
-    </section>
-    <section id="install-mysql">
-      <title>Installing MySQL Database</title>
+    </listitem>
+
+    <listitem>
       <para>
-	Visit MySQL homepage at <ulink
-				       url="http://www.mysql.com">www.mysql.com</ulink> and grab the latest stable release of the server.  Many of the binary versions of MySQL store their data files in <filename>/var</filename> which is often part of a smaller root partition. If you decide to build from sources you can easily set the dataDir as an option to <filename>configure</filename>.
+        <ulink url="http://www.cpan.org/modules/by-module/AppConfig/">AppConfig 
+        </ulink>
+        (v1.52)
       </para>
-      <para>
-	If you install from source or non-package (RPM, deb, etc.)
-	binaries you need to add
-	<firstterm>mysqld</firstterm> to your
-	init scripts so the server daemon will come back up whenever
-	your machine reboots. Further discussion of UNIX init
-	sequences are beyond the scope of this guide.
-	<note>
-	  <para>You should have your init script start
-	    <glossterm>mysqld</glossterm> with the ability to accept
-	    large packets. By default, <filename>mysqld</filename>
-	    only accepts packets up to 64K long. This limits the size
-	    of attachments you may put on bugs. If you add <option>-O
-	    max_allowed_packet=1M</option> to the command that starts
-	    <filename>mysqld</filename> (or
-	    <filename>safe_mysqld</filename>), then you will be able
-	    to have attachments up to about 1 megabyte.</para>
-	</note>
+    </listitem>
 
-      </para>
-      <note>
-	<para>
-	  If you plan on running Bugzilla and MySQL on the same
-	  machine, consider using the <option>--skip-networking</option>
-	  option in the init script. This enhances security by
-	  preventing network access to MySQL.
-	</para>
-      </note>
-    </section>
-    
-    <section id="install-perl">
-      <title>Perl (5.004 or greater)</title>
+    <listitem>
       <para>
-	Any machine that doesn't have perl on it is a sad machine
-	indeed.  Perl for *nix systems can be gotten in source form
-	from http://www.perl.com.  Although Bugzilla runs with most
-	post-5.004 versions of Perl, it's a good idea to be up to the
-	very latest version if you can when running Bugzilla.  As of
-	this writing, that is perl version &perl-ver;.
+        <ulink url="http://www.cpan.org/authors/id/MUIR/modules/Text-Tabs%2BWrap-2001.0131.tar.gz">Text::Wrap</ulink> 
+        (v2001.0131)
       </para>
+    </listitem>
+
+    <listitem>
       <para>
-	Perl is now a far cry from the the single compiler/interpreter
-	binary it once was.  It includes a great many required modules
-	and quite a few other support files.  If you're not up to or
-	not inclined to build perl from source, you'll want to install
-	it on your machine using some sort of packaging system (be it
-	RPM, deb, or what have you) to ensure a sane install. In the
-	subsequent sections you'll be installing quite a few perl
-	modules; this can be quite ornery if your perl installation
-	isn't up to snuff.
+        <ulink url="http://search.cpan.org/search?dist=File-Spec">File::Spec 
+        </ulink>
+        (v0.8.2)
       </para>
-      <warning>
-	<para>Many people complain that Perl modules will not install
-	  for them.  Most times, the error messages complain that they
-	  are missing a file in <quote>@INC</quote>.  Virtually every
-	  time, this is due to permissions being set too restrictively
-	  for you to compile Perl modules or not having the necessary
-	  Perl development libraries installed on your system..
-	  Consult your local UNIX systems administrator for help
-	  solving these permissions issues; if you
-	  <emphasis>are</emphasis> the local UNIX sysadmin, please
-	  consult the newsgroup/mailing list for further assistance or
-	  hire someone to help you out.
-	</para>
-      </warning>
-      <tip id="bundlebugzilla" xreflabel="Using Bundle::Bugzilla instead of manually installing Perl modules">
-	<para>
-	  You can skip the following Perl module installation steps by
-	  installing <productname>Bundle::Bugzilla</productname> from
-	  <glossterm linkend="gloss_cpan">CPAN</glossterm>, which
-	  includes them. All Perl module installation steps require
-	  you have an active Internet connection.  If you wish to use
-	  Bundle::Bugzilla, however, you must be using the latest
-	  version of Perl (at this writing, version &perl-ver;)
-	</para>
-	<para>
-	  <computeroutput> <prompt>bash#</prompt> <command>perl -MCPAN
-	      -e 'install "Bundle::Bugzilla"'</command>
-	  </computeroutput>
-	</para>
-	<para>
-	  Bundle::Bugzilla doesn't include GD, Chart::Base, or
-	  MIME::Parser, which are not essential to a basic Bugzilla
-	  install.  If installing this bundle fails, you should
-	  install each module individually to isolate the problem.
-	</para>
-      </tip>
-    </section>
-    
-    <section>
-      <title>DBI Perl Module</title>
+    </listitem>
+
+    <listitem>
       <para>
-	The DBI module is a generic Perl module used by other database related
-	Perl modules.  For our purposes it's required by the MySQL-related
-	modules.  As long as your Perl installation was done correctly the
-	DBI module should be a breeze.  It's a mixed Perl/C module, but Perl's
-	MakeMaker system simplifies the C compilation greatly.
+        <ulink url="http://www.cpan.org/modules/by-module/Data/">Data::Dumper 
+        </ulink> 
+        (any)
       </para>
+    </listitem>
+
+    <listitem>
       <para>
-	Like almost all Perl modules DBI can be found on the Comprehensive Perl
-	Archive Network (CPAN) at http://www.cpan.org.  The CPAN servers have a
-	real tendency to bog down, so please use mirrors.  The current location
-	at the time of this writing can be found in <xref linkend="downloadlinks">.
+        <ulink url="http://www.cpan.org/modules/by-module/Mysql/">DBD::mysql
+        </ulink> 
+        (v1.2209)
       </para>
+    </listitem>
+
+    <listitem>
       <para>
-	Quality, general Perl module installation instructions can be found on
-	the CPAN website, but the easy thing to do is to just use the CPAN shell
-	which does all the hard work for you.
+        <ulink url="http://www.cpan.org/modules/by-module/DBI/">DBI</ulink> 
+        (v1.13)
       </para>
+    </listitem>
+
+    <listitem>
       <para>
-	To use the CPAN shell to install DBI:
-	<informalexample>
-	  <para>
-	    <computeroutput>
-	      <prompt>bash#</prompt>
-	      <command>perl -MCPAN -e 'install "DBI"'</command>
-	    </computeroutput>
-	    <note>
-	      <para>Replace "DBI" with the name of whichever module you wish
-		to install, such as Data::Dumper, TimeDate, GD, etc.</para>
-	    </note>
-	  </para>
-	</informalexample>
-	To do it the hard way:
-	<informalexample>
-	  <para>
-	    Untar the module tarball -- it should create its own directory
-	  </para>
-	  <para>
-	    CD to the directory just created, and enter the following commands:
-	    <orderedlist>
-	      <listitem>
-		<para>
-		  <computeroutput>
-		    <prompt>bash#</prompt>
-		    <command>perl Makefile.PL</command>
-		  </computeroutput>
-		</para>
-	      </listitem>
-	      <listitem>
-		<para>
-		  <computeroutput>
-		    <prompt>bash#</prompt>
-		    <command>make</command>
-		  </computeroutput>
-		</para>
-	      </listitem>
-	      <listitem>
-		<para>
-		  <computeroutput>
-		    <prompt>bash#</prompt>
-		    <command>make test</command>
-		  </computeroutput>
-		</para>
-	      </listitem>
-	      <listitem>
-		<para>
-		  <computeroutput>
-		    <prompt>bash#</prompt>
-		    <command>make install</command>
-		  </computeroutput>
-		</para>
-	      </listitem>
-	    </orderedlist>
-	    If everything went ok that should be all it takes.  For the vast
-	    majority of perl modules this is all that's required.
-	  </para>
-	</informalexample>
+        <ulink url="http://www.cpan.org/modules/by-module/Date/">Date::Parse
+        </ulink> 
+        (any)
       </para>
-    </section>
-    <section>
-      <title>Data::Dumper Perl Module</title>
+    </listitem>
+
+    <listitem>
       <para>
-	The Data::Dumper module provides data structure persistence for Perl
-	(similar to Java's serialization).  It comes with later sub-releases of
-	Perl 5.004, but a re-installation just to be sure it's available won't
-	hurt anything.
+        CGI::Carp 
+        (any)
       </para>
+    </listitem>
+
+  </orderedlist>
+  and, optionally:
+  <orderedlist>  
+    <listitem>
       <para>
-	Data::Dumper is used by the MySQL-related Perl modules.  It
-	can be found on CPAN (see <xref linkend="downloadlinks">) and
-	can be
-	installed by following the same four step make sequence used
-	for the DBI module.
+        <ulink url="http://www.cpan.org/modules/by-module/GD/">GD</ulink>
+        (v1.19) for bug charting
       </para>
-    </section>
-    
-    <section>
-      <title>MySQL related Perl Module Collection</title>
+    </listitem>
+
+    <listitem>
       <para>
-	The Perl/MySQL interface requires a few mutually-dependent perl
-	modules.  These modules are grouped together into the the
-	Msql-Mysql-modules package.  This package can be found at CPAN.
-	After the archive file has been downloaded it should
-	be untarred.
+        <ulink url="http://www.cpan.org/modules/by-module/Chart/">Chart::Base 
+        </ulink>
+        (v0.99c) for bug charting
       </para>
+    </listitem>
+
+    <listitem>
       <para>
-	The MySQL modules are all built using one make file which is generated
-	by running:
-	<prompt>bash#</prompt>
-	<command>perl Makefile.pl</command>
+        XML::Parser 
+        (any) for the XML interface
       </para>
+    </listitem>
+
+    <listitem>
       <para>
-	The MakeMaker process will ask you a few questions about the desired
-	compilation target and your MySQL installation.  For many of the questions
-	the provided default will be adequate.
+        MIME::Parser 
+        (any) for the email interface
       </para>
-      <para>
-	When asked if your desired target is the MySQL or mSQL packages,
-	select the MySQL related ones.  Later you will be asked if you wish
-	to provide backwards compatibility with the older MySQL packages; you
-	  should answer YES to this question. The default is NO.
-	</para>
-	<para>
-	  A host of 'localhost' should be fine and a testing user of 'test' and
-	  a null password should find itself with sufficient access to run tests
-	  on the 'test' database which MySQL created upon installation.  If 'make
-	  test' and 'make install' go through without errors you should be ready
-	  to go as far as database connectivity is concerned.
-	</para>
-      </section>
-
-      <section>
-	<title>TimeDate Perl Module Collection</title>
-	<para>
-	  Many of the more common date/time/calendar related Perl
-	modules have been grouped into a bundle similar to the MySQL
-	modules bundle. This bundle is stored on the CPAN under the
-	name TimeDate (see link: <xref linkend="downloadlinks">). The
-	component module we're most interested in is the Date::Format
-	module, but installing all of them is probably a good idea
-	anyway.  The standard Perl module installation instructions
-	should work perfectly for this simple package.
-	</para>
-      </section>
-      <section>
-	<title>GD Perl Module (1.8.3)</title>
-	<para>
-	  The GD library was written by Thomas Boutell a long while
-	ago to programatically generate images in C.  Since then it's
-	become the defacto standard for programatic image
-	construction.  The Perl bindings to it found in the GD library
-	are used on millions of web pages to generate graphs on the
-	fly. That's what bugzilla will be using it for so you must
-	install it if you want any of the graphing to work.
-	</para>
-	<para>
-	  Actually bugzilla uses the Graph module which relies on GD
-	itself.  Isn't that always the way with object-oriented
-	programming?  At any rate, you can find the GD library on CPAN
-	in <xref linkend="downloadlinks">.  
-	</para>
-	<note>
-	  <para>
-	    The Perl GD library requires some other libraries that may
-	  or may not be installed on your system, including
-	  <classname>libpng</classname> and
-	  <classname>libgd</classname>.  The full requirements are
-	  listed in the Perl GD library README.  Just realize that if
-	  compiling GD fails, it's probably because you're missing a
-	  required library.
-	  </para>
-	</note>
-      </section>
-
-      <section>
-	<title>Chart::Base Perl Module (0.99c)</title>
-	<para>
-	  The Chart module provides bugzilla with on-the-fly charting
-	abilities.  It can be installed in the usual fashion after it
-	has been fetched from CPAN where it is found as the
-	Chart-x.x... tarball, linked in <xref linkend="downloadlinks">. Note that
-	as with the GD perl module, only the version listed above, or
-	newer, will work. Earlier versions used GIF's, which are no
-	longer supported by the latest versions of GD.
-	</para>
-      </section>
-
-      <section>
-	<title>DB_File Perl Module</title>
-	<para>
-	  DB_File is a module which allows Perl programs to make use
-	of the facilities provided by  Berkeley DB version 1.x. This
-	module is required by collectstats.pl which is used for  bug
-	charting. If you plan to make use of bug charting, you must
-	install this module.
-	</para>
-      </section>
-
-      <section>
-	<title>HTTP Server</title>
-	<para>
-	  You have a freedom of choice here - Apache, Netscape or any
-	other server on UNIX would do.  You can easily run the web
-	server on a different machine than MySQL, but need to adjust
-	the MySQL <quote>bugs</quote> user permissions accordingly.
-	<note>
-	  <para>I strongly recommend Apache as the web server to use.
-	    The Bugzilla Guide installation instructions, in general,
-	    assume you are using Apache.  As more users use different
-	    webservers and send me information on the peculiarities of
-	    installing using their favorite webserver, I will provide
-	    notes for them.</para>
-	</note>
-	</para>
-	<para>
-	  You'll want to make sure that your web server will run any
-	file with the .cgi extension as a cgi and not just display it.
-	If you're using apache that means uncommenting the following
-	line in the srm.conf file:
-	<programlisting>
-AddHandler cgi-script .cgi
-	</programlisting>
-	</para>
-	<para>
-	  With apache you'll also want to make sure that within the
-	access.conf file the line:
- <programlisting>
-Options ExecCGI
-</programlisting>
-	is in the stanza that covers the directories into which
-	you intend to put the bugzilla .html and .cgi files.
-	</para>
+    </listitem>
+  </orderedlist>          
+  </para>
+</listitem>
+
+
+<listitem>
+  <para>
+    The web server of your choice. 
+    <ulink url="http://www.apache.org/">Apache</ulink> 
+    is highly recommended.
+  </para>
+</listitem>
+
+
+      </orderedlist>
+
+      <warning>
+        <para>It is a good idea, while installing Bugzilla, to ensure that there
+        is some kind of firewall between you and the rest of the Internet,
+        because your machine may be insecure for periods during the install.
+        Many
+        installation steps require an active Internet connection to complete,
+        but you must take care to ensure that at no point is your machine
+        vulnerable to an attack.</para>
+      </warning>
+
       <note>
-	<para>
-	  Users of newer versions of Apache will generally find both
-	  of the above lines will be in the httpd.conf file, rather
-	  than srm.conf or access.conf.
-	</para>
+        <para>Linux-Mandrake 8.0 includes every
+        required and optional library for Bugzilla. The easiest way to
+        install them is by using the 
+        <filename>urpmi</filename>
+
+        utility. If you follow these commands, you should have everything you
+        need for Bugzilla, and 
+        <filename>checksetup.pl</filename>
+
+        should not complain about any missing libraries. You may already have
+        some of these installed.</para>
+
+        <simplelist>
+          <member>
+            <prompt>bash#</prompt>
+
+            <command>urpmi perl-mysql</command>
+          </member>
+
+          <member>
+            <prompt>bash#</prompt>
+
+            <command>urpmi perl-chart</command>
+          </member>
+
+          <member>
+            <prompt>bash#</prompt>
+
+            <command>urpmi perl-gd</command>
+          </member>
+
+          <member>
+          <prompt>bash#</prompt>
+
+          <command>urpmi perl-MailTools</command>
+
+          (for Bugzilla email integration)</member>
+
+          <member>
+            <prompt>bash#</prompt>
+
+            <command>urpmi apache-modules</command>
+          </member>
+        </simplelist>
       </note>
-	<warning>
-	  <para>
-	    There are important files and directories that should not
-	  be a served by the HTTP server. These are most files in the
-	  <quote>data</quote> and <quote>shadow</quote>  directories
-	  and the <quote>localconfig</quote> file. You should
-	  configure your HTTP server to not serve content from these
-	  files. Failure to do so will expose critical passwords and
-	  other data. Please see <xref linkend="htaccess"> for details
-	  on how to do this for Apache.  I appreciate notes on how to
-	  get this same functionality using other webservers.
-	  </para>
-	</warning>
-      </section>
-
-      <section>
-	<title>Installing the Bugzilla Files</title>
-	<para>
-	  You should untar the Bugzilla files into a directory that
-	you're willing to make writable by the default web server user
-	(probably <quote>nobody</quote>).  You may decide to put the
-	files off of the main web space for your web server or perhaps
-	off of <filename>/usr/local</filename> with a symbolic link in
-	the web space that points to the Bugzilla directory.  At any
-	rate, just dump all the files in the same place, and make sure
-	you can access the files in that directory through your web
-	server.
-	</para>
-	<tip>
-	  <para>
-	    If you symlink the bugzilla directory into your Apache's
-	  HTML heirarchy, you may receive
-	  <errorname>Forbidden</errorname> errors unless you add the
-	  <quote>FollowSymLinks</quote> directive to the
-	  &lt;Directory&gt; entry for the HTML root.
-	  </para>
-	</tip>
-	<para>
-	  Once all the files are in a web accessible directory, make
-	that directory writable by your webserver's user.  This is a
-	temporary step until you run the post-install
-	<filename>checksetup.pl</filename> script, which locks down your
-	installation.
       </para>
-      <para>
-	Lastly, you'll need to set up a symbolic link to
-	<filename>/usr/bonsaitools/bin/perl</filename> for the correct
-	location of your perl executable (probably
-	<filename>/usr/bin/perl</filename>). Otherwise you must hack
-	all the .cgi files to change where they look for perl, or use
-	<xref linkend="setperl">, found in
-	<xref linkend="patches">.  I suggest using the symlink
-	approach for future release compatability.
-	<example>
-	  <title>Setting up bonsaitools symlink</title>
-	  <para>
-	      Here's how you set up the Perl symlink on Linux to make
-	    Bugzilla work. Your mileage may vary.  For some UNIX
-	    operating systems, you probably need to subsitute
-	    <quote>/usr/local/bin/perl</quote> for
-	    <quote>/usr/bin/perl</quote>  below; if on certain other
-	    UNIX systems, Perl may live in weird places like
-	    <quote>/opt/perl</quote>.  As root, run these commands:
-	    <programlisting>
-bash# mkdir /usr/bonsaitools  
-bash# mkdir /usr/bonsaitools/bin 
-bash# ln -s /usr/bin/perl /usr/bosaitools/bin/perl
-	    </programlisting>
-	  </para>
-	  <para>
-	    Alternately, you can simply run this perl one-liner to
-	    change your path to perl in all the files in your Bugzilla
-	    installation:
-	    <programlisting>
-perl -pi -e 's@#!/usr/bonsaitools/bin/perl@#!/usr/bin/perl@' *cgi *pl Bug.pm
-	    </programlisting>
-	    Change the second path to perl to match your installation.
-	  </para>
-	</example>
-	<tip>
-	  <para>
-	    If you don't have root access to set this symlink up,
-	    check out the
-	    <xref linkend="setperl">, listed in <xref
-						      linkend="patches">. It will change the path to perl in all your Bugzilla files for you.
-	  </para>
-	  </tip>
-	</para>
-      </section>
-
-      <section>
-	<title>Setting Up the MySQL Database</title>
-	<para>
-	  After you've gotten all the software installed and working you're ready
-	  to start preparing the database for its life as a the back end to a high
-	  quality bug tracker.
-	</para>
-	<para>
-	  First, you'll want to fix MySQL permissions to allow access
-	from Bugzilla.  For the purpose of this Installation section,
-	the Bugzilla username will be <quote>bugs</quote>, and will
-	have minimal permissions.
-	
-	<warning>
-	  <para>
-	    Bugzilla has not undergone a thorough security audit. It
-	    may be possible for a system cracker to somehow trick
-	    Bugzilla into executing a command such as <command>DROP
-	      DATABASE mysql</command>.
-	  </para>
-	  <para>That would be bad.</para>
-	</warning>
+    </section>
+
+    <section id="install-mysql">
+      <title>MySQL</title>
+
+      <para>Visit the MySQL homepage at 
+      <ulink url="http://www.mysql.com">www.mysql.com</ulink>
+      to grab and install the latest stable release of the server. 
       </para>
       
-      <para>
-	Give the MySQL root user a password.  MySQL passwords are
-	limited to 16 characters.
-	<simplelist>
-	  <member>
-	    <computeroutput> <prompt>bash#</prompt> <command>mysql
-		-u root mysql</command> </computeroutput>
-	  </member>
-	  <member>
-	    <computeroutput> <prompt>mysql></prompt> <command>
-		UPDATE user SET Password=PASSWORD ('new_password')
-		WHERE user='root'; </command> </computeroutput>
-	  </member>
-	  <member>
-	    <computeroutput> <prompt>mysql></prompt> <command>FLUSH
-		PRIVILEGES;</command> </computeroutput>
-	  </member>
-	</simplelist> From this point on, if you need to access
-	MySQL as the MySQL root user, you will need to use
-	<command>mysql -u root -p</command> and enter your
-	new_password.  Remember that MySQL user names have nothing to
-	do with Unix user names (login names).	  
-      </para>
-      <para>
-	Next, we create the <quote>bugs</quote> user, and grant
-	sufficient permissions for checksetup.pl, which we'll use
-	later, to work its magic.  This also restricts the
-	<quote>bugs</quote> user to operations within a database
-	called <quote>bugs</quote>, and only allows the account to
-	connect from <quote>localhost</quote>.  Modify it to reflect
-	your setup if you will be connecting from another machine or
-	as a different user.
-      </para>
-      <para>
-	Remember to set bugs_password to some unique password.
-	<simplelist>
-	  <member>
-	    <computeroutput>
-	      <prompt>mysql></prompt>
-	      <command>GRANT SELECT,INSERT,UPDATE,DELETE,INDEX,
-		ALTER,CREATE,DROP,REFERENCES 
-		ON bugs.* TO bugs@localhost
-		IDENTIFIED BY 'bugs_password';</command>
-	    </computeroutput>
-	  </member>
-	  <member>
-	    <computeroutput>
-	      <prompt>
-		mysql>
-	      </prompt>
-	      <command>
-		FLUSH PRIVILEGES;
-	      </command>
-	    </computeroutput>
-	  </member>
-	</simplelist>
-      </para>
-      <para>
-	Next, run the magic checksetup.pl script.  (Many thanks to
-	Holger Schurig &lt;holgerschurig@nikocity.de&gt; for writing
-	this script!) It will make sure Bugzilla files and directories
-	have reasonable permissions, set up the
-	<filename>data</filename> directory, and create all the MySQL
-	tables.
-	<simplelist>
-	  <member>
-	    <computeroutput> <prompt>bash#</prompt>
-	      <command>./checksetup.pl</command> </computeroutput>
-	  </member>
-	</simplelist> The first time you run it, it will create a
-	file called <filename>localconfig</filename>.
+      <note>
+        <para> Many of the binary
+        versions of MySQL store their data files in 
+        <filename>/var</filename>.
+        On some Unix systems, this is part of a smaller root partition,
+        and may not have room for your bug database. You can set the data
+         directory as an option to <filename>configure</filename>
+         if you build MySQL from source yourself.</para>
+      </note>
+
+      <para>If you install from something other than an RPM or Debian 
+      package, you will need to add <filename>mysqld</filename>
+      to your init scripts so the server daemon will come back up whenever
+      your machine reboots. Further discussion of UNIX init sequences are
+      beyond the scope of this guide. 
       </para>
+
+      <para>Change your init script to start 
+      <filename>mysqld</filename>
+      with the ability to accept large packets. By default, 
+      <filename>mysqld</filename>
+      only accepts packets up to 64K long. This limits the size of
+      attachments you may put on bugs. If you add 
+      <option>-O max_allowed_packet=1M</option>
+      to the command that starts 
+      <filename>mysqld</filename>
+      (or <filename>safe_mysqld</filename>), 
+      then you will be able to have attachments up to about 1 megabyte.
+      There is a Bugzilla parameter for maximum attachment size;
+      you should configure it to match the value you choose here.</para>
+
+      <para>If you plan on running Bugzilla and MySQL on the same machine,
+      consider using the 
+      <option>--skip-networking</option>
+      option in the init script. This enhances security by preventing
+      network access to MySQL.</para>
+        
     </section>
+
+    <section id="install-perl">
+      <title>Perl</title>
+
+      <para>Any machine that doesn't have Perl on it is a sad machine indeed.
+      Perl can be got in source form from 
+      <ulink url="http://www.perl.com">perl.com</ulink> for the rare 
+      *nix systems which don't have it. 
+      Although Bugzilla runs with all post-5.005
+      versions of Perl, it's a good idea to be up to the very latest version
+      if you can when running Bugzilla. As of this writing, that is Perl
+      version &perl-ver;.</para>
+
+      <tip id="bundlebugzilla"
+      xreflabel="Using Bundle::Bugzilla instead of manually installing Perl modules">
+
+        <para>You can skip the following Perl module installation steps by
+        installing 
+        <productname>Bundle::Bugzilla</productname>
+
+        from 
+        <glossterm linkend="gloss-cpan">CPAN</glossterm>, 
+        which installs all required modules for you.</para>
+
+        <para>
+          <computeroutput>
+            <prompt>bash#</prompt>
+
+            <command>perl -MCPAN -e 'install "Bundle::Bugzilla"'</command>
+          </computeroutput>
+        </para>
+
+        <para>Bundle::Bugzilla doesn't include GD, Chart::Base, or
+        MIME::Parser, which are not essential to a basic Bugzilla install. If
+        installing this bundle fails, you should install each module
+        individually to isolate the problem.</para>
+      </tip>
+    </section>
+
+    <section id="perl-modules">
+      <title>Perl Modules</title>
+      
+    <para> 
+      All Perl modules can be found on the
+      <ulink url="http://www.cpan.org">Comprehensive Perl 
+      Archive Network</ulink> (CPAN). The
+      CPAN servers have a real tendency to bog down, so please use mirrors.
+    </para>
     
-    <section>
-      <title>Tweaking <filename>localconfig</filename></title>
-      <para>
-	This file contains a variety of settings you may need to tweak including
-	how Bugzilla should connect to the MySQL database.
-      </para>
-      <para>
-	The connection settings include:
-	<orderedlist>
-	  <listitem>
-	    <para>
-	      server's host: just use <quote>localhost</quote> if the
-	      MySQL server is local
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      database name: <quote>bugs</quote> if you're following
-	      these directions
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      MySQL username: <quote>bugs</quote> if you're following
-	      these directions
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Password for the <quote>bugs</quote> MySQL account above
-	    </para>
-	  </listitem>
-	</orderedlist>
+      <para>Quality, general Perl module installation instructions can be
+      found on the CPAN website, but the easy thing to do is to just use the
+      CPAN shell which does all the hard work for you.
+      To use the CPAN shell to install a module: 
       </para>
+
       <para>
-	You should also install .htaccess files that the Apache
-	webserver will use  to restrict access to Bugzilla data files.
-	See <xref
-		  linkend="htaccess">.
+        <computeroutput>
+          <prompt>bash#</prompt>
+          <command>perl -MCPAN -e 'install "&lt;modulename&gt;"'</command>
+        </computeroutput>
       </para>
+      
       <para>
-	Once you are happy with the settings, re-run
-	<filename>checksetup.pl</filename>. On this second run, it will
-	  create the database and an administrator account for which
-	  you will be prompted to provide information.
+      To do it the hard way: 
       </para>
-      <para>
-	When logged into an administrator account once Bugzilla is
-	running, if you go to the query page (off of the Bugzilla main
-	menu), you'll find an <quote>edit parameters</quote> option
-	that is filled with editable treats.
+      
+      <para>Untar the module tarball -- it should create its own
+      directory</para>
+
+      <para>CD to the directory just created, and enter the following
+      commands: 
+      <orderedlist>
+        <listitem>
+          <para>
+            <computeroutput>
+              <prompt>bash#</prompt>
+
+              <command>perl Makefile.PL</command>
+            </computeroutput>
+          </para>
+        </listitem>
+
+        <listitem>
+          <para>
+            <computeroutput>
+              <prompt>bash#</prompt>
+
+              <command>make</command>
+            </computeroutput>
+          </para>
+        </listitem>
+
+        <listitem>
+          <para>
+            <computeroutput>
+              <prompt>bash#</prompt>
+
+              <command>make test</command>
+            </computeroutput>
+          </para>
+        </listitem>
+
+        <listitem>
+          <para>
+            <computeroutput>
+              <prompt>bash#</prompt>
+
+              <command>make install</command>
+            </computeroutput>
+          </para>
+        </listitem>
+      </orderedlist>
       </para>
-      <para>
-	Should everything work, you will have a nearly empty Bugzilla
-	database and a newly-created <filename>localconfig</filename>
-	file in your Bugzilla root directory.
+      
+      <warning>
+        <para>Many people complain that Perl modules will not install for
+        them. Most times, the error messages complain that they are missing a
+        file in 
+        <quote>@INC</quote>. 
+        Virtually every time, this error is due to permissions being set too
+        restrictively for you to compile Perl modules or not having the
+        necessary Perl development libraries installed on your system.
+        Consult your local UNIX systems administrator for help solving these
+        permissions issues; if you 
+        <emphasis>are</emphasis>
+        the local UNIX sysadmin, please consult the newsgroup/mailing list
+        for further assistance or hire someone to help you out.</para>
+      </warning>
+
+
+    <section>
+      <title>DBI</title>
+        
+      <para>The DBI module is a generic Perl module used the
+      MySQL-related modules. As long as your Perl installation was done
+      correctly the DBI module should be a breeze. It's a mixed Perl/C
+      module, but Perl's MakeMaker system simplifies the C compilation
+      greatly.</para>
+    </section>
+
+    <section>
+      <title>Data::Dumper</title>
+
+      <para>The Data::Dumper module provides data structure persistence for
+      Perl (similar to Java's serialization). It comes with later
+      sub-releases of Perl 5.004, but a re-installation just to be sure it's
+      available won't hurt anything.</para>
+    </section>
+
+    <section>
+      <title>MySQL-related modules</title>
+
+      <para>The Perl/MySQL interface requires a few mutually-dependent Perl
+      modules. These modules are grouped together into the the
+      Msql-Mysql-modules package.</para> 
+
+      <para>The MakeMaker process will ask you a few questions about the
+      desired compilation target and your MySQL installation. For most of the
+      questions the provided default will be adequate, but when asked if your
+      desired target is the MySQL or mSQL packages, you should
+      select the MySQL related ones. Later you will be asked if you wish to
+      provide backwards compatibility with the older MySQL packages; you
+      should answer YES to this question. The default is NO.</para>
+
+      <para>A host of 'localhost' should be fine and a testing user of 'test'
+      with a null password should find itself with sufficient access to run
+      tests on the 'test' database which MySQL created upon installation.
       </para>
-      <para>
-	<note>
-	  <para>
-	    The second time you run checksetup.pl, you should become
-	    the user your web server runs as, and that you ensure that
-	    you set the <quote>webservergroup</quote> parameter in localconfig to
-	    match the web  server's group name, if any.  I believe,
-	    for the next release of Bugzilla, this will be fixed so
-	    that Bugzilla supports a <quote>webserveruser</quote> parameter in
-	    localconfig as well.
-	    <example>
-	      <title>Running checksetup.pl as the web user</title>
-	      <para>
-		  Assuming your web server runs as user "apache", and
-		Bugzilla is installed in "/usr/local/bugzilla", here's
-		one way to run checksetup.pl as the web server user.
-		As root, for the <emphasis>second run</emphasis> of
-		checksetup.pl, do this: 
-		<programlisting> 
-bash# chown -R apache:apache /usr/local/bugzilla 
-bash# su - apache 
-bash# cd /usr/local/bugzilla 
-bash# ./checksetup.pl 
-		</programlisting>
-	      </para>
-	    </example>
-	  </para>
-	</note>
+    </section>
+
+    <section>
+      <title>TimeDate modules</title>
+
+      <para>Many of the more common date/time/calendar related Perl modules
+      have been grouped into a bundle similar to the MySQL modules bundle.
+      This bundle is stored on the CPAN under the name TimeDate. 
+      The component module we're most interested in is the Date::Format
+      module, but installing all of them is probably a good idea anyway.
       </para>
+    </section>
+
+    <section>
+      <title>GD (optional)</title>
+
+      <para>The GD library was written by Thomas Boutell a long while ago to
+      programatically generate images in C. Since then it's become the
+      defacto standard for programatic image construction. The Perl bindings
+      to it found in the GD library are used on millions of web pages to
+      generate graphs on the fly. That's what Bugzilla will be using it for
+      so you must install it if you want any of the graphing to work.</para>
+
       <note>
-	<para>
-	  The checksetup.pl script is designed so that you can run
-	  it at any time without causing harm.  You should run it
-	  after any upgrade to Bugzilla.
-	</para>
+        <para>The Perl GD library requires some other libraries that may or
+        may not be installed on your system, including 
+        <classname>libpng</classname>
+        and 
+        <classname>libgd</classname>. 
+        The full requirements are listed in the Perl GD library README.
+        If compiling GD fails, it's probably because you're
+        missing a required library.</para>
       </note>
     </section>
+
+    <section>
+      <title>Chart::Base (optional)</title>
+
+      <para>The Chart module provides Bugzilla with on-the-fly charting
+      abilities. It can be installed in the usual fashion after it has been
+      fetched from CPAN. 
+      Note that earlier versions that 0.99c used GIFs, which are no longer
+      supported by the latest versions of GD.</para>
+    </section>
     
     <section>
-      <title>Setting Up Maintainers Manually (Optional)</title>
-      <para>
-	If you want to add someone else to every group by hand, you
-	can do it by typing the appropriate MySQL commands.  Run
-	<command> mysql -u root -p bugs</command> You
-	may need different parameters, depending on your security
-	settings. Then:
-	  <simplelist>
-	    <member>
-	      <computeroutput> <prompt>mysql></prompt> <command>update
-		profiles set groupset=0x7fffffffffffffff where
-		login_name = 'XXX';</command> </computeroutput> (yes, that's <emphasis>fifteen</emphasis><quote>f</quote>'s.
-	    </member>
-	  </simplelist> replacing XXX with the Bugzilla email address.
-	</para>
-      </section>
-
-      <section>
-	<title>The Whining Cron (Optional)</title>
-      <para>
-	By now you have a fully functional bugzilla, but what good
-	are bugs if they're not annoying?  To help make those bugs
-	more annoying you can set up bugzilla's automatic whining
-	system.  This can be done by adding the following command as a
-	daily crontab entry (for help on that see that crontab man
-	page):
-	<simplelist>
-	  <member>
-	    <computeroutput> <command>cd
-		&lt;your-bugzilla-directory&gt; ;
-		./whineatnews.pl</command> </computeroutput>
-	  </member>
-	</simplelist>
+      <title>Template Toolkit</title>
+
+      <para>When you install Template Toolkit, you'll get asked various
+      questions about features to enable. The defaults are fine, except
+      that it is recommended you use the high speed XS Stash of the Template
+      Toolkit, in order to achieve best performance.  However, there are
+      known problems with XS Stash and Perl 5.005_02 and lower.  If you
+      wish to use these older versions of Perl, please use the regular
+      stash.</para>
+    </section> 
+
+    
+  </section>
+  
+    <section>
+      <title>HTTP Server</title>
+
+      <para>You have a freedom of choice here - Apache, Netscape or any other
+      server on UNIX would do. You can run the web server on a
+      different machine than MySQL, but need to adjust the MySQL 
+      <quote>bugs</quote>
+      user permissions accordingly. 
+      <note>
+        <para>We strongly recommend Apache as the web server to use. The
+        Bugzilla Guide installation instructions, in general, assume you are
+        using Apache. If you have got Bugzilla working using another webserver,
+        please share your experiences with us.</para>
+      </note>
+      </para>
+
+      <para>You'll want to make sure that your web server will run any file
+      with the .cgi extension as a CGI and not just display it. If you're
+      using Apache that means uncommenting the following line in the httpd.conf
+      file: 
+      <programlisting>AddHandler cgi-script .cgi</programlisting>
       </para>
+
+      <para>With Apache you'll also want to make sure that within the
+      httpd.conf file the line: 
+      <programlisting>Options ExecCGI AllowOverride Limit</programlisting>
+
+      is in the stanza that covers the directories into which you intend to
+      put the bugzilla .html and .cgi files.
+
+        <note>
+          <para>AllowOverride Limit allows the use of a Deny statement in the
+          .htaccess file generated by checksetup.pl</para>
+
+          <para>Users of older versions of Apache may find the above lines 
+          in the srm.conf and access.conf files, respecitvely.</para>
+        </note>
+      </para>
+      
+      <warning>
+        <para>There are important files and directories that should not be a
+        served by the HTTP server - most files in the 
+        <quote>data</quote>
+        and 
+        <quote>shadow</quote>
+        directories and the 
+        <quote>localconfig</quote>
+        file. You should configure your HTTP server to not serve 
+        these files. Failure to do so will expose critical passwords and
+        other data. Please see 
+        <xref linkend="htaccess" />
+        for details on how to do this for Apache; the checksetup.pl
+        script should create appropriate .htaccess files for you.</para>
+      </warning>
+    </section>
+
+    <section>
+      <title>Bugzilla</title>
+
+      <para>You should untar the Bugzilla files into a directory that you're
+      willing to make writable by the default web server user (probably 
+      <quote>nobody</quote>). 
+      You may decide to put the files in the main web space for your
+      web server or perhaps in 
+      <filename>/usr/local</filename>
+      with a symbolic link in the web space that points to the Bugzilla
+      directory.</para>
+
       <tip>
-	<para>
-	  Depending on your system, crontab may have several manpages.
-	  The following command should  lead you to the most useful
-	  page for this purpose: 
-	  <programlisting>
- man 5 crontab
-	  </programlisting>
-	</para>
+        <para>If you symlink the bugzilla directory into your Apache's HTML
+        heirarchy, you may receive 
+        <errorname>Forbidden</errorname>
+        errors unless you add the 
+        <quote>FollowSymLinks</quote>
+        directive to the &lt;Directory&gt; entry for the HTML root
+        in httpd.conf.</para>
       </tip>
+
+      <para>Once all the files are in a web accessible directory, make that
+      directory writable by your webserver's user. This is a temporary step
+      until you run the post-install 
+      <filename>checksetup.pl</filename>
+      script, which locks down your installation.</para>
+
+      <para>Lastly, you'll need to set up a symbolic link to 
+      <filename>/usr/bonsaitools/bin/perl</filename>
+      for the correct location of your Perl executable (probably 
+      <filename>/usr/bin/perl</filename>). 
+      Otherwise you must hack all the .cgi files to change where they look
+      for Perl. This can be done using the following Perl one-liner, but 
+      I suggest using the symlink approach to avoid upgrade hassles.
+      </para>
+      
+      <para> 
+        <programlisting>perl -pi -e
+        's@#\!/usr/bonsaitools/bin/perl@#\!/usr/bin/perl@' *cgi *pl Bug.pm
+        processmail syncshadowdb</programlisting>
+
+        Change <filename>/usr/bin/perl</filename> to match the location
+        of Perl on your machine.
+      </para>
     </section>
-    
+
     <section>
-      <title>Bug Graphs (Optional)</title>
-      <para>
-	As long as you installed the GD and Graph::Base Perl modules
-	you might as well turn on the nifty bugzilla bug reporting
-	graphs.
+      <title>Setting Up the MySQL Database</title>
+
+      <para>After you've gotten all the software installed and working you're
+      ready to start preparing the database for its life as the back end to
+      a high quality bug tracker.</para>
+
+      <para>First, you'll want to fix MySQL permissions to allow access from
+      Bugzilla. For the purpose of this Installation section, the Bugzilla
+      username will be 
+      <quote>bugs</quote>, and will have minimal permissions. 
       </para>
-      <para>
-	Add a cron entry like this to run collectstats daily at 5
-	after midnight:
-	<simplelist>
-	  <member>
-	    <computeroutput> <prompt>bash#</prompt> <command>crontab
-		-e</command> </computeroutput>
-	  </member>
-	  <member>
-	    <computeroutput> 5 0 * * * cd
-	      &lt;your-bugzilla-directory&gt; ; ./collectstats.pl
-	    </computeroutput>
-	  </member>
-	</simplelist>
+
+      <para>Begin by giving the MySQL root user a password. MySQL passwords are limited
+      to 16 characters. 
+      <simplelist>
+        <member>
+          <computeroutput>
+            <prompt>bash#</prompt>
+
+            <command>mysql -u root mysql</command>
+          </computeroutput>
+        </member>
+
+        <member>
+          <computeroutput>
+            <prompt>mysql&gt;</prompt>
+
+            <command>UPDATE user SET Password=PASSWORD('&lt;new_password'&gt;)
+            WHERE user='root';</command>
+          </computeroutput>
+        </member>
+
+        <member>
+          <computeroutput>
+            <prompt>mysql&gt;</prompt>
+
+            <command>FLUSH PRIVILEGES;</command>
+          </computeroutput>
+        </member>
+      </simplelist>
+
+      From this point on, if you need to access MySQL as the MySQL root user,
+      you will need to use 
+      <command>mysql -u root -p</command>
+
+      and enter &lt;new_password&gt;. Remember that MySQL user names have
+      nothing to do with Unix user names (login names).</para>
+
+      <para>Next, we use an SQL <command>GRANT</command> command to create a 
+      <quote>bugs</quote>
+
+      user, and grant sufficient permissions for checksetup.pl, which we'll
+      use later, to work its magic. This also restricts the 
+      <quote>bugs</quote>
+      user to operations within a database called 
+      <quote>bugs</quote>, and only allows the account to connect from 
+      <quote>localhost</quote>. 
+      Modify it to reflect your setup if you will be connecting from
+      another machine or as a different user.</para>
+
+      <para>Remember to set &lt;bugs_password&gt; to some unique password. 
+      <simplelist>
+        <member>
+          <computeroutput>
+            <prompt>mysql&gt;</prompt>
+
+            <command>GRANT SELECT,INSERT,UPDATE,DELETE,INDEX,
+            ALTER,CREATE,DROP,REFERENCES ON bugs.* TO bugs@localhost
+            IDENTIFIED BY '&lt;bugs_password&gt;';</command>
+          </computeroutput>
+        </member>
+
+        <member>
+          <computeroutput>
+            <prompt>mysql&gt;</prompt>
+
+            <command>FLUSH PRIVILEGES;</command>
+          </computeroutput>
+        </member>
+      </simplelist>
       </para>
-      <para>
-	After two days have passed you'll be able to view bug graphs
-	from the Bug Reports page. 
+    </section>
+
+    <section>
+      <title> 
+      <filename>checksetup.pl</filename>
+      </title>
+
+      <para>Next, run the magic checksetup.pl script. (Many thanks to 
+      <ulink url="mailto:holgerschurig@nikocity.de">Holger Schurig </ulink> 
+      for writing this script!) 
+      This script is designed to make sure your MySQL database and other
+      configuration options are consistent with the Bugzilla CGI files. 
+      It will make sure Bugzilla files and directories have reasonable
+      permissions, set up the 
+      <filename>data</filename>
+      directory, and create all the MySQL tables. 
+      <simplelist>
+        <member>
+          <computeroutput>
+            <prompt>bash#</prompt>
+
+            <command>./checksetup.pl</command>
+          </computeroutput>
+        </member>
+      </simplelist>
+
+      The first time you run it, it will create a file called 
+      <filename>localconfig</filename>.</para>
+      
+      <para>This file contains a variety of settings you may need to tweak
+      including how Bugzilla should connect to the MySQL database.</para>
+
+      <para>The connection settings include: 
+      <orderedlist>
+        <listitem>
+          <para>server's host: just use 
+          <quote>localhost</quote>
+          if the MySQL server is local</para>
+        </listitem>
+
+        <listitem>
+          <para>database name: 
+          <quote>bugs</quote>
+          if you're following these directions</para>
+        </listitem>
+
+        <listitem>
+          <para>MySQL username: 
+          <quote>bugs</quote>
+          if you're following these directions</para>
+        </listitem>
+
+        <listitem>
+          <para>Password for the 
+          <quote>bugs</quote>
+          MySQL account; (&lt;bugs_password&gt;) above</para>
+        </listitem>
+      </orderedlist>
       </para>
+
+      <para>Once you are happy with the settings, 
+      <filename>su</filename> to the user
+      your web server runs as, and re-run 
+      <filename>checksetup.pl</filename>. (Note: on some security-conscious
+      systems, you may need to change the login shell for the webserver 
+      account before you can do this.)
+      On this second run, it will create the database and an administrator
+      account for which you will be prompted to provide information.</para>
+
+      <note>
+        <para>The checksetup.pl script is designed so that you can run it at
+        any time without causing harm. You should run it after any upgrade to
+        Bugzilla.</para>
+      </note>
     </section>
-    
+
     <section>
       <title>Securing MySQL</title>
-      <para>
-	If you followed the installation instructions for setting up
-	your "bugs" and "root" user in MySQL, much of this should not
-	apply to you.  If you are upgrading an existing installation
-	of Bugzilla, you should pay close attention to this section.
+
+      <para>If you followed the installation instructions for setting up your
+      "bugs" and "root" user in MySQL, much of this should not apply to you.
+      If you are upgrading an existing installation of Bugzilla, you should
+      pay close attention to this section.</para>
+
+      <para>Most MySQL installs have "interesting" default security
+      parameters: 
+      <simplelist>
+        <member>mysqld defaults to running as root</member>
+
+        <member>it defaults to allowing external network connections</member>
+
+        <member>it has a known port number, and is easy to detect</member>
+
+        <member>it defaults to no passwords whatsoever</member>
+
+        <member>it defaults to allowing "File_Priv"</member>
+      </simplelist>
       </para>
-      <para>
-	Most MySQL installs have "interesting" default security parameters:
-	<simplelist>
-	  <member>mysqld defaults to running as root</member>
-	  <member>it defaults to allowing external network connections</member>
-	  <member>it has a known port number, and is easy to detect</member>
-	  <member>it defaults to no passwords whatsoever</member>
-	  <member>it defaults to allowing "File_Priv"</member>
-	</simplelist>
+
+      <para>This means anyone from anywhere on the internet can not only drop
+      the database with one SQL command, and they can write as root to the
+      system.</para>
+
+      <para>To see your permissions do: 
+      <simplelist>
+        <member>
+          <computeroutput>
+            <prompt>bash#</prompt>
+
+            <command>mysql -u root -p</command>
+          </computeroutput>
+        </member>
+
+        <member>
+          <computeroutput>
+            <prompt>mysql&gt;</prompt>
+
+            <command>use mysql;</command>
+          </computeroutput>
+        </member>
+
+        <member>
+          <computeroutput>
+            <prompt>mysql&gt;</prompt>
+
+            <command>show tables;</command>
+          </computeroutput>
+        </member>
+
+        <member>
+          <computeroutput>
+            <prompt>mysql&gt;</prompt>
+
+            <command>select * from user;</command>
+          </computeroutput>
+        </member>
+
+        <member>
+          <computeroutput>
+            <prompt>mysql&gt;</prompt>
+
+            <command>select * from db;</command>
+          </computeroutput>
+        </member>
+      </simplelist>
       </para>
-      <para>
-	This means anyone from anywhere on the internet can not only
-	drop the database with one SQL command, and they can write as
-	root to the system.
+
+      <para>To fix the gaping holes: 
+      <simplelist>
+        <member>DELETE FROM user WHERE User='';</member>
+
+        <member>UPDATE user SET Password=PASSWORD('new_password') WHERE
+        user='root';</member>
+
+        <member>FLUSH PRIVILEGES;</member>
+      </simplelist>
       </para>
-      <para>
-	To see your permissions do:
-	<simplelist>
-	  <member>
-	    <computeroutput>
-	      <prompt>bash#</prompt>
-	      <command>mysql -u root -p</command>
-	    </computeroutput>
-	  </member>
-	  <member>
-	    <computeroutput>
-	      <prompt>mysql></prompt>
-	      <command>use mysql;</command>
-	    </computeroutput>
-	  </member>
-	  <member>
-	    <computeroutput>
-	      <prompt>mysql></prompt>
-	      <command>show tables;</command>
-	    </computeroutput>
-	  </member>
-	  <member>
-	    <computeroutput>
-	      <prompt>mysql></prompt>
-	      <command>select * from user;</command>
-	    </computeroutput>
-	  </member>
-	  <member>
-	    <computeroutput>
-	      <prompt>mysql></prompt>
-	      <command>select * from db;</command>
-	    </computeroutput>
-	  </member>
-	</simplelist>
+
+      <para>If you're not running "mit-pthreads" you can use: 
+      <simplelist>
+        <member>GRANT USAGE ON *.* TO bugs@localhost;</member>
+
+        <member>GRANT ALL ON bugs.* TO bugs@localhost;</member>
+
+        <member>REVOKE DROP ON bugs.* FROM bugs@localhost;</member>
+
+        <member>FLUSH PRIVILEGES;</member>
+      </simplelist>
       </para>
-      <para>
-	To fix the gaping holes:
-	<simplelist>
-	  <member>DELETE FROM user WHERE User='';</member>
-	  <member>UPDATE user SET Password=PASSWORD('new_password') WHERE user='root';</member>
-	  <member> FLUSH PRIVILEGES;</member>
-	</simplelist>
+
+      <para>With "mit-pthreads" you'll need to modify the "globals.pl"
+      Mysql-&gt;Connect line to specify a specific host name instead of
+      "localhost", and accept external connections: 
+      <simplelist>
+        <member>GRANT USAGE ON *.* TO bugs@bounce.hop.com;</member>
+
+        <member>GRANT ALL ON bugs.* TO bugs@bounce.hop.com;</member>
+
+        <member>REVOKE DROP ON bugs.* FROM bugs@bounce.hop.com;</member>
+
+        <member>FLUSH PRIVILEGES;</member>
+      </simplelist>
       </para>
-      <para>
-	If you're not running "mit-pthreads" you can use:
-	<simplelist>
-	  <member>GRANT USAGE ON *.* TO bugs@localhost;</member>
-	  <member>GRANT ALL ON bugs.* TO bugs@localhost;</member>
-	  <member>REVOKE DROP ON bugs.* FROM bugs@localhost;</member>
-	  <member>FLUSH PRIVILEGES;</member>
-	</simplelist>
+
+      <para>Consider also: 
+      <orderedlist>
+        <listitem>
+          <para>Turning off external networking with "--skip-networking",
+          unless you have "mit-pthreads", in which case you can't. Without
+          networking, MySQL connects with a Unix domain socket.</para>
+        </listitem>
+
+        <listitem>
+          <para>using the --user= option to mysqld to run it as an
+          unprivileged user.</para>
+        </listitem>
+
+        <listitem>
+          <para>running MySQL in a chroot jail</para>
+        </listitem>
+
+        <listitem>
+          <para>running the httpd in a chroot jail</para>
+        </listitem>
+
+        <listitem>
+          <para>making sure the MySQL passwords are different from the OS
+          passwords (MySQL "root" has nothing to do with system
+          "root").</para>
+        </listitem>
+
+        <listitem>
+          <para>running MySQL on a separate untrusted machine</para>
+        </listitem>
+
+        <listitem>
+          <para>making backups ;-)</para>
+        </listitem>
+      </orderedlist>
       </para>
+    </section>
+    
+    <section>
+      <title>Configuring Bugzilla</title>
       <para>
-	With "mit-pthreads" you'll need to modify the "globals.pl" Mysql->Connect
-	line to specify a specific host name instead of "localhost", and accept
-	external connections:
-	<simplelist>
-	  <member>GRANT USAGE ON *.* TO bugs@bounce.hop.com;</member>
-	  <member>GRANT ALL ON bugs.* TO bugs@bounce.hop.com;</member>
-	  <member>REVOKE DROP ON bugs.* FROM bugs@bounce.hop.com;</member>
-	  <member>FLUSH PRIVILEGES;</member>
-	</simplelist>
+      You should run through the parameters on the Edit Parameters page
+      (link in the footer) and set them all to appropriate values. 
+      They key parameters are documented in <xref linkend="parameters" />.
       </para>
-      <para>
-	Use .htaccess files with the Apache webserver to secure your
-	bugzilla install. See <xref linkend="htaccess">
+    </section>
+  </section>
+  
+  <section id="extraconfig">
+    <title>Optional Additional Configuration</title>
+
+    <section>
+      <title>Dependency Charts</title>
+
+      <para>As well as the text-based dependency graphs, Bugzilla also
+      supports dependency graphing, using a package called 'dot'.
+      Exactly how this works is controlled by the 'webdotbase' parameter,
+      which can have one of three values:
       </para>
+
       <para>
-	Consider also:
-	<orderedlist>
-	  <listitem>
-	    <para>
-	      Turning off external networking with "--skip-networking",
-	      unless you have "mit-pthreads", in which case you can't.
-	      Without networking, MySQL connects with a Unix domain socket.
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      using the --user= option to mysqld to run it as an unprivileged
-	      user.
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      starting MySQL in a chroot jail
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      running the httpd in a "chrooted" jail
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      making sure the MySQL passwords are different from the OS
-	      passwords (MySQL "root" has nothing to do with system "root").
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      running MySQL on a separate untrusted machine
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      making backups ;-)
-	    </para>
-	  </listitem>
-	</orderedlist>
+        <orderedlist>
+          <listitem>
+            <para>
+            A complete file path to the command 'dot' (part of 
+            <ulink url="http://www.graphviz.org/">GraphViz</ulink>) 
+            will generate the graphs locally
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+            A URL prefix pointing to an installation of the webdot package will
+            generate the graphs remotely
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+            A blank value will disable dependency graphing.
+            </para>
+          </listitem>
+        </orderedlist>
       </para>
-    </section>
-  </section>      
-  <section id="osx">
-    <title>Mac OS X Installation Notes</title>
-    <para>
-      There are a lot of common libraries and utilities out there
-      that Apple did not include with Mac OS X, but which run
-      perfectly well on it.  The GD library, which Bugzilla needs to
-      do bug graphs, is one of these.
-    </para>
-    <para>
-      The easiest way to get a lot of these is with a program called
-      Fink, which is similar in nature to the CPAN installer, but
-      installs common GNU utilities.  Fink is available from
-      &lt;http://sourceforge.net/projects/fink/>.
-    </para>
-    <para>
-      Follow the instructions for setting up Fink.  Once it's
-      installed, you'll want to run the following as root:
-      <command>fink install gd</command>
-    </para>
-    <para>
-      It will prompt you for a number of dependencies, type 'y' and
-      hit enter to install all of the dependencies.  Then watch it
-      work.
-    </para>
-    <para>
-      To prevent creating conflicts with the software that Apple
-      installs by default, Fink creates its own directory tree at
-      /sw where it installs most of the software that it installs.
-      This means your libraries and headers for libgd will be at
-      /sw/lib and /sw/include instead of /usr/lib and
-      /usr/local/include.  Because of these changed locations for
-      the libraries, the Perl GD module will not install directly
-      via CPAN (it looks for the specific paths instead of getting
-      them from your environment).  But there's a way around that
-      :-)
-    </para>
-    <para>
-      Instead of typing <quote>install GD</quote> at the
-      <prompt>cpan&gt;</prompt> prompt, type <command>look
-	GD</command>.  This should go through the motions of
-      downloading the latest version of the GD module, then it will
-      open a shell and drop you into the build directory. Apply the
-      following patch to the Makefile.PL file (save the patch into a
-      file  and use the command <command>patch &lt;
-	patchfile</command>:
-    </para>
-    <para>
-      <programlisting>
-<![CDATA[
-	
---- GD-1.33/Makefile.PL Fri Aug  4 16:59:22 2000
-+++ GD-1.33-darwin/Makefile.PL  Tue Jun 26 01:29:32 2001
-@@ -3,8 +3,8 @@
- warn "NOTICE: This module requires libgd 1.8.3 or higher (shared library version 4.X).\n";
- 
- # =====> PATHS: CHECK AND ADJUST <=====
--my @INC     = qw(-I/usr/local/include -I/usr/local/include/gd); 
--my @LIBPATH = qw(-L/usr/lib/X11 -L/usr/X11R6/lib -L/usr/X11/lib -L/usr/local/lib );
-+my @INC     = qw(-I/sw/include -I/sw/include/gd -I/usr/local/include -I/usr/local/include/gd);
-+my @LIBPATH = qw(-L/usr/lib/X11 -L/usr/X11R6/lib -L/usr/X11/lib -L/sw/lib -L/usr/local/lib);
- my @LIBS    = qw(-lgd -lpng -lz);
- 
- # FEATURE FLAGS
-@@ -23,7 +23,7 @@
- 
- push @LIBS,'-lttf' if $TTF;
- push @LIBS,'-ljpeg' if $JPEG;
--push @LIBS, '-lm' unless $^O eq 'MSWin32';
-+push @LIBS, '-lm' unless ($^O =~ /^MSWin32|darwin$/);
- 
- # FreeBSD 3.3 with libgd built from ports croaks if -lXpm is specified 
- if ($^O ne 'freebsd' && $^O ne 'MSWin32') {
-
-]]> 
-      </programlisting>
-    </para>
-    <para>
-      Then, run these commands to finish the installation of the perl module:
+      
+      <para>So, to get this working, install
+      <ulink url="http://www.graphviz.org/">GraphViz</ulink>. If you
+      do that, you need to
+      <ulink url="http://httpd.apache.org/docs/mod/mod_imap.html">enable
+      server-side image maps</ulink> in Apache.
+      Alternatively, you could set up a webdot server, or use the AT&amp;T 
+      public webdot server (the
+      default for the webdotbase param). Note that AT&amp;T's server won't work
+      if Bugzilla is only accessible using HTTPS.
+      </para>
+   </section>
+
+    <section>
+      <title>Bug Graphs</title>
+
+      <para>As long as you installed the GD and Graph::Base Perl modules you
+      might as well turn on the nifty Bugzilla bug reporting graphs.</para>
+
+      <para>Add a cron entry like this to run 
+      <filename>collectstats.pl</filename> 
+      daily at 5 after midnight: 
       <simplelist>
-	<member><command>perl Makefile.PL</command></member>
-	<member><command>make</command></member>
-	<member><command>make test</command></member>
-	<member><command>make install</command></member>
-	<member>And don't forget to run <command>exit</command> to get back to cpan.</member>
+        <member>
+          <computeroutput>
+            <prompt>bash#</prompt>
+
+            <command>crontab -e</command>
+          </computeroutput>
+        </member>
+
+        <member>
+          <computeroutput>5 0 * * * cd &lt;your-bugzilla-directory&gt; ;
+          ./collectstats.pl</computeroutput>
+        </member>
       </simplelist>
-    </para>
-    <para>
-      Happy Hacking!
-    </para>
-  </section>
-  
-  <section id="bsdinstall" xreflabel="BSD Installation Notes">
-    <title>BSD Installation Notes</title>
-    <para>
-      For instructions on how to set up Bugzilla on FreeBSD, NetBSD, OpenBSD, BSDi, etc. please
-      consult <xref linkend="osx">.
-    </para>
-  </section>
-  
-  
-  <section id="geninstall" xreflabel="Installation General Notes">
-    <title>Installation General Notes</title>
+      </para>
+
+      <para>After two days have passed you'll be able to view bug graphs from
+      the Bug Reports page.</para>
+    </section>
+
     <section>
-      <title>Modifying Your Running System</title>
+      <title>The Whining Cron</title>
+
+      <para>By now you have a fully functional Bugzilla, but what good are
+      bugs if they're not annoying? To help make those bugs more annoying you
+      can set up Bugzilla's automatic whining system to complain at engineers
+      which leave their bugs in the NEW state without triaging them.
+      </para>
       <para>
-	Bugzilla optimizes database lookups by storing all relatively static
-	information in the versioncache file, located in the data/ subdirectory
-	under your installation directory.
+      This can be done by
+      adding the following command as a daily crontab entry (for help on that
+      see that crontab man page): 
+      <simplelist>
+        <member>
+          <computeroutput>
+            <command>cd &lt;your-bugzilla-directory&gt; ;
+            ./whineatnews.pl</command>
+          </computeroutput>
+        </member>
+      </simplelist>
+      </para>
+
+      <tip>
+        <para>Depending on your system, crontab may have several manpages.
+        The following command should lead you to the most useful page for
+        this purpose: 
+        <programlisting>man 5 crontab</programlisting>
+        </para>
+      </tip>
+    </section>
+
+    <section id="bzldap">
+      <title>LDAP Authentication</title>
+      <para>
+        <warning>
+          <para>This information on using the LDAP
+            authentication options with Bugzilla is old, and the authors do
+            not know of anyone who has tested it. Approach with caution.
+          </para>
+        </warning>
       </para>
+      
       <para>
-	If you make a change to the structural data in your database
-	(the versions table for example), or to the
-	<quote>constants</quote> encoded in defparams.pl, you will
-	need to remove the cached content from the data directory
-	(by doing a <quote>rm data/versioncache</quote>), or your
-	changes won't show up.
+      The existing authentication
+      scheme for Bugzilla uses email addresses as the primary user ID, and a
+      password to authenticate that user. All places within Bugzilla where
+      you need to deal with user ID (e.g assigning a bug) use the email
+      address. The LDAP authentication builds on top of this scheme, rather
+      than replacing it. The initial log in is done with a username and
+      password for the LDAP directory. This then fetches the email address
+      from LDAP and authenticates seamlessly in the standard Bugzilla
+      authentication scheme using this email address. If an account for this
+      address already exists in your Bugzilla system, it will log in to that
+      account. If no account for that email address exists, one is created at
+      the time of login. (In this case, Bugzilla will attempt to use the
+      "displayName" or "cn" attribute to determine the user's full name.)
+      After authentication, all other user-related tasks are still handled by
+      email address, not LDAP username. You still assign bugs by email
+      address, query on users by email address, etc.
       </para>
+      
+      <para>Using LDAP for Bugzilla authentication requires the 
+      Mozilla::LDAP (aka PerLDAP) Perl module. The
+      Mozilla::LDAP module in turn requires Netscape's Directory SDK for C.
+      After you have installed the SDK, then install the PerLDAP module.
+      Mozilla::LDAP and the Directory SDK for C are both 
+      <ulink url="http://www.mozilla.org/directory/">available for
+      download</ulink> from mozilla.org. 
+      </para>
+      
       <para>
-	That file gets automatically regenerated whenever it's more than an
-	hour old, so Bugzilla will eventually notice your changes by itself, but
-	generally you want it to notice right away, so that you can test things.
+      Set the Param 'useLDAP' to "On" **only** if you will be using an LDAP
+      directory for
+      authentication. Be very careful when setting up this parameter; if you
+      set LDAP authentication, but do not have a valid LDAP directory set up,
+      you will not be able to log back in to Bugzilla once you log out. (If
+      this happens, you can get back in by manually editing the data/params
+      file, and setting useLDAP back to 0.)
       </para>
+      
+      <para>If using LDAP, you must set the
+      three additional parameters: Set LDAPserver to the name (and optionally
+      port) of your LDAP server. If no port is specified, it defaults to the
+      default port of 389. (e.g "ldap.mycompany.com" or
+      "ldap.mycompany.com:1234") Set LDAPBaseDN to the base DN for searching
+      for users in your LDAP directory. (e.g. "ou=People,o=MyCompany") uids
+      must be unique under the DN specified here. Set LDAPmailattribute to
+      the name of the attribute in your LDAP directory which contains the
+      primary email address. On most directory servers available, this is
+      "mail", but you may need to change this.
+      </para>      
     </section>
-    <section>
-      <title>Upgrading From Previous Versions</title>
+    
+    <section id="content-type"
+    xreflabel="Preventing untrusted Bugzilla content from executing malicious Javascript code">
+
+      <title>Preventing untrusted Bugzilla content from executing malicious
+      Javascript code</title>
+
+      <para>It is possible for a Bugzilla to execute malicious Javascript
+      code. Due to internationalization concerns, we are unable to
+      incorporate the code changes necessary to fulfill the CERT advisory
+      requirements mentioned in 
+      <ulink
+      url="http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3">
+      http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3</ulink>.
+      Executing the following code snippet from a UNIX command shell will
+      rectify the problem if your Bugzilla installation is intended for an
+      English-speaking audience. As always, be sure your Bugzilla
+      installation has a good backup before making changes, and I recommend
+      you understand what the script is doing before executing it.</para>
+
       <para>
-	The developers of Bugzilla are constantly adding new tables, columns and
-	fields.  You'll get SQL errors if you just update the code.  The strategy
-	to update is to simply always run the checksetup.pl script whenever
-	you upgrade your installation of Bugzilla.  If you want to see what has
-	changed, you can read the comments in that file, starting from the end.
+        <programlisting>bash# perl -pi -e "s/Content-Type\: text\/html/Content-Type\: text\/html\; charset=ISO-8859-1/i" *.cgi *.pl
+        </programlisting>
+      </para>
+
+      <para>All this one-liner command does is search for all instances of 
+      <quote>Content-type: text/html</quote>
+
+      and replaces it with 
+      <quote>Content-Type: text/html; charset=ISO-8859-1</quote>
+
+      . This specification prevents possible Javascript attacks on the
+      browser, and is suggested for all English-speaking sites. For
+      non-English-speaking Bugzilla sites, I suggest changing 
+      <quote>ISO-8859-1</quote>, above, to 
+      <quote>UTF-8</quote>.</para>
+      
+      <para>Note: using &lt;meta&gt; tags to set the charset is not
+      recommended, as there's a bug in Netscape 4.x which causes pages
+      marked up in this way to load twice.</para>
+    </section>    
+    
+    <section id="htaccess" xreflabel=".htaccess files and security">
+      <title>
+      <filename>.htaccess</filename>
+      files and security</title>
+
+      <para>To enhance the security of your Bugzilla installation, Bugzilla's
+      <filename>checksetup.pl</filename> script will generate 
+      <glossterm>
+        <filename>.htaccess</filename>
+      </glossterm>
+
+      files which the Apache webserver can use to restrict access to the
+      bugzilla data files. 
+      These .htaccess files will not work with Apache 1.2.x - but this
+      has security holes, so you shouldn't be using it anyway. 
+      <note>
+        <para>If you are using an alternate provider of 
+        <productname>webdot</productname>
+
+        services for graphing (as described when viewing 
+        <filename>editparams.cgi</filename>
+
+        in your web browser), you will need to change the ip address in 
+        <filename>data/webdot/.htaccess</filename>
+
+        to the ip address of the webdot server that you are using.</para>
+      </note>
       </para>
+
+      <para>The default .htaccess file may not provide adequate access
+      restrictions, depending on your web server configuration. Be sure to
+      check the &lt;Directory&gt; entries for your Bugzilla directory so that
+      the 
+      <filename>.htaccess</filename>
+
+      file is allowed to override web server defaults. For instance, let's
+      assume your installation of Bugzilla is installed to 
+      <filename>/usr/local/bugzilla</filename>
+
+      . You should have this &lt;Directory&gt; entry in your 
+      <filename>httpd.conf</filename>
+
+      file:</para>
+
       <para>
-	If you are running Bugzilla version 2.8 or lower, and wish to upgrade to
-	the latest version, please consult the file, "UPGRADING-pre-2.8" in the
-	Bugzilla root directory after untarring the archive.
+      
+<programlisting><![CDATA[
+  <Directory /usr/local/bugzilla/>
+  Options +FollowSymLinks +Indexes +Includes +ExecCGI
+  AllowOverride All
+</Directory>
+]]></programlisting>
+
       </para>
+
+      <para>The important part above is 
+      <quote>AllowOverride All</quote>
+
+      . Without that, the 
+      <filename>.htaccess</filename>
+
+      file created by 
+      <filename>checksetup.pl</filename>
+
+      will not have sufficient permissions to protect your Bugzilla
+      installation.</para>
+
+      <para>If you are using Internet Information Server (IIS) or another 
+      web server which does not observe 
+      <filename>.htaccess</filename>
+      conventions, you can disable their creation by editing 
+      <filename>localconfig</filename>
+      and setting the 
+      <varname>$create_htaccess</varname>
+      variable to 
+      <parameter>0</parameter>.
+      </para>
+    </section>
+
+    <section id="mod-throttle"
+    xreflabel="Using mod_throttle to prevent Denial of Service attacks">
+      <title>
+      <filename>mod_throttle</filename>
+
+      and Security</title>
+
+      <para>It is possible for a user, by mistake or on purpose, to access
+      the database many times in a row which can result in very slow access
+      speeds for other users. If your Bugzilla installation is experiencing
+      this problem , you may install the Apache module 
+      <filename>mod_throttle</filename>
+
+      which can limit connections by ip-address. You may download this module
+      at 
+      <ulink url="http://www.snert.com/Software/Throttle/">
+      http://www.snert.com/Software/Throttle/</ulink>. 
+      Follow the instructions to install into your Apache install. 
+      <emphasis>This module only functions with the Apache web
+      server!</emphasis>
+      You may use the 
+      <command>ThrottleClientIP</command>
+
+      command provided by this module to accomplish this goal. See the 
+      <ulink url="http://www.snert.com/Software/Throttle/">Module
+      Instructions</ulink>
+      for more information.</para>
     </section>
+  </section>
+
+  <section id="win32" xreflabel="Win32 Installation Notes">
+    <title>Win32 Installation Notes</title>
+
+    <para>This section covers installation on Microsoft Windows. 
+    Bugzilla has been made to work on Win32 platforms, but the Bugzilla team
+    wish to emphasise that The easiest way to install Bugzilla on
+    Intel-archiecture machines
+    is to install some variant of GNU/Linux, then follow the UNIX
+    installation instructions in this Guide. If you have any influence in the
+    platform choice for running this system, please choose GNU/Linux instead
+    of Microsoft Windows.</para>
+
+    <warning>
+      <para>After that warning, here's the situation for 2.16
+      and Windows. It doesn't work at all out of the box. 
+      You are almost certainly better off getting
+      the 2.17 version from CVS (after consultation with the Bugzilla Team to
+      make sure you are pulling on a stable day) because we'll be doing a load
+      of work to make the Win32 experience more pleasant than it is now.
+      </para>
+    </warning>
+
+    <para>
+    If you still want to try this, to have any hope of getting it to work,
+    you'll need to apply the 
+    <ulink url="">mail patch</ulink> from 
+    <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=124174">bug 124174</ulink>.
+    After that, you'll need to read the (outdated) installation 
+    instructions below, some (probably a lot better) <ulink url="http://bugzilla.mozilla.org/attachment.cgi?id=84430&amp;action=view">more
+     recent ones</ulink> kindly provided by Toms Baugis and Jean-Sebastien 
+     Guay, and also check the 
+     <ulink url="http://www.bugzilla.org/releases/2.16/docs/win32.html">Bugzilla 2.16 Win32 update page
+     </ulink>. If we get time,
+     we'll write some better installation instructions for 2.16 and put
+     them up there. But no promises.
+    </para>
+    
+    <section id="wininstall" xreflabel="Win32 Installation: Step-by-step">
+      <title>Win32 Installation: Step-by-step</title>
+
+      <note>
+        <para>You should be familiar with, and cross-reference, the rest of
+        the 
+        <xref linkend="installation" />
+
+        section while performing your Win32 installation.</para>
+
+        <para>Making Bugzilla work on Microsoft Windows is no picnic. Support
+        for Win32 has improved dramatically in the last few releases, but, if
+        you choose to proceed, you should be a 
+        <emphasis>very</emphasis>
+
+        skilled Windows Systems Administrator with strong troubleshooting
+        abilities, a high tolerance for pain, and moderate perl skills.
+        Bugzilla on NT requires hacking source code and implementing some
+        advanced utilities. What follows is the recommended installation
+        procedure for Win32; additional suggestions are provided in 
+        <xref linkend="faq" />
+
+        .</para>
+      </note>
+
+      <procedure>
+        <step>
+          <para>Install 
+          <ulink url="http://www.apache.org/">Apache Web Server</ulink>
+
+          for Windows, and copy the Bugzilla files somewhere Apache can serve
+          them. Please follow all the instructions referenced in 
+          <xref linkend="installation" />
+
+          regarding your Apache configuration, particularly instructions
+          regarding the 
+          <quote>AddHandler</quote>
+
+          parameter and 
+          <quote>ExecCGI</quote>
+
+          .</para>
+
+          <note>
+            <para>You may also use Internet Information Server or Personal
+            Web Server for this purpose. However, setup is quite different.
+            If ActivePerl doesn't seem to handle your file associations
+            correctly (for .cgi and .pl files), please consult 
+            <xref linkend="faq" />
+
+            .</para>
+
+            <para>If you are going to use IIS, if on Windows NT you must be
+            updated to at least Service Pack 4. Windows 2000 ships with a
+            sufficient version of IIS.</para>
+          </note>
+        </step>
+
+        <step>
+          <para>Install 
+          <ulink url="http://www.activestate.com/">ActivePerl</ulink>
+
+          for Windows. Check 
+          <ulink
+          url="http://aspn.activestate.com/ASPN/Downloads/ActivePerl/">
+          http://aspn.activestate.com/ASPN/Downloads/ActivePerl</ulink>
+
+          for a current compiled binary.</para>
+
+          <para>Please also check the following links to fully understand the
+          status of ActivePerl on Win32: 
+          <ulink url="http://language.perl.com/newdocs/pod/perlport.html">
+          Perl Porting</ulink>
+
+          , and 
+          <ulink
+          url="http://ftp.univie.ac.at/packages/perl/ports/nt/FAQ/perlwin32faq5.html">
+          Perl on Win32 FAQ</ulink>
+          </para>
+        </step>
+
+        <step>
+          <para>Use ppm from your perl\bin directory to install the following
+          packs: DBI, DBD-Mysql, TimeDate, Chart, Date-Calc, Date-Manip, GD,
+          AppConfig, and Template. You may need to extract them from .zip
+          format using Winzip or other unzip program first. Most of these
+          additional ppm modules can be downloaded from ActiveState, but
+          AppConfig and Template should be obtained from OpenInteract using 
+          <ulink type="http" url="http://openinteract.sourceforge.net/">the
+          instructions on the Template Toolkit web site</ulink>
+
+          .</para>
+
+          <note>
+            <para>You can find a list of modules at 
+            <ulink
+            url="http://www.activestate.com/PPMPackages/zips/5xx-builds-only">
+            http://www.activestate.com/PPMPackages/zips/5xx-builds-only/</ulink>
+
+            or 
+            <ulink url="http://www.activestate.com/PPMPackages/5.6plus">
+            http://www.activestate.com/PPMPackages/5.6plus</ulink>
+            </para>
+          </note>
+
+          <para>The syntax for ppm is: 
+          <computeroutput>
+            <prompt>C:&gt;</prompt>
+
+            <command>ppm &lt;modulename&gt;</command>
+          </computeroutput>
+          </para>
+
+          <example>
+            <title>Installing ActivePerl ppd Modules on Microsoft
+            Windows</title>
+
+            <para>
+              <prompt>C:&gt;</prompt>
+
+              <command>ppm 
+              <option>DBD-Mysql</option>
+              </command>
+            </para>
+
+            <para>Watch your capitalization!</para>
+          </example>
+
+          <para>ActiveState's 5.6Plus directory also contains an AppConfig
+          ppm, so you might see the following error when trying to install
+          the version at OpenInteract:</para>
+
+          <para>
+            <computeroutput>Error installing package 'AppConfig': Read a PPD
+            for 'AppConfig', but it is not intended for this build of Perl
+            (MSWin32-x86-multi-thread)</computeroutput>
+          </para>
+
+          <para>If so, download both 
+          <ulink
+          url="http://openinteract.sourceforge.net/ppmpackages/AppConfig.tar.gz">
+          the tarball</ulink>
+
+          and 
+          <ulink
+          url="http://openinteract.sourceforge.net/ppmpackages/AppConfig.ppd">
+          the ppd</ulink>
+
+          directly from OpenInteract, then run ppm from within the same
+          directory to which you downloaded those files and install the
+          package by referencing the ppd file explicitly via in the install
+          command, f.e.: 
+          <example>
+            <title>Installing OpenInteract ppd Modules manually on Microsoft
+            Windows</title>
+
+            <para>
+              <computeroutput>
+                <command>install 
+                <filename>C:\AppConfig.ppd</filename>
+                </command>
+              </computeroutput>
+            </para>
+          </example>
+          </para>
+        </step>
 
-    <section id="htaccess" xreflabel=".htaccess files and security">
-      <title><filename>.htaccess</filename> files and security</title>
-      <para>
-	To enhance the security of your Bugzilla installation,
-	Bugzilla  will generate
-	<glossterm><filename>.htaccess</filename></glossterm> files
-	which the Apache webserver can use to restrict  access to
-	the bugzilla data files. The checksetup script  will
-	generate the <filename>.htaccess</filename> files.
-	
-	<note>
-	  <para>
-	    If you are using an alternate provider of
-	    <productname>webdot</productname> services for graphing
-	    (as described when viewing
-	    <filename>editparams.cgi</filename> in your web
-	    browser), you will need to change  the ip address in
-	    <filename>data/webdot/.htaccess</filename> to the ip
-	    address of the webdot server that  you are using. 
-	  </para>
-	</note>
-	
-      </para>
-      <para>
-	If you are using Internet Information Server or other web
-	server which does not observe <filename>.htaccess</filename>
-	conventions, you can disable their creation by editing
-	<filename>localconfig</filename> and setting the
-	<varname>$create_htaccess</varname> variable to
-	<parameter>0</parameter>.
-      </para>
-    </section>
+        <step>
+          <para>Install MySQL for NT. 
+          <note>
+            <para>You can download MySQL for Windows NT from 
+            <ulink url="http://www.mysql.com/">MySQL.com</ulink>
 
-    <section id="mod_throttle" xreflabel="Using mod_throttle to prevent Denial of Service attacks">
-    	<title><filename>mod_throttle</filename> and Security</title>
-      <para>
-	It is possible for a user, by mistake or on purpose, to access
-	the database many times in a row which can result in very slow
-	access speeds for other users.  If your Bugzilla installation
-	is experiencing this problem , you may install  the Apache
-	module <filename>mod_throttle</filename> which can limit
-	connections by ip-address. You may download this module at
-	<ulink
-	       url="http://www.snert.com/Software/Throttle/">http://www.snert.com/Software/Throttle/</ulink>. Follow the instructions to install into your Apache install.  <emphasis>This module only functions with the Apache web server!</emphasis>. You may use the <command>ThrottleClientIP</command> command provided by this module  to accomplish this goal. See the <ulink url="http://www.snert.com/Software/Throttle/">Module Instructions</ulink> for more  information. </para>
-    </section>
-    
-    <section id="content_type" xreflabel="Preventing untrusted Bugzilla contentfrom executing malicious Javascript code">
-      <title>Preventing untrusted Bugzilla content from executing malicious Javascript code</title>
-      <para>It is possible for a Bugzilla to execute malicious
-	Javascript code.  Due to internationalization concerns, we are
-	unable to incorporate the code changes necessary to fulfill
-	the CERT advisory requirements mentioned in <ulink
-							   url="http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3">http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3</ulink>.  Executing the following code snippet from a UNIX command shell will rectify the problem if your Bugzilla installation is intended for an English-speaking audience.  As always, be sure your Bugzilla installation has a good backup before making changes, and I recommend you understand what the script is doing before executing it. </para>
-	<para><programlisting>
-bash# cd $BUGZILLA_HOME; for i in `ls *.cgi`; \
-	  do cat $i | sed 's/Content-type\: text\/html/Content-Type: text\/html\; charset=ISO-8859-1/' >$i.tmp; \
-	  mv $i.tmp $i; done
-	</programlisting></para>
-      <para>
-	All this one-liner command does is search for all instances of
-	<quote>Content-type: text/html</quote> and replaces it with
-	<quote>Content-Type: text/html; charset=ISO-8859-1</quote>.
-	This specification prevents possible Javascript attacks on the
-	browser, and is suggested for all English-speaking sites.  For
-	non-english-speaking Bugzilla sites, I suggest changing
-	<quote>ISO-8859-1</quote>, above, to <quote>UTF-8</quote>.
-      </para>
-    </section>
+            . Some find it helpful to use the WinMySqlAdmin utility, included
+            with the download, to set up the database.</para>
+          </note>
+          </para>
+        </step>
 
-    
-    <section id="unixhistory">
-      <title>UNIX Installation Instructions History</title>
-      <para>
-	This document was originally adapted from the Bonsai
-	installation instructions by Terry Weissman
-	&lt;terry@mozilla.org&gt;.
-      </para>
-      <para>
-	The February 25, 1999 re-write of this page was done by Ry4an
-	Brase &lt;ry4an@ry4an.org&gt;, with some edits by Terry
-	Weissman, Bryce Nesbitt, Martin Pool, & Dan Mosedale (But
-	don't send bug reports to them; report them using bugzilla, at <ulink
-	url="http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla">http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla</ulink> ).
-      </para>
-      <para>
-	This document was heavily modified again Wednesday, March 07
-	2001 to reflect changes for Bugzilla 2.12 release by Matthew
-	P. Barnson.  The securing MySQL section should be changed to
-	become standard procedure for Bugzilla installations.
-      </para>
-      <para>
-	Finally, the README in its entirety was marked up in SGML and
-	included into the Guide on April 24, 2001 by Matt Barnson.
-	Since that time, it's undergone extensive modification as
-	Bugzilla grew.
-      </para>
-      <para>
-	Comments from people using this Guide for the first time are
-	particularly welcome.
-      </para>
-    </section>
-  </section>
-  
-  <section id="win32" xreflabel="Win32 Installation Notes">
-    <title>Win32 Installation Notes</title>
-    <para>This section covers installation on Microsoft Windows 95,
-      98, ME, NT, and 2000.  Bugzilla works fine on Win32 platforms,
-      but please remember that the Bugzilla team and the author of the
-      Guide neither endorse nor support installation on Microsoft
-      Windows.  Bugzilla installs and runs <emphasis>best</emphasis>
-      and <emphasis>easiest</emphasis> on UNIX-like operating systems,
-      and that is the way it will stay for the foreseeable future. The
-      Bugzilla team is considering supporting Win32 for the 2.16
-      release and later.</para>
-    <para>The easiest way to install Bugzilla on Intel-archiecture
-      machines is to install some variant of GNU/Linux, then follow
-      the UNIX installation instructions in this Guide.  If you have
-      any influence in the platform choice for running this system,
-      please choose GNU/Linux instead of Microsoft Windows.</para>
+        <step>
+          <para>Setup MySQL</para>
 
-    <section id="wininstall" xreflabel="Win32 Installation: Step-by-step">
-      <title>Win32 Installation: Step-by-step</title>
-      <note>
-	<para>
-	  You should be familiar with, and cross-reference, the rest
-	  of the  
-	  <xref linkend="installation"> section while performing your
-	  Win32 installation.
-	</para>
-	<para>  Making Bugzilla work on Microsoft Windows is no
-	  picnic.  Support for Win32 has improved dramatically in the
-	  last few releases, but, if you choose to proceed, you should
-	  be a <emphasis>very</emphasis> skilled Windows Systems
-	  Administrator with strong troubleshooting abilities, a high
-	  tolerance for pain, and moderate perl skills. Bugzilla on NT
-	  requires hacking source code and implementing some advanced
-	  utilities.  What follows is the recommended installation
-	  procedure for Win32; additional suggestions are provided in
-	  <xref linkend="faq">.
-	</para>
-      </note>
-      
-      <procedure>
-	<step>
-	  <para>
-	    Install <ulink url="http://www.apache.org/">Apache Web
-	      Server</ulink> for Windows, and copy the Bugzilla files
-	    somewhere Apache can serve them.  Please follow all the
-	    instructions referenced in <xref linkend="installation">
-	    regarding your Apache configuration, particularly
-	    instructions regarding the <quote>AddHandler</quote>
-	    parameter and <quote>ExecCGI</quote>.
-	  </para>
-	  <note>
-	    <para>
-	      You may also use Internet Information Server or Personal
-	      Web Server for this purpose.  However, setup is quite
-	      different.  If ActivePerl doesn't seem to handle your
-	      file associations correctly (for .cgi and .pl files),
-	      please consult <xref linkend="faq">.
-	    </para>
-	    <para>
-	      If you are going to use IIS, if on Windows NT you must
-	      be updated to at least Service Pack 4.  Windows 2000
-	      ships with a sufficient version of IIS.
-	    </para>
-	  </note>
-	</step>
-	<step>
-	  <para>
-	    Install <ulink url="http://www.activestate.com/">ActivePerl</ulink> for Windows.  Check <ulink url="http://aspn.activestate.com/ASPN/Downloads/ActivePerl/">http://aspn.activestate.com/ASPN/Downloads/ActivePerl</ulink> for a current compiled binary.
-	  </para>
-	  <para>
-	    Please also check the following links to fully understand the status
-	    of ActivePerl on Win32:
-	    <ulink url="http://language.perl.com/newdocs/pod/perlport.html">
-	      Perl Porting</ulink>, and
-	    <ulink url="http://ftp.univie.ac.at/packages/perl/ports/nt/FAQ/perlwin32faq5.html">
-	      Perl on Win32 FAQ</ulink>
-	  </para>
-	</step>
-	<step>
-	  <para>
-	    Use ppm from your perl\bin directory to install the following packs: DBI,
-	    DBD-Mysql, TimeDate, Chart, Date-Calc, Date-Manip, and GD.  You may need
-	    to extract them from .zip format using Winzip or other unzip program first.
-	    These additional ppm modules can be downloaded from ActiveState.
-	  </para>
-	  <note>
-	    <para>
-	      You can find a list of modules at
-	      <ulink url="http://www.activestate.com/PPMPackages/zips/5xx-builds-only">
-		http://www.activestate.com/PPMPackages/zips/5xx-builds-only/</ulink>
-	    </para>
-	  </note>
-	  <para>
-	    The syntax for ppm is:
-	    <computeroutput>
-	      <prompt>C:> </prompt><command>ppm &lt;modulename&gt;</command>
-	    </computeroutput>
-	  </para>
-
-	  <example>
-	    <title>Installing ActivePerl ppd Modules on Microsoft Windows</title>
-	    <para><prompt>C:></prompt><command>ppm
-		<option>DBD-Mysql</option></command></para>
-	    <para>Watch your capitalization!</para>
-	  </example>
-
-	  <para>
-	    You can find ActiveState ppm modules at
-	    <ulink url="http://www.activestate.com/PPMPackages/5.6plus/">
-	      http://www.activestate.com/PPMPackages/5.6plus</ulink>
-	  </para>
-	</step>
-
-	<step>
-	  <para>
-	    Install MySQL for NT.
-	    <note>
-	      <para>
-		You can download MySQL for Windows NT from <ulink url="http://www.mysql.com/">MySQL.com</ulink>.  Some find it helpful to use the WinMySqlAdmin utility, included with the download, to set up the database.
-	      </para>
-	    </note>
-	  </para>
-	</step>
-	<step>
-	  <para>
-	    Setup MySQL
-	  </para>
-	  <substeps>
-	    <step>
-	      <para>
-		<computeroutput>
-		  <prompt>C:> </prompt>
-		  <command>C:\mysql\bin\mysql -u root mysql</command>
-		</computeroutput>
-	      </para>
-	    </step>
-	    <step>
-	      <para>
-		<computeroutput>
-		  <prompt>mysql></prompt>
-		  <command>DELETE FROM user WHERE Host='localhost' AND User='';</command>
-		</computeroutput>
-	      </para>
-	    </step>
-	    <step>
-	      <para>
-		<computeroutput>
-		  <prompt>mysql></prompt>
-		  <command>UPDATE user SET Password=PASSWORD ('new_password')
-		    WHERE user='root';</command>
-		</computeroutput>
-	      </para>
-	      <para><quote>new_password</quote>, above, indicates
-		whatever password you wish to use for your
-		<quote>root</quote> user.</para>
-	    </step>
-	    <step id="ntbugs-password">
-	      <para>
-		<computeroutput>
-		  <prompt>mysql></prompt>
-		  <command>GRANT SELECT, INSERT, UPDATE, DELETE,
-		    INDEX, ALTER, CREATE, DROP, REFERENCES
-		    ON bugs.* to bugs@localhost
-		    IDENTIFIED BY 'bugs_password';</command>
-		</computeroutput>
-	      </para>
-	      <para><quote>bugs_password</quote>, above, indicates
-		whatever password you wish to use for your
-		<quote>bugs</quote> user.</para>
-	    </step>
-	    <step>
-	      <para>
-		<computeroutput>
-		  <prompt>mysql></prompt>
-		  <command>FLUSH PRIVILEGES;</command>
-		</computeroutput>
-	      </para>
-	    </step>
-	    <step>
-	      <para>
-		<computeroutput>
-		  <prompt>mysql></prompt>
-		  <command>create database bugs;</command>
-		</computeroutput>
-	      </para>
-	    </step>
-	    <step>
-	      <para>
-		<computeroutput>
-		  <prompt>mysql></prompt>
-		  <command>exit;</command>
-		</computeroutput>
-	      </para>
-	    </step>
-	    <step>
-	      <para>
-		<computeroutput>
-		  <prompt>C:></prompt>
-		  <command>C:\mysql\bin\mysqladmin -u root -p reload</command>
-		</computeroutput>
-	      </para>
-	    </step>
-	  </substeps>
-	</step>
-
-	<step>
-	  <para>
-	    Edit <filename>checksetup.pl</filename> in your Bugzilla directory.  Change
-	    this line:
-	  </para>
-	  <para>
-	    <programlisting>
-my $webservergid = getgrnam($my_webservergroup);
-	    </programlisting>
-	  </para>
-	  <para>
-	    to
-	  </para>
-	  <para>
-	    <programlisting>
-my $webservergid = $my_webservergroup;
-	    </programlisting>
-or the name of the group you wish to own the files explicitly:
-	    <programlisting>
-my $webservergid = 'Administrators'
-	    </programlisting>
-	  </para>
-	</step>
-
-	<step>
-	  <para>
-	    Run <filename>checksetup.pl</filename> from the Bugzilla directory.
-	  </para>
-	</step>
-
-	<step>
-	  <para>Edit <filename>localconfig</filename> to suit your
-	    requirements.  Set <varname>$db_pass</varname> to your
-	    <quote>bugs_password</quote> from <xref linkend="ntbugs-password">, and <varname>$webservergroup</varname> to <quote>8</quote>.</para>
-	  <note>
-	    <para>Not sure on the <quote>8</quote> for
-	      <varname>$webservergroup</varname> above.  If it's
-	      wrong, please send corrections.</para>
-	  </note>
-	</step>
-
-	<step>
-	  <para>
-	    Edit <filename>defparams.pl</filename> to suit your
-	    requirements.  Particularly, set
-	    <varname>DefParam("maintainer")</varname> and
-	    <varname>DefParam("urlbase") to match your
-	      install.</varname>
-	  </para>
-	  <note>
-	    <para>This is yet another step I'm not sure of, since the
-	      maintainer of this documentation does not maintain
-	      Bugzilla on NT.  If you can confirm or deny that this
-	      step is required, please let me know.</para>
-	  </note>
-	</step>
-
-	<step>
-	  <note>
-	    <para>
-	      There are several alternatives to Sendmail that will work on Win32.
-	      The one mentioned here is a <emphasis>suggestion</emphasis>, not
-	      a requirement.  Some other mail packages that can work include
-	      <ulink url="http://www.blat.net/">BLAT</ulink>,
-	      <ulink url="http://www.geocel.com/windmail/">Windmail</ulink>,
-	      <ulink url="http://www.dynamicstate.com/">Mercury Sendmail</ulink>,
-	      and the CPAN Net::SMTP Perl module (available in .ppm).
-	      Every option requires some hacking of the Perl scripts for Bugzilla
-	      to make it work.  The option here simply requires the least.
-	    </para>
-	  </note>
-
-	  <procedure>
-	    <step>
-	      <para>
-		Download NTsendmail, available from<ulink url="http://www.ntsendmail.com/"> www.ntsendmail.com</ulink>. You must have a "real" mail server which allows you to relay off it in your $ENV{"NTsendmail"} (which you should probably place in globals.pl)
-	      </para>
-	    </step>
-
-	    <step>
-	      <para>Put ntsendmail.pm into your .\perl\lib directory.</para>
-	    </step>
-
-	    <step>
-	      <para>Add to globals.pl:</para>
-	      <programlisting>
-# these settings configure the NTsendmail process
-use NTsendmail;
-$ENV{"NTsendmail"}="your.smtpserver.box";
-$ENV{"NTsendmail_debug"}=1;
-$ENV{"NTsendmail_max_tries"}=5;
-	      </programlisting>
-	      <note>
-		<para>
-		  Some mention to also edit
-		  <varname>$db_pass</varname> in
-		  <filename>globals.pl</filename> to be your
-		  <quote>bugs_password</quote>.  Although this may get
-		  you around some problem authenticating to your
-		  database, since globals.pl is not normally
-		  restricted by <filename>.htaccess</filename>, your
-		  database password is exposed to whoever uses your
-		  web server.
-		</para>
-	      </note>
-	    </step>
-
-	    <step>
-	      <para>
-		Find and comment out all occurences of
-		<quote><command>open(SENDMAIL</command></quote> in
-		your Bugzilla directory.  Then replace them with:
-		<programlisting>
-# new sendmail functionality
-my $mail=new NTsendmail;
-my $from="bugzilla\@your.machine.name.tld";
-my $to=$login;
-my $subject=$urlbase;
-$mail->send($from,$to,$subject,$msg);
-		</programlisting>
-	      </para>
-	      <note>
-		<para>
-		  Some have found success using the commercial product, 
-		  <productname>Windmail</productname>.
-		  You could try replacing your sendmail calls with:
-		  <programlisting>
-open SENDMAIL, "|\"C:/General/Web/tools/Windmail 4.0 Beta/windmail\" -t > mail.log";
-		  </programlisting>
-		or something to that effect.
-		</para>
-	      </note>
-	    </step>
-	  </procedure>
-	</step>
-      
-	<step>
-	  <para>
-	    Change all references in all files from
-	    <filename>processmail</filename> to
-	    <filename>processmail.pl</filename>, and
-	    rename <filename>processmail</filename> to
-	    <filename>processmail.pl</filename>.
-	  </para>
-	  <note>
-	    <para>
-	      Many think this may be a change we want to make for
-	      main-tree Bugzilla.  It's painless for the UNIX folks,
-	      and will make the Win32 people happier.
-	    </para>
-	  </note>
-	  <note>
-	    <para>
-	      Some people have suggested using the Net::SMTP Perl module instead of NTsendmail or the other options listed here.  You can change processmail.pl to make this work.
-	    <programlisting>
+          <substeps>
+            <step>
+              <para>
+                <computeroutput>
+                  <prompt>C:&gt;</prompt>
+
+                  <command>C:\mysql\bin\mysql -u root mysql</command>
+                </computeroutput>
+              </para>
+            </step>
+
+            <step>
+              <para>
+                <computeroutput>
+                  <prompt>mysql&gt;</prompt>
+
+                  <command>DELETE FROM user WHERE Host='localhost' AND
+                  User='';</command>
+                </computeroutput>
+              </para>
+            </step>
+
+            <step>
+              <para>
+                <computeroutput>
+                  <prompt>mysql&gt;</prompt>
+
+                  <command>UPDATE user SET Password=PASSWORD ('new_password')
+                  WHERE user='root';</command>
+                </computeroutput>
+              </para>
+
+              <para>
+              <quote>new_password</quote>
+
+              , above, indicates whatever password you wish to use for your 
+              <quote>root</quote>
+
+              user.</para>
+            </step>
+
+            <step id="ntbugs-password">
+              <para>
+                <computeroutput>
+                  <prompt>mysql&gt;</prompt>
+
+                  <command>GRANT SELECT, INSERT, UPDATE, DELETE, INDEX,
+                  ALTER, CREATE, DROP, REFERENCES ON bugs.* to bugs@localhost
+                  IDENTIFIED BY 'bugs_password';</command>
+                </computeroutput>
+              </para>
+
+              <para>
+              <quote>bugs_password</quote>
+
+              , above, indicates whatever password you wish to use for your 
+              <quote>bugs</quote>
+
+              user.</para>
+            </step>
+
+            <step>
+              <para>
+                <computeroutput>
+                  <prompt>mysql&gt;</prompt>
+
+                  <command>FLUSH PRIVILEGES;</command>
+                </computeroutput>
+              </para>
+            </step>
+
+            <step>
+              <para>
+                <computeroutput>
+                  <prompt>mysql&gt;</prompt>
+
+                  <command>create database bugs;</command>
+                </computeroutput>
+              </para>
+            </step>
+
+            <step>
+              <para>
+                <computeroutput>
+                  <prompt>mysql&gt;</prompt>
+
+                  <command>exit;</command>
+                </computeroutput>
+              </para>
+            </step>
+
+            <step>
+              <para>
+                <computeroutput>
+                  <prompt>C:&gt;</prompt>
+
+                  <command>C:\mysql\bin\mysqladmin -u root -p
+                  reload</command>
+                </computeroutput>
+              </para>
+            </step>
+          </substeps>
+        </step>
+
+        <step>
+          <para>Edit 
+          <filename>checksetup.pl</filename>
+
+          in your Bugzilla directory. Change this line:</para>
+
+          <para>
+            <programlisting>my $webservergid =
+            getgrnam($my_webservergroup);</programlisting>
+          </para>
+
+          <para>to</para>
+
+          <para>
+          <programlisting>my $webservergid =
+          $my_webservergroup;</programlisting>
+
+          or the name of the group you wish to own the files explicitly: 
+          <programlisting>my $webservergid =
+          'Administrators'</programlisting>
+          </para>
+        </step>
+
+        <step>
+          <para>Run 
+          <filename>checksetup.pl</filename>
+
+          from the Bugzilla directory.</para>
+        </step>
+
+        <step>
+          <para>Edit 
+          <filename>localconfig</filename>
+
+          to suit your requirements. Set 
+          <varname>$db_pass</varname>
+
+          to your 
+          <quote>bugs_password</quote>
+
+          from 
+          <xref linkend="ntbugs-password" />
+
+          , and 
+          <varname>$webservergroup</varname>
+
+          to 
+          <quote>8</quote>
+
+          .</para>
+
+          <note>
+            <para>Not sure on the 
+            <quote>8</quote>
+
+            for 
+            <varname>$webservergroup</varname>
+
+            above. If it's wrong, please send corrections.</para>
+          </note>
+        </step>
+
+        <step>
+          <para>Edit 
+          <filename>defparams.pl</filename>
+
+          to suit your requirements. Particularly, set 
+          <varname>DefParam("maintainer")</varname>
+
+          and 
+          <varname>DefParam("urlbase") to match your install.</varname>
+          </para>
+
+          <note>
+            <para>This is yet another step I'm not sure of, since the
+            maintainer of this documentation does not maintain Bugzilla on
+            NT. If you can confirm or deny that this step is required, please
+            let me know.</para>
+          </note>
+        </step>
+
+        <step>
+          <note>
+            <para>There are several alternatives to Sendmail that will work
+            on Win32. The one mentioned here is a 
+            <emphasis>suggestion</emphasis>
+
+            , not a requirement. Some other mail packages that can work
+            include 
+            <ulink url="http://www.blat.net/">BLAT</ulink>
+
+            , 
+            <ulink url="http://www.geocel.com/windmail/">Windmail</ulink>
+
+            , 
+            <ulink url="http://www.dynamicstate.com/">Mercury
+            Sendmail</ulink>
+
+            , and the CPAN Net::SMTP Perl module (available in .ppm). Every
+            option requires some hacking of the Perl scripts for Bugzilla to
+            make it work. The option here simply requires the least.</para>
+          </note>
+
+          <procedure>
+            <step>
+              <para>Download NTsendmail, available from
+              <ulink url="http://www.ntsendmail.com/">
+              www.ntsendmail.com</ulink>
+
+              . You must have a "real" mail server which allows you to relay
+              off it in your $ENV{"NTsendmail"} (which you should probably
+              place in globals.pl)</para>
+            </step>
+
+            <step>
+              <para>Put ntsendmail.pm into your .\perl\lib directory.</para>
+            </step>
+
+            <step>
+              <para>Add to globals.pl:</para>
+
+              <programlisting># these settings configure the NTsendmail
+              process use NTsendmail;
+              $ENV{"NTsendmail"}="your.smtpserver.box";
+              $ENV{"NTsendmail_debug"}=1;
+              $ENV{"NTsendmail_max_tries"}=5;</programlisting>
+
+              <note>
+                <para>Some mention to also edit 
+                <varname>$db_pass</varname>
+
+                in 
+                <filename>globals.pl</filename>
+
+                to be your 
+                <quote>bugs_password</quote>
+
+                . Although this may get you around some problem
+                authenticating to your database, since globals.pl is not
+                normally restricted by 
+                <filename>.htaccess</filename>
+
+                , your database password is exposed to whoever uses your web
+                server.</para>
+              </note>
+            </step>
+
+            <step>
+              <para>Find and comment out all occurences of 
+              <quote>
+                <command>open(SENDMAIL</command>
+              </quote>
+
+              in your Bugzilla directory. Then replace them with: 
+              <programlisting># new sendmail functionality my $mail=new
+              NTsendmail; my $from="bugzilla\@your.machine.name.tld"; my
+              $to=$login; my $subject=$urlbase;
+              $mail-&gt;send($from,$to,$subject,$msg);</programlisting>
+              </para>
+
+              <note>
+                <para>Some have found success using the commercial product, 
+                <productname>Windmail</productname>
+
+                . You could try replacing your sendmail calls with: 
+                <programlisting>open SENDMAIL,
+                "|\"C:/General/Web/tools/Windmail 4.0 Beta/windmail\" -t &gt;
+                mail.log";</programlisting>
+
+                or something to that effect.</para>
+              </note>
+            </step>
+          </procedure>
+        </step>
+
+        <step>
+          <para>Change all references in all files from 
+          <filename>processmail</filename>
+
+          to 
+          <filename>processmail.pl</filename>
+
+          , and rename 
+          <filename>processmail</filename>
+
+          to 
+          <filename>processmail.pl</filename>
+
+          .</para>
+
+          <note>
+            <para>Many think this may be a change we want to make for
+            main-tree Bugzilla. It's painless for the UNIX folks, and will
+            make the Win32 people happier.</para>
+          </note>
+
+          <note>
+            <para>Some people have suggested using the Net::SMTP Perl module
+            instead of NTsendmail or the other options listed here. You can
+            change processmail.pl to make this work. 
+            <programlisting>
 <![CDATA[
 
 my $smtp = Net::SMTP->new('<Name of your SMTP server>');   #connect to SMTP server
@@ -1656,9 +1774,10 @@ $logstr = "$logstr; mail sent to $tolist $cclist";
 }
 
 ]]>
-</programlisting>
-here is a test mail program for Net::SMTP:
-<programlisting>
+            </programlisting>
+
+            here is a test mail program for Net::SMTP: 
+            <programlisting>
 <![CDATA[
 
 use Net::SMTP;
@@ -1676,233 +1795,352 @@ recipient's address
 exit;
 
 ]]>
-</programlisting>
-	    </para>
-	  </note>
-	</step>
-	<step>
-	  <note>
-	    <para>
-	      This step is optional if you are using IIS or another
-	      web server which only decides on an interpreter based
-	      upon the file extension (.pl), rather than the
-	      <quote>shebang</quote> line (#/usr/bonsaitools/bin/perl)
-	    </para>
-	  </note>
-	  <para>
-	    Modify the path to perl on the first line (#!) of all
-	    files to point to your Perl installation, and add
-	    <quote>perl</quote> to the beginning of all Perl system
-	    calls that use a perl script as an argument.  This may
-	    take you a while. There is a <quote>setperl.csh</quote>
-	    utility to speed part of this procedure, available in the
-	    <xref linkend="patches"> section of The Bugzilla Guide.
-	    However, it requires the Cygwin GNU-compatible environment
-	    for Win32 be set up in order to work.  See <ulink url="http://www.cygwin.com/">http://www.cygwin.com/</ulink> for details on obtaining Cygwin.
-	  </para>
-	</step>
-
-	<step>
-	  <para>
-	    Modify the invocation of all system() calls in all perl
-	    scripts in your Bugzilla directory.  For instance, change
-	    this line in processmail: 
-	    <programlisting> 
-system ("./processmail.pl",@ARGLIST); 
-	    </programlisting> to
-	    <programlisting> 
-system ("perl processmail.pl",@ARGLIST);
-	    </programlisting>
-	  </para>
-	</step>
+            </programlisting>
+            </para>
+          </note>
+        </step>
+
         <step>
-          <para>
-            Add <function>binmode()</function> calls so attachments
-	    will work (<ulink
-			      url="http://bugzilla.mozilla.org/show_bug.cgi?id=62000">bug 62000</ulink>).
+          <note>
+            <para>This step is optional if you are using IIS or another web
+            server which only decides on an interpreter based upon the file
+            extension (.pl), rather than the 
+            <quote>shebang</quote>
+
+            line (#/usr/bonsaitools/bin/perl)</para>
+          </note>
+
+          <para>Modify the path to perl on the first line (#!) of all files
+          to point to your Perl installation, and add 
+          <quote>perl</quote>
+
+          to the beginning of all Perl system calls that use a perl script as
+          an argument. This may take you a while. There is a 
+          <quote>setperl.csh</quote>
+
+          utility to speed part of this procedure, available in the 
+          <xref linkend="patches" />
+
+          section of The Bugzilla Guide. However, it requires the Cygwin
+          GNU-compatible environment for Win32 be set up in order to work.
+          See 
+          <ulink url="http://www.cygwin.com/">http://www.cygwin.com/</ulink>
+
+          for details on obtaining Cygwin.</para>
+        </step>
+
+        <step>
+          <para>Modify the invocation of all system() calls in all perl
+          scripts in your Bugzilla directory. You should specify the full
+          path to perl for each system() call. For instance, change this line
+          in processmail: 
+          <programlisting>
+<![CDATA[ 
+system ("./processmail",@ARGLIST); 
+        </programlisting> to
+        <programlisting> 
+system ("C:\\perl\\bin\\perl", "processmail", @ARGLIST);
+]]>
+          </programlisting>
           </para>
+        </step>
+
+        <step>
+          <para>Add 
+          <function>binmode()</function>
+
+          calls so attachments will work (
+          <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=62000">bug
+          62000</ulink>
+
+          ).</para>
+
+          <para>Because Microsoft Windows based systems handle binary files
+          different than Unix based systems, you need to add the following
+          lines to 
+          <filename>createattachment.cgi</filename>
+
+          and 
+          <filename>showattachment.cgi</filename>
+
+          before the 
+          <function>require 'CGI.pl';</function>
+
+          line.</para>
+
           <para>
-            Because Microsoft Windows based systems handle binary
-	    files different than Unix based systems, you need to add
-	    the following lines to
-	    <filename>createattachment.cgi</filename>  and
-	    <filename>showattachment.cgi</filename> before the
-	    <function>require 'CGI.pl';</function> line.
-</para>
-<para>
-<programlisting>
+            <programlisting>
 <![CDATA[
 binmode(STDIN);
 binmode(STDOUT);
 ]]>
-</programlisting>
+            </programlisting>
           </para>
+
           <note>
-            <para>
-              According to <ulink
-				  url="http://bugzilla.mozilla.org/show_bug.cgi?id=62000">bug 62000</ulink>, the perl documentation says that you should always use <function>binmode()</function> when dealing with binary files, but never when dealing with text files.  That seems to suggest that rather than aribtrarily putting <function>binmode()</function> at the begining of the attachment files, there should be logic to determine if <function>binmode()</function> is needed or not.
-            </para>
+            <para>According to 
+            <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=62000">
+            bug 62000</ulink>
+
+            , the perl documentation says that you should always use 
+            <function>binmode()</function>
+
+            when dealing with binary files, but never when dealing with text
+            files. That seems to suggest that rather than arbitrarily putting
+            
+            <function>binmode()</function>
+
+            at the beginning of the attachment files, there should be logic
+            to determine if 
+            <function>binmode()</function>
+
+            is needed or not.</para>
           </note>
         </step>
       </procedure>
 
       <tip>
-	<para>
-	  If you are using IIS or Personal Web Server, you must add cgi
-	  relationships to Properties -> Home directory (tab) ->
-	  Application Settings (section) -> Configuration (button),
-	  such as: 
-	</para>
-	<para>
-	  <programlisting> 
-.cgi to: &lt;perl install directory&gt;\perl.exe %s %s
-.pl to: &lt;perl install directory&gt;\perl.exe %s %s
-GET,HEAD,POST
-	  </programlisting> 
-	  Change the path to Perl to match your
-	  install, of course.
-	</para>
+        <para>If you are using IIS or Personal Web Server, you must add cgi
+        relationships to Properties -&gt; Home directory (tab) -&gt;
+        Application Settings (section) -&gt; Configuration (button), such
+        as:</para>
+
+        <para>
+        <programlisting>.cgi to: &lt;perl install directory&gt;\perl.exe %s
+        %s .pl to: &lt;perl install directory&gt;\perl.exe %s %s
+        GET,HEAD,POST</programlisting>
+
+        Change the path to Perl to match your install, of course.</para>
       </tip>
     </section>
 
     <section id="addlwintips">
       <title>Additional Windows Tips</title>
+
       <tip>
-	<para>
-	  From Andrew Pearson:
-	  <blockquote>
-	    <para>
-	      You can make Bugzilla work with Personal Web Server for
-	      Windows 98 and higher, as well as for IIS 4.0.
-	      Microsoft has information available at <ulink url="
-							    http://support.microsoft.com/support/kb/articles/Q231/9/98.ASP"> http://support.microsoft.com/support/kb/articles/Q231/9/98.ASP</ulink>
-	    </para>
-	    <para>
-	      Basically you need to add two String Keys in the
-	      registry at the following location:
-	    </para>
-	    <para>
-	      <programlisting>
-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\ScriptMap
-	      </programlisting>
-	    </para>
-	    <para>
-	      The keys should be called ".pl" and ".cgi", and both
-	      should have a value something like:
-	      <command>c:/perl/bin/perl.exe "%s" "%s"</command>
-	    </para>
-	    <para>
-	      The KB article only talks about .pl, but it goes into
-	      more detail and provides a perl test script.
-	    </para>
-	  </blockquote>
-	</para>
+        <para>From Andrew Pearson: 
+        <blockquote>
+          <para>You can make Bugzilla work with Personal Web Server for
+          Windows 98 and higher, as well as for IIS 4.0. Microsoft has
+          information available at 
+          <ulink
+          url=" http://support.microsoft.com/support/kb/articles/Q231/9/98.ASP">
+          http://support.microsoft.com/support/kb/articles/Q231/9/98.ASP</ulink>
+          </para>
+
+          <para>Basically you need to add two String Keys in the registry at
+          the following location:</para>
+
+          <para>
+            <programlisting>
+            HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\ScriptMap</programlisting>
+          </para>
+
+          <para>The keys should be called ".pl" and ".cgi", and both should
+          have a value something like: 
+          <command>c:/perl/bin/perl.exe "%s" "%s"</command>
+          </para>
+
+          <para>The KB article only talks about .pl, but it goes into more
+          detail and provides a perl test script.</para>
+        </blockquote>
+        </para>
       </tip>
+
       <tip>
-	<para>
-	  If attempting to run Bugzilla 2.12 or older, you will need
-	  to remove encrypt() calls from the Perl source. This is
-	  <emphasis>not necessary</emphasis> for Bugzilla 2.13 and
-	  later, which includes the current release, Bugzilla
-	  &bz-ver;.
-	  <example>
-	    <title>Removing encrypt() for Windows NT Bugzilla version
-	      2.12 or earlier</title>
-	    <para>
-	      Replace this:   
-	      <programlisting>  
-SendSQL("SELECT encrypt(" . SqlQuote($enteredpwd) . ", " . SQLQuote(substr($realcryptpwd, 0, 2)) . ")");
-my $enteredcryptpwd = FetchOneColumn();
-	      </programlisting> 
-with this:   
-	      <programlisting>  
-my $enteredcryptpwd = $enteredpwd   
-	      </programlisting> 
-	      in cgi.pl.
-	    </para>
-	  </example>
-	</para>
+        <para>If attempting to run Bugzilla 2.12 or older, you will need to
+        remove encrypt() calls from the Perl source. This is 
+        <emphasis>not necessary</emphasis>
+
+        for Bugzilla 2.13 and later, which includes the current release,
+        Bugzilla &amp;bz-ver;. 
+        <example>
+          <title>Removing encrypt() for Windows NT Bugzilla version 2.12 or
+          earlier</title>
+
+          <para>Replace this: 
+          <programlisting>SendSQL("SELECT encrypt(" . SqlQuote($enteredpwd) .
+          ", " . SQLQuote(substr($realcryptpwd, 0, 2)) . ")"); my
+          $enteredcryptpwd = FetchOneColumn();</programlisting>
+
+          with this: 
+          <programlisting>my $enteredcryptpwd = $enteredpwd</programlisting>
+
+          in cgi.pl.</para>
+        </example>
+        </para>
       </tip>
     </section>
+  </section>
+
+  <section id="osx">
+    <title>Mac OS X Installation Notes</title>
+
+    <para>There are a lot of common libraries and utilities out there that
+    Apple did not include with Mac OS X, but which run perfectly well on it.
+    The GD library, which Bugzilla needs to do bug graphs, is one of
+    these.</para>
+
+    <para>The easiest way to get a lot of these is with a program called
+    Fink, which is similar in nature to the CPAN installer, but installs
+    common GNU utilities. Fink is available from
+    &lt;http://sourceforge.net/projects/fink/&gt;.</para>
+
+    <para>Follow the instructions for setting up Fink. Once it's installed,
+    you'll want to run the following as root: 
+    <command>fink install gd</command>
+    </para>
+
+    <para>It will prompt you for a number of dependencies, type 'y' and hit
+    enter to install all of the dependencies. Then watch it work.</para>
+
+    <para>To prevent creating conflicts with the software that Apple installs
+    by default, Fink creates its own directory tree at /sw where it installs
+    most of the software that it installs. This means your libraries and
+    headers for libgd will be at /sw/lib and /sw/include instead of /usr/lib
+    and /usr/local/include. Because of these changed locations for the
+    libraries, the Perl GD module will not install directly via CPAN, because it
+    looks for the specific paths instead of getting them from your
+    environment. But there's a way around that :-)</para>
+
+    <para>Instead of typing 
+    <quote>install GD</quote>
+    at the 
+    <prompt>cpan&gt;</prompt>
+    prompt, type 
+    <command>look GD</command>. 
+    This should go through the motions of downloading the latest version of
+    the GD module, then it will open a shell and drop you into the build
+    directory. Apply <ulink url="../sgml/gd-makefile.patch">this patch</ulink> 
+    to the Makefile.PL file (save the
+    patch into a file and use the command 
+    <command>patch &lt; patchfile</command>.)
+    </para>
     
-    <section id="bzldap">
-      <title>Bugzilla LDAP Integration</title>
+    <para>Then, run these commands to finish the installation of the GD
+    module: 
+    <simplelist>
+      <member>
+        <command>perl Makefile.PL</command>
+      </member>
+
+      <member>
+        <command>make</command>
+      </member>
+
+      <member>
+        <command>make test</command>
+      </member>
+
+      <member>
+        <command>make install</command>
+      </member>
+
+      <member>And don't forget to run 
+      <command>exit</command>
+
+      to get back to CPAN.</member>
+    </simplelist>
+    </para>
+
+  </section>
+
+  <section id="troubleshooting">
+    <title>Troubleshooting</title>
+    
+    <para>This section gives solutions to common Bugzilla installation
+    problems.
+    </para>
+    
+    <section>
+      <title>Bundle::Bugzilla makes me upgrade to Perl 5.6.1</title>
+
+      <para>
+      Try executing <command>perl -MCPAN -e 'install CPAN'</command>
+      and then continuing.
+      </para>
+      
+      <para>
+      Certain older versions of the CPAN toolset were somewhat naive about how
+      to upgrade Perl modules. When a couple of modules got rolled into the core
+      Perl distribution for 5.6.1, CPAN thought that the best way to get those
+      modules up to date was to haul down the Perl distribution itself and
+      build it. Needless to say, this has caused headaches for just about
+      everybody. Upgrading to a newer version of CPAN with the
+      commandline above should fix things.
+      </para>
+    </section>
+
+
+    <section>
+      <title>DBD::Sponge::db prepare failed</title>
+      
+      <para>
+        The following error message may appear due to a bug in DBD::mysql
+        (over which the Bugzilla team have no control):
+      </para>
+      
+<programlisting><![CDATA[ DBD::Sponge::db prepare failed: Cannot determine NUM_OF_FIELDS at D:/Perl/site/lib/DBD/mysql.pm line 248.
+  SV = NULL(0x0) at 0x20fc444
+  REFCNT = 1
+  FLAGS = (PADBUSY,PADMY)
+]]></programlisting>
+
+      <para>
+        To fix this, go to 
+        <filename>&lt;path-to-perl&gt;/lib/DBD/sponge.pm</filename> 
+        in your Perl installation and replace
+      </para>
+        
+<programlisting><![CDATA[ my $numFields;
+ if ($attribs->{'NUM_OF_FIELDS'}) {
+     $numFields = $attribs->{'NUM_OF_FIELDS'};
+ } elsif ($attribs->{'NAME'}) {
+     $numFields = @{$attribs->{NAME}};
+]]></programlisting>
+
+      <para>
+        by
+      </para>
+
+<programlisting><![CDATA[ my $numFields;
+ if ($attribs->{'NUM_OF_FIELDS'}) {
+     $numFields = $attribs->{'NUM_OF_FIELDS'};
+ } elsif ($attribs->{'NAMES'}) {
+     $numFields = @{$attribs->{NAMES}};
+]]></programlisting>
+
       <para>
-	What follows is some late-breaking information on using the
-	LDAP authentication options with Bugzilla.  The author has not
-	tested these (nor even formatted this section!) so please
-	contribute feedback to the newsgroup.
+        (note the S added to NAME.)      
       </para>
-      <literallayout>
-Mozilla::LDAP module
-
-The Mozilla::LDAP module allows you to use LDAP for authentication to
-the Bugzilla system.  This module is not required if you are not using
-LDAP.
-
-Mozilla::LDAP (aka PerLDAP) is available for download from
-http://www.mozilla.org/directory.
-
-NOTE: The Mozilla::LDAP module requires Netscape's Directory SDK.
-Follow the link for "Directory SDK for C" on that same page to
-download the SDK first.  After you have installed this SDK, then
-install the PerLDAP module.
-----------------------------------------------------------------------
-
-Post-Installation Checklist
-----------------------------------------------------------------------
-Set useLDAP to "On" **only** if you will be using an LDAP directory
-for authentication.  Be very careful when setting up this parameter;
-if you set LDAP authentication, but do not have a valid LDAP directory
-set up, you will not be able to log back in to Bugzilla once you log
-out.  (If this happens, you can get back in by manually editing the
-data/params file, and setting useLDAP back to 0.)
-
-If using LDAP, you must set the three additional parameters:
-
-Set LDAPserver to the name (and optionally port) of your LDAP server.
-If no port is specified, it defaults to the default port of 389.  (e.g
-"ldap.mycompany.com" or "ldap.mycompany.com:1234")
-
-Set LDAPBaseDN to the base DN for searching for users in your LDAP
-directory.  (e.g. "ou=People,o=MyCompany")  uids must be unique under
-the DN specified here.
-
-Set LDAPmailattribute to the name of the attribute in your LDAP
-directory which contains the primary email address.  On most directory
-servers available, this is "mail", but you may need to change this.
-----------------------------------------------------------------------
-
-(Not sure where this bit should go, but it's important that it be in
-there somewhere...)
-----------------------------------------------------------------------
-Using LDAP authentication for Bugzilla:
-
-The existing authentication scheme for Bugzilla uses email addresses
-as the primary user ID, and a password to authenticate that user.  All
-places within Bugzilla where you need to deal with user ID (e.g
-assigning a bug) use the email address.
-
-The LDAP authentication builds on top of this scheme, rather than
-replacing it.  The initial log in is done with a username and password
-for the LDAP directory.  This then fetches the email address from LDAP
-and authenticates seamlessly in the standard Bugzilla authentication
-scheme using this email address.  If an account for this address
-already exists in your Bugzilla system, it will log in to that
-account.  If no account for that email address exists, one is created
-at the time of login.  (In this case, Bugzilla will attempt to use the
-"displayName" or "cn" attribute to determine the user's full name.)
-
-After authentication, all other user-related tasks are still handled
-by email address, not LDAP username.  You still assign bugs by email
-address, query on users by email address, etc.
-----------------------------------------------------------------------
-      </literallayout>
     </section>
+    
+    <section id="paranoid-security">
+      <title>cannot chdir(/var/spool/mqueue)</title>
+
+      <para>If you are installing Bugzilla on SuSE Linux, or some other
+      distributions with 
+      <quote>paranoid</quote>
+      security options, it is possible that the checksetup.pl script may fail
+      with the error: 
+<programlisting><![CDATA[cannot chdir(/var/spool/mqueue): Permission denied
+]]></programlisting>
+      </para>
+      
+      <para>
+      This is because your 
+      <filename>/var/spool/mqueue</filename>
+      directory has a mode of 
+      <quote>drwx------</quote>. Type 
+      <command>chmod 755 
+      <filename>/var/spool/mqueue</filename>
+      </command>
+      as root to fix this problem.
+      </para>
+    </section>    
   </section>
 </chapter>
 
-
 <!-- Keep this comment at the end of the file
 Local variables:
 mode: sgml
@@ -1923,3 +2161,4 @@ sgml-shorttag:t
 sgml-tag-region-if-active:t
 End:
 -->
+
diff --git a/docs/sgml/integration.sgml b/docs/sgml/integration.sgml
index 36cc617e2..68054ee13 100644
--- a/docs/sgml/integration.sgml
+++ b/docs/sgml/integration.sgml
@@ -1,77 +1,81 @@
 <!-- <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook V4.1//EN" > -->
-
 <!-- Keep these tools listings in alphabetical order please. -MPB -->
-
-<chapter id="integration">
+<section id="integration">
   <title>Integrating Bugzilla with Third-Party Tools</title>
 
-  <section id="bonsai" xreflabel="Bonsai, the Mozilla automated CVS management system">
+  <section id="bonsai"
+  xreflabel="Bonsai, the Mozilla automated CVS management system">
     <title>Bonsai</title>
-    <para>Bonsai is a web-based tool for managing <xref
-							linkend="cvs">
-      .  Using Bonsai, administrators can control open/closed status
-      of trees, query a fast relational database back-end for change,
-      branch, and comment information, and view changes made since the
-      last time the tree was closed.  These kinds of changes cause the
-      engineer responsible to be <quote>on the hook</quote> (include
-      cool URL link here for Hook policies at mozilla.org).  Bonsai
-      also includes gateways to <xref
-								       linkend="tinderbox"> and Bugzilla </para>
+
+    <para>Bonsai is a web-based tool for managing 
+    <xref linkend="cvs" />
+
+    . Using Bonsai, administrators can control open/closed status of trees,
+    query a fast relational database back-end for change, branch, and comment
+    information, and view changes made since the last time the tree was
+    closed. Bonsai
+    also integrates with  
+    <xref linkend="tinderbox" />.
+    </para>
   </section>
 
   <section id="cvs" xreflabel="CVS, the Concurrent Versioning System">
     <title>CVS</title>
-    <para>CVS integration is best accomplished, at this point, using
-      the Bugzilla Email Gateway.  There have been some files
-      submitted to allow greater CVS integration, but we need to make
-      certain that Bugzilla is not tied into one particular software
-      management package.</para>
-    <para>
-      Follow the instructions in the FAQ for enabling Bugzilla e-mail
-      integration.  Ensure that your check-in script sends an email to
-      your Bugzilla e-mail gateway with the subject of <quote>[Bug
-	XXXX]</quote>, and you can have CVS check-in comments append
-      to your Bugzilla bug.  If you have your check-in script include
-      an @resolution field, you can even change the Bugzilla bug
-      state.
-    </para>
-    <para>
-      There is also a project, based upon somewhat dated Bugzilla
-      code, to integrate CVS and Bugzilla through CVS' ability to
-      email.  Check it out at:
-      <ulink url="http://homepages.kcbbs.gen.nz/~tonyg/">
-      http://homepages.kcbbs.gen.nz/~tonyg/</ulink>, under the
-      <quote>cvszilla</quote> link.
+
+    <para>CVS integration is best accomplished, at this point, using the
+    Bugzilla Email Gateway.</para>
+
+    <para>Follow the instructions in this Guide for enabling Bugzilla e-mail
+    integration. Ensure that your check-in script sends an email to your
+    Bugzilla e-mail gateway with the subject of 
+    <quote>[Bug XXXX]</quote>, 
+    and you can have CVS check-in comments append to your Bugzilla bug. If
+    you have your check-in script include an @resolution field, you can even
+    change the Bugzilla bug state.</para>
+
+    <para>There is also a CVSZilla project, based upon somewhat dated 
+    Bugzilla code, to integrate CVS and Bugzilla through CVS' ability to 
+    email. Check it out at: 
+    <ulink url="http://homepages.kcbbs.gen.nz/~tonyg/">
+    http://homepages.kcbbs.gen.nz/~tonyg/</ulink>.
     </para>
   </section>
 
-  <section id="scm" xreflabel="Perforce SCM (Fast Software Configuration Management System, a powerful commercial alternative to CVS">
+  <section id="scm"
+  xreflabel="Perforce SCM (Fast Software Configuration Management System, a powerful commercial alternative to CVS">
+
     <title>Perforce SCM</title>
-    <para>
-      You can find the project page for Bugzilla and Teamtrack
-      Perforce integration (p4dti) at: <ulink
-					      url="http://www.ravenbrook.com/project/p4dti/"> http://www.ravenbrook.com/project/p4dti</ulink> .  <quote>p4dti</quote> is now an officially supported product from Perforce, and you can find the "Perforce Public Depot" p4dti page at <ulink url="http://public.perforce.com/public/perforce/p4dti/index.html"> http://public.perforce.com/public/perforce/p4dti/index.html</ulink>.
-    </para>
-    <para>
-      Integration of Perforce with Bugzilla, once patches are applied,
-      is seamless.  Perforce replication information will appear below
-      the comments of each bug.  Be certain you have a matching set of
-      patches for the Bugzilla version you are installing.  p4dti is
-      designed to support multiple defect trackers, and maintains its
-      own documentation for it. Please consult the pages linked above
-      for further information.
-    </para>
-  </section>
 
-  <section id="tinderbox" xreflabel="Tinderbox, the Mozilla automated build management system">
-    <title>Tinderbox/Tinderbox2</title>
-    <para>We need Tinderbox integration information.</para>
-  </section>
+    <para>You can find the project page for Bugzilla and Teamtrack Perforce
+    integration (p4dti) at: 
+    <ulink url="http://www.ravenbrook.com/project/p4dti/">
+    http://www.ravenbrook.com/project/p4dti</ulink>
 
-</chapter>
+    . 
+    <quote>p4dti</quote>
 
+    is now an officially supported product from Perforce, and you can find
+    the "Perforce Public Depot" p4dti page at 
+    <ulink url="http://public.perforce.com/public/perforce/p4dti/index.html">
+    http://public.perforce.com/public/perforce/p4dti/index.html</ulink>
 
+    .</para>
 
+    <para>Integration of Perforce with Bugzilla, once patches are applied, is
+    seamless. Perforce replication information will appear below the comments
+    of each bug. Be certain you have a matching set of patches for the
+    Bugzilla version you are installing. p4dti is designed to support
+    multiple defect trackers, and maintains its own documentation for it.
+    Please consult the pages linked above for further information.</para>
+  </section>
+
+  <section id="tinderbox"
+  xreflabel="Tinderbox, the Mozilla automated build management system">
+    <title>Tinderbox/Tinderbox2</title>
+
+    <para>We need Tinderbox integration information.</para>
+  </section>
+</section>
 
 <!-- Keep this comment at the end of the file
 Local variables:
@@ -93,3 +97,4 @@ sgml-shorttag:t
 sgml-tag-region-if-active:t
 End:
 -->
+
diff --git a/docs/sgml/introduction.sgml b/docs/sgml/introduction.sgml
new file mode 100644
index 000000000..33907552b
--- /dev/null
+++ b/docs/sgml/introduction.sgml
@@ -0,0 +1,149 @@
+<chapter id="introduction">
+  <title>Introduction</title>
+
+  <section id="whatis">
+    <title>What is Bugzilla?</title>
+
+    <para>
+    Bugzilla is a bug- or issue-tracking system. Bug-tracking
+    systems allow individual or groups of developers effectively to keep track
+    of outstanding problems with their product. 
+    Bugzilla was originally
+    written by Terry Weissman in a programming language called TCL, to
+    replace a rudimentary bug-tracking database used internally by Netscape
+    Communications. Terry later ported Bugzilla to Perl from TCL, and in Perl
+    it remains to this day. Most commercial defect-tracking software vendors
+    at the time charged enormous licensing fees, and Bugzilla quickly became
+    a favorite of the open-source crowd (with its genesis in the open-source
+    browser project, Mozilla). It is now the de-facto standard
+    defect-tracking system against which all others are measured.
+    </para>
+
+    <para>Bugzilla boasts many advanced features. These include: 
+    <itemizedlist>
+      <listitem>
+        <para>Powerful searching</para>
+      </listitem>
+
+      <listitem>
+        <para>User-configurable email notifications of bug changes</para>
+      </listitem>
+
+      <listitem>
+        <para>Full change history</para>
+      </listitem>
+
+      <listitem>
+        <para>Inter-bug dependency tracking and graphing</para>
+      </listitem>
+
+      <listitem>
+        <para>Excellent attachment management</para>
+      </listitem>
+
+      <listitem>
+        <para>Integrated, product-based, granular security schema</para>
+      </listitem>
+
+      <listitem>
+        <para>Fully security-audited, and runs under Perl's taint mode</para>
+      </listitem>
+
+      <listitem>
+        <para>A robust, stable RDBMS back-end</para>
+      </listitem>
+
+      <listitem>
+        <para>Web, XML, email and console interfaces</para>
+      </listitem>
+
+      <listitem>
+        <para>Completely customisable and/or localisable web user
+        interface</para>
+      </listitem>
+
+      <listitem>
+        <para>Extensive configurability</para>
+      </listitem>
+
+      <listitem>
+        <para>Smooth upgrade pathway between versions</para>
+      </listitem>
+    </itemizedlist>
+    </para>
+  </section>
+
+  <section id="why">
+    <title>Why Should We Use Bugzilla?</title>
+
+    <para>For many years, defect-tracking software has remained principally
+    the domain of large software development houses. Even then, most shops
+    never bothered with bug-tracking software, and instead simply relied on
+    shared lists and email to monitor the status of defects. This procedure
+    is error-prone and tends to cause those bugs judged least significant by
+    developers to be dropped or ignored.</para>
+
+    <para>These days, many companies are finding that integrated
+    defect-tracking systems reduce downtime, increase productivity, and raise
+    customer satisfaction with their systems. Along with full disclosure, an
+    open bug-tracker allows manufacturers to keep in touch with their clients
+    and resellers, to communicate about problems effectively throughout the
+    data management chain. Many corporations have also discovered that
+    defect-tracking helps reduce costs by providing IT support
+    accountability, telephone support knowledge bases, and a common,
+    well-understood system for accounting for unusual system or software
+    issues.</para>
+
+    <para>But why should 
+    <emphasis>you</emphasis>
+
+    use Bugzilla?</para>
+
+    <para>Bugzilla is very adaptable to various situations. Known uses
+    currently include IT support queues, Systems Administration deployment
+    management, chip design and development problem tracking (both
+    pre-and-post fabrication), and software and hardware bug tracking for
+    luminaries such as Redhat, NASA, Linux-Mandrake, and VA Systems.
+    Combined with systems such as 
+    <ulink url="http://www.cvshome.org">CVS</ulink>, 
+    <ulink url="http://www.mozilla.org/bonsai.html">Bonsai</ulink>, or 
+    <ulink url="http://www.perforce.com">Perforce SCM</ulink>, Bugzilla
+    provides a powerful, easy-to-use solution to configuration management and
+    replication problems.</para>
+
+    <para>Bugzilla can dramatically increase the productivity and
+    accountability of individual employees by providing a documented workflow
+    and positive feedback for good performance. How many times do you wake up
+    in the morning, remembering that you were supposed to do 
+    <emphasis>something</emphasis>
+    today, but you just can't quite remember? Put it in Bugzilla, and you
+    have a record of it from which you can extrapolate milestones, predict
+    product versions for integration, and  follow the discussion trail 
+    that led to critical decisions.</para>
+
+    <para>Ultimately, Bugzilla puts the power in your hands to improve your
+    value to your employer or business while providing a usable framework for
+    your natural attention to detail and knowledge store to flourish.</para>
+  </section>
+</chapter>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-always-quote-attributes:t
+sgml-auto-insert-required-elements:t
+sgml-balanced-tag-edit:t
+sgml-exposed-tags:nil
+sgml-general-insert-case:lower
+sgml-indent-data:t
+sgml-indent-step:2
+sgml-local-catalogs:nil
+sgml-local-ecat-files:nil
+sgml-minimize-attributes:nil
+sgml-namecase-general:t
+sgml-omittag:t
+sgml-parent-document:("Bugzilla-Guide.sgml" "book" "chapter")
+sgml-shorttag:t
+sgml-tag-region-if-active:t
+End:
+-->
diff --git a/docs/sgml/patches.sgml b/docs/sgml/patches.sgml
index 3f49255f2..43f816758 100644
--- a/docs/sgml/patches.sgml
+++ b/docs/sgml/patches.sgml
@@ -1,353 +1,95 @@
-<!-- <!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> -->
-
+<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
 <appendix id="patches" xreflabel="Useful Patches and Utilities for Bugzilla">
-  <title>Useful Patches and Utilities for Bugzilla</title>		
+  <title>Useful Patches and Utilities for Bugzilla</title>
 
-  <para>Are you looking for a way to put your Bugzilla into overdrive?  Catch some of the niftiest tricks here in this section.</para>
+  <para>Are you looking for a way to put your Bugzilla into overdrive? Catch
+  some of the niftiest tricks here in this section.</para>
 
   <section id="rewrite" xreflabel="Apache mod_rewrite magic">
-    <title>Apache <filename>mod_rewrite</filename> magic</title>
-    <para>Apache's <filename>mod_rewrite</filename> module lets you do some truly amazing things with URL rewriting.  Here are a couple of examples of what you can do.</para>
+    <title>Apache 
+    <filename>mod_rewrite</filename>
+
+    magic</title>
+
+    <para>Apache's 
+    <filename>mod_rewrite</filename>
+
+    module lets you do some truly amazing things with URL rewriting. Here are
+    a couple of examples of what you can do.</para>
+
     <orderedlist>
       <listitem>
-	<para>
-	  Make it so if someone types
-	  <computeroutput>http://www.foo.com/12345</computeroutput>,
-	  Bugzilla spits back
-	  http://www.foo.com/show_bug.cgi?id=12345. Try setting up
-	  your VirtualHost section for Bugzilla with a rule like
-	  this:</para>
-	<programlisting>
-<![CDATA[
+        <para>Make it so if someone types 
+        <computeroutput>http://www.foo.com/12345</computeroutput>
+
+        , Bugzilla spits back http://www.foo.com/show_bug.cgi?id=12345. Try
+        setting up your VirtualHost section for Bugzilla with a rule like
+        this:</para>
+
+        <programlisting><![CDATA[
 <VirtualHost 12.34.56.78>
 RewriteEngine On
 RewriteRule ^/([0-9]+)$ http://foo.bar.com/show_bug.cgi?id=$1 [L,R]
 </VirtualHost>
-]]>
-	</programlisting>
-
+]]></programlisting>
       </listitem>
+
       <listitem>
-	<para>There are many, many more things you can do with
-	  mod_rewrite.  As time goes on, I will include many more in
-	  the Guide.  For now, though, please refer to the mod_rewrite
-	  documentation at <ulink
-				  url="http://www.apache.org">http://www.apache.org</ulink></para>
+        <para>There are many, many more things you can do with mod_rewrite.
+        Please refer to the mod_rewrite documentation at 
+        <ulink url="http://www.apache.org">http://www.apache.org</ulink>.
+        </para>
       </listitem>
     </orderedlist>
   </section>
 
-<section id="setperl" xreflabel="The setperl.csh Utility">
-    <title>The setperl.csh Utility</title>
-    <para>	 You can use the "setperl.csh" utility to quickly and
-      easily change the path to perl on all your Bugzilla files. This
-      is a C-shell script; if you do not have "csh" or "tcsh" in the
-      search path on your system, it will not work!
-    </para>	
-    <procedure>
-      <step>
-	<para>
-	  Download the "setperl.csh" utility to your Bugzilla
-	  directory and make it executable.
-	</para>
-	<substeps>
-	  <step>
-	    <para>
-	      <computeroutput>
-		<prompt>bash#</prompt>
-		<command>cd /your/path/to/bugzilla</command>
-	      </computeroutput>
-	    </para>
-	  </step>
-	  <step>
-	  <para>
-	      <computeroutput> <prompt>bash#</prompt> <command>wget -O
-		  setperl.csh
-		  'http://bugzilla.mozilla.org/showattachment.cgi?attach_id=10795'</command> </computeroutput>
-	    </para>
-	  </step>
-	<step>
-	    <para>
-	      <computeroutput> <prompt>bash#</prompt> <command>chmod
-		  u+x setperl.csh</command> </computeroutput>
-	    </para>
-	  </step>
-      </substeps>
-      </step>
-      <step>
-	<para>
-	  Prepare (and fix) Bugzilla file permissions.
-	</para>
-	<substeps>
-	  <step>
-	    <para>
-	      <computeroutput>
-		<prompt>bash#</prompt>
-		<command>chmod u+w *</command>
-	      </computeroutput>
-	    </para>
-	  </step>
-	  <step>
-	  <para>
-	      <computeroutput> <prompt>bash#</prompt> <command>chmod
-		  u+x duplicates.cgi</command> </computeroutput>
-	    </para>
-	  </step>
-	  <step>
-	    <para>
-	      <computeroutput>
-		<prompt>bash#</prompt>
-		<command>chmod a-x bug_status.html</command>
-	      </computeroutput>
-	    </para>
-	  </step>
-	</substeps>
-      </step>
-      <step>
-	<para>
-	  Run the script:
-	</para>
-	<para>
-	  <computeroutput> <prompt>bash#</prompt>
-	    <command>./setperl.csh /your/path/to/perl</command>
-	  </computeroutput>
-<example>
-	    <title>Using Setperl to set your perl path</title>
-	    <para>
-	      <computeroutput> <prompt>bash#</prompt>
-		<command>./setperl.csh /usr/bin/perl</command>
-	      </computeroutput>
-            </para>
-	  </example>
-	</para>
-      </step>
-    </procedure>
-  </section>
-
   <section id="cmdline">
     <title>Command-line Bugzilla Queries</title>
-    <para>
-      Users can query Bugzilla from the command line using this suite
-      of utilities.
-    </para>
-    <para>
-      The query.conf file contains the mapping from options to field
-      names and comparison types.  Quoted option names are "grepped"
-      for, so it should be easy to edit this file.  Comments (#) have
-      no effect; you must make sure these lines do not contain any
-      quoted "option"
-    </para>
-    <para>
-      buglist is a shell script which submits a Bugzilla query and
-      writes the resulting HTML page to stdout.  It supports both
-      short options, (such as "-Afoo" or "-Rbar") and long options
-      (such as "--assignedto=foo" or "--reporter=bar").  If the first
-      character of an option is not "-", it is treated as if it were
-      prefixed with "--default=".
-    </para>
-    <para>
-      The columlist is taken from the COLUMNLIST environment variable.
-      This is equivalent to the "Change Columns" option when you list
-      bugs in buglist.cgi.  If you have already used Bugzilla, use
-      <command>grep COLUMLIST ~/.netscape/cookies</command> to see
-      your current COLUMNLIST setting.
-    </para>
-    <para>
-      bugs is a simple shell script which calls buglist and extracts
-      the bug numbers from the output.  Adding the prefix
-      "http://bugzilla.mozilla.org/buglist.cgi?bug_id=" turns the bug
-      list into a working link if any bugs are found. Counting bugs is
-      easy.  Pipe the results through <command>sed -e 's/,/ /g' | wc |
-	awk '{printf $2 "\n"}'</command>
-    </para>
-    <para>
-      Akkana says she has good results piping buglist output through
-      <command>w3m -T text/html -dump</command>
-    </para>
-    <procedure>
-      <step>
-	<para>
-	  Download three files:
-	</para>
-	<substeps>
-	  <step>
-	    <para>
-	      <computeroutput> <prompt>bash$</prompt> <command>wget -O
-		  query.conf
-		  'http://bugzilla.mozilla.org/showattachment.cgi?attach_id=26157'</command> </computeroutput>
-	    </para>
-	  </step>
-	  <step>
-	    <para>
-	      <computeroutput> <prompt>bash$</prompt> <command>wget -O
-		  buglist
-		  'http://bugzilla.mozilla.org/showattachment.cgi?attach_id=26944'</command> </computeroutput>
-	    </para>
-	  </step>
-	  <step>
-	    <para>
-	      <computeroutput> <prompt>bash#</prompt> <command>wget -O
-		  bugs
-		  'http://bugzilla.mozilla.org/showattachment.cgi?attach_id=26215'</command> </computeroutput>
-	    </para>
-	  </step>
-	</substeps>
-      </step>
-      <step>
-	<para>
-	  Make your utilities executable:
-	  <computeroutput>
-	    <prompt>bash$</prompt>
-	    <command>chmod u+x buglist bugs</command>
-	  </computeroutput>
-	</para>
-      </step>
-    </procedure>
-  </section>
 
-  <section id="quicksearch">
-    <title>The Quicksearch Utility</title>
-    <para>
-      Quicksearch is a new, experimental feature of the 2.12 release.
-      It consist of two Javascript files, "quicksearch.js" and
-      "localconfig.js", and two documentation files,
-      "quicksearch.html" and "quicksearchhack.html"
-    </para>
-    <para>
-      The index.html page has been updated to include the QuickSearch
-      text box.
+    <para>There are a suite of Unix utilities for querying Bugzilla from the 
+    command line. They live in the 
+    <filename class="directory">contrib/cmdline</filename> 
+    directory. However, they
+    have not yet been updated to work with 2.16 (post-templatisation.).
+    There are three files - <filename>query.conf</filename>, 
+    <filename>buglist</filename> and <filename>bugs</filename>.</para>
+    
+    <para><filename>query.conf</filename> 
+    contains the mapping from options to field
+    names and comparison types. Quoted option names are "grepped" for, so it
+    should be easy to edit this file. Comments (#) have no effect; you must
+    make sure these lines do not contain any quoted "option".</para>
+
+    <para><filename>buglist</filename>
+    is a shell script which submits a Bugzilla query and writes
+    the resulting HTML page to stdout. It supports both short options, (such
+    as "-Afoo" or "-Rbar") and long options (such as "--assignedto=foo" or
+    "--reporter=bar"). If the first character of an option is not "-", it is
+    treated as if it were prefixed with "--default=".</para>
+
+    <para>The column list is taken from the COLUMNLIST environment variable.
+    This is equivalent to the "Change Columns" option when you list bugs in
+    buglist.cgi. If you have already used Bugzilla, grep for COLUMNLIST
+    in your cookies file to see your current COLUMNLIST setting.</para>
+
+    <para><filename>bugs</filename> is a simple shell script which calls
+    <filename>buglist</filename> and extracts the
+    bug numbers from the output. Adding the prefix
+    "http://bugzilla.mozilla.org/buglist.cgi?bug_id=" turns the bug list into
+    a working link if any bugs are found. Counting bugs is easy. Pipe the
+    results through 
+    <command>sed -e 's/,/ /g' | wc | awk '{printf $2 "\n"}'</command>
     </para>
-    <para>
-      To take full advantage of the query power, the Bugzilla
-      maintainer must edit "localconfig.js" according to the value
-      sets used in the local installation.
-    </para>
-    <para>
-      Currently, keywords must be hard-coded in localconfig.js.  If
-      they are not, keywords are not automatically recognized.  This
-      means, if localconfig.js is left unconfigured, that searching
-      for a bug with the "foo" keyword will only find bugs with "foo"
-      in the summary, status whiteboard, product or component name,
-      but not those with the keyword "foo".
-    </para>
-    <para>
-      Workarounds for Bugzilla users:
-      <simplelist>
-	<member>search for '!foo' (this will find only bugs with the
-	  keyword "foo"</member>
-	<member>search 'foo,!foo' (equivalent to 'foo OR
-	  keyword:foo')</member>
-      </simplelist>
-    </para>
-    <para>
-      When this tool is ported from client-side JavaScript to
-      server-side Perl, the requirement for hard-coding keywords can
-      be fixed. <ulink
-		       url="http://bugzilla.mozilla.org/show_bug.cgi?id=70907">This bug</ulink> has details.
-    </para>
-  </section>
 
-  <section id="bzhacking">
-    <title>Hacking Bugzilla</title>
-    <para>
-      What follows are some general guidelines for changing Bugzilla, and adhering to good coding practice while doing so.  We've had some checkins in the past which ruined Bugzilla installations because of disregard for these conventions.  Sorry for the lack of formatting; I got this info into the Guide on the day of 2.14 release and haven't formatted it yet.
+    <para>Akkana Peck says she has good results piping 
+    <filename>buglist</filename> output through 
+    <command>w3m -T text/html -dump</command>
     </para>
-    <literallayout>
-
-The following is a guide for reviewers when checking code into Bugzilla's
-CVS repostory at mozilla.org.  If you wish to submit patches to Bugzilla,
-you should follow the rules and style conventions below.  Any code that
-does not adhere to these basic rules will not be added to Bugzilla's
-codebase.
 
- 1. Usage of variables in Regular Expressions
-
-    It is very important that you don't use a variable in a regular
-    expression unless that variable is supposed to contain an expression.
-    This especially applies when using grep.  You should use:
-
-    grep ($_ eq $value, @array);
-
-    - NOT -
-
-    grep (/$value/, @array);
-
-    If you need to use a non-expression variable inside of an expression, be
-    sure to quote it properly (using \Q..\E).
-
-Coding Style for Bugzilla
--------------------------
-
-While it's true that not all of the code currently in Bugzilla adheres to
-this styleguide, it is something that is being worked toward.  Therefore,
-we ask that all new code (submitted patches and new files) follow this guide
-as closely as possible (if you're only changing 1 or 2 lines, you don't have
-to reformat the entire file :).
-
- 1. Whitespace
-
-    Bugzilla's prefered indentation is 4 spaces (no tabs, please).
-
- 2. Curly braces.
-
-    The opening brace of a block should be on the same line as the statement
-    that is causing the block and the closing brace should be at the same
-    indentation level as that statement, for example:
-
-    if ($var) {
-        print "The variable is true";
-    } else {
-        print "Try again";
-    }
-
-    - NOT -
-
-    if ($var)
-    {
-        print "The variable is true";
-    }
-    else
-    {
-        print "Try again";
-    }
-
- 3. File Names
-
-    File names for bugzilla code and support documention should be legal across
-    multiple platforms.  \ / : * ? " < > and | are all illegal characters for
-    filenames on various platforms.  Also, file names should not have spaces in
-    them as they can cause confusion in CVS and other mozilla.org utilities.
-
- 4. Variable Names
-
-    If a variable is scoped globally ($::variable) its name should be descriptive
-    of what it contains.  Local variables can be named a bit looser, provided the
-    context makes their content obvious.  For example, $ret could be used as a
-    staging variable for a routine's return value as the line |return $ret;| will
-    make it blatently obvious what the variable holds and most likely be shown
-    on the same screen as |my $ret = "";|.
-
- 5. Cross Database Compatability
-
-    Bugzilla was originally written to work with MySQL and therefore took advantage
-    of some of its features that aren't contained in other RDBMS software.  These
-    should be avoided in all new code.  Examples of these features are enums and
-    encrypt().
-
- 6. Cross Platform Compatability
-
-    While Bugzilla was written to be used on Unix based systems (and Unix/Linux is
-    still the only officially supported platform) there are many who desire/need to
-    run Bugzilla on Microsoft Windows boxes.  Whenever possible, we should strive
-    not to make the lives of these people any more complicated and avoid doing things
-    that break Bugzilla's ability to run on multiple operating systems.
-
-    </literallayout>
   </section>
 
 </appendix>
 
-
 <!-- Keep this comment at the end of the file
 Local variables:
 mode: sgml
@@ -368,3 +110,4 @@ sgml-shorttag:t
 sgml-tag-region-if-active:t
 End:
 -->
+
diff --git a/docs/sgml/requiredsoftware.sgml b/docs/sgml/requiredsoftware.sgml
deleted file mode 100644
index e36b6184a..000000000
--- a/docs/sgml/requiredsoftware.sgml
+++ /dev/null
@@ -1,86 +0,0 @@
-<!-- <!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> -->
-
-<appendix id="downloadlinks">
-  <title>Software Download Links</title>
-  <para>
-    All of these sites are current as of April, 2001.  Hopefully
-    they'll stay current for a while.
-  </para>
-  <para>
-    Apache Web Server: <ulink url="http://www.apache.org/">http://www.apache.org</ulink>
-    Optional web server for Bugzilla, but recommended because of broad user base and support.
-  </para>
-  <para>
-    Bugzilla: <ulink url="http://www.mozilla.org/projects/bugzilla/">
-      http://www.mozilla.org/projects/bugzilla/</ulink>
-  </para>
-  <para>
-    MySQL: <ulink url="http://www.mysql.com/">http://www.mysql.com/</ulink>
-  </para>
-  <para>
-    Perl: <ulink url="http://www.perl.org">http://www.perl.org/</ulink>
-  </para>
-  <para>
-    CPAN: <ulink url="http://www.cpan.org/">http://www.cpan.org/</ulink>
-  </para>
-  <para>
-    DBI Perl module: 
-    <ulink url="ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/DBI/">
-      ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/DBI/</ulink>
-  </para>
-  <para>
-    Data::Dumper module: 
-    <ulink url="ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Data/">
-      ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Data/</ulink>
-  </para>
-  <para>
-    MySQL related Perl modules:
-    <ulink url="ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Mysql/">
-      ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Mysql/</ulink>
-  </para>
-  <para>
-    TimeDate Perl module collection:
-    <ulink url="ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Date/">
-      ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Date/</ulink>
-  </para>
-  <para>
-    GD Perl module:
-    <ulink url="ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/GD/">
-      ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/GD/</ulink>
-    Alternately, you should be able to find the latest version of
-    GD at <ulink url="http://www.boutell.com/gd/">http://www.boutell.com/gd/</ulink>
-  </para>
-  <para>
-    Chart::Base module:
-    <ulink url="ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Chart/">
-    ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Chart/</ulink>
-  </para>
-  <para>
-    LinuxDoc Software: 
-    <ulink url="http://www.linuxdoc.org/">http://www.linuxdoc.org/</ulink>
-    (for documentation maintenance)
-  </para>
-
-</appendix>
-
-
-<!-- Keep this comment at the end of the file
-Local variables:
-mode: sgml
-sgml-always-quote-attributes:t
-sgml-auto-insert-required-elements:t
-sgml-balanced-tag-edit:t
-sgml-exposed-tags:nil
-sgml-general-insert-case:lower
-sgml-indent-data:t
-sgml-indent-step:2
-sgml-local-catalogs:nil
-sgml-local-ecat-files:nil
-sgml-minimize-attributes:nil
-sgml-namecase-general:t
-sgml-omittag:t
-sgml-parent-document:("Bugzilla-Guide.sgml" "book" "chapter")
-sgml-shorttag:t
-sgml-tag-region-if-active:t
-End:
--->
diff --git a/docs/sgml/using.sgml b/docs/sgml/using.sgml
index 934817081..a3986c27d 100644
--- a/docs/sgml/using.sgml
+++ b/docs/sgml/using.sgml
@@ -1,933 +1,562 @@
 <!-- <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> -->
 
-<!-- TOC
-Chapter: Using Bugzilla
- Create an account
- Logging in
- Setting up preferences
-  Account Settings
-  Email Settings
-  Page Footer
-  Permissions
- Life cycle of a bug
- Creating a bug
-  Checking for duplicates
-  Overview of all bug fields
-  Setting bug permissions
- The Query Interface
-  Standard Queries
-  Email Queries
-  Boolean Queries
-  Regexp Queries
- The Query Results
-  Changing Columns
-  Changing sorting order
-  Mass changes 
- Miscellaneous usage hints
-
--->
-
 <chapter id="using">
-<title>Using Bugzilla</title>
-  <epigraph>
-    <para>
-      What, Why, How, & Where?
-    </para>
-  </epigraph>
-
-  <section id="whatis">
-    <title>What is Bugzilla?</title>
-    <para>
-      Bugzilla is one example of a class of programs called "Defect
-Tracking Systems", or, more commonly, "Bug-Tracking Systems".  Defect
-Tracking Systems allow individual or groups of developers to keep
-track of outstanding bugs in their product effectively. Bugzilla was
-originally written by Terry Weissman in a programming language called
-"TCL", to replace a crappy bug-tracking database used internally for
-Netscape Communications.  Terry later ported Bugzilla to Perl from
-TCL, and in Perl it remains to this day. Most commercial
-defect-tracking software vendors at the time charged enormous
-licensing fees, and Bugzilla quickly became a favorite of the
-open-source crowd (with its genesis in the open-source browser
-project, Mozilla).  It is now the de-facto standard defect-tracking
-system against which all others are measured.
-    </para>
-    <para>
-      Bugzilla has matured immensely, and now boasts many advanced features.  These include:
-      <itemizedlist>
-	<listitem>
-	  <para>
-	    integrated, product-based granular security schema
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    inter-bug dependencies and dependency graphing
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    advanced reporting capabilities
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    a robust, stable RDBMS back-end
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    extensive configurability
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    a very well-understood and well-thought-out natural bug resolution protocol
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    email, XML, console, and HTTP APIs
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    available integration with automated software
-	    configuration management systems, including Perforce and
-	    CVS (through the Bugzilla email interface and
-	    checkin/checkout scripts)
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    too many more features to list
-	  </para>
-	</listitem>
-      </itemizedlist>
-    </para>
-    <para>
-      Despite its current robustness and popularity, Bugzilla faces
-      some near-term challenges, such as reliance on a single
-      database, a lack of abstraction of the user interface and
-      program logic, verbose email bug notifications, a powerful but
-      daunting query interface, little reporting configurability,
-      problems with extremely large queries, some unsupportable bug
-      resolution options, little internationalization (although non-US
-      character sets are accepted for comments), and dependence on
-      some nonstandard libraries.
-    </para>
-    <para>
-      Some recent headway has been made on the query front, however.
-      If you are using the latest version of Bugzilla, you should see
-      a <quote>simple search</quote> form on the default front page of
-      your Bugzilla install.  Type in two or three search terms and
-      you should pull up some relevant information.  This is also
-      available as "queryhelp.cgi".
-    </para>
-    <para>
-      Despite these small problems, Bugzilla is very hard to beat.  It
-      is under <emphasis>very</emphasis> active development to address
-      the current issues, and continually gains new features.
-    </para>
-  </section>
-  
-  <section id="why">
-    <title>Why Should We Use Bugzilla?</title>
-    <epigraph>
-      <para>
-	No, Who's on first...
-      </para>
-    </epigraph>
-    <para>
-      For many years, defect-tracking software has remained
-      principally the domain of large software development houses.
-      Even then, most shops never bothered with bug-tracking software,
-      and instead simply relied on shared lists and email to monitor
-      the status of defects.  This procedure is error-prone and tends
-      to cause those bugs judged least significant by developers to be
-      dropped or ignored.
-    </para>
-    <para>
-      These days, many companies are finding that integrated
-      defect-tracking systems reduce downtime, increase productivity,
-      and raise customer  satisfaction with their systems.  Along with
-      full disclosure, an open bug-tracker allows manufacturers to
-      keep in touch with their clients and resellers, to communicate
-      about problems effectively throughout the data management chain.
-      Many corporations have also discovered that defect-tracking
-      helps reduce costs by providing IT support accountability,
-      telephone support knowledge bases, and a common, well-understood
-      system for accounting for unusual system or software issues.
-    </para>
-    <para>
-      But why should <emphasis>you</emphasis> use Bugzilla?
-    </para>
-    <para>
-      Bugzilla is very adaptable to various situations.  Known uses
-      currently include IT support queues, Systems Administration
-      deployment management, chip design and development problem
-      tracking (both pre-and-post fabrication), and software and
-      hardware bug tracking for luminaries such as Redhat, Loki
-      software, Linux-Mandrake, and VA Systems.  Combined with systems
-      such as CVS, Bonsai, or Perforce SCM, Bugzilla provides a
-      powerful, easy-to-use  solution to configuration management and
-      replication problems
-    </para>
-    <para>
-      Bugzilla can dramatically increase the productivity and
-      accountability of individual employees by providing a documented
-      workflow and positive feedback for good performance.  How many
-      times do you wake up in the morning, remembering that you were
-      supposed to do <emphasis>something</emphasis> today, but you
-      just can't quite remember?  Put it in Bugzilla, and you have a
-      record of it from which you can extrapolate milestones, predict
-      product versions for integration, and by using Bugzilla's e-mail
-      integration features be able to follow the discussion trail that
-      led to critical decisions.
-    </para>
-    <para>
-      Ultimately, Bugzilla puts the power in your hands to improve
-      your value to your employer or business while providing a usable
-      framework for your natural attention to detail and knowledge
-      store to flourish.
-    </para>
-  </section>
-  
+  <title>Using Bugzilla</title>
+
   <section id="how">
     <title>How do I use Bugzilla?</title>
-    <epigraph>
-      <para>
-	Hey!  I'm Woody!  Howdy, Howdy, Howdy!
-      </para>
-    </epigraph>
-    
-    <para>
-      Bugzilla is a large, complex system.  Describing how to use it
-      requires some time.  If you are only interested in installing or
-      administering a Bugzilla installation, please consult the
-      Installing and Administering Bugzilla portions of this Guide.
-      This section is principally aimed towards developing end-user
-      mastery of Bugzilla, so you may fully enjoy the benefits
-      afforded by using this reliable open-source bug-tracking
-      software.
-    </para>
-    <para>
-      Throughout this portion of the Guide, we will refer to user
-      account options available at the Bugzilla test installation,
-      <ulink url="http://landfill.tequilarista.org/">
-	landfill.tequilarista.org</ulink>.
-      <note>
-	<para>
-	  Some people have run into difficulties completing this
-	  tutorial.  If you run into problems, please check the
-	  updated online documentation available at <ulink
-							    url="http://www.trilobyte.net/barnsons/">http://www.trilobyte.net/barnsons</ulink>. If you're still stumped, please subscribe to the newsgroup and provide details of exactly what's stumping you!  If enough people complain, I'll have to fix it in the next version of this Guide.  You can subscribe to the newsgroup at <ulink url="news://news.mozilla.org/netscape.public.mozilla.webtools"> news://news.mozilla.org/netscape.public.mozilla.webtools</ulink>
-	</para>
- 
-      </note> Although Landfill serves as a great introduction to
-      Bugzilla, it does not offer all the options you would have as a
-      user on your own installation of Bugzilla, nor can it do more
-      than serve as a general introduction to Bugzilla.  Additionally,
-      Landfill often runs cutting-edge versions of Bugzilla for
-      testing, so some things may work slightly differently than
-      mentioned here.
-    </para>
-    
+
+    <para>This section contains information for end-users of Bugzilla. 
+    There is a Bugzilla test installation, called 
+    <ulink url="http://landfill.bugzilla.org/">Landfill</ulink>, 
+    which you are welcome to play with (if it's up.) 
+    However, it does not necessarily
+    have all Bugzilla features enabled, and often runs cutting-edge versions
+    of Bugzilla for testing, so some things may work slightly differently
+    than mentioned here.</para>
+
     <section id="myaccount">
       <title>Create a Bugzilla Account</title>
-      <para>
-	First things first!  If you want to use Bugzilla, first you
-	need to create an account.  Consult with the administrator
-	responsible for your installation of Bugzilla for the URL you
-	should use to access it. If you're test-driving the end-user
-	Bugzilla experience, use this URL: <ulink
-						  url="http://landfill.tequilarista.org/bugzilla-tip/"> http://landfill.tequilarista.org/bugzilla-tip/</ulink>
+
+      <para>If you want to use Bugzilla, first you need to create an account.
+      Consult with the administrator responsible for your installation of
+      Bugzilla for the URL you should use to access it. If you're
+      test-driving Bugzilla, use this URL: 
+      <ulink url="http://landfill.bugzilla.org/bugzilla-tip/">
+      http://landfill.bugzilla.org/bugzilla-tip/</ulink>
       </para>
+
       <orderedlist>
-	<listitem>
-	  <para>
-	    Click the "Open a new Bugzilla account" link.
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Enter your "E-mail address" and "Real Name" (or whatever
-	    name you want to call yourself) in the spaces provided,
-	    then select the "Create Account" button.
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Within moments, you should receive an email to the address
-	    you provided above, which contains your login name
-	    (generally the same as the email address), and a password
-	    you can use to access your account.  This password is
-	    randomly generated, and should be changed at your nearest
-	    opportunity (we'll go into how to do it later).
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Click the <quote>Log In</quote> link in the yellow area at
-	    the bottom of the page in your browser, then enter your
-	    <quote>E-mail address</quote> and <quote>Password</quote>
-	    you just received into the spaces provided, and select
-	    <quote>Login</quote>.
-	    <note>
-	      <para>
-		If you ever forget your password, you can come back to
-		this page, enter your <quote>E-mail address</quote>,
-		then select the <quote>E-mail me a password</quote>
-		button to have your password mailed to you again so
-		that you can login.
-	      </para>
-	    </note>
-	    <caution>
-	      <para>
-		Many modern browsers include an
-		<quote>Auto-Complete</quote> or <quote>Form
-		  Fill</quote> feature to remember the user names and
-		passwords you type in at many sites.  Unfortunately,
-		sometimes they attempt to guess what you will put in
-		as your password, and guess wrong.  If you notice a
-		text box is already filled out, please overwrite the
-		contents of the text box so you can be sure to input
-		the correct information.
-	      </para>
-	    </caution>
-	  </para>
-	</listitem>
+        <listitem>
+          <para>Click the 
+          <quote>Open a new Bugzilla account</quote>
+
+          link, enter your email address and, optionally, your name in the
+          spaces provided, then click 
+          <quote>Create Account</quote>
+
+          .</para>
+        </listitem>
+
+        <listitem>
+          <para>Within moments, you should receive an email to the address
+          you provided above, which contains your login name (generally the
+          same as the email address), and a password you can use to access
+          your account. This password is randomly generated, and can be
+          changed to something more memorable.</para>
+        </listitem>
+
+        <listitem>
+          <para>Click the 
+          <quote>Log In</quote>
+          link in the yellow area at the bottom of the page in your browser,
+          enter your email address and password into the spaces provided, and
+          click 
+          <quote>Login</quote>.
+          </para>
+          
+        </listitem>
       </orderedlist>
-      <para>
-	Congratulations!  If you followed these directions, you now
-	are the proud owner of a user account on
-	landfill.tequilarista.org (Landfill) or your local Bugzilla
-	install.  You should now see in your browser a page called the
-	<quote>Bugzilla Query Page</quote>.  It may look daunting, but with this
-	Guide to walk you through it, you will master it in no time.
-      </para>
+
+      <para>You are now logged in. Bugzilla uses cookies for authentication
+      so, unless your IP address changes, you should not have to log in
+      again.</para>
     </section>
-    
+
+    <section id="bug_page">
+      <title>Anatomy of a Bug</title>
+
+      <para>The core of Bugzilla is the screen which displays a particular
+      bug. It's a good place to explain some Bugzilla concepts. 
+      <ulink
+      url="http://landfill.bugzilla.org/bugzilla-tip/show_bug.cgi?id=1">
+      Bug 1 on Landfill</ulink>
+
+      is a good example. Note that the labels for most fields are hyperlinks;
+      clicking them will take you to context-sensitive help on that
+      particular field. Fields marked * may not be present on every
+      installation of Bugzilla.</para>
+
+      <orderedlist>
+        <listitem>
+          <para>
+          <emphasis>Product and Component</emphasis>: 
+          Bugs are divided up by Product and Component, with a Product
+          having one or more Components in it. For example,
+          bugzilla.mozilla.org's "Bugzilla" Product is composed of several
+          Components: 
+          <simplelist>
+          <member>
+          <emphasis>Administration:</emphasis>
+          Administration of a Bugzilla installation.</member>
+
+          <member>
+          <emphasis>Bugzilla-General:</emphasis>
+          Anything that doesn't fit in the other components, or spans
+          multiple components.</member>
+
+          <member>
+          <emphasis>Creating/Changing Bugs:</emphasis>
+          Creating, changing, and viewing bugs.</member>
+
+          <member>
+          <emphasis>Documentation:</emphasis>
+          The Bugzilla documentation, including The Bugzilla Guide.</member>
+
+          <member>
+          <emphasis>Email:</emphasis>
+          Anything to do with email sent by Bugzilla.</member>
+
+          <member>
+          <emphasis>Installation:</emphasis>
+          The installation process of Bugzilla.</member>
+
+          <member>
+          <emphasis>Query/Buglist:</emphasis>
+          Anything to do with searching for bugs and viewing the
+          buglists.</member>
+
+          <member>
+          <emphasis>Reporting/Charting:</emphasis>
+          Getting reports from Bugzilla.</member>
+
+          <member>
+          <emphasis>User Accounts:</emphasis>
+          Anything about managing a user account from the user's perspective.
+          Saved queries, creating accounts, changing passwords, logging in,
+          etc.</member>
+
+          <member>
+          <emphasis>User Interface:</emphasis>
+          General issues having to do with the user interface cosmetics (not
+          functionality) including cosmetic issues, HTML templates,
+          etc.</member>
+          </simplelist>
+          </para>
+        </listitem>
+
+        <listitem>
+          <para>
+          <emphasis>Status and Resolution:</emphasis>
+
+          These define exactly what state the bug is in - from not even
+          being confirmed as a bug, through to being fixed and the fix
+          confirmed by Quality Assurance. The different possible values for
+          Status and Resolution on your installation should be documented in the
+          context-sensitive help for those items.</para>
+        </listitem>
+
+        <listitem>
+          <para>
+          <emphasis>Assigned To:</emphasis>
+          The person responsible for fixing the bug.</para>
+        </listitem>
+
+        <listitem>
+          <para>
+          <emphasis>*URL:</emphasis>
+          A URL associated with the bug, if any.</para>
+        </listitem>
+
+        <listitem>
+          <para>
+          <emphasis>Summary:</emphasis>
+          A one-sentence summary of the problem.</para>
+        </listitem>
+
+        <listitem>
+          <para>
+          <emphasis>*Status Whiteboard:</emphasis>
+          (a.k.a. Whiteboard) A free-form text area for adding short notes
+          and tags to a bug.</para>
+        </listitem>
+
+        <listitem>
+          <para>
+          <emphasis>*Keywords:</emphasis>
+          The administrator can define keywords which you can use to tag and
+          categorise bugs - e.g. The Mozilla Project has keywords like crash
+          and regression.</para>
+        </listitem>
+
+        <listitem>
+          <para>
+          <emphasis>Platform and OS:</emphasis>
+          These indicate the computing environment where the bug was
+          found.</para>
+        </listitem>
+
+        <listitem>
+          <para>
+          <emphasis>Version:</emphasis>
+          The "Version" field is usually used for versions of a product which
+          have been released, and is set to indicate which versions of a
+          Component have the particular problem the bug report is
+          about.</para>
+        </listitem>
+
+        <listitem>
+          <para>
+          <emphasis>Priority:</emphasis>
+          The bug assignee uses this field to prioritise his or her bugs.
+          It's a good idea not to change this on other people's bugs.</para>
+        </listitem>
+
+        <listitem>
+          <para>
+          <emphasis>Severity:</emphasis>
+          This indicates how severe the problem is - from blocker
+          ("application unusable") to trivial ("minor cosmetic issue"). You
+          can also use this field to indicate whether a bug is an enhancement
+          request.</para>
+        </listitem>
+
+        <listitem>
+          <para>
+          <emphasis>*Target:</emphasis>
+          (a.k.a. Target Milestone) A future version by which the bug is to
+          be fixed. e.g. The Bugzilla Project's milestones for future
+          Bugzilla versions are 2.18, 2.20, 3.0, etc. Milestones are not
+          restricted to numbers, thought - you can use any text strings, such
+          as dates.</para>
+        </listitem>
+
+        <listitem>
+          <para>
+          <emphasis>Reporter:</emphasis>
+          The person who filed the bug.</para>
+        </listitem>
+
+        <listitem>
+          <para>
+          <emphasis>CC list:</emphasis>
+          A list of people who get mail when the bug changes.</para>
+        </listitem>
+
+        <listitem>
+          <para>
+          <emphasis>Attachments:</emphasis>
+          You can attach files (e.g. testcases or patches) to bugs. If there
+          are any attachments, they are listed in this section.</para>
+        </listitem>
+
+        <listitem>
+          <para>
+          <emphasis>*Dependencies:</emphasis>
+          If this bug cannot be fixed unless other bugs are fixed (depends
+          on), or this bug stops other bugs being fixed (blocks), their
+          numbers are recorded here.</para>
+        </listitem>
+
+        <listitem>
+          <para>
+          <emphasis>*Votes:</emphasis>
+          Whether this bug has any votes.</para>
+        </listitem>
+
+        <listitem>
+          <para>
+          <emphasis>Additional Comments:</emphasis>
+          You can add your two cents to the bug discussion here, if you have
+          something worthwhile to say.</para>
+        </listitem>
+      </orderedlist>
+    </section>
+
     <section id="query">
-      <title>The Bugzilla Query Page</title>
-      <para>
-	The Bugzilla Query Page is the heart and soul of the Bugzilla
-	user experience.  It is the master interface where you can
-	find any bug report, comment, or patch currently in the
-	Bugzilla system.  We'll go into how to create your own bug
-	report later on.
-      </para>
-      <para>
-	There are efforts underway to simplify query usage.  If you
-	have a local installation of Bugzilla 2.12 or higher, you
-	should have <filename>quicksearch.html</filename> available to
-	use and simplify your searches.  There is also a helper for
-	the query interface, called
-	<filename>queryhelp.cgi</filename>.  Landfill tends to run the
-	latest code, so these two utilities should be available there
-	for your perusal.
+      <title>Searching for Bugs</title>
+
+      <para>The Bugzilla Search page is is the interface where you can find
+      any bug report, comment, or patch currently in the Bugzilla system. You
+      can play with it here: 
+      <ulink url="http://landfill.bugzilla.org/bugzilla-tip/query.cgi">
+      landfill.bugzilla.org/bugzilla-tip/query.cgi</ulink>
+
+      .</para>
+
+      <para>The Search page has controls for selecting different possible
+      values for all of the fields in a bug, as described above. Once you've
+      defined a search, you can either run it, or save it as a Remembered
+      Query, which can optionally appear in the footer of your pages.</para>
+
+      <para>Highly advanced querying is done using Boolean Charts, which have
+      their own 
+      <ulink
+      url="http://landfill.bugzilla.org/bugzilla-tip/booleanchart.html">
+      context-sensitive help</ulink>
+
+      .</para>
+    </section>
+
+    <section id="list">
+      <title>Bug Lists</title>
+
+      <para>If you run a search, a list of matching bugs will be returned.
+      The default search is to return all open bugs on the system - don't try
+      running this search on a Bugzilla installation with a lot of
+      bugs!</para>
+
+      <para>The format of the list is configurable. For example, it can be
+      sorted by clicking the column headings. Other useful features can be
+      accessed using the links at the bottom of the list: 
+      <simplelist>
+        <member>
+        <emphasis>Long Format:</emphasis>
+
+        this gives you a large page with a non-editable summary of the fields
+        of each bug.</member>
+
+        <member>
+        <emphasis>Change Columns:</emphasis>
+
+        change the bug attributes which appear in the list.</member>
+
+        <member>
+        <emphasis>Change several bugs at once:</emphasis>
+
+        If your account is sufficiently empowered, you can make the same
+        change to all the bugs in the list - for example, changing their
+        owner.</member>
+
+        <member>
+        <emphasis>Send mail to bug owners:</emphasis>
+
+        Sends mail to the owners of all bugs on the list.</member>
+
+        <member>
+        <emphasis>Edit this query:</emphasis>
+
+        If you didn't get exactly the results you were looking for, you can
+        return to the Query page through this link and make small revisions
+        to the query you just made so you get more accurate results.</member>
+      </simplelist>
       </para>
-      <para>
-	At this point, please visit the main Bugzilla site,
-	<ulink url="http://bugzilla.mozilla.org/query.cgi">
-	bugzilla.mozilla.org</ulink>, to see a more fleshed-out query page.
+    </section>
+
+    <section id="bugreports">
+      <title>Filing Bugs</title>
+
+      <para>Years of bug writing experience has been distilled for your
+      reading pleasure into the 
+      <ulink
+      url="http://landfill.bugzilla.org/bugzilla-tip/bugwritinghelp.html">
+      Bug Writing Guidelines</ulink>. 
+      While some of the advice is Mozilla-specific, the basic principles of
+      reporting Reproducible, Specific bugs, isolating the Product you are
+      using, the Version of the Product, the Component which failed, the
+      Hardware Platform, and Operating System you were using at the time of
+      the failure go a long way toward ensuring accurate, responsible fixes
+      for the bug that bit you.</para>
+
+      <para>The procedure for filing a test bug is as follows:</para>
+
+      <orderedlist>
+        <listitem>
+          <para>Go to 
+          <ulink url="http://landfill.bugzilla.org/bugzilla-tip/">
+          Landfill</ulink>
+          in your browser and click 
+          <ulink
+          url="http://landfill.bugzilla.org/bugzilla-tip/enter_bug.cgi">
+          Enter a new bug report</ulink>.
+          </para>
+        </listitem>
+
+        <listitem>
+          <para>Select a product - any one will do.</para>
+        </listitem>
+
+        <listitem>
+          <para>Fill in the fields. Bugzilla should have made reasonable
+          guesses, based upon your browser, for the "Platform" and "OS"
+          drop-down boxes. If they are wrong, change them.</para>
+        </listitem>
+
+        <listitem>
+          <para>Select "Commit" and send in your bug report.</para>
+        </listitem>
+      </orderedlist>
+    </section>
+  </section>
+
+  <section id="hintsandtips">
+    <title>Hints and Tips</title>
+    
+    <para>This section distills some Bugzilla tips and best practices
+    that have been developed.</para>
+
+    <section>
+      <title>Autolinkification</title>
+      <para>Bugzilla comments are plain text - so posting HTML will result
+      in literal HTML tags rather than being interpreted by a browser.
+      However, Bugzilla will automatically make hyperlinks out of certain
+      sorts of text in comments. For example, the text 
+      http://www.bugzilla.org will be turned into
+      <ulink url="http://www.bugzilla.org">http://www.bugzilla.org</ulink>.
+      Other strings which get linkified in the obvious manner are:
+      <simplelist>
+        <member>bug 12345</member>
+        <member>bug 23456, comment 53</member>
+        <member>attachment 4321</member>
+        <member>mailto:george@example.com</member>
+        <member>george@example.com</member>
+        <member>ftp://ftp.mozilla.org</member>
+        <member>Most other sorts of URL</member>
+      </simplelist>
       </para>
-      <para>
-	The first thing you need to notice about the Bugzilla Query
-	Page is that nearly every box you see on your screen has a
-	hyperlink nearby, explaining what it is or what it does.  Near
-	the upper-left-hand corner of your browser window you should
-	see the word <quote>Status</quote> underlined.  Select it.
+      
+      <para>A corollary here is that if you type a bug number in a comment,
+      you should put the word "bug" before it, so it gets autolinkified
+      for the convenience of others.
       </para>
-      <para>
-	Notice the page that popped up?  Every underlined word you see
-	on your screen is a hyperlink that will take you to
-	context-sensitive help. Click around for a while, and learn
-	what everything here does.  To return to the query interface
-	after pulling up a help page, use the <quote>Back</quote>
-	button in your browser.
+    </section>
+
+    <section id="quicksearch">
+      <title>Quicksearch</title>
+
+      <para>Quicksearch is a single-text-box query tool which uses
+      metacharacters to indicate what is to be searched. For example, typing
+      "<filename>foo|bar</filename>" 
+      into Quicksearch would search for "foo" or "bar" in the 
+      summary and status whiteboard of a bug; adding 
+      "<filename>:BazProduct</filename>" would
+      search only in that product.
       </para>
-      <para>
-	I'm sure that after checking out the online help, you are now
-	an expert on the Bugzilla Query Page.  If, however, you feel
-	you haven't mastered it yet, let me walk you through making a
-	few successful queries to find out what there are in the
-	Bugzilla bug-tracking system itself.
+
+      <para>You'll find the Quicksearch box on Bugzilla's
+      front page, along with a 
+      <ulink url="../../quicksearch.html">Help</ulink> 
+      link which details how to use it.</para>
+    </section>
+    
+    <section id="commenting">
+      <title>Comments</title>
+
+      <para>If you are changing the fields on a bug, only comment if
+      either you have something pertinent to say, or Bugzilla requires it.
+      Otherwise, you may spam people unnecessarily with bug mail.
+      To take an example: a user can set up their account to filter out messages
+      where someone just adds themselves to the CC field of a bug
+      (which happens a lot.) If you come along, add yourself to the CC field,
+      and add a comment saying "Adding self to CC", then that person
+      gets a pointless piece of mail they would otherwise have avoided.
       </para>
-      <orderedlist>
-	<listitem>
-	  <para>
-	    Ensure you are back on the <quote>Bugzilla Query
-	      Page</quote>. Do nothing in the boxes marked "Status",
-	    "Resolution", "Platform", "OpSys", "Priority", or
-	    "Severity".  The default query for "Status" is to find all
-	    bugs that are NEW, ASSIGNED, or REOPENED, which is what we
-	    want.  If you don't select anything in the other 5
-	    scrollboxes there, then you are saying that "any of these
-	    are OK"; we're not locking ourselves into only finding
-	    bugs on the "DEC" Platform, or "Windows 95" OpSys
-	    (Operating System).  You're smart, I think you have it
-	    figured out.
-	  </para>
-	  <para>
-	    Basically, selecting <emphasis>anything</emphasis> on the
-	    query page narrows your search down.  Leaving stuff
-	    unselected, or text boxes unfilled, broadens your search.
-	  </para>
-	</listitem>
-
-	<listitem>
-	  <para>
-	    You see the box immediately below the top six boxes that
-	    contains an "Email" text box,  with the words "matching
-	    as", a drop-down selection box, then some checkboxes with
-	    "Assigned To" checked by default?  This allows you to
-	    filter your search down based upon email address.  Let's
-	    put my email address in there, and see what happens.
-	  </para>
-	  <para>
-	    Type "barnboy@trilobyte.net" in the top Email text box.
-	  </para>
-	</listitem>
-
-	<listitem>
-	  <para>
-	    Let's narrow the search some more.  Scroll down until you
-	    find the box with the word "Program" over the top of it.
-	    This is where we can narrow our search down to only
-	    specific products (software programs or product lines) in
-	    our Bugzilla database. Please notice the box is a
-	    <emphasis>scrollbox</emphasis>.  Using the down arrow on
-	    the scrollbox, scroll down until you can see an entry
-	    called "Bugzilla".  Select this entry.
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Did you notice that some of the boxes to the right changed
-	    when you selected "Bugzilla"? Every Program (or Product)
-	    has different Versions, Components, and Target Milestones
-	    associated with it.  A "Version" is the number of a
-	    software program.
-	    <example>
-	      <title>Some Famous Software Versions</title>
-	      <informalexample>
-		<para>
-		  Do you remember the hype in 1995 when Microsoft
-		  Windows 95(r) was released? It may have been several
-		  years ago, but Microsoft(tm) spent over $300 Million
-		  advertising this new Version of their software.
-		  Three years later, they released Microsoft Windows
-		  98(r), another new version, to great fanfare, and
-		  then in 2000 quietly  released Microsoft Windows
-		  ME(Millenium Edition)(r). 
-		</para>
-		<para>
-		  Software "Versions" help a manufacturer
-		  differentiate their current product from their
-		  previous products.  Most do not identify their
-		  products by the year they were released. Instead,
-		  the "original" version of their software will often
-		  be numbered "1.0", with small bug-fix releases on
-		  subsequent tenths of a digit.  In most cases, it's
-		  not a decimal number; for instance, often 1.9 is an
-		  <emphasis>older</emphasis> version of the software
-		  than 1.11, but is a <emphasis>newer</emphasis>
-		  version than 1.1.1.
-		</para>
-		<para>
-		  In general, a "Version" in Bugzilla should refer to
-		  <emphasis>released</emphasis> products, not products
-		  that have not yet been released  to the public.
-		  Forthcoming products are what the Target Milestone
-		  field is for.
-		</para>
-	      </informalexample>
-	    </example>
-	  </para>
-	  <para>
-	    A "Component" is a piece of a Product.
-	    It may be a standalone program, or some other logical
-	    division of a Product or Program. 
-	    Normally, a Component has a single Owner, who is responsible
-	    for overseeing efforts to improve that Component.
-	    <example>
-	      <title>Mozilla's Bugzilla Components</title>
-	      <informalexample>
-		<para>
-		  Mozilla's "Bugzilla" Product is composed of several pieces (Components):
-		  <simplelist>
-                    <member><emphasis>Administration</emphasis>,
-                      Administration of a bugzilla installation, including 
-                      <filename>editcomponents.cgi</filename>,
-                      <filename>editgroups.cgi</filename>, 
-                      <filename>editkeywords.cgi</filename>, 
-                      <filename>editparams.cgi</filename>,
-                      <filename>editproducts.cgi</filename>,
-                      <filename>editusers.cgi</filename>,
-                      <filename>editversions.cgi,</filename> and
-                      <filename>sanitycheck.cgi</filename>.
-                    </member>
-                    <member><emphasis>Bugzilla-General</emphasis>,
-                      Anything that doesn't fit in the other components, or spans
-                      multiple components.
-                    </member>
-                    <member><emphasis>Creating/Changing Bugs</emphasis>,
-                      Creating, changing, and viewing bugs.
-                      <filename>enter_bug.cgi</filename>,
-                      <filename>post_bug.cgi</filename>,
-                      <filename>show_bug.cgi</filename> and
-                      <filename>process_bug.cgi</filename>.
-                    </member>
-                    <member><emphasis>Documentation</emphasis>,
-                      The bugzilla documentation, including anything in the
-                      <filename>docs/</filename> directory and The Bugzilla Guide
-                      (This document :)
-                    </member>
-                    <member><emphasis>Email</emphasis>,
-                      Anything to do with email sent by Bugzilla.
-                      <filename>processmail</filename>
-                    </member>
-                    <member><emphasis>Installation</emphasis>,
-                      The installation process of Bugzilla. This includes
-                      <filename>checksetup.pl</filename> and whatever else it evolves into.
-                    </member>
-                    <member><emphasis>Query/Buglist</emphasis>,
-                      Anything to do with searching for bugs and viewing the buglists.
-                      <filename>query.cgi</filename> and
-                      <filename>buglist.cgi</filename>
-                    </member>
-                    <member><emphasis>Reporting/Charting</emphasis>,
-                      Getting reports from Bugzilla.
-                      <filename>reports.cgi</filename> and
-                      <filename>duplicates.cgi</filename>
-                    </member>
-                    <member><emphasis>User Accounts</emphasis>,
-                      Anything about managing a user account from the user's perspective.
-                      <filename>userprefs.cgi</filename>, saved queries, creating accounts,
-                      changing passwords, logging in, etc. 
-                    </member>
-                    <member><emphasis>User Interface</emphasis>,
-                      General issues having to do with the user interface cosmetics (not
-                      functionality) including cosmetic issues, HTML templates, etc.
-                    </member>
-		  </simplelist>
-		</para>
-	      </informalexample>
-	    </example>
-	  </para>
-	  <para>
-	    A "Milestone", or "Target Milestone" is a often a planned
-	    future "Version" of a product.  In many cases, though,
-	    Milestones simply represent significant dates for a
-	    developer.  Having certain features in your Product is
-	    frequently tied to revenue (money) the developer will
-	    receive if the features work by the time she  reaches the
-	    Target Milestone. Target Milestones are a great tool to
-	    organize your time. If someone will pay you $100,000 for
-	    incorporating certain features by a certain date, those
-	    features by that Milestone date become a very high
-	    priority.  Milestones tend to be highly malleable
-	    creatures, though, that appear to be in reach but are out
-	    of reach by the time the important day arrives.
-	  </para>
-	  <para>
-	    The Bugzilla Project has set up Milestones for future
-	    Bugzilla versions 2.14, 2.16, 2.18, 3.0, etc.  However, a
-	    Target Milestone can just as easily be a specific date,
-	    code name, or weird alphanumeric combination, like "M19".
-	  </para>
-	</listitem>
-
-	<listitem>
-	  <para>
-	    OK, now let's select the "Bugzilla" component from its scrollbox.
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Skip down the page a bit -- do you see the "submit query" button?
-	    Select it, and let's run
-	    this query!
-	  </para>
-	</listitem>
-	<listitem>
-	  <para>
-	    Congratulations!  You've completed your first Query, and
-	    have before you the Bug List of the author of this Guide,
-	    Matthew P. Barnson (barnboy@trilobyte.net).  If I'm doing
-	    well, you'll have a cryptic "Zarro Boogs Found" message on
-	    your screen.  It is just a happy hacker's way of saying
-	    "Zero Bugs Found".  However, I am fairly certain I will
-	    always have some bugs assigned to me that aren't done yet,
-	    so you won't often see that message!
-	  </para>
-	</listitem>
-      </orderedlist>
+      
       <para>
-	I encourage you to click the bug numbers in the left-hand
-	column and examine my bugs.  Also notice that if you click the
-	underlined  links near the top of this page, they do not take
-	you to context-sensitive help here, but instead sort the
-	columns of bugs on the screen! When you need to sort your bugs
-	by priority, severity, or the people they are assigned to,
-	this is a tremendous timesaver.
-      </para>
+      Don't use sigs in comments. Signing your name ("Bill") is acceptable,
+      particularly if you do it out of habit, but full mail/news-style
+      four line ASCII art creations are not.
+      </para>      
+    </section>
+    
+    <section id="attachments">
+      <title>Attachments</title>
+      
       <para>
-	A couple more interesting things about the Bug List page:
-	<simplelist>
-	  <member><emphasis>Change Columns</emphasis>: by selecting
-	    this link, you can show all kinds of information in the
-	    Bug List</member>
-	  <member><emphasis>Change several bugs at once</emphasis>: If
-	    you have sufficient rights to change all the bugs shown in
-	    the Bug List, you can mass-modify them. This is a big
-	    time-saver.</member>
-	  <member><emphasis>Send mail to bug owners</emphasis>: If you
-	    have many related bugs, you can request an update from
-	    every person who owns the bugs in the Bug List asking them
-	    the status.</member>
-	  <member><emphasis>Edit this query</emphasis>: If you didn't
-	    get exactly the results you were looking for, you can
-	    return to the Query page through this link and make small
-	    revisions to the query you just made so you get more
-	    accurate results.</member>
-	</simplelist>
+      Use attachments, rather than comments, for large chunks of ASCII data,
+      such as trace, debugging output files, or log files. That way, it doesn't
+      bloat the bug for everyone who wants to read it, and cause people to
+      receive fat, useless mails.
+      </para>      
+
+      <para>Trim screenshots. There's no need to show the whole screen if
+      you are pointing out a single-pixel problem.
       </para>
-      <note>
-	<para>
-	  There are many more options to the Bugzilla Query Page  and
-	  the Bug List than I have shown you. But this should be
-	  enough for you to learn to get around. I encourage you to
-	  check out the <ulink
-			       url="http://www.mozilla.org/bugs/">Bugzilla Home Page</ulink> to learn about the Anatomy and Life Cycle of a Bug before continuing.
-	</para>
-      </note>
+      
+      <para>Don't attach simple test cases (e.g. one HTML file, one 
+      CSS file and an image) as a ZIP file. Instead, upload them in 
+      reverse order and edit the referring file so that they point to the
+      attached files. This way, the test case works immediately 
+      out of the bug.
+      </para>     
     </section>
     
-    
-    <section id="bugreports">
-      <title>Creating and Managing Bug Reports</title>
-      <epigraph>
-	<para>And all this time, I thought we were taking bugs <emphasis>out</emphasis>...</para>
-      </epigraph>
+    <section>
+      <title>Filing Bugs</title>
       
-      <section id="bug_writing">
-	<title>Writing a Great Bug Report</title>
-	<para>
-	  Before we plunge into writing your first bug report, I
-	  encourage you to read some bug-writing guidelines.  If you
-	  are reading this document as part of a Bugzilla CVS checkout
-	  or un-tarred Bugzilla distribution, you should be able to
-	  read them by clicking <ulink
-				       url="../../bugwritinghelp.html">here</ulink>.  If you are reading this online, check out the Mozilla.org bug-writing guidelines at <ulink url="http://www.mozilla.org/quality/bug-writing-guidelines.html">http://www.mozilla.org/quality/bug-writing-guidelines.html</ulink>.  While some of the advice is Mozilla-specific, the basic principles of reporting Reproducible, Specific bugs, isolating the Product you are using, the Version of the Product, the Component which failed, the Hardware Platform, and Operating System you were using at the time of the failure go a long way toward ensuring accurate, responsible fixes for the bug that bit you.
-	</para>
-	<para>
-	  While you are at it, why not learn how to find previously
-	  reported bugs?  Mozilla.org has published a great tutorial
-	  on finding duplicate bugs, available at <ulink
-							 url="http://www.mozilla.org/quality/help/beginning-duplicate-finding.html"> http://www.mozilla.org/quality/help/beginning-duplicate-finding.html</ulink>.
-	</para>
-	<para>
-	  I realize this was a lot to read.  However, understanding
-	  the mentality of writing great bug reports will help us on
-	  the next part!
-	</para>
-	<orderedlist>
-	  <listitem>
-	    <para>
-	      Go back to <ulink
-				url="http://landfill.tequilarista.org/bugzilla-tip/"> http://landfill.tequilarista.org/bugzilla-tip/</ulink> in your browser.
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Select the  <ulink
-				 url="http://landfill.tequilarista.org/bugzilla-tip/enter_bug.cgi"> Enter a new bug report</ulink> link.
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Select a product.
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Now you should be at the "Enter Bug" form. The
-	      "reporter" should have been automatically filled out for
-	      you (or else Bugzilla prompted you to Log In again --
-	      you did keep the email with your username and password,
-	      didn't you?).
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Select a Component in the scrollbox.
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Bugzilla should have made reasonable guesses, based upon
-	      your browser, for the "Platform" and "OS" drop-down
-	      boxes.  If those are wrong, change them -- if you're on
-	      an SGI box running IRIX, we want to know!
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Fill in the "Assigned To" box with the email address you
-	      provided earlier.  This way you don't end up sending
-	      copies of your bug to lots of other people, since it's
-	      just a test bug.
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Leave the "CC" text box blank.  Fill in the "URL" box
-	      with "http://www.mozilla.org".
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Enter "The Bugzilla Guide" in the Summary text box, and
-	      place any comments you have on this tutorial, or the
-	      Guide in general, into the Description box.
-	    </para>
-	  </listitem>
-	</orderedlist>
-	<para>
-	  Voila!  Select "Commit" and send in your bug report! Next
-	  we'll look at resolving bugs.
-	</para>
-      </section>
-
-      <section id="bug_manage">
-	<title>Managing your Bug Reports</title>
-	<para>
-	  OK, you should have a link to the bug you just created near
-	  the top of your page. It should say "Bug XXXX posted", with
-	  a link to the right saying "Back to BUG# XXXX". Select this
-	  link.
-	</para>
-	<orderedlist>
-	  <listitem>
-	    <para>
-	      Scroll down a bit on the subsequent page, until you see
-	      the "Resolve bug, changing resolution to (dropdown box).
-	      Normally, you would "Accept bug (change status to
-	      ASSIGNED)", fix it, and then resolve. But in this case,
-	      we're going to short-circuit the process because this
-	      wasn't a real bug. Change the dropdown next to "Resolve
-	      Bug" to "INVALID", make sure the radio button is marked
-	      next to "Resolve Bug", then click "Commit".
-	    </para>
-	  </listitem>
-	  <listitem>
-	    <para>
-	      Hey!  It said it couldn't take the change in a big red
-	      box! That's right, you must specify a Comment in order
-	      to make this change.  Select the "Back" button in your
-	      browser, add a Comment, then try Resolving the bug with
-	      INVALID status again. This time it should work.
-	    </para>
-	  </listitem>
-	</orderedlist>
-	<para>
-	  You have now learned the basics of Bugzilla navigation,
-	  entering a bug, and bug maintenance. I encourage you to
-	  explore these features, and see what you can do with them!
-	  We'll spend no more time on individual Bugs or Queries from
-	  this point on, so you are on your own there.
-	</para>
-	<para>
-	  But I'll give a few last hints!
-	</para>
-	<para>
-	  There is a <ulink
-			    url="http://bugzilla.mozilla.org/help.html">CLUE</ulink> on the Query page that will teach you more how to use the form.
-	</para>
-	<para>
-	  If you click the hyperlink on the <ulink
-						   url="http://bugzilla.mozilla.org/describecomponents.cgi">Component</ulink> box of the Query page, you will be presented a form that will describe what all the components are.
-	</para>
-	<para>
-	  Possibly the most powerful feature of the Query page is the
-	  <ulink
-		 url="http://bugzilla.mozilla.org/booleanchart.html">Boolean Chart</ulink> section. It's a bit confusing to use the first time, but can provide unparalleled flexibility in your queries, allowing you to build extremely powerful requests.
-	</para>
-	<para>
-	  Finally, you can build some nifty  <ulink
-						    url="http://bugzilla.mozilla.org/reports.cgi">Reports</ulink> using the "Bug Reports" link near the bottom of the query page, and also available via the "Reports" link at the footer of each page.
-	</para>
-      </section>
-    </section>
-
-  </section>
-
-  <section id="init4me">
-    <title>Where can I find my user preferences?</title>
-    <epigraph>
-      <para>
-	Indiana, it feels like we walking on fortune cookies!
+      <para>Try to make sure that everything said in the summary is also 
+      said in the first comment. Summaries are often updated and this will
+      ensure your original information is easily accessible.
       </para>
+      
       <para>
-	These ain't fortune cookies, kid...
+      You do not need to put "any" or similar strings in the URL field.
+      If there is no specific URL associated with the bug, leave this 
+      field blank.
+      </para> 
+
+      <para>If you feel a bug you filed was incorrectly marked as a
+      DUPLICATE of another, please question it in your bug, not      
+      the bug it was duped to. Feel free to CC the person who duped it 
+      if they are not already CCed.
       </para>
-    </epigraph>
-    <para>
-      Customized User Preferences offer tremendous versatility to your
-      individual Bugzilla experience. Let's plunge into what you can
-      do!  The first step is to click the "Edit prefs" link at the
-      footer of each page once you have logged in to <ulink
-							    url="http://landfill.tequilarista.org/bugzilla-tip/query.cgi?GoAheadAndLogIn=1"> Landfill</ulink>.
-    </para>
+    </section>
+  </section>
+  
+  <section id="userpreferences">
+    <title>User Preferences</title>
+
+    <para>Once you have logged in, you can customise various aspects of 
+    Bugzilla via the "Edit prefs" link in the page footer.
+    The preferences are split into four tabs:</para>
+
     <section id="accountsettings" xreflabel="Account Settings">
       <title>Account Settings</title>
-      <para>
-	On this page, you can change your basic Account Settings,
-	including your password and full name. For security reasons,
-	in order to change anything on this page you must type your
-	<emphasis>current</emphasis> password into the <quote>Old
-	  Password</quote> field.  If you wish to change your
-	password, type the new password you want into the <quote>New
-	  Password</quote> field and again into the <quote>Re-enter
-	  new password</quote> field to ensure you typed your new
-	password correctly.  Select the <quote>Submit</quote> button
-	    and you are done.
-      </para>
+
+      <para>On this tab, you can change your basic account information,
+      including your password, email address and real name. For security
+      reasons, in order to change anything on this page you must type your 
+      <emphasis>current</emphasis>
+      password into the 
+      <quote>Password</quote>
+      field at the top of the page. 
+      If you attempt to change your email address, a confirmation
+      email is sent to both the old and new addresses, with a link to use to
+      confirm the change. This helps to prevent account hijacking.</para>
     </section>
-    <section id="emailsettings" >
+
+    <section id="emailsettings">
       <title>Email Settings</title>
-      <section id="notification" xreflabel="">
-	<title>Email Notification</title>
-	<para>
-	  Here you can reduce or increase the amount of email sent you
-	  from Bugzilla.  Although this is referred to as
-	  <quote>Advanced Email Filtering Options</quote>, they are,
-	  in fact, the standard email filter set.  All of them are
-	  self-explanatory, but you can use the filters in interesting
-	  ways.  For instance, some people (notably Quality Assurance
-	  personnel) often only care to receive updates regarding a
-	  bug when the bug changes state, so they can track bugs on
-	  their flow charts and know when it is time to pull the bug
-	  onto a quality assurance platform for inspection.  Other
-	  people set up email gateways to
-	    <xref linkend="bonsai"> or <xref linkend="tinderbox">, and
-	  restrict which types of Bugzilla information are fed to
-	  these systems..
-	</para>
-      </section>
-      <section id="newemailtech">
-	<title>New Email Technology</title>
-	<note>
-	  <para>
-	    This option may not be available in all Bugzilla
-	    installations, depending upon the preferences of the
-	    systems administrator responsible for the setup of your
-	    Bugzilla. However, if you really want this functionality,
-	    ask her to "enable newemailtech in Params" and "make it
-	    the default for all new users", referring her to the
-	    Administration section of this Guide.
-	  </para>
-	</note>
-	<para>
-	  Disregard the warnings about "experimental and bleeding
-	  edge"; the code to handle email in a cleaner manner than
-	  that historically used for Bugzilla is quite robust and
-	  well-tested now.
-	</para>
-	<para>
-	  I recommend you enable the option, "Click here to sign up
-	  (and risk any bugs)". Your email-box will thank you for it.
-	  The fundamental shift in "newemailtech" is away from
-	  standard UNIX "diff" output, which is quite ugly, to a
-	  prettier, better laid-out email.
-	</para>
-      </section>
-      <section id="watchsettings">
-	<title>"Watching" Users</title>
-	<note>
-	  <para>
-	    This option may not be available in all Bugzilla
-	    installations, depending upon the preferences of the
-	    systems administrator responsible for the setup of your
-	    Bugzilla. However, if you really want this functionality,
-	    ask her to "enable watchers in Params".
-	  </para>
-	</note>
-	<para>
-	  By entering user email names into the "Users to watch" text
-	  entry box, delineated by commas, you can watch bugs of other
-	  users.  This powerful functionality enables seamless
-	  transitions as developers change projects, managers wish to
-	  get in touch with the issues faced by their direct reports,
-	  or users go on vacation.  If any of these three situations
-	  apply to you, you will undoubtedly find this feature quite
-	  convenient.
-	</para>
-      </section>
+
+      <para>On this tab you can reduce or increase the amount of email sent
+      you from Bugzilla, opting in our out depending on your relationship to
+      the bug and the change that was made to it. (Note that you can also do
+      client-side filtering using the X-Bugzilla-Reason header which Bugzilla
+      adds to all bugmail.)</para>
+
+      <para>By entering user email names, delineated by commas, into the
+      "Users to watch" text entry box you can receive a copy of all the
+      bugmail of other users (security settings permitting.) This powerful
+      functionality enables seamless transitions as developers change
+      projects or users go on holiday.</para>
+
+      <note>
+        <para>The ability to watch other users may not be available in all
+        Bugzilla installations. If you can't see it, ask your 
+        administrator.</para>
+      </note>
     </section>
+
     <section id="footersettings">
       <title>Page Footer</title>
-      <note>
-	<para>
-	  By default, this page is quite barren.  However, go explore
-	  the Query Page some more; you will find that you can store
-	  numerous queries on the server, so if you regularly run a
-	  particular query it is just a drop-down menu away.  On this
-	  page of Preferences, if you have many stored queries you can
-	  elect to have them always one-click away!
-	</para>
-      </note>
-      <para>
-	If you have many stored queries on the server, here you will
-	find individual drop-downs for each stored query.  Each
-	drop-down gives you the option of that query appearing on the
-	footer of every page in Bugzilla!  This gives you powerful
-	one-click access to any complex searches you may set up, and
-	is an excellent way to impress your boss...
-      </para>
-      <tip>
-	<para>By default, the "My Bugs" link appears at the bottom of
-	  each page.  However, this query gives you both the bugs you
-	  have reported, as well as those you are assigned.  One of
-	  the most common uses for this page is to remove the "My
-	  Bugs" link, replacing it with two other queries, commonly
-	  called "My Bug Reports" and "My Bugs" (but only referencing
-	  bugs assigned to you).  This allows you to distinguish those
-	  bugs you have reported from those you are assigned.  I
-	  commonly set up complex Boolean queries in the Query page
-	  and link them to my footer in this page.  When they are
-	  significantly complex, a one-click reference can save hours
-	  of work.</para>
-      </tip>
+      
+      <para>On the Search page, you can store queries in Bugzilla, so if you
+      regularly run a particular query it is just a drop-down menu away. 
+      Once you have a stored query, you can come
+      here to request that it also be displayed in your page footer.</para>
     </section>
+
     <section id="permissionsettings">
       <title>Permissions</title>
-      <para>
-	This is a purely informative page which outlines your current
-	permissions on this installation of Bugzilla.  If you have
-	permissions to grant certain permissions to other users, the
-	"other users" link appears on this page as well as the footer.
-	For more information regarding user administration, please
-	consult the Administration section of this Guide.
-      </para>
+      
+      <para>This is a purely informative page which outlines your current
+      permissions on this installation of Bugzilla - what product groups you
+      are in, and whether you can edit bugs or perform various administration
+      functions.</para>
     </section>
   </section>
-
-  <section id="usingbz-conc">
-    <title>Using Bugzilla-Conclusion</title>
-    <para>
-      Thank you for reading through this portion of the Bugzilla
-      Guide.  I anticipate it may not yet meet the needs of all
-      readers.  If you have additional comments or corrections to
-      make, please submit your contributions to the <ulink
-							   url="mailto://mozilla-webtools@mozilla.org">mozilla-webtools</ulink> mailing list/newsgroup.  The mailing list is mirrored to the netscape.public.mozilla.webtools newsgroup, and the newsgroup is mirrored to mozilla-webtools@mozilla.org
-    </para>
-  </section>
 </chapter>
 
-
 <!-- Keep this comment at the end of the file
 Local variables:
 mode: sgml
@@ -948,3 +577,4 @@ sgml-shorttag:t
 sgml-tag-region-if-active:t
 End:
 -->
+
diff --git a/docs/sgml/variants.sgml b/docs/sgml/variants.sgml
index a5b346023..73f6822fb 100644
--- a/docs/sgml/variants.sgml
+++ b/docs/sgml/variants.sgml
@@ -1,78 +1,87 @@
 <!-- <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook V4.1//EN">-->
-
-<chapter id="variants" xreflabel="Bugzilla Variants and Competitors">
+<appendix id="variants" xreflabel="Bugzilla Variants and Competitors">
   <title>Bugzilla Variants and Competitors</title>
-  <para>I created this section to answer questions about Bugzilla
-    competitors and variants, then found a wonderful site which covers
-    an awful lot of what I wanted to discuss.  Rather than quote it in
-    its entirety, I'll simply refer you here: <ulink
-						     url="http://linas.org/linux/pm.html">http://linas.org/linux/pm.html</ulink></para>
+
+  <para>I created this section to answer questions about Bugzilla competitors
+  and variants, then found a wonderful site which covers an awful lot of what
+  I wanted to discuss. Rather than quote it in its entirety, I'll simply
+  refer you here: 
+  <ulink url="http://linas.org/linux/pm.html">
+  http://linas.org/linux/pm.html</ulink>
+  </para>
 
   <section id="rhbugzilla" xreflabel="Red Hat Bugzilla">
     <title>Red Hat Bugzilla</title>
-    <para>
-      Red Hat Bugzilla is probably the most popular Bugzilla variant
-      on the planet. One of the major benefits of Red Hat Bugzilla is
-      the ability to work with Oracle, MySQL, and PostGreSQL databases
-      serving as the back-end, instead of just MySQL.  Dave Lawrence
-      has worked very hard to keep Red Hat Bugzilla up-to-date, and
-      many people prefer the snappier-looking page layout of Red Hat
-      Bugzilla to the default Mozilla-standard formatting.
+
+    <para>Red Hat Bugzilla is a fork of Bugzilla 2.8. 
+    One of its major benefits is the ability
+    to work with Oracle, MySQL, and PostGreSQL databases serving as the
+    back-end, instead of just MySQL. Dave Lawrence of Red Hat is 
+    active in the Bugzilla community, and we hope to see a reunification
+    of the fork before too long.</para>
+
+    <para>URL: 
+    <ulink url="http://bugzilla.redhat.com/bugzilla/">
+    http://bugzilla.redhat.com/bugzilla/</ulink>
     </para>
-    <para>URL: <ulink
-		      url="http://bugzilla.redhat.com/bugzilla/">http://bugzilla.redhat.com/bugzilla/</ulink></para>
   </section>
 
-  <section id="variant_fenris" xreflabel="Loki Bugzilla, a.k.a. Fenris">
+  <section id="variant-fenris" xreflabel="Loki Bugzilla, a.k.a. Fenris">
     <title>Loki Bugzilla (Fenris)</title>
-    <para>Fenris can be found at <ulink
-					url="http://fenris.lokigames.com/">http://fenris.lokigames.com</ulink>.  It is a fork from Bugzilla.</para>
+
+    <para>Fenris was a fork from Bugzilla made by Loki Games; when
+    Loki went into receivership, it died. While Loki's other code lives on,
+    its custodians recommend Bugzilla for future bug-tracker deployments.
+    </para>
   </section>
 
-  <section id="variant_issuezilla" xreflabel="Issuezilla">
+  <section id="variant-issuezilla" xreflabel="Issuezilla">
     <title>Issuezilla</title>
-    <para>Issuezilla is another fork from Bugzilla, and seems nearly
-      as popular as the Red Hat Bugzilla fork.  Some Issuezilla team
-      members are regular contributors to the Bugzilla mailing
-      list/newsgroup.  Issuezilla is not the primary focus of
-      bug-tracking at tigris.org, however.  Their Java-based
-      bug-tracker, <xref linkend="variant_scarab">, is under heavy development
-      and looks promising!</para>
-    <para>URL:  <ulink url="http://issuezilla.tigris.org/servlets/ProjectHome">http://issuezilla.tigris.org/servlets/ProjectHome</ulink></para>
+
+    <para>Issuezilla was another fork from Bugzilla, made by collab.net and
+    hosted at tigris.org. It is also dead; the primary focus of bug-tracking 
+    at tigris.org is their Java-based bug-tracker, 
+    <xref linkend="variant-scarab"/>.</para>
   </section>
 
-  <section id="variant_scarab" xreflabel="Scarab, a newfangled Java-based issue tracker">
+  <section id="variant-scarab" xreflabel="Scarab">
     <title>Scarab</title>
-    <para>Scarab is a promising new bug-tracking system built using
-      Java Serlet technology.  As of this writing, no source code has
-      been released as a package, but you can obtain the code from
-      CVS.
+
+    <para>Scarab is a new open source bug-tracking system built using Java
+    Serlet technology. It is currently at version 1.0 beta 8.</para>
+
+    <para>URL: 
+    <ulink url="http://scarab.tigris.org/">http://scarab.tigris.org</ulink>
     </para>
-    <para>URL: <ulink url="http://scarab.tigris.org/">http://scarab.tigris.org</ulink></para>
   </section>
 
-  <section id="variant_perforce" xreflabel="Using Perforce to track bugs">
+  <section id="variant-perforce" xreflabel="Using Perforce to track bugs">
     <title>Perforce SCM</title>
-    <para>Although Perforce isn't really a bug tracker, it can be used
-      as such through the <quote>jobs</quote> functionality.</para>
-    <para><ulink
-		 url="http://www.perforce.com/perforce/technotes/note052.html"></ulink>http://www.perforce.com/perforce/technotes/note052.html</para>
-  </section>
 
-  <section id="variant_sourceforge" xreflabel="SourceForge">
-    <title>SourceForge</title>
-    <para>SourceForge is more of a way of coordinating geographically
-      distributed free software and open source projects over the
-      Internet than strictly a bug tracker, but if you're hunting for
-      bug-tracking for your open project, it may be just what the
-      software engineer ordered!</para>
-    <para>URL: <ulink
-		      url="http://www.sourceforge.net">http://www.sourceforge.net</ulink></para>
+    <para>Although Perforce isn't really a bug tracker, it can be used as
+    such through the <quote>jobs</quote>
+    functionality.</para>
+
+    <para>URL: 
+    <ulink url="http://www.perforce.com/perforce/technotes/note052.html">
+    http://www.perforce.com/perforce/technotes/note052.html
+    </ulink>
+    </para>
   </section>
 
+  <section id="variant-sourceforge" xreflabel="SourceForge">
+    <title>SourceForge</title>
 
+    <para>SourceForge is a way of coordinating geographically
+    distributed free software and open source projects over the Internet.
+    It has a built-in bug tracker, but it's not highly thought of.</para>
 
-</chapter>
+    <para>URL: 
+    <ulink url="http://www.sourceforge.net">
+    http://www.sourceforge.net</ulink>
+    </para>
+  </section>
+</appendix>
 
 <!-- Keep this comment at the end of the file
 Local variables:
@@ -94,3 +103,4 @@ sgml-shorttag:t
 sgml-tag-region-if-active:t
 End:
 -->
+
diff --git a/docs/txt/Bugzilla-Guide.txt b/docs/txt/Bugzilla-Guide.txt
index 17caf5ddd..090154f99 100644
--- a/docs/txt/Bugzilla-Guide.txt
+++ b/docs/txt/Bugzilla-Guide.txt
@@ -1,434 +1,563 @@
 
-The Bugzilla Guide
-
-Matthew P. Barnson
-
-   barnboy@trilobyte.net
-   Zach Lipton
-
-   zach AT zachlipton DOT com
-   Revision History
-   Revision v2.11  20 December 2000 Revised by: MPB
-   Converted the README, FAQ, and DATABASE information into SGML docbook
-   format.
-   Revision 2.11.1 06 March 2001    Revised by: MPB
-   Took way too long to revise this for 2.12 release. Updated FAQ to use
-   qandaset tags instead of literallayout, cleaned up administration
-   section, added User Guide section, miscellaneous FAQ updates and
-   third-party integration information. From this point on all new tags
-   are lowercase in preparation for the 2.13 release of the Guide in XML
-   format instead of SGML.
-   Revision 2.12.0 24 April 2001    Revised by: MPB
-   Things fixed this release: Elaborated on queryhelp interface, added
-   FAQ regarding moving bugs from one keyword to another, clarified
-   possible problems with the Landfill tutorial, fixed a boatload of
-   typos and unclear sentence structures. Incorporated the README into
-   the UNIX installation section, and changed the README to indicate the
-   deprecated status. Things I know need work: Used "simplelist" a lot,
-   where I should have used "procedure" to tag things. Need to lowercase
-   all tags to be XML compliant.
-   Revision 2.14.0 07 August 2001   Revised by: MPB
-   Attempted to integrate relevant portions of the UNIX and Windows
-   installation instructions, moved some data from FAQ to Install,
-   removed references to README from text, added Mac OS X install
-   instructions, fixed a bunch of tpyos (Mark Harig), linked text that
-   referenced other parts of the Guide, and nuked the old MySQL
-   permissions section.
-
-   This is the documentation for Bugzilla, the Mozilla bug-tracking
-   system.
+The Bugzilla GuideMatthew P. BarnsonThe Bugzilla Team
 
-   Bugzilla is an enterprise-class set of software utilities that, when
-   used together, power issue-tracking for hundreds of organizations
-   around the world, tracking millions of bugs. While it is easy to use
-   and quite flexible, it is very difficult for a novice to install and
-   maintain. Although we have provided step-by-step directions, Bugzilla
-   is not always easy to get working. Please be sure the person
-   responsible for installing and maintaining this software is a
-   qualified professional on operating system upon which you install
-   Bugzilla.
+   This is the documentation for Bugzilla, the mozilla.org bug-tracking
+   system. Bugzilla is an enterprise-class piece of software that powers
+   issue-tracking for hundreds of organizations around the world,
+   tracking millions of bugs.
 
-   THIS DOCUMENTATION IS MAINTAINED IN DOCBOOK 4.1 SGML FORMAT. IF YOU
-   WISH TO MAKE CORRECTIONS, PLEASE MAKE THEM IN PLAIN TEXT OR SGML DIFFS
-   AGAINST THE SOURCE. I CANNOT ACCEPT ADDITIONS TO THE GUIDE WRITTEN IN
-   HTML!
-     _________________________________________________________________
+   This documentation is maintained in DocBook 4.1.2 XML format. Changes
+   are best submitted as plain text or SGML diffs, attached to a bug
+   filed in mozilla.org's Bugzilla.
+  _______________________________________________________________________
 
    Table of Contents
    1. About This Guide
 
-        1.1. Purpose and Scope of this Guide
-        1.2. Copyright Information
-        1.3. Disclaimer
-        1.4. New Versions
-        1.5. Credits
-        1.6. Contributors
-        1.7. Feedback
-        1.8. Translations
-        1.9. Document Conventions
+        1.1. Copyright Information
+        1.2. Disclaimer
+        1.3. New Versions
+        1.4. Credits
+        1.5. Document Conventions
 
-   2. Using Bugzilla
+   2. Introduction
 
         2.1. What is Bugzilla?
         2.2. Why Should We Use Bugzilla?
-        2.3. How do I use Bugzilla?
 
-              2.3.1. Create a Bugzilla Account
-              2.3.2. The Bugzilla Query Page
-              2.3.3. Creating and Managing Bug Reports
+   3. Using Bugzilla
 
-                    2.3.3.1. Writing a Great Bug Report
-                    2.3.3.2. Managing your Bug Reports
+        3.1. How do I use Bugzilla?
+        3.2. Hints and Tips
+        3.3. User Preferences
 
-        2.4. Where can I find my user preferences?
+   4. Installation
 
-              2.4.1. Account Settings
-              2.4.2. Email Settings
+        4.1. Step-by-step Install
+        4.2. Optional Additional Configuration
+        4.3. Win32 Installation Notes
+        4.4. Mac OS X Installation Notes
+        4.5. Troubleshooting
 
-                    2.4.2.1. Email Notification
-                    2.4.2.2. New Email Technology
-                    2.4.2.3. "Watching" Users
+   5. Administering Bugzilla
 
-              2.4.3. Page Footer
-              2.4.4. Permissions
+        5.1. Bugzilla Configuration
+        5.2. User Administration
+        5.3. Product, Component, Milestone, and Version Administration
+        5.4. Voting
+        5.5. Groups and Group Security
+        5.6. Bugzilla Security
+        5.7. Template Customisation
+        5.8. Upgrading to New Releases
+        5.9. Integrating Bugzilla with Third-Party Tools
 
-        2.5. Using Bugzilla-Conclusion
+   A. The Bugzilla FAQ
+   B. The Bugzilla Database
 
-   3. Installation
+        B.1. Database Schema Chart
+        B.2. MySQL Bugzilla Database Introduction
 
-        3.1. ERRATA
-        3.2. Step-by-step Install
+   C. Useful Patches and Utilities for Bugzilla
 
-              3.2.1. Introduction
-              3.2.2. Installing the Prerequisites
-              3.2.3. Installing MySQL Database
-              3.2.4. Perl (5.004 or greater)
-              3.2.5. DBI Perl Module
-              3.2.6. Data::Dumper Perl Module
-              3.2.7. MySQL related Perl Module Collection
-              3.2.8. TimeDate Perl Module Collection
-              3.2.9. GD Perl Module (1.8.3)
-              3.2.10. Chart::Base Perl Module (0.99c)
-              3.2.11. DB_File Perl Module
-              3.2.12. HTTP Server
-              3.2.13. Installing the Bugzilla Files
-              3.2.14. Setting Up the MySQL Database
-              3.2.15. Tweaking localconfig
-              3.2.16. Setting Up Maintainers Manually (Optional)
-              3.2.17. The Whining Cron (Optional)
-              3.2.18. Bug Graphs (Optional)
-              3.2.19. Securing MySQL
+        C.1. Apache mod_rewrite magic
+        C.2. Command-line Bugzilla Queries
 
-        3.3. Mac OS X Installation Notes
-        3.4. BSD Installation Notes
-        3.5. Installation General Notes
+   D. Bugzilla Variants and Competitors
 
-              3.5.1. Modifying Your Running System
-              3.5.2. Upgrading From Previous Versions
-              3.5.3. .htaccess files and security
-              3.5.4. mod_throttle and Security
-              3.5.5. Preventing untrusted Bugzilla content from executing
-                      malicious Javascript code
+        D.1. Red Hat Bugzilla
+        D.2. Loki Bugzilla (Fenris)
+        D.3. Issuezilla
+        D.4. Scarab
+        D.5. Perforce SCM
+        D.6. SourceForge
 
-              3.5.6. UNIX Installation Instructions History
+   Glossary
 
-        3.6. Win32 Installation Notes
+   List of Examples
+   4-1. Installing ActivePerl ppd Modules on Microsoft Windows
+   4-2. Installing OpenInteract ppd Modules manually on Microsoft Windows
+   4-3. Removing encrypt() for Windows NT Bugzilla version 2.12 or
+          earlier
+     _________________________________________________________________
 
-              3.6.1. Win32 Installation: Step-by-step
-              3.6.2. Additional Windows Tips
-              3.6.3. Bugzilla LDAP Integration
+Chapter 1. About This Guide
 
-   4. Administering Bugzilla
+1.1. Copyright Information
 
-        4.1. Post-Installation Checklist
-        4.2. User Administration
 
-              4.2.1. Creating the Default User
-              4.2.2. Managing Other Users
 
-                    4.2.2.1. Logging In
-                    4.2.2.2. Creating new users
-                    4.2.2.3. Disabling Users
-                    4.2.2.4. Modifying Users
+   Permission is granted to copy, distribute and/or modify this document
+   under the terms of the GNU Free Documentation License, Version 1.1 or
+   any later version published by the Free Software Foundation; with no
+   Invariant Sections, no Front-Cover Texts, and with no Back-Cover
+   Texts. A copy of the license is included below.
 
-        4.3. Product, Component, Milestone, and Version Administration
+--Copyright (c) 2000-2002 Matthew P. Barnson and The Bugzilla Team
 
-              4.3.1. Products
-              4.3.2. Components
-              4.3.3. Versions
-              4.3.4. Milestones
-              4.3.5. Voting
-              4.3.6. Groups and Group Security
+   If you have any questions regarding this document, its copyright, or
+   publishing this document in non-electronic form, please contact The
+   Bugzilla Team.
+     _________________________________________________________________
 
-        4.4. Bugzilla Security
+1.1.1. GNU Free Documentation License
 
-   5. Integrating Bugzilla with Third-Party Tools
+Version 1.1, March 2000
 
-        5.1. Bonsai
-        5.2. CVS
-        5.3. Perforce SCM
-        5.4. Tinderbox/Tinderbox2
+     Copyright (C) 2000 Free Software Foundation, Inc. 59 Temple Place,
+     Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy
+     and distribute verbatim copies of this license document, but
+     changing it is not allowed.
+     _________________________________________________________________
 
-   6. The Future of Bugzilla
-   7. Bugzilla Variants and Competitors
+0. PREAMBLE
 
-        7.1. Red Hat Bugzilla
-        7.2. Loki Bugzilla (Fenris)
-        7.3. Issuezilla
-        7.4. Scarab
-        7.5. Perforce SCM
-        7.6. SourceForge
+The purpose of this License is to make a manual, textbook, or other written
+document "free" in the sense of freedom: to assure everyone the effective
+freedom to copy and redistribute it, with or without modifying it, either
+commercially or noncommercially. Secondarily, this License preserves for the
+author and publisher a way to get credit for their work, while not being
+considered responsible for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative works of
+the document must themselves be free in the same sense. It complements the
+GNU General Public License, which is a copyleft license designed for free
+software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free program
+should come with manuals providing the same freedoms that the software does.
+But this License is not limited to software manuals; it can be used for any
+textual work, regardless of subject matter or whether it is published as a
+printed book. We recommend this License principally for works whose purpose
+is instruction or reference.
+     _________________________________________________________________
 
-   A. The Bugzilla FAQ
-   B. Software Download Links
-   C. The Bugzilla Database
+1. APPLICABILITY AND DEFINITIONS
 
-        C.1. Database Schema Chart
-        C.2. MySQL Bugzilla Database Introduction
+This License applies to any manual or other work that contains a notice
+placed by the copyright holder saying it can be distributed under the terms
+of this License. The "Document", below, refers to any such manual or work.
+Any member of the public is a licensee, and is addressed as "you".
+
+A "Modified Version" of the Document means any work containing the Document
+or a portion of it, either copied verbatim, or with modifications and/or
+translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of the
+Document that deals exclusively with the relationship of the publishers or
+authors of the Document to the Document's overall subject (or to related
+matters) and contains nothing that could fall directly within that overall
+subject. (For example, if the Document is in part a textbook of mathematics,
+a Secondary Section may not explain any mathematics.) The relationship could
+be a matter of historical connection with the subject or with related
+matters, or of legal, commercial, philosophical, ethical or political
+position regarding them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles are
+designated, as being those of Invariant Sections, in the notice that says
+that the Document is released under this License.
+
+The "Cover Texts" are certain short passages of text that are listed, as
+Front-Cover Texts or Back-Cover Texts, in the notice that says that the
+Document is released under this License.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the general
+public, whose contents can be viewed and edited directly and
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or for
+automatic translation to a variety of formats suitable for input to text
+formatters. A copy made in an otherwise Transparent file format whose markup
+has been designed to thwart or discourage subsequent modification by readers
+is not Transparent. A copy that is not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain ASCII
+without markup, Texinfo input format, LaTeX input format, SGML or XML using
+a publicly available DTD, and standard-conforming simple HTML designed for
+human modification. Opaque formats include PostScript, PDF, proprietary
+formats that can be read and edited only by proprietary word processors,
+SGML or XML for which the DTD and/or processing tools are not generally
+available, and the machine-generated HTML produced by some word processors
+for output purposes only.
+
+The "Title Page" means, for a printed book, the title page itself, plus such
+following pages as are needed to hold, legibly, the material this License
+requires to appear in the title page. For works in formats which do not have
+any title page as such, "Title Page" means the text near the most prominent
+appearance of the work's title, preceding the beginning of the body of the
+text.
+     _________________________________________________________________
 
-              C.2.1. Bugzilla Database Basics
+2. VERBATIM COPYING
 
-                    C.2.1.1. Bugzilla Database Tables
+You may copy and distribute the Document in any medium, either commercially
+or noncommercially, provided that this License, the copyright notices, and
+the license notice saying this License applies to the Document are
+reproduced in all copies, and that you add no other conditions whatsoever to
+those of this License. You may not use technical measures to obstruct or
+control the reading or further copying of the copies you make or distribute.
+However, you may accept compensation in exchange for copies. If you
+distribute a large enough number of copies you must also follow the
+conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and you
+may publicly display copies.
+     _________________________________________________________________
 
-        C.3. MySQL Permissions & Grant Tables
+3. COPYING IN QUANTITY
 
-   D. Useful Patches and Utilities for Bugzilla
+If you publish printed copies of the Document numbering more than 100, and
+the Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover Texts:
+Front-Cover Texts on the front cover, and Back-Cover Texts on the back
+cover. Both covers must also clearly and legibly identify you as the
+publisher of these copies. The front cover must present the full title with
+all words of the title equally prominent and visible. You may add other
+material on the covers in addition. Copying with changes limited to the
+covers, as long as they preserve the title of the Document and satisfy these
+conditions, can be treated as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit legibly,
+you should put the first ones listed (as many as fit reasonably) on the
+actual cover, and continue the rest onto adjacent pages.
+
+If you publish or distribute Opaque copies of the Document numbering more
+than 100, you must either include a machine-readable Transparent copy along
+with each Opaque copy, or state in or with each Opaque copy a
+publicly-accessible computer-network location containing a complete
+Transparent copy of the Document, free of added material, which the general
+network-using public has access to download anonymously at no charge using
+public-standard network protocols. If you use the latter option, you must
+take reasonably prudent steps, when you begin distribution of Opaque copies
+in quantity, to ensure that this Transparent copy will remain thus
+accessible at the stated location until at least one year after the last
+time you distribute an Opaque copy (directly or through your agents or
+retailers) of that edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give them
+a chance to provide you with an updated version of the Document.
+     _________________________________________________________________
 
-        D.1. Apache mod_rewrite magic
-        D.2. The setperl.csh Utility
-        D.3. Command-line Bugzilla Queries
-        D.4. The Quicksearch Utility
-        D.5. Hacking Bugzilla
+4. MODIFICATIONS
 
-   E. GNU Free Documentation License
+You may copy and distribute a Modified Version of the Document under the
+conditions of sections 2 and 3 above, provided that you release the Modified
+Version under precisely this License, with the Modified Version filling the
+role of the Document, thus licensing distribution and modification of the
+Modified Version to whoever possesses a copy of it. In addition, you must do
+these things in the Modified Version:
 
-        0. PREAMBLE
-        1. APPLICABILITY AND DEFINITIONS
-        2. VERBATIM COPYING
-        3. COPYING IN QUANTITY
-        4. MODIFICATIONS
-        5. COMBINING DOCUMENTS
-        6. COLLECTIONS OF DOCUMENTS
-        7. AGGREGATION WITH INDEPENDENT WORKS
-        8. TRANSLATION
-        9. TERMINATION
-        10. FUTURE REVISIONS OF THIS LICENSE
-        How to use this License for your documents
+    A. Use in the Title Page (and on the covers, if any) a title distinct
+       from that of the Document, and from those of previous versions
+       (which should, if there were any, be listed in the History section
+       of the Document). You may use the same title as a previous version
+       if the original publisher of that version gives permission.
+    B. List on the Title Page, as authors, one or more persons or
+       entities responsible for authorship of the modifications in the
+       Modified Version, together with at least five of the principal
+       authors of the Document (all of its principal authors, if it has
+       less than five).
+    C. State on the Title page the name of the publisher of the Modified
+       Version, as the publisher.
+    D. Preserve all the copyright notices of the Document.
+    E. Add an appropriate copyright notice for your modifications
+       adjacent to the other copyright notices.
+    F. Include, immediately after the copyright notices, a license notice
+       giving the public permission to use the Modified Version under the
+       terms of this License, in the form shown in the Addendum below.
+    G. Preserve in that license notice the full lists of Invariant
+       Sections and required Cover Texts given in the Document's license
+       notice.
+    H. Include an unaltered copy of this License.
+    I. Preserve the section entitled "History", and its title, and add to
+       it an item stating at least the title, year, new authors, and
+       publisher of the Modified Version as given on the Title Page. If
+       there is no section entitled "History" in the Document, create one
+       stating the title, year, authors, and publisher of the Document as
+       given on its Title Page, then add an item describing the Modified
+       Version as stated in the previous sentence.
+    J. Preserve the network location, if any, given in the Document for
+       public access to a Transparent copy of the Document, and likewise
+       the network locations given in the Document for previous versions
+       it was based on. These may be placed in the "History" section. You
+       may omit a network location for a work that was published at least
+       four years before the Document itself, or if the original
+       publisher of the version it refers to gives permission.
+    K. In any section entitled "Acknowledgements" or "Dedications",
+       preserve the section's title, and preserve in the section all the
+       substance and tone of each of the contributor acknowledgements
+       and/or dedications given therein.
+    L. Preserve all the Invariant Sections of the Document, unaltered in
+       their text and in their titles. Section numbers or the equivalent
+       are not considered part of the section titles.
+    M. Delete any section entitled "Endorsements". Such a section may not
+       be included in the Modified Version.
+    N. Do not retitle any existing section as "Endorsements" or to
+       conflict in title with any Invariant Section.
 
-   Glossary
+   If the Modified Version includes new front-matter sections or
+   appendices that qualify as Secondary Sections and contain no material
+   copied from the Document, you may at your option designate some or all
+   of these sections as invariant. To do this, add their titles to the
+   list of Invariant Sections in the Modified Version's license notice.
+   These titles must be distinct from any other section titles.
 
-   List of Examples
-   2-1. Some Famous Software Versions
-   2-2. Mozilla's Bugzilla Components
-   3-1. Setting up bonsaitools symlink
-   3-2. Running checksetup.pl as the web user
-   3-3. Installing ActivePerl ppd Modules on Microsoft Windows
-   3-4. Removing encrypt() for Windows NT Bugzilla version 2.12 or
-          earlier
+   You may add a section entitled "Endorsements", provided it contains
+   nothing but endorsements of your Modified Version by various
+   parties--for example, statements of peer review or that the text has
+   been approved by an organization as the authoritative definition of a
+   standard.
 
-   4-1. Creating some Components
-   4-2. Common Use of Versions
-   4-3. A Different Use of Versions
-   4-4. Using SortKey with Target Milestone
-   4-5. When to Use Group Security
-   4-6. Creating a New Group
-   4-7. Bugzilla Groups
-   D-1. Using Setperl to set your perl path
-   1. A Sample Product
+   You may add a passage of up to five words as a Front-Cover Text, and a
+   passage of up to 25 words as a Back-Cover Text, to the end of the list
+   of Cover Texts in the Modified Version. Only one passage of
+   Front-Cover Text and one of Back-Cover Text may be added by (or
+   through arrangements made by) any one entity. If the Document already
+   includes a cover text for the same cover, previously added by you or
+   by arrangement made by the same entity you are acting on behalf of,
+   you may not add another; but you may replace the old one, on explicit
+   permission from the previous publisher that added the old one.
+
+   The author(s) and publisher(s) of the Document do not by this License
+   give permission to use their names for publicity for or to assert or
+   imply endorsement of any Modified Version.
      _________________________________________________________________
 
-Chapter 1. About This Guide
+5. COMBINING DOCUMENTS
 
-1.1. Purpose and Scope of this Guide
-
-   This document was started on September 17, 2000 by Matthew P. Barnson
-   after a great deal of procrastination updating the Bugzilla FAQ, which
-   I left untouched for nearly half a year. After numerous complete
-   rewrites and reformatting, it is the document you see today.
-
-   Bugzilla is simply the best piece of bug-tracking software the world
-   has ever seen. This document is intended to be the comprehensive guide
-   to the installation, administration, maintenance, and use of the
-   Bugzilla bug-tracking system.
-
-   This release of the Bugzilla Guide is the 2.14 release. It is so named
-   that it may match the current version of Bugzilla. The numbering
-   tradition stems from that used for many free software projects, in
-   which even-numbered point releases (1.2, 1.14, etc.) are considered
-   "stable releases", intended for public consumption; on the other hand,
-   odd-numbered point releases (1.3, 2.09, etc.) are considered unstable
-   development releases intended for advanced users, systems
-   administrators, developers, and those who enjoy a lot of pain.
-
-   Newer revisions of the Bugzilla Guide follow the numbering conventions
-   of the main-tree Bugzilla releases, available at
-   http://www.mozilla.org/projects/bugzilla. Intermediate releases will
-   have a minor revision number following a period. The current version
-   of Bugzilla, as of this writing (August 10, 2001) is 2.14; if
-   something were seriously wrong with that edition of the Guide,
-   subsequent releases would receive an additional dotted-decimal digit
-   to indicate the update (2.14.1, 2.14.2, etc.). Got it? Good.
-
-   I wrote this in response to the enormous demand for decent Bugzilla
-   documentation. I have incorporated instructions from the Bugzilla
-   README, Frequently Asked Questions, Database Schema Document, and
-   various mailing lists to create it. Chances are, there are glaring
-   errors in this documentation; please contact <barnboy@trilobyte.net>
-   to correct them.
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified versions,
+provided that you include in the combination all of the Invariant Sections
+of all of the original documents, unmodified, and list them all as Invariant
+Sections of your combined work in its license notice.
+
+The combined work need only contain one copy of this License, and multiple
+identical Invariant Sections may be replaced with a single copy. If there
+are multiple Invariant Sections with the same name but different contents,
+make the title of each such section unique by adding at the end of it, in
+parentheses, the name of the original author or publisher of that section if
+known, or else a unique number. Make the same adjustment to the section
+titles in the list of Invariant Sections in the license notice of the
+combined work.
+
+In the combination, you must combine any sections entitled "History" in the
+various original documents, forming one section entitled "History"; likewise
+combine any sections entitled "Acknowledgements", and any sections entitled
+"Dedications". You must delete all sections entitled "Endorsements."
      _________________________________________________________________
 
-1.2. Copyright Information
+6. COLLECTIONS OF DOCUMENTS
 
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in the
+collection, provided that you follow the rules of this License for verbatim
+copying of each of the documents in all other respects.
 
+You may extract a single document from such a collection, and distribute it
+individually under this License, provided you insert a copy of this License
+into the extracted document, and follow this License in all other respects
+regarding verbatim copying of that document.
+     _________________________________________________________________
 
-   Permission is granted to copy, distribute and/or modify this document
-   under the terms of the GNU Free Documentation License, Version 1.1 or
-   any later version published by the Free Software Foundation; with no
-   Invariant Sections, no Front-Cover Texts, and with no Back-Cover
-   Texts. A copy of the license is included in the section entitled "GNU
-   Free Documentation LIcense".
+7. AGGREGATION WITH INDEPENDENT WORKS
 
-   --Copyright (c) 2000-2001 Matthew P. Barnson
+A compilation of the Document or its derivatives with other separate and
+independent documents or works, in or on a volume of a storage or
+distribution medium, does not as a whole count as a Modified Version of the
+Document, provided no compilation copyright is claimed for the compilation.
+Such a compilation is called an "aggregate", and this License does not apply
+to the other self-contained works thus compiled with the Document, on
+account of their being thus compiled, if they are not themselves derivative
+works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these copies of
+the Document, then if the Document is less than one quarter of the entire
+aggregate, the Document's Cover Texts may be placed on covers that surround
+only the Document within the aggregate. Otherwise they must appear on covers
+around the whole aggregate.
+     _________________________________________________________________
 
-   If you have any questions regarding this document, its copyright, or
-   publishing this document in non-electronic form, please contact
-   Matthew P. Barnson.
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may distribute
+translations of the Document under the terms of section 4. Replacing
+Invariant Sections with translations requires special permission from their
+copyright holders, but you may include translations of some or all Invariant
+Sections in addition to the original versions of these Invariant Sections.
+You may include a translation of this License provided that you also include
+the original English version of this License. In case of a disagreement
+between the translation and the original English version of this License,
+the original English version will prevail.
      _________________________________________________________________
 
-1.3. Disclaimer
-
-   No liability for the contents of this document can be accepted. Use
-   the concepts, examples, and other content at your own risk. As this is
-   a new edition of this document, there may be errors and inaccuracies
-   that may damage your system. Use of this document may cause your
-   girlfriend to leave you, your cats to pee on your furniture and
-   clothing, your computer to cease functioning, your boss to fire you,
-   and global thermonuclear war. Proceed with caution.
-
-   All copyrights are held by their respective owners, unless
-   specifically noted otherwise. Use of a term in this document should
-   not be regarded as affecting the validity of any trademark or service
-   mark.
-
-   Naming of particular products or brands should not be seen as
-   endorsements, with the exception of the term "GNU/Linux". I
-   wholeheartedly endorse the use of GNU/Linux in every situation where
-   it is appropriate. It is an extremely versatile, stable, and robust
-   operating system that offers an ideal operating environment for
-   Bugzilla.
+9. TERMINATION
 
-   You are strongly recommended to make a backup of your system before
-   installing Bugzilla and at regular intervals thereafter. Heaven knows
-   it's saved my bacon time after time; if you implement any suggestion
-   in this Guide, implement this one!
-
-   Although the Bugzilla development team has taken great care to ensure
-   that all easily-exploitable bugs or options are documented or fixed in
-   the code, security holes surely exist. Great care should be taken both
-   in the installation and usage of this software. Carefully consider the
-   implications of installing other network services with Bugzilla. The
-   Bugzilla development team members, Netscape Communications, America
-   Online Inc., and any affiliated developers or sponsors assume no
-   liability for your use of this product. You have the source code to
-   this product, and are responsible for auditing it yourself to insure
-   your security needs are met.
+You may not copy, modify, sublicense, or distribute the Document except as
+expressly provided for under this License. Any other attempt to copy,
+modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However, parties who
+have received copies, or rights, from you under this License will not have
+their licenses terminated so long as such parties remain in full compliance.
      _________________________________________________________________
 
-1.4. New Versions
+10. FUTURE REVISIONS OF THIS LICENSE
 
-   This is the 2.14 version of The Bugzilla Guide. If you are reading
-   this from any source other than those below, please check one of these
-   mirrors to make sure you are reading an up-to-date version of the
-   Guide.
+The Free Software Foundation may publish new, revised versions of the GNU
+Free Documentation License from time to time. Such new versions will be
+similar in spirit to the present version, but may differ in detail to
+address new problems or concerns. See http://www.gnu.org/copyleft/ .
+
+Each version of the License is given a distinguishing version number. If the
+Document specifies that a particular numbered version of this License "or
+any later version" applies to it, you have the option of following the terms
+and conditions either of that specified version or of any later version that
+has been published (not as a draft) by the Free Software Foundation. If the
+Document does not specify a version number of this License, you may choose
+any version ever published (not as a draft) by the Free Software Foundation.
+     _________________________________________________________________
 
-   This document can be found in the following places:
+How to use this License for your documents
 
-     * TriloBYTE
-     * Mozilla.org
-     * The Linux Documentation Project
+To use this License in a document you have written, include a copy of the
+License in the document and put the following copyright and license notices
+just after the title page:
+
+     Copyright (c) YEAR YOUR NAME. Permission is granted to copy,
+     distribute and/or modify this document under the terms of the GNU
+     Free Documentation License, Version 1.1 or any later version
+     published by the Free Software Foundation; with the Invariant
+     Sections being LIST THEIR TITLES, with the Front-Cover Texts being
+     LIST, and with the Back-Cover Texts being LIST. A copy of the
+     license is included in the section entitled "GNU Free Documentation
+     License".
 
-   The latest version of this document can be checked out via CVS. Please
-   follow the instructions available at the Mozilla CVS page, and check
-   out the mozilla/webtools/bugzilla/docs/ branch.
+   If you have no Invariant Sections, write "with no Invariant Sections"
+   instead of saying which ones are invariant. If you have no Front-Cover
+   Texts, write "no Front-Cover Texts" instead of "Front-Cover Texts
+   being LIST"; likewise for Back-Cover Texts.
+
+   If your document contains nontrivial examples of program code, we
+   recommend releasing these examples in parallel under your choice of
+   free software license, such as the GNU General Public License, to
+   permit their use in free software.
      _________________________________________________________________
 
-1.5. Credits
+1.2. Disclaimer
+
+No liability for the contents of this document can be accepted. Use the
+concepts, examples, and other content at your own risk. This document may
+contain errors and inaccuracies that may damage your system, cause your
+partner to leave you, your boss to fire you, your cats to pee on your
+furniture and clothing, and global thermonuclear war. Proceed with caution.
+
+All copyrights are held by their respective owners, unless specifically
+noted otherwise. Use of a term in this document should not be regarded as
+affecting the validity of any trademark or service mark.
+
+Naming of particular products or brands should not be seen as endorsements,
+with the exception of the term "GNU/Linux". We wholeheartedly endorse the
+use of GNU/Linux in every situation where it is appropriate. It is an
+extremely versatile, stable, and robust operating system that offers an
+ideal operating environment for Bugzilla.
+
+You are strongly recommended to make a backup of your system before
+installing Bugzilla and at regular intervals thereafter. If you implement
+any suggestion in this Guide, implement this one!
+
+Although the Bugzilla development team has taken great care to ensure that
+all easily-exploitable bugs or options are documented or fixed in the code,
+security holes surely exist. Great care should be taken both in the
+installation and usage of this software. Carefully consider the implications
+of installing other network services with Bugzilla. The Bugzilla development
+team members, Netscape Communications, America Online Inc., and any
+affiliated developers or sponsors assume no liability for your use of this
+product. You have the source code to this product, and are responsible for
+auditing it yourself to ensure your security needs are met.
+     _________________________________________________________________
 
-   The people listed below have made enormous contributions to the
-   creation of this Guide, through their dedicated hacking efforts,
-   numerous e-mail and IRC support sessions, and overall excellent
-   contribution to the Bugzilla community:
+1.3. New Versions
 
-   Terry Weissman for initially writing Bugzilla and creating the README
-   upon which the UNIX installation documentation is largely based.
+This is the 2.16 version of The Bugzilla Guide. It is so named to match the
+current version of Bugzilla. If you are reading this from any source other
+than those below, please check one of these mirrors to make sure you are
+reading an up-to-date version of the Guide.
 
-   Tara Hernandez for keeping Bugzilla development going strong after
-   Terry left Mozilla.org
+This document can be found in the following places:
 
-   Dave Lawrence for providing insight into the key differences between
-   Red Hat's customized Bugzilla, and being largely responsible for the
-   "Red Hat Bugzilla" appendix
+     * bugzilla.org
+     * The Linux Documentation Project
 
-   Dawn Endico for being a hacker extraordinaire and putting up with my
-   incessant questions and arguments on irc.mozilla.org in #mozwebtools
+   The latest version of this document can always be checked out via CVS.
+   Please  follow the instructions available at the Mozilla CVS page, and
+   check out the mozilla/webtools/bugzilla/docs/ subtree.
 
-   Last but not least, all the members of the
-   netscape.public.mozilla.webtools newsgroup. Without your discussions,
-   insight, suggestions, and patches, this could never have happened.
+   The  Bugzilla  Guide  is  currently  only available in English. If you
+   would like to volunteer to translate it, please contact Dave Miller.
      _________________________________________________________________
 
-1.6. Contributors
+1.4. Credits
 
-   Thanks go to these people for significant contributions to this
-   documentation (in no particular order):
+The people listed below have made enormous contributions to the creation of
+this Guide, through their writing, dedicated hacking efforts, numerous
+e-mail and IRC support sessions, and overall excellent contribution to the
+Bugzilla community:
 
-   Andrew Pearson, Spencer Smith, Eric Hanson, Kevin Brannen, Ron
-   Teitelbaum, Jacob Steenhagen, Joe Robins
-     _________________________________________________________________
+Matthew P. Barnson for the Herculaean task of pulling together the Bugzilla
+Guide and shepherding it to 2.14.
 
-1.7. Feedback
+Terry Weissman for initially writing Bugzilla and creating the README upon
+which the UNIX installation documentation is largely based.
 
-   I welcome feedback on this document. Without your submissions and
-   input, this Guide cannot continue to exist. Please mail additions,
-   comments, criticisms, etc. to <barnboy@trilobyte.net>. Please send
-   flames to <devnull@localhost>
-     _________________________________________________________________
+Tara Hernandez for keeping Bugzilla development going strong after Terry
+left mozilla.org
 
-1.8. Translations
+Dave Lawrence for providing insight into the key differences between Red
+Hat's customized Bugzilla, and being largely responsible for the "Red Hat
+Bugzilla" appendix
 
-   The Bugzilla Guide needs translators! Please volunteer your
-   translation into the language of your choice. If you will translate
-   this Guide, please notify the members of the mozilla-webtools mailing
-   list at <mozilla-webtools@mozilla.org>, and arrange with Matt Barnson
-   to check it into CVS.
+Dawn Endico for being a hacker extraordinaire and putting up with my
+incessant questions and arguments on irc.mozilla.org in #mozwebtools
+
+Last but not least, all the members of the netscape.public.mozilla.webtools
+newsgroup. Without your discussions, insight, suggestions, and patches, this
+could never have happened.
+
+Thanks also go to the following people for significant contributions to this
+documentation (in no particular order):
+
+Zach Liption, Andrew Pearson, Spencer Smith, Eric Hanson, Kevin Brannen, Ron
+Teitelbaum, Jacob Steenhagen, Joe Robins, Gervase Markham.
      _________________________________________________________________
 
-1.9. Document Conventions
+1.5. Document Conventions
 
-   This document uses the following conventions
+This document uses the following conventions:
 
    Descriptions Appearance
    Warnings
 
    Caution
 
-   Warnings.
+   Don't run with scissors!
    Hint
 
    Tip
 
-   Hint.
+   Would you like a breath mint?
    Notes
 
    Note
 
-   Note.
+   Dear John...
    Information requiring special attention
 
    Warning
 
-   Warning.
-   File Names file.extension
+   Read this or the cat gets it.
+   File Names filename
    Directory Names directory
    Commands to be typed command
    Applications Names application
@@ -438,724 +567,450 @@ Chapter 1. About This Guide
    Environment Variables VARIABLE
    Emphasized word word
    Code Example
-   <para>Beginning and end of paragraph</para>
+<para>
+Beginning and end of paragraph
+</para>
      _________________________________________________________________
 
-Chapter 2. Using Bugzilla
-
-
-
-   What, Why, How, & Where?
-     _________________________________________________________________
+Chapter 2. Introduction
 
 2.1. What is Bugzilla?
 
-   Bugzilla is one example of a class of programs called "Defect Tracking
-   Systems", or, more commonly, "Bug-Tracking Systems". Defect Tracking
-   Systems allow individual or groups of developers to keep track of
-   outstanding bugs in their product effectively. Bugzilla was originally
-   written by Terry Weissman in a programming language called "TCL", to
-   replace a crappy bug-tracking database used internally for Netscape
-   Communications. Terry later ported Bugzilla to Perl from TCL, and in
-   Perl it remains to this day. Most commercial defect-tracking software
-   vendors at the time charged enormous licensing fees, and Bugzilla
-   quickly became a favorite of the open-source crowd (with its genesis
-   in the open-source browser project, Mozilla). It is now the de-facto
-   standard defect-tracking system against which all others are measured.
-
-   Bugzilla has matured immensely, and now boasts many advanced features.
-   These include:
-
-     * integrated, product-based granular security schema
-     * inter-bug dependencies and dependency graphing
-     * advanced reporting capabilities
-     * a robust, stable RDBMS back-end
-     * extensive configurability
-     * a very well-understood and well-thought-out natural bug resolution
-       protocol
-     * email, XML, console, and HTTP APIs
-     * available integration with automated software configuration
-       management systems, including Perforce and CVS (through the
-       Bugzilla email interface and checkin/checkout scripts)
-     * too many more features to list
-
-   Despite its current robustness and popularity, Bugzilla faces some
-   near-term challenges, such as reliance on a single database, a lack of
-   abstraction of the user interface and program logic, verbose email bug
-   notifications, a powerful but daunting query interface, little
-   reporting configurability, problems with extremely large queries, some
-   unsupportable bug resolution options, little internationalization
-   (although non-US character sets are accepted for comments), and
-   dependence on some nonstandard libraries.
-
-   Some recent headway has been made on the query front, however. If you
-   are using the latest version of Bugzilla, you should see a "simple
-   search" form on the default front page of your Bugzilla install. Type
-   in two or three search terms and you should pull up some relevant
-   information. This is also available as "queryhelp.cgi".
-
-   Despite these small problems, Bugzilla is very hard to beat. It is
-   under very active development to address the current issues, and
-   continually gains new features.
+Bugzilla is a bug- or issue-tracking system. Bug-tracking systems allow
+individual or groups of developers effectively to keep track of outstanding
+problems with their product. Bugzilla was originally written by Terry
+Weissman in a programming language called TCL, to replace a rudimentary
+bug-tracking database used internally by Netscape Communications. Terry
+later ported Bugzilla to Perl from TCL, and in Perl it remains to this day.
+Most commercial defect-tracking software vendors at the time charged
+enormous licensing fees, and Bugzilla quickly became a favorite of the
+open-source crowd (with its genesis in the open-source browser project,
+Mozilla). It is now the de-facto standard defect-tracking system against
+which all others are measured.
+
+Bugzilla boasts many advanced features. These include:
+
+     * Powerful searching
+     * User-configurable email notifications of bug changes
+     * Full change history
+     * Inter-bug dependency tracking and graphing
+     * Excellent attachment management
+     * Integrated, product-based, granular security schema
+     * Fully security-audited, and runs under Perl's taint mode
+     * A robust, stable RDBMS back-end
+     * Web, XML, email and console interfaces
+     * Completely customisable and/or localisable web user interface
+     * Extensive configurability
+     * Smooth upgrade pathway between versions
      _________________________________________________________________
 
 2.2. Why Should We Use Bugzilla?
 
-
-
-   No, Who's on first...
-
-   For many years, defect-tracking software has remained principally the
-   domain of large software development houses. Even then, most shops
-   never bothered with bug-tracking software, and instead simply relied
-   on shared lists and email to monitor the status of defects. This
-   procedure is error-prone and tends to cause those bugs judged least
-   significant by developers to be dropped or ignored.
-
-   These days, many companies are finding that integrated defect-tracking
-   systems reduce downtime, increase productivity, and raise customer
-   satisfaction with their systems. Along with full disclosure, an open
-   bug-tracker allows manufacturers to keep in touch with their clients
-   and resellers, to communicate about problems effectively throughout
-   the data management chain. Many corporations have also discovered that
-   defect-tracking helps reduce costs by providing IT support
-   accountability, telephone support knowledge bases, and a common,
-   well-understood system for accounting for unusual system or software
-   issues.
-
-   But why should you use Bugzilla?
-
-   Bugzilla is very adaptable to various situations. Known uses currently
-   include IT support queues, Systems Administration deployment
-   management, chip design and development problem tracking (both
-   pre-and-post fabrication), and software and hardware bug tracking for
-   luminaries such as Redhat, Loki software, Linux-Mandrake, and VA
-   Systems. Combined with systems such as CVS, Bonsai, or Perforce SCM,
-   Bugzilla provides a powerful, easy-to-use solution to configuration
-   management and replication problems
-
-   Bugzilla can dramatically increase the productivity and accountability
-   of individual employees by providing a documented workflow and
-   positive feedback for good performance. How many times do you wake up
-   in the morning, remembering that you were supposed to do something
-   today, but you just can't quite remember? Put it in Bugzilla, and you
-   have a record of it from which you can extrapolate milestones, predict
-   product versions for integration, and by using Bugzilla's e-mail
-   integration features be able to follow the discussion trail that led
-   to critical decisions.
-
-   Ultimately, Bugzilla puts the power in your hands to improve your
-   value to your employer or business while providing a usable framework
-   for your natural attention to detail and knowledge store to flourish.
+For many years, defect-tracking software has remained principally the domain
+of large software development houses. Even then, most shops never bothered
+with bug-tracking software, and instead simply relied on shared lists and
+email to monitor the status of defects. This procedure is error-prone and
+tends to cause those bugs judged least significant by developers to be
+dropped or ignored.
+
+These days, many companies are finding that integrated defect-tracking
+systems reduce downtime, increase productivity, and raise customer
+satisfaction with their systems. Along with full disclosure, an open
+bug-tracker allows manufacturers to keep in touch with their clients and
+resellers, to communicate about problems effectively throughout the data
+management chain. Many corporations have also discovered that
+defect-tracking helps reduce costs by providing IT support accountability,
+telephone support knowledge bases, and a common, well-understood system for
+accounting for unusual system or software issues.
+
+But why should you use Bugzilla?
+
+Bugzilla is very adaptable to various situations. Known uses currently
+include IT support queues, Systems Administration deployment management,
+chip design and development problem tracking (both pre-and-post
+fabrication), and software and hardware bug tracking for luminaries such as
+Redhat, NASA, Linux-Mandrake, and VA Systems. Combined with systems such as
+CVS, Bonsai, or Perforce SCM, Bugzilla provides a powerful, easy-to-use
+solution to configuration management and replication problems.
+
+Bugzilla can dramatically increase the productivity and accountability of
+individual employees by providing a documented workflow and positive
+feedback for good performance. How many times do you wake up in the morning,
+remembering that you were supposed to do something today, but you just can't
+quite remember? Put it in Bugzilla, and you have a record of it from which
+you can extrapolate milestones, predict product versions for integration,
+and follow the discussion trail that led to critical decisions.
+
+Ultimately, Bugzilla puts the power in your hands to improve your value to
+your employer or business while providing a usable framework for your
+natural attention to detail and knowledge store to flourish.
      _________________________________________________________________
 
-2.3. How do I use Bugzilla?
-
-
-
-   Hey! I'm Woody! Howdy, Howdy, Howdy!
-
-   Bugzilla is a large, complex system. Describing how to use it requires
-   some time. If you are only interested in installing or administering a
-   Bugzilla installation, please consult the Installing and Administering
-   Bugzilla portions of this Guide. This section is principally aimed
-   towards developing end-user mastery of Bugzilla, so you may fully
-   enjoy the benefits afforded by using this reliable open-source
-   bug-tracking software.
-
-   Throughout this portion of the Guide, we will refer to user account
-   options available at the Bugzilla test installation,
-   landfill.tequilarista.org.
+Chapter 3. Using Bugzilla
 
-   Note
+3.1. How do I use Bugzilla?
 
-   Some people have run into difficulties completing this tutorial. If
-   you run into problems, please check the updated online documentation
-   available at http://www.trilobyte.net/barnsons. If you're still
-   stumped, please subscribe to the newsgroup and provide details of
-   exactly what's stumping you! If enough people complain, I'll have to
-   fix it in the next version of this Guide. You can subscribe to the
-   newsgroup at news://news.mozilla.org/netscape.public.mozilla.webtools
-   Although Landfill serves as a great introduction to Bugzilla, it does
-   not offer all the options you would have as a user on your own
-   installation of Bugzilla, nor can it do more than serve as a general
-   introduction to Bugzilla. Additionally, Landfill often runs
-   cutting-edge versions of Bugzilla for testing, so some things may work
-   slightly differently than mentioned here.
+This section contains information for end-users of Bugzilla. There is a
+Bugzilla test installation, called Landfill, which you are welcome to play
+with (if it's up.) However, it does not necessarily have all Bugzilla
+features enabled, and often runs cutting-edge versions of Bugzilla for
+testing, so some things may work slightly differently than mentioned here.
      _________________________________________________________________
 
-2.3.1. Create a Bugzilla Account
+3.1.1. Create a Bugzilla Account
 
-   First things first! If you want to use Bugzilla, first you need to
-   create an account. Consult with the administrator responsible for your
-   installation of Bugzilla for the URL you should use to access it. If
-   you're test-driving the end-user Bugzilla experience, use this URL:
-   http://landfill.tequilarista.org/bugzilla-tip/
+If you want to use Bugzilla, first you need to create an account. Consult
+with the administrator responsible for your installation of Bugzilla for the
+URL you should use to access it. If you're test-driving Bugzilla, use this
+URL: http://landfill.bugzilla.org/bugzilla-tip/
 
-    1. Click the "Open a new Bugzilla account" link.
-    2. Enter your "E-mail address" and "Real Name" (or whatever name you
-       want to call yourself) in the spaces provided, then select the
-       "Create Account" button.
-    3. Within moments, you should receive an email to the address you
+    1. Click the "Open a new Bugzilla account" link, enter your email
+       address and, optionally, your name in the spaces provided, then
+       click "Create Account" .
+    2. Within moments, you should receive an email to the address you
        provided above, which contains your login name (generally the same
        as the email address), and a password you can use to access your
-       account. This password is randomly generated, and should be
-       changed at your nearest opportunity (we'll go into how to do it
-       later).
-    4. Click the "Log In" link in the yellow area at the bottom of the
-       page in your browser, then enter your "E-mail address" and
-       "Password" you just received into the spaces provided, and select
-       "Login".
+       account. This password is randomly generated, and can be changed
+       to something more memorable.
+    3. Click the "Log In" link in the yellow area at the bottom of the
+       page in your browser, enter your email address and password into
+       the spaces provided, and click "Login".
+
+   You are now logged in. Bugzilla uses cookies for authentication so,
+   unless your IP address changes, you should not have to log in again.
+     _________________________________________________________________
 
-   Note
+3.1.2. Anatomy of a Bug
 
-   If you ever forget your password, you can come back to this page,
-   enter your "E-mail address", then select the "E-mail me a password"
-   button to have your password mailed to you again so that you can
-   login.
+The core of Bugzilla is the screen which displays a particular bug. It's a
+good place to explain some Bugzilla concepts. Bug 1 on Landfill is a good
+example. Note that the labels for most fields are hyperlinks; clicking them
+will take you to context-sensitive help on that particular field. Fields
+marked * may not be present on every installation of Bugzilla.
 
-   Caution
+    1. Product and Component: Bugs are divided up by Product and
+       Component, with a Product having one or more Components in it. For
+       example, bugzilla.mozilla.org's "Bugzilla" Product is composed of
+       several Components:
 
-   Many modern browsers include an "Auto-Complete" or "Form Fill" feature
-   to remember the user names and passwords you type in at many sites.
-   Unfortunately, sometimes they attempt to guess what you will put in as
-   your password, and guess wrong. If you notice a text box is already
-   filled out, please overwrite the contents of the text box so you can
-   be sure to input the correct information.
-
-   Congratulations! If you followed these directions, you now are the
-   proud owner of a user account on landfill.tequilarista.org (Landfill)
-   or your local Bugzilla install. You should now see in your browser a
-   page called the "Bugzilla Query Page". It may look daunting, but with
-   this Guide to walk you through it, you will master it in no time.
-     _________________________________________________________________
-
-2.3.2. The Bugzilla Query Page
-
-   The Bugzilla Query Page is the heart and soul of the Bugzilla user
-   experience. It is the master interface where you can find any bug
-   report, comment, or patch currently in the Bugzilla system. We'll go
-   into how to create your own bug report later on.
-
-   There are efforts underway to simplify query usage. If you have a
-   local installation of Bugzilla 2.12 or higher, you should have
-   quicksearch.html available to use and simplify your searches. There is
-   also a helper for the query interface, called queryhelp.cgi. Landfill
-   tends to run the latest code, so these two utilities should be
-   available there for your perusal.
-
-   At this point, please visit the main Bugzilla site,
-   bugzilla.mozilla.org, to see a more fleshed-out query page.
-
-   The first thing you need to notice about the Bugzilla Query Page is
-   that nearly every box you see on your screen has a hyperlink nearby,
-   explaining what it is or what it does. Near the upper-left-hand corner
-   of your browser window you should see the word "Status" underlined.
-   Select it.
-
-   Notice the page that popped up? Every underlined word you see on your
-   screen is a hyperlink that will take you to context-sensitive help.
-   Click around for a while, and learn what everything here does. To
-   return to the query interface after pulling up a help page, use the
-   "Back" button in your browser.
-
-   I'm sure that after checking out the online help, you are now an
-   expert on the Bugzilla Query Page. If, however, you feel you haven't
-   mastered it yet, let me walk you through making a few successful
-   queries to find out what there are in the Bugzilla bug-tracking system
-   itself.
-
-    1. Ensure you are back on the "Bugzilla Query Page". Do nothing in
-       the boxes marked "Status", "Resolution", "Platform", "OpSys",
-       "Priority", or "Severity". The default query for "Status" is to
-       find all bugs that are NEW, ASSIGNED, or REOPENED, which is what
-       we want. If you don't select anything in the other 5 scrollboxes
-       there, then you are saying that "any of these are OK"; we're not
-       locking ourselves into only finding bugs on the "DEC" Platform, or
-       "Windows 95" OpSys (Operating System). You're smart, I think you
-       have it figured out.
-       Basically, selecting anything on the query page narrows your
-       search down. Leaving stuff unselected, or text boxes unfilled,
-       broadens your search.
-    2. You see the box immediately below the top six boxes that contains
-       an "Email" text box, with the words "matching as", a drop-down
-       selection box, then some checkboxes with "Assigned To" checked by
-       default? This allows you to filter your search down based upon
-       email address. Let's put my email address in there, and see what
-       happens.
-       Type "barnboy@trilobyte.net" in the top Email text box.
-    3. Let's narrow the search some more. Scroll down until you find the
-       box with the word "Program" over the top of it. This is where we
-       can narrow our search down to only specific products (software
-       programs or product lines) in our Bugzilla database. Please notice
-       the box is a scrollbox. Using the down arrow on the scrollbox,
-       scroll down until you can see an entry called "Bugzilla". Select
-       this entry.
-    4. Did you notice that some of the boxes to the right changed when
-       you selected "Bugzilla"? Every Program (or Product) has different
-       Versions, Components, and Target Milestones associated with it. A
-       "Version" is the number of a software program.
-       Example 2-1. Some Famous Software Versions
-       Do you remember the hype in 1995 when Microsoft Windows 95(r) was
-       released? It may have been several years ago, but Microsoft(tm)
-       spent over $300 Million advertising this new Version of their
-       software. Three years later, they released Microsoft Windows
-       98(r), another new version, to great fanfare, and then in 2000
-       quietly released Microsoft Windows ME(Millenium Edition)(r).
-       Software "Versions" help a manufacturer differentiate their
-       current product from their previous products. Most do not identify
-       their products by the year they were released. Instead, the
-       "original" version of their software will often be numbered "1.0",
-       with small bug-fix releases on subsequent tenths of a digit. In
-       most cases, it's not a decimal number; for instance, often 1.9 is
-       an older version of the software than 1.11, but is a newer version
-       than 1.1.1.
-       In general, a "Version" in Bugzilla should refer to released
-       products, not products that have not yet been released to the
-       public. Forthcoming products are what the Target Milestone field
-       is for.
-       A "Component" is a piece of a Product. It may be a standalone
-       program, or some other logical division of a Product or Program.
-       Normally, a Component has a single Owner, who is responsible for
-       overseeing efforts to improve that Component.
-       Example 2-2. Mozilla's Bugzilla Components
-       Mozilla's "Bugzilla" Product is composed of several pieces
-       (Components):
-
-   Administration, Administration of a bugzilla installation, including
-   editcomponents.cgi, editgroups.cgi, editkeywords.cgi, editparams.cgi,
-   editproducts.cgi, editusers.cgi, editversions.cgi, and
-   sanitycheck.cgi.
-   Bugzilla-General, Anything that doesn't fit in the other components,
+       Administration: Administration of a Bugzilla installation.
+   Bugzilla-General: Anything that doesn't fit in the other components,
    or spans multiple components.
-   Creating/Changing Bugs, Creating, changing, and viewing bugs.
-   enter_bug.cgi, post_bug.cgi, show_bug.cgi and process_bug.cgi.
-   Documentation, The bugzilla documentation, including anything in the
-   docs/ directory and The Bugzilla Guide (This document :)
-       Email, Anything to do with email sent by Bugzilla. processmail
-   Installation, The installation process of Bugzilla. This includes
-   checksetup.pl and whatever else it evolves into.
-   Query/Buglist, Anything to do with searching for bugs and viewing the
-   buglists. query.cgi and buglist.cgi
-   Reporting/Charting, Getting reports from Bugzilla. reports.cgi and
-   duplicates.cgi
-   User Accounts, Anything about managing a user account from the user's
-   perspective. userprefs.cgi, saved queries, creating accounts, changing
-   passwords, logging in, etc.
-   User Interface, General issues having to do with the user interface
+       Creating/Changing Bugs: Creating, changing, and viewing bugs.
+   Documentation: The Bugzilla documentation, including The Bugzilla
+   Guide.
+       Email: Anything to do with email sent by Bugzilla.
+       Installation: The installation process of Bugzilla.
+   Query/Buglist: Anything to do with searching for bugs and viewing the
+   buglists.
+       Reporting/Charting: Getting reports from Bugzilla.
+   User Accounts: Anything about managing a user account from the user's
+   perspective. Saved queries, creating accounts, changing passwords,
+   logging in, etc.
+   User Interface: General issues having to do with the user interface
    cosmetics (not functionality) including cosmetic issues, HTML
    templates, etc.
-       A "Milestone", or "Target Milestone" is a often a planned future
-       "Version" of a product. In many cases, though, Milestones simply
-       represent significant dates for a developer. Having certain
-       features in your Product is frequently tied to revenue (money) the
-       developer will receive if the features work by the time she
-       reaches the Target Milestone. Target Milestones are a great tool
-       to organize your time. If someone will pay you $100,000 for
-       incorporating certain features by a certain date, those features
-       by that Milestone date become a very high priority. Milestones
-       tend to be highly malleable creatures, though, that appear to be
-       in reach but are out of reach by the time the important day
-       arrives.
-       The Bugzilla Project has set up Milestones for future Bugzilla
-       versions 2.14, 2.16, 2.18, 3.0, etc. However, a Target Milestone
-       can just as easily be a specific date, code name, or weird
-       alphanumeric combination, like "M19".
-    5. OK, now let's select the "Bugzilla" component from its scrollbox.
-    6. Skip down the page a bit -- do you see the "submit query" button?
-       Select it, and let's run this query!
-    7. Congratulations! You've completed your first Query, and have
-       before you the Bug List of the author of this Guide, Matthew P.
-       Barnson (barnboy@trilobyte.net). If I'm doing well, you'll have a
-       cryptic "Zarro Boogs Found" message on your screen. It is just a
-       happy hacker's way of saying "Zero Bugs Found". However, I am
-       fairly certain I will always have some bugs assigned to me that
-       aren't done yet, so you won't often see that message!
-
-   I encourage you to click the bug numbers in the left-hand column and
-   examine my bugs. Also notice that if you click the underlined links
-   near the top of this page, they do not take you to context-sensitive
-   help here, but instead sort the columns of bugs on the screen! When
-   you need to sort your bugs by priority, severity, or the people they
-   are assigned to, this is a tremendous timesaver.
-
-   A couple more interesting things about the Bug List page:
-
-   Change Columns: by selecting this link, you can show all kinds of
-   information in the Bug List
-   Change several bugs at once: If you have sufficient rights to change
-   all the bugs shown in the Bug List, you can mass-modify them. This is
-   a big time-saver.
-   Send mail to bug owners: If you have many related bugs, you can
-   request an update from every person who owns the bugs in the Bug List
-   asking them the status.
-   Edit this query: If you didn't get exactly the results you were
-   looking for, you can return to the Query page through this link and
-   make small revisions to the query you just made so you get more
-   accurate results.
-
-   Note
-
-   There are many more options to the Bugzilla Query Page and the Bug
-   List than I have shown you. But this should be enough for you to learn
-   to get around. I encourage you to check out the Bugzilla Home Page to
-   learn about the Anatomy and Life Cycle of a Bug before continuing.
+    2. Status and Resolution: These define exactly what state the bug is
+       in - from not even being confirmed as a bug, through to being
+       fixed and the fix confirmed by Quality Assurance. The different
+       possible values for Status and Resolution on your installation
+       should be documented in the context-sensitive help for those
+       items.
+    3. Assigned To: The person responsible for fixing the bug.
+    4. *URL: A URL associated with the bug, if any.
+    5. Summary: A one-sentence summary of the problem.
+    6. *Status Whiteboard: (a.k.a. Whiteboard) A free-form text area for
+       adding short notes and tags to a bug.
+    7. *Keywords: The administrator can define keywords which you can use
+       to tag and categorise bugs - e.g. The Mozilla Project has keywords
+       like crash and regression.
+    8. Platform and OS: These indicate the computing environment where
+       the bug was found.
+    9. Version: The "Version" field is usually used for versions of a
+       product which have been released, and is set to indicate which
+       versions of a Component have the particular problem the bug report
+       is about.
+   10. Priority: The bug assignee uses this field to prioritise his or
+       her bugs. It's a good idea not to change this on other people's
+       bugs.
+   11. Severity: This indicates how severe the problem is - from blocker
+       ("application unusable") to trivial ("minor cosmetic issue"). You
+       can also use this field to indicate whether a bug is an
+       enhancement request.
+   12. *Target: (a.k.a. Target Milestone) A future version by which the
+       bug is to be fixed. e.g. The Bugzilla Project's milestones for
+       future Bugzilla versions are 2.18, 2.20, 3.0, etc. Milestones are
+       not restricted to numbers, thought - you can use any text strings,
+       such as dates.
+   13. Reporter: The person who filed the bug.
+   14. CC list: A list of people who get mail when the bug changes.
+   15. Attachments: You can attach files (e.g. testcases or patches) to
+       bugs. If there are any attachments, they are listed in this
+       section.
+   16. *Dependencies: If this bug cannot be fixed unless other bugs are
+       fixed (depends on), or this bug stops other bugs being fixed
+       (blocks), their numbers are recorded here.
+   17. *Votes: Whether this bug has any votes.
+   18. Additional Comments: You can add your two cents to the bug
+       discussion here, if you have something worthwhile to say.
      _________________________________________________________________
 
-2.3.3. Creating and Managing Bug Reports
+3.1.3. Searching for Bugs
 
+The Bugzilla Search page is is the interface where you can find any bug
+report, comment, or patch currently in the Bugzilla system. You can play
+with it here: landfill.bugzilla.org/bugzilla-tip/query.cgi .
 
+The Search page has controls for selecting different possible values for all
+of the fields in a bug, as described above. Once you've defined a search,
+you can either run it, or save it as a Remembered Query, which can
+optionally appear in the footer of your pages.
 
-   And all this time, I thought we were taking bugs out...
+Highly advanced querying is done using Boolean Charts, which have their own
+context-sensitive help .
      _________________________________________________________________
 
-2.3.3.1. Writing a Great Bug Report
-
-   Before we plunge into writing your first bug report, I encourage you
-   to read some bug-writing guidelines. If you are reading this document
-   as part of a Bugzilla CVS checkout or un-tarred Bugzilla distribution,
-   you should be able to read them by clicking here. If you are reading
-   this online, check out the Mozilla.org bug-writing guidelines at
-   http://www.mozilla.org/quality/bug-writing-guidelines.html. While some
-   of the advice is Mozilla-specific, the basic principles of reporting
-   Reproducible, Specific bugs, isolating the Product you are using, the
-   Version of the Product, the Component which failed, the Hardware
-   Platform, and Operating System you were using at the time of the
-   failure go a long way toward ensuring accurate, responsible fixes for
-   the bug that bit you.
-
-   While you are at it, why not learn how to find previously reported
-   bugs? Mozilla.org has published a great tutorial on finding duplicate
-   bugs, available at
-   http://www.mozilla.org/quality/help/beginning-duplicate-finding.html.
-
-   I realize this was a lot to read. However, understanding the mentality
-   of writing great bug reports will help us on the next part!
-
-    1. Go back to http://landfill.tequilarista.org/bugzilla-tip/ in your
-       browser.
-    2. Select the Enter a new bug report link.
-    3. Select a product.
-    4. Now you should be at the "Enter Bug" form. The "reporter" should
-       have been automatically filled out for you (or else Bugzilla
-       prompted you to Log In again -- you did keep the email with your
-       username and password, didn't you?).
-    5. Select a Component in the scrollbox.
-    6. Bugzilla should have made reasonable guesses, based upon your
-       browser, for the "Platform" and "OS" drop-down boxes. If those are
-       wrong, change them -- if you're on an SGI box running IRIX, we
-       want to know!
-    7. Fill in the "Assigned To" box with the email address you provided
-       earlier. This way you don't end up sending copies of your bug to
-       lots of other people, since it's just a test bug.
-    8. Leave the "CC" text box blank. Fill in the "URL" box with
-       "http://www.mozilla.org".
-    9. Enter "The Bugzilla Guide" in the Summary text box, and place any
-       comments you have on this tutorial, or the Guide in general, into
-       the Description box.
-
-   Voila! Select "Commit" and send in your bug report! Next we'll look at
-   resolving bugs.
-     _________________________________________________________________
+3.1.4. Bug Lists
 
-2.3.3.2. Managing your Bug Reports
-
-   OK, you should have a link to the bug you just created near the top of
-   your page. It should say "Bug XXXX posted", with a link to the right
-   saying "Back to BUG# XXXX". Select this link.
-
-    1. Scroll down a bit on the subsequent page, until you see the
-       "Resolve bug, changing resolution to (dropdown box). Normally, you
-       would "Accept bug (change status to ASSIGNED)", fix it, and then
-       resolve. But in this case, we're going to short-circuit the
-       process because this wasn't a real bug. Change the dropdown next
-       to "Resolve Bug" to "INVALID", make sure the radio button is
-       marked next to "Resolve Bug", then click "Commit".
-    2. Hey! It said it couldn't take the change in a big red box! That's
-       right, you must specify a Comment in order to make this change.
-       Select the "Back" button in your browser, add a Comment, then try
-       Resolving the bug with INVALID status again. This time it should
-       work.
-
-   You have now learned the basics of Bugzilla navigation, entering a
-   bug, and bug maintenance. I encourage you to explore these features,
-   and see what you can do with them! We'll spend no more time on
-   individual Bugs or Queries from this point on, so you are on your own
-   there.
-
-   But I'll give a few last hints!
-
-   There is a CLUE on the Query page that will teach you more how to use
-   the form.
-
-   If you click the hyperlink on the Component box of the Query page, you
-   will be presented a form that will describe what all the components
-   are.
-
-   Possibly the most powerful feature of the Query page is the Boolean
-   Chart section. It's a bit confusing to use the first time, but can
-   provide unparalleled flexibility in your queries, allowing you to
-   build extremely powerful requests.
-
-   Finally, you can build some nifty Reports using the "Bug Reports" link
-   near the bottom of the query page, and also available via the
-   "Reports" link at the footer of each page.
-     _________________________________________________________________
+If you run a search, a list of matching bugs will be returned. The default
+search is to return all open bugs on the system - don't try running this
+search on a Bugzilla installation with a lot of bugs!
 
-2.4. Where can I find my user preferences?
+The format of the list is configurable. For example, it can be sorted by
+clicking the column headings. Other useful features can be accessed using
+the links at the bottom of the list:
 
+   Long Format: this gives you a large page with a non-editable summary
+   of the fields of each bug.
+Change Columns: change the bug attributes which appear in the list.
+   Change several bugs at once: If your account is sufficiently
+   empowered, you can make the same change to all the bugs in the list -
+   for example, changing their owner.
+   Send mail to bug owners: Sends mail to the owners of all bugs on the
+   list.
+   Edit this query: If you didn't get exactly the results you were
+   looking for, you can return to the Query page through this link and
+   make small revisions to the query you just made so you get more
+   accurate results.
+     _________________________________________________________________
 
+3.1.5. Filing Bugs
 
-   Indiana, it feels like we walking on fortune cookies!
+Years of bug writing experience has been distilled for your reading pleasure
+into the Bug Writing Guidelines. While some of the advice is
+Mozilla-specific, the basic principles of reporting Reproducible, Specific
+bugs, isolating the Product you are using, the Version of the Product, the
+Component which failed, the Hardware Platform, and Operating System you were
+using at the time of the failure go a long way toward ensuring accurate,
+responsible fixes for the bug that bit you.
 
-   These ain't fortune cookies, kid...
+The procedure for filing a test bug is as follows:
 
-   Customized User Preferences offer tremendous versatility to your
-   individual Bugzilla experience. Let's plunge into what you can do! The
-   first step is to click the "Edit prefs" link at the footer of each
-   page once you have logged in to Landfill.
+    1. Go to Landfill in your browser and click Enter a new bug report.
+    2. Select a product - any one will do.
+    3. Fill in the fields. Bugzilla should have made reasonable guesses,
+       based upon your browser, for the "Platform" and "OS" drop-down
+       boxes. If they are wrong, change them.
+    4. Select "Commit" and send in your bug report.
      _________________________________________________________________
 
-2.4.1. Account Settings
+3.2. Hints and Tips
 
-   On this page, you can change your basic Account Settings, including
-   your password and full name. For security reasons, in order to change
-   anything on this page you must type your current password into the
-   "Old Password" field. If you wish to change your password, type the
-   new password you want into the "New Password" field and again into the
-   "Re-enter new password" field to ensure you typed your new password
-   correctly. Select the "Submit" button and you are done.
+This section distills some Bugzilla tips and best practices that have been
+developed.
      _________________________________________________________________
 
-2.4.2. Email Settings
-
-2.4.2.1. Email Notification
-
-   Here you can reduce or increase the amount of email sent you from
-   Bugzilla. Although this is referred to as "Advanced Email Filtering
-   Options", they are, in fact, the standard email filter set. All of
-   them are self-explanatory, but you can use the filters in interesting
-   ways. For instance, some people (notably Quality Assurance personnel)
-   often only care to receive updates regarding a bug when the bug
-   changes state, so they can track bugs on their flow charts and know
-   when it is time to pull the bug onto a quality assurance platform for
-   inspection. Other people set up email gateways to Bonsai, the Mozilla
-   automated CVS management system or Tinderbox, the Mozilla automated
-   build management system, and restrict which types of Bugzilla
-   information are fed to these systems..
+3.2.1. Autolinkification
+
+Bugzilla comments are plain text - so posting HTML will result in literal
+HTML tags rather than being interpreted by a browser. However, Bugzilla will
+automatically make hyperlinks out of certain sorts of text in comments. For
+example, the text http://www.bugzilla.org will be turned into
+http://www.bugzilla.org. Other strings which get linkified in the obvious
+manner are:
+
+bug 12345
+bug 23456, comment 53
+attachment 4321
+mailto:george@example.com
+george@example.com
+ftp://ftp.mozilla.org
+Most other sorts of URL
+
+   A corollary here is that if you type a bug number in a comment, you
+   should put the word "bug" before it, so it gets autolinkified for the
+   convenience of others.
      _________________________________________________________________
 
-2.4.2.2. New Email Technology
+3.2.2. Quicksearch
 
-   Note
+Quicksearch is a single-text-box query tool which uses metacharacters to
+indicate what is to be searched. For example, typing "foo|bar" into
+Quicksearch would search for "foo" or "bar" in the summary and status
+whiteboard of a bug; adding ":BazProduct" would search only in that product.
 
-   This option may not be available in all Bugzilla installations,
-   depending upon the preferences of the systems administrator
-   responsible for the setup of your Bugzilla. However, if you really
-   want this functionality, ask her to "enable newemailtech in Params"
-   and "make it the default for all new users", referring her to the
-   Administration section of this Guide.
-
-   Disregard the warnings about "experimental and bleeding edge"; the
-   code to handle email in a cleaner manner than that historically used
-   for Bugzilla is quite robust and well-tested now.
-
-   I recommend you enable the option, "Click here to sign up (and risk
-   any bugs)". Your email-box will thank you for it. The fundamental
-   shift in "newemailtech" is away from standard UNIX "diff" output,
-   which is quite ugly, to a prettier, better laid-out email.
+You'll find the Quicksearch box on Bugzilla's front page, along with a Help
+link which details how to use it.
      _________________________________________________________________
 
-2.4.2.3. "Watching" Users
+3.2.3. Comments
 
-   Note
+If you are changing the fields on a bug, only comment if either you have
+something pertinent to say, or Bugzilla requires it. Otherwise, you may spam
+people unnecessarily with bug mail. To take an example: a user can set up
+their account to filter out messages where someone just adds themselves to
+the CC field of a bug (which happens a lot.) If you come along, add yourself
+to the CC field, and add a comment saying "Adding self to CC", then that
+person gets a pointless piece of mail they would otherwise have avoided.
 
-   This option may not be available in all Bugzilla installations,
-   depending upon the preferences of the systems administrator
-   responsible for the setup of your Bugzilla. However, if you really
-   want this functionality, ask her to "enable watchers in Params".
-
-   By entering user email names into the "Users to watch" text entry box,
-   delineated by commas, you can watch bugs of other users. This powerful
-   functionality enables seamless transitions as developers change
-   projects, managers wish to get in touch with the issues faced by their
-   direct reports, or users go on vacation. If any of these three
-   situations apply to you, you will undoubtedly find this feature quite
-   convenient.
+Don't use sigs in comments. Signing your name ("Bill") is acceptable,
+particularly if you do it out of habit, but full mail/news-style four line
+ASCII art creations are not.
      _________________________________________________________________
 
-2.4.3. Page Footer
+3.2.4. Attachments
 
-   Note
+Use attachments, rather than comments, for large chunks of ASCII data, such
+as trace, debugging output files, or log files. That way, it doesn't bloat
+the bug for everyone who wants to read it, and cause people to receive fat,
+useless mails.
 
-   By default, this page is quite barren. However, go explore the Query
-   Page some more; you will find that you can store numerous queries on
-   the server, so if you regularly run a particular query it is just a
-   drop-down menu away. On this page of Preferences, if you have many
-   stored queries you can elect to have them always one-click away!
+Trim screenshots. There's no need to show the whole screen if you are
+pointing out a single-pixel problem.
 
-   If you have many stored queries on the server, here you will find
-   individual drop-downs for each stored query. Each drop-down gives you
-   the option of that query appearing on the footer of every page in
-   Bugzilla! This gives you powerful one-click access to any complex
-   searches you may set up, and is an excellent way to impress your
-   boss...
+Don't attach simple test cases (e.g. one HTML file, one CSS file and an
+image) as a ZIP file. Instead, upload them in reverse order and edit the
+referring file so that they point to the attached files. This way, the test
+case works immediately out of the bug.
+     _________________________________________________________________
 
-   Tip
+3.2.5. Filing Bugs
 
-   By default, the "My Bugs" link appears at the bottom of each page.
-   However, this query gives you both the bugs you have reported, as well
-   as those you are assigned. One of the most common uses for this page
-   is to remove the "My Bugs" link, replacing it with two other queries,
-   commonly called "My Bug Reports" and "My Bugs" (but only referencing
-   bugs assigned to you). This allows you to distinguish those bugs you
-   have reported from those you are assigned. I commonly set up complex
-   Boolean queries in the Query page and link them to my footer in this
-   page. When they are significantly complex, a one-click reference can
-   save hours of work.
-     _________________________________________________________________
+Try to make sure that everything said in the summary is also said in the
+first comment. Summaries are often updated and this will ensure your
+original information is easily accessible.
 
-2.4.4. Permissions
+You do not need to put "any" or similar strings in the URL field. If there
+is no specific URL associated with the bug, leave this field blank.
 
-   This is a purely informative page which outlines your current
-   permissions on this installation of Bugzilla. If you have permissions
-   to grant certain permissions to other users, the "other users" link
-   appears on this page as well as the footer. For more information
-   regarding user administration, please consult the Administration
-   section of this Guide.
+If you feel a bug you filed was incorrectly marked as a DUPLICATE of
+another, please question it in your bug, not the bug it was duped to. Feel
+free to CC the person who duped it if they are not already CCed.
      _________________________________________________________________
 
-2.5. Using Bugzilla-Conclusion
+3.3. User Preferences
 
-   Thank you for reading through this portion of the Bugzilla Guide. I
-   anticipate it may not yet meet the needs of all readers. If you have
-   additional comments or corrections to make, please submit your
-   contributions to the mozilla-webtools mailing list/newsgroup. The
-   mailing list is mirrored to the netscape.public.mozilla.webtools
-   newsgroup, and the newsgroup is mirrored to
-   mozilla-webtools@mozilla.org
+Once you have logged in, you can customise various aspects of Bugzilla via
+the "Edit prefs" link in the page footer. The preferences are split into
+four tabs:
      _________________________________________________________________
 
-Chapter 3. Installation
+3.3.1. Account Settings
 
-   These installation instructions are presented assuming you are
-   installing on a UNIX or completely POSIX-compliant system. If you are
-   installing on Microsoft Windows or another oddball operating system,
-   please consult the appropriate sections in this installation guide for
-   notes on how to be successful.
+On this tab, you can change your basic account information, including your
+password, email address and real name. For security reasons, in order to
+change anything on this page you must type your current password into the
+"Password" field at the top of the page. If you attempt to change your email
+address, a confirmation email is sent to both the old and new addresses,
+with a link to use to confirm the change. This helps to prevent account
+hijacking.
      _________________________________________________________________
 
-3.1. ERRATA
-
-   Here are some miscellaneous notes about possible issues you main run
-   into when you begin your Bugzilla installation. Reference platforms
-   for Bugzilla installation are Redhat Linux 7.2, Linux-Mandrake 8.0,
-   and Solaris 8.
-
-   If you are installing Bugzilla on S.u.S.e. Linux, or some other
-   distributions with "paranoid" security options, it is possible that
-   the checksetup.pl script may fail with the error: cannot
-   chdir(/var/spool/mqueue): Permission denied This is because your
-   /var/spool/mqueue directory has a mode of "drwx------". Type chmod 755
-   /var/spool/mqueue as root to fix this problem.
-   Bugzilla may be installed on Macintosh OS X (10), which is a
-   unix-based (BSD) operating system. Everything required for Bugzilla on
-   OS X will install cleanly, but the optional GD perl module which is
-   used for bug charting requires some additional setup for installation.
-   Please see the Mac OS X installation section below for details
-   Release Notes for Bugzilla 2.14 are available at docs/rel_notes.txt in
-   your Bugzilla source distribution.
-   The preferred documentation for Bugzilla is available in docs/, with a
-   variety of document types available. Please refer to these documents
-   when installing, configuring, and maintaining your Bugzilla
-   installation.
+3.3.2. Email Settings
 
-   Warning
+On this tab you can reduce or increase the amount of email sent you from
+Bugzilla, opting in our out depending on your relationship to the bug and
+the change that was made to it. (Note that you can also do client-side
+filtering using the X-Bugzilla-Reason header which Bugzilla adds to all
+bugmail.)
 
-   Bugzilla is not a package where you can just plop it in a directory,
-   twiddle a few things, and you're off. Installing Bugzilla assumes you
-   know your variant of UNIX or Microsoft Windows well, are familiar with
-   the command line, and are comfortable compiling and installing a
-   plethora of third-party utilities. To install Bugzilla on Win32
-   requires fair Perl proficiency, and if you use a webserver other than
-   Apache you should be intimately familiar with the security mechanisms
-   and CGI environment thereof.
+By entering user email names, delineated by commas, into the "Users to
+watch" text entry box you can receive a copy of all the bugmail of other
+users (security settings permitting.) This powerful functionality enables
+seamless transitions as developers change projects or users go on holiday.
 
-   Warning
+   Note
 
-   Bugzilla has not undergone a complete security review. Security holes
-   may exist in the code. Great care should be taken both in the
-   installation and usage of this software. Carefully consider the
-   implications of installing other network services with Bugzilla.
+   The ability to watch other users may not be available in all Bugzilla
+   installations. If you can't see it, ask your administrator.
      _________________________________________________________________
 
-3.2. Step-by-step Install
+3.3.3. Page Footer
 
-3.2.1. Introduction
+On the Search page, you can store queries in Bugzilla, so if you regularly
+run a particular query it is just a drop-down menu away. Once you have a
+stored query, you can come here to request that it also be displayed in your
+page footer.
+     _________________________________________________________________
+
+3.3.4. Permissions
 
-   Installation of bugzilla is pretty straightforward, particularly if
-   your machine already has MySQL and the MySQL-related perl packages
-   installed. If those aren't installed yet, then that's the first order
-   of business. The other necessary ingredient is a web server set up to
-   run cgi scripts. While using Apache for your webserver is not
-   required, it is recommended.
+This is a purely informative page which outlines your current permissions on
+this installation of Bugzilla - what product groups you are in, and whether
+you can edit bugs or perform various administration functions.
+     _________________________________________________________________
 
-   Bugzilla has been successfully installed under Solaris, Linux, and
-   Win32. The peculiarities of installing on Win32 (Microsoft Windows)
-   are not included in this section of the Guide; please check out the
-   Win32 Installation Notes for further advice on getting Bugzilla to
-   work on Microsoft Windows.
+Chapter 4. Installation
 
-   The Bugzilla Guide is contained in the "docs/" folder in your Bugzilla
-   distribution. It is available in plain text (docs/txt), HTML
-   (docs/html), or SGML source (docs/sgml).
+4.1. Step-by-step Install
+
+4.1.1. Introduction
+
+Bugzilla has been successfully installed under Solaris, Linux, and Win32.
+Win32 is not yet officially supported, but many people have got it working
+fine. Please see the Win32 Installation Notes for further advice on getting
+Bugzilla to work on Microsoft Windows.
      _________________________________________________________________
 
-3.2.2. Installing the Prerequisites
+4.1.2. Package List
 
    Note
 
-   If you want to skip these manual installation steps for the CPAN
-   dependencies listed below, and are running the very most recent
-   version of Perl and MySQL (both the executables and development
-   libraries) on your system, check out Bundle::Bugzilla in Using
-   Bundle::Bugzilla instead of manually installing Perl modules
+   If you are running the very most recent version of Perl and MySQL
+   (both the executables and development libraries) on your system, you
+   can skip these manual installation steps for the Perl modules by using
+   Bundle::Bugzilla; see Using Bundle::Bugzilla instead of manually
+   installing Perl modules.
 
-   The software packages necessary for the proper running of bugzilla
-   are:
+   The software packages necessary for the proper running of Bugzilla
+   (with download links) are:
 
-    1. MySQL database server and the mysql client (3.22.5 or greater)
-    2. Perl (5.004 or greater, 5.6.1 is recommended if you wish to use
+    1. MySQL database server (3.22.5 or greater)
+    2. Perl (5.005 or greater, 5.6.1 is recommended if you wish to use
        Bundle::Bugzilla)
-    3. DBI Perl module
-    4. Data::Dumper Perl module
-    5. Bundle::Mysql Perl module collection
-    6. TimeDate Perl module collection
-    7. GD perl module (1.8.3) (optional, for bug charting)
-    8. Chart::Base Perl module (0.99c) (optional, for bug charting)
-    9. DB_File Perl module (optional, for bug charting)
-   10. The web server of your choice. Apache is recommended.
-   11. MIME::Parser Perl module (optional, for contrib/bug_email.pl
-       interface)
+    3. Perl Modules (minimum version):
+         a. Template (v2.07)
+         b. AppConfig (v1.52)
+         c. Text::Wrap (v2001.0131)
+         d. File::Spec (v0.8.2)
+         e. Data::Dumper (any)
+         f. DBD::mysql (v1.2209)
+         g. DBI (v1.13)
+         h. Date::Parse (any)
+         i. CGI::Carp (any)
+       and, optionally:
+         a. GD (v1.19) for bug charting
+         b. Chart::Base (v0.99c) for bug charting
+         c. XML::Parser (any) for the XML interface
+         d. MIME::Parser (any) for the email interface
+    4. The web server of your choice. Apache is highly recommended.
 
    Warning
 
-   It is a good idea, while installing Bugzilla, to ensure it is not
-   accessible by other machines on the Internet. Your machine may be
-   vulnerable to attacks while you are installing. In other words, ensure
-   there is some kind of firewall between you and the rest of the
-   Internet. Many installation steps require an active Internet
-   connection to complete, but you must take care to ensure that at no
-   point is your machine vulnerable to an attack.
+   It is a good idea, while installing Bugzilla, to ensure that there is
+   some kind of firewall between you and the rest of the Internet,
+   because your machine may be insecure for periods during the install.
+   Many installation steps require an active Internet connection to
+   complete, but you must take care to ensure that at no point is your
+   machine vulnerable to an attack.
 
    Note
 
-   Linux-Mandrake 8.0, the author's test system, includes every required
-   and optional library for Bugzilla. The easiest way to install them is
-   by using the urpmi utility. If you follow these commands, you should
-   have everything you need for Bugzilla, and checksetup.pl should not
-   complain about any missing libraries. You may already have some of
-   these installed.
+   Linux-Mandrake 8.0 includes every required and optional library for
+   Bugzilla. The easiest way to install them is by using the urpmi
+   utility. If you follow these commands, you should have everything you
+   need for Bugzilla, and checksetup.pl should not complain about any
+   missing libraries. You may already have some of these installed.
 
    bash# urpmi perl-mysql
    bash# urpmi perl-chart
@@ -1164,72 +1019,50 @@ Chapter 3. Installation
    bash# urpmi apache-modules
      _________________________________________________________________
 
-3.2.3. Installing MySQL Database
+4.1.3. MySQL
 
-   Visit MySQL homepage at www.mysql.com and grab the latest stable
-   release of the server. Many of the binary versions of MySQL store
-   their data files in /var which is often part of a smaller root
-   partition. If you decide to build from sources you can easily set the
-   dataDir as an option to configure.
+Visit the MySQL homepage at www.mysql.com to grab and install the latest
+stable release of the server.
+
+   Note
 
-   If you install from source or non-package (RPM, deb, etc.) binaries
-   you need to add mysqld to your init scripts so the server daemon will
+   Many of the binary versions of MySQL store their data files in /var.
+   On some Unix systems, this is part of a smaller root partition, and
+   may not have room for your bug database. You can set the data
+   directory as an option to configure if you build MySQL from source
+   yourself.
+
+   If you install from something other than an RPM or Debian package, you
+   will need to add mysqld to your init scripts so the server daemon will
    come back up whenever your machine reboots. Further discussion of UNIX
    init sequences are beyond the scope of this guide.
 
-   Note
-
-   You should have your init script start mysqld with the ability to
-   accept large packets. By default, mysqld only accepts packets up to
-   64K long. This limits the size of attachments you may put on bugs. If
-   you add -O max_allowed_packet=1M to the command that starts mysqld (or
+   Change your init script to start mysqld with the ability to accept
+   large packets. By default, mysqld only accepts packets up to 64K long.
+   This limits the size of attachments you may put on bugs. If you add -O
+   max_allowed_packet=1M to the command that starts mysqld (or
    safe_mysqld), then you will be able to have attachments up to about 1
-   megabyte.
-
-   Note
+   megabyte. There is a Bugzilla parameter for maximum attachment size;
+   you should configure it to match the value you choose here.
 
    If you plan on running Bugzilla and MySQL on the same machine,
    consider using the --skip-networking option in the init script. This
    enhances security by preventing network access to MySQL.
      _________________________________________________________________
 
-3.2.4. Perl (5.004 or greater)
+4.1.4. Perl
 
-   Any machine that doesn't have perl on it is a sad machine indeed. Perl
-   for *nix systems can be gotten in source form from
-   http://www.perl.com. Although Bugzilla runs with most post-5.004
-   versions of Perl, it's a good idea to be up to the very latest version
-   if you can when running Bugzilla. As of this writing, that is perl
-   version 5.6.1.
-
-   Perl is now a far cry from the the single compiler/interpreter binary
-   it once was. It includes a great many required modules and quite a few
-   other support files. If you're not up to or not inclined to build perl
-   from source, you'll want to install it on your machine using some sort
-   of packaging system (be it RPM, deb, or what have you) to ensure a
-   sane install. In the subsequent sections you'll be installing quite a
-   few perl modules; this can be quite ornery if your perl installation
-   isn't up to snuff.
-
-   Warning
-
-   Many people complain that Perl modules will not install for them. Most
-   times, the error messages complain that they are missing a file in
-   "@INC". Virtually every time, this is due to permissions being set too
-   restrictively for you to compile Perl modules or not having the
-   necessary Perl development libraries installed on your system..
-   Consult your local UNIX systems administrator for help solving these
-   permissions issues; if you are the local UNIX sysadmin, please consult
-   the newsgroup/mailing list for further assistance or hire someone to
-   help you out.
+Any machine that doesn't have Perl on it is a sad machine indeed. Perl can
+be got in source form from perl.com for the rare *nix systems which don't
+have it. Although Bugzilla runs with all post-5.005 versions of Perl, it's a
+good idea to be up to the very latest version if you can when running
+Bugzilla. As of this writing, that is Perl version 5.6.1.
 
    Tip
 
    You can skip the following Perl module installation steps by
-   installing Bundle::Bugzilla from CPAN, which includes them. All Perl
-   module installation steps require you have an active Internet
-   connection. If you wish to use Bundle::Bugzilla, however, you must be
-   using the latest version of Perl (at this writing, version 5.6.1)
+   installing Bundle::Bugzilla from CPAN, which installs all required
+   modules for you.
 
    bash# perl -MCPAN -e 'install "Bundle::Bugzilla"'
 
@@ -1239,196 +1072,179 @@ Chapter 3. Installation
    isolate the problem.
      _________________________________________________________________
 
-3.2.5. DBI Perl Module
-
-   The DBI module is a generic Perl module used by other database related
-   Perl modules. For our purposes it's required by the MySQL-related
-   modules. As long as your Perl installation was done correctly the DBI
-   module should be a breeze. It's a mixed Perl/C module, but Perl's
-   MakeMaker system simplifies the C compilation greatly.
+4.1.5. Perl Modules
 
-   Like almost all Perl modules DBI can be found on the Comprehensive
-   Perl Archive Network (CPAN) at http://www.cpan.org. The CPAN servers
-   have a real tendency to bog down, so please use mirrors. The current
-   location at the time of this writing can be found in Appendix B.
+All Perl modules can be found on the Comprehensive Perl Archive Network
+(CPAN). The CPAN servers have a real tendency to bog down, so please use
+mirrors.
 
-   Quality, general Perl module installation instructions can be found on
-   the CPAN website, but the easy thing to do is to just use the CPAN
-   shell which does all the hard work for you.
+Quality, general Perl module installation instructions can be found on the
+CPAN website, but the easy thing to do is to just use the CPAN shell which
+does all the hard work for you. To use the CPAN shell to install a module:
 
-   To use the CPAN shell to install DBI:
+bash# perl -MCPAN -e 'install "<modulename>"'
 
-   bash# perl -MCPAN -e 'install "DBI"'
+To do it the hard way:
 
-   Note
+Untar the module tarball -- it should create its own directory
 
-   Replace "DBI" with the name of whichever module you wish to install,
-   such as Data::Dumper, TimeDate, GD, etc.
-
-   To do it the hard way:
-
-   Untar the module tarball -- it should create its own directory
-
-   CD to the directory just created, and enter the following commands:
+CD to the directory just created, and enter the following commands:
 
     1. bash# perl Makefile.PL
     2. bash# make
     3. bash# make test
     4. bash# make install
 
-   If everything went ok that should be all it takes. For the vast
-   majority of perl modules this is all that's required.
-     _________________________________________________________________
+   Warning
 
-3.2.6. Data::Dumper Perl Module
+   Many people complain that Perl modules will not install for them. Most
+   times, the error messages complain that they are missing a file in
+   "@INC". Virtually every time, this error is due to permissions being
+   set too restrictively for you to compile Perl modules or not having
+   the necessary Perl development libraries installed on your system.
+   Consult your local UNIX systems administrator for help solving these
+   permissions issues; if you are the local UNIX sysadmin, please consult
+   the newsgroup/mailing list for further assistance or hire someone to
+   help you out.
+     _________________________________________________________________
 
-   The Data::Dumper module provides data structure persistence for Perl
-   (similar to Java's serialization). It comes with later sub-releases of
-   Perl 5.004, but a re-installation just to be sure it's available won't
-   hurt anything.
+4.1.5.1. DBI
 
-   Data::Dumper is used by the MySQL-related Perl modules. It can be
-   found on CPAN (see Appendix B) and can be installed by following the
-   same four step make sequence used for the DBI module.
+The DBI module is a generic Perl module used the MySQL-related modules. As
+long as your Perl installation was done correctly the DBI module should be a
+breeze. It's a mixed Perl/C module, but Perl's MakeMaker system simplifies
+the C compilation greatly.
      _________________________________________________________________
 
-3.2.7. MySQL related Perl Module Collection
+4.1.5.2. Data::Dumper
 
-   The Perl/MySQL interface requires a few mutually-dependent perl
-   modules. These modules are grouped together into the the
-   Msql-Mysql-modules package. This package can be found at CPAN. After
-   the archive file has been downloaded it should be untarred.
+The Data::Dumper module provides data structure persistence for Perl
+(similar to Java's serialization). It comes with later sub-releases of Perl
+5.004, but a re-installation just to be sure it's available won't hurt
+anything.
+     _________________________________________________________________
 
-   The MySQL modules are all built using one make file which is generated
-   by running: bash# perl Makefile.pl
+4.1.5.3. MySQL-related modules
 
-   The MakeMaker process will ask you a few questions about the desired
-   compilation target and your MySQL installation. For many of the
-   questions the provided default will be adequate.
+The Perl/MySQL interface requires a few mutually-dependent Perl modules.
+These modules are grouped together into the the Msql-Mysql-modules package.
 
-   When asked if your desired target is the MySQL or mSQL packages,
-   select the MySQL related ones. Later you will be asked if you wish to
-   provide backwards compatibility with the older MySQL packages; you
-   should answer YES to this question. The default is NO.
+The MakeMaker process will ask you a few questions about the desired
+compilation target and your MySQL installation. For most of the questions
+the provided default will be adequate, but when asked if your desired target
+is the MySQL or mSQL packages, you should select the MySQL related ones.
+Later you will be asked if you wish to provide backwards compatibility with
+the older MySQL packages; you should answer YES to this question. The
+default is NO.
 
-   A host of 'localhost' should be fine and a testing user of 'test' and
-   a null password should find itself with sufficient access to run tests
-   on the 'test' database which MySQL created upon installation. If 'make
-   test' and 'make install' go through without errors you should be ready
-   to go as far as database connectivity is concerned.
+A host of 'localhost' should be fine and a testing user of 'test' with a
+null password should find itself with sufficient access to run tests on the
+'test' database which MySQL created upon installation.
      _________________________________________________________________
 
-3.2.8. TimeDate Perl Module Collection
+4.1.5.4. TimeDate modules
 
-   Many of the more common date/time/calendar related Perl modules have
-   been grouped into a bundle similar to the MySQL modules bundle. This
-   bundle is stored on the CPAN under the name TimeDate (see link:
-   Appendix B). The component module we're most interested in is the
-   Date::Format module, but installing all of them is probably a good
-   idea anyway. The standard Perl module installation instructions should
-   work perfectly for this simple package.
+Many of the more common date/time/calendar related Perl modules have been
+grouped into a bundle similar to the MySQL modules bundle. This bundle is
+stored on the CPAN under the name TimeDate. The component module we're most
+interested in is the Date::Format module, but installing all of them is
+probably a good idea anyway.
      _________________________________________________________________
 
-3.2.9. GD Perl Module (1.8.3)
+4.1.5.5. GD (optional)
 
-   The GD library was written by Thomas Boutell a long while ago to
-   programatically generate images in C. Since then it's become the
-   defacto standard for programatic image construction. The Perl bindings
-   to it found in the GD library are used on millions of web pages to
-   generate graphs on the fly. That's what bugzilla will be using it for
-   so you must install it if you want any of the graphing to work.
-
-   Actually bugzilla uses the Graph module which relies on GD itself.
-   Isn't that always the way with object-oriented programming? At any
-   rate, you can find the GD library on CPAN in Appendix B.
+The GD library was written by Thomas Boutell a long while ago to
+programatically generate images in C. Since then it's become the defacto
+standard for programatic image construction. The Perl bindings to it found
+in the GD library are used on millions of web pages to generate graphs on
+the fly. That's what Bugzilla will be using it for so you must install it if
+you want any of the graphing to work.
 
    Note
 
    The Perl GD library requires some other libraries that may or may not
    be installed on your system, including libpng and libgd. The full
-   requirements are listed in the Perl GD library README. Just realize
-   that if compiling GD fails, it's probably because you're missing a
-   required library.
+   requirements are listed in the Perl GD library README. If compiling GD
+   fails, it's probably because you're missing a required library.
      _________________________________________________________________
 
-3.2.10. Chart::Base Perl Module (0.99c)
+4.1.5.6. Chart::Base (optional)
 
-   The Chart module provides bugzilla with on-the-fly charting abilities.
-   It can be installed in the usual fashion after it has been fetched
-   from CPAN where it is found as the Chart-x.x... tarball, linked in
-   Appendix B. Note that as with the GD perl module, only the version
-   listed above, or newer, will work. Earlier versions used GIF's, which
-   are no longer supported by the latest versions of GD.
+The Chart module provides Bugzilla with on-the-fly charting abilities. It
+can be installed in the usual fashion after it has been fetched from CPAN.
+Note that earlier versions that 0.99c used GIFs, which are no longer
+supported by the latest versions of GD.
      _________________________________________________________________
 
-3.2.11. DB_File Perl Module
+4.1.5.7. Template Toolkit
 
-   DB_File is a module which allows Perl programs to make use of the
-   facilities provided by Berkeley DB version 1.x. This module is
-   required by collectstats.pl which is used for bug charting. If you
-   plan to make use of bug charting, you must install this module.
+When you install Template Toolkit, you'll get asked various questions about
+features to enable. The defaults are fine, except that it is recommended you
+use the high speed XS Stash of the Template Toolkit, in order to achieve
+best performance. However, there are known problems with XS Stash and Perl
+5.005_02 and lower. If you wish to use these older versions of Perl, please
+use the regular stash.
      _________________________________________________________________
 
-3.2.12. HTTP Server
+4.1.6. HTTP Server
 
-   You have a freedom of choice here - Apache, Netscape or any other
-   server on UNIX would do. You can easily run the web server on a
-   different machine than MySQL, but need to adjust the MySQL "bugs" user
-   permissions accordingly.
+You have a freedom of choice here - Apache, Netscape or any other server on
+UNIX would do. You can run the web server on a different machine than MySQL,
+but need to adjust the MySQL "bugs" user permissions accordingly.
 
    Note
 
-   I strongly recommend Apache as the web server to use. The Bugzilla
+   We strongly recommend Apache as the web server to use. The Bugzilla
    Guide installation instructions, in general, assume you are using
-   Apache. As more users use different webservers and send me information
-   on the peculiarities of installing using their favorite webserver, I
-   will provide notes for them.
+   Apache. If you have got Bugzilla working using another webserver,
+   please share your experiences with us.
 
    You'll want to make sure that your web server will run any file with
-   the .cgi extension as a cgi and not just display it. If you're using
-   apache that means uncommenting the following line in the srm.conf
+   the .cgi extension as a CGI and not just display it. If you're using
+   Apache that means uncommenting the following line in the httpd.conf
    file:
    AddHandler cgi-script .cgi
 
-   With apache you'll also want to make sure that within the access.conf
+   With Apache you'll also want to make sure that within the httpd.conf
    file the line:
-   Options ExecCGI
+   Options ExecCGI AllowOverride Limit
 
    is in the stanza that covers the directories into which you intend to
    put the bugzilla .html and .cgi files.
 
    Note
 
-   Users of newer versions of Apache will generally find both of the
-   above lines will be in the httpd.conf file, rather than srm.conf or
-   access.conf.
+   AllowOverride Limit allows the use of a Deny statement in the
+   .htaccess file generated by checksetup.pl
+
+   Users of older versions of Apache may find the above lines in the
+   srm.conf and access.conf files, respecitvely.
 
    Warning
 
    There are important files and directories that should not be a served
-   by the HTTP server. These are most files in the "data" and "shadow"
-   directories and the "localconfig" file. You should configure your HTTP
-   server to not serve content from these files. Failure to do so will
-   expose critical passwords and other data. Please see .htaccess files
-   and security for details on how to do this for Apache. I appreciate
-   notes on how to get this same functionality using other webservers.
+   by the HTTP server - most files in the "data" and "shadow" directories
+   and the "localconfig" file. You should configure your HTTP server to
+   not serve these files. Failure to do so will expose critical passwords
+   and other data. Please see .htaccess files and security for details on
+   how to do this for Apache; the checksetup.pl script should create
+   appropriate .htaccess files for you.
      _________________________________________________________________
 
-3.2.13. Installing the Bugzilla Files
+4.1.7. Bugzilla
 
-   You should untar the Bugzilla files into a directory that you're
-   willing to make writable by the default web server user (probably
-   "nobody"). You may decide to put the files off of the main web space
-   for your web server or perhaps off of /usr/local with a symbolic link
-   in the web space that points to the Bugzilla directory. At any rate,
-   just dump all the files in the same place, and make sure you can
-   access the files in that directory through your web server.
+You should untar the Bugzilla files into a directory that you're willing to
+make writable by the default web server user (probably "nobody"). You may
+decide to put the files in the main web space for your web server or perhaps
+in /usr/local with a symbolic link in the web space that points to the
+Bugzilla directory.
 
    Tip
 
    If you symlink the bugzilla directory into your Apache's HTML
    heirarchy, you may receive Forbidden errors unless you add the
-   "FollowSymLinks" directive to the <Directory> entry for the HTML root.
+   "FollowSymLinks" directive to the <Directory> entry for the HTML root
+   in httpd.conf.
 
    Once all the files are in a web accessible directory, make that
    directory writable by your webserver's user. This is a temporary step
@@ -1436,93 +1252,68 @@ Chapter 3. Installation
    your installation.
 
    Lastly, you'll need to set up a symbolic link to
-   /usr/bonsaitools/bin/perl for the correct location of your perl
+   /usr/bonsaitools/bin/perl for the correct location of your Perl
    executable (probably /usr/bin/perl). Otherwise you must hack all the
-   .cgi files to change where they look for perl, or use The setperl.csh
-   Utility, found in Useful Patches and Utilities for Bugzilla. I suggest
-   using the symlink approach for future release compatability.
-
-   Example 3-1. Setting up bonsaitools symlink
-
-   Here's how you set up the Perl symlink on Linux to make Bugzilla work.
-   Your mileage may vary. For some UNIX operating systems, you probably
-   need to subsitute "/usr/local/bin/perl" for "/usr/bin/perl" below; if
-   on certain other UNIX systems, Perl may live in weird places like
-   "/opt/perl". As root, run these commands:
-bash# mkdir /usr/bonsaitools
-bash# mkdir /usr/bonsaitools/bin
-bash# ln -s /usr/bin/perl /usr/bosaitools/bin/perl
+   .cgi files to change where they look for Perl. This can be done using
+   the following Perl one-liner, but I suggest using the symlink approach
+   to avoid upgrade hassles.
 
-   Alternately, you can simply run this perl one-liner to change your
-   path to perl in all the files in your Bugzilla installation:
-perl -pi -e 's@#!/usr/bonsaitools/bin/perl@#!/usr/bin/perl@' *cgi *pl Bug.pm
-
-   Change the second path to perl to match your installation.
-
-   Tip
+perl -pi -e
+        's@#\!/usr/bonsaitools/bin/perl@#\!/usr/bin/perl@' *cgi *pl Bug.pm
+        processmail syncshadowdb
 
-   If you don't have root access to set this symlink up, check out the
-   The setperl.csh Utility, listed in Useful Patches and Utilities for
-   Bugzilla. It will change the path to perl in all your Bugzilla files
-   for you.
+   Change /usr/bin/perl to match the location of Perl on your machine.
      _________________________________________________________________
 
-3.2.14. Setting Up the MySQL Database
+4.1.8. Setting Up the MySQL Database
 
-   After you've gotten all the software installed and working you're
-   ready to start preparing the database for its life as a the back end
-   to a high quality bug tracker.
+After you've gotten all the software installed and working you're ready to
+start preparing the database for its life as the back end to a high quality
+bug tracker.
 
-   First, you'll want to fix MySQL permissions to allow access from
-   Bugzilla. For the purpose of this Installation section, the Bugzilla
-   username will be "bugs", and will have minimal permissions.
+First, you'll want to fix MySQL permissions to allow access from Bugzilla.
+For the purpose of this Installation section, the Bugzilla username will be
+"bugs", and will have minimal permissions.
 
-   Warning
-
-   Bugzilla has not undergone a thorough security audit. It may be
-   possible for a system cracker to somehow trick Bugzilla into executing
-   a command such as DROP DATABASE mysql.
-
-   That would be bad.
-
-   Give the MySQL root user a password. MySQL passwords are limited to 16
-   characters.
+Begin by giving the MySQL root user a password. MySQL passwords are limited
+to 16 characters.
 
-   bash# mysql -u root mysql
-   mysql> UPDATE user SET Password=PASSWORD ('new_password') WHERE
+bash# mysql -u root mysql
+   mysql> UPDATE user SET Password=PASSWORD('<new_password'>) WHERE
    user='root';
-   mysql> FLUSH PRIVILEGES;
+mysql> FLUSH PRIVILEGES;
 
    From this point on, if you need to access MySQL as the MySQL root
-   user, you will need to use mysql -u root -p and enter your
-   new_password. Remember that MySQL user names have nothing to do with
-   Unix user names (login names).
+   user, you will need to use mysql -u root -p and enter <new_password>.
+   Remember that MySQL user names have nothing to do with Unix user names
+   (login names).
 
-   Next, we create the "bugs" user, and grant sufficient permissions for
-   checksetup.pl, which we'll use later, to work its magic. This also
-   restricts the "bugs" user to operations within a database called
-   "bugs", and only allows the account to connect from "localhost".
-   Modify it to reflect your setup if you will be connecting from another
-   machine or as a different user.
+   Next, we use an SQL GRANT command to create a "bugs" user, and grant
+   sufficient permissions for checksetup.pl, which we'll use later, to
+   work its magic. This also restricts the "bugs" user to operations
+   within a database called "bugs", and only allows the account to
+   connect from "localhost". Modify it to reflect your setup if you will
+   be connecting from another machine or as a different user.
 
-   Remember to set bugs_password to some unique password.
+   Remember to set <bugs_password> to some unique password.
 
    mysql> GRANT SELECT,INSERT,UPDATE,DELETE,INDEX,
    ALTER,CREATE,DROP,REFERENCES ON bugs.* TO bugs@localhost IDENTIFIED BY
-   'bugs_password';
+   '<bugs_password>';
    mysql> FLUSH PRIVILEGES;
+     _________________________________________________________________
 
-   Next, run the magic checksetup.pl script. (Many thanks to Holger
-   Schurig <holgerschurig@nikocity.de> for writing this script!) It will
-   make sure Bugzilla files and directories have reasonable permissions,
-   set up the data directory, and create all the MySQL tables.
+4.1.9. checksetup.pl
 
-   bash# ./checksetup.pl
+Next, run the magic checksetup.pl script. (Many thanks to Holger Schurig for
+writing this script!) This script is designed to make sure your MySQL
+database and other configuration options are consistent with the Bugzilla
+CGI files. It will make sure Bugzilla files and directories have reasonable
+permissions, set up the data directory, and create all the MySQL tables.
 
-   The first time you run it, it will create a file called localconfig.
-     _________________________________________________________________
+bash# ./checksetup.pl
 
-3.2.15. Tweaking localconfig
+   The first time you run it, it will create a file called localconfig.
 
    This file contains a variety of settings you may need to tweak
    including how Bugzilla should connect to the MySQL database.
@@ -1532,43 +1323,14 @@ perl -pi -e 's@#!/usr/bonsaitools/bin/perl@#!/usr/bin/perl@' *cgi *pl Bug.pm
     1. server's host: just use "localhost" if the MySQL server is local
     2. database name: "bugs" if you're following these directions
     3. MySQL username: "bugs" if you're following these directions
-    4. Password for the "bugs" MySQL account above
-
-   You should also install .htaccess files that the Apache webserver will
-   use to restrict access to Bugzilla data files. See .htaccess files and
-   security.
-
-   Once you are happy with the settings, re-run checksetup.pl. On this
-   second run, it will create the database and an administrator account
-   for which you will be prompted to provide information.
-
-   When logged into an administrator account once Bugzilla is running, if
-   you go to the query page (off of the Bugzilla main menu), you'll find
-   an "edit parameters" option that is filled with editable treats.
-
-   Should everything work, you will have a nearly empty Bugzilla database
-   and a newly-created localconfig file in your Bugzilla root directory.
+    4. Password for the "bugs" MySQL account; (<bugs_password>) above
 
-   Note
-
-   The second time you run checksetup.pl, you should become the user your
-   web server runs as, and that you ensure that you set the
-   "webservergroup" parameter in localconfig to match the web server's
-   group name, if any. I believe, for the next release of Bugzilla, this
-   will be fixed so that Bugzilla supports a "webserveruser" parameter in
-   localconfig as well.
-
-   Example 3-2. Running checksetup.pl as the web user
-
-   Assuming your web server runs as user "apache", and Bugzilla is
-   installed in "/usr/local/bugzilla", here's one way to run
-   checksetup.pl as the web server user. As root, for the second run of
-   checksetup.pl, do this:
-
-bash# chown -R apache:apache /usr/local/bugzilla
-bash# su - apache
-bash# cd /usr/local/bugzilla
-bash# ./checksetup.pl
+   Once you are happy with the settings, su to the user your web server
+   runs as, and re-run checksetup.pl. (Note: on some security-conscious
+   systems, you may need to change the login shell for the webserver
+   account before you can do this.) On this second run, it will create
+   the database and an administrator account for which you will be
+   prompted to provide information.
 
    Note
 
@@ -1577,66 +1339,20 @@ bash# ./checksetup.pl
    Bugzilla.
      _________________________________________________________________
 
-3.2.16. Setting Up Maintainers Manually (Optional)
-
-   If you want to add someone else to every group by hand, you can do it
-   by typing the appropriate MySQL commands. Run mysql -u root -p bugs
-   You may need different parameters, depending on your security
-   settings. Then:
-
-   mysql> update profiles set groupset=0x7fffffffffffffff where
-   login_name = 'XXX'; (yes, that's fifteen"f"'s.
-
-   replacing XXX with the Bugzilla email address.
-     _________________________________________________________________
-
-3.2.17. The Whining Cron (Optional)
-
-   By now you have a fully functional bugzilla, but what good are bugs if
-   they're not annoying? To help make those bugs more annoying you can
-   set up bugzilla's automatic whining system. This can be done by adding
-   the following command as a daily crontab entry (for help on that see
-   that crontab man page):
-
-   cd <your-bugzilla-directory> ; ./whineatnews.pl
-
-   Tip
-
-   Depending on your system, crontab may have several manpages. The
-   following command should lead you to the most useful page for this
-   purpose:
- man 5 crontab
-     _________________________________________________________________
-
-3.2.18. Bug Graphs (Optional)
-
-   As long as you installed the GD and Graph::Base Perl modules you might
-   as well turn on the nifty bugzilla bug reporting graphs.
-
-   Add a cron entry like this to run collectstats daily at 5 after
-   midnight:
-
-   bash# crontab -e
-   5 0 * * * cd <your-bugzilla-directory> ; ./collectstats.pl
-
-   After two days have passed you'll be able to view bug graphs from the
-   Bug Reports page.
-     _________________________________________________________________
-
-3.2.19. Securing MySQL
+4.1.10. Securing MySQL
 
-   If you followed the installation instructions for setting up your
-   "bugs" and "root" user in MySQL, much of this should not apply to you.
-   If you are upgrading an existing installation of Bugzilla, you should
-   pay close attention to this section.
+If you followed the installation instructions for setting up your "bugs" and
+"root" user in MySQL, much of this should not apply to you. If you are
+upgrading an existing installation of Bugzilla, you should pay close
+attention to this section.
 
-   Most MySQL installs have "interesting" default security parameters:
+Most MySQL installs have "interesting" default security parameters:
 
-   mysqld defaults to running as root
-   it defaults to allowing external network connections
-   it has a known port number, and is easy to detect
-   it defaults to no passwords whatsoever
-   it defaults to allowing "File_Priv"
+mysqld defaults to running as root
+it defaults to allowing external network connections
+it has a known port number, and is easy to detect
+it defaults to no passwords whatsoever
+it defaults to allowing "File_Priv"
 
    This means anyone from anywhere on the internet can not only drop the
    database with one SQL command, and they can write as root to the
@@ -1672,9 +1388,6 @@ bash# ./checksetup.pl
    REVOKE DROP ON bugs.* FROM bugs@bounce.hop.com;
    FLUSH PRIVILEGES;
 
-   Use .htaccess files with the Apache webserver to secure your bugzilla
-   install. See .htaccess files and security
-
    Consider also:
 
     1. Turning off external networking with "--skip-networking", unless
@@ -1682,134 +1395,160 @@ bash# ./checksetup.pl
        networking, MySQL connects with a Unix domain socket.
     2. using the --user= option to mysqld to run it as an unprivileged
        user.
-    3. starting MySQL in a chroot jail
-    4. running the httpd in a "chrooted" jail
+    3. running MySQL in a chroot jail
+    4. running the httpd in a chroot jail
     5. making sure the MySQL passwords are different from the OS
        passwords (MySQL "root" has nothing to do with system "root").
     6. running MySQL on a separate untrusted machine
     7. making backups ;-)
      _________________________________________________________________
 
-3.3. Mac OS X Installation Notes
-
-   There are a lot of common libraries and utilities out there that Apple
-   did not include with Mac OS X, but which run perfectly well on it. The
-   GD library, which Bugzilla needs to do bug graphs, is one of these.
+4.1.11. Configuring Bugzilla
 
-   The easiest way to get a lot of these is with a program called Fink,
-   which is similar in nature to the CPAN installer, but installs common
-   GNU utilities. Fink is available from
-   <http://sourceforge.net/projects/fink/>.
-
-   Follow the instructions for setting up Fink. Once it's installed,
-   you'll want to run the following as root: fink install gd
+You should run through the parameters on the Edit Parameters page (link in
+the footer) and set them all to appropriate values. They key parameters are
+documented in Section 5.1.
+     _________________________________________________________________
 
-   It will prompt you for a number of dependencies, type 'y' and hit
-   enter to install all of the dependencies. Then watch it work.
+4.2. Optional Additional Configuration
 
-   To prevent creating conflicts with the software that Apple installs by
-   default, Fink creates its own directory tree at /sw where it installs
-   most of the software that it installs. This means your libraries and
-   headers for libgd will be at /sw/lib and /sw/include instead of
-   /usr/lib and /usr/local/include. Because of these changed locations
-   for the libraries, the Perl GD module will not install directly via
-   CPAN (it looks for the specific paths instead of getting them from
-   your environment). But there's a way around that :-)
+4.2.1. Dependency Charts
 
-   Instead of typing "install GD" at the cpan> prompt, type look GD. This
-   should go through the motions of downloading the latest version of the
-   GD module, then it will open a shell and drop you into the build
-   directory. Apply the following patch to the Makefile.PL file (save the
-   patch into a file and use the command patch < patchfile:
+As well as the text-based dependency graphs, Bugzilla also supports
+dependency graphing, using a package called 'dot'. Exactly how this works is
+controlled by the 'webdotbase' parameter, which can have one of three
+values:
 
+    1. A complete file path to the command 'dot' (part of GraphViz) will
+       generate the graphs locally
+    2. A URL prefix pointing to an installation of the webdot package
+       will generate the graphs remotely
+    3. A blank value will disable dependency graphing.
 
---- GD-1.33/Makefile.PL Fri Aug  4 16:59:22 2000
-+++ GD-1.33-darwin/Makefile.PL  Tue Jun 26 01:29:32 2001
-@@ -3,8 +3,8 @@
- warn "NOTICE: This module requires libgd 1.8.3 or higher (shared library versi
-on 4.X).\n";
+   So, to get this working, install GraphViz. If you do that, you need to
+   enable server-side image maps in Apache. Alternatively, you could set
+   up a webdot server, or use the AT&T public webdot server (the default
+   for the webdotbase param). Note that AT&T's server won't work if
+   Bugzilla is only accessible using HTTPS.
+     _________________________________________________________________
 
- # =====> PATHS: CHECK AND ADJUST <=====
--my @INC     = qw(-I/usr/local/include -I/usr/local/include/gd);
--my @LIBPATH = qw(-L/usr/lib/X11 -L/usr/X11R6/lib -L/usr/X11/lib -L/usr/local/l
-ib );
-+my @INC     = qw(-I/sw/include -I/sw/include/gd -I/usr/local/include -I/usr/lo
-cal/include/gd);
-+my @LIBPATH = qw(-L/usr/lib/X11 -L/usr/X11R6/lib -L/usr/X11/lib -L/sw/lib -L/u
-sr/local/lib);
- my @LIBS    = qw(-lgd -lpng -lz);
+4.2.2. Bug Graphs
 
- # FEATURE FLAGS
-@@ -23,7 +23,7 @@
+As long as you installed the GD and Graph::Base Perl modules you might as
+well turn on the nifty Bugzilla bug reporting graphs.
 
- push @LIBS,'-lttf' if $TTF;
- push @LIBS,'-ljpeg' if $JPEG;
--push @LIBS, '-lm' unless $^O eq 'MSWin32';
-+push @LIBS, '-lm' unless ($^O =~ /^MSWin32|darwin$/);
+Add a cron entry like this to run collectstats.pl daily at 5 after midnight:
 
- # FreeBSD 3.3 with libgd built from ports croaks if -lXpm is specified
- if ($^O ne 'freebsd' && $^O ne 'MSWin32') {
+bash# crontab -e
+5 0 * * * cd <your-bugzilla-directory> ; ./collectstats.pl
 
+   After  two days have passed you'll be able to view bug graphs from the
+   Bug Reports page.
+     _________________________________________________________________
 
+4.2.3. The Whining Cron
 
-   Then, run these commands to finish the installation of the perl
-   module:
+By now you have a fully functional Bugzilla, but what good are bugs if
+they're not annoying? To help make those bugs more annoying you can set up
+Bugzilla's automatic whining system to complain at engineers which leave
+their bugs in the NEW state without triaging them.
 
-   perl Makefile.PL
-   make
-   make test
-   make install
-   And don't forget to run exit to get back to cpan.
+This can be done by adding the following command as a daily crontab entry
+(for help on that see that crontab man page):
 
-   Happy Hacking!
-     _________________________________________________________________
+cd <your-bugzilla-directory> ; ./whineatnews.pl
 
-3.4. BSD Installation Notes
+   Tip
 
-   For instructions on how to set up Bugzilla on FreeBSD, NetBSD,
-   OpenBSD, BSDi, etc. please consult Section 3.3.
+   Depending  on  your  system,  crontab  may  have several manpages. The
+   following  command  should  lead  you to the most useful page for this
+   purpose:
+   man 5 crontab
      _________________________________________________________________
 
-3.5. Installation General Notes
-
-3.5.1. Modifying Your Running System
+4.2.4. LDAP Authentication
 
-   Bugzilla optimizes database lookups by storing all relatively static
-   information in the versioncache file, located in the data/
-   subdirectory under your installation directory.
-
-   If you make a change to the structural data in your database (the
-   versions table for example), or to the "constants" encoded in
-   defparams.pl, you will need to remove the cached content from the data
-   directory (by doing a "rm data/versioncache"), or your changes won't
-   show up.
+   Warning
 
-   That file gets automatically regenerated whenever it's more than an
-   hour old, so Bugzilla will eventually notice your changes by itself,
-   but generally you want it to notice right away, so that you can test
-   things.
+   This information on using the LDAP authentication options with
+   Bugzilla is old, and the authors do not know of anyone who has tested
+   it. Approach with caution.
+
+   The  existing  authentication scheme for Bugzilla uses email addresses
+   as  the primary user ID, and a password to authenticate that user. All
+   places  within  Bugzilla  where  you  need  to  deal with user ID (e.g
+   assigning a bug) use the email address. The LDAP authentication builds
+   on top of this scheme, rather than replacing it. The initial log in is
+   done  with  a  username and password for the LDAP directory. This then
+   fetches  the  email  address from LDAP and authenticates seamlessly in
+   the  standard Bugzilla authentication scheme using this email address.
+   If an account for this address already exists in your Bugzilla system,
+   it  will  log in to that account. If no account for that email address
+   exists,  one  is created at the time of login. (In this case, Bugzilla
+   will  attempt  to use the "displayName" or "cn" attribute to determine
+   the  user's  full  name.) After authentication, all other user-related
+   tasks are still handled by email address, not LDAP username. You still
+   assign bugs by email address, query on users by email address, etc.
+
+   Using LDAP for Bugzilla authentication requires the Mozilla::LDAP (aka
+   PerLDAP)  Perl  module.  The  Mozilla::LDAP  module  in  turn requires
+   Netscape's Directory SDK for C. After you have installed the SDK, then
+   install  the PerLDAP module. Mozilla::LDAP and the Directory SDK for C
+   are both available for download from mozilla.org.
+
+   Set  the Param 'useLDAP' to "On" **only** if you will be using an LDAP
+   directory  for  authentication.  Be  very careful when setting up this
+   parameter;  if  you  set  LDAP authentication, but do not have a valid
+   LDAP directory set up, you will not be able to log back in to Bugzilla
+   once  you  log  out. (If this happens, you can get back in by manually
+   editing the data/params file, and setting useLDAP back to 0.)
+
+   If  using  LDAP,  you  must  set  the three additional parameters: Set
+   LDAPserver  to  the name (and optionally port) of your LDAP server. If
+   no  port  is  specified,  it defaults to the default port of 389. (e.g
+   "ldap.mycompany.com"  or  "ldap.mycompany.com:1234") Set LDAPBaseDN to
+   the  base  DN  for  searching  for users in your LDAP directory. (e.g.
+   "ou=People,o=MyCompany")  uids  must  be unique under the DN specified
+   here.  Set LDAPmailattribute to the name of the attribute in your LDAP
+   directory  which contains the primary email address. On most directory
+   servers available, this is "mail", but you may need to change this.
      _________________________________________________________________
 
-3.5.2. Upgrading From Previous Versions
+4.2.5. Preventing untrusted Bugzilla content from executing malicious
+Javascript code
 
-   The developers of Bugzilla are constantly adding new tables, columns
-   and fields. You'll get SQL errors if you just update the code. The
-   strategy to update is to simply always run the checksetup.pl script
-   whenever you upgrade your installation of Bugzilla. If you want to see
-   what has changed, you can read the comments in that file, starting
-   from the end.
+It is possible for a Bugzilla to execute malicious Javascript code. Due to
+internationalization concerns, we are unable to incorporate the code changes
+necessary to fulfill the CERT advisory requirements mentioned in
+http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3. Executing
+the following code snippet from a UNIX command shell will rectify the
+problem if your Bugzilla installation is intended for an English-speaking
+audience. As always, be sure your Bugzilla installation has a good backup
+before making changes, and I recommend you understand what the script is
+doing before executing it.
+
+bash# perl -pi -e "s/Content-Type\: text\/html/Content-Type\: text\/html\; char
+set=ISO-8859-1/i" *.cgi *.pl
+
+   All  this  one-liner  command  does  is  search  for  all instances of
+   "Content-type:   text/html"   and   replaces  it  with  "Content-Type:
+   text/html;  charset=ISO-8859-1" . This specification prevents possible
+   Javascript   attacks   on  the  browser,  and  is  suggested  for  all
+   English-speaking  sites.  For  non-English-speaking  Bugzilla sites, I
+   suggest changing "ISO-8859-1", above, to "UTF-8".
 
-   If you are running Bugzilla version 2.8 or lower, and wish to upgrade
-   to the latest version, please consult the file, "UPGRADING-pre-2.8" in
-   the Bugzilla root directory after untarring the archive.
+   Note:  using  <meta>  tags  to  set the charset is not recommended, as
+   there's a bug in Netscape 4.x which causes pages marked up in this way
+   to load twice.
      _________________________________________________________________
 
-3.5.3. .htaccess files and security
+4.2.6. .htaccess files and security
 
-   To enhance the security of your Bugzilla installation, Bugzilla will
-   generate .htaccess files which the Apache webserver can use to
-   restrict access to the bugzilla data files. The checksetup script will
-   generate the .htaccess files.
+To enhance the security of your Bugzilla installation, Bugzilla's
+checksetup.pl script will generate .htaccess files which the Apache
+webserver can use to restrict access to the bugzilla data files. These
+.htaccess files will not work with Apache 1.2.x - but this has security
+holes, so you shouldn't be using it anyway.
 
    Note
 
@@ -1818,94 +1557,71 @@ sr/local/lib);
    will need to change the ip address in data/webdot/.htaccess to the ip
    address of the webdot server that you are using.
 
-   If you are using Internet Information Server or other web server which
-   does not observe .htaccess conventions, you can disable their creation
-   by editing localconfig and setting the $create_htaccess variable to 0.
+   The   default   .htaccess   file   may  not  provide  adequate  access
+   restrictions,  depending  on your web server configuration. Be sure to
+   check  the <Directory> entries for your Bugzilla directory so that the
+   .htaccess  file  is  allowed  to  override  web  server  defaults. For
+   instance,  let's  assume your installation of Bugzilla is installed to
+   /usr/local/bugzilla  .  You should have this <Directory> entry in your
+   httpd.conf file:
+
+  <Directory /usr/local/bugzilla/>
+  Options +FollowSymLinks +Indexes +Includes +ExecCGI
+  AllowOverride All
+</Directory>
+
+   The  important  part  above is "AllowOverride All" . Without that, the
+   .htaccess  file  created  by  checksetup.pl  will  not have sufficient
+   permissions to protect your Bugzilla installation.
+
+   If  you  are  using  Internet  Information Server (IIS) or another web
+   server  which  does not observe .htaccess conventions, you can disable
+   their creation by editing localconfig and setting the $create_htaccess
+   variable to 0.
      _________________________________________________________________
 
-3.5.4. mod_throttle and Security
-
-   It is possible for a user, by mistake or on purpose, to access the
-   database many times in a row which can result in very slow access
-   speeds for other users. If your Bugzilla installation is experiencing
-   this problem , you may install the Apache module mod_throttle which
-   can limit connections by ip-address. You may download this module at
-   http://www.snert.com/Software/Throttle/. Follow the instructions to
-   install into your Apache install. This module only functions with the
-   Apache web server!. You may use the ThrottleClientIP command provided
-   by this module to accomplish this goal. See the Module Instructions
-   for more information.
+4.2.7. mod_throttle and Security
+
+It is possible for a user, by mistake or on purpose, to access the database
+many times in a row which can result in very slow access speeds for other
+users. If your Bugzilla installation is experiencing this problem , you may
+install the Apache module mod_throttle which can limit connections by
+ip-address. You may download this module at
+http://www.snert.com/Software/Throttle/. Follow the instructions to install
+into your Apache install. This module only functions with the Apache web
+server! You may use the ThrottleClientIP command provided by this module to
+accomplish this goal. See the Module Instructions for more information.
      _________________________________________________________________
 
-3.5.5. Preventing untrusted Bugzilla content from executing malicious
-Javascript code
-
-   It is possible for a Bugzilla to execute malicious Javascript code.
-   Due to internationalization concerns, we are unable to incorporate the
-   code changes necessary to fulfill the CERT advisory requirements
-   mentioned in
-   http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3.
-   Executing the following code snippet from a UNIX command shell will
-   rectify the problem if your Bugzilla installation is intended for an
-   English-speaking audience. As always, be sure your Bugzilla
-   installation has a good backup before making changes, and I recommend
-   you understand what the script is doing before executing it.
-
-bash# cd $BUGZILLA_HOME; for i in `ls *.cgi`; \
-          do cat $i | sed 's/Content-type\: text\/html/Content-Type: text\/html
-\; charset=ISO-8859-1/' >$i.tmp; \
-          mv $i.tmp $i; done
-
-   All this one-liner command does is search for all instances of
-   "Content-type: text/html" and replaces it with "Content-Type:
-   text/html; charset=ISO-8859-1". This specification prevents possible
-   Javascript attacks on the browser, and is suggested for all
-   English-speaking sites. For non-english-speaking Bugzilla sites, I
-   suggest changing "ISO-8859-1", above, to "UTF-8".
-     _________________________________________________________________
-
-3.5.6. UNIX Installation Instructions History
-
-   This document was originally adapted from the Bonsai installation
-   instructions by Terry Weissman <terry@mozilla.org>.
-
-   The February 25, 1999 re-write of this page was done by Ry4an Brase
-   <ry4an@ry4an.org>, with some edits by Terry Weissman, Bryce Nesbitt,
-   Martin Pool, & Dan Mosedale (But don't send bug reports to them;
-   report them using bugzilla, at
-   http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla ).
+4.3. Win32 Installation Notes
 
-   This document was heavily modified again Wednesday, March 07 2001 to
-   reflect changes for Bugzilla 2.12 release by Matthew P. Barnson. The
-   securing MySQL section should be changed to become standard procedure
-   for Bugzilla installations.
+This section covers installation on Microsoft Windows. Bugzilla has been
+made to work on Win32 platforms, but the Bugzilla team wish to emphasise
+that The easiest way to install Bugzilla on Intel-archiecture machines is to
+install some variant of GNU/Linux, then follow the UNIX installation
+instructions in this Guide. If you have any influence in the platform choice
+for running this system, please choose GNU/Linux instead of Microsoft
+Windows.
 
-   Finally, the README in its entirety was marked up in SGML and included
-   into the Guide on April 24, 2001 by Matt Barnson. Since that time,
-   it's undergone extensive modification as Bugzilla grew.
-
-   Comments from people using this Guide for the first time are
-   particularly welcome.
-     _________________________________________________________________
+   Warning
 
-3.6. Win32 Installation Notes
-
-   This section covers installation on Microsoft Windows 95, 98, ME, NT,
-   and 2000. Bugzilla works fine on Win32 platforms, but please remember
-   that the Bugzilla team and the author of the Guide neither endorse nor
-   support installation on Microsoft Windows. Bugzilla installs and runs
-   best and easiest on UNIX-like operating systems, and that is the way
-   it will stay for the foreseeable future. The Bugzilla team is
-   considering supporting Win32 for the 2.16 release and later.
-
-   The easiest way to install Bugzilla on Intel-archiecture machines is
-   to install some variant of GNU/Linux, then follow the UNIX
-   installation instructions in this Guide. If you have any influence in
-   the platform choice for running this system, please choose GNU/Linux
-   instead of Microsoft Windows.
+   After that warning, here's the situation for 2.16 and Windows. It
+   doesn't work at all out of the box. You are almost certainly better
+   off getting the 2.17 version from CVS (after consultation with the
+   Bugzilla Team to make sure you are pulling on a stable day) because
+   we'll be doing a load of work to make the Win32 experience more
+   pleasant than it is now.
+
+   If you still want to try this, to have any hope of getting it to work,
+   you'll  need  to  apply  the  mail  patch from bug 124174. After that,
+   you'll  need  to  read the (outdated) installation instructions below,
+   some  (probably a lot better) more recent ones kindly provided by Toms
+   Baugis and Jean-Sebastien Guay, and also check the Bugzilla 2.16 Win32
+   update  page  .  If  we get time, we'll write some better installation
+   instructions for 2.16 and put them up there. But no promises.
      _________________________________________________________________
 
-3.6.1. Win32 Installation: Step-by-step
+4.3.1. Win32 Installation: Step-by-step
 
    Note
 
@@ -1920,62 +1636,78 @@ bash# cd $BUGZILLA_HOME; for i in `ls *.cgi`; \
    for pain, and moderate perl skills. Bugzilla on NT requires hacking
    source code and implementing some advanced utilities. What follows is
    the recommended installation procedure for Win32; additional
-   suggestions are provided in Appendix A.
+   suggestions are provided in Appendix A .
+
     1. Install Apache Web Server for Windows, and copy the Bugzilla files
-       somewhere Apache can serve them. Please follow all the
-       instructions referenced in Bugzilla Installation regarding your
-       Apache configuration, particularly instructions regarding the
-       "AddHandler" parameter and "ExecCGI".
+       somewhere   Apache   can   serve   them.  Please  follow  all  the
+       instructions  referenced  in  Bugzilla Installation regarding your
+       Apache  configuration,  particularly  instructions  regarding  the
+       "AddHandler" parameter and "ExecCGI" .
 
    Note
 
-   You may also use Internet Information Server or Personal Web Server
-   for this purpose. However, setup is quite different. If ActivePerl
-   doesn't seem to handle your file associations correctly (for .cgi and
-   .pl files), please consult Appendix A.
-   If you are going to use IIS, if on Windows NT you must be updated to
-   at least Service Pack 4. Windows 2000 ships with a sufficient version
+   You  may  also  use Internet Information Server or Personal Web Server
+   for  this  purpose.  However,  setup is quite different. If ActivePerl
+   doesn't  seem to handle your file associations correctly (for .cgi and
+   .pl files), please consult Appendix A .
+   If  you  are going to use IIS, if on Windows NT you must be updated to
+   at  least Service Pack 4. Windows 2000 ships with a sufficient version
    of IIS.
     2. Install ActivePerl for Windows. Check
-       http://aspn.activestate.com/ASPN/Downloads/ActivePerl for a
+       http://aspn.activestate.com/ASPN/Downloads/ActivePerl     for    a
        current compiled binary.
-       Please also check the following links to fully understand the
-       status of ActivePerl on Win32: Perl Porting, and Perl on Win32 FAQ
-    3. Use ppm from your perl\bin directory to install the following
-       packs: DBI, DBD-Mysql, TimeDate, Chart, Date-Calc, Date-Manip, and
-       GD. You may need to extract them from .zip format using Winzip or
-       other unzip program first. These additional ppm modules can be
-       downloaded from ActiveState.
+       Please  also  check  the  following  links to fully understand the
+       status  of  ActivePerl  on Win32: Perl Porting , and Perl on Win32
+       FAQ
+    3. Use  ppm  from  your  perl\bin  directory to install the following
+       packs: DBI, DBD-Mysql, TimeDate, Chart, Date-Calc, Date-Manip, GD,
+       AppConfig,  and  Template.  You may need to extract them from .zip
+       format  using  Winzip  or other unzip program first. Most of these
+       additional  ppm  modules  can  be downloaded from ActiveState, but
+       AppConfig  and Template should be obtained from OpenInteract using
+       the instructions on the Template Toolkit web site .
 
-       Note
+   Note
 
    You can find a list of modules at
-   http://www.activestate.com/PPMPackages/zips/5xx-builds-only/
+   http://www.activestate.com/PPMPackages/zips/5xx-builds-only/        or
+   http://www.activestate.com/PPMPackages/5.6plus
        The syntax for ppm is: C:> ppm <modulename>
-       Example 3-3. Installing ActivePerl ppd Modules on Microsoft
+       Example  4-1.  Installing  ActivePerl  ppd  Modules  on  Microsoft
        Windows
-       C:>ppm DBD-Mysql
+       C:> ppm DBD-Mysql 
        Watch your capitalization!
-       You can find ActiveState ppm modules at
-       http://www.activestate.com/PPMPackages/5.6plus
+       ActiveState's 5.6Plus directory also contains an AppConfig ppm, so
+       you  might  see  the  following  error  when trying to install the
+       version at OpenInteract:
+       Error  installing package 'AppConfig': Read a PPD for 'AppConfig',
+       but    it    is    not   intended   for   this   build   of   Perl
+       (MSWin32-x86-multi-thread)
+       If  so,  download  both  the  tarball  and  the  ppd directly from
+       OpenInteract, then run ppm from within the same directory to which
+       you  downloaded those files and install the package by referencing
+       the ppd file explicitly via in the install command, f.e.:
+       Example  4-2.  Installing  OpenInteract  ppd  Modules  manually on
+       Microsoft Windows
+       install C:\AppConfig.ppd 
     4. Install MySQL for NT.
 
    Note
 
-   You can download MySQL for Windows NT from MySQL.com. Some find it
-   helpful to use the WinMySqlAdmin utility, included with the download,
+   You  can  download  MySQL for Windows NT from MySQL.com . Some find it
+   helpful  to use the WinMySqlAdmin utility, included with the download,
    to set up the database.
     5. Setup MySQL
          a. C:> C:\mysql\bin\mysql -u root mysql
          b. mysql> DELETE FROM user WHERE Host='localhost' AND User='';
-         c. mysql> UPDATE user SET Password=PASSWORD ('new_password')
+         c. mysql>  UPDATE  user  SET  Password=PASSWORD ('new_password')
             WHERE user='root';
-            "new_password", above, indicates whatever password you wish
+            "new_password"  , above, indicates whatever password you wish
             to use for your "root" user.
-         d. mysql> GRANT SELECT, INSERT, UPDATE, DELETE, INDEX, ALTER,
-            CREATE, DROP, REFERENCES ON bugs.* to bugs@localhost
+         d. mysql>  GRANT  SELECT,  INSERT, UPDATE, DELETE, INDEX, ALTER,
+            CREATE,   DROP,   REFERENCES   ON  bugs.*  to  bugs@localhost
             IDENTIFIED BY 'bugs_password';
-            "bugs_password", above, indicates whatever password you wish
+            "bugs_password" , above, indicates whatever password you wish
             to use for your "bugs" user.
          e. mysql> FLUSH PRIVILEGES;
          f. mysql> create database bugs;
@@ -1983,100 +1715,98 @@ bash# cd $BUGZILLA_HOME; for i in `ls *.cgi`; \
          h. C:> C:\mysql\bin\mysqladmin -u root -p reload
     6. Edit checksetup.pl in your Bugzilla directory. Change this line:
 
-my $webservergid = getgrnam($my_webservergroup);
-
+my $webservergid =
+            getgrnam($my_webservergroup);
 
        to
 
-my $webservergid = $my_webservergroup;
-
+my $webservergid =
+          $my_webservergroup;
 
        or the name of the group you wish to own the files explicitly:
 
-my $webservergid = 'Administrators'
-
+my $webservergid =
+          'Administrators'
 
     7. Run checksetup.pl from the Bugzilla directory.
-    8. Edit localconfig to suit your requirements. Set $db_pass to your
-       "bugs_password" from step 5.d, and $webservergroup to "8".
+    8. Edit  localconfig  to suit your requirements. Set $db_pass to your
+       "bugs_password" from step 5.d , and $webservergroup to "8" .
 
        Note
 
-   Not sure on the "8" for $webservergroup above. If it's wrong, please
+   Not  sure  on the "8" for $webservergroup above. If it's wrong, please
    send corrections.
-    9. Edit defparams.pl to suit your requirements. Particularly, set
-       DefParam("maintainer") and DefParam("urlbase") to match your
+    9. Edit  defparams.pl  to  suit  your requirements. Particularly, set
+       DefParam("maintainer")   and  DefParam("urlbase")  to  match  your
        install.
 
    Note
 
    This is yet another step I'm not sure of, since the maintainer of this
-   documentation does not maintain Bugzilla on NT. If you can confirm or
+   documentation  does not maintain Bugzilla on NT. If you can confirm or
    deny that this step is required, please let me know.
    10.
 
    Note
 
-   There are several alternatives to Sendmail that will work on Win32.
-   The one mentioned here is a suggestion, not a requirement. Some other
-   mail packages that can work include BLAT, Windmail, Mercury Sendmail,
-   and the CPAN Net::SMTP Perl module (available in .ppm). Every option
-   requires some hacking of the Perl scripts for Bugzilla to make it
+   There  are  several  alternatives to Sendmail that will work on Win32.
+   The one mentioned here is a suggestion , not a requirement. Some other
+   mail packages that can work include BLAT , Windmail , Mercury Sendmail
+   , and the CPAN Net::SMTP Perl module (available in .ppm). Every option
+   requires  some  hacking  of  the  Perl scripts for Bugzilla to make it
    work. The option here simply requires the least.
-         1. Download NTsendmail, available from www.ntsendmail.com. You
-            must have a "real" mail server which allows you to relay off
-            it in your $ENV{"NTsendmail"} (which you should probably
+         1. Download  NTsendmail, available from www.ntsendmail.com . You
+            must  have a "real" mail server which allows you to relay off
+            it  in  your  $ENV{"NTsendmail"}  (which  you should probably
             place in globals.pl)
          2. Put ntsendmail.pm into your .\perl\lib directory.
          3. Add to globals.pl:
 
-# these settings configure the NTsendmail process
-use NTsendmail;
-$ENV{"NTsendmail"}="your.smtpserver.box";
-$ENV{"NTsendmail_debug"}=1;
-$ENV{"NTsendmail_max_tries"}=5;
-
+# these settings configure the NTsendmail
+              process use NTsendmail;
+              $ENV{"NTsendmail"}="your.smtpserver.box";
+              $ENV{"NTsendmail_debug"}=1;
+              $ENV{"NTsendmail_max_tries"}=5;
 
    Note
 
-   Some mention to also edit $db_pass in globals.pl to be your
-   "bugs_password". Although this may get you around some problem
-   authenticating to your database, since globals.pl is not normally
-   restricted by .htaccess, your database password is exposed to whoever
+   Some   mention  to  also  edit  $db_pass  in  globals.pl  to  be  your
+   "bugs_password"  .  Although  this  may  get  you  around some problem
+   authenticating  to  your  database,  since  globals.pl is not normally
+   restricted by .htaccess , your database password is exposed to whoever
    uses your web server.
-         4. Find and comment out all occurences of "open(SENDMAIL" in
+         4. Find  and  comment out all occurences of " open(SENDMAIL " in
             your Bugzilla directory. Then replace them with:
 
-# new sendmail functionality
-my $mail=new NTsendmail;
-my $from="bugzilla\@your.machine.name.tld";
-my $to=$login;
-my $subject=$urlbase;
-$mail->send($from,$to,$subject,$msg);
+# new sendmail functionality my $mail=new
+              NTsendmail; my $from="bugzilla\@your.machine.name.tld"; my
+              $to=$login; my $subject=$urlbase;
+              $mail->send($from,$to,$subject,$msg);
 
    Note
 
-   Some have found success using the commercial product, Windmail. You
+   Some  have  found success using the commercial product, Windmail . You
    could try replacing your sendmail calls with:
-open SENDMAIL, "|\"C:/General/Web/tools/Windmail 4.0 Beta/windmail\" -t > mail.
-log";
-
+open SENDMAIL,
+                "|\"C:/General/Web/tools/Windmail 4.0 Beta/windmail\" -t >
+                mail.log";
 
    or something to that effect.
-   11. Change all references in all files from processmail to
-       processmail.pl, and rename processmail to processmail.pl.
+   11. Change   all   references   in   all  files  from  processmail  to
+       processmail.pl , and rename processmail to processmail.pl .
 
    Note
 
-   Many think this may be a change we want to make for main-tree
-   Bugzilla. It's painless for the UNIX folks, and will make the Win32
+   Many  think  this  may  be  a  change  we  want  to make for main-tree
+   Bugzilla.  It's  painless  for the UNIX folks, and will make the Win32
    people happier.
 
    Note
 
-   Some people have suggested using the Net::SMTP Perl module instead of
-   NTsendmail or the other options listed here. You can change
+   Some  people have suggested using the Net::SMTP Perl module instead of
+   NTsendmail   or   the  other  options  listed  here.  You  can  change
    processmail.pl to make this work.
+
 my $smtp = Net::SMTP->new('<Name of your SMTP server>');   #connect to SMTP ser
 ver
 $smtp->mail('<your name>@<you smpt server>');# use the sender's adress here
@@ -2088,7 +1818,11 @@ $smtp->quit;    # Close the SMTP connection
 $logstr = "$logstr; mail sent to $tolist $cclist";
 }
 
+
+
+
    here is a test mail program for Net::SMTP:
+
 use Net::SMTP;
  my $smtp = Net::SMTP->new('<Name of your SMTP server', Timeout => 30, Debug
 => 1, ); # connect to SMTP server
@@ -2103,68 +1837,72 @@ recipient's address
                 $smtp->quit;    # Close the SMTP connection
 exit;
 
+
+
+
    12.
 
    Note
 
    This step is optional if you are using IIS or another web server which
-   only decides on an interpreter based upon the file extension (.pl),
+   only  decides  on  an interpreter based upon the file extension (.pl),
    rather than the "shebang" line (#/usr/bonsaitools/bin/perl)
-       Modify the path to perl on the first line (#!) of all files to
-       point to your Perl installation, and add "perl" to the beginning
-       of all Perl system calls that use a perl script as an argument.
-       This may take you a while. There is a "setperl.csh" utility to
-       speed part of this procedure, available in the Useful Patches and
-       Utilities for Bugzilla section of The Bugzilla Guide. However, it
+       Modify  the  path  to  perl on the first line (#!) of all files to
+       point  to  your Perl installation, and add "perl" to the beginning
+       of  all  Perl  system calls that use a perl script as an argument.
+       This  may  take  you  a while. There is a "setperl.csh" utility to
+       speed  part of this procedure, available in the Useful Patches and
+       Utilities  for Bugzilla section of The Bugzilla Guide. However, it
        requires the Cygwin GNU-compatible environment for Win32 be set up
-       in order to work. See http://www.cygwin.com/ for details on
+       in  order  to  work.  See  http://www.cygwin.com/  for  details on
        obtaining Cygwin.
    13. Modify the invocation of all system() calls in all perl scripts in
-       your Bugzilla directory. For instance, change this line in
+       your  Bugzilla directory. You should specify the full path to perl
+       for  each  system()  call.  For  instance,  change  this  line  in
        processmail:
 
 
-system ("./processmail.pl",@ARGLIST);
-
+system ("./processmail",@ARGLIST);
+        </programlisting> to
+        <programlisting>
+system ("C:\\perl\\bin\\perl", "processmail", @ARGLIST);
 
-       to
 
 
-system ("perl processmail.pl",@ARGLIST);
-
-
-   14. Add binmode() calls so attachments will work (bug 62000).
-       Because Microsoft Windows based systems handle binary files
-       different than Unix based systems, you need to add the following
-       lines to createattachment.cgi and showattachment.cgi before the
+   14. Add binmode() calls so attachments will work ( bug 62000 ).
+       Because  Microsoft  Windows  based  systems  handle  binary  files
+       different  than  Unix based systems, you need to add the following
+       lines  to  createattachment.cgi  and showattachment.cgi before the
        require 'CGI.pl'; line.
 
 binmode(STDIN);
 binmode(STDOUT);
 
+
+
    Note
 
-   According to bug 62000, the perl documentation says that you should
-   always use binmode() when dealing with binary files, but never when
-   dealing with text files. That seems to suggest that rather than
-   aribtrarily putting binmode() at the begining of the attachment files,
-   there should be logic to determine if binmode() is needed or not.
+   According  to  bug 62000 , the perl documentation says that you should
+   always  use  binmode()  when dealing with binary files, but never when
+   dealing  with  text  files.  That  seems  to  suggest that rather than
+   arbitrarily  putting  binmode()  at  the  beginning  of the attachment
+   files,  there  should  be logic to determine if binmode() is needed or
+   not.
 
    Tip
 
-   If you are using IIS or Personal Web Server, you must add cgi
-   relationships to Properties -> Home directory (tab) -> Application
+   If  you  are  using  IIS  or  Personal  Web  Server,  you must add cgi
+   relationships  to  Properties  ->  Home directory (tab) -> Application
    Settings (section) -> Configuration (button), such as:
 
-
-.cgi to: <perl install directory>\perl.exe %s %s
-.pl to: <perl install directory>\perl.exe %s %s
-GET,HEAD,POST
+.cgi to: <perl install directory>\perl.exe %s
+        %s .pl to: <perl install directory>\perl.exe %s %s
+        GET,HEAD,POST
 
    Change the path to Perl to match your install, of course.
      _________________________________________________________________
 
-3.6.2. Additional Windows Tips
+4.3.2. Additional Windows Tips
 
    Tip
 
@@ -2178,7 +1916,8 @@ GET,HEAD,POST
      Basically you need to add two String Keys in the registry at the
      following location:
 
-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\ScriptMap
+            HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Paramete
+rs\ScriptMap
 
      The keys should be called ".pl" and ".cgi", and both should have a
      value something like: c:/perl/bin/perl.exe "%s" "%s"
@@ -2188,155 +1927,171 @@ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\ScriptMap
 
    Tip
 
-   If attempting to run Bugzilla 2.12 or older, you will need to remove
-   encrypt() calls from the Perl source. This is not necessary for
-   Bugzilla 2.13 and later, which includes the current release, Bugzilla
-   2.14.
+   If  attempting  to run Bugzilla 2.12 or older, you will need to remove
+   encrypt()  calls  from  the  Perl  source.  This  is not necessary for
+   Bugzilla  2.13 and later, which includes the current release, Bugzilla
+   &bz-ver;.
 
-   Example 3-4. Removing encrypt() for Windows NT Bugzilla version 2.12
+   Example  4-3.  Removing encrypt() for Windows NT Bugzilla version 2.12
    or earlier
 
    Replace this:
-
-SendSQL("SELECT encrypt(" . SqlQuote($enteredpwd) . ", " . SQLQuote(substr($rea
-lcryptpwd, 0, 2)) . ")");
-my $enteredcryptpwd = FetchOneColumn();
+SendSQL("SELECT encrypt(" . SqlQuote($enteredpwd) .
+          ", " . SQLQuote(substr($realcryptpwd, 0, 2)) . ")"); my
+          $enteredcryptpwd = FetchOneColumn();
 
    with this:
-
-my $enteredcryptpwd = $enteredpwd
+   my $enteredcryptpwd = $enteredpwd
 
    in cgi.pl.
      _________________________________________________________________
 
-3.6.3. Bugzilla LDAP Integration
-
-   What follows is some late-breaking information on using the LDAP
-   authentication options with Bugzilla. The author has not tested these
-   (nor even formatted this section!) so please contribute feedback to
-   the newsgroup.
-
-   Mozilla::LDAP module
-   The Mozilla::LDAP module allows you to use LDAP for authentication to
-   the Bugzilla system.  This module is not required if you are not using
-   LDAP.
-   Mozilla::LDAP (aka PerLDAP) is available for download from
-   http://www.mozilla.org/directory.
-   NOTE: The Mozilla::LDAP module requires Netscape's Directory SDK.
-   Follow the link for "Directory SDK for C" on that same page to
-   download the SDK first.  After you have installed this SDK, then
-   install the PerLDAP module.
-   ----------------------------------------------------------------------
-   Post-Installation Checklist
-   ----------------------------------------------------------------------
-   Set useLDAP to "On" **only** if you will be using an LDAP directory
-   for authentication.  Be very careful when setting up this parameter;
-   if you set LDAP authentication, but do not have a valid LDAP directory
-   set up, you will not be able to log back in to Bugzilla once you log
-   out.  (If this happens, you can get back in by manually editing the
-   data/params file, and setting useLDAP back to 0.)
-   If using LDAP, you must set the three additional parameters:
-   Set LDAPserver to the name (and optionally port) of your LDAP server.
-   If no port is specified, it defaults to the default port of 389.  (e.g
-   "ldap.mycompany.com" or "ldap.mycompany.com:1234")
-   Set LDAPBaseDN to the base DN for searching for users in your LDAP
-   directory.  (e.g. "ou=People,o=MyCompany")  uids must be unique under
-   the DN specified here.
-   Set LDAPmailattribute to the name of the attribute in your LDAP
-   directory which contains the primary email address.  On most directory
-   servers available, this is "mail", but you may need to change this.
-   ----------------------------------------------------------------------
-   (Not sure where this bit should go, but it's important that it be in
-   there somewhere...)
-   ----------------------------------------------------------------------
-   Using LDAP authentication for Bugzilla:
-   The existing authentication scheme for Bugzilla uses email addresses
-   as the primary user ID, and a password to authenticate that user.  All
-   places within Bugzilla where you need to deal with user ID (e.g
-   assigning a bug) use the email address.
-   The LDAP authentication builds on top of this scheme, rather than
-   replacing it.  The initial log in is done with a username and password
-   for the LDAP directory.  This then fetches the email address from LDAP
-   and authenticates seamlessly in the standard Bugzilla authentication
-   scheme using this email address.  If an account for this address
-   already exists in your Bugzilla system, it will log in to that
-   account.  If no account for that email address exists, one is created
-   at the time of login.  (In this case, Bugzilla will attempt to use the
-   "displayName" or "cn" attribute to determine the user's full name.)
-   After authentication, all other user-related tasks are still handled
-   by email address, not LDAP username.  You still assign bugs by email
-   address, query on users by email address, etc.
-   ----------------------------------------------------------------------
+4.4. Mac OS X Installation Notes
+
+There are a lot of common libraries and utilities out there that Apple did
+not include with Mac OS X, but which run perfectly well on it. The GD
+library, which Bugzilla needs to do bug graphs, is one of these.
+
+The easiest way to get a lot of these is with a program called Fink, which
+is similar in nature to the CPAN installer, but installs common GNU
+utilities. Fink is available from <http://sourceforge.net/projects/fink/>.
+
+Follow the instructions for setting up Fink. Once it's installed, you'll
+want to run the following as root: fink install gd
+
+It will prompt you for a number of dependencies, type 'y' and hit enter to
+install all of the dependencies. Then watch it work.
+
+To prevent creating conflicts with the software that Apple installs by
+default, Fink creates its own directory tree at /sw where it installs most
+of the software that it installs. This means your libraries and headers for
+libgd will be at /sw/lib and /sw/include instead of /usr/lib and
+/usr/local/include. Because of these changed locations for the libraries,
+the Perl GD module will not install directly via CPAN, because it looks for
+the specific paths instead of getting them from your environment. But
+there's a way around that :-)
+
+Instead of typing "install GD" at the cpan> prompt, type look GD. This
+should go through the motions of downloading the latest version of the GD
+module, then it will open a shell and drop you into the build directory.
+Apply this patch to the Makefile.PL file (save the patch into a file and use
+the command patch < patchfile.)
+
+Then, run these commands to finish the installation of the GD module:
+
+perl Makefile.PL
+make
+make test
+make install
+And don't forget to run exit to get back to CPAN.
+     _________________________________________________________________
+
+4.5. Troubleshooting
+
+This section gives solutions to common Bugzilla installation problems.
+     _________________________________________________________________
+
+4.5.1. Bundle::Bugzilla makes me upgrade to Perl 5.6.1
+
+Try executing perl -MCPAN -e 'install CPAN' and then continuing.
+
+Certain older versions of the CPAN toolset were somewhat naive about how to
+upgrade Perl modules. When a couple of modules got rolled into the core Perl
+distribution for 5.6.1, CPAN thought that the best way to get those modules
+up to date was to haul down the Perl distribution itself and build it.
+Needless to say, this has caused headaches for just about everybody.
+Upgrading to a newer version of CPAN with the commandline above should fix
+things.
+     _________________________________________________________________
+
+4.5.2. DBD::Sponge::db prepare failed
+
+The following error message may appear due to a bug in DBD::mysql (over
+which the Bugzilla team have no control):
+
+ DBD::Sponge::db prepare failed: Cannot determine NUM_OF_FIELDS at D:/Perl/site
+/lib/DBD/mysql.pm line 248.
+  SV = NULL(0x0) at 0x20fc444
+  REFCNT = 1
+  FLAGS = (PADBUSY,PADMY)
+
+   To  fix  this,  go  to  <path-to-perl>/lib/DBD/sponge.pm  in your Perl
+   installation and replace
+ my $numFields;
+ if ($attribs->{'NUM_OF_FIELDS'}) {
+     $numFields = $attribs->{'NUM_OF_FIELDS'};
+ } elsif ($attribs->{'NAME'}) {
+     $numFields = @{$attribs->{NAME}};
+
+   by
+ my $numFields;
+ if ($attribs->{'NUM_OF_FIELDS'}) {
+     $numFields = $attribs->{'NUM_OF_FIELDS'};
+ } elsif ($attribs->{'NAMES'}) {
+     $numFields = @{$attribs->{NAMES}};
+
+   (note the S added to NAME.)
      _________________________________________________________________
 
-Chapter 4. Administering Bugzilla
+4.5.3. cannot chdir(/var/spool/mqueue)
 
-   Or, I just got this cool thing installed. Now what the heck do I do
-   with it?
+If you are installing Bugzilla on SuSE Linux, or some other distributions
+with "paranoid" security options, it is possible that the checksetup.pl
+script may fail with the error:
 
-   So you followed "Bugzilla Installation" to the letter, and logged into
-   Bugzilla for the very first time with your super-duper god account.
-   You sit, contentedly staring at the Bugzilla Query Screen, the worst
-   of the whole mad business of installing this terrific program behind
-   you. It seems, though, you have nothing yet to query! Your first act
-   of business should be to setup the operating parameters for Bugzilla
-   so you can get busy getting data into your bug tracker.
+cannot chdir(/var/spool/mqueue): Permission denied
+
+   This  is  because  your  /var/spool/mqueue  directory  has  a  mode of
+   "drwx------".  Type  chmod  755  /var/spool/mqueue as root to fix this
+   problem.
      _________________________________________________________________
 
-4.1. Post-Installation Checklist
-
-   After installation, follow the checklist below to help ensure that you
-   have a successful installation. If you do not see a recommended
-   setting for a parameter, consider leaving it at the default while you
-   perform your initial tests on your Bugzilla setup.
-    1. Bring up editparams.cgi in your web browser. This should be
-       available as the "edit parameters" link from any Bugzilla screen
-       once you have logged in.
-    2. The "maintainer" is the email address of the person responsible
-       for maintaining this Bugzilla installation. The maintainer need
-       not be a valid Bugzilla user. Error pages, error emails, and
-       administrative mail will be sent with the maintainer as the return
-       email address.
-       Set "maintainer" to your email address. This allows Bugzilla's
-       error messages to display your email address and allow people to
-       contact you for help.
-    3. The "urlbase" parameter defines the fully qualified domain name
+Chapter 5. Administering Bugzilla
+
+5.1. Bugzilla Configuration
+
+Bugzilla is configured by changing various parameters, accessed from the
+"Edit parameters" link in the page footer. Here are some of the key
+parameters on that page. You should run down this list and set them
+appropriately after installing Bugzilla.
+
+    1. maintainer: The maintainer parameter is the email address of the
+       person responsible for maintaining this Bugzilla installation. The
+       address need not be that of a valid Bugzilla account.
+    2. urlbase: This parameter defines the fully qualified domain name
        and web server path to your Bugzilla installation.
-       For example, if your bugzilla query page is
-       http://www.foo.com/bugzilla/query.cgi, set your "urlbase" is
+       For example, if your Bugzilla query page is
+       http://www.foo.com/bugzilla/query.cgi, set your "urlbase" to
        http://www.foo.com/bugzilla/.
-    4. "usebuggroups" dictates whether or not to implement group-based
-       security for Bugzilla. If set, Bugzilla bugs can have an
-       associated groupmask defining which groups of users are allowed to
-       see and edit the bug.
+    3. usebuggroups: This dictates whether or not to implement
+       group-based security for Bugzilla. If set, Bugzilla bugs can have
+       an associated 'group', defining which users are allowed to see and
+       edit the bug.
        Set "usebuggroups" to "on" only if you may wish to restrict access
-       to products. I suggest leaving this parameter off while initially
-       testing your Bugzilla.
-    5. "usebuggroupsentry", when set to "on", requires that all bugs have
-       an associated groupmask when submitted. This parameter is made for
-       those installations where product isolation is a necessity.
-       Set "usebuggroupsentry" to "on" if you absolutely need to restrict
-       access to bugs from the moment they are submitted through
-       resolution. Once again, if you are simply testing your
-       installation, I suggest against turning this parameter on; the
-       strict security checking may stop you from being able to modify
-       your new entries.
-    6. You run into an interesting problem when Bugzilla reaches a high
-       level of continuous activity. MySQL supports only table-level
-       write locking. What this means is that if someone needs to make a
-       change to a bug, they will lock the entire table until the
-       operation is complete. Locking for write also blocks reads until
-       the write is complete. The "shadowdb" parameter was designed to
-       get around this limitation. While only a single user is allowed to
-       write to a table at a time, reads can continue unimpeded on a
-       read-only shadow copy of the database. Although your database size
-       will double, a shadow database can cause an enormous performance
-       improvement when implemented on extremely high-traffic Bugzilla
-       databases.
-       Set "shadowdb" to "bug_shadowdb" if you will be running a *very*
-       large installation of Bugzilla. The shadow database enables many
-       simultaneous users to read and write to the database without
-       interfering with one another.
+       to particular bugs to certain groups of users. I suggest leaving
+       this parameter off while initially testing your Bugzilla.
+    4. usebuggroupsentry: Bugzilla Products can have a group associated
+       with them, so that certain users can only see bugs in certain
+       products. When this parameter is set to "on", this places all
+       newly-created bugs in the group for their product immediately.
+    5. shadowdb: You run into an interesting problem when Bugzilla
+       reaches a high level of continuous activity. MySQL supports only
+       table-level write locking. What this means is that if someone
+       needs to make a change to a bug, they will lock the entire table
+       until the operation is complete. Locking for write also blocks
+       reads until the write is complete. The "shadowdb" parameter was
+       designed to get around this limitation. While only a single user
+       is allowed to write to a table at a time, reads can continue
+       unimpeded on a read-only shadow copy of the database. Although
+       your database size will double, a shadow database can cause an
+       enormous performance improvement when implemented on extremely
+       high-traffic Bugzilla databases.
+       As a guide, mozilla.org began needing "shadowdb" when they reached
+       around 40,000 Bugzilla users with several hundred Bugzilla bug
+       changes and comments per day.
+       The value of the parameter defines the name of the shadow bug
+       database. Set "shadowdb" to e.g. "bug_shadowdb" if you will be
+       running a *very* large installation of Bugzilla.
 
    Note
 
@@ -2344,74 +2099,38 @@ Chapter 4. Administering Bugzilla
    installation of Bugzilla. You should regularly check that your
    database is in sync. It is often advisable to force a shadow database
    sync nightly via "cron".
-       Once again, in testing you should avoid this option -- use it if
-       or when you need to use it, and have repeatedly run into the
-       problem it was designed to solve -- very long wait times while
-       attempting to commit a change to the database. Mozilla.org began
-       needing "shadowdb" when they reached around 40,000 Bugzilla users
-       with several hundred Bugzilla bug changes and comments per day.
        If you use the "shadowdb" option, it is only natural that you
-       should turn the "queryagainstshadowdb" option "On" as well.
+       should turn the "queryagainstshadowdb" option on as well.
        Otherwise you are replicating data into a shadow database for no
        reason!
-    7. "headerhtml", "footerhtml", "errorhtml", "bannerhtml", and
-       "blurbhtml" are all templates which control display of headers,
-       footers, errors, banners, and additional data. We could go into
-       some detail regarding the usage of these, but it is really best
-       just to monkey around with them a bit to see what they do. I
-       strongly recommend you copy your data/params file somewhere safe
-       before playing with these values, though. If they are changed
-       dramatically, it may make it impossible for you to display
-       Bugzilla pages to fix the problem until you have restored your
-       data/params file.
-       If you have custom logos or HTML you must put in place to fit
-       within your site design guidelines, place the code in the
-       "headerhtml", "footerhtml", "errorhtml", "bannerhtml", or
-       "blurbhtml" text boxes.
-
-   Note
-
-   The "headerhtml" text box is the HTML printed out before any other
-   code on the page, except the CONTENT-TYPE header sent by the Bugzilla
-   engine. If you have a special banner, put the code for it in
-   "bannerhtml". You may want to leave these settings at the defaults
-   initially.
-    8. "passwordmail" is rather simple. Every time a user creates an
-       account, the text of this parameter is read as the text to send to
-       the new user along with their password message.
+    6. shutdownhtml: If you need to shut down Bugzilla to perform
+       administration, enter some descriptive HTML here and anyone who
+       tries to use Bugzilla will receive a page to that effect.
+       Obviously, editparams.cgi will still be accessible so you can
+       remove the HTML and re-enable Bugzilla. :-)
+    7. passwordmail: Every time a user creates an account, the text of
+       this parameter (with substitutions) is sent to the new user along
+       with their password message.
        Add any text you wish to the "passwordmail" parameter box. For
        instance, many people choose to use this box to give a quick
        training blurb about how to use Bugzilla at your site.
-    9. "useqacontact" allows you to define an email address for each
+    8. useqacontact: This allows you to define an email address for each
        component, in addition to that of the default owner, who will be
-       sent carbon copies of incoming bugs. The critical difference
-       between a QA Contact and an Owner is that the QA Contact follows
-       the component. If you reassign a bug from component A to component
-       B, the QA Contact for that bug will change with the reassignment,
-       regardless of owner.
-       "usestatuswhiteboard" defines whether you wish to have a
+       sent carbon copies of incoming bugs.
+    9. usestatuswhiteboard: This defines whether you wish to have a
        free-form, overwritable field associated with each bug. The
        advantage of the Status Whiteboard is that it can be deleted or
        modified with ease, and provides an easily-searchable field for
-       indexing some bugs that have some trait in common. Many people
-       will put "help wanted", "stalled", or "waiting on reply from
-       somebody" messages into the Status Whiteboard field so those who
-       peruse the bugs are aware of their status even more than that
-       which can be indicated by the Resolution fields.
-       Do you want to use the QA Contact ("useqacontact") and status
-       whiteboard ("usestatuswhiteboard") fields? These fields are useful
-       because they allow for more flexibility, particularly when you
-       have an existing Quality Assurance and/or Release Engineering
-       team, but they may not be needed for many smaller installations.
-   10. Set "whinedays" to the amount of days you want to let bugs go in
-       the "New" or "Reopened" state before notifying people they have
+       indexing some bugs that have some trait in common.
+   10. whinedays: Set this to the number of days you want to let bugs go
+       in the NEW or REOPENED state before notifying people they have
        untouched new bugs. If you do not plan to use this feature, simply
        do not set up the whining cron job described in the installation
        instructions, or set this value to "0" (never whine).
-   11. "commenton" fields allow you to dictate what changes can pass
-       without comment, and which must have a comment from the person who
-       changed them. Often, administrators will allow users to add
-       themselves to the CC list, accept bugs, or change the Status
+   11. commenton*: All these fields allow you to dictate what changes can
+       pass without comment, and which must have a comment from the
+       person who changed them. Often, administrators will allow users to
+       add themselves to the CC list, accept bugs, or change the Status
        Whiteboard without adding a comment as to their reasons for the
        change, yet require that most other changes come with an
        explanation.
@@ -2425,89 +2144,52 @@ Chapter 4. Administering Bugzilla
    resolving bugs than not. Few things are more annoying to bug database
    users than having a developer mark a bug "fixed" without any comment
    as to what the fix was (or even that it was truly fixed!)
-   12. The "supportwatchers" option can be an exceptionally powerful tool
-       in the hands of a power Bugzilla user. By enabling this option,
-       you allow users to receive email updates whenever other users
-       receive email updates. This is, of course, subject to the groupset
-       restrictions on the bug; if the "watcher" would not normally be
-       allowed to view a bug, the watcher cannot get around the system by
-       setting herself up to watch the bugs of someone with bugs outside
-       her priveleges. She would still only receive email updates for
-       those bugs she could normally view.
-       For Bugzilla sites which require strong inter-Product security to
-       prevent snooping, watchers are not a good idea.
-       However, for most sites you should set "supportwatchers" to "On".
-       This feature is helpful for team leads to monitor progress in
-       their respective areas, and can offer many other benefits, such as
-       allowing a developer to pick up a former engineer's bugs without
-       requiring her to change all the information in the bug.
+   12. supportwatchers: Turning on this option allows users to ask to
+       receive copies of all a particular other user's bug email. This
+       is, of course, subject to the groupset restrictions on the bug; if
+       the "watcher" would not normally be allowed to view a bug, the
+       watcher cannot get around the system by setting herself up to
+       watch the bugs of someone with bugs outside her privileges. They
+       would still only receive email updates for those bugs she could
+       normally view.
      _________________________________________________________________
 
-4.2. User Administration
-
-   User administration is one of the easiest parts of Bugzilla. Keeping
-   it from getting out of hand, however, can become a challenge.
-     _________________________________________________________________
+5.2. User Administration
 
-4.2.1. Creating the Default User
+5.2.1. Creating the Default User
 
-   When you first run checksetup.pl after installing Bugzilla, it will
-   prompt you for the administrative username (email address) and
-   password for this "super user". If for some reason you were to delete
-   the "super user" account, re-running checksetup.pl will again prompt
-   you for this username and password.
+When you first run checksetup.pl after installing Bugzilla, it will prompt
+you for the administrative username (email address) and password for this
+"super user". If for some reason you delete the "super user" account,
+re-running checksetup.pl will again prompt you for this username and
+password.
 
    Tip
 
    If you wish to add more administrative users, you must use the MySQL
-   interface. Run "mysql" from the command line, and use these commands
-   ("mysql>" denotes the mysql prompt, not something you should type in):
-   mysql> use bugs; mysql> update profiles set groupset=0x7ffffffffffffff
-   where login_name = "(user's login name)";
+   interface. Run "mysql" from the command line, and use these commands:
 
-   Yes, that is fourteen "f"'s. A whole lot of f-ing going on if you want
-   to create a new administator.
-     _________________________________________________________________
-
-4.2.2. Managing Other Users
-
-4.2.2.1. Logging In
-
-    1. Open the index.html page for your Bugzilla installation in your
-       browser window.
-    2. Click the "Query Existing Bug Reports" link.
-    3. Click the "Log In" link at the foot of the page.
-    4. Type your email address, and the password which was emailed to you
-       when you created your Bugzilla account, into the spaces provided.
+   mysql> use bugs;
+   mysql> update profiles set groupset=0x7ffffffffffffff where login_name
+   = "(user's login name)"; 
 
-   Congratulations, you are logged in!
+   Yes, that is fourteen "f" 's. A whole lot of f-ing going on if you
+   want to create a new administator.
      _________________________________________________________________
 
-4.2.2.2. Creating new users
+5.2.2. Managing Other Users
 
-   Your users can create their own user accounts by clicking the "New
-   Account" link at the bottom of each page. However, should you desire
-   to create user accounts ahead of time, here is how you do it.
+5.2.2.1. Creating new users
 
-    1. After logging in, click the "Users" link at the footer of the
-       query page.
-    2. To see a specific user, type a portion of their login name in the
-       box provided and click "submit". To see all users, simply click
-       the "submit" button. You must click "submit" here to be able to
-       add a new user.
-
-   Tip
+Your users can create their own user accounts by clicking the "New Account"
+link at the bottom of each page (assuming they aren't logged in as someone
+else already.) However, should you desire to create user accounts ahead of
+time, here is how you do it.
 
-   More functionality is available via the list on the right-hand side of
-   the text entry box. You can match what you type as a case-insensitive
-   substring (the default) of all users on your system, a case-sensitive
-   regular expression (please see the man regexp manual page for details
-   on regular expression syntax), or a reverse regular expression match,
-   where every user name which does NOT match the regular expression is
-   selected.
-    3. Click the "Add New User" link at the bottom of the user list
-    4. Fill out the form presented. This page is self-explanatory. When
-       done, click "submit".
+    1. After logging in, click the "Users" link at the footer of the
+       query page, and then click "Add a new user".
+    2. Fill out the form presented. This page is self-explanatory. When
+       done, click "Submit".
 
    Note
 
@@ -2520,62 +2202,34 @@ Chapter 4. Administering Bugzilla
    account name and password.
      _________________________________________________________________
 
-4.2.2.3. Disabling Users
-
-   I bet you noticed that big "Disabled Text" entry box available from
-   the "Add New User" screen, when you edit an account? By entering any
-   text in this box and selecting "submit", you have prevented the user
-   from using Bugzilla via the web interface. Your explanation, written
-   in this text box, will be presented to the user the next time she
-   attempts to use the system.
-
-   Warning
-
-   Don't disable your own administrative account, or you will hate life!
-
-   At this time, "Disabled Text" does not prevent a user from using the
-   email interface. If you have the email interface enabled, they can
-   still continue to submit bugs and comments that way. We need a patch
-   to fix this.
-     _________________________________________________________________
-
-4.2.2.4. Modifying Users
-
-   Here I will attempt to describe the function of each option on the
-   Edit User screen.
-
-     * Login Name: This is generally the user's email address. However,
-       if you have edited your system parameters, this may just be the
-       user's login name or some other identifier.
-
-       Tip
-
-   For compatability reasons, you should probably stick with email
-   addresses as user login names. It will make your life easier.
-     * Real Name: Duh!
-     * Password: You can change the user password here. It is normal to
-       only see asterisks.
-     * Email Notification: You may choose from one of three options:
-         1. All qualifying bugs except those which I change: The user
-            will be notified of any change to any bug for which she is
-            the reporter, assignee, QA Contact, CC recipient, or
-            "watcher".
-         2. Only those bugs which I am listed on the CC line: The user
-            will not be notified of changes to bugs where she is the
-            assignee, reporter, or QA Contact, but will receive them if
-            she is on the CC list.
-
-            Note
-
-   She will still receive whining cron emails if you set up the
-   "whinemail" feature.
-         3. All Qualifying Bugs: This user is a glutton for punishment.
-            If her name is in the reporter, QA Contact, CC, assignee, or
-            is a "watcher", she will get email updates regarding the bug.
-       Disable Text: If you type anything in this box, including just a
-       space, the user account is disabled from making any changes to
-       bugs via the web interface, and what you type in this box is
-       presented as the reason.
+5.2.2.2. Modifying Users
+
+To see a specific user, search for their login name in the box provided on
+the "Edit Users" page. To see all users, leave the box blank.
+
+You can search in different ways the listbox to the right of the text entry
+box. You can match by case-insensitive substring (the default), regular
+expression, or a reverse regular expression match, which finds every user
+name which does NOT match the regular expression. (Please see the man regexp
+manual page for details on regular expression syntax.)
+
+Once you have found your user, you can change the following fields:
+
+     * Login Name: This is generally the user's full email address.
+       However, if you have are using the emailsuffix Param, this may
+       just be the user's login name. Note that users can now change
+       their login names themselves (to any valid email address.)
+     * Real Name: The user's real name. Note that Bugzilla does not
+       require this to create an account.
+     * Password: You can change the user's password here. Users can
+       automatically request a new password, so you shouldn't need to do
+       this often. If you want to disable an account, see Disable Text
+       below.
+     * Disable Text: If you type anything in this box, including just a
+       space, the user is prevented from logging in, or making any
+       changes to bugs via the web interface. The HTML you type in this
+       box is presented to the user when they attempt to perform these
+       actions, and should explain why the account was disabled.
 
        Warning
 
@@ -2583,94 +2237,64 @@ Chapter 4. Administering Bugzilla
 
    Note
 
-   As of this writing, the user can still submit bugs via the e-mail
-   gateway, if you set it up, despite the disabled text field. The e-mail
-   gateway should not be enabled for secure installations of Bugzilla.
-     * CanConfirm: This field is only used if you have enabled
-       "unconfirmed" status in your parameters screen. If you enable this
-       for a user, that user can then move bugs from "Unconfirmed" to
-       "Confirmed" status (e.g.: "New" status). Be judicious about
-       allowing users to turn this bit on for other users.
-     * Creategroups: This option will allow a user to create and destroy
-       groups in Bugzilla. Unless you are using the Bugzilla GroupSentry
-       security option "usebuggroupsentry" in your parameters, this
-       setting has no effect.
-     * Editbugs: Unless a user has this bit set, they can only edit those
-       bugs for which they are the assignee or the reporter.
-
-   Note
-
-   Leaving this option unchecked does not prevent users from adding
-   comments to a bug! They simply cannot change a bug priority, severity,
-   etc. unless they are the assignee or reporter.
-     * Editcomponents: This flag allows a user to create new products and
+   The user can still submit bugs via the e-mail gateway, if you set it
+   up, even if the disabled text field is filled in. The e-mail gateway
+   should not be enabled for secure installations of Bugzilla.
+     * <groupname>: If you have created some groups, e.g.
+       "securitysensitive", then checkboxes will appear here to allow you
+       to add users to, or remove them from, these groups.
+     * canconfirm: This field is only used if you have enabled the
+       "unconfirmed" status. If you enable this for a user, that user can
+       then move bugs from "Unconfirmed" to a "Confirmed" status (e.g.:
+       "New" status).
+     * creategroups: This option will allow a user to create and destroy
+       groups in Bugzilla.
+     * editbugs: Unless a user has this bit set, they can only edit those
+       bugs for which they are the assignee or the reporter. Even if this
+       option is unchecked, users can still add comments to bugs.
+     * editcomponents: This flag allows a user to create new products and
        components, as well as modify and destroy those that have no bugs
        associated with them. If a product or component has bugs
        associated with it, those bugs must be moved to a different
        product or component before Bugzilla will allow them to be
-       destroyed. The name of a product or component can be changed
-       without affecting the associated bugs, but it tends to annoy the
-       hell out of your users when these change a lot.
-     * Editkeywords: If you use Bugzilla's keyword functionality,
-       enabling this feature allows a user can create and destroy
+       destroyed.
+     * editkeywords: If you use Bugzilla's keyword functionality,
+       enabling this feature allows a user to create and destroy
        keywords. As always, the keywords for existing bugs containing the
        keyword the user wishes to destroy must be changed before Bugzilla
-       will allow it to die. You must be very careful about creating too
-       many new keywords if you run a very large Bugzilla installation;
-       keywords are global variables across products, and you can often
-       run into a phenomenon called "keyword bloat". This confuses users,
-       and then the feature goes unused.
-     * Editusers: This flag allows a user do what you're doing right now:
-       edit other users. This will allow those with the right to do so to
-       remove administrator priveleges from other users or grant them to
-       themselves. Enable with care.
-     * PRODUCT: PRODUCT bugs access. This allows an administrator, with
-       product-level granularity, to specify in which products a user can
-       edit bugs. The user must still have the "editbugs" privelege to
-       edit bugs in this area; this simply restricts them from even
-       seeing bugs outside these boundaries if the administrator has
-       enabled the group sentry parameter "usebuggroupsentry". Unless you
-       are using bug groups, this option has no effect.
-     _________________________________________________________________
-
-4.3. Product, Component, Milestone, and Version Administration
-
-
-
-   Dear Lord, we have to get our users to do WHAT?
+       will allow it to die.
+     * editusers: This flag allows a user to do what you're doing right
+       now: edit other users. This will allow those with the right to do
+       so to remove administrator privileges from other users or grant
+       them to themselves. Enable with care.
+     * tweakparams: This flag allows a user to change Bugzilla's Params
+       (using editparams.cgi.)
+     * <productname>: This allows an administrator to specify the
+       products in which a user can see bugs. The user must still have
+       the "editbugs" privilege to edit bugs in these products.
      _________________________________________________________________
 
-4.3.1. Products
+5.3. Product, Component, Milestone, and Version Administration
 
-   Formerly, and in some spots still, called "Programs"
+5.3.1. Products
 
-   Products are the broadest category in Bugzilla, and you should have
-   the least of these. If your company makes computer games, you should
-   have one product per game, and possibly a few special products
-   (website, meetings...)
+Products are the broadest category in Bugzilla, and tend to represent
+real-world shipping products. E.g. if your company makes computer games, you
+should have one product per game, perhaps a "Common" product for units of
+technology used in multiple games, and maybe a few special products
+(Website, Administration...)
 
-   A Product (formerly called "Program", and still referred to that way
-   in some portions of the source code) controls some very important
-   functions. The number of "votes" available for users to vote for the
-   most important bugs is set per-product, as is the number of votes
-   required to move a bug automatically from the UNCONFIRMED status to
-   the NEW status. One can close a Product for further bug entry and
-   define various Versions available from the Edit product screen.
+Many of Bugzilla's settings are configurable on a per-product basis. The
+number of "votes" available to users is set per-product, as is the number of
+votes required to move a bug automatically from the UNCONFIRMED status to
+the NEW status.
 
-   To create a new product:
+To create a new product:
 
-    1. Select "components" from the yellow footer
-
-   Tip
-
-   It may seem counterintuitive to click "components" when you want to
-   edit the properties associated with Products. This is one of a long
-   list of things we want in Bugzilla 3.0...
-    2. Select the "Add" link to the right of "Add a new product".
+    1. Select "products" from the footer
+    2. Select the "Add" link in the bottom right
     3. Enter the name of the product and a description. The Description
-       field is free-form.
-
-   Tip
+       field may contain HTML.
 
    Don't worry about the "Closed for bug entry", "Maximum Votes per
    person", "Maximum votes a person can put on a single bug", "Number of
@@ -2679,1452 +2303,719 @@ Chapter 4. Administering Bugzilla
    few moments.
      _________________________________________________________________
 
-4.3.2. Components
+5.3.2. Components
 
-   Components are subsections of a Product.
+Components are subsections of a Product. E.g. the computer game you are
+designing may have a "UI" component, an "API" component, a "Sound System"
+component, and a "Plugins" component, each overseen by a different
+programmer. It often makes sense to divide Components in Bugzilla according
+to the natural divisions of responsibility within your Product or company.
 
-   Example 4-1. Creating some Components
+Each component has a owner and (if you turned it on in the parameters), a QA
+Contact. The owner should be the primary person who fixes bugs in that
+component. The QA Contact should be the person who will ensure these bugs
+are completely fixed. The Owner, QA Contact, and Reporter will get email
+when new bugs are created in this Component and when these bugs change.
+Default Owner and Default QA Contact fields only dictate the default
+assignments; these can be changed on bug submission, or at any later point
+in a bug's life.
 
-   The computer game you are designing may have a "UI" component, an
-   "API" component, a "Sound System" component, and a "Plugins"
-   component, each overseen by a different programmer. It often makes
-   sense to divide Components in Bugzilla according to the natural
-   divisions of responsibility within your Product or company.
-
-   Each component has a owner and (if you turned it on in the
-   parameters), a QA Contact. The owner should be the primary person who
-   fixes bugs in that component. The QA Contact should be the person who
-   will ensure these bugs are completely fixed. The Owner, QA Contact,
-   and Reporter will get email when new bugs are created in this
-   Component and when these bugs change. Default Owner and Default QA
-   Contact fields only dictate the default assignments; the Owner and QA
-   Contact fields in a bug are otherwise unrelated to the Component.
-
-   To create a new Component:
+To create a new Component:
 
     1. Select the "Edit components" link from the "Edit product" page
-    2. Select the "Add" link to the right of the "Add a new component"
-       text on the "Select Component" page.
-    3. Fill out the "Component" field, a short "Description", and the
-       "Initial Owner". The Component and Description fields are
-       free-form; the "Initial Owner" field must be that of a user ID
-       already existing in the database. If the initial owner does not
-       exist, Bugzilla will refuse to create the component.
-
-   Tip
-
-   Is your "Default Owner" a user who is not yet in the database? No
-   problem.
-         a. Select the "Log out" link on the footer of the page.
-         b. Select the "New Account" link on the footer of the "Relogin"
-            page
-         c. Type in the email address of the default owner you want to
-            create in the "E-mail address" field, and her full name in
-            the "Real name" field, then select the "Submit Query" button.
-         d. Now select "Log in" again, type in your login information,
-            and you can modify the product to use the Default Owner
-            information you require.
-
-    4. Either Edit more components or return to the Bugzilla Query Page.
-       To return to the Product you were editing, you must select the
-       Components link as before.
+    2. Select the "Add" link in the bottom right.
+    3. Fill out the "Component" field, a short "Description", the
+       "Initial Owner" and "Initial QA Contact" (if enabled.) The
+       Component and Description fields may contain HTML; the "Initial
+       Owner" field must be a login name already existing in the
+       database.
      _________________________________________________________________
 
-4.3.3. Versions
-
-   Versions are the revisions of the product, such as "Flinders 3.1",
-   "Flinders 95", and "Flinders 2000". Using Versions helps you isolate
-   code changes and are an aid in reporting.
+5.3.3. Versions
 
-   Example 4-2. Common Use of Versions
+Versions are the revisions of the product, such as "Flinders 3.1", "Flinders
+95", and "Flinders 2000". Version is not a multi-select field; the usual
+practice is to select the most recent version with the bug.
 
-   A user reports a bug against Version "Beta 2.0" of your product. The
-   current Version of your software is "Release Candidate 1", and no
-   longer has the bug. This will help you triage and classify bugs
-   according to their relevance. It is also possible people may report
-   bugs against bleeding-edge beta versions that are not evident in older
-   versions of the software. This can help isolate code changes that
-   caused the bug
-
-   Example 4-3. A Different Use of Versions
-
-   This field has been used to good effect by an online service provider
-   in a slightly different way. They had three versions of the product:
-   "Production", "QA", and "Dev". Although it may be the same product, a
-   bug in the development environment is not normally as critical as a
-   Production bug, nor does it need to be reported publicly. When used in
-   conjunction with Target Milestones, one can easily specify the
-   environment where a bug can be reproduced, and the Milestone by which
-   it will be fixed.
-
-   To create and edit Versions:
+To create and edit Versions:
 
     1. From the "Edit product" screen, select "Edit Versions"
     2. You will notice that the product already has the default version
-       "undefined". If your product doesn't use version numbers, you may
-       want to leave this as it is or edit it so that it is "---". You
-       can then go back to the edit versions page and add new versions to
-       your product.
-       Otherwise, click the "Add" button to the right of the "Add a new
-       version" text.
-    3. Enter the name of the Version. This can be free-form characters up
-       to the limit of the text box. Then select the "Add" button.
-    4. At this point you can select "Edit" to edit more Versions, or
-       return to the "Query" page, from which you can navigate back to
-       the product through the "components" link at the foot of the Query
-       page.
+       "undefined". Click the "Add" link in the bottom right.
+    3. Enter the name of the Version. This field takes text only. Then
+       click the "Add" button.
      _________________________________________________________________
 
-4.3.4. Milestones
+5.3.4. Milestones
 
-   Milestones are "targets" that you plan to get a bug fixed by. For
-   example, you have a bug that you plan to fix for your 3.0 release, it
-   would be assigned the milestone of 3.0. Or, you have a bug that you
-   plan to fix for 2.8, this would have a milestone of 2.8.
+Milestones are "targets" that you plan to get a bug fixed by. For example,
+you have a bug that you plan to fix for your 3.0 release, it would be
+assigned the milestone of 3.0.
 
    Note
 
-   Milestone options will only appear for a Product if you turned the
-   "usetargetmilestone" field in the "Edit Parameters" screen "On".
+   Milestone options will only appear for a Product if you turned on the
+   "usetargetmilestone" Param in the "Edit Parameters" screen.
 
-   To create new Milestones, set Default Milestones, and set Milestone
+   To  create  new  Milestones, set Default Milestones, and set Milestone
    URL:
 
-    1. Select "edit milestones"
-    2. Select "Add" to the right of the "Add a new milestone" text
-    3. Enter the name of the Milestone in the "Milestone" field. You can
-       optionally set the "Sortkey", which is a positive or negative
-       number (-255 to 255) that defines where in the list this
-       particular milestone appears. Select "Add".
-       Example 4-4. Using SortKey with Target Milestone
-       Let's say you create a target milestone called "Release 1.0", with
-       Sortkey set to "0". Later, you realize that you will have a public
-       beta, called "Beta1". You can create a Milestone called "Beta1",
-       with a Sortkey of "-1" in order to ensure people will see the
-       Target Milestone of "Beta1" earlier on the list than "Release 1.0"
-    4. If you want to add more milestones, select the "Edit" link. If you
-       don't, well shoot, you have to go back to the "query" page and
-       select "components" again, and make your way back to the Product
-       you were editing.
+    1. Select "Edit milestones" from the "Edit product" page.
+    2. Select "Add" in the bottom right corner. text
+    3. Enter  the name of the Milestone in the "Milestone" field. You can
+       optionally  set  the  "sortkey",  which  is a positive or negative
+       number  (-255  to  255)  that  defines  where  in  the  list  this
+       particular  milestone appears. This is because milestones often do
+       not  occur  in  alphanumeric  order For example, "Future" might be
+       after "Release 1.2". Select "Add".
+    4. From  the  Edit  product  screen,  you can enter the URL of a page
+       which gives information about your milestones and what they mean.
 
-   Note
+   Tip
 
-   This is another in the list of unusual user interface decisions that
-   we'd like to get cleaned up. Shouldn't there be a link to the effect
-   of "edit the Product I was editing when I ended up here"? In any case,
-   clicking "components" in the footer takes you back to the "Select
-   product" screen, from which you can begin editing your product again.
-    5. From the Edit product screen again (once you've made your way
-       back), enter the URL for a description of what your milestones are
-       for this product in the "Milestone URL" field. It should be of the
-       format "http://www.foo.com/bugzilla/product_milestones.html"
-       Some common uses of this field include product descriptions,
-       product roadmaps, and of course a simple description of the
-       meaning of each milestone.
-    6. If you're using Target Milestones, the "Default Milestone" field
-       must have some kind of entry. If you really don't care if people
-       set coherent Target Milestones, simply leave this at the default,
-       "---". However, controlling and regularly updating the Default
-       Milestone field is a powerful tool when reporting the status of
-       projects.
-       Select the "Update" button when you are done.
+   If  you  want  your milestone document to be restricted so that it can
+   only  be viewed by people in a particular Bugzilla group, the best way
+   is to attach the document to a bug in that group, and make the URL the
+   URL of that attachment.
      _________________________________________________________________
 
-4.3.5. Voting
-
-   The concept of "voting" is a poorly understood, yet powerful feature
-   for the management of open-source projects. Each user is assigned so
-   many Votes per product, which they can freely reassign (or assign
-   multiple votes to a single bug). This allows developers to gauge user
-   need for a particular enhancement or bugfix. By allowing bugs with a
-   certain number of votes to automatically move from "UNCONFIRMED" to
-   "NEW", users of the bug system can help high-priority bugs garner
-   attention so they don't sit for a long time awaiting triage.
+5.4. Voting
 
-   The daunting challenge of Votes is deciding where you draw the line
-   for a "vocal majority". If you only have a user base of 100 users,
-   setting a low threshold for bugs to move from UNCONFIRMED to NEW makes
-   sense. As the Bugzilla user base expands, however, these thresholds
-   must be re-evaluated. You should gauge whether this feature is worth
-   the time and close monitoring involved, and perhaps forego
-   implementation until you have a critical mass of users who demand it.
+Voting allows users to be given a pot of votes which they can allocate to
+bugs, to indicate that they'd like them fixed. This allows developers to
+gauge user need for a particular enhancement or bugfix. By allowing bugs
+with a certain number of votes to automatically move from "UNCONFIRMED" to
+"NEW", users of the bug system can help high-priority bugs garner attention
+so they don't sit for a long time awaiting triage.
 
-   To modify Voting settings:
+To modify Voting settings:
 
     1. Navigate to the "Edit product" screen for the Product you wish to
        modify
-    2. Set "Maximum Votes per person" to your calculated value. Setting
-       this field to "0" disables voting.
-    3. Set "Maximum Votes a person can put on a single bug" to your
-       calculated value. It should probably be some number lower than the
-       "Maximum votes per person". Setting this field to "0" disables
-       voting, but leaves the voting options open to the user. This is
-       confusing.
-    4. Set "Number of votes a bug in this product needs to automatically
-       get out of the UNCONFIRMED state" to your calculated number.
-       Setting this field to "0" disables the automatic move of bugs from
-       UNCONFIRMED to NEW. Some people advocate leaving this at "0", but
-       of what use are Votes if your Bugzilla user base is unable to
-       affect which bugs appear on Development radar?
-
-   Tip
-
-   You should probably set this number to higher than a small coalition
-   of Bugzilla users can influence it. Most sites use this as a
-   "referendum" mechanism -- if users are able to vote a bug out of
-   UNCONFIRMED, it is a really bad bug!
-    5. Once you have adjusted the values to your preference, select the
-       "Update" button.
+    2. Maximum Votes per person: Setting this field to "0" disables
+       voting.
+    3. Maximum Votes a person can put on a single bug": It should
+       probably be some number lower than the "Maximum votes per person".
+       Don't set this field to "0" if "Maximum votes per person" is
+       non-zero; that doesn't make any sense.
+    4. Number of votes a bug in this product needs to automatically get
+       out of the UNCONFIRMED state: Setting this field to "0" disables
+       the automatic move of bugs from UNCONFIRMED to NEW.
+    5. Once you have adjusted the values to your preference, click
+       "Update".
      _________________________________________________________________
 
-4.3.6. Groups and Group Security
+5.5. Groups and Group Security
 
-   Groups can be very useful in bugzilla, because they allow users to
-   isolate bugs or products that should only be seen by certain people.
-   Groups can also be a complicated minefield of interdependencies and
-   weirdness if mismanaged.
+Groups allow the administrator to isolate bugs or products that should only
+be seen by certain people. There are two types of group - Generic Groups,
+and Product-Based Groups.
 
-   Example 4-5. When to Use Group Security
+Product-Based Groups are matched with products, and allow you to restrict
+access to bugs on a per-product basis. They are enabled using the
+usebuggroups Param. Turning on the usebuggroupsentry Param will mean bugs
+automatically get added to their product group when filed.
 
-   Many Bugzilla sites isolate "Security-related" bugs from all other
-   bugs. This way, they can have a fix ready before the security
-   vulnerability is announced to the world. You can create a "Security"
-   product which, by default, has no members, and only add members to the
-   group (in their individual User page, as described under User
-   Administration) who should have priveleged access to "Security" bugs.
-   Alternately, you may create a Group independently of any Product, and
-   change the Group mask on individual bugs to restrict access to members
-   only of certain Groups.
+Generic Groups have no special relationship to products; you create them,
+and put bugs in them as required. One example of the use of Generic Groups
+is Mozilla's "Security" group, into which security-sensitive bugs are placed
+until fixed. Only the Mozilla Security Team are members of this group.
 
-   Groups only work if you enable the "usebuggroups" paramater. In
-   addition, if the "usebuggroupsentry" parameter is "On", one can
-   restrict access to products by groups, so that only members of a
-   product group are able to view bugs within that product. Group
-   security in Bugzilla can be divided into two categories: Generic and
-   Product-Based.
+To create Generic Groups:
 
-   Note
+    1. Select the "groups" link in the footer.
+    2. Take a moment to understand the instructions on the "Edit Groups"
+       screen, then select the "Add Group" link.
+    3. Fill out the "New Name", "New Description", and "New User RegExp"
+       fields. "New User RegExp" allows you to automatically place all
+       users who fulfill the Regular Expression into the new group. When
+       you have finished, click "Add".
 
-   Groups in Bugzilla are a complicated beast that evolved out of very
-   simple user permission bitmasks, apparently itself derived from common
-   concepts in UNIX access controls. A "bitmask" is a fixed-length number
-   whose value can describe one, and only one, set of states. For
-   instance, UNIX file permissions are assigned bitmask values: "execute"
-   has a value of 1, "write" has a value of 2, and "read" has a value of
-   4. Add them together, and a file can be read, written to, and executed
-   if it has a bitmask of "7". (This is a simplified example -- anybody
-   who knows UNIX security knows there is much more to it than this.
-   Please bear with me for the purpose of this note.) The only way a
-   bitmask scheme can work is by doubling the bit count for each value.
-   Thus if UNIX wanted to offer another file permission, the next would
-   have to be a value of 8, then the next 16, the next 32, etc.
-
-   Similarly, Bugzilla offers a bitmask to define group permissions, with
-   an internal limit of 64. Several are already occupied by built-in
-   permissions. The way around this limitation is to avoid assigning
-   groups to products if you have many products, avoid bloating of group
-   lists, and religiously prune irrelevant groups. In reality, most
-   installations of Bugzilla support far fewer than 64 groups, so this
-   limitation has not hit for most sites, but it is on the table to be
-   revised for Bugzilla 3.0 because it interferes with the security
-   schemes of some administrators.
-
-   To enable Generic Group Security ("usebuggroups"):
-
-    1. Turn "On" "usebuggroups" in the "Edit Parameters" screen.
-    2. You will generally have no groups set up. Select the "groups" link
-       in the footer.
-    3. Take a moment to understand the instructions on the "Edit Groups"
-       screen. Once you feel confident you understand what is expected of
-       you, select the "Add Group" link.
-    4. Fill out the "New Name" (remember, no spaces!), "New Description",
-       and "New User RegExp" fields. "New User RegExp" allows you to
-       automatically place all users who fulfill the Regular Expression
-       into the new group.
-       Example 4-6. Creating a New Group
-       I created a group called DefaultGroup with a description of "This
-       is simply a group to play with", and a New User RegExp of
-       ".*@mydomain.tld". This new group automatically includes all
-       Bugzilla users with "@mydomain.tld" at the end of their user id.
-       When I finished, my new group was assigned bit #128.
-       When you have finished, select the Add button.
-
-   To enable Product-Based Group Security (usebuggroupsentry):
+   To use Product-Based Groups:
 
-   Warning
-
-   Don't forget that you only have 64 groups masks available, total, for
-   your installation of Bugzilla! If you plan on having more than 50
-   products in your individual Bugzilla installation, and require group
-   security for your products, you should consider either running
-   multiple Bugzillas or using Generic Group Security instead of
-   Product-Based ("usebuggroupsentry") Group Security.
-
-    1. Turn "On" "usebuggroups" and "usebuggroupsentry" in the "Edit
+    1. Turn  on  "usebuggroups"  and  "usebuggroupsentry"  in  the  "Edit
        Parameters" screen.
 
    Warning
 
-   "usebuggroupsentry" has the capacity to prevent the administrative
-   user from directly altering bugs because of conflicting group
-   permissions. If you plan on using "usebuggroupsentry", you should plan
-   on restricting administrative account usage to administrative duties
-   only. In other words, manage bugs with an unpriveleged user account,
-   and manage users, groups, Products, etc. with the administrative
-   account.
-    2. You will generally have no Groups set up, unless you enabled
-       "usebuggroupsentry" prior to creating any Products. To create
-       "Generic Group Security" groups, follow the instructions given
-       above. To create Product-Based Group security, simply follow the
-       instructions for creating a new Product. If you need to add users
-       to these new groups as you create them, you will find the option
-       to add them to the group available under the "Edit User" screens.
-
-   You may find this example illustrative for how bug groups work.
-
-   Example 4-7. Bugzilla Groups
-
-   Bugzilla Groups example
-   -----------------------
-   For this example, let us suppose we have four groups, call them
-   Group1, Group2, Group3, and Group4.
-   We have 5 users, User1, User2, User3, User4, User5.
-   We have 8 bugs, Bug1, ..., Bug8.
-   Group membership is defined by this chart:
-   (X denotes that user is in that group.)
-   (I apologize for the nasty formatting of this table.  Try viewing
-   it in a text-based browser or something for now. -MPB)
-         G G G G
-         r r r r
-         o o o o
-         u u u u
-         p p p p
-         1 2 3 4
-        +-+-+-+-+
-   User1|X| | | |
-        +-+-+-+-+
-   User2| |X| | |
-        +-+-+-+-+
-   User3|X| |X| |
-        +-+-+-+-+
-   User4|X|X|X| |
-        +-+-+-+-+
-   User5| | | | |
-        +-+-+-+-+
-   Bug restrictions are defined by this chart:
-   (X denotes that bug is restricted to that group.)
-        G G G G
-        r r r r
-        o o o o
-        u u u u
-        p p p p
-        1 2 3 4
-       +-+-+-+-+
-   Bug1| | | | |
-       +-+-+-+-+
-   Bug2| |X| | |
-       +-+-+-+-+
-   Bug3| | |X| |
-       +-+-+-+-+
-   Bug4| | | |X|
-       +-+-+-+-+
-   Bug5|X|X| | |
-       +-+-+-+-+
-   Bug6|X| |X| |
-       +-+-+-+-+
-   Bug7|X|X|X| |
-       +-+-+-+-+
-   Bug8|X|X|X|X|
-       +-+-+-+-+
-   Who can see each bug?
-   Bug1 has no group restrictions.  Therefore, Bug1 can be seen by any
-   user, whatever their group membership.  This is going to be the only
-   bug that User5 can see, because User5 isn't in any groups.
-   Bug2 can be seen by anyone in Group2, that is User2 and User4.
-   Bug3 can be seen by anyone in Group3, that is User3 and User4.
-   Bug4 can be seen by anyone in Group4.  Nobody is in Group4, so none of
-   these users can see Bug4.
-   Bug5 can be seen by anyone who is in _both_ Group1 and Group2.  This
-   is only User4.  User1 cannot see it because he is not in Group2, and
-   User2 cannot see it because she is not in Group1.
-   Bug6 can be seen by anyone who is in both Group1 and Group3.  This
-   would include User3 and User4.  Similar to Bug5, User1 cannot see Bug6
-   because he is not in Group3.
-   Bug7 can be seen by anyone who is in Group1, Group2, and Group3.  This
-   is only User4.  All of the others are missing at least one of those
-   group priveleges, and thus cannot see the bug.
-   Bug8 can be seen by anyone who is in Group1, Group2, Group3, and
-   Group4.  There is nobody in all four of these groups, so nobody can
-   see Bug8.  It doesn't matter that User4 is in Group1, Group2, and
-   Group3, since he isn't in Group4.
-     _________________________________________________________________
+   XXX  is  this  still  true?  "usebuggroupsentry"  has  the capacity to
+   prevent the administrative user from directly altering bugs because of
+   conflicting    group    permissions.    If    you    plan   on   using
+   "usebuggroupsentry",  you  should  plan  on restricting administrative
+   account  usage  to  administrative duties only. In other words, manage
+   bugs  with  an  unpriveleged  user  account, and manage users, groups,
+   Products, etc. with the administrative account.
+    2. In  future,  when  you  create a Product, a matching group will be
+       automatically  created.  If  you  need to add a Product Group to a
+       Product  which was created before you turned on usebuggroups, then
+       simply  create  a new group, as outlined above, with the same name
+       as the Product.
 
-4.4. Bugzilla Security
+   Warning
 
+   Bugzilla  currently  has a limit of 64 groups per installation. If you
+   have more than about 50 products, you should consider running multiple
+   Bugzillas.  Ask  in  the  newsgroup  for other suggestions for working
+   around this restriction.
 
+   Note  that  group permissions are such that you need to be a member of
+   all the groups a bug is in, for whatever reason, to see that bug.
+     _________________________________________________________________
 
-   Putting your money in a wall safe is better protection than depending
-   on the fact that no one knows that you hide your money in a mayonnaise
-   jar in your fridge.
+5.6. Bugzilla Security
 
-   Note
+   Warning
 
-   Poorly-configured MySQL, Bugzilla, and FTP installations have given
+   Poorly-configured MySQL and Bugzilla installations have given
    attackers full access to systems in the past. Please take these
    guidelines seriously, even for Bugzilla machines hidden away behind
    your firewall. 80% of all computer trespassers are insiders, not
    anonymous crackers.
 
-   Secure your installation.
-
    Note
 
-   These instructions must, of necessity, be somewhat vague since
-   Bugzilla runs on so many different platforms. If you have refinements
-   of these directions for specific platforms, please submit them to
+   These  instructions  must,  of  necessity,  be  somewhat  vague  since
+   Bugzilla  runs on so many different platforms. If you have refinements
+   of  these  directions  for  specific  platforms, please submit them to
    mozilla-webtools@mozilla.org
 
-    1. Ensure you are running at least MysQL version 3.22.32 or newer.
-       Earlier versions had notable security holes and poorly secured
-       default configuration choices.
+   To secure your installation:
+
+    1. Ensure  you  are  running at least MysQL version 3.22.32 or newer.
+       Earlier  versions  had notable security holes and (from a security
+       point of view) poor default configuration choices.
     2. There is no substitute for understanding the tools on your system!
-       Read The MySQL Privilege System until you can recite it from
+       Read  The  MySQL  Privilege  System  until  you can recite it from
        memory!
-       At the very least, ensure you password the "mysql -u root" account
-       and the "bugs" account, establish grant table rights (consult the
-       Keystone guide in Appendix C: The Bugzilla Database for some
-       easy-to-use details) that do not allow CREATE, DROP, RELOAD,
-       SHUTDOWN, and PROCESS for user "bugs". I wrote up the Keystone
-       advice back when I knew far less about security than I do now : )
-    3. Lock down /etc/inetd.conf. Heck, disable inet entirely on this
+    3. Lock  down  /etc/inetd.conf.  Heck,  disable inet entirely on this
        box. It should only listen to port 25 for Sendmail and port 80 for
        Apache.
-    4. Do not run Apache as "nobody". This will require very lax
-       permissions in your Bugzilla directories. Run it, instead, as a
+    4. Do  not  run  Apache  as  "nobody"  .  This  will require very lax
+       permissions  in  your  Bugzilla directories. Run it, instead, as a
        user with a name, set via your httpd.conf file.
 
    Note
 
-   "nobody" is a real user on UNIX systems. Having a process run as user
+   "nobody"  is a real user on UNIX systems. Having a process run as user
    id "nobody" is absolutely no protection against system crackers versus
-   using any other user account. As a general security measure, I
-   recommend you create unique user ID's for each daemon running on your
-   system and, if possible, use "chroot" to jail that process away from
+   using  any  other  user  account.  As  a  general  security measure, I
+   recommend  you create unique user ID's for each daemon running on your
+   system  and,  if possible, use "chroot" to jail that process away from
    the rest of your system.
-    5. Ensure you have adequate access controls for the
-       $BUGZILLA_HOME/data/ and $BUGZILLA_HOME/shadow/ directories, as
-       well as the $BUGZILLA_HOME/localconfig and
-       $BUGZILLA_HOME/globals.pl files. The localconfig file stores your
-       "bugs" user password, which would be terrible to have in the hands
-       of a criminal, while the "globals.pl" stores some default
-       information regarding your installation which could aid a system
-       cracker. In addition, some files under $BUGZILLA_HOME/data/ store
-       sensitive information, and $BUGZILLA_HOME/shadow/ stores bug
-       information for faster retrieval. If you fail to secure these
-       directories and this file, you will expose bug information to
-       those who may not be allowed to see it.
+    5. Ensure    you    have    adequate    access   controls   for   the
+       $BUGZILLA_HOME/data/     directory,     as     well     as     the
+       $BUGZILLA_HOME/localconfig  file. The localconfig file stores your
+       "bugs"  database  account  password. In addition, some files under
+       $BUGZILLA_HOME/data/ store sensitive information.
+       Bugzilla  provides  default  .htaccess  files  to protect the most
+       common  Apache installations. However, you should verify these are
+       adequate  according  to  the site-wide security policy of your web
+       server,  and  ensure  that  the  .htaccess  files  are  allowed to
+       "override"  default  permissions  set in your Apache configuration
+       files. Covering Apache security is beyond the scope of this Guide;
+       please consult the Apache documentation for details.
+       If  you are using a web server that does not support the .htaccess
+       control method, you are at risk! After installing, check to see if
+       you  can  view  the  file "localconfig" in your web browser (e.g.:
+       http://bugzilla.mozilla.org/localconfig  ).  If  you  can read the
+       contents  of  this  file,  your  web  server  has not secured your
+       bugzilla  directory  properly and you must fix this problem before
+       deploying Bugzilla. If, however, it gives you a "Forbidden" error,
+       then  it  probably  respects the .htaccess conventions and you are
+       good to go.
+       When  you  run  checksetup.pl,  the  script will attempt to modify
+       various  permissions  on  files which Bugzilla uses. If you do not
+       have  a  webservergroup set in the localconfig file, then Bugzilla
+       will  have  to  make certain files world readable and/or writable.
+       THIS  IS  INSECURE! . This means that anyone who can get access to
+       your   system   can   do  whatever  they  want  to  your  Bugzilla
+       installation.
 
    Note
 
-   Bugzilla provides default .htaccess files to protect the most common
-   Apache installations. However, you should verify these are adequate
-   according to the site-wide security policy of your web server, and
-   ensure that the .htaccess files are allowed to "override" default
-   permissions set in your Apache configuration files. Covering Apache
-   security is beyond the scope of this Guide; please consult the Apache
-   documentation for details.
-   If you are using a web server that does not support the .htaccess
-   control method, you are at risk! After installing, check to see if you
-   can view the file "localconfig" in your web browser (e.g.:
-   http://bugzilla.mozilla.org/localconfig). If you can read the contents
-   of this file, your web server has not secured your bugzilla directory
-   properly and you must fix this problem before deploying Bugzilla. If,
-   however, it gives you a "Forbidden" error, then it probably respects
-   the .htaccess conventions and you are good to go.
-       On Apache, you can use .htaccess files to protect access to these
-       directories, as outlined in Bug 57161 for the localconfig file,
-       and Bug 65572 for adequate protection in your data/ and shadow/
-       directories.
+   This  also  means  that  if your webserver runs all cgi scripts as the
+   same  user/group, anyone on the system who can run cgi scripts will be
+   able to take control of your Bugzilla installation.
+       On  Apache, you can use .htaccess files to protect access to these
+       directories,  as  outlined  in Bug 57161 for the localconfig file,
+       and Bug 65572 for adequate protection in your data/ directory.
        Note the instructions which follow are Apache-specific. If you use
-       IIS, Netscape, or other non-Apache web servers, please consult
+       IIS,  Netscape,  or  other  non-Apache web servers, please consult
        your system documentation for how to secure these files from being
        transmitted to curious users.
-       Place the following text into a file named ".htaccess", readable
+       Place  the  following text into a file named ".htaccess", readable
        by your web server, in your $BUGZILLA_HOME/data directory.
-        <Files comments> allow
-             from all </Files> deny from all
-       Place the following text into a file named ".htaccess", readable
+       <Files comments> allow from all </Files>
+               deny from all
+       Place  the  following text into a file named ".htaccess", readable
        by your web server, in your $BUGZILLA_HOME/ directory.
-        <Files localconfig> deny
-             from all </Files> allow from all
-       Place the following text into a file named ".htaccess", readable
-       by your web server, in your $BUGZILLA_HOME/shadow directory.
-        deny from all
+       <Files localconfig> deny from all </Files>
+               allow from all
      _________________________________________________________________
 
-Chapter 5. Integrating Bugzilla with Third-Party Tools
+5.7. Template Customisation
 
-5.1. Bonsai
+One of the large changes for 2.16 was the templatisation of the entire
+user-facing UI, using the Template Toolkit. Administrators can now configure
+the look and feel of Bugzilla without having to edit Perl files or face the
+nightmare of massive merge conflicts when they upgrade to a newer version in
+the future.
 
-   Bonsai is a web-based tool for managing CVS, the Concurrent Versioning
-   System . Using Bonsai, administrators can control open/closed status
-   of trees, query a fast relational database back-end for change,
-   branch, and comment information, and view changes made since the last
-   time the tree was closed. These kinds of changes cause the engineer
-   responsible to be "on the hook" (include cool URL link here for Hook
-   policies at mozilla.org). Bonsai also includes gateways to Tinderbox,
-   the Mozilla automated build management system and Bugzilla
+Templatisation also makes localised versions of Bugzilla possible, for the
+first time. In the future, a Bugzilla installation may have templates
+installed for multiple localisations, and select which ones to use based on
+the user's browser language setting.
      _________________________________________________________________
 
-5.2. CVS
-
-   CVS integration is best accomplished, at this point, using the
-   Bugzilla Email Gateway. There have been some files submitted to allow
-   greater CVS integration, but we need to make certain that Bugzilla is
-   not tied into one particular software management package.
+5.7.1. What to Edit
+
+There are two different ways of editing of Bugzilla's templates, and which
+you use depends mainly on how you upgrade Bugzilla. The template directory
+structure is that there's a top level directory, template, which contains a
+directory for each installed localisation. The default English templates are
+therefore in en. Underneath that, there is the default directory and
+optionally the custom directory. The default directory contains all the
+templates shipped with Bugzilla, whereas the custom directory does not exist
+at first and must be created if you want to use it.
+
+The first method of making customisations is to directly edit the templates
+in template/en/default. This is probably the best method for small changes
+if you are going to use the CVS method of upgrading, because if you then
+execute a cvs update, any template fixes will get automagically merged into
+your modified versions.
+
+If you use this method, your installation will break if CVS conflicts occur.
+
+The other method is to copy the templates into a mirrored directory
+structure under template/en/custom. The templates in this directory
+automatically override those in default. This is the technique you need to
+use if you use the overwriting method of upgrade, because otherwise your
+changes will be lost. This method is also better if you are using the CVS
+method of upgrading and are going to make major changes, because it is
+guaranteed that the contents of this directory will not be touched during an
+upgrade, and you can then decide whether to continue using your own
+templates, or make the effort to merge your changes into the new versions by
+hand.
+
+If you use this method, your installation may break if incompatible changes
+are made to the template interface. If such changes are made they will be
+documented in the release notes, provided you are using a stable release of
+Bugzilla. If you use using unstable code, you will need to deal with this
+one yourself, although if possible the changes will be mentioned before they
+occur in the deprecations section of the previous stable release's release
+notes.
 
-   Follow the instructions in the FAQ for enabling Bugzilla e-mail
-   integration. Ensure that your check-in script sends an email to your
-   Bugzilla e-mail gateway with the subject of "[Bug XXXX]", and you can
-   have CVS check-in comments append to your Bugzilla bug. If you have
-   your check-in script include an @resolution field, you can even change
-   the Bugzilla bug state.
+   Note
 
-   There is also a project, based upon somewhat dated Bugzilla code, to
-   integrate CVS and Bugzilla through CVS' ability to email. Check it out
-   at: http://homepages.kcbbs.gen.nz/~tonyg/, under the "cvszilla" link.
+   Don't directly edit the compiled templates in data/template/* - your
+   changes will be lost when Template Toolkit recompiles them.
      _________________________________________________________________
 
-5.3. Perforce SCM
+5.7.2. How To Edit Templates
+
+The syntax of the Template Toolkit language is beyond the scope of this
+guide. It's reasonably easy to pick up by looking at the current templates;
+or, you can read the manual, available on the Template Toolkit home page.
+However, you should particularly remember (for security reasons) to always
+HTML filter things which come from the database or user input, to prevent
+cross-site scripting attacks.
+
+However, one thing you should take particular care about is the need to
+properly HTML filter data that has been passed into the template. This means
+that if the data can possibly contain special HTML characters such as <, and
+the data was not intended to be HTML, they need to be converted to entity
+form, ie &lt;. You use the 'html' filter in the Template Toolkit to do this.
+If you fail to do this, you may open up your installation to cross-site
+scripting attacks.
+
+Also note that Bugzilla adds a few filters of its own, that are not in
+standard Template Toolkit. In particular, the 'url_quote' filter can convert
+characters that are illegal or have special meaning in URLs, such as &, to
+the encoded form, ie %26. This actually encodes most characters (but not the
+common ones such as letters and numbers and so on), including the
+HTML-special characters, so there's never a need to HTML filter afterwards.
+
+Editing templates is a good way of doing a "poor man's custom fields". For
+example, if you don't use the Status Whiteboard, but want to have a
+free-form text entry box for "Build Identifier", then you can just edit the
+templates to change the field labels. It's still be called status_whiteboard
+internally, but your users don't need to know that.
 
-   You can find the project page for Bugzilla and Teamtrack Perforce
-   integration (p4dti) at: http://www.ravenbrook.com/project/p4dti .
-   "p4dti" is now an officially supported product from Perforce, and you
-   can find the "Perforce Public Depot" p4dti page at
-   http://public.perforce.com/public/perforce/p4dti/index.html.
+   Note
 
-   Integration of Perforce with Bugzilla, once patches are applied, is
-   seamless. Perforce replication information will appear below the
-   comments of each bug. Be certain you have a matching set of patches
-   for the Bugzilla version you are installing. p4dti is designed to
-   support multiple defect trackers, and maintains its own documentation
-   for it. Please consult the pages linked above for further information.
+   If you are making template changes that you intend on submitting back
+   for inclusion in standard Bugzilla, you should read the relevant
+   sections of the Developers' Guide.
      _________________________________________________________________
 
-5.4. Tinderbox/Tinderbox2
+5.7.3. Template Formats
 
-   We need Tinderbox integration information.
-     _________________________________________________________________
+Some CGIs have the ability to use more than one template. For example,
+buglist.cgi can output bug lists as RDF or two different forms of HTML
+(complex and simple). (Try this out by appending &format=simple to a
+buglist.cgi URL on your Bugzilla installation.) This mechanism, called
+template 'formats', is extensible.
 
-Chapter 6. The Future of Bugzilla
-
-   Bugzilla's Future.  Much of this is the present, now.
-
-   Bugzilla's future is a constantly-changing thing, as various
-   developers "scratch an itch" when it comes to functionality. Thus this
-   section is very malleable, subject to change without notice, etc.
-   You'll probably also notice the lack of formatting. I apologize that
-   it's not quite as readable as the rest of the Guide.
-
-                                  Bugzilla Blue Sky
-   Customisability
-      One of the major stumbling blocks of Bugzilla has been that it is t
-   oo
-      rigid and does not adapt itself well enough to the needs of an
-      organisation.  This has led to organisations making changes to the
-      Bugzilla code that need to be redone each new version of Bugzilla.
-      Bugzilla should attempt to move away from this to a world where thi
-   s
-      doesn't need to occur.
-      Most of the subsections in this section are currently explicit desi
-   gn
-      goals for the "Bugzilla 3" rewrite.  This does not necessarily mean
-      that they will not occur before them in Bugzilla 2, but most are
-      significant undertakings.
-     Field Customisation
-      Many installations wish to customise the fields that appear on bug
-      reports.   Current versions of Bugzilla offer limited
-      customisability.  In particular, some fields can be turned off.
-      However, many administrators wish to add their own fields, and rena
-   me
-      or otherwise modify existing fields.  An architecture that supports
-      this would be extraordinarily useful.
-      Indeed, many fields work similarly and could be abstracted into "fi
-   eld
-      types", so that an administrator need write little or no code to
-      support the new fields they desire.
-      Possible field types include text (eg status whiteboard), numbers,
-      dates (eg report time), accounts (eg reporter, qa, cc), inter-bug
-      relationships (dependencies, duplicates), option groups (platform,
-   os,
-      severity, priority, target milestone, version) etc.
-      Ideally an administrator could configure their fields through a
-      Bugzilla interface that requires no code to be added.  However, it
-   is
-      highly unlikely this ideal will never be met, and in a similar way
-      that office applications have scripting languages, Bugzilla should
-      allow new field types to be written.
-      Similarly, a common desire is for resolutions to be added or remove
-   d.
-       Allocations
-      ?
-       Option Groups
-      ?
-       Relations
-      ?
-     Database Integrity
-      Furthermore, it is desirable for administrators to be able to speci
-   fy
-      rules that must or should apply between the fields on a bug report.
-      For example, you might wish to specify that a bug with status ASSIG
-   NED
-      must have a target milestone field that that is not untargetted.  O
-   r
-      that a bug with a certain number of votes should get ASSIGNED.  Or
-      that the QA contact must be different from the assignee.
-      "Must" relationships could be implemented by refusing to make chang
-   es
-      that violate the relationships, or alternatively, automatically
-      updating certain fields in order to satisfy the criteria.  Which
-      occurs should be up to the administrator.
-      "Should" relationships could be implemented by a combination of
-      emitting warnings on the process bug page, the same on notification
-      mails, or emitting periodic whine mails about the situation.  Again
-   ,
-      which occurs should be up to the administrator.
-      It should also be possible for whine mails to be emitted for "must"
-      relationships, as they might become violated through direct databas
-   e
-      access, Bugzilla bugs, or because they were there before the
-      relationship was enforced.
-      As well as implementing intra-bug constraints, it would be useful t
-   o
-      create inter-bug constraints.  For example, a bug that is dependent
-    on
-      another bug should not have an earlier milestone or greater priorit
-   y
-      than that bug.
-     Database Adaptability
-      Often an administrator desires that fields adapt to the values of
-      other fields.  For example, the value of a field might determine th
-   e
-      possible values of another field or even whether it appears (whethe
-   r
-      it is "applicable").
-      Limited adaptability is present in Bugzilla 2, and only on the
-      "Product" field:
-        * The possible values of the target milestone, version and compon
-   ent
-          fields depend on the product.
-        * UNCONFIRMED can be turned off for specific products.
-        * Voting can be configured differently or turned off for differen
-   t
-          products, and there is a separate user vote limits for each
-          product.
-      It would be good if more adaptability was present, both in terms of
-      all fields relying on the product, as well as the ability to adapt
-      based on the value of all fields.
-      Example ???
-      General adaptability raises the issue of circular references betwee
-   n
-      fields causing problems.  One possible solution to this is to place
-      the fields in a total ordering and require a field refer only to th
-   e
-      previous fields.
-      In Bugzilla 2, changing the product of a bug meant a second page wo
-   uld
-      appear that allowed you to choose a new milestone, component and
-      version, as those fields adapted themselves to the new product.  Th
-   is
-      page could be generalised to support all instances where:
-        * a field value must or might be changed because the possible val
-   ues
-          have changed
-        * is going to drop off because it it is no longer applicable, and
-          this should be confirmed
-        * must be specified because it is suddenly applicable, and the
-          default value, if one exists, might not be acceptable
-     Database Independence
-      Currently Bugzilla only runs on the MySQL database.  It would be
-      desirable for Bugzilla to run on other databases, because:
-        * Organisations may have existing database products they use and
-          would prefer to run a homogenous environment.
-        * Databases each have their own shortcomings, including MySQL.  A
-   n
-          administrator might choose a database that would work better wi
-   th
-          their Bugzilla.
-      This raises the possibility that we could use features that are onl
-   y
-      present in some databases, by appropriately falling back.  For
-      example, in the MySQL world, we live without:
-        * record-level locking, instead we use table-level locking
-        * referential and record constraints, instead we checking code
-        * subselects, instead we use multiple queries and redundant "cach
-   es"
-     Multiple Front Ends
-      Currently Bugzilla is manipulated via the Web, and notifies via
-      E-Mail.  It would be desirable for Bugzilla to easily support vario
-   us
-      front ends.
-      There is no reason that Bugzilla could not be controlled via a whol
-   e
-      range of front ends, including Web, E-Mail, IRC, ICQ, etc, and
-      similarly for how it notifies.  It's also possible that we could
-      introduce a special Bugzilla client that uses its own protocol, for
-      maximum user productivity.
-      Indeed a request reply might be returned via a totally different
-      transport method than was use to submit the request.
-   Internationalisation
-      Bugzilla currently supports only English.  All of the field names,
-      user instructions, etc are written in English.  It would be desirab
-   le
-      to allow "language packs" so Bugzilla can be easily used in
-      non-English speaking locales.
-      To a degree field customisation supports this, because administrato
-   rs
-      could specify their own fields names anyway.  However, there will
-      always be some basic facilities not covered by this, and it is
-      desirable that the administrator's interface also is
-      internationalisable.
-   Better Searching
-     General Summary Reports
-      Sometimes, the normal querying page leaves a lot to be desired.  Th
-   ere
-      are other facilities already in place or which people have asked fo
-   r:
-      Most Doomed Reports - All Bugs or All Bugs In A Product, Categorise
-   d
-      On Assignee, Shows and Counts Number of Bugs For Each Assignee
-      Most Voted For Bugs - All Bugs, Categorised On Product, Shows Top T
-   en
-      Bugs Voters Most Want Fixed
-      Number of Open Bugs For An Assignee - Bug List, Categorised On
-      Developers, Counts Number of Bugs In Category
-      The important thing to realise is that people want categorised repo
-   rts
-      on all sorts of things - a general summary report.
-      In a categorised report, you choose the subset of bugs you wish to
-      operate on (similar to how you would specify a query), and then
-      categorise them on one or more fields.
-      For each category you display the count of the number of things in
-      that category.  You can optionally display the bugs themselves, or
-      leave them out, just showing the counts.  And you can optionally li
-   mit
-      the number of things (bugs or subcategories) that display in each
-      category.
-      Such a mechanism would let you do all of the above and more.
-      Applications of this mechanism would only be recognised once it was
-      implemented.
-     Related Bugs
-      It would be nice to have a field where you could enter other bugs
-      related to the current bug.  It would be handy for navigation and
-      possibly even finding duplicates.
-     Column Specification Support
-      Currently bug lists use the columns that you last used.  This doesn
-   't
-      work well for "prepackaged queries", where you followed a link.  Yo
-   u
-      can probably add a column by specifying a sort column, but this is
-      difficult and suboptimal.
-      Furthermore, I find that when I want to add a column to a bug list,
-      it's usually a one off and I would prefer it to go away for the nex
-   t
-      query.  Hence, it would be nice to specify the columns that appear
-   on
-      the bug list (and general summary report) pages.  The default query
-      mechanism should be able to let you specify your default columns.
-     Advanced Querying Redesign
-      ?
-   Keywords
-      People have a need to apply tags to bugs.  In the beginning, people
-      placed designators in the summary and status whiteboard.  However,
-      these fields were not designed for that, and so there were many fla
-   ws
-      with this system:
-        * They pollute the field with information that was never intended
-    to
-          be present.
-        * Removing them with a bulk change is a difficult problem that ha
-   s
-          too many pitfalls to implement.
-        * You can easily get the capitalisation wrong.
-      Then dependencies were introduced (when?), and people realised that
-      they could use them for "tracking bugs".  Again, dependencies were
-   not
-      designed for that, and so there were more flaws, albeit different
-      ones, including:
-        * They aren't really bugs, so it's difficult to distinguish issue
-   s
-          from bugs.
-        * They can pollute bugs counts, and you must somehow exclude them
-          from queries.
-        * There is a whole lot of useless information on them.  They have
-    an
-          assignee but there is nothing to fix, and that person can get
-          whined at by Bugzilla.  They have target milestones which must
-   be
-          manually maintained.  And so on.
-      Finally, keywords were introduced (when?) for this purpose to remov
-   e
-      the need for these two systems.  Unfortunately, the simple keywords
-      implementation was itself lacking in certain features provided by t
-   he
-      two previous systems, and has remained almost unchanged since its
-      inception.  Furthermore, it could not be forseen that in large
-      installations, the sheer number of keywords could become unwieldly
-   and
-      could lead to a movement back to the other systems.
-      The keywords system was the right idea, however, and it remains so.
-      Fixing the keywords system is one of the most important Bugzilla
-      issues.
-     Bringing Keywords Up To Par
-      For the most part, keywords are very good at what they do.  It is e
-   asy
-      to add and remove them (unlike summary/whiteboard designators), we
-   can
-      simply see what issues are present on a bug (unlike tracking bugs),
-      and we do not confuse bugs with issues (unlike tracking bugs).
-      However, there are still some "regressions" in the keyword system o
-   ver
-      previous systems:
-        * Users wish to view the "dependency forest" of a keyword.  While
-    a
-          dependency tree is of one bug, a dependency forest is of a bug
-          list, and consists of a dependency tree for each member of the
-   bug
-          list.  Users can work around this with tracking bugs by creatin
-   g a
-          tracking bug and viewing the dependency tree of that tracking b
-   ug.
-        * Users wish to specify the keywords that initially apply to a bu
-   g,
-          but instead they must edit the bug once it has already been
-          submitted.  They can work around this with summary designators,
-          since they specify the summary at reporting time.
-        * Users wish to store or share a bug list that contains a keyword
-   s
-          column.  Hence they wish to be able to specify what columns app
-   ear
-          in the bug list URL, as mentioned earlier.  They can work aroun
-   d
-          this using summary designators, since almost all bug lists have
-    a
-          summary column.
-        * Users wish to be able to view keywords on a bug list.  However
-          often they are only interested in a small number of keywords.
-          Having a bug list with a keywords column means that all keyword
-   s
-          will appear on a bug list.  This can take a substantial amount
-   of
-          space where a bug has a lot of keywords, since the table column
-   s
-          in Bugzilla adjust to the largest cell in that column.  Hence
-          users wish to be able to specify which keywords should appear i
-   n
-          the bug list.  In a very real sense, each keyword is a field un
-   to
-          itself.  Users can work around this by using summary designator
-   s,
-          since they keywords will share the space in the summary column.
-        * Users wish to know when bugs with a specific issue are resolved
-   .
-          Hence they wish to be able to receive notifications on all the
-          bugs with a specific keyword.  The introduction a generic watch
-   ing
-          facility (also for things like watching all bugs in a component
-   )
-          would achieve this.  Users can work around this by using tracki
-   ng
-          bugs, as dependencies have an existing way of detecting fixes t
-   o
-          bug a bug was blocked by.
-     Dealing With The Keyword Overload
-      At the time of writing, the mozilla.org installation has approximat
-   ely
-      100 keywords, and many more would be in use if the keywords system
-      didn't have the problems it does.
-      Such a large number of keywords introduces logistical problems:
-        * It must be easy for someone to learn what a keyword means.  If
-   a
-          keyword is buried within a lot of other keywords, it can be
-          difficult to find.
-        * It must be easy to see what keywords are on a bug.  If the numb
-   er
-          of keywords is large, then this can be difficult.
-      These lead some people to feel that there are "too many keywords".
-      These problems are not without solutions however.  It is harder to
-      find a list of designators or tracking bugs than it is a list of
-      keywords.
-      The essential problem is it needs to be easy to find the keywords
-      we're interested in through the mass of keywords.
-       Keyword Applicability
-      As has been previously mentioned, it is desirable for fields to be
-      able to adapt to the values of other fields.  This is certainly tru
-   e
-      for keywords.  Many keywords are simply not relevant because of the
-      bugs product, component, etc.
-      Hence, by introducing keyword applicability, and not displaying
-      keywords that are not relevant to the current bug, or clearly
-      separating them, we can make the keyword overload problem less
-      significant.
-      Currently when you click on "keywords" on a bug, you get a list of
-   all
-      bugs.  It would be desirable to introduce a list of keywords tailor
-   ed
-      to a specific bug, that reports, in order:
-        * the keywords currently on the bug
-        * the keywords not currently on the bug, but applicable to the bu
-   g
-        * optionally, the keywords not applicable to the bug
-      This essentially orders the keywords into three groups, where each
-      group is more important than the previous, and therefore appears
-      closer to the top.
-       Keyword Grouping & Ordering
-      We could further enhance both the global and bug specific keyword l
-   ist
-      by grouping keywords.  We should always have a "flat" view of
-      keywords, but other ways of viewing the keywords would be useful to
-   o.
-      If keyword applicability was implemented, we could group keywords
-      based on their "applicability condition".  Keywords that apply to a
-   ll
-      bugs could be separated from keywords that apply to a specific
-      product, both on the global keyword list and the keyword list of a
-   bug
-      that is in that product.
-      We could specify groups of our own.  For example, many keywords are
-    in
-      a mutually exclusive group, essentially like radio buttons in a use
-   r
-      interface.  This creates a natural grouping, although other groupin
-   gs
-      occur (which depends on your keywords).
-      It is possible that we could use collapsing/expanding operations on
-      "twisties" to only should the groups we are interested in.
-      And instead of grouping keywords, we could order them on some metri
-   c
-      of usefulness, such as:
-        * when the keyword was last added to a bug
-        * how many bugs the keyword is on
-        * how many open bugs the keyword is on
-       Opting Out Of Keywords
-      Not all people are going to care about all keywords.  Therefore it
-      makes sense that you may wish to specify which keywords you are
-      interested in, either on the bug page, or on notifications.
-      Other keywords will therefore not bother users who are not interest
-   ed
-      in them.
-     Keyword Security
-      Currently all keywords are available and editable to all people wit
-   h
-      edit bugs access.  This situation is clearly suboptimal.
-      Although relying on good behaviour for people to not do what they
-      shouldn't works reasonably well on the mozilla.org, it is better to
-      enforce that behaviour - it can be breached through malice, acciden
-   t
-      or ignorance.
-      And in the situation where it is desirable for the presence or abse
-   nce
-      of a keyword not to be revealed, organisations either need to be
-      content with the divulgence, or not use keywords at all.
-      In the situation where they choose to divulge, introducing the abil
-   ity
-      to restrict who can see the keyword would also reduce keyword
-      overload.
-     Personal Keywords
-      Keywords join together a set of bugs which would otherwise be
-      unrelated in the bug system.
-      We allow users to store their own queries.  However we don't allow
-      them to store their own keywords on a bug.  This reduces the
-      usefulness of personal queries, since you cannot join a set of
-      unrelated bugs together in a way that you wish.  Lists of bug numbe
-   rs
-      can work, by they can only be used for small lists, and it is
-      impossible to share a list between multiple queries.
-      Personal keywords are necessary to replace personal tracking bugs,
-   as
-      they would not pollute the keyword space.  Indeed, on many
-      installations this could remove some keywords out of the global
-      keyword space.
-      In a similar vein and with similar effects, group keywords could be
-      introduced that are only available to members of a specific group.
-     Keyword Restrictions
-      Keywords are not islands unto themselves.  Along with their potenti
-   al
-      to be involved in the inter-field relationships mentioned earlier,
-      keywords can also be related to other keywords.
-      Essentially, there are two possibilities:
-        * a set of keywords are mutually exclusive
-        * the presence of a keyword implies another keyword must be prese
-   nt
-      Introduction of the ability to specify these restrictions would hav
-   e
-      benefits.
-      If mutually exclusive keywords were present on a bug, their removal
-      would fix up the database, as well as reducing the number of keywor
-   ds
-      on that bug.
-      In the situation where a keyword implies another keyword, there are
-      two possiblities as to how to handle the situation.
-      The first is automatically add the keyword.  This would fix up the
-      database, but it would increase the number of keywords on a bug.
-      The second is to automatically remove the keyword, and alter querie
-   s
-      so they pick up the first keyword as well as the removed keyword.
-      This would fix up the database and reduce the number of keywords on
-    a
-      bug, but it might confuse users who don't see the keyword.
-      Alternatively, the implied keywords could be listed separately.
-   Notifications
-      Every time a bug gets changed notifications get sent out to people
-      letting them know about what changes have been made.  This is a
-      significant feature, and all sorts of questions can be raised, but
-      they mainly boil down to when they should be sent and what they sho
-   uld
-      look like.
-     Changes You're Interested In
-      As of version 2.12 users can specify what sort of changes they are
-      interested in receiving notifications for.  However, this is still
-      limited.  As yet there is no facility to specify which keywords you
-      care about, and whether you care about changes to fields such as th
-   e
-      QA contact changes.
-      Furthermore, often an unnecessary comment will go along with a chan
-   ge,
-      either because it is required, or the commenter is ignorant of how
-   the
-      new system works.  While explaining why you did something is useful
-   ,
-      merely commenting on what you did is not because that information i
-   s
-      already accessible view "Bug Activity".
-      Because of this unnecessary comment, a lot of changes that would
-      otherwise not generate notifications for certain people do so, beca
-   use
-      few people are willing to turn off comments.  One way to deal with
-      this problem is to allow people to specify that their comments are
-      purely explanatory, and that anyone who is not interested in the
-      change will not be interested in the comment.
-      Furthermore, one possible rationale for unnecessary comments is tha
-   t
-      the bug activity does not display on the normal page and hence it i
-   s
-      difficult to cross reference comments and actions.  Hence, it would
-    be
-      beneficial to be able to do this.
-     Bugs You're Watching
-      Currently to receive a notification about a bug you need to have yo
-   ur
-      name on it.  This is suboptimal because you need to know about a bu
-   g
-      before you can receive notifications on it.  Often you are interest
-   ed
-      in any bug with a field set to a specific value.  For example, you
-      might be interested in all bugs with a specific product, component
-   or
-      keyword.
-      If someone could automatically receive notifications about these bu
-   gs,
-      it would make everyone's lives easier.  Currently the default assig
-   nee
-      and QA contact for a component will automatically receive
-      notifications for
-      Question:  This moves half way to a BCC.
-     Bulk Changes
-      A very useful feature of Bugzilla is the ability to perform an acti
-   on
-      on multiple bugs at once.  However, this means that similar
-      notifications are currently generated for each bug modified.
-      This can result in a torrent of notifications that can annoy.
-      Furthermore, since the bugs are all changed close to each other in
-      time, it is easy for someone to mass delete all the notifications
-      generated by a bulk change and miss an unrelated notification in th
-   e
-      middle.
-      These factors can lead to a tendency for people to delay bulk chang
-   es,
-      or avoid them entirely.  This is suboptimal.
-      It would be better if a bulk change generated only one notification
-      mail.  This would vastly reduce the annoyance factor, and prevent
-      accidental deletion of notifications.
-      One problem with this change is that some people separate out
-      notifications using filtering.  This means that they would no longe
-   r
-      be match parts of a bulk change under different filtering rules.
-      One possibility to resolve this is to allow people to specify group
-   s
-      of bugs.  All bugs within a group would go into the same
-      notification.  The filters could then distinguish the different bug
-      groups.
-      In any case, it is likely there would need to be a transition perio
-   d
-      to allow people to alter their filters.
-   Nominations
-      ?
-   Linking Bugzilla Installations
-      The first example of linking Bugzilla installations together has is
-      the introduction of bug moving in version 2.12.  However, it would
-   be
-      useful to be able to link installations in more ways.
-        * Dependencies and other relationships between bugs in other
-          installations.  This is difficult because dependencies are
-          synchronised on both bugs, so the installation that changes
-          dependencies would need to communicate the new state to the oth
-   er
-          installation.  It would also mean that relationships and
-          notifications that refer to other bugs would need to communicat
-   e
-          with the other installation.
-        * References to bugs in other installations.  Currently if you ty
-   pe
-          "bug XXX" or "bug #XXX" where XXX is a number, you get an
-          automatic hyperlink to that bug.  It would be useful if you cou
-   ld
-          say "YYY bug #XXX" where YYY is the name of another installatio
-   n.
-   Retirement
-      ?
-   Whiny Reports
-      ?
-     Group Redesign
-      ?
-     Hard Wrapping Comments
-      Currently Bugzilla "hard wraps" its comments to a specific line siz
-   e,
-      similar to E-Mail.  This has various problems:
-        * The way it currently works, wrapping is done in the browser at
-          submission time using a non-standard HTML extension not support
-   ed
-          by some (uncommon) browsers.  These browsers generate comments
-          that scroll off the right side of the screen.
-        * Because comments are of fixed width, when you expand your brows
-   er
-          window, the comments do not expand to fit available space.
-      It would be much better to move to a world of soft wrapping, where
-   the
-      browser wraps the text at display time, similar to a world processo
-   r.
-       And as in a word processor, soft wrapping does not preclude the
-      insertion of newlines.
-      Hard wrapping is too entrenched into text E-Mail to fix, but we can
-      fix Bugzilla without causing any problems.  The old content will st
-   ill
-      be wrapped too early, but at least new content will work.
+To see if a CGI supports multiple output formats, grep the CGI for
+"ValidateOutputFormat". If it's not present, adding multiple format support
+isn't too hard - see how it's done in other CGIs.
+
+To make a new format template for a CGI which supports this, open a current
+template for that CGI and take note of the INTERFACE comment (if present.)
+This comment defines what variables are passed into this template. If there
+isn't one, I'm afraid you'll have to read the template and the code to find
+out what information you get.
+
+Write your template in whatever markup or text style is appropriate.
+
+You now need to decide what content type you want your template served as.
+Open up the localconfig file and find the $contenttypes variable. If your
+content type is not there, add it. Remember the three- or four-letter tag
+assigned to you content type. This tag will be part of the template
+filename.
+
+Save the template as <stubname>-<formatname>.<contenttypetag>.tmpl. Try out
+the template by calling the CGI as <cginame>.cgi?format=<formatname> .
      _________________________________________________________________
 
-Chapter 7. Bugzilla Variants and Competitors
+5.7.4. Particular Templates
+
+There are a few templates you may be particularly interested in customising
+for your installation.
+
+index.html.tmpl: This is the Bugzilla front page.
+
+global/header.html.tmpl: This defines the header that goes on all Bugzilla
+pages. The header includes the banner, which is what appears to users and is
+probably what you want to edit instead. However the header also includes the
+HTML HEAD section, so you could for example add a stylesheet or META tag by
+editing the header.
+
+global/banner.html.tmpl: This contains the "banner", the part of the header
+that appears at the top of all Bugzilla pages. The default banner is
+reasonably barren, so you'll probably want to customise this to give your
+installation a distinctive look and feel. It is recommended you preserve the
+Bugzilla version number in some form so the version you are running can be
+determined, and users know what docs to read.
+
+global/footer.html.tmpl: This defines the footer that goes on all Bugzilla
+pages. Editing this is another way to quickly get a distinctive look and
+feel for your Bugzilla installation.
+
+bug/create/user-message.html.tmpl: This is a message that appears near the
+top of the bug reporting page. By modifying this, you can tell your users
+how they should report bugs.
+
+bug/create/create.html.tmpl and bug/create/comment.txt.tmpl: You may wish to
+get bug submitters to give certain bits of structured information, each in a
+separate input widget, for which there is not a field in the database. The
+bug entry system has been designed in an extensible fashion to enable you to
+define arbitrary fields and widgets, and have their values appear formatted
+in the initial Description, rather than in database fields. An example of
+this is the mozilla.org guided bug submission form.
+
+To make this work, create a custom template for enter_bug.cgi (the default
+template, on which you could base it, is create.html.tmpl), and either call
+it create.html.tmpl or use a format and call it
+create-<formatname>.html.tmpl. Put it in the custom/bug/create directory. In
+it, add widgets for each piece of information you'd like collected - such as
+a build number, or set of steps to reproduce.
+
+Then, create a template like custom/bug/create/comment.txt.tmpl, also named
+after your format if you are using one, which references the form fields you
+have created. When a bug report is submitted, the initial comment attached
+to the bug report will be formatted according to the layout of this
+template.
 
-   I created this section to answer questions about Bugzilla competitors
-   and variants, then found a wonderful site which covers an awful lot of
-   what I wanted to discuss. Rather than quote it in its entirety, I'll
-   simply refer you here: http://linas.org/linux/pm.html
-     _________________________________________________________________
+For example, if your enter_bug template had a field
 
-7.1. Red Hat Bugzilla
+<input type="text" name="buildid" size="30">
 
-   Red Hat Bugzilla is probably the most popular Bugzilla variant on the
-   planet. One of the major benefits of Red Hat Bugzilla is the ability
-   to work with Oracle, MySQL, and PostGreSQL databases serving as the
-   back-end, instead of just MySQL. Dave Lawrence has worked very hard to
-   keep Red Hat Bugzilla up-to-date, and many people prefer the
-   snappier-looking page layout of Red Hat Bugzilla to the default
-   Mozilla-standard formatting.
+and then your comment.txt.tmpl had
 
-   URL: http://bugzilla.redhat.com/bugzilla/
-     _________________________________________________________________
+   BuildID: [% form.buildid %]
 
-7.2. Loki Bugzilla (Fenris)
+   then
+   BuildID: 20020303
 
-   Fenris can be found at http://fenris.lokigames.com. It is a fork from
-   Bugzilla.
+   would appear in the initial checkin comment.
+     _________________________________________________________________
+
+5.8. Upgrading to New Releases
+
+A plain Bugzilla is fairly easy to upgrade from one version to a newer one.
+Always read the release notes to see if there are any issues that you might
+need to take note of. It is recommended that you take a backup of your
+database and your entire Bugzilla installation before attempting an upgrade.
+You can upgrade a 'clean' installation by untarring a new tarball over the
+old installation. If you are upgrading from 2.12 or later, and have cvs
+installed, you can type cvs -z3 update, and resolve conflicts if there are
+any.
+
+However, things get a bit more complicated if you've made changes to
+Bugzilla's code. In this case, you may have to re-make or reapply those
+changes. One good method is to take a diff of your customised version
+against the original, so you can survey all that you've changed. Hopefully,
+templatisation will reduce the need for this in the future.
+
+From version 2.8 onwards, Bugzilla databases can be automatically carried
+forward during an upgrade. However, because the developers of Bugzilla are
+constantly adding new tables, columns and fields, you'll probably get SQL
+errors if you just update the code and attempt to use Bugzilla. Always run
+the checksetup.pl script whenever you upgrade your installation.
+
+If you are running Bugzilla version 2.8 or lower, and wish to upgrade to the
+latest version, please consult the file, "UPGRADING-pre-2.8" in the Bugzilla
+root directory after untarring the archive.
      _________________________________________________________________
 
-7.3. Issuezilla
+5.9. Integrating Bugzilla with Third-Party Tools
 
-   Issuezilla is another fork from Bugzilla, and seems nearly as popular
-   as the Red Hat Bugzilla fork. Some Issuezilla team members are regular
-   contributors to the Bugzilla mailing list/newsgroup. Issuezilla is not
-   the primary focus of bug-tracking at tigris.org, however. Their
-   Java-based bug-tracker, Scarab, a newfangled Java-based issue tracker,
-   is under heavy development and looks promising!
+5.9.1. Bonsai
 
-   URL: http://issuezilla.tigris.org/servlets/ProjectHome
+Bonsai is a web-based tool for managing CVS, the Concurrent Versioning
+System . Using Bonsai, administrators can control open/closed status of
+trees, query a fast relational database back-end for change, branch, and
+comment information, and view changes made since the last time the tree was
+closed. Bonsai also integrates with Tinderbox, the Mozilla automated build
+management system.
      _________________________________________________________________
 
-7.4. Scarab
+5.9.2. CVS
+
+CVS integration is best accomplished, at this point, using the Bugzilla
+Email Gateway.
 
-   Scarab is a promising new bug-tracking system built using Java Serlet
-   technology. As of this writing, no source code has been released as a
-   package, but you can obtain the code from CVS.
+Follow the instructions in this Guide for enabling Bugzilla e-mail
+integration. Ensure that your check-in script sends an email to your
+Bugzilla e-mail gateway with the subject of "[Bug XXXX]", and you can have
+CVS check-in comments append to your Bugzilla bug. If you have your check-in
+script include an @resolution field, you can even change the Bugzilla bug
+state.
 
-   URL: http://scarab.tigris.org
+There is also a CVSZilla project, based upon somewhat dated Bugzilla code,
+to integrate CVS and Bugzilla through CVS' ability to email. Check it out
+at: http://homepages.kcbbs.gen.nz/~tonyg/.
      _________________________________________________________________
 
-7.5. Perforce SCM
+5.9.3. Perforce SCM
 
-   Although Perforce isn't really a bug tracker, it can be used as such
-   through the "jobs" functionality.
+You can find the project page for Bugzilla and Teamtrack Perforce
+integration (p4dti) at: http://www.ravenbrook.com/project/p4dti . "p4dti" is
+now an officially supported product from Perforce, and you can find the
+"Perforce Public Depot" p4dti page at
+http://public.perforce.com/public/perforce/p4dti/index.html .
 
-   http://www.perforce.com/perforce/technotes/note052.htmlhttp://www.perf
-   orce.com/perforce/technotes/note052.html
+Integration of Perforce with Bugzilla, once patches are applied, is
+seamless. Perforce replication information will appear below the comments of
+each bug. Be certain you have a matching set of patches for the Bugzilla
+version you are installing. p4dti is designed to support multiple defect
+trackers, and maintains its own documentation for it. Please consult the
+pages linked above for further information.
      _________________________________________________________________
 
-7.6. SourceForge
+5.9.4. Tinderbox/Tinderbox2
 
-   SourceForge is more of a way of coordinating geographically
-   distributed free software and open source projects over the Internet
-   than strictly a bug tracker, but if you're hunting for bug-tracking
-   for your open project, it may be just what the software engineer
-   ordered!
-
-   URL: http://www.sourceforge.net
+We need Tinderbox integration information.
      _________________________________________________________________
 
 Appendix A. The Bugzilla FAQ
 
+This FAQ includes questions not covered elsewhere in the Guide.
+
    1. General Questions
 
         A.1.1. Where can I find information about Bugzilla?
-        A.1.2. What license is Bugzilla distributed under?
-        A.1.3. How do I get commercial support for Bugzilla?
+        A.1.2. What license is Bugzilla distributed under? 
+        A.1.3. How do I get commercial support for Bugzilla? 
         A.1.4. What major companies or projects are currently using
-                Bugzilla for bug-tracking?
+                Bugzilla for bug-tracking? 
 
-        A.1.5. Who maintains Bugzilla?
+        A.1.5. Who maintains Bugzilla? 
         A.1.6. How does Bugzilla stack up against other bug-tracking
-                databases?
+                databases? 
 
-        A.1.7. How do I change my user name in Bugzilla?
-        A.1.8. Why doesn't Bugzilla offer this or that feature or
-                compatability with this other tracking software?
+        A.1.7. Why doesn't Bugzilla offer this or that feature or
+                compatability with this other tracking software? 
 
-        A.1.9. Why MySQL? I'm interested in seeing Bugzilla run on
-                Oracle/Sybase/Msql/PostgreSQL/MSSQL?
+        A.1.8. Why MySQL? I'm interested in seeing Bugzilla run on
+                Oracle/Sybase/Msql/PostgreSQL/MSSQL. 
 
-        A.1.10. Why do the scripts say "/usr/bonsaitools/bin/perl"
-                instead of "/usr/bin/perl" or something else?
+        A.1.9. Why do the scripts say "/usr/bonsaitools/bin/perl" instead
+                of "/usr/bin/perl" or something else? 
 
-   2. Red Hat Bugzilla
+        A.1.10. Is there an easy way to change the Bugzilla cookie name? 
 
-        A.2.1. What about Red Hat Bugzilla?
-        A.2.2. What are the primary benefits of Red Hat Bugzilla?
-        A.2.3. What's the current status of Red Hat Bugzilla?
+   2. Managerial Questions
 
-   3. Loki Bugzilla (AKA Fenris)
+        A.2.1. Is Bugzilla web-based, or do you have to have specific
+                software or a specific operating system on your machine? 
 
-        A.3.1. What is Loki Bugzilla (Fenris)?
-
-   4. Pointy-Haired-Boss Questions
-
-        A.4.1. Is Bugzilla web-based or do you have to have specific
-                software or specific operating system on your machine?
-
-        A.4.2. Has anyone you know of already done any Bugzilla
-                integration with Perforce (SCM software)?
-
-        A.4.3. Does Bugzilla allow the user to track multiple projects?
-        A.4.4. If I am on many projects, and search for all bugs assigned
+        A.2.2. Can Bugzilla integrate with Perforce (SCM software)? 
+        A.2.3. Does Bugzilla allow the user to track multiple projects? 
+        A.2.4. If I am on many projects, and search for all bugs assigned
                 to me, will Bugzilla list them for me and allow me to
-                sort by project, severity etc?
+                sort by project, severity etc? 
 
-        A.4.5. Does Bugzilla allow attachments (text, screenshots, urls
-                etc)? If yes, are there any that are NOT allowed?
+        A.2.5. Does Bugzilla allow attachments (text, screenshots, URLs
+                etc)? If yes, are there any that are NOT allowed? 
 
-        A.4.6. Does Bugzilla allow us to define our own priorities and
+        A.2.6. Does Bugzilla allow us to define our own priorities and
                 levels? Do we have complete freedom to change the labels
                 of fields and format of them, and the choice of
-                acceptable values?
+                acceptable values? 
 
-        A.4.7. The index.html page doesn't show the footer. It's really
-                annoying to have to go to the querypage just to check my
-                "my bugs" link. How do I get a footer on static HTML
-                pages?
-
-        A.4.8. Does Bugzilla provide any reporting features, metrics,
+        A.2.7. Does Bugzilla provide any reporting features, metrics,
                 graphs, etc? You know, the type of stuff that management
-                likes to see. :)
-
-        A.4.9. Is there email notification and if so, what do you see
-                when you get an email? Do you see bug number and title or
-                is it only the number?
+                likes to see. :) 
 
-        A.4.10. Can email notification be set up to send to multiple
-                people, some on the To List, CC List, BCC List etc?
+        A.2.8. Is there email notification and if so, what do you see
+                when you get an email? 
 
-        A.4.11. If there is email notification, do users have to have any
-                particular type of email application?
+        A.2.9. Can email notification be set up to send to multiple
+                people, some on the To List, CC List, BCC List etc? 
 
-        A.4.12. If I just wanted to track certain bugs, as they go
-                through life, can I set it up to alert me via email
-                whenever that bug changes, whether it be owner, status or
-                description etc.?
+        A.2.10. Do users have to have any particular type of email
+                application? 
 
-        A.4.13. Does Bugzilla allow data to be imported and exported? If
+        A.2.11. Does Bugzilla allow data to be imported and exported? If
                 I had outsiders write up a bug report using a MS Word bug
                 template, could that template be imported into "matching"
                 fields? If I wanted to take the results of a query and
-                export that data to MS Excel, could I do that?
-
-        A.4.14. Has anyone converted Bugzilla to another language to be
-                used in other countries? Is it localizable?
-
-        A.4.15. Can a user create and save reports? Can they do this in
-                Word format? Excel format?
+                export that data to MS Excel, could I do that? 
 
-        A.4.16. Can a user re-run a report with a new project, same
-                query?
+        A.2.12. Has anyone converted Bugzilla to another language to be
+                used in other countries? Is it localizable? 
 
-        A.4.17. Can a user modify an existing report and then save it
-                into another name?
+        A.2.13. Can a user create and save reports? Can they do this in
+                Word format? Excel format? 
 
-        A.4.18. Does Bugzilla have the ability to search by word, phrase,
-                compound search?
+        A.2.14. Does Bugzilla have the ability to search by word, phrase,
+                compound search? 
 
-        A.4.19. Can the admin person establish separate group and
-                individual user privileges?
-
-        A.4.20. Does Bugzilla provide record locking when there is
+        A.2.15. Does Bugzilla provide record locking when there is
                 simultaneous access to the same bug? Does the second
                 person get a notice that the bug is in use or how are
-                they notified?
-
-        A.4.21. Are there any backup features provided?
-        A.4.22. Can users be on the system while a backup is in progress?
+                they notified? 
 
-        A.4.23. What type of human resources are needed to be on staff to
+        A.2.16. Are there any backup features provided? 
+        A.2.17. Can users be on the system while a backup is in progress?
+                
+        A.2.18. What type of human resources are needed to be on staff to
                 install and maintain Bugzilla? Specifically, what type of
                 skills does the person need to have? I need to find out
                 if we were to go with Bugzilla, what types of individuals
                 would we need to hire and how much would that cost vs
-                buying an "Out-of-the-Box" solution.
+                buying an "Out-of-the-Box" solution. 
 
-        A.4.24. What time frame are we looking at if we decide to hire
+        A.2.19. What time frame are we looking at if we decide to hire
                 people to install and maintain the Bugzilla? Is this
                 something that takes hours or weeks to install and a
                 couple of hours per week to maintain and customize or is
                 this a multi-week install process, plus a full time job
-                for 1 person, 2 people, etc?
+                for 1 person, 2 people, etc? 
 
-        A.4.25. Is there any licensing fee or other fees for using
+        A.2.20. Is there any licensing fee or other fees for using
                 Bugzilla? Any out-of-pocket cost other than the bodies
-                needed as identified above?
-
-   5. Bugzilla Installation
-
-        A.5.1. How do I download and install Bugzilla?
-        A.5.2. How do I install Bugzilla on Windows NT?
-        A.5.3. Is there an easy way to change the Bugzilla cookie name?
+                needed as identified above? 
 
-   6. Bugzilla Security
+   3. Bugzilla Security
 
-        A.6.1. How do I completely disable MySQL security if it's giving
+        A.3.1. How do I completely disable MySQL security if it's giving
                 me problems (I've followed the instructions in the
-                installation section of this guide!)?
+                installation section of this guide)? 
 
-        A.6.2. Are there any security problems with Bugzilla?
-        A.6.3. I've implemented the security fixes mentioned in Chris
+        A.3.2. Are there any security problems with Bugzilla? 
+        A.3.3. I've implemented the security fixes mentioned in Chris
                 Yeh's security advisory of 5/10/2000 advising not to run
                 MySQL as root, and am running into problems with MySQL no
-                longer working correctly.
-
-   7. Bugzilla Email
-
-        A.7.1. I have a user who doesn't want to receive any more email
-                from Bugzilla. How do I stop it entirely for this user?
-
-        A.7.2. I'm evaluating/testing Bugzilla, and don't want it to send
-                email to anyone but me. How do I do it?
-
-        A.7.3. I want whineatnews.pl to whine at something more, or other
-                than, only new bugs. How do I do it?
+                longer working correctly. 
 
-        A.7.4. I don't like/want to use Procmail to hand mail off to
-                bug_email.pl. What alternatives do I have?
+   4. Bugzilla Email
 
-        A.7.5. How do I set up the email interface to submit/change bugs
-                via email?
+        A.4.1. I have a user who doesn't want to receive any more email
+                from Bugzilla. How do I stop it entirely for this user? 
 
-        A.7.6. Email takes FOREVER to reach me from bugzilla -- it's
-                extremely slow. What gives?
+        A.4.2. I'm evaluating/testing Bugzilla, and don't want it to send
+                email to anyone but me. How do I do it? 
 
-        A.7.7. How come email never reaches me from bugzilla changes?
+        A.4.3. I want whineatnews.pl to whine at something more, or other
+                than, only new bugs. How do I do it? 
 
-   8. Bugzilla Database
+        A.4.4. I don't like/want to use Procmail to hand mail off to
+                bug_email.pl. What alternatives do I have? 
 
-        A.8.1. I've heard Bugzilla can be used with Oracle?
-        A.8.2. Bugs are missing from queries, but exist in the database
-                (and I can pull them up by specifying the bug ID). What's
-                wrong?
+        A.4.5. How do I set up the email interface to submit/change bugs
+                via email? 
 
-        A.8.3. I think my database might be corrupted, or contain invalid
-                entries. What do I do?
+        A.4.6. Email takes FOREVER to reach me from Bugzilla -- it's
+                extremely slow. What gives? 
 
-        A.8.4. I want to manually edit some entries in my database. How?
-        A.8.5. I try to add myself as a user, but Bugzilla always tells
-                me my password is wrong.
+        A.4.7. How come email from Bugzilla changes never reaches me? 
 
-        A.8.6. I think I've set up MySQL permissions correctly, but
-                bugzilla still can't connect.
+   5. Bugzilla Database
 
-        A.8.7. How do I synchronize bug information among multiple
-                different Bugzilla databases?
+        A.5.1. I've heard Bugzilla can be used with Oracle? 
+        A.5.2. I think my database might be corrupted, or contain invalid
+                entries. What do I do? 
 
-        A.8.8. Why do I get bizarre errors when trying to submit data,
-                particularly problems with "groupset"?
+        A.5.3. I want to manually edit some entries in my database. How? 
+        A.5.4. I try to add myself as a user, but Bugzilla always tells
+                me my password is wrong. 
 
-        A.8.9. How come even after I delete bugs, the long descriptions
-                show up?
+        A.5.5. I think I've set up MySQL permissions correctly, but
+                Bugzilla still can't connect. 
 
-   9. Bugzilla and Win32
+        A.5.6. How do I synchronize bug information among multiple
+                different Bugzilla databases? 
 
-        A.9.1. What is the easiest way to run Bugzilla on Win32
-                (Win98+/NT/2K)?
+   6. Bugzilla and Win32
 
-        A.9.2. Is there a "Bundle::Bugzilla" equivalent for Win32?
-        A.9.3. CGI's are failing with a "something.cgi is not a valid
-                Windows NT application" error. Why?
+        A.6.1. What is the easiest way to run Bugzilla on Win32
+                (Win98+/NT/2K)? 
 
-        A.9.4. Can I have some general instructions on how to make
-                Bugzilla on Win32 work?
+        A.6.2. Is there a "Bundle::Bugzilla" equivalent for Win32? 
+        A.6.3. CGI's are failing with a "something.cgi is not a valid
+                Windows NT application" error. Why? 
 
-        A.9.5. I'm having trouble with the perl modules for NT not being
-                able to talk to to the database.
+        A.6.4. I'm having trouble with the perl modules for NT not being
+                able to talk to to the database. 
 
-   10. Bugzilla Usage
+   7. Bugzilla Usage
 
-        A.10.1. The query page is very confusing. Isn't there a simpler
-                way to query?
+        A.7.1. How do I change my user name (email address) in Bugzilla? 
+        A.7.2. The query page is very confusing. Isn't there a simpler
+                way to query? 
 
-        A.10.2. I'm confused by the behavior of the "accept" button in
-                the Show Bug form. Why doesn't it assign the bug to me
-                when I accept it?
+        A.7.3. I'm confused by the behavior of the "accept" button in the
+                Show Bug form. Why doesn't it assign the bug to me when I
+                accept it? 
 
-        A.10.3. I can't upload anything into the database via the "Create
-                Attachment" link. What am I doing wrong?
+        A.7.4. I can't upload anything into the database via the "Create
+                Attachment" link. What am I doing wrong? 
 
-        A.10.4. Email submissions to Bugzilla that have attachments end
-                up asking me to save it as a "cgi" file.
+        A.7.5. Email submissions to Bugzilla that have attachments end up
+                asking me to save it as a "cgi" file. 
 
-        A.10.5. How do I change a keyword in Bugzilla, once some bugs are
-                using it?
+        A.7.6. How do I change a keyword in Bugzilla, once some bugs are
+                using it? 
 
-   11. Bugzilla Hacking
+   8. Bugzilla Hacking
 
-        A.11.1. What bugs are in Bugzilla right now?
-        A.11.2. How can I change the default priority to a null value?
-                For instance, have the default priority be "---" instead
-                of "P2"?
+        A.8.1. What bugs are in Bugzilla right now? 
+        A.8.2. How can I change the default priority to a null value? For
+                instance, have the default priority be "---" instead of
+                "P2"? 
 
-        A.11.3. What's the best way to submit patches? What guidelines
-                should I follow?
+        A.8.3. What's the best way to submit patches? What guidelines
+                should I follow? 
 
 1. General Questions
 
    A.1.1. Where can I find information about Bugzilla?
 
    You can stay up-to-date with the latest Bugzilla information at
-   http://www.mozilla.org/projects/bugzilla/
+   http://www.bugzilla.org/
 
    A.1.2. What license is Bugzilla distributed under?
 
@@ -4138,9 +3029,9 @@ Appendix A. The Bugzilla FAQ
    and generally aren't interested in small projects.
 
    There are several experienced Bugzilla hackers on the mailing
-   list/newsgroup who are willing to whore themselves out for generous
-   compensation. Try sending a message to the mailing list asking for a
-   volunteer.
+   list/newsgroup who are willing to make themselves available for
+   generous compensation. Try sending a message to the mailing list
+   asking for a volunteer.
 
    A.1.4. What major companies or projects are currently using Bugzilla
    for bug-tracking?
@@ -4150,12 +3041,11 @@ Appendix A. The Bugzilla FAQ
 
    Netscape/AOL
    Mozilla.org
+   NASA
    AtHome Corporation
    Red Hat Software
-   Loki Entertainment Software
    SuSe Corp
    The Horde Project
-   The Eazel Project
    AbiSource
    Real Time Enterprises, Inc
    Eggheads.org
@@ -4164,6 +3054,7 @@ Appendix A. The Bugzilla FAQ
    Creative Labs (makers of SoundBlaster)
    The Apache Foundation
    The Gnome Foundation
+   Ximian
    Linux-Mandrake
 
    Suffice to say, there are more than enough huge projects using
@@ -4171,31 +3062,25 @@ Appendix A. The Bugzilla FAQ
 
    A.1.5. Who maintains Bugzilla?
 
-   Bugzilla maintenance has been in a state of flux recently. Please
-   check the Bugzilla Project Page for the latest details.
+   A core team, led by Dave Miller (justdave@syndicomm.com).
 
    A.1.6. How does Bugzilla stack up against other bug-tracking
    databases?
 
-   A year has gone by, and I still can't find any head-to-head
-   comparisons of Bugzilla against other defect-tracking software.
-   However, from my personal experience with other bug-trackers, Bugzilla
-   offers superior performance on commodity hardware, better price
-   (free!), more developer- friendly features (such as stored queries,
-   email integration, and platform independence), improved scalability,
-   open source code, greater flexibility, and superior ease-of-use.
+   We can't find any head-to-head comparisons of Bugzilla against other
+   defect-tracking software. If you know of one, please get in touch.
+   However, from the author's personal experience with other
+   bug-trackers, Bugzilla offers superior performance on commodity
+   hardware, better price (free!), more developer- friendly features
+   (such as stored queries, email integration, and platform
+   independence), improved scalability, open source code, greater
+   flexibility, and superior ease-of-use.
 
    If you happen to be a commercial bug-tracker vendor, please step
-   forward with a rebuttal so I can include it in the FAQ. We're not in
-   pursuit of Bugzilla ueber alles; we simply love having a powerful,
-   open-source tool to get our jobs done.
+   forward with a list of advantages your product has over Bugzilla. We'd
+   be happy to include it in the "Competitors" section.
 
-   A.1.7. How do I change my user name in Bugzilla?
-
-   You can't. However, the administrative account can, by simply opening
-   your user account in editusers.cgi and changing the login name.
-
-   A.1.8. Why doesn't Bugzilla offer this or that feature or
+   A.1.7. Why doesn't Bugzilla offer this or that feature or
    compatability with this other tracking software?
 
    It may be that the support has not been built yet, or that you have
@@ -4210,266 +3095,66 @@ Appendix A. The Bugzilla FAQ
    Enhancement" (RFE) using the bug submission interface at
    bugzilla.mozilla.org.
 
-   A.1.9. Why MySQL? I'm interested in seeing Bugzilla run on
-   Oracle/Sybase/Msql/PostgreSQL/MSSQL?
-
-   Terry Weissman answers,
-
-     You're not the only one. But I am not very interested. I'm not a
-     real SQL or database person. I just wanted to make a useful tool,
-     and build it on top of free software. So, I picked MySQL, and
-     learned SQL by staring at the MySQL manual and some code lying
-     around here, and wrote Bugzilla. I didn't know that Enum's were
-     non-standard SQL. I'm not sure if I would have cared, but I didn't
-     even know. So, to me, things are "portable" because it uses MySQL,
-     and MySQL is portable enough. I fully understand (now) that people
-     want to be portable to other databases, but that's never been a
-     real concern of mine.
+   A.1.8. Why MySQL? I'm interested in seeing Bugzilla run on
+   Oracle/Sybase/Msql/PostgreSQL/MSSQL.
 
-   Things aren't quite that grim these days, however. Terry pretty much
-   sums up much of the thinking many of us have for Bugzilla, but there
-   is light on the horizon for database-independence! Here are some
-   options:
+   There is DB-independence work afoot. PostgreSQL support is planned for
+   2.18, and full DB-independence can't be far further on.
 
-   Red Hat Bugzilla: Runs a modified Bugzilla 2.8 atop an Oracle
-   database.
-   Interzilla: A project to run Bugzilla on Interbase. No code released
-   yet, however.
-   Bugzilla 3.0: One of the primary stated goals is multiple database
-   support.
-
-   A.1.10. Why do the scripts say "/usr/bonsaitools/bin/perl" instead of
+   A.1.9. Why do the scripts say "/usr/bonsaitools/bin/perl" instead of
    "/usr/bin/perl" or something else?
 
-   Mozilla.org uses /usr/bonsaitools/bin/perl. The prime rule in making
-   submissions is "don't break bugzilla.mozilla.org". If it breaks it,
-   your patch will be reverted faster than you can do a diff.
-
-   Here's Terry Weissman's comment, for some historical context:
-
-     [This was] purely my own convention. I wanted a place to put a
-     version of Perl and other tools that was strictly under my control
-     for the various webtools, and not subject to anyone else. Edit it
-     to point to whatever you like.
-
-   Note
+   Mozilla.org uses /usr/bonsaitools/bin/perl, because originally Terry
+   wanted a place to put a version of Perl and other tools that was
+   strictly under his control.
 
    We always recommend that, if possible, you keep the path as
-   /usr/bonsaitools/bin/perl, and simply add a /usr/bonsaitools and
-   /usr/bonsaitools/bin directory, then symlink your version of perl to
-   /usr/bonsaitools/bin/perl. This will make upgrading your Bugzilla much
-   easier in the future.
-
-   Obviously, if you do not have root access to your Bugzilla box, our
-   suggestion is irrelevant.
-
-2. Red Hat Bugzilla
+   /usr/bonsaitools/bin/perl, and simply add symlink. This will make
+   upgrading your Bugzilla much easier in the future.
 
-   Note
-
-   This section is no longer up-to-date. Please see the section on "Red
-   Hat Bugzilla" under "Variants" in The Bugzilla Guide.
-
-   A.2.1. What about Red Hat Bugzilla?
-
-   Red Hat Bugzilla is arguably more user-friendly, customizable, and
-   scalable than stock Bugzilla. Check it out at
-   http://bugzilla.redhat.com and the sources at
-   ftp://people.redhat.com/dkl/. They've set their Bugzilla up to work
-   with Oracle out of the box. Note that Redhat Bugzilla is based upon
-   the 2.8 Bugzilla tree; Bugzilla has made some tremendous advances
-   since the 2.8 release. Why not download both Bugzillas to check out
-   the differences for yourself?
-
-   Dave Lawrence, the original Red Hat Bugzilla maintainer, mentions:
-
-     Somebody needs to take the ball and run with it. I'm the only
-     maintainer and am very pressed for time.
-
-   If you, or someone you know, has the time and expertise to do the
-   integration work so main-tree Bugzilla 2.12 and higher integrates the
-   Red Hat Bugzilla Oracle modifications, please donate your time to
-   supporting the Bugzilla project.
-
-   A.2.2. What are the primary benefits of Red Hat Bugzilla?
-
-   Dave Lawrence:
-
-     For the record, we are not using any template type implementation
-     for the cosmetic changes maded to Bugzilla. It is just alot of html
-     changes in the code itself. I admit I may have gotten a little
-     carried away with it but the corporate types asked for a more
-     standardized interface to match up with other projects relating to
-     Red Hat web sites. A lot of other web based internal tools I am
-     working on also look like Bugzilla.
-
-     I do want to land the changes that I have made to Bugzilla but I
-     may have to back out a good deal and make a different version of
-     Red Hat's Bugzilla for checking in to CVS. Especially the cosmetic
-     changes because it seems they may not fit the general public. I
-     will do that as soon as I can. I also still do my regular QA
-     responsibilities along with Bugzilla so time is difficult sometimes
-     to come by.
-
-     There are also a good deal of other changes that were requested by
-     management for things like support contracts and different
-     permission groups for making bugs private. Here is a short list of
-     the major changes that have been made:
-
-    1. No enum types. All old enum types are now separate smaller tables.
-    2. No bit wise operations. Not all databases support this so they
-       were changed to a more generic way of doing this task
-    3. Bug reports can only be altered by the reporter, assignee, or a
-       privileged bugzilla user. The rest of the world can see the bug
-       but in a non-changeable format (unless the bug has been marked
-       private). They can however add comments, add and remove themselves
-       from the CC list
-    4. Different group scheme. Each group has an id number related to it.
-       There is a user_group table which contains userid to groupid
-       mappings to determine which groups each user belongs to.
-       Additionally there is a bug_group table that has bugid to groupid
-       mappings to show which groups can see a particular bug. If there
-       are no entries for a bug in this table then the bug is public.
-    5. Product groups. product_table created to only allow certain
-       products to be visible for certain groups in both bug entry and
-       query. This was particulary helpful for support contracts.
-    6. Of course many (too many) changes to Bugzilla code itself to allow
-       use with Oracle and still allow operation with Mysql if so
-       desired. Currently if you use Mysql it is set to use Mysql's old
-       permission scheme to keep breakage to a minimum. Hopefully one day
-       this will standardize on one style which may of course be
-       something completely different.
-    7. Uses Text::Template perl module for rendering of the dynamic HTML
-       pages such as enter_bug.cgi, query.cgi, bug_form.pl, and for the
-       header and footer parts of the page. This allows the html to be
-       separate from the perl code for customizing the look and feel of
-       the page to one's preference.
-    8. There are many other smaller changes. There is also a port to
-       Oracle that I have been working on as time permits but is not
-       completely finished but somewhat usable. I will merge it into our
-       standard code base when it becomes production quality.
-       Unfortunately there will have to be some conditionals in the code
-       to make it work with other than Oracle due to some differences
-       between Oracle and Mysql.
-
-     Both the Mysql and Oracle versions of our current code base are
-     available from ftp://people.redhat.com/dkl. If Terry/Tara wants I
-     can submit patch files for all of the changes I have made and he
-     can determine what is suitable for addition to the main bugzilla
-     cade base. But for me to commit changes to the actual CVS I will
-     need to back out alot of things that are not suitable for the rest
-     of the Bugzilla community. I am open to suggestions.
-
-   A.2.3. What's the current status of Red Hat Bugzilla?
+   A.1.10. Is there an easy way to change the Bugzilla cookie name?
 
-   Note
+   At present, no.
 
-   This information is somewhat dated; I last updated it 7 June 2000.
-   Please see the "Variants" section of "The Bugzilla Guide" for more
-   up-to-date information regarding Red Hat Bugzilla.
-   Dave Lawrence:
-
-     I suppose the current thread warrants an update on the status of
-     Oracle and bugzilla ;) We have now been running Bugzilla 2.8 on
-     Oracle for the last two days in our production environment. I tried
-     to do as much testing as possible with it before going live which
-     is some of the reason for the long delay. I did not get enough
-     feedback as I would have liked from internal developers to help
-     weed out any bugs still left so I said "Fine, i will take it live
-     and then I will get the feedback I want :)" So it is now starting
-     to stabilize and it running quite well after working feverishly the
-     last two days fixing problems as soon as they came in from the
-     outside world. The current branch in cvs is up2date if anyone would
-     like to grab it and try it out. The oracle _setup.pl is broken
-     right now due to some last minute changes but I will update that
-     soon. Therefore you would probably need to create the database
-     tables the old fashioned way using the supplied sql creation
-     scripts located in the ./oracle directory. We have heavy
-     optimizations in the database it self thanks to the in-house DBA
-     here at Red Hat so it is running quite fast. The database itself is
-     located on a dual PII450 with 1GB ram and 14 high voltage
-     differential raided scsi drives. The tables and indexes are
-     partitioned in 4 chuncks across the raided drive which is nice
-     because when ever you need to do a full table scan, it is actually
-     starting in 4 different locations on 4 different drives
-     simultaneously. And the indexes of course are on separate drives
-     from the data so that speeds things up tremendously. When I can
-     find the time I will document all that we have done to get this
-     thing going to help others that may need it.
-
-     As Matt has mentioned it is still using out-dated code and with a
-     little help I would like to bring everything up to date for
-     eventual incorporation with the main cvs tree. Due to other duties
-     I have with the company any help with this wiould be appreciated.
-     What we are using now is what I call a best first effort. It
-     definitely can be improved on and may even need complete rewrites
-     in a lot of areas. A lot of changes may have to be made in the way
-     Bugzilla does things currently to make this transition to a more
-     generic database interface. Fortunately when making the Oracle
-     changes I made sure I didn't do anything that I would consider
-     Oracle specific and could not be easily done with other databases.
-     Alot of the sql statements need to be broken up into smaller
-     utilities that themselves would need to make decisions on what
-     database they are using but the majority of the code can be made
-     database neutral.
-
-3. Loki Bugzilla (AKA Fenris)
-
-   A.3.1. What is Loki Bugzilla (Fenris)?
-
-   Loki Games has a customized version of Bugzilla available at
-   http://fenris.lokigames.com. There are some advantages to using
-   Fenris, chief being separation of comments based upon user privacy
-   level, data hiding, forced login for any data retrieval, and some
-   additional fields. Loki has mainted their code, originally a fork from
-   the Bugzilla 2.8 code base, and it is quite a bit different than stock
-   Bugzilla at this point. I recommend you stick with official Bugzilla
-   version 2.14 rather than using a fork, but it's up to you.
-
-4. Pointy-Haired-Boss Questions
+2. Managerial Questions
 
    Note
 
-   The title of this section doesn't mean you're a PHB -- it just means
-   you probably HAVE a PHB who wants to know this :)
+   Questions likely to be asked by managers. :-)
 
-   A.4.1. Is Bugzilla web-based or do you have to have specific software
-   or specific operating system on your machine?
+   A.2.1. Is Bugzilla web-based, or do you have to have specific software
+   or a specific operating system on your machine?
 
    It is web and e-mail based. You can edit bugs by sending specially
    formatted email to a properly configured Bugzilla, or control via the
    web.
 
-   A.4.2. Has anyone you know of already done any Bugzilla integration
-   with Perforce (SCM software)?
+   A.2.2. Can Bugzilla integrate with Perforce (SCM software)?
 
    Yes! You can find more information elsewhere in "The Bugzilla Guide"
    in the "Integration with Third-Party Products" section.
 
-   A.4.3. Does Bugzilla allow the user to track multiple projects?
+   A.2.3. Does Bugzilla allow the user to track multiple projects?
 
-   Absolutely! You can track up to a "soft-limit" of around 64 individual
-   "Products", that can each be composed of as many "Components" as you
-   want. Check the Administration section of the Bugzilla Guide for more
-   information regarding setting up Products and Components.
+   Absolutely! You can track any number of Products (although you are
+   limited to about 55 or so if you are using Product-Based Groups), that
+   can each be composed of any number of Components.
 
-   A.4.4. If I am on many projects, and search for all bugs assigned to
+   A.2.4. If I am on many projects, and search for all bugs assigned to
    me, will Bugzilla list them for me and allow me to sort by project,
    severity etc?
 
    Yes.
 
-   A.4.5. Does Bugzilla allow attachments (text, screenshots, urls etc)?
+   A.2.5. Does Bugzilla allow attachments (text, screenshots, URLs etc)?
    If yes, are there any that are NOT allowed?
 
-   Yes. There are many specific MIME-types that are pre-defined by
-   Bugzilla, but you may specify any arbitrary MIME-type you need when
-   you upload the file. Since all attachments are stored in the database,
-   however, I recommend storing large binary attachments elsewhere in the
-   web server's file system and providing a hyperlink as a comment, or in
-   the provided "URL" field in the bug report.
+   Yes - any sort of attachment is allowed, although administrators can
+   configure a maximum size. There are many specific MIME-types that are
+   pre-defined by Bugzilla, but you may specify any arbitrary MIME-type
+   you need when you upload the file.
 
-   A.4.6. Does Bugzilla allow us to define our own priorities and levels?
+   A.2.6. Does Bugzilla allow us to define our own priorities and levels?
    Do we have complete freedom to change the labels of fields and format
    of them, and the choice of acceptable values?
 
@@ -4481,52 +3166,11 @@ Appendix A. The Bugzilla FAQ
    follow development of this feature at
    http://bugzilla.mozilla.org/show_bug.cgi?id=91037
 
-   A.4.7. The index.html page doesn't show the footer. It's really
-   annoying to have to go to the querypage just to check my "my bugs"
-   link. How do I get a footer on static HTML pages?
-
-   It's possible to get the footer on the static index page using Server
-   Side Includes (SSI). The trick to doing this is making sure that your
-   web server is set up to allow SSI and specifically, the #exec
-   directive. You should also rename index.html to index.shtml.
-
-   After you've done all that, you can add the following line to
-   index.shtml:
-<!--#exec cmd="/usr/bin/perl -e &quot;require 'CGI.pl'; PutFooter();&quot;" -->
-
-   Note
-
-   This line will be replaced with the actual HTML for the footer when
-   the page is requested, so you should put this line where you want the
-   footer to appear.
-
-   Because this method depends on being able to use a #exec directive,
-   and most ISP's will not allow that, there is an alternative method.
-   You could have a small script (such as api.cgi) that basically looks
-   like:
-#!/usr/bonsaitools/bin/perl -w
-
-require 'globals.pl';
-
-if ($::FORM{sub} eq 'PutFooter') {
-    PutFooter();
-} else {
-    die 'api.cgi was incorrectly called';
-}
-
-   and then put this line in index.shtml.
-   <!--#include virtual="api.cgi?sub=PutFooter"-->
-
-   Note
-
-   This still requires being able to use Server Side Includes, if this
-   simply will not work for you, see bug 80183 for a third option.
-
-   A.4.8. Does Bugzilla provide any reporting features, metrics, graphs,
+   A.2.7. Does Bugzilla provide any reporting features, metrics, graphs,
    etc? You know, the type of stuff that management likes to see. :)
 
    Yes. Look at http://bugzilla.mozilla.org/reports.cgi for basic
-   reporting facilities.
+   reporting and graphing facilities.
 
    For more advanced reporting, I recommend hooking up a professional
    reporting package, such as Crystal Reports, and use ODBC to access the
@@ -4535,23 +3179,20 @@ if ($::FORM{sub} eq 'PutFooter') {
    through third-party utilities that can interface with the database
    directly.
 
-   Advanced Reporting is a Bugzilla 3.X proposed feature.
+   A.2.8. Is there email notification and if so, what do you see when you
+   get an email?
 
-   A.4.9. Is there email notification and if so, what do you see when you
-   get an email? Do you see bug number and title or is it only the
-   number?
+   Email notification is user-configurable. By default, the bug id and
+   Summary of the bug report accompany each email notification, along
+   with a list of the changes made.
 
-   Email notification is user-configurable. The bug id and Topic of the
-   bug report accompany each email notification, along with a list of the
-   changes made.
-
-   A.4.10. Can email notification be set up to send to multiple people,
+   A.2.9. Can email notification be set up to send to multiple people,
    some on the To List, CC List, BCC List etc?
 
    Yes.
 
-   A.4.11. If there is email notification, do users have to have any
-   particular type of email application?
+   A.2.10. Do users have to have any particular type of email
+   application?
 
    Bugzilla email is sent in plain text, the most compatible mail format
    on the planet.
@@ -4565,16 +3206,7 @@ if ($::FORM{sub} eq 'PutFooter') {
    ignores HTML tags in comments, and if a user sends HTML-based email
    into Bugzilla the resulting comment looks downright awful.
 
-   A.4.12. If I just wanted to track certain bugs, as they go through
-   life, can I set it up to alert me via email whenever that bug changes,
-   whether it be owner, status or description etc.?
-
-   Yes. Place yourself in the "cc" field of the bug you wish to monitor.
-   Then change your "Notify me of changes to" field in the Email Settings
-   tab of the User Preferences screen in Bugzilla to the "Only those bugs
-   which I am listed on the CC line" option.
-
-   A.4.13. Does Bugzilla allow data to be imported and exported? If I had
+   A.2.11. Does Bugzilla allow data to be imported and exported? If I had
    outsiders write up a bug report using a MS Word bug template, could
    that template be imported into "matching" fields? If I wanted to take
    the results of a query and export that data to MS Excel, could I do
@@ -4596,40 +3228,26 @@ if ($::FORM{sub} eq 'PutFooter') {
    find an excellent example at
    http://www.mozilla.org/quality/help/bugzilla-helper.html
 
-   A.4.14. Has anyone converted Bugzilla to another language to be used
+   A.2.12. Has anyone converted Bugzilla to another language to be used
    in other countries? Is it localizable?
 
-   Currently, no. Internationalization support for Perl did not exist in
-   a robust fashion until the recent release of version 5.6.0; Bugzilla
-   is, and likely will remain (until 3.X) completely non-localized.
+   To a certain extent, yes. 2.16's templates mean that you can localise
+   the user-facing UI (and several projects are doing exactly that.)
+   However, error messages and the admin interface are currently not
+   localisable. This should be achieved by 2.18.
 
-   A.4.15. Can a user create and save reports? Can they do this in Word
+   A.2.13. Can a user create and save reports? Can they do this in Word
    format? Excel format?
 
    Yes. No. No.
 
-   A.4.16. Can a user re-run a report with a new project, same query?
-
-   Yes.
-
-   A.4.17. Can a user modify an existing report and then save it into
-   another name?
-
-   You can save an unlimited number of queries in Bugzilla. You are free
-   to modify them and rename them to your heart's desire.
-
-   A.4.18. Does Bugzilla have the ability to search by word, phrase,
+   A.2.14. Does Bugzilla have the ability to search by word, phrase,
    compound search?
 
    You have no idea. Bugzilla's query interface, particularly with the
    advanced Boolean operators, is incredibly versatile.
 
-   A.4.19. Can the admin person establish separate group and individual
-   user privileges?
-
-   Yes.
-
-   A.4.20. Does Bugzilla provide record locking when there is
+   A.2.15. Does Bugzilla provide record locking when there is
    simultaneous access to the same bug? Does the second person get a
    notice that the bug is in use or how are they notified?
 
@@ -4637,38 +3255,33 @@ if ($::FORM{sub} eq 'PutFooter') {
    detection, and offers the offending user a choice of options to deal
    with the conflict.
 
-   A.4.21. Are there any backup features provided?
+   A.2.16. Are there any backup features provided?
 
    MySQL, the database back-end for Bugzilla, allows hot-backup of data.
    You can find strategies for dealing with backup considerations at
    http://www.mysql.com/doc/B/a/Backup.html
 
-   A.4.22. Can users be on the system while a backup is in progress?
+   A.2.17. Can users be on the system while a backup is in progress?
 
    Yes. However, commits to the database must wait until the tables are
    unlocked. Bugzilla databases are typically very small, and backups
    routinely take less than a minute.
 
-   A.4.23. What type of human resources are needed to be on staff to
+   A.2.18. What type of human resources are needed to be on staff to
    install and maintain Bugzilla? Specifically, what type of skills does
    the person need to have? I need to find out if we were to go with
    Bugzilla, what types of individuals would we need to hire and how much
    would that cost vs buying an "Out-of-the-Box" solution.
 
    If Bugzilla is set up correctly from the start, continuing maintenance
-   needs are minimal and can be completed by unskilled labor. Things like
-   rotate backup tapes and check log files for the word "error".
+   needs are minimal and can be done easily using the web interface.
 
    Commercial Bug-tracking software typically costs somewhere upwards of
    $20,000 or more for 5-10 floating licenses. Bugzilla consultation is
-   available from skilled members of the newsgroup.
-
-   As an example, as of this writing I typically charge $115 for the
-   first hour, and $89 each hour thereafter for consulting work. It takes
-   me three to five hours to make Bugzilla happy on a Development
-   installation of Linux-Mandrake.
+   available from skilled members of the newsgroup. Simple questions are
+   answered there and then.
 
-   A.4.24. What time frame are we looking at if we decide to hire people
+   A.2.19. What time frame are we looking at if we decide to hire people
    to install and maintain the Bugzilla? Is this something that takes
    hours or weeks to install and a couple of hours per week to maintain
    and customize or is this a multi-week install process, plus a full
@@ -4681,69 +3294,53 @@ if ($::FORM{sub} eq 'PutFooter') {
    UNIX or Perl skills to handle your process management and bug-tracking
    maintenance & customization.
 
-   A.4.25. Is there any licensing fee or other fees for using Bugzilla?
+   A.2.20. Is there any licensing fee or other fees for using Bugzilla?
    Any out-of-pocket cost other than the bodies needed as identified
    above?
 
    No. MySQL asks, if you find their product valuable, that you purchase
    a support contract from them that suits your needs.
 
-5. Bugzilla Installation
-
-   A.5.1. How do I download and install Bugzilla?
-
-   Check http://www.mozilla.org/projects/bugzilla/ for details. Once you
-   download it, untar it, read the Bugzilla Guide.
-
-   A.5.2. How do I install Bugzilla on Windows NT?
-
-   Installation on Windows NT has its own section in "The Bugzilla
-   Guide".
-
-   A.5.3. Is there an easy way to change the Bugzilla cookie name?
-
-   At present, no.
-
-6. Bugzilla Security
+3. Bugzilla Security
 
-   A.6.1. How do I completely disable MySQL security if it's giving me
+   A.3.1. How do I completely disable MySQL security if it's giving me
    problems (I've followed the instructions in the installation section
-   of this guide!)?
+   of this guide)?
 
-   Run mysql like this: "mysqld --skip-grant-tables". Please remember
-   this makes mysql as secure as taping a $100 to the floor of a football
-   stadium bathroom for safekeeping. Please read the Security section of
-   the Administration chapter of "The Bugzilla Guide" before proceeding.
+   Run MySQL like this: "mysqld --skip-grant-tables". Please remember
+   this makes MySQL as secure as taping a $100 to the floor of a football
+   stadium bathroom for safekeeping.
 
-   A.6.2. Are there any security problems with Bugzilla?
+   A.3.2. Are there any security problems with Bugzilla?
 
-   The Bugzilla code has not undergone a complete security audit. It is
+   The Bugzilla code has undergone a reasonably complete security audit,
+   and user-facing CGIs run under Perl's taint mode. However, it is
    recommended that you closely examine permissions on your Bugzilla
    installation, and follow the recommended security guidelines found in
    The Bugzilla Guide.
 
-   A.6.3. I've implemented the security fixes mentioned in Chris Yeh's
+   A.3.3. I've implemented the security fixes mentioned in Chris Yeh's
    security advisory of 5/10/2000 advising not to run MySQL as root, and
    am running into problems with MySQL no longer working correctly.
 
    This is a common problem, related to running out of file descriptors.
    Simply add "ulimit -n unlimited" to the script which starts mysqld.
 
-7. Bugzilla Email
+4. Bugzilla Email
 
-   A.7.1. I have a user who doesn't want to receive any more email from
+   A.4.1. I have a user who doesn't want to receive any more email from
    Bugzilla. How do I stop it entirely for this user?
 
-   With the email changes to 2.12, the user should be able to set this in
-   user email preferences.
+   The user should be able to set this in user email preferences (uncheck
+   all boxes.)
 
-   A.7.2. I'm evaluating/testing Bugzilla, and don't want it to send
+   A.4.2. I'm evaluating/testing Bugzilla, and don't want it to send
    email to anyone but me. How do I do it?
 
-   Edit the param for the mail text. Replace "To:" with "X-Real-To:",
-   replace "Cc:" with "X-Real-CC:", and add a "To: (myemailaddress)".
+   Edit the "changedmail" Param. Replace "To:" with "X-Real-To:", replace
+   "Cc:" with "X-Real-CC:", and add a "To: <youremailaddress>".
 
-   A.7.3. I want whineatnews.pl to whine at something more, or other
+   A.4.3. I want whineatnews.pl to whine at something more, or other
    than, only new bugs. How do I do it?
 
    Try Klaas Freitag's excellent patch for "whineatassigned"
@@ -4752,7 +3349,7 @@ if ($::FORM{sub} eq 'PutFooter') {
    against an older version of Bugzilla, so you must apply the diffs
    manually.
 
-   A.7.4. I don't like/want to use Procmail to hand mail off to
+   A.4.4. I don't like/want to use Procmail to hand mail off to
    bug_email.pl. What alternatives do I have?
 
    You can call bug_email.pl directly from your aliases file, with an
@@ -4764,24 +3361,24 @@ if ($::FORM{sub} eq 'PutFooter') {
    to set up your smrsh (sendmail restricted shell) to allow it. In a
    pinch, though, it can work.
 
-   A.7.5. How do I set up the email interface to submit/change bugs via
+   A.4.5. How do I set up the email interface to submit/change bugs via
    email?
 
    You can find an updated README.mailif file in the contrib/ directory
    of your Bugzilla distribution that walks you through the setup.
 
-   A.7.6. Email takes FOREVER to reach me from bugzilla -- it's extremely
+   A.4.6. Email takes FOREVER to reach me from Bugzilla -- it's extremely
    slow. What gives?
 
    If you are using an alternate Mail Transport Agent (MTA other than
-   sendmail), make sure the options given in the "processmail" script for
-   all instances of "sendmail" are correct for your MTA.
+   sendmail), make sure the options given in the "processmail" and other
+   scripts for all instances of "sendmail" are correct for your MTA.
 
    If you are using Sendmail, try enabling "sendmailnow" in
    editparams.cgi. If you are using Postfix, you will also need to enable
    "sendmailnow".
 
-   A.7.7. How come email never reaches me from bugzilla changes?
+   A.4.7. How come email from Bugzilla changes never reaches me?
 
    Double-check that you have not turned off email in your user
    preferences. Confirm that Bugzilla is able to send email by visiting
@@ -4792,34 +3389,16 @@ if ($::FORM{sub} eq 'PutFooter') {
    sendmail in "/usr/lib/sendmail". Ensure sendmail lives in, or is
    symlinked to, "/usr/lib/sendmail".
 
-8. Bugzilla Database
-
-   A.8.1. I've heard Bugzilla can be used with Oracle?
-
-   Red Hat Bugzilla, mentioned above, works with Oracle. The current
-   version from Mozilla.org does not have this capability. Unfortunately,
-   though you will sacrifice a lot of the really great features available
-   in Bugzilla 2.10 and 2.12 if you go with the 2.8-based Redhat version.
-
-   A.8.2. Bugs are missing from queries, but exist in the database (and I
-   can pull them up by specifying the bug ID). What's wrong?
-
-   You've almost certainly enabled the "shadow database", but for some
-   reason it hasn't been updated for all your bugs. This is the database
-   against which queries are run, so that really complex or slow queries
-   won't lock up portions of the database for other users. You can turn
-   off the shadow database in editparams.cgi. If you wish to continue
-   using the shadow database, then as your "bugs" user run
-   "./syncshadowdb -syncall" from the command line in the bugzilla
-   installation directory to recreate your shadow database. After it
-   finishes, be sure to check the params and make sure that
-   "queryagainstshadowdb" is still turned on. The syncshadowdb program
-   turns it off if it was on, and is supposed to turn it back on when
-   completed; that way, if it crashes in the middle of recreating the
-   database, it will stay off forever until someone turns it back on by
-   hand. Apparently, it doesn't always do that yet.
-
-   A.8.3. I think my database might be corrupted, or contain invalid
+5. Bugzilla Database
+
+   A.5.1. I've heard Bugzilla can be used with Oracle?
+
+   Red Hat Bugzilla works with Oracle. The current version from
+   Mozilla.org does not have this capability. Unfortunately, though you
+   will sacrifice a lot of the really great features available in
+   Bugzilla 2.14 and 2.16 if you go with the 2.8-based Redhat version.
+
+   A.5.2. I think my database might be corrupted, or contain invalid
    entries. What do I do?
 
    Run the "sanity check" utility (./sanitycheck.cgi in the Bugzilla_home
@@ -4834,7 +3413,7 @@ if ($::FORM{sub} eq 'PutFooter') {
    exhaustive, and was created to do a basic check for the most common
    problems in Bugzilla databases.
 
-   A.8.4. I want to manually edit some entries in my database. How?
+   A.5.3. I want to manually edit some entries in my database. How?
 
    There is no facility in Bugzilla itself to do this. It's also
    generally not a smart thing to do if you don't know exactly what
@@ -4844,7 +3423,7 @@ if ($::FORM{sub} eq 'PutFooter') {
    module with MySQL support to make it work, but it's very clean and
    easy to use.
 
-   A.8.5. I try to add myself as a user, but Bugzilla always tells me my
+   A.5.4. I try to add myself as a user, but Bugzilla always tells me my
    password is wrong.
 
    Certain version of MySQL (notably, 3.23.29 and 3.23.30) accidentally
@@ -4852,7 +3431,7 @@ if ($::FORM{sub} eq 'PutFooter') {
    encrypted passwords. Upgrade to the "3.23 stable" version of MySQL and
    you should be good to go.
 
-   A.8.6. I think I've set up MySQL permissions correctly, but bugzilla
+   A.5.5. I think I've set up MySQL permissions correctly, but Bugzilla
    still can't connect.
 
    Try running MySQL from its binary: "mysqld --skip-grant-tables". This
@@ -4861,7 +3440,7 @@ if ($::FORM{sub} eq 'PutFooter') {
    regular basis, unless you really want your web site defaced and your
    machine cracked.
 
-   A.8.7. How do I synchronize bug information among multiple different
+   A.5.6. How do I synchronize bug information among multiple different
    Bugzilla databases?
 
    Well, you can synchronize or you can move bugs. Synchronization will
@@ -4877,37 +3456,21 @@ if ($::FORM{sub} eq 'PutFooter') {
    If you simply need to transfer bugs from one Bugzilla to another,
    checkout the "move.pl" script in the Bugzilla distribution.
 
-   A.8.8. Why do I get bizarre errors when trying to submit data,
-   particularly problems with "groupset"?
-
-   If you're sure your MySQL parameters are correct, you might want turn
-   "strictvaluechecks" OFF in editparams.cgi. If you have "usebugsentry"
-   set "On", you also cannot submit a bug as readable by more than one
-   group with "strictvaluechecks" ON.
-
-   A.8.9. How come even after I delete bugs, the long descriptions show
-   up?
-
-   This should only happen with Bugzilla 2.14 if you are using the
-   "shadow database" feature, and your shadow database is out of sync.
-   Try running syncshadowdb -syncall to make sure your shadow database is
-   in synch with your primary database.
+6. Bugzilla and Win32
 
-9. Bugzilla and Win32
-
-   A.9.1. What is the easiest way to run Bugzilla on Win32
+   A.6.1. What is the easiest way to run Bugzilla on Win32
    (Win98+/NT/2K)?
 
    Remove Windows. Install Linux. Install Bugzilla. The boss will never
    know the difference.
 
-   A.9.2. Is there a "Bundle::Bugzilla" equivalent for Win32?
+   A.6.2. Is there a "Bundle::Bugzilla" equivalent for Win32?
 
    Not currently. Bundle::Bugzilla enormously simplifies Bugzilla
    installation on UNIX systems. If someone can volunteer to create a
    suitable PPM bundle for Win32, it would be appreciated.
 
-   A.9.3. CGI's are failing with a "something.cgi is not a valid Windows
+   A.6.3. CGI's are failing with a "something.cgi is not a valid Windows
    NT application" error. Why?
 
    Depending on what Web server you are using, you will have to configure
@@ -4928,114 +3491,7 @@ if ($::FORM{sub} eq 'PutFooter') {
      the end of the pathname for perl.exe, as shown in this example:
      c:\perl\bin\perl.exe %s %s"
 
-   A.9.4. Can I have some general instructions on how to make Bugzilla on
-   Win32 work?
-
-   The following couple entries are deprecated in favor of the Windows
-   installation instructions available in the "Administration" portion of
-   "The Bugzilla Guide". However, they are provided here for historical
-   interest and insight.
-
-     1. #!C:/perl/bin/perl had to be added to every perl file.
-     2. Converted to Net::SMTP to handle mail messages instead of
-        /usr/bin/sendmail.
-     3. The crypt function isn't available on Windows NT (at least none t
-   hat I
-        am aware), so I made encrypted passwords = plaintext passwords.
-     4. The system call to diff had to be changed to the Cygwin diff.
-     5. This was just to get a demo running under NT, it seems to be work
-   ing
-        good, and I have inserted almost 100 bugs from another bug tracki
-   ng
-        system. Since this work was done just to get an in-house demo, I
-   am NOT
-        planning on making a patch for submission to Bugzilla. If you wou
-   ld
-        like a zip file, let me know.
-   Q: Hmm, couldn't figure it out from the general instructions above.  H
-   ow
-   about step-by-step?
-   A: Sure! Here ya go!
-     1. Install IIS 4.0 from the NT Option Pack #4.
-     2. Download and install Active Perl.
-     3. Install the Windows GNU tools from Cygwin. Make sure to add the b
-   in
-        directory to your system path. (Everyone should have these, wheth
-   er
-        they decide to use Bugzilla or not. :-) )
-     4. Download relevant packages from ActiveState at
-        http://www.activestate.com/packages/zips/. + DBD-Mysql.zip
-     5. Extract each zip file with WinZip, and install each ppd file usin
-   g the
-        notation: ppm install <module>.ppd
-     6. Install Mysql.  *Note: If you move the default install from c:\my
-   sql,
-        you must add the appropriate startup parameters to the NT service
-   . (ex.
-        -b e:\\programs\\mysql)
-     7. Download any Mysql client. http://www.mysql.com/download_win.html
-     8. Setup MySql. (These are the commands that I used.)
-             I. Cleanup default database settings.
-              C:\mysql\bin\mysql -u root mysql
-              mysql> DELETE FROM user WHERE Host='localhost' AND User='';
-              mysql> quit
-             C:\mysql\bin\mysqladmin reload
-             II. Set password for root.
-              C:\mysql\bin\mysql -u root mysql
-              mysql> UPDATE user SET Password=PASSWORD('new_password')
-              WHERE user='root';
-              mysql> FLUSH PRIVILEGES;
-              mysql> quit
-              C:\mysql\bin\mysqladmin -u root reload
-             III. Create bugs user.
-              C:\mysql\bin\mysql -u root -p
-              mysql> insert into user (host,user,password)
-             values('localhost','bugs','');
-              mysql> quit
-              C:\mysql\bin\mysqladmin -u root reload
-             IV. Create the bugs database.
-              C:\mysql\bin\mysql -u root -p
-              mysql> create database bugs;
-             V. Give the bugs user access to the bugs database.
-              mysql> insert into db
-             (host,db,user,select_priv,insert_priv,update_priv,delete_pri
-   v,create_priv,drop_priv)
-             values('localhost','bugs','bugs','Y','Y','Y','Y','Y','N')
-              mysql> quit
-              C:\mysql\bin\mysqladmin -u root reload
-     9. Run the table scripts to setup the bugs database.
-    10. Change CGI.pm to use the following regular expression because of
-        differing backslashes in NT versus UNIX.
-           o $0 =~ m:[^\\]*$:;
-    11. Had to make the crypt password = plain text password in the datab
-   ase.
-        (Thanks to Andrew Lahser" <andrew_lahser@merck.com>" on this one.
-   ) The
-        files that I changed were:
-           o globals.pl
-           o CGI.pl
-           o alternately, you can try commenting all references to 'crypt
-   '
-             string and replace them with similar lines but without encry
-   pt()
-             or crypr() functions insida all files.
-    12. Replaced sendmail with Windmail. Basically, you have to come up w
-   ith a
-        sendmail substitute for NT. Someone said that they used a Perl mo
-   dule
-        (Net::SMTP), but I was trying to save time and do as little Perl
-   coding
-        as possible.
-    13. Added "perl" to the beginning of all Perl system calls that use a
-    perl
-        script as an argument and renamed processmail to processmail.pl.
-    14. In processmail.pl, I added binmode(HANDLE) before all read() call
-   s. I'm
-        not sure about this one, but the read() under NT wasn't counting
-   the
-        EOLs without the binary read."
-
-   A.9.5. I'm having trouble with the perl modules for NT not being able
+   A.6.4. I'm having trouble with the perl modules for NT not being able
    to talk to to the database.
 
    Your modules may be outdated or inaccurate. Try:
@@ -5050,93 +3506,93 @@ if ($::FORM{sub} eq 'PutFooter') {
    check the ActiveState site for packages for installation through PPM.
    http://www.activestate.com/Packages/
 
-10. Bugzilla Usage
+7. Bugzilla Usage
+
+   A.7.1. How do I change my user name (email address) in Bugzilla?
 
-   A.10.1. The query page is very confusing. Isn't there a simpler way to
+   New in 2.16 - go to the Account section of the Preferences. You will
+   be emailed at both addresses for confirmation.
+
+   A.7.2. The query page is very confusing. Isn't there a simpler way to
    query?
 
-   We are developing in that direction. You can follow progress on this
-   at http://bugzilla.mozilla.org/show_bug.cgi?id=16775. Some
-   functionality is available in Bugzilla 2.12, and is available as
-   "quicksearch.html"
+   The interface was simplified by a UI designer for 2.16. Further
+   suggestions for improvement are welcome, but we won't sacrifice power
+   for simplicity.
 
-   A.10.2. I'm confused by the behavior of the "accept" button in the
-   Show Bug form. Why doesn't it assign the bug to me when I accept it?
+   A.7.3. I'm confused by the behavior of the "accept" button in the Show
+   Bug form. Why doesn't it assign the bug to me when I accept it?
 
    The current behavior is acceptable to bugzilla.mozilla.org and most
-   users. I personally don't like it. You have your choice of patches to
-   change this behavior, however.
+   users. You have your choice of patches to change this behavior,
+   however.
 
    Add a "and accept bug" radio button
    "Accept" button automatically assigns to you
 
-   Note that these patches are somewhat dated. You will need to do the
-   find and replace manually to apply them. They are very small, though.
-   It is easy.
+   Note that these patches are somewhat dated. You will need to apply
+   them manually.
 
-   A.10.3. I can't upload anything into the database via the "Create
+   A.7.4. I can't upload anything into the database via the "Create
    Attachment" link. What am I doing wrong?
 
    The most likely cause is a very old browser or a browser that is
    incompatible with file upload via POST. Download the latest Netscape,
    Microsoft, or Mozilla browser to handle uploads correctly.
 
-   A.10.4. Email submissions to Bugzilla that have attachments end up
+   A.7.5. Email submissions to Bugzilla that have attachments end up
    asking me to save it as a "cgi" file.
 
    Yup. Just rename it once you download it, or save it under a different
-   filename. This will not be fixed anytime too soon, because it would
+   filename. This will not be fixed anytime soon, because it would
    cripple some other functionality.
 
-   A.10.5. How do I change a keyword in Bugzilla, once some bugs are
-   using it?
+   A.7.6. How do I change a keyword in Bugzilla, once some bugs are using
+   it?
 
    In the Bugzilla administrator UI, edit the keyword and it will let you
    replace the old keyword name with a new one. This will cause a problem
    with the keyword cache. Run sanitycheck.cgi to fix it.
 
-11. Bugzilla Hacking
+8. Bugzilla Hacking
 
-   A.11.1. What bugs are in Bugzilla right now?
+   A.8.1. What bugs are in Bugzilla right now?
 
    Try this link to view current bugs or requests for enhancement for
    Bugzilla.
 
-   You can view bugs marked for 2.16 release here. This list includes
-   bugs for the 2.16 release that have already been fixed and checked
+   You can view bugs marked for 2.18 release here. This list includes
+   bugs for the 2.18 release that have already been fixed and checked
    into CVS. Please consult the Bugzilla Project Page for details on how
    to check current sources out of CVS so you can have these bug fixes
    early!
 
-   A.11.2. How can I change the default priority to a null value? For
+   A.8.2. How can I change the default priority to a null value? For
    instance, have the default priority be "---" instead of "P2"?
 
    This is well-documented here:
    http://bugzilla.mozilla.org/show_bug.cgi?id=49862. Ultimately, it's as
    easy as adding the "---" priority field to your localconfig file in
    the appropriate area, re-running checksetup.pl, and then changing the
-   default priority in your browser using "editparams.cgi". Hmm, now that
-   I think about it, that is kind of a klunky way to handle it, but for
-   now it's what we have! Although the bug has been closed "resolved
-   wontfix", there may be a better way to handle this...
+   default priority in your browser using "editparams.cgi".
 
-   A.11.3. What's the best way to submit patches? What guidelines should
-   I follow?
+   A.8.3. What's the best way to submit patches? What guidelines should I
+   follow?
 
     1. Enter a bug into bugzilla.mozilla.org for the "Bugzilla" product.
-    2. Upload your patch as a unified DIFF (having used "diff -u" against
+    2. Upload your patch as a unified diff (having used "diff -u" against
        the current sources checked out of CVS), or new source file by
        clicking "Create a new attachment" link on the bug page you've
        just created, and include any descriptions of database changes you
        may make, into the bug ID you submitted in step #1. Be sure and
-       click the "Patch" radio button to indicate the text you are
-       sending is a patch!
+       click the "Patch" checkbox to indicate the text you are sending is
+       a patch!
     3. Announce your patch and the associated URL
-       (http://bugzilla.mozilla.org/show_bug.cgi?id=XXXX) for discussion
-       in the newsgroup (netscape.public.mozilla.webtools). You'll get a
-       really good, fairly immediate reaction to the implications of your
-       patch, which will also give us an idea how well-received the
-       change would be.
+       (http://bugzilla.mozilla.org/show_bug.cgi?id=XXXXXX) for
+       discussion in the newsgroup (netscape.public.mozilla.webtools).
+       You'll get a really good, fairly immediate reaction to the
+       implications of your patch, which will also give us an idea how
+       well-received the change would be.
     4. If it passes muster with minimal modification, the person to whom
        the bug is assigned in Bugzilla is responsible for seeing the
        patch is checked into CVS.
@@ -5144,46 +3600,7 @@ if ($::FORM{sub} eq 'PutFooter') {
        successful open-source bug-tracking software on the planet :)
      _________________________________________________________________
 
-Appendix B. Software Download Links
-
-   All of these sites are current as of April, 2001. Hopefully they'll
-   stay current for a while.
-
-   Apache Web Server: http://www.apache.org Optional web server for
-   Bugzilla, but recommended because of broad user base and support.
-
-   Bugzilla: http://www.mozilla.org/projects/bugzilla/
-
-   MySQL: http://www.mysql.com/
-
-   Perl: http://www.perl.org/
-
-   CPAN: http://www.cpan.org/
-
-   DBI Perl module:
-   ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/DBI/
-
-   Data::Dumper module:
-   ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Data/
-
-   MySQL related Perl modules:
-   ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Mysql/
-
-   TimeDate Perl module collection:
-   ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Date/
-
-   GD Perl module: ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/GD/
-   Alternately, you should be able to find the latest version of GD at
-   http://www.boutell.com/gd/
-
-   Chart::Base module:
-   ftp://ftp.cpan.org/pub/perl/CPAN/modules/by-module/Chart/
-
-   LinuxDoc Software: http://www.linuxdoc.org/ (for documentation
-   maintenance)
-     _________________________________________________________________
-
-Appendix C. The Bugzilla Database
+Appendix B. The Bugzilla Database
 
    Note
 
@@ -5192,114 +3609,105 @@ Appendix C. The Bugzilla Database
    nifty tables to document dependencies. Any takers?
      _________________________________________________________________
 
-C.1. Database Schema Chart
+B.1. Database Schema Chart
 
-   Database Relationships
+   [dbschema.jpg]
 
    Bugzilla database relationships chart
      _________________________________________________________________
 
-C.2. MySQL Bugzilla Database Introduction
-
-   This information comes straight from my life. I was forced to learn
-   how Bugzilla organizes database because of nitpicky requests from
-   users for tiny changes in wording, rather than having people
-   re-educate themselves or figure out how to work our procedures around
-   the tool. It sucks, but it can and will happen to you, so learn how
-   the schema works and deal with it when it comes.
-
-   So, here you are with your brand-new installation of Bugzilla. You've
-   got MySQL set up, Apache working right, Perl DBI and DBD talking to
-   the database flawlessly. Maybe you've even entered a few test bugs to
-   make sure email's working; people seem to be notified of new bugs and
-   changes, and you can enter and edit bugs to your heart's content.
-   Perhaps you've gone through the trouble of setting up a gateway for
-   people to submit bugs to your database via email, have had a few
-   people test it, and received rave reviews from your beta testers.
-
-   What's the next thing you do? Outline a training strategy for your
-   development team, of course, and bring them up to speed on the new
-   tool you've labored over for hours.
-
-   Your first training session starts off very well! You have a captive
-   audience which seems enraptured by the efficiency embodied in this
-   thing called "Bugzilla". You are caught up describing the nifty
-   features, how people can save favorite queries in the database, set
-   them up as headers and footers on their pages, customize their
-   layouts, generate reports, track status with greater efficiency than
-   ever before, leap tall buildings with a single bound and rescue Jane
-   from the clutches of Certain Death!
-
-   But Certain Death speaks up -- a tiny voice, from the dark corners of
-   the conference room. "I have a concern," the voice hisses from the
-   darkness, "about the use of the word 'verified'.
-
-   The room, previously filled with happy chatter, lapses into
-   reverential silence as Certain Death (better known as the Vice
-   President of Software Engineering) continues. "You see, for two years
-   we've used the word 'verified' to indicate that a developer or quality
-   assurance engineer has confirmed that, in fact, a bug is valid. I
-   don't want to lose two years of training to a new software product.
-   You need to change the bug status of 'verified' to 'approved' as soon
-   as possible. To avoid confusion, of course."
-
-   Oh no! Terror strikes your heart, as you find yourself mumbling "yes,
-   yes, I don't think that would be a problem," You review the changes
-   with Certain Death, and continue to jabber on, "no, it's not too big a
-   change. I mean, we have the source code, right? You know, 'Use the
-   Source, Luke' and all that... no problem," All the while you quiver
-   inside like a beached jellyfish bubbling, burbling, and boiling on a
-   hot Jamaican sand dune...
-
-   Thus begins your adventure into the heart of Bugzilla. You've been
-   forced to learn about non-portable enum() fields, varchar columns, and
-   tinyint definitions. The Adventure Awaits You!
+B.2. MySQL Bugzilla Database Introduction
+
+This information comes straight from my life. I was forced to learn how
+Bugzilla organizes database because of nitpicky requests from users for tiny
+changes in wording, rather than having people re-educate themselves or
+figure out how to work our procedures around the tool. It sucks, but it can
+and will happen to you, so learn how the schema works and deal with it when
+it comes.
+
+So, here you are with your brand-new installation of Bugzilla. You've got
+MySQL set up, Apache working right, Perl DBI and DBD talking to the database
+flawlessly. Maybe you've even entered a few test bugs to make sure email's
+working; people seem to be notified of new bugs and changes, and you can
+enter and edit bugs to your heart's content. Perhaps you've gone through the
+trouble of setting up a gateway for people to submit bugs to your database
+via email, have had a few people test it, and received rave reviews from
+your beta testers.
+
+What's the next thing you do? Outline a training strategy for your
+development team, of course, and bring them up to speed on the new tool
+you've labored over for hours.
+
+Your first training session starts off very well! You have a captive
+audience which seems enraptured by the efficiency embodied in this thing
+called "Bugzilla". You are caught up describing the nifty features, how
+people can save favorite queries in the database, set them up as headers and
+footers on their pages, customize their layouts, generate reports, track
+status with greater efficiency than ever before, leap tall buildings with a
+single bound and rescue Jane from the clutches of Certain Death!
+
+But Certain Death speaks up -- a tiny voice, from the dark corners of the
+conference room. "I have a concern," the voice hisses from the darkness,
+"about the use of the word 'verified'.
+
+The room, previously filled with happy chatter, lapses into reverential
+silence as Certain Death (better known as the Vice President of Software
+Engineering) continues. "You see, for two years we've used the word
+'verified' to indicate that a developer or quality assurance engineer has
+confirmed that, in fact, a bug is valid. I don't want to lose two years of
+training to a new software product. You need to change the bug status of
+'verified' to 'approved' as soon as possible. To avoid confusion, of
+course."
+
+Oh no! Terror strikes your heart, as you find yourself mumbling "yes, yes, I
+don't think that would be a problem," You review the changes with Certain
+Death, and continue to jabber on, "no, it's not too big a change. I mean, we
+have the source code, right? You know, 'Use the Source, Luke' and all
+that... no problem," All the while you quiver inside like a beached
+jellyfish bubbling, burbling, and boiling on a hot Jamaican sand dune...
+
+Thus begins your adventure into the heart of Bugzilla. You've been forced to
+learn about non-portable enum() fields, varchar columns, and tinyint
+definitions. The Adventure Awaits You!
      _________________________________________________________________
 
-C.2.1. Bugzilla Database Basics
+B.2.1. Bugzilla Database Basics
 
-   If you were like me, at this point you're totally clueless about the
-   internals of MySQL, and if it weren't for this executive order from
-   the Vice President you couldn't care less about the difference between
-   a "bigint" and a "tinyint" entry in MySQL. I recommend you refer to
-   the MySQL documentation, available at MySQL.com. Below are the basics
-   you need to know about the Bugzilla database. Check the chart above
-   for more details.
+If you were like me, at this point you're totally clueless about the
+internals of MySQL, and if it weren't for this executive order from the Vice
+President you couldn't care less about the difference between a "bigint" and
+a "tinyint" entry in MySQL. I recommend you refer to the MySQL
+documentation, available at MySQL.com . Below are the basics you need to
+know about the Bugzilla database. Check the chart above for more details.
 
     1. To connect to your database:
-       bash#mysql-u root
-       If this works without asking you for a password, shame on you! You
-       should have locked your security down like the installation
+       bash# mysql -u root
+       If this works without asking you for a password, shame on you !
+       You should have locked your security down like the installation
        instructions told you to. You can find details on locking down
        your database in the Bugzilla FAQ in this directory (under
        "Security"), or more robust security generalities in the MySQL
-       searchable documentation at
-       http://www.mysql.com/php/manual.php3?section=Privilege_system .
+       searchable documentation.
     2. You should now be at a prompt that looks like this:
        mysql>
-       At the prompt, if "bugs" is the name you chose in thelocalconfig
+       At the prompt, if "bugs" is the name you chose in the localconfig
        file for your Bugzilla database, type:
-       mysqluse bugs;
-
-       Note
-
-   Don't forget the ";" at the end of each line, or you'll be kicking
-   yourself later.
+       mysql use bugs;
      _________________________________________________________________
 
-C.2.1.1. Bugzilla Database Tables
+B.2.1.1. Bugzilla Database Tables
+
+Imagine your MySQL database as a series of spreadsheets, and you won't be
+too far off. If you use this command:
 
-   Imagine your MySQL database as a series of spreadsheets, and you won't
-   be too far off. If you use this command:
+mysql> show tables from bugs;
 
-   mysql>show tables from bugs;
+you'll be able to see the names of all the "spreadsheets" (tables) in your
+database.
 
-   you'll be able to see all the "spreadsheets" (tables) in your
-   database. It is similar to a file system, only faster and more robust
-   for certain types of operations.
+From the command issued above, ou should have some output that looks like
+this:
 
-   From the command issued above, ou should have some output that looks
-   like this:
 +-------------------+
 | Tables in bugs    |
 +-------------------+
@@ -5516,228 +3924,20 @@ C.2.1.1. Bugzilla Database Tables
    mentioned can also be done by editing checksetup.pl, which automates a
     lot of
    this.  But you need to know this stuff anyway, right?
-     I hope this database tutorial has been useful for you.  If you have
-   comments
-   to add, questions, concerns, etc. please direct them to
-   mbarnson@excitehome.net.  Please direct flames to /dev/null :)  Have a
-    nice
-   day!
-   ===
-   LINKS
-   ===
-   Great MySQL tutorial site:
-   http://www.devshed.com/Server_Side/MySQL/
      _________________________________________________________________
 
-C.3. MySQL Permissions & Grant Tables
+Appendix C. Useful Patches and Utilities for Bugzilla
 
-   Note
-
-   The following portion of documentation comes from my answer to an old
-   discussion of Keystone, a cool product that does trouble-ticket
-   tracking for IT departments. I wrote this post to the Keystone support
-   group regarding MySQL grant table permissions, and how to use them
-   effectively. It is badly in need of updating, as I believe MySQL has
-   added a field or two to the grant tables since this time, but it
-   serves as a decent introduction and troubleshooting document for grant
-   table issues. I used Keynote to track my troubles until I discovered
-   Bugzilla, which gave me a whole new set of troubles to work on : )
-   Although it is of limited use, it still has SOME use, thus it's still
-   included.
-
-   Please note, however, that I was a relatively new user to MySQL at the
-   time. Some of my suggestions, particularly in how to set up security,
-   showed a terrible lack of security-related database experience.
-
-   From matt_barnson@singletrac.com Wed Jul  7 09:00:07 1999
-   Date: Mon, 1 Mar 1999 21:37:04 -0700
-   From: Matthew Barnson matt_barnson@singletrac.com
-   To: keystone-users@homeport.org
-   Subject: [keystone-users] Grant Tables FAQ
-       [The following text is in the "iso-8859-1" character set]
-       [Your display is set for the "US-ASCII" character set]
-       [Some characters may be displayed incorrectly]
-   Maybe we can include this rambling message in the Keystone FAQ?  It ge
-   ts
-   asked a lot, and the only option current listed in the FAQ is
-   "--skip-grant-tables".
-   Really, you can't go wrong by reading section 6 of the MySQL manual, a
-   t
-   http://www.mysql.com/Manual/manual.html.  I am sure their description
-   is
-   better than mine.
-   MySQL runs fine without permissions set up correctly if you run the my
-   sql
-   daemon with the "--skip-grant-tables" option.  Running this way denies
-   access to nobody.  Unfortunately, unless you've got yourself firewalle
-   d it
-   also opens the potential for abuse if someone knows you're running it.
-   Additionally, the default permissions for MySQL allow anyone at localh
-   ost
-   access to the database if the database name begins with "test_" or is
-   named
-   "test" (i.e. "test_keystone").  You can change the name of your databa
-   se in
-   the keystone.conf file ($sys_dbname).  This is the way I am doing it f
-   or
-   some of my databases, and it works fine.
-   The methods described below assume you're running MySQL on the same bo
-   x as
-   your webserver, and that you don't mind if your $sys_dbuser for Keysto
-   ne has
-   superuser access.  See near the bottom of this message for a descripti
-   on of
-   what each field does.
-   Method #1:
-   1.  cd /var/lib
-   #location where you'll want to run /usr/bin/mysql_install_db shell
-   script from to get it to work.
-   2.  ln -s mysql data
-   # soft links the "mysql" directory to "data", which is what
-   mysql_install_db expects.  Alternately, you can edit mysql_install_db
-   and
-   change all the "./data" references to "./mysql".
-   3.  Edit /usr/bin/mysql_install_db with your favorite text editor (vi,
-   emacs, jot, pico, etc.)
-   A)  Copy the "INSERT INTO db VALUES
-   ('%','test\_%','','Y','Y','Y','Y','Y','Y');" and paste it immediately
-   after
-   itself.  Chage the 'test\_%' value to 'keystone', or the value of
-   $sys_dbname in keystone.conf.
-   B)  If you are running your keystone database with any user, you'll ne
-   ed to
-   copy the "INSERT INTO user VALUES
-   ('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');" line
-    after
-   itself and change 'root' to the name of the keystone database user
-   ($sys_dbuser) in keystone.conf.
-   # adds entries to the script to create grant tables for specific
-   hosts and users.  The user you set up has super-user access ($sys_dbus
-   er) --
-   you may or may not want this.  The layout of mysql_install_db is reall
-   y very
-   uncomplicated.
-   4.  /usr/bin/mysqladmin shutdown
-   # ya gotta shut it down before you can reinstall the grant tables!
-   5.  rm -i /var/lib/mysql/mysql/*.IS?' and answer 'Y' to the deletion
-   questions.
-   # nuke your current grant tables.  This WILL NOT delete any other
-   databases than your grant tables.
-   6.  /usr/bin/mysql_install_db
-   # run the script you just edited to install your new grant tables.
-   7.  mysqladmin -u root password (new_password)
-   # change the root MySQL password, or else anyone on localhost can
-   login to MySQL as root and make changes.  You can skip this step if yo
-   u want
-   keystone to connect as root with no password.
-   8.  mysqladmin -u (webserver_user_name) password (new_password)
-   # change the password of the $sys_dbuser.  Note that you will need
-   to change the password in the keystone.conf file as well in $sys_dbpas
-   swd,
-   and if your permissions are set up incorrectly anybody can type the UR
-   L to
-   your keystone.conf file and get the password.  Not that this will help
-    them
-   much if your permissions are set to @localhost.
-   Method #2:  easier, but a pain reproducing if you have to delete your
-   grant
-   tables.  This is the "recommended" method for altering grant tables in
-   MySQL.  I don't use it because I like the other way :)
-   shell> mysql --user=root keystone
-   mysql> GRANT
-   SELECT,INSERT,UPDATE,DELETE,INDEX,ALTER,CREATE,DROP,RELOAD,SHUTDOWN,PR
-   OCESS,
-   FILE,
-              ON keystone.*
-              TO <$sys_dbuser name>@localhost
-              IDENTIFIED BY '(password)'
-        WITH GRANT OPTION;
-   OR
-   mysql> GRANT ALL PRIVELEGES
-   ON keystone.*
-   TO <$sys_dbuser name>@localhost
-   IDENTIFIED BY '(password)'
-   WITH GRANT OPTION;
-   # this grants the required permissions to the keystone ($sys_dbuser)
-   account defined in keystone.conf.  However, if you are runnning many
-   different MySQL-based apps, as we are, it's generally better to edit t
-   he
-   mysql_install_db script to be able to quickly reproduce your permissio
-   ns
-   structure again.  Note that the FILE privelege and WITH GRANT OPTION m
-   ay not
-   be in your best interest to include.
-   GRANT TABLE FIELDS EXPLANATION:
-   Quick syntax summary:  "%" in MySQL is a wildcard.  I.E., if you are
-   defining your DB table and in the 'host' field and enter '%', that mea
-   ns
-   that any host can access that database.  Of course, that host must als
-   o have
-   a valid db user in order to do anything useful.  'db'=name of database
-   .  In
-   our case, it should be "keystone".  "user" should be your "$sys_dbuser
-   "
-   defined in keystone.conf.  Note that you CANNOT add or change a passwo
-   rd by
-   using the "INSERT INTO db (X)" command -- you must change it with the
-   mysql
-   -u command as defined above.  Passwords are stored encrypted in the My
-   SQL
-   database, and if you try to enter it directly into the table they will
-    not
-   match.
-   TABLE:  USER.  Everything after "password" is a privelege granted (Y/N
-   ).
-   This table controls individual user global access rights.
-   'host','user','password','select','insert','update','delete','index','
-   alter'
-   ,'create','drop','grant','reload','shutdown','process','file'
-   TABLE:  DB.  This controls access of USERS to databases.
-   'host','db','user','select','insert','update','delete','index','alter'
-   ,'crea
-   te','drop','grant'
-   TABLE:  HOST.  This controls which HOSTS are allowed what global acces
-   s
-   rights.  Note that the HOST table, USER table, and DB table are very c
-   losely
-   connected -- if an authorized USER attempts an SQL request from an
-   unauthorized HOST, she's denied.  If a request from an authorized HOST
-    is
-   not an authorized USER, it is denied.  If a globally authorized USER d
-   oes
-   not have rights to a certain DB, she's denied.  Get the picture?
-   'host','db','select','insert','update','delete','index','alter','creat
-   e','dr
-   op','grant'
-   You should now have a working knowledge of MySQL grant tables.  If the
-   re is
-   anything I've left out of this answer that you feel is pertinent, or i
-   f my
-   instructions don't work for you, please let me know and I'll re-post t
-   his
-   letter again, corrected.  I threw it together one night out of exasper
-   ation
-   for all the newbies who don't know squat about MySQL yet, so it is alm
-   ost
-   guaranteed to have errors.
-   Once again, you can't go wrong by reading section 6 of the MySQL manua
-   l.  It
-   is more detailed than I!
-   http://www.mysql.com/Manual/manual.html.
-     _________________________________________________________________
-
-Appendix D. Useful Patches and Utilities for Bugzilla
-
-   Are you looking for a way to put your Bugzilla into overdrive? Catch
-   some of the niftiest tricks here in this section.
+Are you looking for a way to put your Bugzilla into overdrive? Catch some of
+the niftiest tricks here in this section.
      _________________________________________________________________
 
-D.1. Apache mod_rewrite magic
+C.1. Apache mod_rewrite magic
 
-   Apache's mod_rewrite module lets you do some truly amazing things with
-   URL rewriting. Here are a couple of examples of what you can do.
+Apache's mod_rewrite module lets you do some truly amazing things with URL
+rewriting. Here are a couple of examples of what you can do.
 
-    1. Make it so if someone types http://www.foo.com/12345, Bugzilla
+    1. Make it so if someone types http://www.foo.com/12345 , Bugzilla
        spits back http://www.foo.com/show_bug.cgi?id=12345. Try setting
        up your VirtualHost section for Bugzilla with a rule like this:
 
@@ -5746,573 +3946,100 @@ RewriteEngine On
 RewriteRule ^/([0-9]+)$ http://foo.bar.com/show_bug.cgi?id=$1 [L,R]
 </VirtualHost>
 
-    2. There are many, many more things you can do with mod_rewrite. As
-       time goes on, I will include many more in the Guide. For now,
-       though, please refer to the mod_rewrite documentation at
-       http://www.apache.org
-     _________________________________________________________________
-
-D.2. The setperl.csh Utility
-
-   You can use the "setperl.csh" utility to quickly and easily change the
-   path to perl on all your Bugzilla files. This is a C-shell script; if
-   you do not have "csh" or "tcsh" in the search path on your system, it
-   will not work!
-    1. Download the "setperl.csh" utility to your Bugzilla directory and
-       make it executable.
-         a. bash# cd /your/path/to/bugzilla
-         b. bash# wget -O setperl.csh
-            'http://bugzilla.mozilla.org/showattachment.cgi?attach_id=107
-            95'
-         c. bash# chmod u+x setperl.csh
-    2. Prepare (and fix) Bugzilla file permissions.
-         a. bash# chmod u+w *
-         b. bash# chmod u+x duplicates.cgi
-         c. bash# chmod a-x bug_status.html
-    3. Run the script:
-       bash# ./setperl.csh /your/path/to/perl
-       Example D-1. Using Setperl to set your perl path
-       bash# ./setperl.csh /usr/bin/perl
-     _________________________________________________________________
-
-D.3. Command-line Bugzilla Queries
-
-   Users can query Bugzilla from the command line using this suite of
-   utilities.
-
-   The query.conf file contains the mapping from options to field names
-   and comparison types. Quoted option names are "grepped" for, so it
-   should be easy to edit this file. Comments (#) have no effect; you
-   must make sure these lines do not contain any quoted "option"
-
-   buglist is a shell script which submits a Bugzilla query and writes
-   the resulting HTML page to stdout. It supports both short options,
-   (such as "-Afoo" or "-Rbar") and long options (such as
-   "--assignedto=foo" or "--reporter=bar"). If the first character of an
-   option is not "-", it is treated as if it were prefixed with
-   "--default=".
-
-   The columlist is taken from the COLUMNLIST environment variable. This
-   is equivalent to the "Change Columns" option when you list bugs in
-   buglist.cgi. If you have already used Bugzilla, use grep COLUMLIST
-   ~/.netscape/cookies to see your current COLUMNLIST setting.
-
-   bugs is a simple shell script which calls buglist and extracts the bug
-   numbers from the output. Adding the prefix
-   "http://bugzilla.mozilla.org/buglist.cgi?bug_id=" turns the bug list
-   into a working link if any bugs are found. Counting bugs is easy. Pipe
-   the results through sed -e 's/,/ /g' | wc | awk '{printf $2 "\n"}'
-
-   Akkana says she has good results piping buglist output through w3m -T
-   text/html -dump
-    1. Download three files:
-         a. bash$ wget -O query.conf
-            'http://bugzilla.mozilla.org/showattachment.cgi?attach_id=261
-            57'
-         b. bash$ wget -O buglist
-            'http://bugzilla.mozilla.org/showattachment.cgi?attach_id=269
-            44'
-         c. bash# wget -O bugs
-            'http://bugzilla.mozilla.org/showattachment.cgi?attach_id=262
-            15'
-    2. Make your utilities executable: bash$ chmod u+x buglist bugs
-     _________________________________________________________________
-
-D.4. The Quicksearch Utility
-
-   Quicksearch is a new, experimental feature of the 2.12 release. It
-   consist of two Javascript files, "quicksearch.js" and
-   "localconfig.js", and two documentation files, "quicksearch.html" and
-   "quicksearchhack.html"
-
-   The index.html page has been updated to include the QuickSearch text
-   box.
-
-   To take full advantage of the query power, the Bugzilla maintainer
-   must edit "localconfig.js" according to the value sets used in the
-   local installation.
-
-   Currently, keywords must be hard-coded in localconfig.js. If they are
-   not, keywords are not automatically recognized. This means, if
-   localconfig.js is left unconfigured, that searching for a bug with the
-   "foo" keyword will only find bugs with "foo" in the summary, status
-   whiteboard, product or component name, but not those with the keyword
-   "foo".
-
-   Workarounds for Bugzilla users:
-
-   search for '!foo' (this will find only bugs with the keyword "foo"
-   search 'foo,!foo' (equivalent to 'foo OR keyword:foo')
-
-   When this tool is ported from client-side JavaScript to server-side
-   Perl, the requirement for hard-coding keywords can be fixed. This bug
-   has details.
-     _________________________________________________________________
-
-D.5. Hacking Bugzilla
-
-   What follows are some general guidelines for changing Bugzilla, and
-   adhering to good coding practice while doing so. We've had some
-   checkins in the past which ruined Bugzilla installations because of
-   disregard for these conventions. Sorry for the lack of formatting; I
-   got this info into the Guide on the day of 2.14 release and haven't
-   formatted it yet.
-
-   The following is a guide for reviewers when checking code into Bugzill
-   a's
-   CVS repostory at mozilla.org.  If you wish to submit patches to Bugzil
-   la,
-   you should follow the rules and style conventions below.  Any code tha
-   t
-   does not adhere to these basic rules will not be added to Bugzilla's
-   codebase.
-    1. Usage of variables in Regular Expressions
-       It is very important that you don't use a variable in a regular
-       expression unless that variable is supposed to contain an expressi
-   on.
-       This especially applies when using grep.  You should use:
-       grep ($_ eq $value, @array);
-       - NOT -
-       grep (/$value/, @array);
-       If you need to use a non-expression variable inside of an expressi
-   on, be
-       sure to quote it properly (using \Q..\E).
-   Coding Style for Bugzilla
-   -------------------------
-   While it's true that not all of the code currently in Bugzilla adheres
-    to
-   this styleguide, it is something that is being worked toward.  Therefo
-   re,
-   we ask that all new code (submitted patches and new files) follow this
-    guide
-   as closely as possible (if you're only changing 1 or 2 lines, you don'
-   t have
-   to reformat the entire file :).
-    1. Whitespace
-       Bugzilla's prefered indentation is 4 spaces (no tabs, please).
-    2. Curly braces.
-       The opening brace of a block should be on the same line as the sta
-   tement
-       that is causing the block and the closing brace should be at the s
-   ame
-       indentation level as that statement, for example:
-       if ($var) {
-           print "The variable is true";
-       } else {
-           print "Try again";
-       }
-       - NOT -
-       if ($var)
-       {
-           print "The variable is true";
-       }
-       else
-       {
-           print "Try again";
-       }
-    3. File Names
-       File names for bugzilla code and support documention should be leg
-   al across
-       multiple platforms.  \ / : * ? " < > and | are all illegal charact
-   ers for
-       filenames on various platforms.  Also, file names should not have
-   spaces in
-       them as they can cause confusion in CVS and other mozilla.org util
-   ities.
-    4. Variable Names
-       If a variable is scoped globally ($::variable) its name should be
-   descriptive
-       of what it contains.  Local variables can be named a bit looser, p
-   rovided the
-       context makes their content obvious.  For example, $ret could be u
-   sed as a
-       staging variable for a routine's return value as the line |return
-   $ret;| will
-       make it blatently obvious what the variable holds and most likely
-   be shown
-       on the same screen as |my $ret = "";|.
-    5. Cross Database Compatability
-       Bugzilla was originally written to work with MySQL and therefore t
-   ook advantage
-       of some of its features that aren't contained in other RDBMS softw
-   are.  These
-       should be avoided in all new code.  Examples of these features are
-    enums and
-       encrypt().
-    6. Cross Platform Compatability
-       While Bugzilla was written to be used on Unix based systems (and U
-   nix/Linux is
-       still the only officially supported platform) there are many who d
-   esire/need to
-       run Bugzilla on Microsoft Windows boxes.  Whenever possible, we sh
-   ould strive
-       not to make the lives of these people any more complicated and avo
-   id doing things
-       that break Bugzilla's ability to run on multiple operating systems
-   .
-     _________________________________________________________________
-
-Appendix E. GNU Free Documentation License
-
-   Version 1.1, March 2000
-
-     Copyright (C) 2000 Free Software Foundation, Inc. 59 Temple Place,
-     Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy
-     and distribute verbatim copies of this license document, but
-     changing it is not allowed.
-     _________________________________________________________________
-
-0. PREAMBLE
-
-   The purpose of this License is to make a manual, textbook, or other
-   written document "free" in the sense of freedom: to assure everyone
-   the effective freedom to copy and redistribute it, with or without
-   modifying it, either commercially or noncommercially. Secondarily,
-   this License preserves for the author and publisher a way to get
-   credit for their work, while not being considered responsible for
-   modifications made by others.
-
-   This License is a kind of "copyleft", which means that derivative
-   works of the document must themselves be free in the same sense. It
-   complements the GNU General Public License, which is a copyleft
-   license designed for free software.
-
-   We have designed this License in order to use it for manuals for free
-   software, because free software needs free documentation: a free
-   program should come with manuals providing the same freedoms that the
-   software does. But this License is not limited to software manuals; it
-   can be used for any textual work, regardless of subject matter or
-   whether it is published as a printed book. We recommend this License
-   principally for works whose purpose is instruction or reference.
-     _________________________________________________________________
-
-1. APPLICABILITY AND DEFINITIONS
-
-   This License applies to any manual or other work that contains a
-   notice placed by the copyright holder saying it can be distributed
-   under the terms of this License. The "Document", below, refers to any
-   such manual or work. Any member of the public is a licensee, and is
-   addressed as "you".
-
-   A "Modified Version" of the Document means any work containing the
-   Document or a portion of it, either copied verbatim, or with
-   modifications and/or translated into another language.
-
-   A "Secondary Section" is a named appendix or a front-matter section of
-   the Document that deals exclusively with the relationship of the
-   publishers or authors of the Document to the Document's overall
-   subject (or to related matters) and contains nothing that could fall
-   directly within that overall subject. (For example, if the Document is
-   in part a textbook of mathematics, a Secondary Section may not explain
-   any mathematics.) The relationship could be a matter of historical
-   connection with the subject or with related matters, or of legal,
-   commercial, philosophical, ethical or political position regarding
-   them.
-
-   The "Invariant Sections" are certain Secondary Sections whose titles
-   are designated, as being those of Invariant Sections, in the notice
-   that says that the Document is released under this License.
-
-   The "Cover Texts" are certain short passages of text that are listed,
-   as Front-Cover Texts or Back-Cover Texts, in the notice that says that
-   the Document is released under this License.
-
-   A "Transparent" copy of the Document means a machine-readable copy,
-   represented in a format whose specification is available to the
-   general public, whose contents can be viewed and edited directly and
-   straightforwardly with generic text editors or (for images composed of
-   pixels) generic paint programs or (for drawings) some widely available
-   drawing editor, and that is suitable for input to text formatters or
-   for automatic translation to a variety of formats suitable for input
-   to text formatters. A copy made in an otherwise Transparent file
-   format whose markup has been designed to thwart or discourage
-   subsequent modification by readers is not Transparent. A copy that is
-   not "Transparent" is called "Opaque".
-
-   Examples of suitable formats for Transparent copies include plain
-   ASCII without markup, Texinfo input format, LaTeX input format, SGML
-   or XML using a publicly available DTD, and standard-conforming simple
-   HTML designed for human modification. Opaque formats include
-   PostScript, PDF, proprietary formats that can be read and edited only
-   by proprietary word processors, SGML or XML for which the DTD and/or
-   processing tools are not generally available, and the
-   machine-generated HTML produced by some word processors for output
-   purposes only.
-
-   The "Title Page" means, for a printed book, the title page itself,
-   plus such following pages as are needed to hold, legibly, the material
-   this License requires to appear in the title page. For works in
-   formats which do not have any title page as such, "Title Page" means
-   the text near the most prominent appearance of the work's title,
-   preceding the beginning of the body of the text.
+    2. There are many, many more things you can do with mod_rewrite.
+       Please refer to the mod_rewrite documentation at
+       http://www.apache.org.
      _________________________________________________________________
 
-2. VERBATIM COPYING
-
-   You may copy and distribute the Document in any medium, either
-   commercially or noncommercially, provided that this License, the
-   copyright notices, and the license notice saying this License applies
-   to the Document are reproduced in all copies, and that you add no
-   other conditions whatsoever to those of this License. You may not use
-   technical measures to obstruct or control the reading or further
-   copying of the copies you make or distribute. However, you may accept
-   compensation in exchange for copies. If you distribute a large enough
-   number of copies you must also follow the conditions in section 3.
-
-   You may also lend copies, under the same conditions stated above, and
-   you may publicly display copies.
+C.2. Command-line Bugzilla Queries
+
+There are a suite of Unix utilities for querying Bugzilla from the command
+line. They live in the contrib/cmdline directory. However, they have not yet
+been updated to work with 2.16 (post-templatisation.). There are three files
+- query.conf, buglist and bugs.
+
+query.conf contains the mapping from options to field names and comparison
+types. Quoted option names are "grepped" for, so it should be easy to edit
+this file. Comments (#) have no effect; you must make sure these lines do
+not contain any quoted "option".
+
+buglist is a shell script which submits a Bugzilla query and writes the
+resulting HTML page to stdout. It supports both short options, (such as
+"-Afoo" or "-Rbar") and long options (such as "--assignedto=foo" or
+"--reporter=bar"). If the first character of an option is not "-", it is
+treated as if it were prefixed with "--default=".
+
+The column list is taken from the COLUMNLIST environment variable. This is
+equivalent to the "Change Columns" option when you list bugs in buglist.cgi.
+If you have already used Bugzilla, grep for COLUMNLIST in your cookies file
+to see your current COLUMNLIST setting.
+
+bugs is a simple shell script which calls buglist and extracts the bug
+numbers from the output. Adding the prefix
+"http://bugzilla.mozilla.org/buglist.cgi?bug_id=" turns the bug list into a
+working link if any bugs are found. Counting bugs is easy. Pipe the results
+through sed -e 's/,/ /g' | wc | awk '{printf $2 "\n"}'
+
+Akkana Peck says she has good results piping buglist output through w3m -T
+text/html -dump
      _________________________________________________________________
 
-3. COPYING IN QUANTITY
+Appendix D. Bugzilla Variants and Competitors
 
-   If you publish printed copies of the Document numbering more than 100,
-   and the Document's license notice requires Cover Texts, you must
-   enclose the copies in covers that carry, clearly and legibly, all
-   these Cover Texts: Front-Cover Texts on the front cover, and
-   Back-Cover Texts on the back cover. Both covers must also clearly and
-   legibly identify you as the publisher of these copies. The front cover
-   must present the full title with all words of the title equally
-   prominent and visible. You may add other material on the covers in
-   addition. Copying with changes limited to the covers, as long as they
-   preserve the title of the Document and satisfy these conditions, can
-   be treated as verbatim copying in other respects.
-
-   If the required texts for either cover are too voluminous to fit
-   legibly, you should put the first ones listed (as many as fit
-   reasonably) on the actual cover, and continue the rest onto adjacent
-   pages.
-
-   If you publish or distribute Opaque copies of the Document numbering
-   more than 100, you must either include a machine-readable Transparent
-   copy along with each Opaque copy, or state in or with each Opaque copy
-   a publicly-accessible computer-network location containing a complete
-   Transparent copy of the Document, free of added material, which the
-   general network-using public has access to download anonymously at no
-   charge using public-standard network protocols. If you use the latter
-   option, you must take reasonably prudent steps, when you begin
-   distribution of Opaque copies in quantity, to ensure that this
-   Transparent copy will remain thus accessible at the stated location
-   until at least one year after the last time you distribute an Opaque
-   copy (directly or through your agents or retailers) of that edition to
-   the public.
-
-   It is requested, but not required, that you contact the authors of the
-   Document well before redistributing any large number of copies, to
-   give them a chance to provide you with an updated version of the
-   Document.
+I created this section to answer questions about Bugzilla competitors and
+variants, then found a wonderful site which covers an awful lot of what I
+wanted to discuss. Rather than quote it in its entirety, I'll simply refer
+you here: http://linas.org/linux/pm.html
      _________________________________________________________________
 
-4. MODIFICATIONS
-
-   You may copy and distribute a Modified Version of the Document under
-   the conditions of sections 2 and 3 above, provided that you release
-   the Modified Version under precisely this License, with the Modified
-   Version filling the role of the Document, thus licensing distribution
-   and modification of the Modified Version to whoever possesses a copy
-   of it. In addition, you must do these things in the Modified Version:
-
-    A. Use in the Title Page (and on the covers, if any) a title distinct
-       from that of the Document, and from those of previous versions
-       (which should, if there were any, be listed in the History section
-       of the Document). You may use the same title as a previous version
-       if the original publisher of that version gives permission.
-    B. List on the Title Page, as authors, one or more persons or
-       entities responsible for authorship of the modifications in the
-       Modified Version, together with at least five of the principal
-       authors of the Document (all of its principal authors, if it has
-       less than five).
-    C. State on the Title page the name of the publisher of the Modified
-       Version, as the publisher.
-    D. Preserve all the copyright notices of the Document.
-    E. Add an appropriate copyright notice for your modifications
-       adjacent to the other copyright notices.
-    F. Include, immediately after the copyright notices, a license notice
-       giving the public permission to use the Modified Version under the
-       terms of this License, in the form shown in the Addendum below.
-    G. Preserve in that license notice the full lists of Invariant
-       Sections and required Cover Texts given in the Document's license
-       notice.
-    H. Include an unaltered copy of this License.
-    I. Preserve the section entitled "History", and its title, and add to
-       it an item stating at least the title, year, new authors, and
-       publisher of the Modified Version as given on the Title Page. If
-       there is no section entitled "History" in the Document, create one
-       stating the title, year, authors, and publisher of the Document as
-       given on its Title Page, then add an item describing the Modified
-       Version as stated in the previous sentence.
-    J. Preserve the network location, if any, given in the Document for
-       public access to a Transparent copy of the Document, and likewise
-       the network locations given in the Document for previous versions
-       it was based on. These may be placed in the "History" section. You
-       may omit a network location for a work that was published at least
-       four years before the Document itself, or if the original
-       publisher of the version it refers to gives permission.
-    K. In any section entitled "Acknowledgements" or "Dedications",
-       preserve the section's title, and preserve in the section all the
-       substance and tone of each of the contributor acknowledgements
-       and/or dedications given therein.
-    L. Preserve all the Invariant Sections of the Document, unaltered in
-       their text and in their titles. Section numbers or the equivalent
-       are not considered part of the section titles.
-    M. Delete any section entitled "Endorsements". Such a section may not
-       be included in the Modified Version.
-    N. Do not retitle any existing section as "Endorsements" or to
-       conflict in title with any Invariant Section.
-
-   If the Modified Version includes new front-matter sections or
-   appendices that qualify as Secondary Sections and contain no material
-   copied from the Document, you may at your option designate some or all
-   of these sections as invariant. To do this, add their titles to the
-   list of Invariant Sections in the Modified Version's license notice.
-   These titles must be distinct from any other section titles.
-
-   You may add a section entitled "Endorsements", provided it contains
-   nothing but endorsements of your Modified Version by various
-   parties--for example, statements of peer review or that the text has
-   been approved by an organization as the authoritative definition of a
-   standard.
+D.1. Red Hat Bugzilla
 
-   You may add a passage of up to five words as a Front-Cover Text, and a
-   passage of up to 25 words as a Back-Cover Text, to the end of the list
-   of Cover Texts in the Modified Version. Only one passage of
-   Front-Cover Text and one of Back-Cover Text may be added by (or
-   through arrangements made by) any one entity. If the Document already
-   includes a cover text for the same cover, previously added by you or
-   by arrangement made by the same entity you are acting on behalf of,
-   you may not add another; but you may replace the old one, on explicit
-   permission from the previous publisher that added the old one.
+Red Hat Bugzilla is a fork of Bugzilla 2.8. One of its major benefits is the
+ability to work with Oracle, MySQL, and PostGreSQL databases serving as the
+back-end, instead of just MySQL. Dave Lawrence of Red Hat is active in the
+Bugzilla community, and we hope to see a reunification of the fork before
+too long.
 
-   The author(s) and publisher(s) of the Document do not by this License
-   give permission to use their names for publicity for or to assert or
-   imply endorsement of any Modified Version.
+URL: http://bugzilla.redhat.com/bugzilla/
      _________________________________________________________________
 
-5. COMBINING DOCUMENTS
+D.2. Loki Bugzilla (Fenris)
 
-   You may combine the Document with other documents released under this
-   License, under the terms defined in section 4 above for modified
-   versions, provided that you include in the combination all of the
-   Invariant Sections of all of the original documents, unmodified, and
-   list them all as Invariant Sections of your combined work in its
-   license notice.
-
-   The combined work need only contain one copy of this License, and
-   multiple identical Invariant Sections may be replaced with a single
-   copy. If there are multiple Invariant Sections with the same name but
-   different contents, make the title of each such section unique by
-   adding at the end of it, in parentheses, the name of the original
-   author or publisher of that section if known, or else a unique number.
-   Make the same adjustment to the section titles in the list of
-   Invariant Sections in the license notice of the combined work.
-
-   In the combination, you must combine any sections entitled "History"
-   in the various original documents, forming one section entitled
-   "History"; likewise combine any sections entitled "Acknowledgements",
-   and any sections entitled "Dedications". You must delete all sections
-   entitled "Endorsements."
+Fenris was a fork from Bugzilla made by Loki Games; when Loki went into
+receivership, it died. While Loki's other code lives on, its custodians
+recommend Bugzilla for future bug-tracker deployments.
      _________________________________________________________________
 
-6. COLLECTIONS OF DOCUMENTS
+D.3. Issuezilla
 
-   You may make a collection consisting of the Document and other
-   documents released under this License, and replace the individual
-   copies of this License in the various documents with a single copy
-   that is included in the collection, provided that you follow the rules
-   of this License for verbatim copying of each of the documents in all
-   other respects.
-
-   You may extract a single document from such a collection, and
-   distribute it individually under this License, provided you insert a
-   copy of this License into the extracted document, and follow this
-   License in all other respects regarding verbatim copying of that
-   document.
+Issuezilla was another fork from Bugzilla, made by collab.net and hosted at
+tigris.org. It is also dead; the primary focus of bug-tracking at tigris.org
+is their Java-based bug-tracker, Scarab.
      _________________________________________________________________
 
-7. AGGREGATION WITH INDEPENDENT WORKS
-
-   A compilation of the Document or its derivatives with other separate
-   and independent documents or works, in or on a volume of a storage or
-   distribution medium, does not as a whole count as a Modified Version
-   of the Document, provided no compilation copyright is claimed for the
-   compilation. Such a compilation is called an "aggregate", and this
-   License does not apply to the other self-contained works thus compiled
-   with the Document, on account of their being thus compiled, if they
-   are not themselves derivative works of the Document.
-
-   If the Cover Text requirement of section 3 is applicable to these
-   copies of the Document, then if the Document is less than one quarter
-   of the entire aggregate, the Document's Cover Texts may be placed on
-   covers that surround only the Document within the aggregate. Otherwise
-   they must appear on covers around the whole aggregate.
-     _________________________________________________________________
+D.4. Scarab
 
-8. TRANSLATION
+Scarab is a new open source bug-tracking system built using Java Serlet
+technology. It is currently at version 1.0 beta 8.
 
-   Translation is considered a kind of modification, so you may
-   distribute translations of the Document under the terms of section 4.
-   Replacing Invariant Sections with translations requires special
-   permission from their copyright holders, but you may include
-   translations of some or all Invariant Sections in addition to the
-   original versions of these Invariant Sections. You may include a
-   translation of this License provided that you also include the
-   original English version of this License. In case of a disagreement
-   between the translation and the original English version of this
-   License, the original English version will prevail.
+URL: http://scarab.tigris.org
      _________________________________________________________________
 
-9. TERMINATION
-
-   You may not copy, modify, sublicense, or distribute the Document
-   except as expressly provided for under this License. Any other attempt
-   to copy, modify, sublicense or distribute the Document is void, and
-   will automatically terminate your rights under this License. However,
-   parties who have received copies, or rights, from you under this
-   License will not have their licenses terminated so long as such
-   parties remain in full compliance.
-     _________________________________________________________________
+D.5. Perforce SCM
 
-10. FUTURE REVISIONS OF THIS LICENSE
+Although Perforce isn't really a bug tracker, it can be used as such through
+the "jobs" functionality.
 
-   The Free Software Foundation may publish new, revised versions of the
-   GNU Free Documentation License from time to time. Such new versions
-   will be similar in spirit to the present version, but may differ in
-   detail to address new problems or concerns. See
-   http://www.gnu.org/copyleft/.
-
-   Each version of the License is given a distinguishing version number.
-   If the Document specifies that a particular numbered version of this
-   License "or any later version" applies to it, you have the option of
-   following the terms and conditions either of that specified version or
-   of any later version that has been published (not as a draft) by the
-   Free Software Foundation. If the Document does not specify a version
-   number of this License, you may choose any version ever published (not
-   as a draft) by the Free Software Foundation.
+URL: http://www.perforce.com/perforce/technotes/note052.html 
      _________________________________________________________________
 
-How to use this License for your documents
-
-   To use this License in a document you have written, include a copy of
-   the License in the document and put the following copyright and
-   license notices just after the title page:
-
-     Copyright (c) YEAR YOUR NAME. Permission is granted to copy,
-     distribute and/or modify this document under the terms of the GNU
-     Free Documentation License, Version 1.1 or any later version
-     published by the Free Software Foundation; with the Invariant
-     Sections being LIST THEIR TITLES, with the Front-Cover Texts being
-     LIST, and with the Back-Cover Texts being LIST. A copy of the
-     license is included in the section entitled "GNU Free Documentation
-     License".
+D.6. SourceForge
 
-   If you have no Invariant Sections, write "with no Invariant Sections"
-   instead of saying which ones are invariant. If you have no Front-Cover
-   Texts, write "no Front-Cover Texts" instead of "Front-Cover Texts
-   being LIST"; likewise for Back-Cover Texts.
+SourceForge is a way of coordinating geographically distributed free
+software and open source projects over the Internet. It has a built-in bug
+tracker, but it's not highly thought of.
 
-   If your document contains nontrivial examples of program code, we
-   recommend releasing these examples in parallel under your choice of
-   free software license, such as the GNU General Public License, to
-   permit their use in free software.
+URL: http://www.sourceforge.net
 
 Glossary
 
@@ -6321,13 +4048,10 @@ Glossary
    .htaccess
           Apache web server, and other NCSA-compliant web servers,
           observe the convention of using files in directories called
-          .htaccess files. These restrict parameters of the web server.
-          In Bugzilla, they are used to restrict access to certain files
-          which would otherwise compromise your installation. For
-          instance, the localconfig file contains the password to your
-          database. If this information were generally available, and
-          remote access to your database turned on, you risk corruption
-          of your database by computer criminals or the curious.
+          .htaccess to restrict access to certain files. In Bugzilla,
+          they are used to keep secret files which would otherwise
+          compromise your installation - e.g. the localconfig file
+          contains the password to your database. curious.
 
 A
 
@@ -6342,26 +4066,20 @@ A
 B
 
    Bug
-          A "Bug" in Bugzilla refers to an issue entered into the
+          A "bug" in Bugzilla refers to an issue entered into the
           database which has an associated number, assignments, comments,
           etc. Some also refer to a "tickets" or "issues"; in the context
           of Bugzilla, they are synonymous.
 
    Bug Number
-          Each Bugzilla Bug is assigned a number that uniquely identifies
-          that Bug. The Bug associated with a Bug Number can be pulled up
+          Each Bugzilla bug is assigned a number that uniquely identifies
+          that bug. The bug associated with a bug number can be pulled up
           via a query, or easily from the very front page by typing the
           number in the "Find" box.
 
-   Bug Life Cycle
-          A Bug has stages through which it must pass before becoming a
-          "closed bug", including acceptance, resolution, and
-          verification. The "Bug Life Cycle" is moderately flexible
-          according to the needs of the organization using it, though.
-
    Bugzilla
-          Bugzilla is the industry-standard bug tracking system. It is
-          quite popular among Open Source enthusiasts.
+          Bugzilla is the world-leading free software bug tracking
+          system.
 
    Component
           A Component is a subsection of a Product. It should be a narrow
@@ -6370,12 +4088,10 @@ B
           creating a Product with no Components will create an error in
           Bugzilla).
 
-   CPAN
+   CPAN 
           CPAN stands for the "Comprehensive Perl Archive Network". CPAN
-          maintains a large number of extremely useful Perl modules. By
-          themselves, Perl modules generally do nothing, but when used as
-          part of a larger program, they provide much-needed algorithms
-          and functionality.
+          maintains a large number of extremely useful Perl modules -
+          encapsulated chunks of code for performing a particular task.
 
 D
 
@@ -6388,14 +4104,9 @@ D
 
    Groups
           The word "Groups" has a very special meaning to Bugzilla.
-          Bugzilla's main security mechanism comes by lumping users into
-          groups, and assigning those groups certain privileges to
-          Products and Components in the Bugzilla database.
-
-I
-
-   Infinite Loop
-          A loop of information that never ends; see recursion.
+          Bugzilla's main security mechanism comes by placing users in
+          groups, and assigning those groups certain privileges to view
+          bugs in particular Products in the Bugzilla database.
 
 M
 
@@ -6409,20 +4120,11 @@ M
 P
 
    Product
-          A Product is a broad category of types of bugs. In general,
-          there are several Components to a Product. A Product also
-          defines a default Group (used for Bug Security) for all bugs
-          entered into components beneath it.
-
-          Example 1. A Sample Product
-
-          A company sells a software product called "X". They also
-          maintain some older software called "Y", and have a secret
-          project "Z". An effective use of Products might be to create
-          Products "X", "Y", "Z", each with Components of User Interface,
-          Database, and Business Logic. They might also change group
-          permissions so that only those people who are members of Group
-          "Z" can see components and bugs under Product "Z".
+          A Product is a broad category of types of bugs, normally
+          representing a single piece of software or entity. In general,
+          there are several Components to a Product. A Product may define
+          a group (used for security) for all bugs entered into its
+          Components.
 
    Perl
           First written by Larry Wall, Perl is a remarkable program
@@ -6439,19 +4141,11 @@ Q
           devoted to ensuring the product meets minimum standards before
           shipping. This team will also generally want to track the
           progress of bugs over their life cycle, thus the need for the
-          "QA Contact" field in a Bug.
-
-R
-
-   Recursion
-          The property of a function looking back at itself for
-          something. "GNU", for instance, stands for "GNU's Not UNIX",
-          thus recursing upon itself for definition. For further clarity,
-          see Infinite Loop.
+          "QA Contact" field in a bug.
 
 S
 
-   SGML
+   SGML 
           SGML stands for "Standard Generalized Markup Language". Created
           in the 1980's to provide an extensible means to maintain
           documentation based upon content instead of presentation, SGML
diff --git a/docs/txt/CVS/Entries b/docs/txt/CVS/Entries
index c87ff633b..139c5be93 100644
--- a/docs/txt/CVS/Entries
+++ b/docs/txt/CVS/Entries
@@ -1,2 +1,2 @@
-/Bugzilla-Guide.txt/1.8/Wed Aug 29 18:13:42 2001//TBUGZILLA-2_14_5
+/Bugzilla-Guide.txt/1.14.2.1/Thu Jul 25 21:10:06 2002//TBUGZILLA-2_16
 D
diff --git a/docs/txt/CVS/Tag b/docs/txt/CVS/Tag
index cc64cc0c3..f2ec6389c 100644
--- a/docs/txt/CVS/Tag
+++ b/docs/txt/CVS/Tag
@@ -1 +1 @@
-NBUGZILLA-2_14_5
+NBUGZILLA-2_16
diff --git a/doeditparams.cgi b/doeditparams.cgi
index 0ecd4be76..3e97e140b 100755
--- a/doeditparams.cgi
+++ b/doeditparams.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -23,6 +23,8 @@
 use diagnostics;
 use strict;
 
+use lib qw(.);
+
 require "CGI.pl";
 require "defparams.pl";
 
@@ -31,7 +33,7 @@ use vars %::param,
     %::param_default,
     @::param_list;
 
-
+ConnectToDatabase();
 confirm_login();
 
 print "Content-type: text/html\n\n";
@@ -51,7 +53,7 @@ foreach my $i (@::param_list) {
     if (exists $::FORM{"reset-$i"}) {
         $::FORM{$i} = $::param_default{$i};
     }
-    $::FORM{$i} =~ s/\r\n/\n/g;   # Get rid of windows-style line endings.
+    $::FORM{$i} =~ s/\r\n?/\n/g;   # Get rid of windows/mac-style line endings.
     $::FORM{$i} =~ s/^\n$//;      # assume single linefeed is an empty string
     if ($::FORM{$i} ne Param($i)) {
         if (defined $::param_checker{$i}) {
diff --git a/doeditvotes.cgi b/doeditvotes.cgi
deleted file mode 100755
index 306cdf469..000000000
--- a/doeditvotes.cgi
+++ /dev/null
@@ -1,172 +0,0 @@
-#!/usr/bonsaitools/bin/perl -w
-# -*- Mode: perl; indent-tabs-mode: nil -*-
-#
-# The contents of this file are subject to the Mozilla Public
-# License Version 1.1 (the "License"); you may not use this file
-# except in compliance with the License. You may obtain a copy of
-# the License at http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS
-# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
-# implied. See the License for the specific language governing
-# rights and limitations under the License.
-#
-# The Original Code is the Bugzilla Bug Tracking System.
-#
-# The Initial Developer of the Original Code is Netscape Communications
-# Corporation. Portions created by Netscape are
-# Copyright (C) 1998 Netscape Communications Corporation. All
-# Rights Reserved.
-#
-# Contributor(s): Terry Weissman <terry@mozilla.org>
-#                 Christopher Aillon <christopher@aillon.com>
-
-use diagnostics;
-use strict;
-
-require "CGI.pl";
-
-ConnectToDatabase();
-
-confirm_login();
-
-######################################################################
-# Begin Data/Security Validation
-######################################################################
-
-# Build a list of bug IDs for which votes have been submitted.  Votes
-# are submitted in form fields in which the field names are the bug 
-# IDs and the field values are the number of votes.
-my @buglist = grep {/^[1-9][0-9]*$/} keys(%::FORM);
-
-# If no bugs are in the buglist, let's make sure the user gets notified
-# that their votes will get nuked if they continue.
-if (0 == @buglist) {
-    if (! defined $::FORM{'delete_all_votes'}) {
-        print "Content-type: text/html\n\n";
-        PutHeader("Remove your votes?");
-        print "<p>You are about to remove all of your bug votes. Are you sure you wish to remove your vote from every bug you've voted on?</p>";
-        print qq{<form action="doeditvotes.cgi" method="post">\n};
-        print qq{<p><input type="radio" name="delete_all_votes" value="1"> Yes</p>\n};
-        print qq{<p><input type="radio" name="delete_all_votes" value="0" checked="checked"> No</p>\n};
-        print qq{<p><a href="showvotes.cgi">Review your votes</a></p>\n};
-        print qq{<p><input type="submit" value="Submit"></p></form>\n};
-        PutFooter();
-        exit();
-    }
-    elsif ($::FORM{'delete_all_votes'} == 0) {
-        print "Location: showvotes.cgi\n\n";
-        exit();
-    }
-}
-
-# Call ValidateBugID on each bug ID to make sure it is a positive
-# integer representing an existing bug that the user is authorized 
-# to access, and make sure the number of votes submitted is also
-# a non-negative integer (a series of digits not preceded by a
-# minus sign).
-foreach my $id (@buglist) {
-  ValidateBugID($id);
-  ($::FORM{$id} =~ /^\d+$/)
-    || DisplayError("Only use non-negative numbers for your bug votes.")
-    && exit;
-}
-
-######################################################################
-# End Data/Security Validation
-######################################################################
-
-print "Content-type: text/html\n\n";
-
-GetVersionTable();
-
-my $who = DBNameToIdAndCheck($::COOKIE{'Bugzilla_login'});
-
-if ( (! defined $who) || (!$who) ) {
-    PutHeader("Bad login.");
-    print qq|
-    The login info got confused. Please
-    <a href="query.cgi?GoAheadAndLogIn=1">log in</a>
-    (again) and try again.\n
-    |;
-    PutFooter();
-    exit();
-}
-
-# If the user is voting for bugs, make sure they aren't overstuffing
-# the ballot box.
-if (scalar(@buglist)) {
-    SendSQL("SELECT bugs.bug_id, bugs.product, products.maxvotesperbug " .
-            "FROM bugs, products " .
-            "WHERE products.product = bugs.product ".
-            " AND bugs.bug_id IN (" . join(", ", @buglist) . ")");
-
-    my %prodcount;
-
-    while (MoreSQLData()) {
-        my ($id, $prod, $max) = (FetchSQLData());
-        if (!defined $prodcount{$prod}) {
-            $prodcount{$prod} = 0;
-        }
-        $prodcount{$prod} += $::FORM{$id};
-        if ($::FORM{$id} > $max) {
-            PutHeader("Don't overstuff!", "Illegal vote");
-            print "You may only use at most $max votes for a single bug in the\n";
-            print "<tt>$prod</tt> product, but you are using $::FORM{$id}.\n";
-            print "<P>Please click <b>Back</b> and try again.<hr>\n";
-            PutFooter();
-            exit();
-        }
-    }
-
-    foreach my $prod (keys(%prodcount)) {
-        if ($prodcount{$prod} > $::prodmaxvotes{$prod}) {
-            PutHeader("Don't overstuff!", "Illegal vote");
-            print "You may only use $::prodmaxvotes{$prod} votes for bugs in the\n";
-            print "<tt>$prod</tt> product, but you are using $prodcount{$prod}.\n";
-            print "<P>Please click <b>Back</b> and try again.<hr>\n";
-            PutFooter();
-            exit();
-        }
-    }
-}
-
-# Update the user's votes in the database.  If the user did not submit 
-# any votes, they may be using a form with checkboxes to remove all their
-# votes (checkboxes are not submitted along with other form data when
-# they are not checked, and Bugzilla uses them to represent single votes
-# for products that only allow one vote per bug).  In that case, we still
-# need to clear the user's votes from the database.
-my %affected;
-SendSQL("lock tables bugs write, votes write");
-SendSQL("select bug_id from votes where who = $who");
-while (MoreSQLData()) {
-    my $id = FetchOneColumn();
-    $affected{$id} = 1;
-}
-SendSQL("delete from votes where who = $who");
-foreach my $id (@buglist) {
-    if ($::FORM{$id} > 0) {
-        SendSQL("insert into votes (who, bug_id, count) values ($who, $id, $::FORM{$id})");
-    }
-    $affected{$id} = 1;
-}
-foreach my $id (keys %affected) {
-    SendSQL("select sum(count) from votes where bug_id = $id");
-    my $v = FetchOneColumn();
-    $v ||= 0;
-    SendSQL("update bugs set votes = $v, delta_ts=delta_ts where bug_id = $id");
-}
-SendSQL("unlock tables");
-
-
-PutHeader("Voting tabulated", "Voting tabulated", $::COOKIE{'Bugzilla_login'});
-print "Your votes have been recorded.\n";
-print qq{<p><a href="showvotes.cgi?user=$who">Review your votes</a><hr>\n};
-foreach my $id (keys %affected) {
-    CheckIfVotedConfirmed($id, $who);
-}
-PutFooter();
-exit();
-    
-
diff --git a/duplicates.cgi b/duplicates.cgi
index d1640cbf6..50affa6df 100644
--- a/duplicates.cgi
+++ b/duplicates.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -25,259 +25,187 @@
 
 use diagnostics;
 use strict;
-use CGI "param";
+
 use AnyDBM_File;
+
+use lib qw(.);
+
 require "globals.pl";
 require "CGI.pl";
 
+# Use global templatisation variables.
+use vars qw($template $vars);
+
 ConnectToDatabase(1);
 GetVersionTable();
 
+quietly_check_login();
+
+use vars qw (%FORM $userid $usergroupset @legal_product);
+
 my %dbmcount;
 my %count;
-my $dobefore = 0;
-my $before = "";
 my %before;
 
 # Get params from URL
-
-my $changedsince = 7;     # default one week
-my $maxrows = 100;        # arbitrary limit on max number of rows
-my $sortby = "dup_count"; # default to sorting by dup count
-
-if (defined(param("sortby")))
-{
-  $sortby = param("sortby");
+sub formvalue {
+    my ($name, $default) = (@_);
+    return $FORM{$name} || $default || "";
 }
 
-# Check for changedsince param, and see if it's a positive integer
-if (defined(param("changedsince")) && param("changedsince") =~ /^\d{1,4}$/) 
-{
-  $changedsince = param("changedsince");
-}
+my $sortby = formvalue("sortby");
+my $changedsince = formvalue("changedsince", 7);
+my $maxrows = formvalue("maxrows", 100);
+my $openonly = formvalue("openonly");
+my $reverse = formvalue("reverse");
+my $product = formvalue("product");
+my $sortvisible = formvalue("sortvisible");
+my @buglist = (split(/[:,]/, formvalue("bug_id")));
 
-# check for max rows param, and see if it's a positive integer
-if (defined(param("maxrows")) && param("maxrows") =~ /^\d{1,4}$/)
-{
-  $maxrows = param("maxrows");
-}
-
-# Start the page
-print "Content-type: text/html\n";
-print "\n";
-PutHeader("Most Frequently Reported Bugs");
+# Small backwards-compatibility hack, dated 2002-04-10.
+$sortby = "count" if $sortby eq "dup_count";
 
 # Open today's record of dupes
-my $today = &days_ago(0);
-
-if (<data/duplicates/dupes$today*>)
-{
-  dbmopen(%dbmcount, "data/duplicates/dupes$today", 0644) || 
-                            &die_politely("Can't open today's dupes file: $!");
-}
-else
-{
-  # Try yesterday's, then (in case today's hasn't been created yet)
-  $today = &days_ago(1);
-  if (<data/duplicates/dupes$today*>)
-  {
-    dbmopen(%dbmcount, "data/duplicates/dupes$today", 0644) || 
-                        &die_politely("Can't open yesterday's dupes file: $!");
-  }
-  else
-  {
-    &die_politely("There are no duplicate statistics for today ($today) or yesterday.");
-  }
+my $today = days_ago(0);
+my $yesterday = days_ago(1);
+
+# We don't know the exact file name, because the extention depends on the
+# underlying dbm library, which could be anything. We can't glob, because
+# perl < 5.6 considers if (<*>) { ... } to be tainted
+# Instead, just check the return value for today's data and yesterday's,
+# and ignore file not found errors
+
+use Errno;
+use Fcntl;
+
+if (!tie(%dbmcount, 'AnyDBM_File', "data/duplicates/dupes$today",
+         O_RDONLY, 0644)) {
+    if ($!{ENOENT}) {
+        if (!tie(%dbmcount, 'AnyDBM_File', "data/duplicates/dupes$yesterday",
+                 O_RDONLY, 0644)) {
+            if ($!{ENOENT}) {
+                ThrowUserError("There are no duplicate statistics for today " .
+                               "($today) or yesterday.",
+                               "Cannot find duplicate statistics");
+            } else {
+                ThrowUserError("There are no duplicate statistics for today " .
+                               "($today), and an error occurred when " .
+                               "accessing yesterday's dupes file: $!.",
+                               "Error reading yesterday's dupes file");
+            }
+        }
+    } else {
+        ThrowUserError("An error occurred when accessing today ($today)'s " .
+                       "dupes file: $!.",
+                       "Error reading today's dupes file");
+    }
 }
 
 # Copy hash (so we don't mess up the on-disk file when we remove entries)
 %count = %dbmcount;
-my $key;
-my $value;
+
+# Remove all those dupes under the threshold parameter. 
+# We do this, before the sorting, for performance reasons.
 my $threshold = Param("mostfreqthreshold");
 
-# Remove all those dupes under the threshold (for performance reasons)
-while (($key, $value) = each %count)
-{
-  if ($value < $threshold)
-  {
-    delete $count{$key};
-  } 
+while (my ($key, $value) = each %count) {
+    delete $count{$key} if ($value < $threshold);
 }
 
 # Try and open the database from "changedsince" days ago
-$before = &days_ago($changedsince);    
-
-if (<data/duplicates/dupes$before*>) 
-{
-  dbmopen(%before, "data/duplicates/dupes$before", 0644) && ($dobefore = 1);
-}
-
-print Param("mostfreqhtml");
-
+my $dobefore = 0;
 my %delta;
-
-if ($dobefore) 
-{
-  # Calculate the deltas if we are doing a "before"
-  foreach (keys(%count))
-  {
-    $delta{$_} = $count{$_} - $before{$_};
-  }
-}
-
-# Sort, if required
-my @sortedcount;
-
-if    ($sortby eq "delta")
-{
-  @sortedcount = sort by_delta keys(%count);
-}
-elsif ($sortby eq "bug_no")
-{
-  @sortedcount = reverse sort by_bug_no keys(%count);
-}
-elsif ($sortby eq "dup_count")
-{
-  @sortedcount = sort by_dup_count keys(%count);
-}
-
-my $i = 0;
-
-# Produce a string of bug numbers for a Bugzilla buglist.
-my $commabugs = "";
-foreach (@sortedcount) 
-{
-  last if ($i == $maxrows);
-
-  $commabugs .= ($_ . ",");
-  $i++;  
-}
-
-# Avoid having a comma at the end - Bad Things happen.
-chop $commabugs; 
-
-print qq|
-
-<form method="POST" action="buglist.cgi">
-<input type="hidden" name="bug_id" value="$commabugs">
-<input type="hidden" name="order" value="Reuse same sort as last time">
-Give this to me as a <input type="submit" value="Bug List">. (Note: the order may not be the same.)
-</form>
-
-<table BORDER>
-<tr BGCOLOR="#CCCCCC">
-
-<td><center><b>
-<a href="duplicates.cgi?sortby=bug_no&maxrows=$maxrows&changedsince=$changedsince">Bug #</a>
-</b></center></td>
-<td><center><b>
-<a href="duplicates.cgi?sortby=dup_count&maxrows=$maxrows&changedsince=$changedsince">Dupe<br>Count</a>
-</b></center></td>\n|;
-
-if ($dobefore) 
-{
-  print "<td><center><b>
-  <a href=\"duplicates.cgi?sortby=delta&maxrows=$maxrows&changedsince=$changedsince\">Change in
-  last<br>$changedsince day(s)</a></b></center></td>";
-}
-
-print "
-<td><center><b>Component</b></center></td>
-<td><center><b>Severity</b></center></td>
-<td><center><b>Op Sys</b></center></td>
-<td><center><b>Target<br>Milestone</b></center></td>
-<td><center><b>Summary</b></center></td>
-</tr>\n\n";
-
-$i = 0;
-
-foreach (@sortedcount)
-{
-  my $id = $_;
-  SendSQL("SELECT component, bug_severity, op_sys, target_milestone, short_desc, groupset, bug_status, resolution" .
-                 " FROM bugs WHERE bug_id = $id");
-  my ($component, $severity, $op_sys, $milestone, $summary, $groupset, $bug_status, $resolution) = FetchSQLData();
-  next unless $groupset == 0;
-  $summary = html_quote($summary);
-
-  # Show all bugs except those CLOSED _OR_ VERIFIED but not INVALID or WONTFIX.
-  # We want to see VERIFIED INVALID and WONTFIX because common "bugs" which aren't
-  # bugs end up in this state.
-  unless ( ($bug_status eq "CLOSED") || ( ($bug_status eq "VERIFIED") &&
-          ! ( ($resolution eq "INVALID") || ($resolution eq "WONTFIX") ) ) ) {
-    print "<tr>";
-    print '<td><center>';
-    if  ( ($bug_status eq "RESOLVED") || ($bug_status eq "VERIFIED") ) {
-      print "<strike>";
-    }
-    print "<A HREF=\"show_bug.cgi?id=" . $id . "\">";
-    print $id . "</A>";
-    if  ( ($bug_status eq "RESOLVED") || ($bug_status eq "VERIFIED") ) {
-      print "</strike>";
+my $whenever = days_ago($changedsince);    
+
+if (!tie(%before, 'AnyDBM_File', "data/duplicates/dupes$whenever",
+         O_RDONLY, 0644)) {
+    # Ignore file not found errors
+    if (!$!{ENOENT}) {
+        ThrowUserError("Can't open $changedsince days ago ($whenever)'s " .
+                       "dupes file: $!",
+                       "Error reading previous dupes file");
     }
-    print "</center></td>";
-    print "<td><center>$count{$id}</center></td>";
-    if ($dobefore) 
-    {
-      print "<td><center>$delta{$id}</center></td>";
-    }
-    print "<td>$component</td>\n    ";
-    print "<td><center>$severity</center></td>";
-    print "<td><center>$op_sys</center></td>";
-    print "<td><center>$milestone</center></td>";
-    print "<td>$summary</td>";
-    print "</tr>\n";
-
-    $i++;
-  }
-
-  if ($i == $maxrows)
-  {
-    last;
-  }
-}
-
-print "</table><br><br>";
-PutFooter();
-
-
-sub by_bug_no 
-{
-  return ($a <=> $b);
-}
-
-sub by_dup_count 
-{
-  return -($count{$a} <=> $count{$b});
-}
-
-sub by_delta 
-{
-  return -($delta{$a} <=> $delta{$b});
-}
-
-sub days_ago 
-{
-  my ($dom, $mon, $year) = (localtime(time - ($_[0]*24*60*60)))[3, 4, 5];
-  return sprintf "%04d-%02d-%02d", 1900 + $year, ++$mon, $dom;
-}
-
-sub die_politely {
-  my $msg = shift;
-
-  print <<FIN;
-<p>
-<table border=1 cellpadding=10>
-<tr>
-<td align=center>
-<font color=blue>$msg</font>
-</td>
-</tr>
-</table>
-<p>
-FIN
-    
-  PutFooter();
-  exit;
+} else {
+    # Calculate the deltas
+    ($delta{$_} = $count{$_} - $before{$_}) foreach (keys(%count));
+
+    $dobefore = 1;
+}
+
+# Don't add CLOSED, and don't add VERIFIED unless they are INVALID or 
+# WONTFIX. We want to see VERIFIED INVALID and WONTFIX because common 
+# "bugs" which aren't bugs end up in this state.
+my $generic_query = "
+  SELECT component, bug_severity, op_sys, target_milestone,
+         short_desc, bug_status, resolution
+  FROM bugs 
+  WHERE (bug_status != 'CLOSED') 
+  AND   ((bug_status = 'VERIFIED' AND resolution IN ('INVALID', 'WONTFIX')) 
+         OR (bug_status != 'VERIFIED'))
+  AND ";
+
+# Limit to a single product if requested             
+$generic_query .= (" product = " . SqlQuote($product) . " AND ") if $product;
+ 
+my @bugs;
+my @bug_ids; 
+my $loop = 0;
+
+foreach my $id (keys(%count)) {
+    # Maximum row count is dealt with in the template.
+    # If there's a buglist, restrict the bugs to that list.
+    next if $sortvisible && $buglist[0] && (lsearch(\@buglist, $id) == -1);
+
+    SendSQL(SelectVisible("$generic_query bugs.bug_id = $id", 
+                           $userid, 
+                           $usergroupset));
+                           
+    next unless MoreSQLData();
+    my ($component, $bug_severity, $op_sys, $target_milestone, 
+        $short_desc, $bug_status, $resolution) = FetchSQLData();
+
+    # Limit to open bugs only if requested
+    next if $openonly && ($resolution ne "");
+
+    push (@bugs, { id => $id,
+                   count => $count{$id},
+                   delta => $delta{$id}, 
+                   component => $component,
+                   bug_severity => $bug_severity,
+                   op_sys => $op_sys,
+                   target_milestone => $target_milestone,
+                   short_desc => $short_desc,
+                   bug_status => $bug_status, 
+                   resolution => $resolution });
+    push (@bug_ids, $id); 
+    $loop++;                
+}
+
+$vars->{'bugs'} = \@bugs;
+$vars->{'bug_ids'} = \@bug_ids;
+
+$vars->{'dobefore'} = $dobefore;
+$vars->{'sortby'} = $sortby;
+$vars->{'sortvisible'} = $sortvisible;
+$vars->{'changedsince'} = $changedsince;
+$vars->{'maxrows'} = $maxrows;
+$vars->{'openonly'} = $openonly;
+$vars->{'reverse'} = $reverse;
+$vars->{'format'} = $::FORM{'format'};
+$vars->{'product'} = $product;
+$vars->{'products'} = \@::legal_product;
+
+
+my $format = ValidateOutputFormat($::FORM{'format'}, "duplicates", "reports");
+ 
+print "Content-Type: $format->{'contenttype'}\n\n";
+
+# Generate and return the UI (HTML page) from the appropriate template.
+$template->process("reports/$format->{'template'}", $vars)
+  || ThrowTemplateError($template->error());
+
+
+sub days_ago {
+    my ($dom, $mon, $year) = (localtime(time - ($_[0]*24*60*60)))[3, 4, 5];
+    return sprintf "%04d-%02d-%02d", 1900 + $year, ++$mon, $dom;
 }
diff --git a/editattachstatuses.cgi b/editattachstatuses.cgi
new file mode 100755
index 000000000..910379b99
--- /dev/null
+++ b/editattachstatuses.cgi
@@ -0,0 +1,344 @@
+#!/usr/bonsaitools/bin/perl -w
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is the Bugzilla Bug Tracking System.
+#
+# The Initial Developer of the Original Code is Netscape Communications
+# Corporation. Portions created by Netscape are
+# Copyright (C) 1998 Netscape Communications Corporation. All
+# Rights Reserved.
+#
+# Contributor(s): Terry Weissman <terry@mozilla.org>
+#                 Myk Melez <myk@mozilla.org>
+
+################################################################################
+# Script Initialization
+################################################################################
+
+# Make it harder for us to do dangerous things in Perl.
+use diagnostics;
+use strict;
+use lib ".";
+
+use vars qw(
+  $template
+  $vars
+);
+
+# Include the Bugzilla CGI and general utility library.
+require "CGI.pl";
+
+# Establish a connection to the database backend.
+ConnectToDatabase();
+
+# Make sure the user is logged in and is allowed to edit products
+# (i.e. the user has "editcomponents" privileges), since attachment
+# statuses are product-specific.
+confirm_login();
+UserInGroup("editcomponents")
+  || DisplayError("You are not authorized to administer attachment statuses.")
+  && exit;
+
+################################################################################
+# Main Body Execution
+################################################################################
+
+# All calls to this script should contain an "action" variable whose value
+# determines what the user wants to do.  The code below checks the value of
+# that variable and runs the appropriate code.
+
+# Determine whether to use the action specified by the user or the default.
+my $action = $::FORM{'action'} || 'list';
+
+if ($action eq "list") 
+{ 
+  list(); 
+} 
+elsif ($action eq "create") 
+{ 
+  create(); 
+} 
+elsif ($action eq "insert") 
+{ 
+  validateName();
+  validateDescription();
+  validateSortKey();
+  validateProduct();
+  insert();
+}
+elsif ($action eq "edit") 
+{ 
+  edit(); 
+} 
+elsif ($action eq "update") 
+{ 
+  validateID();
+  validateName();
+  validateDescription();
+  validateSortKey();
+  update();
+}
+elsif ($action eq "confirmdelete") 
+{ 
+  validateID();
+  confirmDelete();
+} 
+elsif ($action eq "delete")
+{
+  validateID();
+  deleteStatus();
+}
+else 
+{ 
+  DisplayError("I could not figure out what you wanted to do.")
+}
+
+exit;
+
+################################################################################
+# Data Validation
+################################################################################
+
+sub validateID
+{
+  $::FORM{'id'} =~ /^[1-9][0-9]*$/
+    || DisplayError("The status ID is not a positive integer.") 
+      && exit;
+  
+  SendSQL("SELECT 1 FROM attachstatusdefs WHERE id = $::FORM{'id'}");
+  my ($defexists) = FetchSQLData();
+  $defexists
+    || DisplayError("The status with ID #$::FORM{'id'} does not exist.") 
+      && exit;
+}
+
+sub validateName
+{
+  $::FORM{'name'}
+    || DisplayError("You must enter a name for the status.")
+      && exit;
+
+  $::FORM{'name'} !~ /[\s,]/
+    || DisplayError("The status name cannot contain commas or whitespace.")
+      && exit;
+
+  length($::FORM{'name'}) <= 50
+    || DisplayError("The status name cannot be more than 50 characters long.")
+      && exit;
+}
+
+sub validateDescription
+{
+  $::FORM{'desc'}
+    || DisplayError("You must enter a description of the status.")
+      && exit;
+}
+
+sub validateSortKey
+{
+  $::FORM{'sortkey'} =~ /^\d+$/
+    && $::FORM{'sortkey'} < 32768
+      || DisplayError("The sort key must be an integer between 0 and 32767 inclusive.") 
+        && exit;
+}
+
+sub validateProduct
+{
+  # Retrieve a list of products.
+  SendSQL("SELECT product FROM products");
+  my @products;
+  push(@products, FetchSQLData()) while MoreSQLData();
+
+  grep($_ eq $::FORM{'product'}, @products)
+    || DisplayError("You must select an existing product for the status.") 
+      && exit;
+}
+
+################################################################################
+# Functions
+################################################################################
+
+sub list
+{
+  # Administer attachment status flags, which is the set of status flags 
+  # that can be applied to an attachment.
+
+  # If the user is seeing this screen as a result of doing something to
+  # an attachment status flag, display a message about what happened
+  # to that flag (i.e. "The attachment status flag was updated.").
+  my ($message) = (@_);
+
+  # Retrieve a list of attachment status flags and create an array of hashes
+  # in which each hash contains the data for one flag.
+  SendSQL("SELECT id, name, description, sortkey, product, count(statusid)
+           FROM attachstatusdefs LEFT JOIN attachstatuses 
+                ON attachstatusdefs.id=attachstatuses.statusid
+           GROUP BY id
+           ORDER BY sortkey");
+  my @statusdefs;
+  while ( MoreSQLData() )
+  {
+    my ($id, $name, $description, $sortkey, $product, $attachcount) = FetchSQLData();
+    push @statusdefs, { 'id' => $id , 'name' => $name , 'description' => $description , 
+                        'sortkey' => $sortkey , 'product' => $product, 
+                        'attachcount' => $attachcount };
+  }
+
+  # Define the variables and functions that will be passed to the UI template.
+  $vars->{'message'} = $message;
+  $vars->{'statusdefs'} = \@statusdefs;
+
+  # Return the appropriate HTTP response headers.
+  print "Content-type: text/html\n\n";
+
+  # Generate and return the UI (HTML page) from the appropriate template.
+  $template->process("admin/attachstatus/list.html.tmpl", $vars)
+    || ThrowTemplateError($template->error());
+}
+
+
+sub create
+{
+  # Display a form for creating a new attachment status flag.
+
+  # Retrieve a list of products to which the attachment status may apply.
+  SendSQL("SELECT product FROM products");
+  my @products;
+  push(@products, FetchSQLData()) while MoreSQLData();
+
+  # Define the variables and functions that will be passed to the UI template.
+  $vars->{'products'} = \@products;
+
+  # Return the appropriate HTTP response headers.
+  print "Content-type: text/html\n\n";
+
+  # Generate and return the UI (HTML page) from the appropriate template.
+  $template->process("admin/attachstatus/create.html.tmpl", $vars)
+    || ThrowTemplateError($template->error());
+}
+
+
+sub insert
+{
+  # Insert a new attachment status flag into the database.
+
+  # Quote the flag's name and description as appropriate for inclusion
+  # in a SQL statement.
+  my $name = SqlQuote($::FORM{'name'});
+  my $desc = SqlQuote($::FORM{'desc'});
+  my $product = SqlQuote($::FORM{'product'});
+
+  SendSQL("LOCK TABLES attachstatusdefs WRITE");
+  SendSQL("SELECT MAX(id) FROM attachstatusdefs");
+  my $id = FetchSQLData() || 0;
+  $id++;
+  SendSQL("INSERT INTO attachstatusdefs (id, name, description, sortkey, product)
+           VALUES ($id, $name, $desc, $::FORM{'sortkey'}, $product)");
+  SendSQL("UNLOCK TABLES");
+
+  # Display the "administer attachment status flags" page
+  # along with a message that the flag has been created.
+  list("The attachment status has been created.");
+}
+
+
+sub edit
+{
+  # Display a form for editing an existing attachment status flag.
+
+  # Retrieve the definition from the database.
+  SendSQL("SELECT name, description, sortkey, product 
+           FROM attachstatusdefs WHERE id = $::FORM{'id'}");
+  my ($name, $desc, $sortkey, $product) = FetchSQLData();
+
+  # Define the variables and functions that will be passed to the UI template.
+  $vars->{'id'} = $::FORM{'id'}; 
+  $vars->{'name'} = $name; 
+  $vars->{'desc'} = $desc; 
+  $vars->{'sortkey'} = $sortkey; 
+  $vars->{'product'} = $product; 
+
+  # Return the appropriate HTTP response headers.
+  print "Content-type: text/html\n\n";
+
+  # Generate and return the UI (HTML page) from the appropriate template.
+  $template->process("admin/attachstatus/edit.html.tmpl", $vars)
+    || ThrowTemplateError($template->error());
+}
+
+
+sub update
+{
+  # Update an attachment status flag in the database.
+
+  # Quote the flag's name and description as appropriate for inclusion
+  # in a SQL statement.
+  my $name = SqlQuote($::FORM{'name'});
+  my $desc = SqlQuote($::FORM{'desc'});
+
+  SendSQL("LOCK TABLES attachstatusdefs WRITE");
+  SendSQL("
+           UPDATE  attachstatusdefs 
+           SET     name = $name , 
+                   description = $desc , 
+                   sortkey = $::FORM{'sortkey'} 
+           WHERE   id = $::FORM{'id'}
+         ");
+  SendSQL("UNLOCK TABLES");
+
+  # Display the "administer attachment status flags" page
+  # along with a message that the flag has been updated.
+  list("The attachment status has been updated.");
+}
+
+sub confirmDelete 
+{
+  # check if we need confirmation to delete:
+
+  SendSQL("SELECT COUNT(attach_id), name 
+           FROM attachstatusdefs LEFT JOIN attachstatuses
+                ON attachstatuses.statusid=attachstatusdefs.id
+           WHERE statusid = $::FORM{'id'}
+           GROUP BY attachstatuses.statusid;");
+  
+  my ($attachcount, $name) = FetchSQLData();
+
+  if ($attachcount > 0) {
+
+    $vars->{'id'} = $::FORM{'id'};
+    $vars->{'attachcount'} = $attachcount;
+    $vars->{'name'} = $name;
+
+    print "Content-type: text/html\n\n";
+    
+    $template->process("admin/attachstatus/delete.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
+  } 
+  else {
+    deleteStatus();
+  }
+}
+
+sub deleteStatus
+{
+  # Delete an attachment status flag from the database.
+
+  SendSQL("LOCK TABLES attachstatusdefs WRITE, attachstatuses WRITE");
+  SendSQL("DELETE FROM attachstatuses WHERE statusid = $::FORM{'id'}");
+  SendSQL("DELETE FROM attachstatusdefs WHERE id = $::FORM{'id'}");
+  SendSQL("UNLOCK TABLES");
+
+  # Display the "administer attachment status flags" page
+  # along with a message that the flag has been deleted.
+  list("The attachment status has been deleted.");
+}
diff --git a/editcomponents.cgi b/editcomponents.cgi
index 30f9dd4ea..4f76593df 100755
--- a/editcomponents.cgi
+++ b/editcomponents.cgi
@@ -19,7 +19,7 @@
 # Rights Reserved.
 #
 # Contributor(s): Holger Schurig <holgerschurig@nikocity.de>
-#               Terry Weissman <terry@mozilla.org>
+#                 Terry Weissman <terry@mozilla.org>
 #
 # Direct any questions on this source code to
 #
@@ -27,6 +27,7 @@
 
 use diagnostics;
 use strict;
+use lib ".";
 
 require "CGI.pl";
 require "globals.pl";
@@ -187,6 +188,7 @@ sub PutTrailer (@)
 # Preliminary checks:
 #
 
+ConnectToDatabase();
 confirm_login();
 
 print "Content-type: text/html\n\n";
@@ -394,10 +396,6 @@ if ($action eq 'new') {
     }
 
     my $initialowner = trim($::FORM{initialowner} || '');
-	#
-	# Now validating to make sure it's too an existing account
-	#
-	DBNameToIdAndCheck($initialowner);
 
     if ($initialowner eq '') {
         print "You must enter an initial owner for the component '$component'. Please press\n";
@@ -418,23 +416,12 @@ if ($action eq 'new') {
     my $initialqacontact = trim($::FORM{initialqacontact} || '');
     my $initialqacontactid = DBname_to_id ($initialqacontact);
     if (Param('useqacontact')) {
-        if ($initialqacontact eq '') {
-            print "You must enter an initial QA contact for the component '$component'. Please press\n";
-            print "<b>Back</b> and try again.\n";
-            PutTrailer($localtrailer);
-            exit;
-        }
-
-        if (!$initialqacontactid) {
+        if (!$initialqacontactid && $initialqacontact ne '') {
             print "You must use an existing Bugzilla account as initial QA contact for the component '$component'. Please press\n";
             print "<b>Back</b> and try again.\n";
             PutTrailer($localtrailer);
             exit;
         }
-	#
-	# Now validating to make sure it's too an existing account
-	#
-	DBNameToIdAndCheck($initialqacontact);
     }
 
     # Add the new component
@@ -487,9 +474,9 @@ if ($action eq 'del') {
 
     my $initialowner = $initialownerid ? DBID_to_name ($initialownerid) : "<FONT COLOR=\"red\">missing</FONT>";
     my $initialqacontact = $initialqacontactid ? DBID_to_name ($initialqacontactid) : "<FONT COLOR=\"red\">missing</FONT>";
-
+    my $milestonelink = $milestoneurl ? "<A HREF=\"$milestoneurl\">$milestoneurl</A>"
+                                      : "<FONT COLOR=\"red\">missing</FONT>";
     $pdesc            ||= "<FONT COLOR=\"red\">missing</FONT>";
-    $milestoneurl     ||= "<FONT COLOR=\"red\">missing</FONT>";
     $disallownew        = $disallownew ? 'closed' : 'open';
     $cdesc            ||= "<FONT COLOR=\"red\">missing</FONT>";
     
@@ -530,7 +517,7 @@ if ($action eq 'del') {
     if (Param('usetargetmilestone')) {
          print "</TR><TR>\n";
          print "  <TD VALIGN=\"top\">Milestone URL:</TD>\n";
-         print "  <TD VALIGN=\"top\"><A HREF=\"$milestoneurl\">$milestoneurl</A></TD>\n";
+         print "  <TD VALIGN=\"top\">$milestonelink</TD>\n";
     }
 
     print "</TR><TR>\n";
@@ -732,7 +719,7 @@ if ($action eq 'update') {
         unless ($description) {
             print "Sorry, I can't delete the description.";
             PutTrailer($localtrailer);
-	    SendSQL("UNLOCK TABLES");
+            SendSQL("UNLOCK TABLES");
             exit;
         }
         SendSQL("UPDATE components
@@ -746,7 +733,7 @@ if ($action eq 'update') {
     if ($initialowner ne $initialownerold) {
         unless ($initialowner) {
             print "Sorry, I can't delete the initial owner.";
-	    SendSQL("UNLOCK TABLES");
+            SendSQL("UNLOCK TABLES");
             PutTrailer($localtrailer);
             exit;
         }
@@ -767,15 +754,8 @@ if ($action eq 'update') {
     }
 
     if (Param('useqacontact') && $initialqacontact ne $initialqacontactold) {
-        unless ($initialqacontact) {
-            print "Sorry, I can't delete the initial QA contact.";
-	    SendSQL("UNLOCK TABLES");
-            PutTrailer($localtrailer);
-            exit;
-        }
-
         my $initialqacontactid = DBname_to_id($initialqacontact);
-        unless ($initialqacontactid) {
+        if (!$initialqacontactid && $initialqacontact ne '') {
             print "Sorry, you must use an existing Bugzilla account as initial QA contact.";
             SendSQL("UNLOCK TABLES");
             PutTrailer($localtrailer);
@@ -794,18 +774,19 @@ if ($action eq 'update') {
         unless ($component) {
             print "Sorry, I can't delete the product name.";
             PutTrailer($localtrailer);
-	    SendSQL("UNLOCK TABLES");
+            SendSQL("UNLOCK TABLES");
             exit;
         }
         if (TestComponent($product,$component)) {
             print "Sorry, component name '$component' is already in use.";
             PutTrailer($localtrailer);
-	    SendSQL("UNLOCK TABLES");
+            SendSQL("UNLOCK TABLES");
             exit;
         }
 
         SendSQL("UPDATE bugs
-                 SET component=" . SqlQuote($component) . "
+                 SET component=" . SqlQuote($component) . ",
+                 delta_ts = delta_ts
                  WHERE component=" . SqlQuote($componentold) . "
                    AND product=" . SqlQuote($product));
         SendSQL("UPDATE components
diff --git a/editgroups.cgi b/editgroups.cgi
index 1626fc3a4..9c93363c0 100755
--- a/editgroups.cgi
+++ b/editgroups.cgi
@@ -25,9 +25,11 @@
 
 use diagnostics;
 use strict;
+use lib ".";
 
 require "CGI.pl";
 
+ConnectToDatabase();
 confirm_login();
 
 print "Content-type: text/html\n\n";
@@ -50,8 +52,8 @@ sub TestGroup ($)
 
     # does the group exist?
     SendSQL("SELECT name
-	     FROM groups
-	     WHERE name=" . SqlQuote($group));
+             FROM groups
+             WHERE name=" . SqlQuote($group));
     return FetchOneColumn();
 }
 
@@ -76,17 +78,17 @@ sub PutTrailer (@)
     my $num = 0;
     print "<P>\n";
     foreach (@links) {
-	print $_;
-	if ($num == $count) {
-	    print ".\n";
-	}
-	elsif ($num == $count-1) {
-	    print " or ";
-	}
-	else {
-	    print ", ";
-	}
-	$num++;
+        print $_;
+        if ($num == $count) {
+            print ".\n";
+        }
+        elsif ($num == $count-1) {
+            print " or ";
+        }
+        else {
+            print ", ";
+        }
+        $num++;
     }
     PutFooter();
 }
@@ -141,8 +143,7 @@ unless ($action) {
     print "<p>";
     print "<b>Name</b> is what is used with the UserInGroup() function in any
 customized cgi files you write that use a given group.  It can also be used by
-people submitting bugs by email to limit a bug to a certain groupset.  It
-may not contain any spaces.<p>";
+people submitting bugs by email to limit a bug to a certain groupset. <p>";
     print "<b>Description</b> is what will be shown in the bug reports to
 members of the group where they can choose whether the bug will be restricted
 to others in the same group.<p>";
@@ -276,7 +277,7 @@ if ($action eq 'new') {
         ShowError("The group '" . $name . "' already exists.<BR>" .
                   "Please click the <b>Back</b> button and try again.");
         PutFooter();
-	exit;
+        exit;
     }
 
     if ($isactive != 0 && $isactive != 1) {
@@ -284,7 +285,7 @@ if ($action eq 'new') {
                   "a problem with Bugzilla or a bug in your browser.<br>" . 
                   "Please click the <b>Back</b> button and try again.");
         PutFooter();
-	exit;
+        exit;
     }
 
     # Major hack for bit values...  perl can't handle 64-bit ints, so I can't
@@ -519,7 +520,7 @@ if ($action eq 'delete') {
     }
     SendSQL("SELECT bug_id FROM bugs WHERE (groupset & $bit)");
     if (FetchOneColumn()) {
-      SendSQL("UPDATE bugs SET groupset=(groupset-$bit) " .
+      SendSQL("UPDATE bugs SET groupset=(groupset-$bit), delta_ts=delta_ts " .
               "WHERE (groupset & $bit)");
       print "All bugs have had group bit $bit cleared.  Any of these " .
             "bugs that were not also in another group are now " .
diff --git a/editkeywords.cgi b/editkeywords.cgi
index a58efb02c..51294206d 100755
--- a/editkeywords.cgi
+++ b/editkeywords.cgi
@@ -22,6 +22,7 @@
 
 use diagnostics;
 use strict;
+use lib ".";
 
 require "CGI.pl";
 
@@ -107,6 +108,7 @@ sub Validate ($$) {
 # Preliminary checks:
 #
 
+ConnectToDatabase();
 confirm_login();
 
 print "Content-type: text/html\n\n";
@@ -404,7 +406,7 @@ sub RebuildCacheWarning {
 
     print "<BR><BR><B>You have deleted or modified a keyword. You must rebuild the keyword cache!<BR></B>";
     print "You can rebuild the cache using sanitycheck.cgi. On very large installations of Bugzilla,<BR>";
-    print "This can take several minutes.<BR><BR><B><A HREF=sanitycheck.cgi?rebuildkeywordcache=1>Rebuild cache</HREF><BR></B>";
+    print "This can take several minutes.<BR><BR><B><A HREF=\"sanitycheck.cgi?rebuildkeywordcache=1\">Rebuild cache</A><BR></B>";
 
 }
 
diff --git a/editmilestones.cgi b/editmilestones.cgi
index 4ceda927a..fccf72533 100755
--- a/editmilestones.cgi
+++ b/editmilestones.cgi
@@ -15,6 +15,7 @@
 
 use diagnostics;
 use strict;
+use lib ".";
 
 require "CGI.pl";
 require "globals.pl";
@@ -145,6 +146,7 @@ sub PutTrailer (@)
 # Preliminary checks:
 #
 
+ConnectToDatabase();
 confirm_login();
 
 print "Content-type: text/html\n\n";
@@ -520,17 +522,18 @@ if ($action eq 'update') {
         unless ($milestone) {
             print "Sorry, I can't delete the milestone text.";
             PutTrailer($localtrailer);
-	    SendSQL("UNLOCK TABLES");
+            SendSQL("UNLOCK TABLES");
             exit;
         }
         if (TestMilestone($product,$milestone)) {
             print "Sorry, milestone '$milestone' is already in use.";
             PutTrailer($localtrailer);
-	    SendSQL("UNLOCK TABLES");
+            SendSQL("UNLOCK TABLES");
             exit;
         }
         SendSQL("UPDATE bugs
-                 SET target_milestone=" . SqlQuote($milestone) . "
+                 SET target_milestone=" . SqlQuote($milestone) . ",
+                 delta_ts=delta_ts
                  WHERE target_milestone=" . SqlQuote($milestoneold) . "
                    AND product=" . SqlQuote($product));
         SendSQL("UPDATE milestones
diff --git a/editparams.cgi b/editparams.cgi
index e416184f6..40f5ad537 100755
--- a/editparams.cgi
+++ b/editparams.cgi
@@ -23,6 +23,7 @@
 
 use diagnostics;
 use strict;
+use lib ".";
 
 require "CGI.pl";
 require "defparams.pl";
@@ -31,6 +32,7 @@ require "defparams.pl";
 use vars @::param_desc,
     @::param_list;
 
+ConnectToDatabase();
 confirm_login();
 
 print "Content-type: text/html\n\n";
@@ -61,16 +63,16 @@ foreach my $i (@::param_list) {
     print "<tr><td valign=top><input type=checkbox name=reset-$i>Reset</td><td>\n";
     my $value = Param($i);
     SWITCH: for ($::param_type{$i}) {
-	/^t$/ && do {
+        /^t$/ && do {
             print "<input size=80 name=$i value=\"" .
                 value_quote($value) . "\">\n";
             last SWITCH;
-	};
-	/^l$/ && do {
+        };
+        /^l$/ && do {
             print "<textarea wrap=hard name=$i rows=10 cols=80>" .
                 value_quote($value) . "</textarea>\n";
             last SWITCH;
-	};
+        };
         /^b$/ && do {
             my $on;
             my $off;
diff --git a/editproducts.cgi b/editproducts.cgi
index 0b2c93338..1b3441a8a 100755
--- a/editproducts.cgi
+++ b/editproducts.cgi
@@ -29,6 +29,7 @@
 
 use diagnostics;
 use strict;
+use lib ".";
 
 require "CGI.pl";
 require "globals.pl";
@@ -99,7 +100,7 @@ sub EmitFormElements ($$$$$$$$$)
     if (Param('usetargetmilestone')) {
         $milestoneurl = value_quote($milestoneurl);
         print "</TR><TR>\n";
-        print "  <TH ALIGN=\"right\">Milestone URL:</TH>\n";
+        print "  <TH ALIGN=\"right\">URL describing milestones for this product:</TH>\n";
         print "  <TD><INPUT TYPE=TEXT SIZE=64 MAXLENGTH=255 NAME=\"milestoneurl\" VALUE=\"$milestoneurl\"></TD>\n";
 
         print "</TR><TR>\n";
@@ -174,6 +175,7 @@ sub PutTrailer (@)
 # Preliminary checks:
 #
 
+ConnectToDatabase();
 confirm_login();
 
 print "Content-type: text/html\n\n";
@@ -326,51 +328,6 @@ if ($action eq 'new') {
     $votestoconfirm ||= 0;
     my $defaultmilestone = $::FORM{defaultmilestone} || "---";
 
-
-    # find the next bit first in case this operation fails; we don't calculate
-    # this by hand; table stolen from editgroups.cgi; see bug 167485
-    my $bit = "";
-    if(Param("usebuggroups")) {
-        my @bitvals = ('1','2','4','8','16','32','64','128','256','512','1024',
-                       '2048','4096','8192','16384','32768',
-    
-                       '65536','131072','262144','524288','1048576','2097152',
-                       '4194304','8388608','16777216','33554432','67108864',
-                       '134217728','268435456','536870912','1073741824',
-                       '2147483648',
-
-                       '4294967296','8589934592','17179869184','34359738368',
-                       '68719476736','137438953472','274877906944',
-                       '549755813888','1099511627776','2199023255552',
-                       '4398046511104','8796093022208','17592186044416',
-                       '35184372088832','70368744177664','140737488355328',
-
-                       '281474976710656','562949953421312','1125899906842624',
-                       '2251799813685248','4503599627370496','9007199254740992',
-                       '18014398509481984','36028797018963968','72057594037927936',
-                       '144115188075855872','288230376151711744',
-                       '576460752303423488','1152921504606846976',
-                       '2305843009213693952','4611686018427387904');
-    
-        # First the next available bit
-        foreach my $bv (@bitvals) {
-            if ($bit eq "") {
-                SendSQL("SELECT bit FROM groups WHERE bit=" . SqlQuote($bv));
-                if (!FetchOneColumn()) { 
-                    $bit = $bv; 
-                }
-            }
-        }
-        if ($bit eq "") {
-            ShowError("Sorry, you already have the maximum number of groups " .
-                      "defined.<BR><BR>You must delete a group first before you " .
-                      "can add any more.</B>");
-            PutTrailer("<a href=editgroups.cgi>Back to the group list</a>");
-            exit;
-        }
-    }
-        
-
     # Add the new product.
     SendSQL("INSERT INTO products ( " .
             "product, description, milestoneurl, disallownew, votesperuser, " .
@@ -394,6 +351,16 @@ if ($action eq 'new') {
     # If we're using bug groups, then we need to create a group for this
     # product as well.  -JMR, 2/16/00
     if(Param("usebuggroups")) {
+        # First we need to figure out the bit for this group.  We'll simply
+        # use the next highest bit available.  We'll use a minimum bit of 256,
+        # to leave room for a few more Bugzilla operation groups at the bottom.
+        SendSQL("SELECT MAX(bit) FROM groups");
+        my $bit = FetchOneColumn();
+        if($bit < 256) {
+            $bit = 256;
+        } else {
+            $bit = $bit * 2;
+        }
         
         # Next we insert into the groups table
         SendSQL("INSERT INTO groups " .
@@ -453,6 +420,8 @@ if ($action eq 'del') {
              FROM products
              WHERE product=" . SqlQuote($product));
     my ($description, $milestoneurl, $disallownew) = FetchSQLData();
+    my $milestonelink = $milestoneurl ? "<a href=\"$milestoneurl\">$milestoneurl</a>"
+                                      : "<font color=\"red\">missing</font>";
     $description ||= "<FONT COLOR=\"red\">description missing</FONT>";
     $disallownew = $disallownew ? 'closed' : 'open';
     
@@ -472,7 +441,7 @@ if ($action eq 'del') {
     if (Param('usetargetmilestone')) {
         print "</TR><TR>\n";
         print "  <TD VALIGN=\"top\">Milestone URL:</TD>\n";
-        print "  <TD VALIGN=\"top\"><A HREF=\"$milestoneurl\">$milestoneurl</A></TD>\n";
+        print "  <TD VALIGN=\"top\">$milestonelink</TD>\n";
     }
 
     # Added -JMR, 2/16/00
@@ -725,7 +694,7 @@ if ($action eq 'edit') {
         SendSQL("SELECT userregexp
                  FROM groups
                  WHERE name=" . SqlQuote($product));
-        $userregexp = FetchOneColumn();
+        $userregexp = FetchOneColumn() || "";
     }
 
     print "<FORM METHOD=POST ACTION=editproducts.cgi>\n";
@@ -1037,15 +1006,15 @@ if ($action eq 'update') {
             exit;
         }
 
-        SendSQL("UPDATE bugs SET product=$qp WHERE product=$qpold");
+        SendSQL("UPDATE bugs SET product=$qp, delta_ts=delta_ts WHERE product=$qpold");
         SendSQL("UPDATE components SET program=$qp WHERE program=$qpold");
         SendSQL("UPDATE products SET product=$qp WHERE product=$qpold");
         SendSQL("UPDATE versions SET program=$qp WHERE program=$qpold");
         SendSQL("UPDATE milestones SET product=$qp WHERE product=$qpold");
-	# Need to do an update to groups as well.  If there is a corresponding
-	# bug group, whether usebuggroups is currently set or not, we want to
-	# update it so it will match in the future.  If there is no group, this
-	# update statement will do nothing, so no harm done.  -JMR, 3/8/00
+        # Need to do an update to groups as well.  If there is a corresponding
+        # bug group, whether usebuggroups is currently set or not, we want to
+        # update it so it will match in the future.  If there is no group, this
+        # update statement will do nothing, so no harm done.  -JMR, 3/8/00
         SendSQL("UPDATE groups " .
                 "SET name=$qp, " .
                 "description=".SqlQuote($product." Bugs Access")." ".
diff --git a/editusers.cgi b/editusers.cgi
index 2db93e4ac..f9800c704 100755
--- a/editusers.cgi
+++ b/editusers.cgi
@@ -29,6 +29,7 @@
 
 use diagnostics;
 use strict;
+use lib ".";
 
 require "CGI.pl";
 require "globals.pl";
@@ -56,8 +57,8 @@ sub TestUser ($)
 
     # does the product exist?
     SendSQL("SELECT login_name
-	     FROM profiles
-	     WHERE login_name=" . SqlQuote($user));
+             FROM profiles
+             WHERE login_name=" . SqlQuote($user));
     return FetchOneColumn();
 }
 
@@ -67,15 +68,15 @@ sub CheckUser ($)
 
     # do we have a product?
     unless ($user) {
-	print "Sorry, you haven't specified a user.";
+        print "Sorry, you haven't specified a user.";
         PutTrailer();
-	exit;
+        exit;
     }
 
     unless (TestUser $user) {
-	print "Sorry, user '$user' does not exist.";
+        print "Sorry, user '$user' does not exist.";
         PutTrailer();
-	exit;
+        exit;
     }
 }
 
@@ -145,17 +146,17 @@ sub EmitFormElements ($$$$$)
                 print "</TR><TR>\n<TD ALIGN=CENTER><B>|</B></TD>\n";
             }
             print "<TD COLSPAN=2 ALIGN=LEFT><B>User is a member of these groups</B></TD>\n";
-        }
-        while (MoreSQLData()) {
-            my ($bit,$name,$description,$checked,$blchecked) = FetchSQLData();
-            print "</TR><TR>\n";
-            if ($editall) {
-                $blchecked = ($blchecked) ? "CHECKED" : "";
-                print "<TD ALIGN=CENTER><INPUT TYPE=CHECKBOX NAME=\"blbit_$name\" $blchecked VALUE=\"$bit\"></TD>";
+            while (MoreSQLData()) {
+                my ($bit,$name,$description,$checked,$blchecked) = FetchSQLData();
+                print "</TR><TR>\n";
+                if ($editall) {
+                    $blchecked = ($blchecked) ? "CHECKED" : "";
+                    print "<TD ALIGN=CENTER><INPUT TYPE=CHECKBOX NAME=\"blbit_$name\" $blchecked VALUE=\"$bit\"></TD>";
+                }
+                $checked = ($checked) ? "CHECKED" : "";
+                print "<TD ALIGN=CENTER><INPUT TYPE=CHECKBOX NAME=\"bit_$name\" $checked VALUE=\"$bit\"></TD>";
+                print "<TD><B>" . ucfirst($name) . "</B>: $description</TD>\n";
             }
-            $checked = ($checked) ? "CHECKED" : "";
-            print "<TD ALIGN=CENTER><INPUT TYPE=CHECKBOX NAME=\"bit_$name\" $checked VALUE=\"$bit\"></TD>";
-            print "<TD><B>" . ucfirst($name) . "</B>: $description</TD>\n";
         }
         print "</TR></TABLE></TD>\n";
     
@@ -170,21 +171,21 @@ sub EmitFormElements ($$$$$)
                 print "<TD COLSPAN=3 ALIGN=LEFT><B>Can turn this bit on for other users</B></TD>\n";
                 print "</TR><TR>\n<TD ALIGN=CENTER><B>|</B></TD>\n";
             }
-            print "<TD COLSPAN=2 ALIGN=LEFT><B>User has these priveleges</B></TD>\n";
-        }
-        while (MoreSQLData()) {
-            my ($bit,$name,$description,$checked,$blchecked) = FetchSQLData();
-            print "</TR><TR>\n";
-            if ($editall) {
-                $blchecked = ($blchecked) ? "CHECKED" : "";
-                print "<TD ALIGN=CENTER><INPUT TYPE=CHECKBOX NAME=\"blbit_$name\" $blchecked VALUE=\"$bit\"></TD>";
+            print "<TD COLSPAN=2 ALIGN=LEFT><B>User has these privileges</B></TD>\n";
+            while (MoreSQLData()) {
+                my ($bit,$name,$description,$checked,$blchecked) = FetchSQLData();
+                print "</TR><TR>\n";
+                if ($editall) {
+                    $blchecked = ($blchecked) ? "CHECKED" : "";
+                    print "<TD ALIGN=CENTER><INPUT TYPE=CHECKBOX NAME=\"blbit_$name\" $blchecked VALUE=\"$bit\"></TD>";
+                }
+                $checked = ($checked) ? "CHECKED" : "";
+                print "<TD ALIGN=CENTER><INPUT TYPE=CHECKBOX NAME=\"bit_$name\" $checked VALUE=\"$bit\"></TD>";
+                print "<TD><B>" . ucfirst($name) . "</B>: $description</TD>\n";
             }
-            $checked = ($checked) ? "CHECKED" : "";
-            print "<TD ALIGN=CENTER><INPUT TYPE=CHECKBOX NAME=\"bit_$name\" $checked VALUE=\"$bit\"></TD>";
-            print "<TD><B>" . ucfirst($name) . "</B>: $description</TD>\n";
         }
     } else {
-        print "</TR><TR><TH ALIGN=RIGHT>Groups and<br>Priveleges:</TH><TD><TABLE><TR>";        
+        print "</TR><TR><TH ALIGN=RIGHT>Groups and<br>Privileges:</TH><TD><TABLE><TR>";        
         print "<TD COLSPAN=3>The new user will be inserted into groups " .
           "based on their userregexps.<BR>To change the group " .
           "permissions for this user, you must edit the account after ".
@@ -202,23 +203,24 @@ sub EmitFormElements ($$$$$)
 
 sub PutTrailer (@)
 {
-    my (@links) = ("Back to the <A HREF=\"./\">index</A>", @_);
+    my (@links) = ("Back to the <A HREF=\"./\">index</A>",
+        "<A HREF=\"editusers.cgi?action=add\">Add a new user</A>", @_);
 
     my $count = $#links;
     my $num = 0;
     print "<P>\n";
     foreach (@links) {
-	print $_;
-	if ($num == $count) {
-	    print ".\n";
-	}
-	elsif ($num == $count-1) {
-	    print " or ";
-	}
-	else {
-	    print ", ";
-	}
-	$num++;
+        print $_;
+        if ($num == $count) {
+            print ".\n";
+        }
+        elsif ($num == $count-1) {
+            print " or ";
+        }
+        else {
+            print ", ";
+        }
+        $num++;
     }
     PutFooter();
 }
@@ -229,6 +231,7 @@ sub PutTrailer (@)
 # Preliminary checks:
 #
 
+ConnectToDatabase();
 confirm_login();
 
 print "Content-type: text/html\n\n";
@@ -292,20 +295,25 @@ List users with login name matching:
 if ($action eq 'list') {
     PutHeader("Select user");
     my $query = "";
+    my $matchstr = $::FORM{'matchstr'};
     if (exists $::FORM{'matchtype'}) {
       $query = "SELECT login_name,realname,disabledtext " .
           "FROM profiles WHERE login_name ";
       if ($::FORM{'matchtype'} eq 'substr') {
           $query .= "like";
-          $::FORM{'matchstr'} = '%' . $::FORM{'matchstr'} . '%';
+          $matchstr = '%' . $matchstr . '%';
       } elsif ($::FORM{'matchtype'} eq 'regexp') {
           $query .= "regexp";
+          $matchstr = '.'
+                unless $matchstr;
       } elsif ($::FORM{'matchtype'} eq 'notregexp') {
           $query .= "not regexp";
+          $matchstr = '.'
+                unless $matchstr;
       } else {
           die "Unknown match type";
       }
-      $query .= SqlQuote($::FORM{'matchstr'}) . " ORDER BY login_name";
+      $query .= SqlQuote($matchstr) . " ORDER BY login_name";
     } elsif (exists $::FORM{'query'}) {
       $query = "SELECT login_name,realname,disabledtext " .
           "FROM profiles WHERE " . $::FORM{'query'} . " ORDER BY login_name";
@@ -329,21 +337,21 @@ if ($action eq 'list') {
         if ($count % 100 == 0) {
             print "</table>$header";
         }
-	my ($user, $realname, $disabledtext) = FetchSQLData();
+        my ($user, $realname, $disabledtext) = FetchSQLData();
         my $s = "";
         my $e = "";
         if ($disabledtext) {
             $s = "<STRIKE>";
             $e = "</STRIKE>";
         }
-	$realname = ($realname ? html_quote($realname) : "<FONT COLOR=\"red\">missing</FONT>");
-	print "<TR>\n";
-	print "  <TD VALIGN=\"top\"><A HREF=\"editusers.cgi?action=edit&user=", url_quote($user), "\"><B>$s$user$e</B></A></TD>\n";
-	print "  <TD VALIGN=\"top\">$s$realname$e</TD>\n";
+        $realname = ($realname ? html_quote($realname) : "<FONT COLOR=\"red\">missing</FONT>");
+        print "<TR>\n";
+        print "  <TD VALIGN=\"top\"><A HREF=\"editusers.cgi?action=edit&user=", url_quote($user), "\"><B>$s$user$e</B></A></TD>\n";
+        print "  <TD VALIGN=\"top\">$s$realname$e</TD>\n";
         if ($candelete) {
             print "  <TD VALIGN=\"top\"><A HREF=\"editusers.cgi?action=del&user=", url_quote($user), "\">Delete</A></TD>\n";
         }
-	print "</TR>";
+        print "</TR>";
     }
     if ($editall && !Param('useLDAP')) {
         print "<TR>\n";
@@ -445,11 +453,11 @@ if ($action eq 'new') {
         PutTrailer($localtrailer);
         exit;
     }
-    if (TestUser($user)) {
-	print "The user '$user' does already exist. Please press\n";
-	print "<b>Back</b> and try again.\n";
+    if (!ValidateNewUser($user)) {
+        print "The user '$user' does already exist. Please press\n";
+        print "<b>Back</b> and try again.\n";
         PutTrailer($localtrailer);
-	exit;
+        exit;
     }
     my $passworderror = ValidatePassword($password);
     if ( $passworderror ) {
@@ -503,7 +511,7 @@ if ($action eq 'new') {
     print "To change ${user}'s permissions, go back and <a href=\"editusers.cgi?action=edit&user=" . url_quote($user)."\">edit this user</A>";
     print "<p>\n";
     PutTrailer($localtrailer,
-	"<a href=\"editusers.cgi?action=add\">add</a> another user.");
+        "<a href=\"editusers.cgi?action=add\">add</a> another user.");
     exit;
 
 }
@@ -532,7 +540,7 @@ if ($action eq 'del') {
 
     # display some data about the user
     SendSQL("SELECT realname, groupset FROM profiles
-	     WHERE login_name=" . SqlQuote($user));
+             WHERE login_name=" . SqlQuote($user));
     my ($realname, $groupset) = 
       FetchSQLData();
     $realname = ($realname ? html_quote($realname) : "<FONT COLOR=\"red\">missing</FONT>");
@@ -554,12 +562,12 @@ if ($action eq 'del') {
     print "  <TD VALIGN=\"top\">Group set:</TD>\n";
     print "  <TD VALIGN=\"top\">";
     SendSQL("SELECT name
-	     FROM groups
+             FROM groups
              WHERE bit & $groupset = bit
-	     ORDER BY isbuggroup, name");
+             ORDER BY isbuggroup, name");
     my $found = 0;
     while ( MoreSQLData() ) {
-	my ($name) = FetchSQLData();
+        my ($name) = FetchSQLData();
         print "<br>\n" if $found;
         print ucfirst $name;
         $found = 1;
@@ -572,23 +580,23 @@ if ($action eq 'del') {
     my $nodelete = '';
 
     SendSQL("SELECT program, value
-	     FROM components
+             FROM components
              WHERE initialowner=" . DBname_to_id($user));
     $found = 0;
     while (MoreSQLData()) {
-	if ($found) {
-	    print "<BR>\n";
-	} else {
-	    print "<TR>\n";
-	    print "  <TD VALIGN=\"top\">Initial owner:</TD>\n";
-	    print "  <TD VALIGN=\"top\">";
-	}
-	my ($product, $component) = FetchSQLData();
-	print "<a href=\"editcomponents.cgi?product=", url_quote($product),
-		"&component=", url_quote($component),
-		"&action=edit\">$product: $component</a>";
-	$found    = 1;
-	$nodelete = 'initial bug owner';
+        if ($found) {
+            print "<BR>\n";
+        } else {
+            print "<TR>\n";
+            print "  <TD VALIGN=\"top\">Initial owner:</TD>\n";
+            print "  <TD VALIGN=\"top\">";
+        }
+        my ($product, $component) = FetchSQLData();
+        print "<a href=\"editcomponents.cgi?product=", url_quote($product),
+                "&component=", url_quote($component),
+                "&action=edit\">$product: $component</a>";
+        $found    = 1;
+        $nodelete = 'initial bug owner';
     }
     print "</TD>\n</TR>" if $found;
 
@@ -596,23 +604,23 @@ if ($action eq 'del') {
     # Check if the user is an initialqacontact
 
     SendSQL("SELECT program, value
-	     FROM components
+             FROM components
              WHERE initialqacontact=" . DBname_to_id($user));
     $found = 0;
     while (MoreSQLData()) {
-	if ($found) {
-	    print "<BR>\n";
-	} else {
-	    print "<TR>\n";
-	    print "  <TD VALIGN=\"top\">Initial QA contact:</TD>\n";
-	    print "  <TD VALIGN=\"top\">";
-	}
-	my ($product, $component) = FetchSQLData();
-	print "<a href=\"editcomponents.cgi?product=", url_quote($product),
-		"&component=", url_quote($component),
-		"&action=edit\">$product: $component</a>";
-	$found    = 1;
-	$nodelete = 'initial QA contact';
+        if ($found) {
+            print "<BR>\n";
+        } else {
+            print "<TR>\n";
+            print "  <TD VALIGN=\"top\">Initial QA contact:</TD>\n";
+            print "  <TD VALIGN=\"top\">";
+        }
+        my ($product, $component) = FetchSQLData();
+        print "<a href=\"editcomponents.cgi?product=", url_quote($product),
+                "&component=", url_quote($component),
+                "&action=edit\">$product: $component</a>";
+        $found    = 1;
+        $nodelete = 'initial QA contact';
     }
     print "</TD>\n</TR>" if $found;
 
@@ -620,10 +628,10 @@ if ($action eq 'del') {
 
 
     if ($nodelete) {
-	print "<P>You can't delete this user because '$user' is an $nodelete ",
-	      "for at least one product.";
-	PutTrailer($localtrailer);
-	exit;
+        print "<P>You can't delete this user because '$user' is an $nodelete ",
+              "for at least one product.";
+        PutTrailer($localtrailer);
+        exit;
     }
 
 
@@ -661,14 +669,14 @@ if ($action eq 'delete') {
     CheckUser($user);
 
     SendSQL("SELECT userid
-	     FROM profiles
-	     WHERE login_name=" . SqlQuote($user));
+             FROM profiles
+             WHERE login_name=" . SqlQuote($user));
     my $userid = FetchOneColumn();
 
     SendSQL("DELETE FROM profiles
-	     WHERE login_name=" . SqlQuote($user));
+             WHERE login_name=" . SqlQuote($user));
     SendSQL("DELETE FROM logincookies
-	     WHERE userid=" . $userid);
+             WHERE userid=" . $userid);
     print "User deleted.<BR>\n";
 
     PutTrailer($localtrailer);
@@ -689,8 +697,8 @@ if ($action eq 'edit') {
 
     # get data of user
     SendSQL("SELECT realname, groupset, blessgroupset, disabledtext
-	     FROM profiles
-	     WHERE login_name=" . SqlQuote($user));
+             FROM profiles
+             WHERE login_name=" . SqlQuote($user));
     my ($realname, $groupset, $blessgroupset,
         $disabledtext) = FetchSQLData();
 
@@ -736,17 +744,17 @@ if ($action eq 'update') {
 
     my $groupset = "0";
     foreach (keys %::FORM) {
-	next unless /^bit_/;
-	#print "$_=$::FORM{$_}<br>\n";
+        next unless /^bit_/;
+        #print "$_=$::FORM{$_}<br>\n";
         detaint_natural($::FORM{$_}) || die "Groupset field tampered with";
-	$groupset .= " + $::FORM{$_}";
+        $groupset .= " + $::FORM{$_}";
     }
     my $blessgroupset = "0";
     foreach (keys %::FORM) {
-	next unless /^blbit_/;
-	#print "$_=$::FORM{$_}<br>\n";
+        next unless /^blbit_/;
+        #print "$_=$::FORM{$_}<br>\n";
         detaint_natural($::FORM{$_}) || die "Blessgroupset field tampered with";
-	$blessgroupset .= " + $::FORM{$_}";
+        $blessgroupset .= " + $::FORM{$_}";
     }
 
     CheckUser($userold);
@@ -784,15 +792,15 @@ if ($action eq 'update') {
                        "($u, $::userid, now(), $fieldid, " .
                        " $groupsetold, $groupset)");
            }
-	   print "Updated permissions.\n";
+           print "Updated permissions.\n";
        }
     }
 
     if ($editall && $blessgroupset ne $blessgroupsetold) {
         SendSQL("UPDATE profiles
-		 SET blessgroupset=" . $blessgroupset . "
-		 WHERE login_name=" . SqlQuote($userold));
-	print "Updated ability to tweak permissions of other users.\n";
+                 SET blessgroupset=" . $blessgroupset . "
+                 WHERE login_name=" . SqlQuote($userold));
+        print "Updated ability to tweak permissions of other users.\n";
     }
 
     # Update the database with the user's new password if they changed it.
@@ -804,6 +812,11 @@ if ($action eq 'update') {
             SendSQL("UPDATE  profiles
                      SET     cryptpassword = $cryptpassword
                      WHERE   login_name = $loginname");
+            SendSQL("SELECT userid
+                     FROM profiles
+                     WHERE login_name=" . SqlQuote($userold));
+            my $userid = FetchOneColumn();
+            InvalidateLogins($userid);
             print "Updated password.<BR>\n";
         } else {
             print "Did not update password: $passworderror<br>\n";
@@ -811,39 +824,38 @@ if ($action eq 'update') {
     }
     if ($editall && $realname ne $realnameold) {
         SendSQL("UPDATE profiles
-		 SET realname=" . SqlQuote($realname) . "
-		 WHERE login_name=" . SqlQuote($userold));
-	print "Updated real name.<BR>\n";
+                 SET realname=" . SqlQuote($realname) . "
+                 WHERE login_name=" . SqlQuote($userold));
+        print "Updated real name.<BR>\n";
     }
     if ($editall && $disabledtext ne $disabledtextold) {
         SendSQL("UPDATE profiles
-		 SET disabledtext=" . SqlQuote($disabledtext) . "
-		 WHERE login_name=" . SqlQuote($userold));
+                 SET disabledtext=" . SqlQuote($disabledtext) . "
+                 WHERE login_name=" . SqlQuote($userold));
         SendSQL("SELECT userid
-	         FROM profiles
-	         WHERE login_name=" . SqlQuote($user));
+                 FROM profiles
+                 WHERE login_name=" . SqlQuote($userold));
         my $userid = FetchOneColumn();
-        SendSQL("DELETE FROM logincookies
-	         WHERE userid=" . $userid);
-	print "Updated disabled text.<BR>\n";
+        InvalidateLogins($userid);
+        print "Updated disabled text.<BR>\n";
     }
     if ($editall && $user ne $userold) {
-	unless ($user) {
-	    print "Sorry, I can't delete the user's name.";
+        unless ($user) {
+            print "Sorry, I can't delete the user's name.";
             PutTrailer($localtrailer);
-	    exit;
+            exit;
         }
-	if (TestUser($user)) {
-	    print "Sorry, user name '$user' is already in use.";
+        if (TestUser($user)) {
+            print "Sorry, user name '$user' is already in use.";
             PutTrailer($localtrailer);
-	    exit;
+            exit;
         }
 
         SendSQL("UPDATE profiles
-		 SET login_name=" . SqlQuote($user) . "
-		 WHERE login_name=" . SqlQuote($userold));
+                 SET login_name=" . SqlQuote($user) . "
+                 WHERE login_name=" . SqlQuote($userold));
 
-	print "Updated user's name.<BR>\n";
+        print "Updated user's name.<BR>\n";
     }
 
     PutTrailer($localtrailer);
diff --git a/editversions.cgi b/editversions.cgi
index 0ca0b932c..950d597a7 100755
--- a/editversions.cgi
+++ b/editversions.cgi
@@ -28,6 +28,7 @@
 
 use diagnostics;
 use strict;
+use lib ".";
 
 require "CGI.pl";
 require "globals.pl";
@@ -154,6 +155,7 @@ sub PutTrailer (@)
 # Preliminary checks:
 #
 
+ConnectToDatabase();
 confirm_login();
 
 print "Content-type: text/html\n\n";
@@ -519,17 +521,18 @@ if ($action eq 'update') {
         unless ($version) {
             print "Sorry, I can't delete the version text.";
             PutTrailer($localtrailer);
-	    SendSQL("UNLOCK TABLES");
+            SendSQL("UNLOCK TABLES");
             exit;
         }
         if (TestVersion($product,$version)) {
             print "Sorry, version '$version' is already in use.";
             PutTrailer($localtrailer);
-	    SendSQL("UNLOCK TABLES");
+            SendSQL("UNLOCK TABLES");
             exit;
         }
         SendSQL("UPDATE bugs
-                 SET version=" . SqlQuote($version) . "
+                 SET version=" . SqlQuote($version) . ",
+                 delta_ts = delta_ts
                  WHERE version=" . SqlQuote($versionold) . "
                    AND product=" . SqlQuote($product));
         SendSQL("UPDATE versions
diff --git a/enter_bug.cgi b/enter_bug.cgi
index 91622590c..726179722 100755
--- a/enter_bug.cgi
+++ b/enter_bug.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -20,468 +20,369 @@
 # Contributor(s): Terry Weissman <terry@mozilla.org>
 #                 Dave Miller <justdave@syndicomm.com>
 #                 Joe Robins <jmrobins@tgix.com>
+#                 Gervase Markham <gerv@gerv.net>
 
-
-########################################################################
+##############################################################################
 #
 # enter_bug.cgi
 # -------------
 # Displays bug entry form. Bug fields are specified through popup menus, 
-# drop-down lists, or text fields. Default for these values can be passed
-# in as parameters to the cgi.
+# drop-down lists, or text fields. Default for these values can be 
+# passed in as parameters to the cgi.
 #
-########################################################################
+##############################################################################
 
 use diagnostics;
 use strict;
 
-require "CGI.pl";
-
-# Shut up misguided -w warnings about "used only once".  "use vars" just
-# doesn't work for me.
+use lib qw(.);
 
-sub sillyness {
-    my $zz;
-    $zz = $::unconfirmedstate;
-    $zz = @::legal_opsys;
-    $zz = @::legal_platform;
-    $zz = @::legal_priority;
-    $zz = @::legal_severity;
-}
+require "CGI.pl";
 
-# I've moved the call to confirm_login up to here, since if we're using bug
-# groups to restrict bug entry, we need to know who the user is right from
-# the start.  If that parameter is turned off, there's still no harm done in
-# doing it now instead of a bit later.  -JMR, 2/18/00
-# Except that it will cause people without cookies enabled to have to log
-# in an extra time.  Only do it here if we really need to.  -terry, 3/10/00
-if (Param("usebuggroupsentry")) {
-    confirm_login();
-}
+use vars qw(
+  $unconfirmedstate
+  $template
+  $vars
+  %COOKIE
+  @enterable_products
+  @legal_opsys
+  @legal_platform
+  @legal_priority
+  @legal_severity
+  %MFORM
+  %versions
+);
+
+# We have to connect to the database, even though we don't use it in this code,
+# because we might occasionally rebuild the version cache, which causes tokens
+# to get deleted from the database, which needs a database connection.
+ConnectToDatabase();
+
+# If we're using bug groups to restrict bug entry, we need to know who the 
+# user is right from the start. 
+confirm_login() if (Param("usebuggroupsentry"));
 
 if (!defined $::FORM{'product'}) {
     GetVersionTable();
-    my @prodlist;
-    foreach my $p (sort(keys %::versions)) {
-        if (defined $::proddesc{$p} && $::proddesc{$p} eq '0') {
-            # Special hack.  If we stuffed a "0" into proddesc, that means
-            # that disallownew was set for this bug, and so we don't want
-            # to allow people to specify that product here.
-            next;
-        }
-        if(Param("usebuggroupsentry")
-           && GroupExists($p)
-           && !UserInGroup($p)) {
-          # If we're using bug groups to restrict entry on products, and
-          # this product has a bug group, and the user is not in that
-          # group, we don't want to include that product in this list.
-          next;
-        }
-        push(@prodlist, $p);
-    }
-    if (0 == @prodlist) {
-        print "Content-type: text/html\n\n";
-        PutHeader("No Products Available");
+    quietly_check_login();
 
-        print "Either no products have been defined to enter bugs against ";
-        print "or you have not been given access to any.  Please email ";
-        print "<A HREF=\"mailto:" . Param("maintainer") . "\">";
-        print Param("maintainer") . "</A> if you feel this is in error.<P>\n";
+    my %products;
 
-        PutFooter();
-        exit;
-    } elsif (1 < @prodlist) {
-        print "Content-type: text/html\n\n";
-        PutHeader("Enter Bug");
-        
-        print "<H2>First, you must pick a product on which to enter\n";
-        print "a bug.</H2>\n";
-        print "<table>";
-        foreach my $p (@prodlist) {
-# removed $::proddesc{$p} eq '0' check and UserInGroup($p) check from here
-# because it's redundant.  See the foreach loop above that created @prodlist.
-# 1/13/01 - dave@intrec.com
-            print "<tr><th align=right valign=top><a href=\"enter_bug.cgi?product=" . url_quote($p) . "\">$p</a>:</th>\n";
-            if (defined $::proddesc{$p}) {
-                print "<td valign=top>$::proddesc{$p}</td>\n";
-            }
-            print "</tr>";
+    foreach my $p (@enterable_products) {
+        if (!(Param("usebuggroupsentry") 
+              && GroupExists($p) 
+              && !UserInGroup($p)))
+        {
+            $products{$p} = $::proddesc{$p};
         }
-        print "</table>\n";
-        PutFooter();
+    }
+ 
+    my $prodsize = scalar(keys %products);
+    if ($prodsize == 0) {
+        DisplayError("Either no products have been defined to enter bugs ".
+                     "against or you have not been given access to any.\n");
         exit;
+    } 
+    elsif ($prodsize > 1) {
+        $vars->{'proddesc'} = \%products;
+
+        $vars->{'target'} = "enter_bug.cgi";
+        $vars->{'format'} = $::FORM{'format'};
+        $vars->{'title'} = "Enter Bug";
+        $vars->{'h2'} = 
+                    "First, you must pick a product on which to enter a bug.";
+        
+        print "Content-type: text/html\n\n";
+        $template->process("global/choose-product.html.tmpl", $vars)
+          || ThrowTemplateError($template->error());
+        exit;        
     }
-    $::FORM{'product'} = $prodlist[0];
-}
 
-my $product = $::FORM{'product'};
+    $::FORM{'product'} = (keys %products)[0];
+    $::MFORM{'product'} = [$::FORM{'product'}];
 
-confirm_login();
+}
 
-print "Content-type: text/html\n\n";
+my $product = $::FORM{'product'};
 
+##############################################################################
+# Useful Subroutines
+##############################################################################
 sub formvalue {
     my ($name, $default) = (@_);
-    if (exists $::FORM{$name}) {
-        return $::FORM{$name};
-    }
-    if (defined $default) {
-        return $default;
-    }
-    return "";
+    return $::FORM{$name} || $default || "";
 }
 
 sub pickplatform {
-    my $value = formvalue("rep_platform");
-    if ($value ne "") {
-        return $value;
-    }
+    return formvalue("rep_platform") if formvalue("rep_platform");
+
     if ( Param('usebrowserinfo') ) {
         for ($ENV{'HTTP_USER_AGENT'}) {
-            /Mozilla.*\(Windows/ && do {return "PC";};
-            /Mozilla.*\(Macintosh/ && do {return "Macintosh";};
-            /Mozilla.*\(Win/ && do {return "PC";};
-	    /Mozilla.*Windows NT/ && do {return "PC";};
-            /Mozilla.*Linux.*86/ && do {return "PC";};
-            /Mozilla.*Linux.*alpha/ && do {return "DEC";};
-            /Mozilla.*OSF/ && do {return "DEC";};
-            /Mozilla.*HP-UX/ && do {return "HP";};
-            /Mozilla.*IRIX/ && do {return "SGI";};
-            /Mozilla.*(SunOS|Solaris)/ && do {return "Sun";};
+        #PowerPC
+            /\(.*PowerPC.*\)/i && do {return "Macintosh";};
+            /\(.*PPC.*\)/ && do {return "Macintosh";};
+            /\(.*AIX.*\)/ && do {return "Macintosh";};
+        #Intel x86
+            /\(.*[ix0-9]86.*\)/ && do {return "PC";};
+        #Versions of Windows that only run on Intel x86
+            /\(.*Windows 9.*\)/ && do {return "PC";};
+            /\(.*Win9.*\)/ && do {return "PC";};
+            /\(.*Windows 3.*\)/ && do {return "PC";};
+            /\(.*Win16.*\)/ && do {return "PC";};
+        #Sparc
+            /\(.*sparc.*\)/ && do {return "Sun";};
+            /\(.*sun4.*\)/ && do {return "Sun";};
+        #Alpha
+            /\(.*Alpha.*\)/i && do {return "DEC";};
+        #MIPS
+            /\(.*IRIX.*\)/i && do {return "SGI";};
+            /\(.*MIPS.*\)/i && do {return "SGI";};
+        #68k
+            /\(.*68K.*\)/ && do {return "Macintosh";};
+            /\(.*680[x0]0.*\)/ && do {return "Macintosh";};
+        #ARM
+#            /\(.*ARM.*\) && do {return "ARM";};
+        #Stereotypical and broken
+            /\(.*Macintosh.*\)/ && do {return "Macintosh";};
+            /\(.*Mac OS [89].*\)/ && do {return "Macintosh";};
+            /\(Win.*\)/ && do {return "PC";};
+            /\(.*Windows NT.*\)/ && do {return "PC";};
+            /\(.*OSF.*\)/ && do {return "DEC";};
+            /\(.*HP-?UX.*\)/i && do {return "HP";};
+            /\(.*IRIX.*\)/i && do {return "SGI";};
+            /\(.*(SunOS|Solaris).*\)/ && do {return "Sun";};
+        #Braindead old browsers who didn't follow convention:
+            /Amiga/ && do {return "Macintosh";};
         }
     }
     # default
     return "Other";
 }
 
-
-
-sub pickversion {
-    my $version = formvalue('version');
-
-    if ( Param('usebrowserinfo') ) {
-        if ($version eq "") {
-            if ($ENV{'HTTP_USER_AGENT'} =~ m@Mozilla[ /]([^ ]*)@) {
-                $version = $1;
-            }
-        }
-    }
-    
-    if (lsearch($::versions{$product}, $version) >= 0) {
-        return $version;
-    } else {
-        if (defined $::COOKIE{"VERSION-$product"}) {
-            if (lsearch($::versions{$product},
-                        $::COOKIE{"VERSION-$product"}) >= 0) {
-                return $::COOKIE{"VERSION-$product"};
-            }
-        }
-    }
-    return $::versions{$product}->[0];
-}
-
-
-sub pickcomponent {
-    my $result =formvalue('component');
-    if ($result ne "" && lsearch($::components{$product}, $result) < 0) {
-        $result = "";
-    }
-    return $result;
-}
-
-
 sub pickos {
     if (formvalue('op_sys') ne "") {
         return formvalue('op_sys');
     }
     if ( Param('usebrowserinfo') ) {
         for ($ENV{'HTTP_USER_AGENT'}) {
-            /Mozilla.*\(.*;.*; IRIX.*\)/    && do {return "IRIX";};
-            /Mozilla.*\(.*;.*; 32bit.*\)/   && do {return "Windows 95";};
-            /Mozilla.*\(.*;.*; 16bit.*\)/   && do {return "Windows 3.1";};
-            /Mozilla.*\(.*;.*; 68K.*\)/     && do {return "Mac System 8.5";};
-            /Mozilla.*\(.*;.*; PPC.*\)/     && do {return "Mac System 8.5";};
-            /Mozilla.*\(.*;.*; OSF.*\)/     && do {return "OSF/1";};
-            /Mozilla.*\(.*;.*; Linux.*\)/   && do {return "Linux";};
-            /Mozilla.*\(.*;.*; SunOS 5.*\)/ && do {return "Solaris";};
-            /Mozilla.*\(.*;.*; SunOS.*\)/   && do {return "SunOS";};
-            /Mozilla.*\(.*;.*; SunOS.*\)/   && do {return "SunOS";};
-            /Mozilla.*\(.*;.*; BSD\/OS.*\)/ && do {return "BSDI";};
-            /Mozilla.*\(Win16.*\)/          && do {return "Windows 3.1";};
-            /Mozilla.*\(.*Win95.*\)/        && do {return "Windows 95";};
-            /Mozilla.*\(Win98.*\)/          && do {return "Windows 98";};
-            /Mozilla.*\(WinNT.*\)/          && do {return "Windows NT";};
-            /Mozilla.*Windows NT 5.*\)/     && do {return "Windows 2000";};
-            /Mozilla.*\(Windows.*NT/        && do {return "Windows NT";};
+            /\(.*IRIX.*\)/ && do {return "IRIX";};
+            /\(.*OSF.*\)/ && do {return "OSF/1";};
+            /\(.*Linux.*\)/ && do {return "Linux";};
+            /\(.*SunOS 5.*\)/ && do {return "Solaris";};
+            /\(.*SunOS.*\)/ && do {return "SunOS";};
+            /\(.*HP-?UX.*\)/ && do {return "HP-UX";};
+            /\(.*BSD\/OS.*\)/ && do {return "BSDI";};
+            /\(.*FreeBSD.*\)/ && do {return "FreeBSD";};
+            /\(.*OpenBSD.*\)/ && do {return "OpenBSD";};
+            /\(.*NetBSD.*\)/ && do {return "NetBSD";};
+            /\(.*BeOS.*\)/ && do {return "BeOS";};
+            /\(.*AIX.*\)/ && do {return "AIX";};
+            /\(.*IBM.*\)/ && do {return "OS/2";};
+            /\(.*QNX.*\)/ && do {return "Neutrino";};
+            /\(.*VMS.*\)/ && do {return "OpenVMS";};
+            /\(.*Windows XP.*\)/ && do {return "Windows XP";};
+            /\(.*Windows NT 5\.1.*\)/ && do {return "Windows XP";};
+            /\(.*Windows 2000.*\)/ && do {return "Windows 2000";};
+            /\(.*Windows NT 5.*\)/ && do {return "Windows 2000";};
+            /\(.*Windows.*NT.*\)/ && do {return "Windows NT";};
+            /\(.*Win.*98.*4\.9.*\)/ && do {return "Windows ME";};
+            /\(.*Win98.*\)/ && do {return "Windows 98";};
+            /\(.*Win95.*\)/ && do {return "Windows 95";};
+            /\(.*Win16.*\)/ && do {return "Windows 3.1";};
+            /\(.*WinNT.*\)/ && do {return "Windows NT";};
+            /\(.*32bit.*\)/ && do {return "Windows 95";};
+            /\(.*16bit.*\)/ && do {return "Windows 3.1";};
+            /\(.*Mac OS 9.*\)/ && do {return "Mac System 9.x";};
+            /\(.*Mac OS 8\.6.*\)/ && do {return "Mac System 8.6";};
+            /\(.*Mac OS 8\.5.*\)/ && do {return "Mac System 8.5";};
+        # Bugzilla doesn't have an entry for 8.1
+            /\(.*Mac OS 8\.1.*\)/ && do {return "Mac System 8.0";};
+            /\(.*Mac OS 8\.0.*\)/ && do {return "Mac System 8.0";};
+            /\(.*Mac OS 8[^.].*\)/ && do {return "Mac System 8.0";};
+            /\(.*Mac OS 8.*\)/ && do {return "Mac System 8.6";};
+            /\(.*Mac OS X.*\)/ && do {return "MacOS X";};
+            /\(.*Darwin.*\)/ && do {return "MacOS X";};
+        # Silly
+            /\(.*Mac.*PowerPC.*\)/ && do {return "Mac System 9.x";};
+            /\(.*Mac.*PPC.*\)/ && do {return "Mac System 9.x";};
+            /\(.*Mac.*68k.*\)/ && do {return "Mac System 8.0";};
+        # Evil
+            /Amiga/i && do {return "other";};
+            /\(.*PowerPC.*\)/ && do {return "Mac System 9.x";};
+            /\(.*PPC.*\)/ && do {return "Mac System 9.x";};
+            /\(.*68K.*\)/ && do {return "Mac System 8.0";};
         }
     }
     # default
     return "other";
 }
+##############################################################################
+# End of subroutines
+##############################################################################
 
+confirm_login() if (!(Param("usebuggroupsentry")));
 
-GetVersionTable();
-
-my $assign_element = GeneratePersonInput('assigned_to', 1,
-                                         formvalue('assigned_to'));
-my $cc_element = GeneratePeopleInput('cc', formvalue('cc'));
-
-
-my $priority = Param('defaultpriority');
+# If the usebuggroupsentry parameter is set, we need to check and make sure
+# that the user has permission to enter a bug against this product.
+if(Param("usebuggroupsentry") 
+   && GroupExists($product) 
+   && !UserInGroup($product)) 
+{
+    DisplayError("Sorry; you do not have the permissions necessary to " .
+                 "enter a bug against this product.\n");         
+    exit;
+}
 
-my $priority_popup = make_popup('priority', \@::legal_priority,
-                                formvalue('priority', $priority), 0);
-my $sev_popup = make_popup('bug_severity', \@::legal_severity,
-                           formvalue('bug_severity', 'normal'), 0);
-my $platform_popup = make_popup('rep_platform', \@::legal_platform,
-                                pickplatform(), 0);
-my $opsys_popup = make_popup('op_sys', \@::legal_opsys, pickos(), 0);
+GetVersionTable();
 
+if (lsearch(\@::enterable_products, $product) == -1) {
+    DisplayError("'" . html_quote($product) . "' is not a valid product.");
+    exit;
+}
+    
 if (0 == @{$::components{$product}}) {
-	print "<H1>Permission Denied</H1>\n";
-	print "Sorry.  You need to have at least one component for this product\n";
-	print "in order to create a new bug.  Go to the \"Components\" link to create\n";
-	print "a new component\n";
-	print "<P>\n";
-	PutFooter();
-	exit;
-} elsif (1 == @{$::components{$product}}) {
+    my $error = "Sorry; there needs to be at least one component for this " .
+                "product in order to create a new bug. ";
+    if (UserInGroup('editcomponents')) {
+        $error .= "<a href=\"editcomponents.cgi\">" . 
+                  "Create a new component</a>\n";
+    }
+    else {              
+        $error .= "Please contact " . Param("maintainer") . ", detailing " .
+                  "the product in which you tried to create a new bug.\n";
+    }
+        
+    DisplayError($error);   
+    exit;
+} 
+elsif (1 == @{$::components{$product}}) {
     # Only one component; just pick it.
     $::FORM{'component'} = $::components{$product}->[0];
 }
 
-my $component_popup = make_popup('component', $::components{$product},
-                                 formvalue('component'), 1);
+my @components;
+SendSQL("SELECT value, description FROM components " . 
+        "WHERE program = " . SqlQuote($product) . " ORDER BY value");
+while (MoreSQLData()) {
+    my ($name, $description) = FetchSQLData();
 
-PutHeader ("Enter Bug","Enter Bug","This page lets you enter a new bug into Bugzilla.");
+    my %component;
 
-# Modified, -JMR, 2/24,00
-# If the usebuggroupsentry parameter is set, we need to check and make sure
-# that the user has permission to enter a bug against this product.
-# Modified, -DDM, 3/11/00
-# added GroupExists check so we don't choke on a groupless product
-if(Param("usebuggroupsentry")
-   && GroupExists($product)
-   && !UserInGroup($product)) {
-  print "<H1>Permission denied.</H1>\n";
-  print "Sorry; you do not have the permissions necessary to enter\n";
-  print "a bug against this product.\n";
-  print "<P>\n";
-  PutFooter();
-  exit;
-}
+    $component{'name'} = $name;
+    $component{'description'} = $description;
 
-# Modified, -JMR, 2/18/00
-# I'm putting in a select box in order to select whether to restrict this bug to
-# the product's bug group or not, if the usebuggroups parameter is set, and if
-# this product has a bug group.  This box will default to selected, but can be
-# turned off if this bug should be world-viewable for some reason.
-#
-# To do this, I need to (1) get the bit and description for the bug group from
-# the database, (2) insert the select box in the giant print statements below,
-# and (3) update post_bug.cgi to process the additional input field.
-
-# Modified, -DDM, 3/11/00
-# Only need the bit here, and not the description.  Description is gotten
-# when the select boxes for all the groups this user has access to are read
-# in later on.
-# First we get the bit and description for the group.
-my $group_bit=0;
-if(Param("usebuggroups") && GroupExists($product)) {
-    SendSQL("select bit from groups ".
-            "where name = ".SqlQuote($product)." ".
-            "and isbuggroup != 0");
-    ($group_bit) = FetchSQLData();
+    push @components, \%component;
 }
 
-print "
-<FORM METHOD=POST ACTION=\"post_bug.cgi\">
-<INPUT TYPE=HIDDEN NAME=reporter VALUE=\"$::COOKIE{'Bugzilla_login'}\">
-<INPUT TYPE=HIDDEN NAME=product VALUE=\""  . value_quote($product) . "\">
-  <TABLE CELLSPACING=2 CELLPADDING=0 BORDER=0>";
-
-if (Param("entryheaderhtml")){
-  print "
-  <TR>
-    <td></td>
-    <td colspan=3>" .
-  Param("entryheaderhtml") . "\n" .
-  " </td> 
-  </TR>
-  <TR><td><br></td></TR>";
-}
+my %default;
+
+$vars->{'component_'} = \@components;
+$default{'component_'} = formvalue('component');
+
+$vars->{'assigned_to'} = formvalue('assigned_to');
+$vars->{'cc'} = formvalue('cc');
+$vars->{'reporter'} = $::COOKIE{'Bugzilla_login'};
+$vars->{'user_agent'} = $ENV{'HTTP_USER_AGENT'};
+$vars->{'product'} = $product;
+$vars->{'bug_file_loc'} = formvalue('bug_file_loc', "http://");
+$vars->{'short_desc'} = formvalue('short_desc');
+$vars->{'comment'} = formvalue('comment');
 
-print "
-  <TR>
-    <td ALIGN=right valign=top><B>Reporter:</B></td>
-    <td valign=top>$::COOKIE{'Bugzilla_login'}</td>
-    <td ALIGN=right valign=top><B>Product:</B></td>
-    <td valign=top>$product</td>
-  </TR>
-  <TR>
-    <td ALIGN=right valign=top><B>Version:</B></td>
-    <td>" . Version_element(pickversion(), $product) . "</td>
-    <td align=right valign=top><b><a href=\"describecomponents.cgi?product=" .
-    url_quote($product) . "\">Component:</a></b></td>
-    <td>$component_popup</td>
-  </TR>
-  <tr><td>&nbsp<td> <td> <td> <td> <td> </tr>
-  <TR>
-    <td align=right><B><A HREF=\"bug_status.html#rep_platform\">Platform:</A></B></td>
-    <TD>$platform_popup</TD>
-    <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#op_sys\">OS:</A></B></TD>
-    <TD>$opsys_popup</TD>
-    <td align=right valign=top></td>
-    <td rowspan=3></td>
-    <td></td>
-  </TR>
-  <TR>";
-if (Param('letsubmitterchoosepriority')) {
-    print "
-    <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#priority\">Resolution<br>Priority</A>:</B></TD>
-    <TD>$priority_popup</TD>";
+$vars->{'priority'} = \@legal_priority;
+$default{'priority'} = formvalue('priority', Param('defaultpriority'));
+
+$vars->{'bug_severity'} = \@legal_severity;
+$default{'bug_severity'} = formvalue('bug_severity', 'normal');
+
+$vars->{'rep_platform'} = \@legal_platform;
+$default{'rep_platform'} = pickplatform();
+
+$vars->{'op_sys'} = \@legal_opsys; 
+$default{'op_sys'} = pickos();
+
+# Posting a bug sets a cookie for the current version, if one exists. Else,
+# the default version is the last one in the list (hopefully the latest one).
+# Eventually maybe each product should have a "current version" parameter.
+$vars->{'version'} = $::versions{$product} || [];
+if (exists $::COOKIE{"VERSION-$product"} &&
+    lsearch($vars->{'version'}, $::COOKIE{"VERSION-$product"}) != -1) {
+    $default{'version'} = $::COOKIE{"VERSION-$product"};
 } else {
-    print '<INPUT TYPE=HIDDEN NAME=priority VALUE="' .
-        value_quote($priority) . '">';
+    $default{'version'} = $vars->{'version'}->[$#{$vars->{'version'}}];
 }
-print "
-    <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#severity\">Severity:</A></B></TD>
-    <TD>$sev_popup</TD>
-    <td></td>
-    <td></td>
-  </TR>
-  <tr><td>&nbsp<td> <td> <td> <td> <td> </tr>
-";
+
+# There must be at least one status in @status.
+my @status = "NEW";
 
 if (UserInGroup("editbugs") || UserInGroup("canconfirm")) {
-    SendSQL("SELECT votestoconfirm FROM products WHERE product = " .
+    SendSQL("SELECT votestoconfirm FROM products WHERE product = " . 
             SqlQuote($product));
-    if (FetchOneColumn()) {
-        print qq{
-  <TR>
-    <TD ALIGN="right"><B><A HREF="bug_status.html#status">Initial state:</B></A></TD>
-    <TD COLSPAN="5">
-};
-        print BuildPulldown("bug_status",
-                            [[$::unconfirmedstate], ["NEW"]],
-                            "NEW");
-        print "</TD></TR>";
-    }
+    push(@status, $unconfirmedstate) if (FetchOneColumn());
 }
 
+$vars->{'bug_status'} = \@status; 
+$default{'bug_status'} = $status[0];
 
-print "
-  <tr>
-    <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#assigned_to\">Assigned To:</A></B></TD>
-    <TD colspan=5>$assign_element
-    (Leave blank to assign to default component owner)</td>
-  </tr>
-  <tr>
-    <TD ALIGN=RIGHT><B>Cc:</B></TD>
-    <TD colspan=5>$cc_element</TD>
-  </tr>
-  <tr><td>&nbsp<td> <td> <td> <td> <td> </tr>
-  <TR>
-    <TD ALIGN=RIGHT><B>URL:</B>
-    <TD COLSPAN=5>
-      <INPUT NAME=bug_file_loc SIZE=60 value=\"http://" .
-    value_quote(formvalue('bug_file_loc')) .
-    "\"></TD>
-  </TR>
-  <TR>
-    <TD ALIGN=RIGHT><B>Summary:</B>
-    <TD COLSPAN=5>
-      <INPUT NAME=short_desc SIZE=60 value=\"" .
-    value_quote(formvalue('short_desc')) .
-    "\"></TD>
-  </TR>
-  <tr><td align=right valign=top><B>Description:</b></td>
-<!--  </tr> <tr> -->
-    <td colspan=5><TEXTAREA WRAP=HARD NAME=comment ROWS=10 COLS=80>" .
-    value_quote(formvalue('comment')) .
-    "</TEXTAREA><BR></td>
-  </tr>";
-
-print "
-  <tr>
-   <td></td><td colspan=5>
-";
-
+# Select whether to restrict this bug to the product's bug group or not, 
+# if the usebuggroups parameter is set, and if this product has a bug group.
 if ($::usergroupset ne '0') {
+    # First we get the bit and description for the group.
+    my $group_bit = '0';
+
+    if(Param("usebuggroups") && GroupExists($product)) {
+        SendSQL("SELECT bit FROM groups ".
+                "WHERE name = " . SqlQuote($product) . " " .
+                "AND isbuggroup != 0");
+        ($group_bit) = FetchSQLData();
+    }
+
     SendSQL("SELECT bit, name, description FROM groups " .
             "WHERE bit & $::usergroupset != 0 " .
-            "  AND isbuggroup != 0 AND isactive = 1 ORDER BY description");
-    # We only print out a header bit for this section if there are any
-    # results.
-    my $groupFound = 0;
+            "AND isbuggroup != 0 AND isactive = 1 ORDER BY description");
+
+    my @groups;
+
     while (MoreSQLData()) {
-        my ($bit, $prodname, $description) = (FetchSQLData());
+        my ($bit, $prodname, $description) = FetchSQLData();
         # Don't want to include product groups other than this product.
-        unless(($prodname eq $product) || (!defined($::proddesc{$prodname}))) {
-            next;
-        }
-        if(!$groupFound) {
-          print "<br><b>Only users in the selected groups can view this bug:</b><br>\n";
-          print "<font size=\"-1\">(Leave all boxes unchecked to make this a public bug.)</font><br><br>\n";
-          $groupFound = 1;
-        }
-        # Rather than waste time with another Param check and another database
-        # access, $group_bit will only have a non-zero value if we're using
-        # bug groups and have  one for this product, so I'll check on that
-        # instead here.  -JMR, 2/18/00
-        # Moved this check to this location to fix conflict with existing
-        # select-box patch.  Also, if $group_bit is 0, it won't match the
-        # current group, either, so I'll compare it to the current bit
-        # instead of checking for non-zero. -DDM, 3/11/00
-        # Modifying this to use checkboxes instead of a select list.
-        # -JMR, 5/11/01
+        next unless($prodname eq $product || 
+                    !defined($::proddesc{$prodname}));
+
+        my $check;
+
         # If this is the group for this product, make it checked.
-        my $check = ($group_bit == $bit);
-        # If this is a bookmarked template, then we only want to set the bit
-        # for those bits set in the template.
-        if(formvalue("maketemplate","") eq "Remember values as bookmarkable template") {
-          $check = formvalue("bit-$bit",0);
+        if(formvalue("maketemplate") eq 
+                                   "Remember values as bookmarkable template") 
+        {
+            # If this is a bookmarked template, then we only want to set the
+            # bit for those bits set in the template.        
+            $check = formvalue("bit-$bit", 0);
         }
-        my $checked = $check ? " CHECKED" : "";
-        # indent these a bit
-        print "&nbsp;&nbsp;&nbsp;&nbsp;";
-        print "<input type=checkbox name=\"bit-$bit\" value=1$checked>\n";
-        print "$description<br>\n";
+        else {
+            # $group_bit will only have a non-zero value if we're using
+            # bug groups and have one for this product.
+            # If $group_bit is 0, it won't match the current group, so compare 
+            # it to the current bit instead of checking for non-zero.
+            $check = ($group_bit == $bit);
+        }
+
+        my $group = 
+        {
+            'bit' => $bit , 
+            'checked' => $check , 
+            'description' => $description 
+        };
+
+        push @groups, $group;        
     }
-}
 
-print "
-   </td>
-  </tr>
-  <tr>
-    <td></td>
-    <td colspan=5>
-       <INPUT TYPE=\"submit\" VALUE=\"    Commit    \" ONCLICK=\"if (this.form.short_desc.value =='') { alert('Please enter a summary sentence for this bug.'); return false; }\">
-       &nbsp;&nbsp;&nbsp;&nbsp;
-       <INPUT TYPE=\"reset\" VALUE=\"Reset\">
-       &nbsp;&nbsp;&nbsp;&nbsp;
-       <INPUT TYPE=\"submit\" NAME=maketemplate VALUE=\"Remember values as bookmarkable template\">
-    </td>
-  </tr>";
-
-if ( Param('usebrowserinfo') ) {
-    print "
-  <tr>
-    <td></td>
-    <td colspan=3>
-     <br>
-     Some fields initialized from your user-agent, 
-     <b>$ENV{'HTTP_USER_AGENT'}</b>.  If you think it got it wrong, 
-     please tell " . Param('maintainer') . " what it should have been.
-    </td>
-  </tr>";
+    $vars->{'group'} = \@groups;
 }
-print "
-  </TABLE>
-  <INPUT TYPE=hidden name=form_name VALUE=enter_bug>
-</FORM>\n";
 
-PutFooter();
+$vars->{'default'} = \%default;
 
-print "</BODY></HTML>\n";
+my $format = ValidateOutputFormat($::FORM{'format'}, "create", "bug/create");
 
+print "Content-type: $format->{'contenttype'}\n\n";
+$template->process("bug/create/$format->{'template'}", $vars)
+  || ThrowTemplateError($template->error());          
diff --git a/globals.pl b/globals.pl
index 3f61bd7ef..ee0e4f153 100644
--- a/globals.pl
+++ b/globals.pl
@@ -21,6 +21,7 @@
 #                 Dan Mosedale <dmose@mozilla.org>
 #                 Jake <jake@acutex.net>
 #                 Bradley Baetz <bbaetz@cs.mcgill.ca>
+#                 Christopher Aillon <christopher@aillon.com>
 
 # Contains some global variables and routines used throughout bugzilla.
 
@@ -34,9 +35,11 @@ sub globals_pl_sillyness {
     my $zz;
     $zz = @main::SqlStateStack;
     $zz = @main::chooseone;
+    $zz = $main::contenttypes;
     $zz = @main::default_column_list;
     $zz = $main::defaultqueryname;
     $zz = @main::dontchange;
+    $zz = @main::enterable_products;
     $zz = %main::keywordsbyname;
     $zz = @main::legal_bug_status;
     $zz = @main::legal_components;
@@ -49,8 +52,12 @@ sub globals_pl_sillyness {
     $zz = @main::legal_target_milestone;
     $zz = @main::legal_versions;
     $zz = @main::milestoneurl;
+    $zz = %main::proddesc;
     $zz = @main::prodmaxvotes;
     $zz = $main::superusergroupset;
+    $zz = $main::template;
+    $zz = $main::userid;
+    $zz = $main::vars;
 }
 
 #
@@ -59,6 +66,7 @@ sub globals_pl_sillyness {
 # 
 
 $::db_host = "localhost";
+$::db_port = 3306;
 $::db_name = "bugs";
 $::db_user = "bugs";
 $::db_pass = "";
@@ -72,11 +80,25 @@ use Date::Parse;               # For str2time().
 #use Carp;                       # for confess
 use RelationSet;
 
-# $ENV{PATH} is not taint safe
-delete $ENV{PATH};
+# Use standard Perl libraries for cross-platform file/directory manipulation.
+use File::Spec;
+    
+# Some environment variables are not taint safe
+delete @::ENV{'PATH', 'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
+
+# Cwd.pm in perl 5.6.1 gives a warning if $::ENV{'PATH'} isn't defined
+# Set this to '' so that we don't get warnings cluttering the logs on every
+# system call
+$::ENV{'PATH'} = '';
+
+# Ignore SIGTERM and SIGPIPE - this prevents DB corruption. If the user closes
+# their browser window while a script is running, the webserver sends these
+# signals, and we don't want to die half way through a write.
+$::SIG{TERM} = 'IGNORE';
+$::SIG{PIPE} = 'IGNORE';
 
 # Contains the version string for the current running Bugzilla.
-$::param{'version'} = '2.14.5';
+$::param{'version'} = '2.16';
 
 $::dontchange = "--do_not_change--";
 $::chooseone = "--Choose_one:--";
@@ -98,16 +120,15 @@ $::superusergroupset = "9223372036854775807";
 # Some files in the data directory must be world readable iff we don't have
 # a webserver group. Call this function to do this.
 sub ChmodDataFile($$) {
-	my ($file, $mask) = @_;
-	my $perm = 0770;
-	if ((stat('data'))[2] & 0002) {
-		$perm = 0777;
-	}
-	$perm = $perm & $mask;
-	chmod $perm,$file;
+    my ($file, $mask) = @_;
+    my $perm = 0770;
+    if ((stat('data'))[2] & 0002) {
+        $perm = 0777;
+    }
+    $perm = $perm & $mask;
+    chmod $perm,$file;
 }
 
-
 sub ConnectToDatabase {
     my ($useshadow) = (@_);
     if (!defined $::db) {
@@ -116,8 +137,8 @@ sub ConnectToDatabase {
             $name = Param("shadowdb");
             $::dbwritesallowed = 0;
         }
-	$::db = DBI->connect("DBI:mysql:host=$::db_host;database=$name", $::db_user, $::db_pass)
-	    || die "Bugzilla is currently broken. Please try again later. " . 
+        $::db = DBI->connect("DBI:mysql:host=$::db_host;database=$name;port=$::db_port", $::db_user, $::db_pass)
+            || die "Bugzilla is currently broken. Please try again later. " . 
       "If the problem persists, please contact " . Param("maintainer") .
       ". The error you should quote is: " . $DBI::errstr;
     }
@@ -208,8 +229,27 @@ sub SqlLog {
     }
 }
 
+# This is from the perlsec page, slightly modifed to remove a warning
+# From that page:
+#      This function makes use of the fact that the presence of
+#      tainted data anywhere within an expression renders the
+#      entire expression tainted.
+# Don't ask me how it works...
+sub is_tainted {
+    return not eval { my $foo = join('',@_), kill 0; 1; };
+}
+
 sub SendSQL {
     my ($str, $dontshadow) = (@_);
+
+    # Don't use DBI's taint stuff yet, because:
+    # a) We don't want out vars to be tainted (yet)
+    # b) We want to know who called SendSQL...
+    # Is there a better way to do b?
+    if (is_tainted($str)) {
+        die "Attempted to send tainted string '$str' to the database";
+    }
+
     my $iswrite =  ($str =~ /^(INSERT|REPLACE|UPDATE|DELETE)/i);
     if ($iswrite && !$::dbwritesallowed) {
         die "Evil code attempted to write stuff to the shadow database.";
@@ -228,8 +268,13 @@ sub SendSQL {
     }
     SqlLog($str);
     $::currentquery = $::db->prepare($str);
-    $::currentquery->execute
-	|| die "$str: " . $::db->errstr;
+    if (!$::currentquery->execute) {
+        my $errstr = $::db->errstr;
+        # Cut down the error string to a reasonable.size
+        $errstr = substr($errstr, 0, 2000) . ' ... ' . substr($errstr, -2000)
+                if length($errstr) > 4000;
+        die "$str: " . $errstr;
+    }
     SqlLog("Done");
     if (!$dontshadow && $iswrite && Param("shadowdb")) {
         my $q = SqlQuote($str);
@@ -252,10 +297,10 @@ sub MoreSQLData {
         return 0;
     }
     if (defined @::fetchahead) {
-	return 1;
+        return 1;
     }
     if (@::fetchahead = $::currentquery->fetchrow_array) {
-	return 1;
+        return 1;
     }
     return 0;
 }
@@ -266,9 +311,9 @@ sub FetchSQLData {
         return;
     }
     if (defined @::fetchahead) {
-	my @result = @::fetchahead;
-	undef @::fetchahead;
-	return @result;
+        my @result = @::fetchahead;
+        undef @::fetchahead;
+        return @result;
     }
     return $::currentquery->fetchrow_array;
 }
@@ -328,61 +373,6 @@ sub lsearch {
     return -1;
 }
 
-sub Product_element {
-    my ($prod,$onchange) = (@_);
-    return make_popup("product", keys %::versions, $prod, 1, $onchange);
-}
-
-sub Component_element {
-    my ($comp,$prod,$onchange) = (@_);
-    my $componentlist;
-    if (! defined $::components{$prod}) {
-        $componentlist = [];
-    } else {
-        $componentlist = $::components{$prod};
-    }
-    my $defcomponent;
-    if ($comp ne "" && lsearch($componentlist, $comp) >= 0) {
-        $defcomponent = $comp;
-    } else {
-        $defcomponent = $componentlist->[0];
-    }
-    return make_popup("component", $componentlist, $defcomponent, 1, "");
-}
-
-sub Version_element {
-    my ($vers, $prod, $onchange) = (@_);
-    my $versionlist;
-    if (!defined $::versions{$prod}) {
-        $versionlist = [];
-    } else {
-        $versionlist = $::versions{$prod};
-    }
-    my $defversion = $versionlist->[0];
-    if (lsearch($versionlist,$vers) >= 0) {
-        $defversion = $vers;
-    }
-    return make_popup("version", $versionlist, $defversion, 1, $onchange);
-}
-        
-sub Milestone_element {
-    my ($tm, $prod, $onchange) = (@_);
-    my $tmlist;
-    if (!defined $::target_milestone{$prod}) {
-        $tmlist = [];
-    } else {
-        $tmlist = $::target_milestone{$prod};
-    }
-
-    my $deftm = $tmlist->[0];
-
-    if (lsearch($tmlist, $tm) >= 0) {
-        $deftm = $tm;
-    }
-
-    return make_popup("target_milestone", $tmlist, $deftm, 1, $onchange);
-}
-
 # Generate a string which, when later interpreted by the Perl compiler, will
 # be the same as the given string.
 
@@ -426,7 +416,7 @@ sub GenerateCode {
         $result = "";
         foreach my $k (sort { uc($a) cmp uc($b)} eval("keys $name")) {
             $result .= GenerateCode("\$" . substr($name, 1) .
-                                    "{'" . $k . "'}");
+                                    "{" . PerlQuote($k) . "}");
         }
         return $result;
     } else {
@@ -479,27 +469,19 @@ sub GenerateVersionTable {
                                 # about them anyway.
 
     my $mpart = $dotargetmilestone ? ", milestoneurl" : "";
-    SendSQL("select product, description, votesperuser, disallownew$mpart from products");
-    $::anyvotesallowed = 0;
+    SendSQL("select product, description, votesperuser, disallownew$mpart from products ORDER BY product");
     while (@line = FetchSQLData()) {
         my ($p, $d, $votesperuser, $dis, $u) = (@line);
         $::proddesc{$p} = $d;
-        if ($dis) {
-            # Special hack.  Stomp on the description and make it "0" if we're
-            # not supposed to allow new bugs against this product.  This is
-            # checked for in enter_bug.cgi.
-            $::proddesc{$p} = "0";
+        if (!$dis) {
+            push @::enterable_products, $p;
         }
         if ($dotargetmilestone) {
             $::milestoneurl{$p} = $u;
         }
         $::prodmaxvotes{$p} = $votesperuser;
-        if ($votesperuser > 0) {
-            $::anyvotesallowed = 1;
-        }
     }
             
-
     my $cols = LearnAboutColumns("bugs");
     
     @::log_columns = @{$cols->{"-list-"}};
@@ -538,6 +520,13 @@ sub GenerateVersionTable {
     my $tmpname = "data/versioncache.$$";
     open(FID, ">$tmpname") || die "Can't create $tmpname";
 
+    print FID "#\n";
+    print FID "# DO NOT EDIT!\n";
+    print FID "# This file is automatically generated at least once every\n";
+    print FID "# hour by the GenerateVersionTable() sub in globals.pl.\n";
+    print FID "# Any changes you make will be overwritten.\n";
+    print FID "#\n";
+
     print FID GenerateCode('@::log_columns');
     print FID GenerateCode('%::versions');
 
@@ -557,8 +546,8 @@ sub GenerateVersionTable {
     }
     print FID GenerateCode('@::settable_resolution');
     print FID GenerateCode('%::proddesc');
+    print FID GenerateCode('@::enterable_products');
     print FID GenerateCode('%::prodmaxvotes');
-    print FID GenerateCode('$::anyvotesallowed');
 
     if ($dotargetmilestone) {
         # reading target milestones in from the database - matthew@zeroknowledge.com
@@ -631,6 +620,8 @@ sub GetVersionTable {
         $mtime = 0;
     }
     if (time() - $mtime > 3600) {
+        use Token;
+        Token::CleanTokenTable();
         GenerateVersionTable();
     }
     require 'data/versioncache';
@@ -646,6 +637,31 @@ sub GetVersionTable {
 }
 
 
+# Validates a given username as a new username
+# returns 1 if valid, 0 if invalid
+sub ValidateNewUser {
+    my ($username, $old_username) = @_;
+
+    if(DBname_to_id($username) != 0) {
+        return 0;
+    }
+
+    # Reject if the new login is part of an email change which is 
+    # still in progress
+    SendSQL("SELECT eventdata FROM tokens WHERE tokentype = 'emailold' 
+                AND eventdata like '%:$username' 
+                 OR eventdata like '$username:%'");
+    if (my ($eventdata) = FetchSQLData()) {
+        # Allow thru owner of token
+        if($old_username && ($eventdata eq "$old_username:$username")) {
+            return 1;
+        }
+        return 0;
+    }
+
+    return 1;
+}
+
 sub InsertNewUser {
     my ($username, $realname) = (@_);
 
@@ -684,6 +700,19 @@ sub InsertNewUser {
     return $password;
 }
 
+# Removes all entries from logincookies for $userid, except for the
+# optional $keep, which refers the logincookies.cookie primary key.
+# (This is useful so that a user changing their password stays logged in)
+sub InvalidateLogins {
+    my ($userid, $keep) = @_;
+
+    my $remove = "DELETE FROM logincookies WHERE userid = $userid";
+    if (defined $keep) {
+        $remove .= " AND cookie != " . SqlQuote($keep);
+    }
+    SendSQL($remove);
+}
+
 sub GenerateRandomPassword {
     my ($size) = @_;
 
@@ -707,6 +736,99 @@ sub GenerateRandomPassword {
     return $password;
 }
 
+sub SelectVisible {
+    my ($query, $userid, $usergroupset) = @_;
+
+    # Run the SQL $query with the additional restriction that
+    # the bugs can be seen by $userid. $usergroupset is provided
+    # as an optimisation when this is already known, eg from CGI.pl
+    # If not present, it will be obtained from the db.
+    # Assumes that 'bugs' is mentioned as a table name. You should
+    # also make sure that bug_id is qualified bugs.bug_id!
+    # Your query must have a WHERE clause. This is unlikely to be a problem.
+
+    # Also, note that mySQL requires aliases for tables to be locked, as well
+    # This means that if you change the name from selectVisible_cc (or add
+    # additional tables), you will need to update anywhere which does a
+    # LOCK TABLE, and then calls routines which call this
+
+    $usergroupset = 0 unless $userid;
+
+    unless (defined($usergroupset)) {
+        PushGlobalSQLState();
+        SendSQL("SELECT groupset FROM profiles WHERE userid = $userid");
+        $usergroupset = FetchOneColumn();
+        PopGlobalSQLState();
+    }
+
+    # Users are authorized to access bugs if they are a member of all 
+    # groups to which the bug is restricted.  User group membership and 
+    # bug restrictions are stored as bits within bitsets, so authorization
+    # can be determined by comparing the intersection of the user's
+    # bitset with the bug's bitset.  If the result matches the bug's bitset
+    # the user is a member of all groups to which the bug is restricted
+    # and is authorized to access the bug.
+
+    # A user is also authorized to access a bug if she is the reporter, 
+    # or member of the cc: list of the bug and the bug allows users in those
+    # roles to see the bug.  The boolean fields reporter_accessible and 
+    # cclist_accessible identify whether or not those roles can see the bug.
+
+    # Bit arithmetic is performed by MySQL instead of Perl because bitset
+    # fields in the database are 64 bits wide (BIGINT), and Perl installations
+    # may or may not support integers larger than 32 bits.  Using bitsets
+    # and doing bitset arithmetic is probably not cross-database compatible,
+    # however, so these mechanisms are likely to change in the future.
+
+    my $replace = " ";
+
+    if ($userid) {
+        $replace .= "LEFT JOIN cc selectVisible_cc ON 
+                     bugs.bug_id = selectVisible_cc.bug_id AND 
+                     selectVisible_cc.who = $userid "
+    }
+
+    $replace .= "WHERE ((bugs.groupset & $usergroupset) = bugs.groupset ";
+
+    if ($userid) {
+        # There is a mysql bug affecting v3.22 and 3.23 (at least), where this will
+        # cause all rows to be returned! We work arround this by adding an not isnull
+        # test to the JOINed cc table. See http://lists.mysql.com/cgi-ez/ezmlm-cgi?9:mss:11417
+        # Its needed, even though it shouldn't be
+        $replace .= "OR (bugs.reporter_accessible = 1 AND bugs.reporter = $userid)" .
+          " OR (bugs.cclist_accessible = 1 AND selectVisible_cc.who = $userid AND not isnull(selectVisible_cc.who))" .
+          " OR (bugs.assigned_to = $userid)";
+        if (Param("useqacontact")) {
+            $replace .= " OR (bugs.qa_contact = $userid)";
+        }
+    }
+
+    $replace .= ") AND ";
+
+    $query =~ s/\sWHERE\s/$replace/i;
+
+    return $query;
+}
+
+sub CanSeeBug {
+    # Note that we pass in the usergroupset, since this is known
+    # in most cases (ie viewing bugs). Maybe make this an optional
+    # parameter?
+
+    my ($id, $userid, $usergroupset) = @_;
+
+    # Query the database for the bug, retrieving a boolean value that
+    # represents whether or not the user is authorized to access the bug.
+
+    PushGlobalSQLState();
+    SendSQL(SelectVisible("SELECT bugs.bug_id FROM bugs WHERE bugs.bug_id = $id",
+                          $userid, $usergroupset));
+
+    my $ret = defined(FetchSQLData());
+    PopGlobalSQLState();
+
+    return $ret;
+}
 
 sub ValidatePassword {
     # Determines whether or not a password is valid (i.e. meets Bugzilla's
@@ -814,40 +936,28 @@ sub DBname_to_id {
 
 
 sub DBNameToIdAndCheck {
-    my ($name, $forceok) = (@_);
-    $name = html_quote($name);
+    my ($name) = (@_);
     my $result = DBname_to_id($name);
     if ($result > 0) {
         return $result;
     }
-    if ($forceok) {
-        InsertNewUser($name, "");
-        $result = DBname_to_id($name);
-        if ($result > 0) {
-            return $result;
-        }
-        print "Yikes; couldn't create user $name.  Please report problem to " .
-            Param("maintainer") ."\n";
-    } else {
-        print "\n";  # http://bugzilla.mozilla.org/show_bug.cgi?id=80045
-        print "The name <TT>$name</TT> is not a valid username.  Either you\n";
-        print "misspelled it, or the person has not registered for a\n";
-        print "Bugzilla account.\n";
-        print "<P>Please hit the <B>Back</B> button and try again.\n";
-    }
-    exit(0);
+
+    $name = html_quote($name);
+    ThrowUserError("The name <TT>$name</TT> is not a valid username.  
+                    Either you misspelled it, or the person has not
+                    registered for a Bugzilla account.");
 }
 
-# Use detaint_string() when you know that there is no way that the data
+# Use trick_taint() when you know that there is no way that the data
 # in a scalar can be tainted, but taint mode still bails on it.
 # WARNING!! Using this routine on data that really could be tainted
 #           defeats the purpose of taint mode.  It should only be
 #           used on variables that cannot be touched by users.
 
-sub detaint_string {
-    my ($str) = @_;
-    $str =~ m/^(.*)$/s;
-    $str = $1;
+sub trick_taint {
+    $_[0] =~ /^(.*)$/s;
+    $_[0] = $1;
+    return (defined($_[0]));
 }
 
 sub detaint_natural {
@@ -862,7 +972,7 @@ sub detaint_natural {
 # expressions.
 
 sub quoteUrls {
-    my ($knownattachments, $text) = (@_);
+    my ($text) = (@_);
     return $text unless $text;
     
     my $base = Param('urlbase');
@@ -870,8 +980,6 @@ sub quoteUrls {
     my $protocol = join '|',
     qw(afs cid ftp gopher http https mid news nntp prospero telnet wais);
 
-    my %options = ( metachars => 1, @_ );
-
     my $count = 0;
 
     # Now, quote any "#" characters so they won't confuse stuff later
@@ -900,18 +1008,34 @@ sub quoteUrls {
 
         $things[$count++] = $item;
     }
+    # Either a comment string or no comma and a compulsory #.
+    while ($text =~ s/\bbug(\s|%\#)*(\d+),?\s*comment\s*(\s|%\#)(\d+)/"##$count##"/ei) {
+        my $item = $&;
+        my $bugnum = $2;
+        my $comnum = $4;
+        $item = GetBugLink($bugnum, $item);
+        $item =~ s/(id=\d+)/$1#c$comnum/;
+        $things[$count++] = $item;
+    }
+    while ($text =~ s/\bcomment(\s|%\#)*(\d+)/"##$count##"/ei) {
+        my $item = $&;
+        my $num = $2;
+        $item = value_quote($item);
+        $item = qq{<A HREF="#c$num">$item</A>};
+        $things[$count++] = $item;
+    }
     while ($text =~ s/\bbug(\s|%\#)*(\d+)/"##$count##"/ei) {
         my $item = $&;
         my $num = $2;
         $item = GetBugLink($num, $item);
         $things[$count++] = $item;
     }
-    while ($text =~ s/\battachment(\s|%\#)*(\d+)/"##$count##"/ei) {
+    while ($text =~ s/\b(Created an )?attachment(\s|%\#)*(\(id=)?(\d+)\)?/"##$count##"/ei) {
         my $item = $&;
-        my $num = $2;
+        my $num = $4;
         $item = value_quote($item); # Not really necessary, since we know
                                     # there's no special chars in it.
-        $item = qq{<A HREF="showattachment.cgi?attach_id=$num">$item</A>};
+        $item = qq{<a href="attachment.cgi?id=$num&amp;action=view">$item</a>};
         $things[$count++] = $item;
     }
     while ($text =~ s/\*\*\* This bug has been marked as a duplicate of (\d+) \*\*\*/"##$count##"/ei) {
@@ -922,17 +1046,9 @@ sub quoteUrls {
         $item =~ s@\d+@$bug_link@;
         $things[$count++] = $item;
     }
-    while ($text =~ s/Created an attachment \(id=(\d+)\)/"##$count##"/e) {
-        my $item = $&;
-        my $num = $1;
-        if ($knownattachments->{$num}) {
-            $item = qq{<A HREF="showattachment.cgi?attach_id=$num">$item</A>};
-        }
-        $things[$count++] = $item;
-    }
 
     $text = value_quote($text);
-    $text =~ s/\&#010;/\n/g;
+    $text =~ s/\&#013;/\n/g;
 
     # Stuff everything back from the array.
     for (my $i=0 ; $i<$count ; $i++) {
@@ -952,40 +1068,61 @@ sub quoteUrls {
 
 sub GetBugLink {
     my ($bug_num, $link_text) = (@_);
-    my ($link_return) = "";
+    detaint_natural($bug_num) || die "GetBugLink() called with non-integer bug number";
+
+    # If we've run GetBugLink() for this bug number before, %::buglink
+    # will contain an anonymous array ref of relevent values, if not
+    # we need to get the information from the database.
+    if (! defined $::buglink{$bug_num}) {
+        # Make sure any unfetched data from a currently running query
+        # is saved off rather than overwritten
+        PushGlobalSQLState();
 
-    # TODO - Add caching capabilites... possibly use a global variable in the form
-    # of $buglink{$bug_num} that contains the text returned by this sub.  If that
-    # variable is defined, simply return it's value rather than running the SQL
-    # query.  This would cut down on the number of SQL calls when the same bug is
-    # referenced multiple times.
-    
-    # Make sure any unfetched data from a currently running query
-    # is saved off rather than overwritten
-    PushGlobalSQLState();
-    
-    # Get this bug's info from the SQL Database
-    SendSQL("select bugs.bug_status, resolution, short_desc, groupset
-             from bugs where bugs.bug_id = $bug_num");
-    my ($bug_stat, $bug_res, $bug_desc, $bug_grp) = (FetchSQLData());
-    
-    # Format the retrieved information into a link
-    if ($bug_stat eq "UNCONFIRMED") { $link_return .= "<i>" }
-    if ($bug_res ne "") { $link_return .= "<strike>" }
-    $bug_desc = value_quote($bug_desc);
-    $link_text = value_quote($link_text);
-    $link_return .= qq{<a href="show_bug.cgi?id=$bug_num" title="$bug_stat};
-    if ($bug_res ne "") {$link_return .= " $bug_res"}
-    if ($bug_grp == 0) { $link_return .= " - $bug_desc" }
-    $link_return .= qq{">$link_text</a>};
-    if ($bug_res ne "") { $link_return .= "</strike>" }
-    if ($bug_stat eq "UNCONFIRMED") { $link_return .= "</i>"}
-    
-    # Put back any query in progress
-    PopGlobalSQLState();
+        SendSQL("SELECT bugs.bug_status, resolution, short_desc, groupset " .
+                "FROM bugs WHERE bugs.bug_id = $bug_num");
 
-    return $link_return; 
+        # If the bug exists, save its data off for use later in the sub
+        if (MoreSQLData()) {
+            my ($bug_state, $bug_res, $bug_desc, $bug_grp) = FetchSQLData();
+            # Initialize these variables to be "" so that we don't get warnings
+            # if we don't change them below (which is highly likely).
+            my ($pre, $title, $post) = ("", "", "");
 
+            $title = $bug_state;
+            if ($bug_state eq $::unconfirmedstate) {
+                $pre = "<i>";
+                $post = "</i>";
+            }
+            elsif (! IsOpenedState($bug_state)) {
+                $pre = "<strike>";
+                $title .= " $bug_res";
+                $post = "</strike>";
+            }
+            if ($bug_grp == 0 || CanSeeBug($bug_num, $::userid, $::usergroupset)) {
+                $title .= " - $bug_desc";
+            }
+            $::buglink{$bug_num} = [$pre, value_quote($title), $post];
+        }
+        else {
+            # Even if there's nothing in the database, we want to save a blank
+            # anonymous array in the %::buglink hash so the query doesn't get
+            # run again next time we're called for this bug number.
+            $::buglink{$bug_num} = [];
+        }
+        # All done with this sidetrip
+        PopGlobalSQLState();
+    }
+
+    # Now that we know we've got all the information we're gonna get, let's
+    # return the link (which is the whole reason we were called :)
+    my ($pre, $title, $post) = @{$::buglink{$bug_num}};
+    # $title will be undefined if the bug didn't exist in the database.
+    if (defined $title) {
+        return qq{$pre<a href="show_bug.cgi?id=$bug_num" title="$title">$link_text</a>$post};
+    }
+    else {
+        return qq{$link_text};
+    }
 }
 
 sub GetLongDescriptionAsText {
@@ -994,9 +1131,9 @@ sub GetLongDescriptionAsText {
     my $count = 0;
     my ($query) = ("SELECT profiles.login_name, longdescs.bug_when, " .
                    "       longdescs.thetext " .
-                   "FROM longdescs, profiles " .
-                   "WHERE profiles.userid = longdescs.who " .
-                   "      AND longdescs.bug_id = $id ");
+                   "FROM   longdescs, profiles " .
+                   "WHERE  profiles.userid = longdescs.who " .
+                   "AND    longdescs.bug_id = $id ");
 
     if ($start && $start =~ /[1-9]/) {
         # If the start is all zeros, then don't do this (because we want to
@@ -1023,57 +1160,32 @@ sub GetLongDescriptionAsText {
     return $result;
 }
 
-
-sub GetLongDescriptionAsHTML {
-    my ($id, $start, $end) = (@_);
-    my $result = "";
-    my $count = 0;
-    my %knownattachments;
-    SendSQL("SELECT attach_id FROM attachments WHERE bug_id = $id");
-    while (MoreSQLData()) {
-        $knownattachments{FetchOneColumn()} = 1;
-    }
-
-    my ($query) = ("SELECT profiles.realname, profiles.login_name, longdescs.bug_when, " .
-                   "       longdescs.thetext " .
-                   "FROM longdescs, profiles " .
-                   "WHERE profiles.userid = longdescs.who " .
-                   "      AND longdescs.bug_id = $id ");
-
-    if ($start && $start =~ /[1-9]/) {
-        # If the start is all zeros, then don't do this (because we want to
-        # not emit a leading "Additional Comments" line in that case.)
-        $query .= "AND longdescs.bug_when > '$start'";
-        $count = 1;
-    }
-    if ($end) {
-        $query .= "AND longdescs.bug_when <= '$end'";
-    }
-
-    $query .= "ORDER BY longdescs.bug_when";
-    SendSQL($query);
+sub GetComments {
+    my ($id) = (@_);
+    my @comments;
+    
+    SendSQL("SELECT  profiles.realname, profiles.login_name, 
+                     date_format(longdescs.bug_when,'%Y-%m-%d %H:%i'), 
+                     longdescs.thetext
+            FROM     longdescs, profiles
+            WHERE    profiles.userid = longdescs.who 
+              AND    longdescs.bug_id = $id 
+            ORDER BY longdescs.bug_when");
+             
     while (MoreSQLData()) {
-        my ($who, $email, $when, $text) = (FetchSQLData());
-        $email .= Param('emailsuffix');
-        if ($count) {
-            $result .= "<BR><BR><I>------- Additional Comments From ";
-              if ($who) {
-                  $result .= "<A HREF=\"mailto:$email\">" . html_quote($who) . "</A> " .
-                      time2str("%Y-%m-%d %H:%M", str2time($when)) .
-                          " -------</I><BR>\n";
-              } else {
-                  $result .= qq{<A HREF="mailto:$email">$email</A> } .
-                      time2str("%Y-%m-%d %H:%M", str2time($when)) .
-                          " -------</I><BR>\n";
-              }
-        }
-        $result .= "<PRE>" . quoteUrls(\%knownattachments, $text) . "</PRE>\n";
-        $count++;
+        my %comment;
+        ($comment{'name'}, $comment{'email'}, $comment{'time'}, $comment{'body'}) = FetchSQLData();
+        
+        $comment{'email'} .= Param('emailsuffix');
+        $comment{'name'} = $comment{'name'} || $comment{'email'};
+         
+        push (@comments, \%comment);
     }
-
-    return $result;
+    
+    return \@comments;
 }
 
+
 # Fills in a hashtable with info about the columns for the given table in the
 # database.  The hashtable has the following entries:
 #   -list-  the list of column names
@@ -1107,7 +1219,7 @@ sub SplitEnumType {
         while ($guts =~ /^\'([^\']*)\',(.*)$/) {
             push @result, $1;
             $guts = $2;
-	}
+        }
     }
     return @result;
 }
@@ -1123,7 +1235,7 @@ sub SqlQuote {
     $str =~ s/([\\\'])/\\$1/g;
     $str =~ s/\0/\\0/g;
     # If it's been SqlQuote()ed, then it's safe, so we tell -T that.
-    $str = detaint_string($str);
+    trick_taint($str);
     return "'$str'";
 }
 
@@ -1198,12 +1310,19 @@ sub GroupIsActive {
 
 sub IsOpenedState {
     my ($state) = (@_);
-    if ($state =~ /^(NEW|REOPENED|ASSIGNED)$/ || $state eq $::unconfirmedstate) {
+    if (grep($_ eq $state, OpenStates())) {
         return 1;
     }
     return 0;
 }
 
+# This sub will return an array containing any status that
+# is considered an open bug.
+
+sub OpenStates {
+    return ('NEW', 'REOPENED', 'ASSIGNED', $::unconfirmedstate);
+}
+
 
 sub RemoveVotes {
     my ($id, $who, $reason) = (@_);
@@ -1270,7 +1389,7 @@ sub RemoveVotes {
             if (Param('sendmailnow')) {
                $sendmailparm = '';
             }
-            if (open(SENDMAIL, "|/usr/lib/sendmail $sendmailparm -t")) {
+            if (open(SENDMAIL, "|/usr/lib/sendmail $sendmailparm -t -i")) {
                 my %substs;
 
                 $substs{"to"} = $name;
@@ -1308,13 +1427,6 @@ sub Param ($) {
         return $::param{$value};
     }
 
-    # See if it is a dynamically-determined param (can't be changed by user).
-    if ($value eq "commandmenu") {
-        return GetCommandMenu();
-    }
-    if ($value eq "settingsmenu") {
-        return GetSettingsMenu();
-    }
     # Um, maybe we haven't sourced in the params at all yet.
     if (stat("data/params")) {
         # Write down and restore the version # here.  That way, we get around
@@ -1375,14 +1487,293 @@ sub PerformSubsts {
     return $str;
 }
 
+# Min and max routines.
+sub min {
+    my $min = shift(@_);
+    foreach my $val (@_) {
+        $min = $val if $val < $min;
+    }
+    return $min;
+}
+
+sub max {
+    my $max = shift(@_);
+    foreach my $val (@_) {
+        $max = $val if $val > $max;
+    }
+    return $max;
+}
 
 # Trim whitespace from front and back.
 
 sub trim {
-    ($_) = (@_);
-    s/^\s+//g;
-    s/\s+$//g;
-    return $_;
+    my ($str) = @_;
+    $str =~ s/^\s+//g;
+    $str =~ s/\s+$//g;
+    return $str;
+}
+
+###############################################################################
+# Global Templatization Code
+
+# Use the template toolkit (http://www.template-toolkit.org/) to generate
+# the user interface using templates in the "template/" subdirectory.
+use Template;
+
+# Create the global template object that processes templates and specify
+# configuration parameters that apply to all templates processed in this script.
+
+# IMPORTANT - If you make any configuration changes here, make sure to make
+# them in t/004.template.t and checksetup.pl. You may also need to change the
+# date settings were last changed - see the comments in checksetup.pl for
+# details
+$::template ||= Template->new(
+  {
+    # Colon-separated list of directories containing templates.
+    INCLUDE_PATH => "template/en/custom:template/en/default" ,
+
+    # Remove white-space before template directives (PRE_CHOMP) and at the
+    # beginning and end of templates and template blocks (TRIM) for better 
+    # looking, more compact content.  Use the plus sign at the beginning 
+    # of directives to maintain white space (i.e. [%+ DIRECTIVE %]).
+    PRE_CHOMP => 1 ,
+    TRIM => 1 , 
+
+    COMPILE_DIR => 'data/',
+
+    # Functions for processing text within templates in various ways.
+    # IMPORTANT!  When adding a filter here that does not override a
+    # built-in filter, please also add a stub filter to checksetup.pl
+    # and t/004template.t.
+    FILTERS =>
+      {
+        # Render text in strike-through style.
+        strike => sub { return "<strike>" . $_[0] . "</strike>" } ,
+
+        # Returns the text with backslashes, single/double quotes,
+        # and newlines/carriage returns escaped for use in JS strings.
+        js => sub
+        {
+            my ($var) = @_;
+            $var =~ s/([\\\'\"])/\\$1/g; 
+            $var =~ s/\n/\\n/g; 
+            $var =~ s/\r/\\r/g; 
+            return $var;
+        } , 
+        
+        html => \&html_quote , 
+
+        # HTML collapses newlines in element attributes to a single space,
+        # so form elements which may have whitespace (ie comments) need
+        # to be encoded using &#013;
+        # See bugs 4928, 22983 and 32000 for more details
+        html_linebreak => sub
+        {
+            my ($var) = @_;
+            $var =~ s/\r\n/\&#013;/g;
+            $var =~ s/\n\r/\&#013;/g;
+            $var =~ s/\r/\&#013;/g;
+            $var =~ s/\n/\&#013;/g;
+            return $var;
+        } ,
+
+        # This subroutine in CGI.pl escapes characters in a variable
+        # or value string for use in a query string.  It escapes all
+        # characters NOT in the regex set: [a-zA-Z0-9_\-.].  The 'uri'
+        # filter should be used for a full URL that may have
+        # characters that need encoding.
+        url_quote => \&url_quote ,
+      } ,
+  }
+) || DisplayError("Template creation failed: " . Template->error())
+  && exit;
+
+# Use the Toolkit Template's Stash module to add utility pseudo-methods
+# to template variables.
+use Template::Stash;
+
+# Add "contains***" methods to list variables that search for one or more 
+# items in a list and return boolean values representing whether or not 
+# one/all/any item(s) were found.
+$Template::Stash::LIST_OPS->{ contains } =
+  sub {
+      my ($list, $item) = @_;
+      return grep($_ eq $item, @$list);
+  };
+
+$Template::Stash::LIST_OPS->{ containsany } =
+  sub {
+      my ($list, $items) = @_;
+      foreach my $item (@$items) { 
+          return 1 if grep($_ eq $item, @$list);
+      }
+      return 0;
+  };
+
+# Add a "substr" method to the Template Toolkit's "scalar" object
+# that returns a substring of a string.
+$Template::Stash::SCALAR_OPS->{ substr } = 
+  sub {
+      my ($scalar, $offset, $length) = @_;
+      return substr($scalar, $offset, $length);
+  };
+    
+# Add a "truncate" method to the Template Toolkit's "scalar" object
+# that truncates a string to a certain length.
+$Template::Stash::SCALAR_OPS->{ truncate } = 
+  sub {
+      my ($string, $length, $ellipsis) = @_;
+      $ellipsis ||= "";
+      
+      return $string if !$length || length($string) <= $length;
+      
+      my $strlen = $length - length($ellipsis);
+      my $newstr = substr($string, 0, $strlen) . $ellipsis;
+      return $newstr;
+  };
+    
+###############################################################################
+
+sub GetOutputFormats {
+    # Builds a set of possible output formats for a script by looking for
+    # format files in the appropriate template directories as specified by 
+    # the template include path, the sub-directory parameter, and the
+    # template name parameter.
+    
+    # This function is relevant for scripts with one basic function whose
+    # results can be represented in multiple formats, f.e. buglist.cgi, 
+    # which has one function (query and display of a list of bugs) that can 
+    # be represented in multiple formats (i.e. html, rdf, xml, etc.).
+    
+    # It is *not* relevant for scripts with several functions but only one
+    # basic output format, f.e. editattachstatuses.cgi, which not only lists 
+    # statuses but also provides adding, editing, and deleting functions.
+    # (although it may be possible to make this function applicable under 
+    # these circumstances with minimal modification).
+    
+    # Format files have names that look like SCRIPT-FORMAT.EXT.tmpl, where
+    # SCRIPT is the name of the CGI script being invoked, SUBDIR is the name 
+    # of the template sub-directory, FORMAT is the name of the format, and EXT 
+    # is the filename extension identifying the content type of the output.
+     
+    # When a format file is found, a record for that format is added to
+    # the hash of format records, indexed by format name, with each record
+    # containing the name of the format file, its filename extension,
+    # and its content type (obtained by reference to the $::contenttypes
+    # hash defined in localconfig).
+    
+    my ($subdir, $script) = @_;
+
+    # A set of output format records, indexed by format name, each record 
+    # containing template, extension, and contenttype fields.
+    my $formats = {};
+    
+    # Get the template include path from the template object.
+    my $includepath = $::template->context->{ LOAD_TEMPLATES }->[0]->include_path();
+    
+    # Loop over each include directory in reverse so that format files
+    # earlier in the path override files with the same name later in
+    # the path (i.e. "custom" formats override "default" ones).
+    foreach my $path (reverse @$includepath) {
+        # Get the list of files in the given sub-directory if it exists.
+        my $dirname = File::Spec->catdir($path, $subdir);
+        opendir(SUBDIR, $dirname) || next;
+        my @files = readdir SUBDIR;
+        closedir SUBDIR;
+        
+        # Loop over each file in the sub-directory looking for format files
+        # (files whose name looks like SCRIPT-FORMAT.EXT.tmpl).
+        foreach my $file (@files) {
+            if ($file =~ /^\Q$script\E-(.+)\.(.+)\.tmpl$/) {
+                # This must be a valid file
+                # If an attacker could add a previously unused format
+                # type to trick us into running it, then they could just
+                # change an existing one...
+                # (This implies that running without a webservergroup is
+                # insecure, but that is the case anyway)
+                trick_taint($file);
+
+                $formats->{$1} = { 
+                  'template'    => $file , 
+                  'extension'   => $2 , 
+                  'contenttype' => $::contenttypes->{$2} || "text/plain" , 
+                };
+            }
+        }
+    }
+    return $formats;
+}
+
+sub ValidateOutputFormat {
+    my ($format, $script, $subdir) = @_;
+    
+    # If the script name is undefined, assume the script currently being
+    # executed, deriving its name from Perl's built-in $0 (program name) var.
+    if (!defined($script)) {
+        my ($volume, $dirs, $filename) = File::Spec->splitpath($0);
+        $filename =~ /^(.+)\.cgi$/;
+        $script = $1
+          || DisplayError("Could not determine the name of the script.")
+          && exit;
+    }
+    
+    # If the format name is undefined or the default format is specified,
+    # do not do any validation but instead return the default format.
+    if (!defined($format) || $format eq "default") {
+        return 
+          { 
+            'template'    => "$script.html.tmpl" , 
+            'extension'   => "html" , 
+            'contenttype' => "text/html" , 
+          };
+    }
+    
+    # If the subdirectory name is undefined, assume the script name.
+    $subdir = $script if !defined($subdir);
+    
+    # Get the list of output formats supported by this script.
+    my $formats = GetOutputFormats($subdir, $script);
+    
+    # Validate the output format requested by the user.
+    if (!$formats->{$format}) {
+        my $escapedname = html_quote($format);
+        DisplayError("The <em>$escapedname</em> output format is not 
+          supported by this script.  Supported formats (besides the 
+          default HTML format) are <em>" . 
+          join("</em>, <em>", map(html_quote($_), keys(%$formats))) . 
+          "</em>.");
+        exit;
+    }
+    
+    # Return the validated output format.
+    return $formats->{$format};
 }
 
+###############################################################################
+
+# Define the global variables and functions that will be passed to the UI
+# template.  Additional values may be added to this hash before templates
+# are processed.
+$::vars =
+  {
+    # Function for retrieving global parameters.
+    'Param' => \&Param ,
+
+    # Function for processing global parameters that contain references
+    # to other global parameters.
+    'PerformSubsts' => \&PerformSubsts ,
+
+    # Generic linear search function
+    'lsearch' => \&lsearch ,
+
+    # UserInGroup - you probably want to cache this
+    'UserInGroup' => \&UserInGroup ,
+
+    # SyncAnyPendingShadowChanges - called in the footer to sync the shadowdb
+    'SyncAnyPendingShadowChanges' => \&SyncAnyPendingShadowChanges ,
+    
+    # User Agent - useful for detecting in templates
+    'user_agent' => $ENV{'HTTP_USER_AGENT'} ,
+  };
+
 1;
diff --git a/help.html b/help.html
index d84bbfd45..a7c93cb45 100644
--- a/help.html
+++ b/help.html
@@ -1,3 +1,4 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <HTML>
 <!--
      The contents of this file are subject to the Mozilla Public
@@ -22,7 +23,10 @@
      Contributor(s): Terry Weissman <terry@mozilla.org>
 -->
 
+<head>
 <TITLE>Clue</TITLE>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head><body>
 <H1>A Clue</H1>
 This form will allow you to call up a subset of the bug list.
 You should be able to add the URL of the resulting list to
@@ -42,7 +46,7 @@ you can add other criteria.
 <P>
 For example, if you wanted to see all bugs reported against the X platform
 and assigned to jwz, you could ask for all bugs assign to jwz, then
-edit the URL in the "Location" box, adding the clause "&rep_platform=X-Windows"
+edit the URL in the "Location" box, adding the clause "&amp;rep_platform=X-Windows"
 to the URL.
 <P>
 Here is a list of some of the field names you could use for additional
@@ -63,4 +67,4 @@ to case any problem with other browsers.  The lynx browser does work, but lynx
 seems to cache results of a .cgi.  You'll sometimes need to press CONTROL-R to reload
 the screen to see an update.
 
-</html>
+</body></html>
diff --git a/helpemailquery.html b/helpemailquery.html
index 622e3aa45..5c4527a78 100644
--- a/helpemailquery.html
+++ b/helpemailquery.html
@@ -1,36 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
 <html> <head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <title>Help on searching by email address.</title>
 </head>
 
 <body>
 <h1>Help on searching by email address.</h1>
 
+<p>
 This used to be simpler, but not very powerful.  Now it's really
 powerful and useful, but it may not be obvious how to use it...
+</p>
 
 <p>
-
 To search for bugs associated with an email address:
+</p>
 
 <ul>
-  <li> Type a portion of an email address into the text field.
+  <li> Type a portion of an email address into the text field.</li>
   <li> Select which fields of the bug you expect that address to be in
-       the bugs you're looking for.
+       the bugs you're looking for.</li>
 </ul>
 
 <p>
-
 You can look for up to two different email addresses; if you specify
 both, then only bugs which match both will show up.  This is useful to
 find bugs that were, for example, created by Ralph and assigned to
 Fred.
+</p>
 
 <p>
-
 You can also use the drop down menus to specify whether you want to
 match addresses by doing a substring match, by using regular
 expressions, or by exactly matching a fully specified email address.
-
-
+</p>
 
 </body> </html>
diff --git a/how_to_mail.html b/how_to_mail.html
index 3ee5b205d..b60c41688 100644
--- a/how_to_mail.html
+++ b/how_to_mail.html
@@ -1,4 +1,6 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <HTML>
+<head>
 
 <!--
      The contents of this file are subject to the Mozilla Public
@@ -25,6 +27,9 @@
 
 
 <TITLE>How to Mail to bugzilla</TITLE>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
 
 <H1>THIS DOESN'T WORK RIGHT NOW.  Coming someday.</H1>
 
@@ -81,3 +86,5 @@ EXAMPLE: <P>
     .
 
 </PRE>
+
+</body></html>
diff --git a/importxml.pl b/importxml.pl
index 83b142763..964d29a6f 100755
--- a/importxml.pl
+++ b/importxml.pl
@@ -53,7 +53,10 @@ BEGIN {
  $::path = $0;
  $::path =~ m#(.*)/[^/]+#;
  $::path = $1;
+ $::path ||= '.';  # $0 is empty at compile time.  This line will
+                   # have no effect on this script at runtime.
 }
+
 chdir $::path;
 use lib ($::path);
 
@@ -85,12 +88,15 @@ sub sillyness {
     $zz = %::target_milestone;
 }
 
+# XML::Parser automatically unquotes characters when it
+# parses the XML, so this routine shouldn't be needed
+# for anything (see bug 109530).
 sub UnQuoteXMLChars {
     $_[0] =~ s/&amp;/&/g;
     $_[0] =~ s/&lt;/</g;
     $_[0] =~ s/&gt;/>/g;
-    $_[0] =~ s/&apos;/'/g;
-    $_[0] =~ s/&quot;/"/g;
+    $_[0] =~ s/&apos;/'/g;  # ' # Darned emacs colors
+    $_[0] =~ s/&quot;/"/g;  # " # Darned emacs colors
 #    $_[0] =~ s/([\x80-\xFF])/&XmlUtf8Encode(ord($1))/ge;
     return($_[0]);
 }
@@ -108,7 +114,7 @@ sub MailMessage {
   $header.= "Subject: $subject\n\n";
 
   open(SENDMAIL,
-    "|/usr/lib/sendmail -ODeliveryMode=background -t") ||
+    "|/usr/lib/sendmail -ODeliveryMode=background -t -i") ||
       die "Can't open sendmail";
   print SENDMAIL $header . $message . "\n";
   close SENDMAIL;
@@ -129,7 +135,7 @@ sub Log {
 sub Lock {
     if ($::lockcount <= 0) {
         $::lockcount = 0;
-        open(LOCKFID, ">>data/maillock") || die "Can't open lockfile.";
+        open(LOCKFID, ">>data/maillock") || die "Can't open data/maillock: $!";
         my $val = flock(LOCKFID,2);
         if (!$val) { # '2' is magic 'exclusive lock' const.
             print "Content-type: text/html\n\n";
@@ -311,7 +317,7 @@ for (my $k=1 ; $k <= $bugqty ; $k++) {
       $long_description .= "$sorted_descs[$z]->{'bug_when'}"; 
       $long_description .= " ----\n\n";
     }
-    $long_description .=  UnQuoteXMLChars($sorted_descs[$z]->{'thetext'});
+    $long_description .=  $sorted_descs[$z]->{'thetext'};
     $long_description .=  "\n";
   }
 
@@ -344,12 +350,12 @@ for (my $k=1 ; $k <= $bugqty ; $k++) {
 
   if ( (defined $bug_fields{'bug_file_loc'}) && ($bug_fields{'bug_file_loc'}) ){
       push (@query, "bug_file_loc");
-      push (@values, SqlQuote(UnQuoteXMLChars($bug_fields{'bug_file_loc'})));
+      push (@values, SqlQuote($bug_fields{'bug_file_loc'}));
       }
 
   if ( (defined $bug_fields{'short_desc'}) && ($bug_fields{'short_desc'}) ){
       push (@query, "short_desc");
-      push (@values, SqlQuote(UnQuoteXMLChars($bug_fields{'short_desc'})) );
+      push (@values, SqlQuote($bug_fields{'short_desc'}) );
       }
 
 
diff --git a/index.cgi b/index.cgi
new file mode 100755
index 000000000..d5ee0d28d
--- /dev/null
+++ b/index.cgi
@@ -0,0 +1,63 @@
+#!/usr/bonsaitools/bin/perl -wT
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is the Bugzilla Bug Tracking System.
+#
+# The Initial Developer of the Original Code is Netscape Communications
+# Corporation. Portions created by Netscape are
+# Copyright (C) 1998 Netscape Communications Corporation. All
+# Rights Reserved.
+#
+# Contributor(s): Jacob Steenhagen <jake@acutex.net>
+#
+
+# Suppress silly "used only once" warnings
+use vars qw{ %COOKIE };
+
+
+###############################################################################
+# Script Initialization
+###############################################################################
+
+# Make it harder for us to do dangerous things in Perl.
+use diagnostics;
+use strict;
+
+# Include the Bugzilla CGI and general utility library.
+use lib ".";
+require "CGI.pl";
+
+use vars qw(
+  $template
+  $vars
+);
+
+# Establish a connection to the database backend.
+ConnectToDatabase();
+
+# Check whether or not the user is logged in and, if so, set the $::userid 
+# and $::usergroupset variables.
+quietly_check_login();
+
+###############################################################################
+# Main Body Execution
+###############################################################################
+
+$vars->{'username'} = $::COOKIE{'Bugzilla_login'} || '';
+
+# Return the appropriate HTTP response headers.
+print "Content-Type: text/html\n\n";
+
+# Generate and return the UI (HTML page) from the appropriate template.
+$template->process("index.html.tmpl", $vars)
+  || ThrowTemplateError($template->error());
diff --git a/index.html b/index.html
deleted file mode 100644
index 3a1a76ff6..000000000
--- a/index.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
-<HTML>
-<!--
-     The contents of this file are subject to the Mozilla Public
-     License Version 1.1 (the "License"); you may not use this file
-     except in compliance with the License. You may obtain a copy of
-     the License at http://www.mozilla.org/MPL/
-    
-     Software distributed under the License is distributed on an "AS
-     IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
-     implied. See the License for the specific language governing
-     rights and limitations under the License.
-    
-     The Original Code is the Bugzilla Bug Tracking System.
-    
-     The Initial Developer of the Original Code is Netscape Communications
-     Corporation. Portions created by Netscape are
-     Copyright (C) 1998 Netscape Communications Corporation. All
-     Rights Reserved.
-    
-     Contributor(s): 
-
-     Contributor(s): Terry Weissman <terry@mozilla.org>
--->
-<HEAD><TITLE>Bugzilla Main Page</TITLE></HEAD>
-<BODY   BGCOLOR="#FFFFFF" TEXT="#000000"
-LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000">
-<TABLE BGCOLOR="#000000" WIDTH="100%" BORDER=0 CELLPADDING=0 CELLSPACING=0>
-<TR><TD><A HREF="http://www.mozilla.org/"><IMG
- SRC="http://www.mozilla.org/images/mozilla-banner.gif" ALT=""
- BORDER=0 WIDTH=600 HEIGHT=58></A></TD></TR></TABLE>
-<TABLE BORDER=0 CELLPADDING=12 CELLSPACING=0 WIDTH="100%">
- <TR>
-
-  <TD>
-
-   <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=2>
-
-    <TR><TD VALIGN=TOP ALIGN=CENTER NOWRAP>
-
-     <FONT SIZE="+3"><B><NOBR>Main Page</NOBR></B></FONT>
-
-    </TD></TR><TR><TD VALIGN=TOP ALIGN=CENTER>
-
-     <B></B>
-
-    </TD></TR>
-
-   </TABLE>
-
-  </TD>
-
-  <TD>
-
-   This is <B>Bugzilla</B>: the Mozilla bug system.  For more 
-   information about what Bugzilla is and what it can do, see 
-   <A HREF="http://www.mozilla.org/">mozilla.org</A>'s
-   <A HREF="http://www.mozilla.org/bugs/"><B>bug pages</B></A>.
-</TD></TR></TABLE>
-
-
-<img align=right width=329 height=220 src=ant.jpg border=2>
-
-
-This is where we put in lots of nifty words explaining all about
-bugzilla.
-
-<p>
-
-But it all boils down to a choice of:
-<br>
-<a href="query.cgi">Query existing bug reports</a><br>
-<a href="enter_bug.cgi">Enter a new bug report</a><br>
-<a href="reports.cgi">Get summary reports</a><br>
-<p>
-<a href="createaccount.cgi">Open a new Bugzilla account</a><br>
-<a href="relogin.cgi">Forget the currently stored login</a><br>
-<a href="userprefs.cgi">Change password or user preferences</a><br>
-<p>
-<script language="JavaScript" src="localconfig.js"></script>
-<script language="JavaScript" src="quicksearch.js"></script>
-
-<form name="f" action="show_bug.cgi" method="get"
-      onsubmit="QuickSearch(); return false;"> 
-  Enter a bug # or some search terms:<br>
-  <input type="text" name="id">
-  <input type="submit" value="Show">
-  <a href="quicksearch.html">[Help]</a>
-</form>
-
-<script>
-<!--
-document.forms['f'].id.focus();
-//-->
-</script>
-
-</BODY>
-</HTML>
diff --git a/long_list.cgi b/long_list.cgi
index b74e1378b..a828b8711 100755
--- a/long_list.cgi
+++ b/long_list.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -19,108 +19,98 @@
 # Rights Reserved.
 #
 # Contributor(s): Terry Weissman <terry@mozilla.org>
-
+#                 Gervase Markham <gerv@gerv.net>
 
 use diagnostics;
 use strict;
+use lib qw(.);
 
 require "CGI.pl";
 
-# Shut up misguided -w warnings about "used only once".  "use vars" just
-# doesn't work for me.
-
-sub sillyness {
-    my $zz;
-    $zz = $::legal_keywords;
-    $zz = $::usergroupset;
-    $zz = %::FORM;
-}
+use vars qw($userid $usergroupset @legal_keywords %FORM);
 
-print "Content-type: text/html\n";
-#Changing attachment to inline to resolve 46897
-#zach@zachlipton.com
-print "Content-disposition: inline; filename=bugzilla_bug_list.html\n\n";
-PutHeader ("Full Text Bug Listing");
+# Use global template variables.
+use vars qw($template $vars);
 
 ConnectToDatabase();
+
 quietly_check_login();
 
 GetVersionTable();
 
-my $generic_query  = "
-select
-  bugs.bug_id,
-  bugs.product,
-  bugs.version,
-  bugs.rep_platform,
-  bugs.op_sys,
-  bugs.bug_status,
-  bugs.bug_severity,
-  bugs.priority,
-  bugs.resolution,
-  assign.login_name,
-  report.login_name,
-  bugs.component,
-  bugs.bug_file_loc,
-  bugs.short_desc,
-  bugs.target_milestone,
-  bugs.qa_contact,
-  bugs.status_whiteboard,
-  bugs.keywords
-from bugs,profiles assign,profiles report
-where assign.userid = bugs.assigned_to and report.userid = bugs.reporter and
-bugs.groupset & $::usergroupset = bugs.groupset and";
-
-$::FORM{'buglist'} = "" unless exists $::FORM{'buglist'};
-foreach my $bug (split(/:/, $::FORM{'buglist'})) {
-    detaint_natural($bug) || next;
-    SendSQL("$generic_query bugs.bug_id = $bug");
-
-    my @row;
-    if (@row = FetchSQLData()) {
-        my ($id, $product, $version, $platform, $opsys, $status, $severity,
-            $priority, $resolution, $assigned, $reporter, $component, $url,
-            $shortdesc, $target_milestone, $qa_contact,
-            $status_whiteboard, $keywords) = (@row);
-        print "<IMG SRC=\"1x1.gif\" WIDTH=1 HEIGHT=80 ALIGN=LEFT>\n";
-        print "<TABLE WIDTH=100%>\n";
-        print "<TD COLSPAN=4><TR><DIV ALIGN=CENTER><B><FONT =\"+3\">" .
-            html_quote($shortdesc) .
-                "</B></FONT></DIV>\n";
-        print "<TR><TD><B>Bug#:</B> <A HREF=\"show_bug.cgi?id=$id\">$id</A>\n";
-        print "<TD><B>Product:</B> $product\n";
-        print "<TD><B>Version:</B> $version\n";
-        print "<TD><B>Platform:</B> $platform\n";
-        print "<TR><TD><B>OS/Version:</B> $opsys\n";
-        print "<TD><B>Status:</B> $status\n";
-        print "<TD><B>Severity:</B> $severity\n";
-        print "<TD><B>Priority:</B> $priority\n";
-        print "<TR><TD><B>Resolution:</B> $resolution</TD>\n";
-        print "<TD><B>Assigned To:</B> $assigned\n";
-        print "<TD><B>Reported By:</B> $reporter\n";
-        if (Param("useqacontact")) {
-            my $name = "";
-            if ($qa_contact > 0) {
-                $name = DBID_to_name($qa_contact);
-            }
-            print "<TD><B>QA Contact:</B> $name\n";
-        }
-        print "<TR><TD><B>Component:</B> $component\n";
-        if (Param("usetargetmilestone")) {
-            print "<TD><B>Target milestone:</B>$target_milestone\n";
-        }
-        print "<TR><TD COLSPAN=6><B>URL:</B>&nbsp;";
-	print "<A HREF=\"" . $url . "\">" .  html_quote($url) . "</A>\n"; 
-        print "<TR><TD COLSPAN=6><B>Summary:</B> " . html_quote($shortdesc) . "\n";
-        if (@::legal_keywords) {
-            print "<TR><TD><B>Keywords: </B>$keywords</TD></TR>\n";
-        }
-        if (Param("usestatuswhiteboard")) {
-            print "<TR><TD COLSPAN=6><B>Status Whiteboard:" .
-                html_quote($status_whiteboard) . "\n";
-        }
-        print "<TR><TD><B>Description:</B>\n</TABLE>\n";
-        print GetLongDescriptionAsHTML($bug);
-        print "<HR>\n";
+my $generic_query = "
+  SELECT 
+    bugs.bug_id, 
+    bugs.product, 
+    bugs.version, 
+    bugs.rep_platform,
+    bugs.op_sys, 
+    bugs.bug_status, 
+    bugs.resolution, 
+    bugs.priority,
+    bugs.bug_severity, 
+    bugs.component, 
+    assign.login_name, 
+    report.login_name,
+    bugs.bug_file_loc, 
+    bugs.short_desc, 
+    bugs.target_milestone,
+    bugs.qa_contact, 
+    bugs.status_whiteboard, 
+    bugs.keywords
+  FROM bugs,profiles assign,profiles report
+  WHERE assign.userid = bugs.assigned_to AND report.userid = bugs.reporter";
+
+my $buglist = $::FORM{'buglist'} || 
+              $::FORM{'bug_id'}  || 
+              $::FORM{'id'}      || "";
+
+my @bugs;
+
+foreach my $bug_id (split(/[:,]/, $buglist)) {
+    detaint_natural($bug_id) || next;
+    SendSQL(SelectVisible("$generic_query AND bugs.bug_id = $bug_id",
+                          $::userid, $::usergroupset));
+
+    my %bug;
+    my @row = FetchSQLData();
+
+    foreach my $field ("bug_id", "product", "version", "rep_platform",
+                       "op_sys", "bug_status", "resolution", "priority",
+                       "bug_severity", "component", "assigned_to", "reporter",
+                       "bug_file_loc", "short_desc", "target_milestone",
+                       "qa_contact", "status_whiteboard", "keywords") 
+    {
+        $bug{$field} = shift @row;
+    }
+    
+    if ($bug{'bug_id'}) {
+        $bug{'comments'} = GetComments($bug{'bug_id'});
+        $bug{'qa_contact'} = $bug{'qa_contact'} > 0 ? 
+                                          DBID_to_name($bug{'qa_contact'}) : "";
+
+        push (@bugs, \%bug);
     }
 }
+
+# Add the list of bug hashes to the variables
+$vars->{'bugs'} = \@bugs;
+
+$vars->{'use_keywords'} = 1 if (@::legal_keywords);
+
+$vars->{'quoteUrls'} = \&quoteUrls;
+$vars->{'time2str'} = \&time2str;
+$vars->{'str2time'} = \&str2time;
+
+# Work out a sensible filename for Content-Disposition.
+# Sadly, I don't think we can tell if this was a named query.
+my @time = localtime(time());
+my $date = sprintf "%04d-%02d-%02d", 1900+$time[5],$time[4]+1,$time[3];
+my $filename = "bugs-$date.html";
+
+print "Content-Type: text/html\n";
+print "Content-Disposition: inline; filename=$filename\n\n";
+
+# Generate and return the UI (HTML page) from the appropriate template.
+$template->process("bug/show-multiple.html.tmpl", $vars)
+  || ThrowTemplateError($template->error());
diff --git a/move.pl b/move.pl
index 7254871d4..66a75f95f 100755
--- a/move.pl
+++ b/move.pl
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -23,6 +23,9 @@
 
 use diagnostics;
 use strict;
+
+use lib qw(.);
+
 use Bug;
 require "CGI.pl";
 $::lockcount = 0;
@@ -34,6 +37,7 @@ unless ( Param("move-enabled") ) {
 }
 
 ConnectToDatabase();
+confirm_login();
 
 sub Log {
     my ($str) = (@_);
@@ -47,7 +51,7 @@ sub Log {
 sub Lock {
     if ($::lockcount <= 0) {
         $::lockcount = 0;
-        open(LOCKFID, ">>data/maillock") || die "Can't open lockfile.";
+        open(LOCKFID, ">>data/maillock") || die "Can't open data/maillock: $!";
         my $val = flock(LOCKFID,2);
         if (!$val) { # '2' is magic 'exclusive lock' const.
             print "Content-type: text/html\n\n";
@@ -77,7 +81,6 @@ if ( !defined $::FORM{'buglist'} ) {
   exit;
 }
 
-confirm_login();
 my $exporter = $::COOKIE{"Bugzilla_login"};
 my $movers = Param("movers");
 $movers =~ s/\w?,\w?/|/g;
@@ -114,7 +117,11 @@ foreach my $id (split(/:/, $::FORM{'buglist'})) {
     SendSQL("UPDATE bugs SET bug_status =\"RESOLVED\" where bug_id=\"$id\"");
     SendSQL("UPDATE bugs SET resolution =\"MOVED\" where bug_id=\"$id\"");
 
-    my $comment = "Bug moved to " . Param("move-to-url") . ".\n\n";
+    my $comment = "";
+    if (defined $::FORM{'comment'} && $::FORM{'comment'} !~ /^\s*$/) {
+        $comment .= $::FORM{'comment'} . "\n\n";
+    }
+    $comment .= "Bug moved to " . Param("move-to-url") . ".\n\n";
     $comment .= "If the move succeeded, $exporter will receive a mail\n";
     $comment .= "containing the number of the new bug in the other database.\n";
     $comment .= "If all went well,  please mark this bug verified, and paste\n";
@@ -143,7 +150,7 @@ $msg .= "Subject: Moving bug(s) $buglist\n\n";
 $msg .= $xml . "\n";
 
 open(SENDMAIL,
-  "|/usr/lib/sendmail -ODeliveryMode=background -t") ||
+  "|/usr/lib/sendmail -ODeliveryMode=background -t -i") ||
     die "Can't open sendmail";
 print SENDMAIL $msg;
 close SENDMAIL;
diff --git a/new_comment.cgi b/new_comment.cgi
deleted file mode 100755
index d504c0597..000000000
--- a/new_comment.cgi
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/usr/bonsaitools/bin/perl
-# -*- Mode: perl; indent-tabs-mode: nil -*-
-#
-# The contents of this file are subject to the Mozilla Public
-# License Version 1.1 (the "License"); you may not use this file
-# except in compliance with the License. You may obtain a copy of
-# the License at http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS
-# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
-# implied. See the License for the specific language governing
-# rights and limitations under the License.
-#
-# The Original Code is the Bugzilla Bug Tracking System.
-#
-# The Initial Developer of the Original Code is Netscape Communications
-# Corporation. Portions created by Netscape are
-# Copyright (C) 1998 Netscape Communications Corporation. All
-# Rights Reserved.
-#
-# Contributor(s): Terry Weissman <terry@mozilla.org>
-
-if ($ENV{'REQUEST_METHOD'} eq "GET") { $buffer = $ENV{'QUERY_STRING'}; }
-else { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
-# Split the name-value pairs
-@pairs = split(/&/, $buffer);
-foreach $pair (@pairs)
-{
-    ($name, $value) = split(/=/, $pair);
-
-    $value =~ tr/+/ /;
-    $value =~ s/^(\s*)//s;
-    $value =~ s/(\s*)$//s;
-    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
-    $FORM{$name} = $value;
-}
-$c=$FORM{"comment"};
-if ( (!defined $c) || ($c eq '') ) {
-    print "Content-type: text/html\n\n";
-    print "<TITLE>Nothing on your mind?</TITLE>";
-    print "<H1>Does your mind draw a blank?</H1>";
-	print "<H2> Hit back, and try again...</H2>";
-    exit 0;
-}
-if ($c =~ m/</) {
-	print "Content-type: text/html\n\n";
-	print "<CENTER><H1>For security reasons, support for tags";
-	print " has been turned off in quips.\n</H1>\n";
-	print "<H2> Hit back, and try again...</H2></CENTER>\n";
-    exit 0;
-}
-
-open(COMMENTS, ">>data/comments");
-print COMMENTS $FORM{"comment"} . "\n";
-close(COMMENTS);
-print "Content-type: text/html\n\n";
-print "<TITLE>The Word Of Confirmation</TITLE>";
-print "<H1>Done</H1>";
-print $c;
diff --git a/notargetmilestone.html b/notargetmilestone.html
index c2f697abb..1cedb1aca 100644
--- a/notargetmilestone.html
+++ b/notargetmilestone.html
@@ -1,3 +1,4 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
 <html> <head>
 <title>No target milestones</title>
 </head>
@@ -5,6 +6,11 @@
 <body>
 <h1>No target milestones.</h1>
 
+<p>
 No target milestones have been defined for this product.  You can set
 the Target Milestone field to things, but there is not currently any
 agreed definition of what the milestones are.
+</p>
+
+</body>
+</html>
diff --git a/post_bug.cgi b/post_bug.cgi
index dcb3f245f..8bba70d59 100755
--- a/post_bug.cgi
+++ b/post_bug.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -21,15 +21,17 @@
 # Contributor(s): Terry Weissman <terry@mozilla.org>
 #                 Dan Mosedale <dmose@mozilla.org>
 #                 Joe Robins <jmrobins@tgix.com>
+#                 Gervase Markham <gerv@gerv.net>
 
 use diagnostics;
 use strict;
+use lib qw(.);
 
 require "CGI.pl";
+require "bug_form.pl";
 
-# Shut up misguided -w warnings about "used only once".  For some reason,
+# Shut up misguided -w warnings about "used only once". For some reason,
 # "use vars" chokes on me when I try it here.
-
 sub sillyness {
     my $zz;
     $zz = $::buffer;
@@ -37,7 +39,6 @@ sub sillyness {
     $zz = %::COOKIE;
     $zz = %::components;
     $zz = %::versions;
-    $zz = @::legal_bug_status;
     $zz = @::legal_opsys;
     $zz = @::legal_platform;
     $zz = @::legal_priority;
@@ -46,60 +47,84 @@ sub sillyness {
     $zz = %::target_milestone;
 }
 
+# Use global template variables.
+use vars qw($vars $template);
+
+ConnectToDatabase();
 confirm_login();
 
-print "Set-Cookie: PLATFORM=$::FORM{'product'} ; path=/ ; expires=Sun, 30-Jun-2029 00:00:00 GMT\n" if ( exists $::FORM{'product'} );
-print "Set-Cookie: VERSION-$::FORM{'product'}=$::FORM{'version'} ; path=/ ; expires=Sun, 30-Jun-2029 00:00:00 GMT\n" if ( exists $::FORM{'product'} && exists $::FORM{'version'} );
 
-print "Content-type: text/html\n\n";
+# The format of the initial comment can be structured by adding fields to the
+# enter_bug template and then referencing them in the comment template.
+my $comment;
+
+$vars->{'form'} = \%::FORM;
+
+# We can't use ValidateOutputFormat here because it defaults to HTML.
+my $template_name = "bug/create/comment";
+$template_name .= ($::FORM{'format'} ? "-$::FORM{'format'}" : "");
+
+$template->process("$template_name.txt.tmpl", $vars, \$comment)
+  || ThrowTemplateError($template->error());
+
+ValidateComment($comment);
+
+my $product = $::FORM{'product'};
+
+# Set cookies
+my $cookiepath = Param("cookiepath");
+if (exists $::FORM{'product'}) {
+    if (exists $::FORM{'version'}) {           
+        print "Set-Cookie: VERSION-$product=$::FORM{'version'} ; \
+               path=$cookiepath ; expires=Sun, 30-Jun-2029 00:00:00 GMT\n"; 
+    }
+}
 
 if (defined $::FORM{'maketemplate'}) {
-    print "<TITLE>Bookmarks are your friend.</TITLE>\n";
-    print "<H1>Template constructed.</H1>\n";
+    $vars->{'url'} = $::buffer;
     
-    my $url = "enter_bug.cgi?$::buffer";
-
-    print "If you put a bookmark <a href=\"$url\">to this link</a>, it will\n";
-    print "bring up the submit-a-new-bug page with the fields initialized\n";
-    print "as you've requested.\n";
-    PutFooter();
+    print "Content-type: text/html\n\n";
+    $template->process("bug/create/make-template.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
     exit;
 }
 
-PutHeader("Posting Bug -- Please wait", "Posting Bug", "One moment please...");
-
 umask 0;
-ConnectToDatabase();
-
-my $product = $::FORM{'product'};
 
+# Some sanity checking
 if(Param("usebuggroupsentry") && GroupExists($product)) {
-  if(!UserInGroup($product)) {
-    print "<H1>Permission denied.</H1>\n";
-    print "Sorry; you do not have the permissions necessary to enter\n";
-    print "a bug against this product.\n";
-    print "<P>\n";
-    PutFooter();
-    exit;
-  }
+    if(!UserInGroup($product)) {
+        DisplayError("Sorry; you do not have the permissions necessary to enter
+                      a bug against this product.", "Permission Denied");
+        exit;
+    }
 }
 
-if (!defined $::FORM{'component'} || $::FORM{'component'} eq "") {
-    PuntTryAgain("You must choose a component that corresponds to this bug. " .
-                 "If necessary, just guess.");
+if (!$::FORM{'component'}) {
+    DisplayError("You must choose a component that corresponds to this bug.
+                  If necessary, just guess.");
+    exit;                  
 }
 
 if (!defined $::FORM{'short_desc'} || trim($::FORM{'short_desc'}) eq "") {
-    PuntTryAgain("You must enter a summary for this bug.");
+    DisplayError("You must enter a summary for this bug.");
+    exit;
 }
 
+# If bug_file_loc is "http://", the default, strip it out and use an empty
+# value. 
+$::FORM{'bug_file_loc'} = "" if $::FORM{'bug_file_loc'} eq 'http://';
+    
+my $sql_product = SqlQuote($::FORM{'product'});
+my $sql_component = SqlQuote($::FORM{'component'});
+
+# Default assignee is the component owner.
 if ($::FORM{'assigned_to'} eq "") {
-    SendSQL("select initialowner from components where program=" .
-            SqlQuote($::FORM{'product'}) .
-            " and value=" . SqlQuote($::FORM{'component'}));
+    SendSQL("SELECT initialowner FROM components " .
+            "WHERE program=$sql_product AND value=$sql_component");
     $::FORM{'assigned_to'} = FetchOneColumn();
 } else {
-    $::FORM{'assigned_to'} = DBNameToIdAndCheck($::FORM{'assigned_to'});
+    $::FORM{'assigned_to'} = DBNameToIdAndCheck(trim($::FORM{'assigned_to'}));
 }
 
 my @bug_fields = ("product", "version", "rep_platform",
@@ -108,157 +133,186 @@ my @bug_fields = ("product", "version", "rep_platform",
                   "target_milestone");
 
 if (Param("useqacontact")) {
-    SendSQL("select initialqacontact from components where program=" .
-            SqlQuote($::FORM{'product'}) .
-            " and value=" . SqlQuote($::FORM{'component'}));
-    my $qacontact = FetchOneColumn();
-    if (defined $qacontact && $qacontact != 0) {
-        $::FORM{'qa_contact'} = $qacontact;
+    SendSQL("SELECT initialqacontact FROM components " .
+            "WHERE program=$sql_product AND value=$sql_component");
+    my $qa_contact = FetchOneColumn();
+    if (defined $qa_contact && $qa_contact != 0) {
+        $::FORM{'qa_contact'} = $qa_contact;
         push(@bug_fields, "qa_contact");
     }
 }
 
 if (exists $::FORM{'bug_status'}) {
-    if (!UserInGroup("canedit") && !UserInGroup("canconfirm")) {
+    # Ignore the given status, so that we can set it to UNCONFIRMED
+    # or NEW, depending on votestoconfirm if either the given state was
+    # unconfirmed (so that a user can't override the below check), or if
+    # the user doesn't have permission to change the default status anyway
+    if ($::FORM{'bug_status'} eq $::unconfirmedstate
+        || (!UserInGroup("canedit") && !UserInGroup("canconfirm"))) {
         delete $::FORM{'bug_status'};
     }
 }
 
 if (!exists $::FORM{'bug_status'}) {
     $::FORM{'bug_status'} = $::unconfirmedstate;
-    SendSQL("SELECT votestoconfirm FROM products WHERE product = " .
-            SqlQuote($::FORM{'product'}));
+    SendSQL("SELECT votestoconfirm FROM products WHERE product=$sql_product");
     if (!FetchOneColumn()) {
         $::FORM{'bug_status'} = "NEW";
     }
 }
 
 if (!exists $::FORM{'target_milestone'}) {
-    SendSQL("SELECT defaultmilestone FROM products " .
-            "WHERE product = " . SqlQuote($::FORM{'product'}));
+    SendSQL("SELECT defaultmilestone FROM products WHERE product=$sql_product");
     $::FORM{'target_milestone'} = FetchOneColumn();
 }
 
-if ( Param("strictvaluechecks") ) {
-    GetVersionTable();  
-    CheckFormField(\%::FORM, 'product', \@::legal_product);
-    CheckFormField(\%::FORM, 'version', \@{$::versions{$::FORM{'product'}}});
-    CheckFormField(\%::FORM, 'target_milestone',
-                   \@{$::target_milestone{$::FORM{'product'}}});
-    CheckFormField(\%::FORM, 'rep_platform', \@::legal_platform);
-    CheckFormField(\%::FORM, 'bug_severity', \@::legal_severity);
-    CheckFormField(\%::FORM, 'priority', \@::legal_priority);
-    CheckFormField(\%::FORM, 'op_sys', \@::legal_opsys);
-    CheckFormFieldDefined(\%::FORM, 'assigned_to');
-    CheckFormField(\%::FORM, 'bug_status', \@::legal_bug_status);
-    CheckFormFieldDefined(\%::FORM, 'bug_file_loc');
-    CheckFormField(\%::FORM, 'component', 
-                   \@{$::components{$::FORM{'product'}}});
-    CheckFormFieldDefined(\%::FORM, 'comment');
+if (!Param('letsubmitterchoosepriority')) {
+    $::FORM{'priority'} = Param('defaultpriority');
 }
 
+GetVersionTable();
+
+# Some more sanity checking
+CheckFormField(\%::FORM, 'product',      \@::legal_product);
+CheckFormField(\%::FORM, 'rep_platform', \@::legal_platform);
+CheckFormField(\%::FORM, 'bug_severity', \@::legal_severity);
+CheckFormField(\%::FORM, 'priority',     \@::legal_priority);
+CheckFormField(\%::FORM, 'op_sys',       \@::legal_opsys);
+CheckFormField(\%::FORM, 'bug_status',   [$::unconfirmedstate, 'NEW']);
+CheckFormField(\%::FORM, 'version',          $::versions{$product});
+CheckFormField(\%::FORM, 'component',        $::components{$product});
+CheckFormField(\%::FORM, 'target_milestone', $::target_milestone{$product});
+CheckFormFieldDefined(\%::FORM, 'assigned_to');
+CheckFormFieldDefined(\%::FORM, 'bug_file_loc');
+CheckFormFieldDefined(\%::FORM, 'comment');
+
 my @used_fields;
-foreach my $f (@bug_fields) {
-    if (exists $::FORM{$f}) {
-        push (@used_fields, $f);
+foreach my $field (@bug_fields) {
+    if (exists $::FORM{$field}) {
+        push (@used_fields, $field);
     }
 }
-if (exists $::FORM{'bug_status'} && $::FORM{'bug_status'} ne $::unconfirmedstate) {
+
+if (exists $::FORM{'bug_status'} 
+    && $::FORM{'bug_status'} ne $::unconfirmedstate) 
+{
     push(@used_fields, "everconfirmed");
     $::FORM{'everconfirmed'} = 1;
 }
 
-my $query = "INSERT INTO bugs (\n" . join(",\n", @used_fields) . ",
-reporter, creation_ts, groupset)
-VALUES (
-";
+my %ccids;
+my @cc;
 
-foreach my $field (@used_fields) {
-# fix for 42609. if there is a http:// only in bug_file_loc, strip
-# it out and send an empty value. 
-    if ($field eq 'bug_file_loc') {
-        if ($::FORM{$field} eq 'http://') {
-            $::FORM{$field} = "";
-            $query .= SqlQuote($::FORM{$field}) . ",\n";
-            next;
-        }
-        else {
-            $query .= SqlQuote($::FORM{$field}) . ",\n";
+# Create the ccid hash for inserting into the db
+# and the list for passing to processmail
+# use a hash rather than a list to avoid adding users twice
+if (defined $::FORM{'cc'}) {
+    foreach my $person (split(/[ ,]/, $::FORM{'cc'})) {
+        if ($person ne "") {
+            my $ccid = DBNameToIdAndCheck($person);
+            if ($ccid && !$ccids{$ccid}) {
+                $ccids{$ccid} = 1;
+                push(@cc, $person);
+            }
         }
     }
-    else {
-        $query .= SqlQuote($::FORM{$field}) . ",\n";
-    }
 }
 
-my $comment = $::FORM{'comment'};
-$comment =~ s/\r\n/\n/g;     # Get rid of windows-style line endings.
-$comment =~ s/\r/\n/g;       # Get rid of mac-style line endings.
+# Build up SQL string to add bug.
+my $sql = "INSERT INTO bugs " . 
+  "(" . join(",", @used_fields) . ", reporter, creation_ts, groupset) " . 
+  "VALUES (";
+
+foreach my $field (@used_fields) {
+    $sql .= SqlQuote($::FORM{$field}) . ",";
+}
+
+$comment =~ s/\r\n?/\n/g;     # Get rid of \r.
 $comment = trim($comment);
-# If comment is all whitespace, it'll be null at this point.  That's
+# If comment is all whitespace, it'll be null at this point. That's
 # OK except for the fact that it causes e-mail to be suppressed.
 $comment = $comment ? $comment : " ";
 
-$query .= "$::userid, now(), (0";
+$sql .= "$::userid, now(), (0";
 
+# Groups
 foreach my $b (grep(/^bit-\d*$/, keys %::FORM)) {
     if ($::FORM{$b}) {
         my $v = substr($b, 4);
         $v =~ /^(\d+)$/
-          || PuntTryAgain("One of the group bits submitted was invalid.");
+          || ThrowCodeError("One of the group bits submitted was invalid.",
+                                                                undef, "abort");
         if (!GroupIsActive($v)) {
             # Prevent the user from adding the bug to an inactive group.
             # Should only happen if there is a bug in Bugzilla or the user
             # hacked the "enter bug" form since otherwise the UI 
             # for adding the bug to the group won't appear on that form.
-            PuntTryAgain("You can't add this bug to the inactive group " . 
-                         "identified by the bit '$v'. This shouldn't happen, " . 
-                         "so it may indicate a bug in Bugzilla.");
+            ThrowCodeError("Attempted to add bug to an inactive group, " . 
+                           "identified by the bit '$v'.", undef, "abort");
         }
-        $query .= " + $v";    # Carefully written so that the math is
-                                # done by MySQL, which can handle 64-bit math,
-                                # and not by Perl, which I *think* can not.
+        $sql .= " + $v";    # Carefully written so that the math is
+                            # done by MySQL, which can handle 64-bit math,
+                            # and not by Perl, which I *think* can not.
     }
 }
 
+$sql .= ") & $::usergroupset)\n";
 
+# Lock tables before inserting records for the new bug into the database
+# if we are using a shadow database to prevent shadow database corruption
+# when two bugs get created at the same time.
+SendSQL("LOCK TABLES bugs WRITE, longdescs WRITE, cc WRITE, profiles READ") if Param("shadowdb");
 
-$query .= ") & $::usergroupset)\n";
+# Add the bug report to the DB.
+SendSQL($sql);
 
+# Get the bug ID back.
+SendSQL("select LAST_INSERT_ID()");
+my $id = FetchOneColumn();
 
-my %ccids;
-
+# Add the comment
+SendSQL("INSERT INTO longdescs (bug_id, who, bug_when, thetext) 
+         VALUES ($id, $::userid, now(), " . SqlQuote($comment) . ")");
 
-if (defined $::FORM{'cc'}) {
-    foreach my $person (split(/[ ,]/, $::FORM{'cc'})) {
-        if ($person ne "") {
-            $ccids{DBNameToIdAndCheck($person)} = 1;
-        }
-    }
+# Insert the cclist into the database
+foreach my $ccid (keys(%ccids)) {
+    SendSQL("INSERT INTO cc (bug_id, who) VALUES ($id, $ccid)");
 }
 
+SendSQL("UNLOCK TABLES") if Param("shadowdb");
 
-# print "<PRE>$query</PRE>\n";
+# Assemble the -force* strings so this counts as "Added to this capacity"
+my @ARGLIST = ();
+if (@cc) {
+    push (@ARGLIST, "-forcecc", join(",", @cc));
+}
 
-SendSQL($query);
+push (@ARGLIST, "-forceowner", DBID_to_name($::FORM{assigned_to}));
 
-SendSQL("select LAST_INSERT_ID()");
-my $id = FetchOneColumn();
+if (defined $::FORM{'qa_contact'}) {
+    push (@ARGLIST, "-forceqacontact", DBID_to_name($::FORM{'qa_contact'}));
+}
 
-SendSQL("INSERT INTO longdescs (bug_id, who, bug_when, thetext) VALUES " .
-        "($id, $::userid, now(), " . SqlQuote($comment) . ")");
+push (@ARGLIST, "-forcereporter", DBID_to_name($::userid));
 
-foreach my $person (keys %ccids) {
-    SendSQL("insert into cc (bug_id, who) values ($id, $person)");
-}
+push (@ARGLIST, $id, $::COOKIE{'Bugzilla_login'});
+
+# Send mail to let people know the bug has been created.
+# See attachment.cgi for explanation of why it's done this way.
+my $mailresults = '';
+open(PMAIL, "-|") or exec('./processmail', @ARGLIST);
+$mailresults .= $_ while <PMAIL>;
+close(PMAIL);
 
-print "<TABLE BORDER=1><TD><H2>Bug $id posted</H2>\n";
-system("./processmail", $id, $::COOKIE{'Bugzilla_login'});
-print "<TD><A HREF=\"show_bug.cgi?id=$id\">Back To BUG# $id</A></TABLE>\n";
+# Tell the user all about it
+$vars->{'id'} = $id;
+$vars->{'mail'} = $mailresults;
+$vars->{'type'} = "created";
 
-print "<BR><A HREF=\"createattachment.cgi?id=$id\">Attach a file to this bug</a>\n";
+print "Content-type: text/html\n\n";
+$template->process("bug/create/created.html.tmpl", $vars)
+  || ThrowTemplateError($template->error());
 
-navigation_header();
+$::FORM{'id'} = $id;
 
-PutFooter();
-exit;
+show_bug("header is already done");
diff --git a/process_bug.cgi b/process_bug.cgi
index ee30b07d8..5482a1ad2 100755
--- a/process_bug.cgi
+++ b/process_bug.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -22,6 +22,7 @@
 #                 Dan Mosedale <dmose@mozilla.org>
 #                 Dave Miller <justdave@syndicomm.com>
 #                 Christopher Aillon <christopher@aillon.com>
+#                 Myk Melez <myk@mozilla.org>
 
 use diagnostics;
 use strict;
@@ -29,27 +30,36 @@ use strict;
 my $UserInEditGroupSet = -1;
 my $UserInCanConfirmGroupSet = -1;
 
+use lib qw(.);
+
 require "CGI.pl";
+require "bug_form.pl";
+
 use RelationSet;
 
 # Shut up misguided -w warnings about "used only once":
 
-use vars %::versions,
-    %::components,
-    %::COOKIE,
-    %::MFORM,
-    %::legal_keywords,
-    %::legal_opsys,
-    %::legal_platform,
-    %::legal_priority,
-    %::target_milestone,
-    %::legal_severity,
-    %::superusergroupset;
+use vars qw(%versions
+          %components
+          %COOKIE
+          %MFORM
+          %legal_keywords
+          %legal_opsys
+          %legal_platform
+          %legal_priority
+          %settable_resolution
+          %target_milestone
+          %legal_severity
+          %superusergroupset
+          $next_bug);
 
+ConnectToDatabase();
 my $whoid = confirm_login();
 
 my $requiremilestone = 0;
 
+use vars qw($template $vars);
+
 ######################################################################
 # Begin Data/Security Validation
 ######################################################################
@@ -58,22 +68,26 @@ my $requiremilestone = 0;
 # This list will either consist of a single bug number from the "id"
 # form/URL field or a series of numbers from multiple form/URL fields
 # named "id_x" where "x" is the bug number.
+# For each bug being modified, make sure its ID is a valid bug number 
+# representing an existing bug that the user is authorized to access.
 my @idlist;
 if (defined $::FORM{'id'}) {
+    ValidateBugID($::FORM{'id'});
     push @idlist, $::FORM{'id'};
 } else {
     foreach my $i (keys %::FORM) {
         if ($i =~ /^id_([1-9][0-9]*)/) {
-            push @idlist, $1;
+            my $id = $1;
+            ValidateBugID($id);
+            push @idlist, $id;
         }
     }
 }
 
-# For each bug being modified, make sure its ID is a valid bug number 
-# representing an existing bug that the user is authorized to access.
-foreach my $id (@idlist) {
-    ValidateBugID($id);
-}
+# Make sure there are bugs to process.
+scalar(@idlist)
+  || DisplayError("You did not select any bugs to modify.")
+  && exit;
 
 # If we are duping bugs, let's also make sure that we can change 
 # the original.  This takes care of issue A on bug 96085.
@@ -85,19 +99,7 @@ if (defined $::FORM{'dup_id'} && $::FORM{'knob'} eq "duplicate") {
     DuplicateUserConfirm();
 }
 
-# If the user has a bug list and is processing one bug, then after
-# we process the bug we are going to show them the next bug on their
-# list.  Thus we have to make sure this bug ID is also valid,
-# since a malicious cracker might alter their cookies for the purpose
-# gaining access to bugs they are not authorized to access.
-if ( $::COOKIE{"BUGLIST"} ne "" && defined $::FORM{'id'} ) {
-    my @buglist = split( /:/ , $::COOKIE{"BUGLIST"} );
-    my $idx = lsearch( \@buglist , $::FORM{"id"} );
-    if ($idx < $#buglist) {
-        my $nextbugid = $buglist[$idx + 1];
-        ValidateBugID($nextbugid);
-    }
-}
+ValidateComment($::FORM{'comment'});
 
 ######################################################################
 # End Data/Security Validation
@@ -105,22 +107,49 @@ if ( $::COOKIE{"BUGLIST"} ne "" && defined $::FORM{'id'} ) {
 
 print "Content-type: text/html\n\n";
 
-PutHeader ("Bug processed");
+# Start displaying the response page.
+$vars->{'title'} = "Bug processed";
+$template->process("global/header.html.tmpl", $vars)
+  || ThrowTemplateError($template->error());
+
+$vars->{'header_done'} = 1;
 
 GetVersionTable();
 
-if ( Param("strictvaluechecks") ) {
-    CheckFormFieldDefined(\%::FORM, 'product');
-    CheckFormFieldDefined(\%::FORM, 'version');
-    CheckFormFieldDefined(\%::FORM, 'component');
+CheckFormFieldDefined(\%::FORM, 'product');
+CheckFormFieldDefined(\%::FORM, 'version');
+CheckFormFieldDefined(\%::FORM, 'component');
 
-    # check if target milestone is defined - matthew@zeroknowledge.com
-    if ( Param("usetargetmilestone") ) {
-        CheckFormFieldDefined(\%::FORM, 'target_milestone');
-    }
+# check if target milestone is defined - matthew@zeroknowledge.com
+if ( Param("usetargetmilestone") ) {
+  CheckFormFieldDefined(\%::FORM, 'target_milestone');
 }
 
-ConnectToDatabase();
+#
+# This function checks if there is a comment required for a specific
+# function and tests, if the comment was given.
+# If comments are required for functions  is defined by params.
+#
+sub CheckonComment( $ ) {
+    my ($function) = (@_);
+    
+    # Param is 1 if comment should be added !
+    my $ret = Param( "commenton" . $function );
+
+    # Allow without comment in case of undefined Params.
+    $ret = 0 unless ( defined( $ret ));
+
+    if( $ret ) {
+        if (!defined $::FORM{'comment'} || $::FORM{'comment'} =~ /^\s*$/) {
+            # No comment - sorry, action not allowed !
+            ThrowUserError("You have to specify a <b>comment</b> on this change.  
+                            Please give some words on the reason for your change.");
+        } else {
+            $ret = 0;
+        }
+    }
+    return( ! $ret ); # Return val has to be inverted
+}
 
 # Figure out whether or not the user is trying to change the product
 # (either the "product" variable is not set to "don't change" or the
@@ -131,11 +160,11 @@ if ( $::FORM{'id'} ) {
     SendSQL("SELECT product FROM bugs WHERE bug_id = $::FORM{'id'}");
     $::oldproduct = FetchSQLData();
 }
-if ( ($::FORM{'id'} && $::FORM{'product'} ne $::oldproduct) 
-       || (!$::FORM{'id'} && $::FORM{'product'} ne $::dontchange) ) {
-    if ( Param("strictvaluechecks") ) {
-        CheckFormField(\%::FORM, 'product', \@::legal_product);
-    }
+if ((($::FORM{'id'} && $::FORM{'product'} ne $::oldproduct) 
+     || (!$::FORM{'id'} && $::FORM{'product'} ne $::dontchange))
+    && CheckonComment( "reassignbycomponent" ))
+{
+    CheckFormField(\%::FORM, 'product', \@::legal_product);
     my $prod = $::FORM{'product'};
 
     # note that when this script is called from buglist.cgi (rather
@@ -154,106 +183,53 @@ if ( ($::FORM{'id'} && $::FORM{'product'} ne $::oldproduct)
        $mok = lsearch($::target_milestone{$prod}, $::FORM{'target_milestone'}) >= 0;
     }
 
-    # If anything needs to be verified, generate a form for verifying it.
+    # If the product-specific fields need to be verified, or we need to verify
+    # whether or not to add the bugs to their new product's group, display
+    # a verification form.
     if (!$vok || !$cok || !$mok || (Param('usebuggroups') && !defined($::FORM{'addtonewgroup'}))) {
-
-        # Start the form.
-        print qq|<form action="process_bug.cgi" method="post">\n|;
-
-        # Add all form fields to the form as hidden fields (except those 
-        # being verified), so the user's changes are preserved.
-        foreach my $i (keys %::FORM) {
-            if ($i ne 'version' && $i ne 'component' && $i ne 'target_milestone') {
-                print qq|<input type="hidden" name="$i" value="| . value_quote($::FORM{$i}) . qq|">\n|;
-            }
-        }
-
-        # Display UI for verifying the version, component, and target milestone fields.
+        $vars->{'form'} = \%::FORM;
+        
         if (!$vok || !$cok || !$mok) {
-            my ($sectiontitle, $sectiondescription);
-            if ( Param('usetargetmilestone') ) {
-                $sectiontitle = "Verify Version, Component, Target Milestone";
-                $sectiondescription = qq|
-                  You are moving the bug(s) to the product <b>$prod</b>, and now the 
-                  version, component, and/or target milestone fields are not correct 
-                  (or perhaps they were not correct in the first place).  In any case, 
-                  please set the correct version, component, and target milestone now:
-                |;
-            } else {
-                $sectiontitle = "Verify Version, Component";
-                $sectiondescription = qq|
-                  You are moving the bug(s) to the product <b>$prod</b>, and now the 
-                  version, and component fields are not correct (or perhaps they were 
-                  not correct in the first place).  In any case, please set the correct 
-                  version and component now:
-                |;
+            $vars->{'verify_fields'} = 1;
+            my %defaults;
+            # We set the defaults to these fields to the old value,
+            # if its a valid option, otherwise we use the default where
+            # thats appropriate
+            $vars->{'versions'} = $::versions{$prod};
+            if (lsearch($::versions{$prod}, $::FORM{'version'}) != -1) {
+                $defaults{'version'} = $::FORM{'version'};
             }
-
-            my $versionmenu = Version_element($::FORM{'version'}, $prod);
-            my $componentmenu = Component_element($::FORM{'component'}, $prod);
-
-            print qq|
-              <h3>$sectiontitle</h3>
-
-              <p>
-                $sectiondescription
-              <p>
-
-              <table><tr>
-              <td>
-                <b>Version:</b><br>
-                $versionmenu
-              </td>
-              <td>
-                <b>Component:</b><br>
-                $componentmenu
-              </td>
-            |;
-
-            if ( Param("usetargetmilestone") ) {
-                my $milestonemenu = Milestone_element($::FORM{'target_milestone'}, $prod);
-                print qq|
-                  <td>
-                    <b>Target Milestone:</b><br>
-                    $milestonemenu
-                  </td>
-                |;
+            $vars->{'components'} = $::components{$prod};
+            if (lsearch($::components{$prod}, $::FORM{'component'}) != -1) {
+                $defaults{'component'} = $::FORM{'component'};
             }
 
-            print qq|
-              </tr></table>
-            |;
+            if (Param("usetargetmilestone")) {
+                $vars->{'use_target_milestone'} = 1;
+                $vars->{'milestones'} = $::target_milestone{$prod};
+                if (lsearch($::target_milestone{$prod},
+                            $::FORM{'target_milestone'}) != -1) {
+                    $defaults{'target_milestone'} = $::FORM{'target_milestone'};
+                } else {
+                    SendSQL("SELECT defaultmilestone FROM products WHERE " .
+                            "product = " . SqlQuote($prod));
+                    $defaults{'target_milestone'} = FetchOneColumn();
+                }
+            }
+            else {
+                $vars->{'use_target_milestone'} = 0;
+            }
+            $vars->{'defaults'} = \%defaults;
         }
-
-        # Display UI for determining whether or not to remove the bug from 
-        # its old product's group and/or add it to its new product's group.
-        if (Param('usebuggroups') && !defined($::FORM{'addtonewgroup'})) {
-            print qq|
-              <h3>Verify Bug Group</h3>
-
-              <p>
-                Do you want to add the bug to its new product's group (if any)?
-              </p>
-
-              <p>
-                <input type="radio" name="addtonewgroup" value="no"><b>no</b><br>
-                <input type="radio" name="addtonewgroup" value="yes"><b>yes</b><br>
-                <input type="radio" name="addtonewgroup" value="yesifinold" checked>
-                  <b>yes, but only if the bug was in its old product's group</b><br>
-              </p>
-            |;
+        else {
+            $vars->{"verify_fields"} = 0;
         }
-
-        # End the form.
-        print qq|
-          <input type="submit" value="Commit">
-          </form>
-          <hr>
-          <a href="query.cgi">Cancel and Return to the Query Page</a>
-        |;
-
-        # End the page and stop processing.
-        PutFooter();
+        
+        $vars->{'verify_bug_group'} = (Param('usebuggroups') 
+                                       && !defined($::FORM{'addtonewgroup'}));
+        
+        $template->process("bug/process/verify-new-product.html.tmpl", $vars)
+          || ThrowTemplateError($template->error());
         exit;
     }
 }
@@ -332,22 +308,21 @@ sub CheckCanChangeField {
         return 1;
     }
     SendSQL("UNLOCK TABLES");
-    $oldvalue = value_quote($oldvalue);
-    $newvalue = value_quote($newvalue);
-    print PuntTryAgain(qq{
-Only the owner or submitter of the bug, or a sufficiently
-empowered user, may make that change to the $f field.
-<TABLE>
-<TR><TH ALIGN="right">Old value:</TH><TD>$oldvalue</TD></TR>
-<TR><TH ALIGN="right">New value:</TH><TD>$newvalue</TD></TR>
-</TABLE>
-});
-    PutFooter();
-    exit();
+    $oldvalue = html_quote($oldvalue);
+    $newvalue = html_quote($newvalue);
+    ThrowUserError("You tried to change the <strong>$f</strong> field 
+                    from <em>$oldvalue</em> to <em>$newvalue</em>, 
+                    but only the owner or submitter of the bug, or a 
+                    sufficiently empowered user, may change that field.");
 }
 
 # Confirm that the reporter of the current bug can access the bug we are duping to.
 sub DuplicateUserConfirm {
+    # if we've already been through here, then exit
+    if (defined $::FORM{'confirm_add_duplicate'}) {
+        return;
+    }
+
     my $dupe = trim($::FORM{'id'});
     my $original = trim($::FORM{'dup_id'});
     
@@ -356,87 +331,31 @@ sub DuplicateUserConfirm {
     SendSQL("SELECT profiles.groupset FROM profiles WHERE profiles.userid =".SqlQuote($reporter));
     my $reportergroupset = FetchOneColumn();
 
-    SendSQL("SELECT ((groupset & $reportergroupset) = groupset) , reporter , assigned_to , qa_contact , 
-                    reporter_accessible , assignee_accessible , qacontact_accessible , cclist_accessible 
-             FROM   bugs 
-             WHERE  bug_id = $original");
-
-    my ($isauthorized, $originalreporter, $assignee, $qacontact, $reporter_accessible, 
-        $assignee_accessible, $qacontact_accessible, $cclist_accessible) = FetchSQLData();
-
-    # If reporter is authorized via the database, or is the original reporter, assignee,
-    # or QA Contact, we'll automatically confirm they can be added to the cc list
-    if ($isauthorized 
-        || ($reporter_accessible && $originalreporter == $reporter)
-          || ($assignee_accessible && $assignee == $reporter)
-            || ($qacontact_accessible && $qacontact == $reporter)) {
-            
+    if (CanSeeBug($original, $reporter, $reportergroupset)) {
         $::FORM{'confirm_add_duplicate'} = "1";
-        return;    
-    }
-
-    # Try to authorize the user one more time by seeing if they are on 
-    # the cc: list.  If so, finish validation and return.
-    if ($cclist_accessible ) {
-        my @cclist;
-        SendSQL("SELECT cc.who 
-                 FROM   bugs , cc
-                 WHERE  bugs.bug_id = $original
-                 AND    cc.bug_id = bugs.bug_id
-                ");
-        while (my ($ccwho) = FetchSQLData()) {
-            if ($reporter == $ccwho) {
-                $::FORM{'confirm_add_duplicate'} = "1";
-                return;
-            }
-        }
-    }
-
-    if (defined $::FORM{'confirm_add_duplicate'}) {
         return;
     }
+
+    SendSQL("SELECT cclist_accessible FROM bugs WHERE bug_id = $original");
+    $vars->{'cclist_accessible'} = FetchOneColumn();
     
     # Once in this part of the subroutine, the user has not been auto-validated
     # and the duper has not chosen whether or not to add to CC list, so let's
     # ask the duper what he/she wants to do.
     
-    # First, will the user gain access to this bug immediately by being CC'd?
-    my $reporter_access = $cclist_accessible ? "will immediately" : "might, in the future,";
-
+    $vars->{'form'} = \%::FORM;
+    $vars->{'original_bug_id'} = $original;
+    $vars->{'duplicate_bug_id'} = $dupe;
+    
+    # Confirm whether or not to add the reporter to the cc: list
+    # of the original bug (the one this bug is being duped against).
     print "Content-type: text/html\n\n";
-    PutHeader("Duplicate Warning");
-    print "<P>
-When marking a bug as a duplicate, the reporter of the 
-duplicate is normally added to the CC list of the original. 
-The permissions on bug #$original (the original) are currently set 
-such that the reporter would not normally be able to see it. 
-<P><B>Adding the reporter to the CC list of bug #$original 
-$reporter_access allow him/her access to view this bug.</B>
-Do you wish to do this?</P>
-</P>
-";
-    print "<form method=post>\n\n";
-
-    foreach my $i (keys %::FORM) {
-        # Make sure we don't include the username/password fields in the
-        # HTML.  If cookies are off, they'll have to reauthenticate after
-        # hitting "submit changes anyway".
-        # see http://bugzilla.mozilla.org/show_bug.cgi?id=15980
-        if ($i !~ /^(Bugzilla|LDAP)_(login|password)$/) {
-            my $value = value_quote($::FORM{$i});
-            print qq{<input type=hidden name="$i" value="$value">\n};
-        }
-    }
-
-    print qq{<p><input type=radio name="confirm_add_duplicate" value="1"> Yes, add the reporter to CC list on bug $original</p>\n};
-    print qq{<p><input type=radio name="confirm_add_duplicate" value="0" checked="checked"> No, do not add the reporter to CC list on bug $original</p>\n};
-    print qq{\n<p><a href="show_bug.cgi?id=$dupe">Throw away my changes, and go revisit bug $dupe</a>\n};
-    print qq{\n<p><input type="submit" value="Submit"></p></form>\n};
-    PutFooter();
+    $template->process("bug/process/confirm-duplicate.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
     exit;
 } # end DuplicateUserConfirm()
 
-if (defined $::FORM{'id'} && Param('strictvaluechecks')) {
+if (defined $::FORM{'id'}) {
     # since this means that we were called from show_bug.cgi, now is a good
     # time to do a whole bunch of error checking that can't easily happen when
     # we've been called from buglist.cgi, because buglist.cgi only tweaks
@@ -462,7 +381,7 @@ my $action  = '';
 if (defined $::FORM{action}) {
   $action  = trim($::FORM{action});
 }
-if ($action eq Param("move-button-text")) {
+if (Param("move-enabled") && $action eq Param("move-button-text")) {
   $::FORM{'buglist'} = join (":", @idlist);
   do "move.pl" || die "Error executing move.cgi: $!";
   PutFooter();
@@ -470,13 +389,6 @@ if ($action eq Param("move-button-text")) {
 }
 
 
-# the common updates to all bugs in @idlist start here
-#
-print "<TITLE>Update Bug " . join(" ", @idlist) . "</TITLE>\n";
-if (defined $::FORM{'id'}) {
-    navigation_header();
-}
-print "<HR>\n";
 $::query = "update bugs\nset";
 $::comma = "";
 umask(0);
@@ -504,7 +416,19 @@ sub ChangeStatus {
     my ($str) = (@_);
     if ($str ne $::dontchange) {
         DoComma();
-        if (IsOpenedState($str)) {
+        # Ugly, but functional.  We don't want to change Status if we are
+        # reasigning non-open bugs via the mass change form.
+        if ( ($::FORM{knob} eq 'reassign' || $::FORM{knob} eq 'reassignbycomponent') &&
+             ! defined $::FORM{id} && $str eq 'NEW' ) {
+            # If we got to here, we're dealing with a reassign from the mass
+            # change page.  We don't know (and can't easily figure out) if this
+            # bug is open or closed.  If it's closed, we don't want to change
+            # its status to NEW.  We have to put some logic into the SQL itself
+            # to handle that.
+            my @open_state = map(SqlQuote($_), OpenStates());
+            my $open_state = join(", ", @open_state);
+            $::query .= "bug_status = IF(bug_status IN($open_state), '$str', bug_status)";
+        } elsif (IsOpenedState($str)) {
             $::query .= "bug_status = IF(everconfirmed = 1, '$str', '$::unconfirmedstate')";
         } else {
             $::query .= "bug_status = '$str'";
@@ -519,37 +443,10 @@ sub ChangeResolution {
     my ($str) = (@_);
     if ($str ne $::dontchange) {
         DoComma();
-        $::query .= "resolution = '$str'";
+        $::query .= "resolution = " . SqlQuote($str);
     }
 }
 
-#
-# This function checks if there is a comment required for a specific
-# function and tests, if the comment was given.
-# If comments are required for functions  is defined by params.
-#
-sub CheckonComment( $ ) {
-    my ($function) = (@_);
-    
-    # Param is 1 if comment should be added !
-    my $ret = Param( "commenton" . $function );
-
-    # Allow without comment in case of undefined Params.
-    $ret = 0 unless ( defined( $ret ));
-
-    if( $ret ) {
-        if (!defined $::FORM{'comment'} || $::FORM{'comment'} =~ /^\s*$/) {
-            # No comment - sorry, action not allowed !
-            PuntTryAgain("You have to specify a <b>comment</b> on this " .
-                         "change.  Please give some words " .
-                         "on the reason for your change.");
-        } else {
-            $ret = 0;
-        }
-    }
-    return( ! $ret ); # Return val has to be inverted
-}
-
 # Changing this so that it will process groups from checkboxes instead of
 # select lists.  This means that instead of looking for the bit-X values in
 # the form, we need to loop through all the bug groups this user has access
@@ -566,10 +463,18 @@ if($::usergroupset ne '0') {
     SendSQL("SELECT bit, isactive FROM groups WHERE " .
             "isbuggroup != 0 AND bit & $::usergroupset != 0 ORDER BY bit");
     while (my ($b, $isactive) = FetchSQLData()) {
-        if (!$::FORM{"bit-$b"}) {
-            $groupDel .= "+$b";
-        } elsif ($::FORM{"bit-$b"} == 1 && $isactive) {
-            $groupAdd .= "+$b";
+        # The multiple change page may not show all groups a bug is in
+        # (eg product groups when listing more than one product)
+        # Only consider groups which were present on the form. We can't do this
+        # for single bug changes because non-checked checkboxes aren't present.
+        # All the checkboxes should be shown in that case, though, so its not
+        # an issue there
+        if ($::FORM{'id'} || exists $::FORM{"bit-$b"}) {
+            if (!$::FORM{"bit-$b"}) {
+                $groupDel .= "+$b";
+            } elsif ($::FORM{"bit-$b"} == 1 && $isactive) {
+                $groupAdd .= "+$b";
+            }
         }
     }
     if ($groupAdd ne "0" || $groupDel ne "0") {
@@ -608,7 +513,7 @@ if (defined $::FORM{'qa_contact'}) {
 
 # If the user is submitting changes from show_bug.cgi for a single bug,
 # and that bug is restricted to a group, process the checkboxes that
-# allowed the user to set whether or not the reporter, assignee, QA contact, 
+# allowed the user to set whether or not the reporter
 # and cc list can see the bug even if they are not members of all groups 
 # to which the bug is restricted.
 if ( $::FORM{'id'} ) {
@@ -619,14 +524,6 @@ if ( $::FORM{'id'} ) {
         $::FORM{'reporter_accessible'} = $::FORM{'reporter_accessible'} ? '1' : '0';
         $::query .= "reporter_accessible = $::FORM{'reporter_accessible'}";
 
-        DoComma();
-        $::FORM{'assignee_accessible'} = $::FORM{'assignee_accessible'} ? '1' : '0';
-        $::query .= "assignee_accessible = $::FORM{'assignee_accessible'}";
-
-        DoComma();
-        $::FORM{'qacontact_accessible'} = $::FORM{'qacontact_accessible'} ? '1' : '0';
-        $::query .= "qacontact_accessible = $::FORM{'qacontact_accessible'}";
-
         DoComma();
         $::FORM{'cclist_accessible'} = $::FORM{'cclist_accessible'} ? '1' : '0';
         $::query .= "cclist_accessible = $::FORM{'cclist_accessible'}";
@@ -654,7 +551,7 @@ if (defined $::FORM{newcc} || defined $::FORM{removecc} || defined $::FORM{massc
         $cc_add = $::FORM{newcc};
         # We came from bug_form which uses a select box to determine what cc's
         # need to be removed...
-        if (defined $::FORM{removecc}) {
+        if (defined $::FORM{removecc} && $::FORM{cc}) {
             $cc_remove = join (",", @{$::MFORM{cc}});
         }
     }
@@ -676,9 +573,7 @@ if (defined $::FORM{newcc} || defined $::FORM{removecc} || defined $::FORM{massc
 }
 
 
-if ( Param('strictvaluechecks') ) {
-    CheckFormFieldDefined(\%::FORM, 'knob');
-}
+CheckFormFieldDefined(\%::FORM, 'knob');
 SWITCH: for ($::FORM{'knob'}) {
     /^none$/ && do {
         last SWITCH;
@@ -691,7 +586,8 @@ SWITCH: for ($::FORM{'knob'}) {
     /^accept$/ && CheckonComment( "accept" ) && do {
         DoConfirm();
         ChangeStatus('ASSIGNED');
-        if (Param("musthavemilestoneonaccept")) {
+        if (Param("musthavemilestoneonaccept") &&
+                scalar(@{$::target_milestone{$::FORM{'product'}}}) > 1) {
             if (Param("usetargetmilestone")) {
                 $requiremilestone = 1;
             }
@@ -703,6 +599,8 @@ SWITCH: for ($::FORM{'knob'}) {
         last SWITCH;
     };
     /^resolve$/ && CheckonComment( "resolve" ) && do {
+        # Check here, because its the only place we require the resolution
+        CheckFormField(\%::FORM, 'resolution', \@::settable_resolution);
         ChangeStatus('RESOLVED');
         ChangeResolution($::FORM{'resolution'});
         last SWITCH;
@@ -713,27 +611,24 @@ SWITCH: for ($::FORM{'knob'}) {
         }
         ChangeStatus('NEW');
         DoComma();
-        if ( Param("strictvaluechecks") ) {
-          if ( !defined$::FORM{'assigned_to'} ||
-               trim($::FORM{'assigned_to'}) eq "") {
-            PuntTryAgain("You cannot reassign to a bug to nobody.  Unless " .
-                         "you intentionally cleared out the " .
-                         "\"Reassign bug to\" field, " .
-                         Param("browserbugmessage"));
-          }
+        if ( !defined$::FORM{'assigned_to'} ||
+             trim($::FORM{'assigned_to'}) eq "") {
+          ThrowUserError("You cannot reassign to a bug to nobody.  Unless you
+                          intentionally cleared out the \"Reassign bug to\" 
+                          field, " . Param("browserbugmessage"));
         }
-        my $newid = DBNameToIdAndCheck($::FORM{'assigned_to'});
+        my $newid = DBNameToIdAndCheck(trim($::FORM{'assigned_to'}));
         $::query .= "assigned_to = $newid";
         last SWITCH;
     };
     /^reassignbycomponent$/  && CheckonComment( "reassignbycomponent" ) && do {
         if ($::FORM{'product'} eq $::dontchange) {
-            PuntTryAgain("You must specify a product to help determine the " .
-                         "new owner of these bugs.");
+            ThrowUserError("You must specify a product to help determine 
+                            the new owner of these bugs.");
         }
         if ($::FORM{'component'} eq $::dontchange) {
-            PuntTryAgain("You must specify a component whose owner should " .
-                         "get assigned these bugs.");
+            ThrowUserError("You must specify a component whose owner 
+                            should get assigned these bugs.");
         }
         if ($::FORM{'compconfirm'}) {
             DoConfirm();
@@ -759,12 +654,12 @@ SWITCH: for ($::FORM{'knob'}) {
         last SWITCH;
     };   
     /^reopen$/  && CheckonComment( "reopen" ) && do {
-		SendSQL("SELECT resolution FROM bugs WHERE bug_id = $::FORM{'id'}");
+                SendSQL("SELECT resolution FROM bugs WHERE bug_id = $::FORM{'id'}");
         ChangeStatus('REOPENED');
         ChangeResolution('');
-		if (FetchOneColumn() eq 'DUPLICATE') {
-			SendSQL("DELETE FROM duplicates WHERE dupe = $::FORM{'id'}");
-		}		
+                if (FetchOneColumn() eq 'DUPLICATE') {
+                        SendSQL("DELETE FROM duplicates WHERE dupe = $::FORM{'id'}");
+                }
         last SWITCH;
     };
     /^verify$/ && CheckonComment( "verify" ) && do {
@@ -778,27 +673,24 @@ SWITCH: for ($::FORM{'knob'}) {
     /^duplicate$/ && CheckonComment( "duplicate" ) && do {
         ChangeStatus('RESOLVED');
         ChangeResolution('DUPLICATE');
-        if ( Param('strictvaluechecks') ) {
-            CheckFormFieldDefined(\%::FORM,'dup_id');
-        }
+        CheckFormFieldDefined(\%::FORM,'dup_id');
         my $num = trim($::FORM{'dup_id'});
         SendSQL("SELECT bug_id FROM bugs WHERE bug_id = " . SqlQuote($num));
         $num = FetchOneColumn();
         if (!$num) {
-            PuntTryAgain("You must specify a valid bug number of which this bug " .
-                         "is a duplicate.  The bug has not been changed.")
+            ThrowUserError("You must specify a valid bug number of which this bug
+                            is a duplicate.  The bug has not been changed.")
         }
         if (!defined($::FORM{'id'}) || $num == $::FORM{'id'}) {
-            PuntTryAgain("Nice try, $::COOKIE{'Bugzilla_login'}.  But it doesn't really ".
-                         "make sense to mark a bug as a duplicate of " .
-                         "itself, does it?");
+            ThrowUserError("Nice try, $::COOKIE{'Bugzilla_login'}, but it doesn't 
+                            really make sense to mark a bug as a duplicate of itself, 
+                            does it?");
         }
         my $checkid = trim($::FORM{'id'});
         SendSQL("SELECT bug_id FROM bugs where bug_id = " .  SqlQuote($checkid));
         $checkid = FetchOneColumn();
         if (!$checkid) {
-            PuntTryAgain("The bug id $::FORM{'id'} is invalid. Please reload this bug ".
-                         "and try again.");
+            ThrowUserError("The bug id $::FORM{'id'} is invalid.");
         }
         $::FORM{'comment'} .= "\n\n*** This bug has been marked as a duplicate of $num ***";
         $duplicate = $num;
@@ -806,14 +698,13 @@ SWITCH: for ($::FORM{'knob'}) {
         last SWITCH;
     };
     # default
-    print "Unknown action $::FORM{'knob'}!\n";
-    PutFooter();
-    exit;
+    my $escaped_knob = html_quote($::FORM{'knob'});
+    ThrowCodeError("Unknown action $escaped_knob!\n");
 }
 
 
 if ($#idlist < 0) {
-    PuntTryAgain("You apparently didn't choose any bugs to modify.");
+    ThrowUserError("You apparently didn't choose any bugs to modify.");
 }
 
 
@@ -827,11 +718,9 @@ if ($::FORM{'keywords'}) {
         }
         my $i = GetKeywordIdFromName($keyword);
         if (!$i) {
-            PuntTryAgain("Unknown keyword named <code>" .
-                         html_quote($keyword) . "</code>. " .
-                         "<P>The legal keyword names are " .
-                         "<A HREF=describekeywords.cgi>" .
-                         "listed here</A>.");
+            ThrowUserError("Unknown keyword named <code>" . html_quote($keyword) . 
+                           "</code>. <p>The legal keyword names are 
+                            <a href=\"describekeywords.cgi\">listed here</a></p>.");
         }
         if (!$keywordseen{$i}) {
             push(@keywordlist, $i);
@@ -842,10 +731,13 @@ if ($::FORM{'keywords'}) {
 
 my $keywordaction = $::FORM{'keywordaction'} || "makeexact";
 
-if ($::comma eq "" && 0 == @keywordlist && $keywordaction ne "makeexact") {
+if ($::comma eq ""
+    && 0 == @keywordlist && $keywordaction ne "makeexact"
+    && defined $::FORM{'masscc'} && ! $::FORM{'masscc'}
+    ) {
     if (!defined $::FORM{'comment'} || $::FORM{'comment'} =~ /^\s*$/) {
-        PuntTryAgain("Um, you apparently did not change anything on the " .
-                     "selected bugs.");
+        ThrowUserError("Um, you apparently did not change anything 
+                        on the selected bugs.");
     }
 }
 
@@ -876,6 +768,7 @@ sub SnapShotDeps {
 
 
 my $timestamp;
+my $bug_changed;
 
 sub FindWrapPoint {
     my ($string, $startpos) = @_;
@@ -925,7 +818,8 @@ sub LogActivityEntry {
         my $fieldid = GetFieldID($col);
         SendSQL("INSERT INTO bugs_activity " .
                 "(bug_id,who,bug_when,fieldid,removed,added) VALUES " .
-                "($i,$whoid,$timestamp,$fieldid,$removestr,$addstr)");
+                "($i,$whoid," . SqlQuote($timestamp) . ",$fieldid,$removestr,$addstr)");
+        $bug_changed = 1;
     }
 }
 
@@ -936,6 +830,8 @@ sub LogDependencyActivity {
         # Figure out what's really different...
         my ($removed, $added) = DiffStrings($oldstr, $newstr);
         LogActivityEntry($i,$target,$removed,$added);
+        # update timestamp on target bug so midairs will be triggered
+        SendSQL("UPDATE bugs SET delta_ts=NOW() WHERE bug_id=$i");
         return 1;
     }
     return 0;
@@ -947,9 +843,11 @@ sub LogDependencyActivity {
 #
 foreach my $id (@idlist) {
     my %dependencychanged;
+    $bug_changed = 0;
     my $write = "WRITE";        # Might want to make a param to control
                                 # whether we do LOW_PRIORITY ...
     SendSQL("LOCK TABLES bugs $write, bugs_activity $write, cc $write, " .
+            "cc AS selectVisible_cc $write, " .
             "profiles $write, dependencies $write, votes $write, " .
             "keywords $write, longdescs $write, fielddefs $write, " .
             "keyworddefs READ, groups READ, attachments READ, products READ");
@@ -972,50 +870,30 @@ foreach my $id (@idlist) {
                 SqlQuote($oldhash{'product'}));
         if ($value eq FetchOneColumn()) {
             SendSQL("UNLOCK TABLES");
-            PuntTryAgain("You must determine a target milestone for bug $id " .
-                         "if you are going to accept it.  (Part of " .
-                         "accepting a bug is giving an estimate of when it " .
-                         "will be fixed.)");
+            ThrowUserError("You must determine a target milestone for bug $id
+                            if you are going to accept it.  Part of accepting 
+                            a bug is giving an estimate of when it will be fixed.", 
+                           undef, 
+                           "abort");
         }
     }   
     if (defined $::FORM{'delta_ts'} && $::FORM{'delta_ts'} ne $delta_ts) {
-        print "
-<H1>Mid-air collision detected!</H1>
-Someone else has made changes to this bug at the same time you were trying to.
-The changes made were:
-<p>
-";
-        DumpBugActivity($id, $delta_ts);
-        my $longdesc = GetLongDescriptionAsHTML($id);
-        my $longchanged = 0;
-
-        if (length($longdesc) > $::FORM{'longdesclength'}) {
-            $longchanged = 1;
-            print "<P>Added text to the long description:<blockquote>";
-            print substr($longdesc, $::FORM{'longdesclength'});
-            print "</blockquote>\n";
-        }
-        SendSQL("unlock tables");
-        print "You have the following choices: <ul>\n";
+        ($vars->{'operations'}) = GetBugActivity($::FORM{'id'}, $::FORM{'delta_ts'});
+
+        $vars->{'start_at'} = $::FORM{'longdesclength'};
+        $vars->{'comments'} = GetComments($id);
+
         $::FORM{'delta_ts'} = $delta_ts;
-        print "<li><form method=post>";
-        foreach my $i (keys %::FORM) {
-            # Make sure we don't include the username/password fields in the
-            # HTML.  If cookies are off, they'll have to reauthenticate after
-            # hitting "submit changes anyway".
-            # see http://bugzilla.mozilla.org/show_bug.cgi?id=15980
-            if ($i !~ /^(Bugzilla|LDAP)_(login|password)$/) {
-              my $value = value_quote($::FORM{$i});
-              print qq{<input type=hidden name="$i" value="$value">\n};
-            }
-        }
-        print qq{<input type=submit value="Submit my changes anyway">\n};
-        print " This will cause all of the above changes to be overwritten";
-        if ($longchanged) {
-            print ", except for the changes to the description";
-        }
-        print qq{.</form>\n<li><a href="show_bug.cgi?id=$id">Throw away my changes, and go revisit bug $id</a></ul>\n};
-        PutFooter();
+        $vars->{'form'} = \%::FORM;
+        
+        $vars->{'bug_id'} = $id;
+        $vars->{'quoteUrls'} = \&quoteUrls;
+        
+        SendSQL("UNLOCK TABLES");
+        
+        # Warn the user about the mid-air collision and ask them what to do.
+        $template->process("bug/process/midair.html.tmpl", $vars)
+          || ThrowTemplateError($template->error());
         exit;
     }
         
@@ -1023,50 +901,61 @@ The changes made were:
     if (defined $::FORM{'dependson'}) {
         my $me = "blocked";
         my $target = "dependson";
+        my %deptree;
         for (1..2) {
-            $deps{$target} = [];
+            $deptree{$target} = [];
             my %seen;
             foreach my $i (split('[\s,]+', $::FORM{$target})) {
                 if ($i eq "") {
                     next;
+                }
 
+                my $orig = $i;
+                if (!detaint_natural($i)) {
+                    ThrowUserError("$orig is not a legal bug number", undef, "abort");
                 }
+
+                # Don't use CanSeeBug, since we want to keep deps to bugs a
+                # user can't see
                 SendSQL("select bug_id from bugs where bug_id = " .
                         SqlQuote($i));
                 my $comp = FetchOneColumn();
                 if ($comp ne $i) {
-                    PuntTryAgain("$i is not a legal bug number");
+                    ThrowUserError("$i is not a legal bug number", undef, "abort");
                 }
                 if ($id eq $i) {
-                    PuntTryAgain("You can't make a bug blocked or dependent on itself.");
+                    ThrowUserError("You can't make a bug blocked or dependent on itself.",
+                                   undef,
+                                   "abort");
                 }
                 if (!exists $seen{$i}) {
-                    push(@{$deps{$target}}, $i);
+                    push(@{$deptree{$target}}, $i);
                     $seen{$i} = 1;
                 }
             }
+            # populate $deps{$target} as first-level deps only.
+            # and find remainder of dependency tree in $deptree{$target}
+            @{$deps{$target}} = @{$deptree{$target}};
             my @stack = @{$deps{$target}};
             while (@stack) {
                 my $i = shift @stack;
-                SendSQL("select $target from dependencies where $me = $i");
+                SendSQL("select $target from dependencies where $me = " .
+                        SqlQuote($i));
                 while (MoreSQLData()) {
                     my $t = FetchOneColumn();
-                    if ($t == $id) {
-                        PuntTryAgain("Dependency loop detected!<P>" .
-                                     "The change you are making to " .
-                                     "dependencies has caused a circular " .
-                                     "dependency chain.");
-                    }
-                    if (!exists $seen{$t}) {
+                    # ignore any _current_ dependencies involving this bug,
+                    # as they will be overwritten with data from the form.
+                    if ($t != $id && !exists $seen{$t}) {
+                        push(@{$deptree{$target}}, $t);
                         push @stack, $t;
                         $seen{$t} = 1;
                     }
                 }
             }
 
-	    if ($me eq 'dependson') {
-                my @deps   =  @{$deps{'dependson'}};
-                my @blocks =  @{$deps{'blocked'}};
+            if ($me eq 'dependson') {
+                my @deps   =  @{$deptree{'dependson'}};
+                my @blocks =  @{$deptree{'blocked'}};
                 my @union = ();
                 my @isect = ();
                 my %union = ();
@@ -1074,14 +963,18 @@ The changes made were:
                 foreach my $b (@deps, @blocks) { $union{$b}++ && $isect{$b}++ }
                 @union = keys %union;
                 @isect = keys %isect;
-		if (@isect > 0) {
+                if (@isect > 0) {
                     my $both;
                     foreach my $i (@isect) {
-                       $both = $both . "#" . $i . " ";	
+                       $both = $both . GetBugLink($i, "#" . $i) . " ";
                     }
-                    PuntTryAgain("Dependency loop detected!<P>" .
-                                 "This bug can't be both blocked and dependent " .
-                                 "on bug "  . $both . "!");
+                    ThrowUserError(qq|Dependency loop detected!<p>
+                      The following bug(s) would appear on both the "depends on"
+                      and "blocks" parts of the dependency tree if these changes
+                      are committed: $both<br>This would create a circular 
+                      dependency, which is not allowed.</p>|,
+                      undef,
+                      "abort");
                 }
             }
             my $tmp = $me;
@@ -1128,17 +1021,12 @@ The changes made were:
                     " WHERE bug_id = $id");
         }
     }
-
     my $query = "$basequery\nwhere bug_id = $id";
     
-# print "<PRE>$query</PRE>\n";
-
     if ($::comma ne "") {
         SendSQL($query);
-        SendSQL("select delta_ts from bugs where bug_id = $id");
-    } else {
-        SendSQL("select now()");
     }
+    SendSQL("select now()");
     $timestamp = FetchOneColumn();
     
     if (defined $::FORM{'comment'}) {
@@ -1294,7 +1182,6 @@ The changes made were:
             SendSQL("UPDATE bugs SET groupset = groupset - $groupbit WHERE bug_id = $id");
         }
 
-        print qq|</p>|;
     }
   
     # get a snapshot of the newly set values out of the database, 
@@ -1351,9 +1238,10 @@ The changes made were:
             LogActivityEntry($id,$col,$old,$new);
         }
     }
-    
-    print "<TABLE BORDER=1><TD><H2>Changes to bug $id submitted</H2>\n";
-    SendSQL("unlock tables");
+    if ($bug_changed) {
+        SendSQL("UPDATE bugs SET delta_ts = " . SqlQuote($timestamp) . " WHERE bug_id = $id");
+    }
+    SendSQL("UNLOCK TABLES");
 
     my @ARGLIST = ();
     if ( $removedCcString ne "" ) {
@@ -1366,10 +1254,25 @@ The changes made were:
         push @ARGLIST, ( "-forceqacontact", $origQaContact);
     }
     push @ARGLIST, ($id, $::COOKIE{'Bugzilla_login'});
-    system ("./processmail",@ARGLIST);
-
-    print "<TD><A HREF=\"show_bug.cgi?id=$id\">Back To BUG# $id</A></TABLE>\n";
-
+  
+    # Send mail to let people know the bug has been changed.  Uses 
+    # a special syntax of the "open" and "exec" commands to capture 
+    # the output "processmail", which "system" doesn't allow 
+    # (i.e. "system ('./processmail', $bugid , $::userid);"), without 
+    # the insecurity of running the command through a shell via backticks
+    # (i.e. "my $mailresults = `./processmail $bugid $::userid`;").
+    $vars->{'mail'} = "";
+    open(PMAIL, "-|") or exec('./processmail', @ARGLIST);
+    $vars->{'mail'} .= $_ while <PMAIL>;
+    close(PMAIL);
+
+    $vars->{'id'} = $id;
+    
+    # Let the user know the bug was changed and who did and didn't
+    # receive email about the change.
+    $template->process("bug/process/results.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
+    
     if ($duplicate) {
         # Check to see if Reporter of this bug is reporter of Dupe 
         SendSQL("SELECT reporter FROM bugs WHERE bug_id = " . SqlQuote($::FORM{'id'}));
@@ -1385,31 +1288,65 @@ The changes made were:
             SendSQL("INSERT INTO cc (who, bug_id) VALUES ($reporter, " . SqlQuote($duplicate) . ")");
         }
         AppendComment($duplicate, $::COOKIE{'Bugzilla_login'}, "*** Bug $::FORM{'id'} has been marked as a duplicate of this bug. ***");
-        if ( Param('strictvaluechecks') ) {
-          CheckFormFieldDefined(\%::FORM,'comment');
-        }
+        CheckFormFieldDefined(\%::FORM,'comment');
         SendSQL("INSERT INTO duplicates VALUES ($duplicate, $::FORM{'id'})");
-        print "<TABLE BORDER=1><TD><H2>Duplicate notation added to bug $duplicate</H2>\n";
-        system("./processmail", $duplicate, $::COOKIE{'Bugzilla_login'});
-        print "<TD><A HREF=\"show_bug.cgi?id=$duplicate\">Go To BUG# $duplicate</A></TABLE>\n";
+        
+        $vars->{'mail'} = "";
+        open(PMAIL, "-|") or exec('./processmail', $duplicate, $::COOKIE{'Bugzilla_login'});
+        $vars->{'mail'} .= $_ while <PMAIL>;
+        close(PMAIL);
+        
+        $vars->{'id'} = $duplicate;
+        $vars->{'type'} = "dupe";
+        
+        # Let the user know a duplication notation was added to the original bug.
+        $template->process("bug/process/results.html.tmpl", $vars)
+          || ThrowTemplateError($template->error());
     }
 
     foreach my $k (keys(%dependencychanged)) {
-        print "<TABLE BORDER=1><TD><H2>Checking for dependency changes on bug $k</H2>\n";
-        system("./processmail", $k, $::COOKIE{'Bugzilla_login'});
-        print "<TD><A HREF=\"show_bug.cgi?id=$k\">Go To BUG# $k</A></TABLE>\n";
+        $vars->{'mail'} = "";
+        open(PMAIL, "-|") or exec('./processmail', $k, $::COOKIE{'Bugzilla_login'});
+        $vars->{'mail'} .= $_ while <PMAIL>;
+        close(PMAIL);
+        
+        $vars->{'id'} = $k;
+        $vars->{'type'} = "dep";
+        
+        # Let the user know we checked to see if we should email notice
+        # of this change to users with a relationship to the dependent
+        # bug and who did and didn't receive email about it.
+        $template->process("bug/process/results.html.tmpl", $vars)
+          || ThrowTemplateError($template->error());
     }
 
 }
 
-if (defined $::next_bug) {
-    print("<P>The next bug in your list is:\n");
-    $::FORM{'id'} = $::next_bug;
-    print "<HR>\n";
+# Show next bug, if it exists.
+if ($::COOKIE{"BUGLIST"} && $::FORM{'id'}) {
+    my @bugs = split(/:/, $::COOKIE{"BUGLIST"});
+    $vars->{'bug_list'} = \@bugs;
+    my $cur = lsearch(\@bugs, $::FORM{"id"});
+    if ($cur >= 0 && $cur < $#bugs) {
+        my $next_bug = $bugs[$cur + 1];
+        if (detaint_natural($next_bug) && CanSeeBug($next_bug)) {
+            $::FORM{'id'} = $next_bug;
+            
+            $vars->{'next_id'} = $next_bug;
+            
+            # Let the user know we are about to display the next bug in their list.
+            $template->process("bug/process/next.html.tmpl", $vars)
+              || ThrowTemplateError($template->error());
 
-    navigation_header();
-    do "bug_form.pl";
-} else {
-    navigation_header();
-    PutFooter();
+            show_bug("header is already done");
+
+            exit;
+        }
+    }
 }
+
+# End the response page.
+$template->process("bug/navigate.html.tmpl", $vars)
+  || ThrowTemplateError($template->error());
+$template->process("global/footer.html.tmpl", $vars)
+  || ThrowTemplateError($template->error());
diff --git a/processmail b/processmail
index 1a506211b..3ddf28d94 100755
--- a/processmail
+++ b/processmail
@@ -111,8 +111,8 @@ sub ProcessOneBug {
     }
     my ($start, $end) = (@row);
     # $start and $end are considered safe because users can't touch them
-    $start = detaint_string($start);
-    $end = detaint_string($end);
+    trick_taint($start);
+    trick_taint($end);
 
     my $ccSet = new RelationSet();
     $ccSet->mergeFromDB("SELECT who FROM cc WHERE bug_id = $id");
@@ -135,7 +135,7 @@ sub ProcessOneBug {
 
 
     SendSQL("SELECT profiles.login_name, fielddefs.description, " .
-            "       bug_when, removed, added " .
+            "       bug_when, removed, added, attach_id " .
             "FROM bugs_activity, fielddefs, profiles " .
             "WHERE bug_id = $id " .
             "  AND fielddefs.fieldid = bugs_activity.fieldid " .
@@ -153,13 +153,14 @@ sub ProcessOneBug {
     my $difftext = "";
     my $lastwho = "";
     foreach my $ref (@diffs) {
-        my ($who, $what, $when, $old, $new) = (@$ref);
+        my ($who, $what, $when, $old, $new, $attachid) = (@$ref);
         if ($who ne $lastwho) {
             $lastwho = $who;
             $difftext .= "\n$who" . Param('emailsuffix') . " changed:\n\n";
             $difftext .= FormatTriple("What    ", "Removed", "Added");
             $difftext .= ('-' x 76) . "\n";
         }
+        $what =~ s/^Attachment/Attachment #$attachid/ if $attachid;
         $difftext .= FormatTriple($what, $old, $new);
     }
 
@@ -170,10 +171,11 @@ sub ProcessOneBug {
 
     my $resid = 
 
-    SendSQL("SELECT bugs_activity.bug_id, fielddefs.name, " .
+    SendSQL("SELECT bugs_activity.bug_id, bugs.short_desc, fielddefs.name, " .
             "       removed, added " .
-            "FROM bugs_activity, dependencies, fielddefs ".
+            "FROM bugs_activity, bugs, dependencies, fielddefs ".
             "WHERE bugs_activity.bug_id = dependencies.dependson " .
+            "  AND bugs.bug_id = bugs_activity.bug_id ".
             "  AND dependencies.blocked = $id " .
             "  AND fielddefs.fieldid = bugs_activity.fieldid" .
             "  AND (fielddefs.name = 'bug_status' " .
@@ -185,15 +187,21 @@ sub ProcessOneBug {
     my $thisdiff = "";
     my $lastbug = "";
     my $interestingchange = 0;
+    my $depbug = 0;
+    my @depbugs;
     while (MoreSQLData()) {
-        my ($bug, $what, $old, $new) = (FetchSQLData());
-        if ($bug ne $lastbug) {
+        my ($summary, $what, $old, $new);
+        ($depbug, $summary, $what, $old, $new) = (FetchSQLData());
+        if ($depbug ne $lastbug) {
             if ($interestingchange) {
                 $deptext .= $thisdiff;
             }
-            $lastbug = $bug;
+            $lastbug = $depbug;
+            my $urlbase = Param("urlbase");
             $thisdiff =
-                "\nThis bug depends on bug $bug, which changed state:\n\n";
+              "\nBug $id depends on bug $depbug, which changed state.\n\n" . 
+              "Bug $depbug Summary: $summary\n" . 
+              "${urlbase}show_bug.cgi?id=$depbug\n\n"; 
             $thisdiff .= FormatTriple("What    ", "Old Value", "New Value");
             $thisdiff .= ('-' x 76) . "\n";
             $interestingchange = 0;
@@ -202,7 +210,10 @@ sub ProcessOneBug {
         if ($what eq 'bug_status' && IsOpenedState($old) ne IsOpenedState($new)) {
             $interestingchange = 1;
         }
+        
+        push(@depbugs, $depbug);
     }
+    
     if ($interestingchange) {
         $deptext .= $thisdiff;
     }
@@ -285,7 +296,9 @@ sub ProcessOneBug {
                                           \@reasons, \%values,
                                           \%defmailhead, 
                                           \%fielddescription, $difftext, 
-                                          $newcomments, $start, $id))) {
+                                          $newcomments, $start, $id, 
+                                          \@depbugs))) 
+        {
 
             # if a value is not returned, this means that the person
             # was not sent mail.  add them to the excludedAddresses list.
@@ -314,7 +327,7 @@ sub ProcessOneBug {
     }
 
     print "<br><center>If you wish to tweak the kinds of mail Bugzilla sends you, you can";
-    print " <a href=\"userprefs.cgi?bank=diffs\">change your preferences</a></center>\n";
+    print " <a href=\"userprefs.cgi?tab=email\">change your preferences</a></center>\n";
 
 }
 
@@ -474,18 +487,18 @@ sub filterEmailGroup ($$$) {
     # relationship to the bug of the person they are watching (if the person they
     # are watching is an owner, their mail is filtered as if they were the owner).
     if (Param("supportwatchers")) {
-	my @watchers;
-	foreach my $person(@emailList) {
-	    my $personId = DBname_to_id($person);
-	    SendSQL("SELECT watcher FROM watch WHERE watched = $personId");
-	    while(MoreSQLData()) {
-	        my ($watcher) = FetchSQLData();
-	        if ($watcher) {
-	            push (@watchers, DBID_to_name($watcher));
-	        }
-	    }
-	}
-	push(@emailList, @watchers);
+        my @watchers;
+        foreach my $person(@emailList) {
+            my $personId = DBname_to_id($person);
+            SendSQL("SELECT watcher FROM watch WHERE watched = $personId");
+            while(MoreSQLData()) {
+                my ($watcher) = FetchSQLData();
+                if ($watcher) {
+                    push (@watchers, DBID_to_name($watcher));
+                }
+            }
+        }
+        push(@emailList, @watchers);
     }
 
 
@@ -623,16 +636,17 @@ sub filterEmailGroup ($$$) {
     return @filteredList;
 }
 
-sub NewProcessOnePerson ($$$$$$$$$$$) {
+sub NewProcessOnePerson ($$$$$$$$$$$$) {
     my ($person, $count, $hlRef, $reasonsRef, $valueRef, $dmhRef, $fdRef, $difftext, 
-        $newcomments, $start, $id) = @_;
+        $newcomments, $start, $id, $depbugsRef) = @_;
 
     my %values = %$valueRef;
     my @headerlist = @$hlRef;
     my @reasons = @$reasonsRef;
     my %defmailhead = %$dmhRef;
     my %fielddescription = %$fdRef;
-
+    my @depbugs = @$depbugsRef;
+    
     if ($seen{$person}) {
       return;
     }
@@ -640,32 +654,36 @@ sub NewProcessOnePerson ($$$$$$$$$$$) {
     if ($nomail{$person}) {
       return;
     }
+
         
-    # Sanitize $values{'groupset'}
-    if ($values{'groupset'} =~ m/(\d+)/) {
-        $values{'groupset'} = $1;
-    } else {
-        $values{'groupset'} = 0;
-    }
-    SendSQL("SELECT userid, groupset & $values{'groupset'} " .
+    SendSQL("SELECT userid, groupset " .
             "FROM profiles WHERE login_name = " . SqlQuote($person));
     my ($userid, $groupset) =  (FetchSQLData());
-    
+
     $seen{$person} = 1;
 
+    detaint_natural($userid);
+    detaint_natural($groupset);
 
     # if this person doesn't have permission to see info on this bug, 
     # return.
     #
-    # XXX - I _think_ this currently means that if a bug is suddenly given
+    # XXX - This currently means that if a bug is suddenly given
     # more restrictive permissions, people without those permissions won't
     # see the action of restricting the bug itself; the bug will just 
     # quietly disappear from their radar.
     #
-    if ($groupset ne $values{'groupset'}) {
-      return;
-    }
+    return unless CanSeeBug($id, $userid, $groupset);
     
+    # We shouldn't send changedmail if this is a dependency mail, and any of 
+    # the depending bugs is not visible to the user.
+    foreach my $dep_id (@depbugs) {
+        my $save_id = $dep_id;
+        detaint_natural($dep_id) || warn("Unexpected Error: \@depbugs contains a non-numeric value: '$save_id'")
+                                 && return;
+        return unless CanSeeBug($dep_id, $userid, $groupset);
+    }
+
     my %mailhead = %defmailhead;
     
     my $head = "";
@@ -713,6 +731,17 @@ sub NewProcessOnePerson ($$$$$$$$$$$) {
     
     my %substs;
 
+    # If an attachment was created, then add an URL. (Note: the 'g'lobal
+    # replace should work with comments with multiple attachments.)
+
+    if ( $newcomments =~ /Created an attachment \(/ ) {
+
+        my $showattachurlbase =
+            Param('urlbase') . "attachment.cgi?id=";
+
+        $newcomments =~ s/(Created an attachment \(id=([0-9]+)\))/$1\n --> \(${showattachurlbase}$2&action=view\)/g;
+    }
+
     $person .= Param('emailsuffix');
 # 09/13/2000 cyeh@bluemartini.com
 # If a bug is changed, don't put the word "Changed" in the subject mail
@@ -742,7 +771,7 @@ sub NewProcessOnePerson ($$$$$$$$$$$) {
     }
 
     if ($enableSendMail == 1) {
-    open(SENDMAIL, "|/usr/lib/sendmail $sendmailparam -t") ||
+    open(SENDMAIL, "|/usr/lib/sendmail $sendmailparam -t -i") ||
       die "Can't open sendmail";
     
     print SENDMAIL trim($msg) . "\n";
@@ -789,10 +818,15 @@ if ($#ARGV >= 0 && $ARGV[0] eq "-forceqacontact") {
     @{$force{'QAcontact'}} = (trim(shift(@ARGV)));
 }
 
+if ($#ARGV >= 0 && $ARGV[0] eq "-forcereporter") {
+    shift(@ARGV);
+    @{$force{'Reporter'}} = trim(shift(@ARGV));
+}
+
 if (($#ARGV < 0) || ($#ARGV > 1)) {
     print "Usage:\n processmail {bugid} {nametoexclude} " . 
       "[-forcecc list,of,users]\n             [-forceowner name] " .
-      "[-forceqacontact name]\nor\n" .
+      "[-forceqacontact name]\n             [-forcereporter name]\nor\n" .
       " processmail rescanall\n";
     exit;
 }
@@ -802,16 +836,27 @@ if ($#ARGV == 1) {
 }
 
 if ($ARGV[0] eq "rescanall") {
-    print "<br> Collecting bug ids...\n";
-    SendSQL("select bug_id from bugs where to_days(now()) - to_days(delta_ts) <= 2 order by bug_id");
+    print "Collecting bug ids...\n";
+    SendSQL("select bug_id, lastdiffed, delta_ts from bugs where lastdiffed < delta_ts AND delta_ts < date_sub(now(), INTERVAL 30 minute) order by bug_id");
     my @list;
     while (my @row = FetchSQLData()) {
+        my $time = $row[2];
+        if ($time =~ /^(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/) {
+            $time = "$1-$2-$3 $4:$5:$6";
+        }
+        print STDERR "Bug $row[0] has unsent mail. lastdiffed is $row[1], delta_ts is $time.\n";
         push @list, $row[0];
     }
+    if (scalar(@list) > 0) {
+        print STDERR scalar(@list) . " bugs found with possibly unsent mail\n";
+        print STDERR "Updating bugs, sending mail if required\n";
+    } else {
+        print "All appropriate mail appears to have been sent\n"
+    }
     foreach my $id (@list) {
-        $ARGV[0] = $id;
-        print "<br> Doing bug $id\n";
-        ProcessOneBug($ARGV[0]);
+        if (detaint_natural($id)) {
+            ProcessOneBug($id);
+        }
     }
 } else {
     my $bugnum;
diff --git a/query.cgi b/query.cgi
index 16c783864..c75834c33 100755
--- a/query.cgi
+++ b/query.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -21,37 +21,36 @@
 # Contributor(s): Terry Weissman <terry@mozilla.org>
 #                 David Gardiner <david.gardiner@unisa.edu.au>
 #                 Matthias Radestock <matthias@sorted.org>
+#                 Gervase Markham <gerv@gerv.net>
 
 use diagnostics;
 use strict;
+use lib ".";
 
 require "CGI.pl";
 
-$::CheckOptionValues = 0;       # It's OK if we have some bogus things in the
-                                # pop-up lists here, from a remembered query
-                                # that is no longer quite valid.  We don't
-                                # want to crap out in the query page.
-
-# Shut up misguided -w warnings about "used only once":
-
-use vars
-  @::CheckOptionValues,
-  @::legal_resolution,
-  @::legal_bug_status,
-  @::legal_components,
-  @::legal_keywords,
-  @::legal_opsys,
-  @::legal_platform,
-  @::legal_priority,
-  @::legal_product,
-  @::legal_severity,
-  @::legal_target_milestone,
-  @::legal_versions,
-  @::log_columns,
-  %::versions,
-  %::components,
-  %::FORM;
+use vars qw(
+    @CheckOptionValues
+    @legal_resolution
+    @legal_bug_status
+    @legal_components
+    @legal_keywords
+    @legal_opsys
+    @legal_platform
+    @legal_priority
+    @legal_product
+    @legal_severity
+    @legal_target_milestone
+    @legal_versions
+    @log_columns
+    %versions
+    %components
+    %FORM
+    $template
+    $vars
+);
 
+ConnectToDatabase();
 
 if (defined $::FORM{"GoAheadAndLogIn"}) {
     # We got here from a login page, probably from relogin.cgi.  We better
@@ -60,15 +59,11 @@ if (defined $::FORM{"GoAheadAndLogIn"}) {
 } else {
     quietly_check_login();
 }
-my $userid = 0;
-if (defined $::COOKIE{"Bugzilla_login"}) {
-    $userid = DBNameToIdAndCheck($::COOKIE{"Bugzilla_login"});
-}
 
-# Backwards compatability hack -- if there are any of the old QUERY_*
+# Backwards compatibility hack -- if there are any of the old QUERY_*
 # cookies around, and we are logged in, then move them into the database
-# and nuke the cookie.
-if ($userid) {
+# and nuke the cookie. This is required for Bugzilla 2.8 and earlier.
+if ($::userid) {
     my @oldquerycookies;
     foreach my $i (keys %::COOKIE) {
         if ($i =~ /^QUERY_(.*)$/) {
@@ -85,65 +80,68 @@ if ($userid) {
             if ($value) {
                 my $qname = SqlQuote($name);
                 SendSQL("SELECT query FROM namedqueries " .
-                        "WHERE userid = $userid AND name = $qname");
+                        "WHERE userid = $::userid AND name = $qname");
                 my $query = FetchOneColumn();
                 if (!$query) {
                     SendSQL("REPLACE INTO namedqueries " .
                             "(userid, name, query) VALUES " .
-                            "($userid, $qname, " . SqlQuote($value) . ")");
+                            "($::userid, $qname, " . SqlQuote($value) . ")");
                 }
             }
-            print "Set-Cookie: $cookiename= ; path=/ ; expires=Sun, 30-Jun-1980 00:00:00 GMT\n";
+            print "Set-Cookie: $cookiename= ; path=" . Param("cookiepath") . 
+                  "; expires=Sun, 30-Jun-1980 00:00:00 GMT\n";
         }
     }
 }
-                
-
-
 
 if ($::FORM{'nukedefaultquery'}) {
-    if ($userid) {
+    if ($::userid) {
         SendSQL("DELETE FROM namedqueries " .
-                "WHERE userid = $userid AND name = '$::defaultqueryname'");
+                "WHERE userid = $::userid AND name = '$::defaultqueryname'");
     }
     $::buffer = "";
 }
 
-
 my $userdefaultquery;
-if ($userid) {
+if ($::userid) {
     SendSQL("SELECT query FROM namedqueries " .
-            "WHERE userid = $userid AND name = '$::defaultqueryname'");
+            "WHERE userid = $::userid AND name = '$::defaultqueryname'");
     $userdefaultquery = FetchOneColumn();
 }
 
 my %default;
-my %type;
 
-sub ProcessFormStuff {
+# We pass the defaults as a hash of references to arrays. For those
+# Items which are single-valued, the template should only reference [0]
+# and ignore any multiple values.
+sub PrefillForm {
     my ($buf) = (@_);
     my $foundone = 0;
+
+    # Nothing must be undef, otherwise the template complains.
     foreach my $name ("bug_status", "resolution", "assigned_to",
                       "rep_platform", "priority", "bug_severity",
                       "product", "reporter", "op_sys",
                       "component", "version", "chfield", "chfieldfrom",
                       "chfieldto", "chfieldvalue", "target_milestone",
-                      "email1", "emailtype1", "emailreporter1",
-                      "emailassigned_to1", "emailcc1", "emailqa_contact1",
-                      "emaillongdesc1",
-                      "email2", "emailtype2", "emailreporter2",
-                      "emailassigned_to2", "emailcc2", "emailqa_contact2",
-                      "emaillongdesc2",
+                      "email", "emailtype", "emailreporter",
+                      "emailassigned_to", "emailcc", "emailqa_contact",
+                      "emaillongdesc",
                       "changedin", "votes", "short_desc", "short_desc_type",
                       "long_desc", "long_desc_type", "bug_file_loc",
                       "bug_file_loc_type", "status_whiteboard",
                       "status_whiteboard_type", "bug_id",
                       "bugidtype", "keywords", "keywords_type") {
-        $default{$name} = "";
-        $type{$name} = 0;
+        # This is a bit of a hack. The default, empty list has 
+        # three entries to accommodate the needs of the email fields -
+        # we use each position to denote the relevant field. Array
+        # position 0 is unused for email fields because the form 
+        # parameters historically started at 1.
+        $default{$name} = ["", "", ""];
     }
-
-
+ 
+ 
+    # Iterate over the URL parameters
     foreach my $item (split(/\&/, $buf)) {
         my @el = split(/=/, $item);
         my $name = $el[0];
@@ -153,773 +151,215 @@ sub ProcessFormStuff {
         } else {
             $value = "";
         }
-        if (defined $default{$name}) {
+        
+        # If the name ends in a number (which it does for the fields which
+        # are part of the email searching), we use the array
+        # positions to show the defaults for that number field.
+        if ($name =~ m/^(.+)(\d)$/ && defined($default{$1})) {
             $foundone = 1;
-            if ($default{$name} ne "") {
-                $default{$name} .= "|$value";
-                $type{$name} = 1;
-            } else {
-                $default{$name} = $value;
-            }
+            $default{$1}->[$2] = $value;
         }
-    }
+        # If there's no default yet, we replace the blank string.
+        elsif (defined($default{$name}) && $default{$name}->[0] eq "") {
+            $foundone = 1;
+            $default{$name} = [$value]; 
+        } 
+        # If there's already a default, we push on the new value.
+        elsif (defined($default{$name})) {
+            push (@{$default{$name}}, $value);
+        }        
+    }        
     return $foundone;
 }
 
 
-if (!ProcessFormStuff($::buffer)) {
+if (!PrefillForm($::buffer)) {
     # Ah-hah, there was no form stuff specified.  Do it again with the
     # default query.
     if ($userdefaultquery) {
-        ProcessFormStuff($userdefaultquery);
+        PrefillForm($userdefaultquery);
     } else {
-        ProcessFormStuff(Param("defaultquery"));
+        PrefillForm(Param("defaultquery"));
     }
 }
 
-
-                 
-
-if ($default{'chfieldto'} eq "") {
-    $default{'chfieldto'} = "Now";
+if ($default{'chfieldto'}->[0] eq "") {
+    $default{'chfieldto'} = ["Now"];
 }
 
-
-
-print "Set-Cookie: BUGLIST=
-Content-type: text/html\n\n";
-
 GetVersionTable();
 
-sub GenerateEmailInput {
-    my ($id) = (@_);
-    my $defstr = value_quote($default{"email$id"});
-    my $deftype = $default{"emailtype$id"};
-    if ($deftype eq "") {
-        $deftype = "substring";
-    }
-    my $assignedto = ($default{"emailassigned_to$id"} eq "1") ? "checked" : "";
-    my $reporter = ($default{"emailreporter$id"} eq "1") ? "checked" : "";
-    my $cc = ($default{"emailcc$id"} eq "1") ? "checked" : "";
-    my $longdesc = ($default{"emaillongdesc$id"} eq "1") ? "checked" : "";
-
-    my $qapart = "";
-    my $qacontact = "";
-    if (Param("useqacontact")) {
-        $qacontact = ($default{"emailqa_contact$id"} eq "1") ? "checked" : "";
-        $qapart = qq|
-<tr>
-<td></td>
-<td>
-<input type="checkbox" name="emailqa_contact$id" value=1 $qacontact>QA Contact
-</td>
-</tr>
-|;
-    }
-    if ($assignedto eq "" && $reporter eq "" && $cc eq "" &&
-          $qacontact eq "") {
-        if ($id eq "1") {
-            $assignedto = "checked";
-        } else {
-            $reporter = "checked";
-        }
-    }
-
-
-    $default{"emailtype$id"} ||= "substring";
-
-    return qq{
-<table border=1 cellspacing=0 cellpadding=0>
-<tr><td>
-<table cellspacing=0 cellpadding=0>
-<tr>
-<td rowspan=2 valign=top><a href="queryhelp.cgi#peopleinvolved">Email:</a>
-<input name="email$id" size="30" value="$defstr">&nbsp;matching as
-} . BuildPulldown("emailtype$id",
-                  [["regexp", "regexp"],
-                   ["notregexp", "not regexp"],
-                   ["substring", "substring"],
-                   ["exact", "exact"]],
-                  $default{"emailtype$id"}) . qq{
-</td>
-<td>
-<input type="checkbox" name="emailassigned_to$id" value=1 $assignedto>Assigned To
-</td>
-</tr>
-<tr>
-<td>
-<input type="checkbox" name="emailreporter$id" value=1 $reporter>Reporter
-</td>
-</tr>$qapart
-<tr>
-<td align=right>(Will match any of the selected fields)</td>
-<td>
-<input type="checkbox" name="emailcc$id" value=1 $cc>CC
-</td>
-</tr>
-<tr>
-<td></td>
-<td>
-<input type="checkbox" name="emaillongdesc$id" value=1 $longdesc>Added comment
-</td>
-</tr>
-</table>
-</table>
-};
-}
-
-
-            
-
-
-my $emailinput1 = GenerateEmailInput(1);
-my $emailinput2 = GenerateEmailInput(2);
-
 # if using usebuggroups, then we don't want people to see products they don't
-# have access to.  remove them from the list.
+# have access to. Remove them from the list.
 
-@::product_list = ();
+my @products = ();
 my %component_set;
 my %version_set;
 my %milestone_set;
 foreach my $p (@::legal_product) {
-  if(Param("usebuggroups")
-     && GroupExists($p)
-     && !UserInGroup($p)) {
     # If we're using bug groups to restrict entry on products, and
     # this product has a bug group, and the user is not in that
     # group, we don't want to include that product in this list.
-    next;
-  }
-  push @::product_list, $p;
-  if ($::components{$p}) {
-    foreach my $c (@{$::components{$p}}) {
-      $component_set{$c} = 1;
-    }
-  }
-  foreach my $v (@{$::versions{$p}}) {
-    $version_set{$v} = 1;
-  }
-  foreach my $m (@{$::target_milestone{$p}}) {
-    $milestone_set{$m} = 1;
-  }
-}
+    next if (Param("usebuggroups") && GroupExists($p) && !UserInGroup($p));
 
-@::component_list = ();
-@::version_list = ();
-@::milestone_list = ();
-foreach my $c (@::legal_components) {
-  if ($component_set{$c}) {
-    push @::component_list, $c;
-  }
-}
-foreach my $v (@::legal_versions) {
-  if ($version_set{$v}) {
-    push @::version_list, $v;
-  }
-}
-foreach my $m (@::legal_target_milestone) {
-  if ($milestone_set{$m}) {
-    push @::milestone_list, $m;
-  }
-}
-
-# javascript
-    
-my $jscript = << 'ENDSCRIPT';
-<script language="Javascript1.1" type="text/javascript">
-<!--
-var cpts = new Array();
-var vers = new Array();
-var tms  = new Array();
-ENDSCRIPT
-
-
-my $p;
-my $v;
-my $c;
-my $m;
-my $i = 0;
-my $j = 0;
-
-foreach $c (@::component_list) {
-    $jscript .= "cpts['$c'] = new Array();\n";
-}
-
-foreach $v (@::version_list) {
-    $jscript .= "vers['$v'] = new Array();\n";
-}
-
-my $tm;
-foreach $tm (@::milestone_list) {
-    $jscript .= "tms['$tm'] = new Array();\n";
-}
-
-for $p (@::product_list) {
+    # We build up boolean hashes in the "-set" hashes for each of these things 
+    # before making a list because there may be duplicates names across products.
+    push @products, $p;
     if ($::components{$p}) {
-        foreach $c (@{$::components{$p}}) {
-            $jscript .= "cpts['$c'][cpts['$c'].length] = '$p';\n";
+        foreach my $c (@{$::components{$p}}) {
+            $component_set{$c} = 1;
         }
     }
-
-    if ($::versions{$p}) {
-        foreach $v (@{$::versions{$p}}) {
-            $jscript .= "vers['$v'][vers['$v'].length] = '$p';\n";
-        }
+    foreach my $v (@{$::versions{$p}}) {
+        $version_set{$v} = 1;
     }
-
-    if ($::target_milestone{$p}) {
-        foreach $m (@{$::target_milestone{$p}}) {
-            $jscript .= "tms['$m'][tms['$m'].length] = '$p';\n";
-        }
+    foreach my $m (@{$::target_milestone{$p}}) {
+        $milestone_set{$m} = 1;
     }
 }
 
-$i = 0;
-$jscript .= << 'ENDSCRIPT';
-
-// Only display versions/components valid for selected product(s)
-
-function selectProduct(f) {
-    // Netscape 4.04 and 4.05 also choke with an "undefined"
-    // error.  if someone can figure out how to "define" the
-    // whatever, we'll remove this hack.  in the mean time, we'll
-    // assume that v4.00-4.03 also die, so we'll disable the neat
-    // javascript stuff for Netscape 4.05 and earlier.
-
-    var cnt = 0;
-    var i;
-    var j;
-
-    if (!f) {
-        return;
-    }
-
-    for (i=0 ; i<f.product.length ; i++) {
-        if (f.product[i].selected) {
-            cnt++;
-        }
-    }
-    var doall = (cnt == f.product.length || cnt == 0);
-
-    var csel = new Object();
-    for (i=0 ; i<f.component.length ; i++) {
-        if (f.component[i].selected) {
-            csel[f.component[i].value] = 1;
-        }
-    }
-
-    f.component.options.length = 0;
-
-    for (c in cpts) {
-        if (typeof(cpts[c]) == 'function') continue;
-        var doit = doall;
-        for (i=0 ; !doit && i<f.product.length ; i++) {
-            if (f.product[i].selected) {
-                var p = f.product[i].value;
-                for (j in cpts[c]) {
-                    if (typeof(cpts[c][j]) == 'function') continue;
-                    var p2 = cpts[c][j];
-                    if (p2 == p) {
-                        doit = true;
-                        break;
-                    }
-                }
-            }
-        }
-        if (doit) {
-            var l = f.component.length;
-            f.component[l] = new Option(c, c);
-            if (csel[c]) {
-                f.component[l].selected = true;
-            }
-        }
-    }
+# @products is now all the products we are ever concerned with, as a list
+# %x_set is now a unique "list" of the relevant components/versions/tms
+@products = sort { lc($a) cmp lc($b) } @products;
 
-    var vsel = new Object();
-    for (i=0 ; i<f.version.length ; i++) {
-        if (f.version[i].selected) {
-            vsel[f.version[i].value] = 1;
-        }
-    }
-
-    f.version.options.length = 0;
-
-    for (v in vers) {
-        if (typeof(vers[v]) == 'function') continue;
-        doit = doall;
-        for (i=0 ; !doit && i<f.product.length ; i++) {
-            if (f.product[i].selected) {
-                p = f.product[i].value;
-                for (j in vers[v]) {
-                    if (typeof(vers[v][j]) == 'function') continue;
-                    p2 = vers[v][j];
-                    if (p2 == p) {
-                        doit = true;
-                        break;
-                    }
-                }
-            }
-        }
-        if (doit) {
-            l = f.version.length;
-            f.version[l] = new Option(v, v);
-            if (vsel[v]) {
-                f.version[l].selected = true;
-            }
-        }
+# Create the component, version and milestone lists.
+my @components = ();
+my @versions = ();
+my @milestones = ();
+foreach my $c (@::legal_components) {
+    if ($component_set{$c}) {
+        push @components, $c;
     }
-
-ENDSCRIPT
-if (Param("usetargetmilestone")) {
-    $jscript .= q{
-      if (f.target_milestone) {
-        var tmsel = new Object();
-        for (i=0 ; i<f.target_milestone.length ; i++) {
-            if (f.target_milestone[i].selected) {
-                tmsel[f.target_milestone[i].value] = 1;
-            }
-        }
-    
-        f.target_milestone.options.length = 0;
-    
-        for (tm in tms) {
-            if (typeof(tms[v]) == 'function') continue;
-            doit = doall;
-            for (i=0 ; !doit && i<f.product.length ; i++) {
-                if (f.product[i].selected) {
-                    p = f.product[i].value;
-                    for (j in tms[tm]) {
-                        if (typeof(tms[tm][j]) == 'function') continue;
-                        p2 = tms[tm][j];
-                        if (p2 == p) {
-                            doit = true;
-                            break;
-                        }
-                    }
-                }
-            }
-            if (doit) {
-                l = f.target_milestone.length;
-                f.target_milestone[l] = new Option(tm, tm);
-                if (tmsel[tm]) {
-                    f.target_milestone[l].selected = true;
-                }
-            }
-        }
-      }
-    };
-
 }
-
-$jscript .= << 'ENDSCRIPT';
-}
-// -->
-</script>
-
-ENDSCRIPT
-
-
-
-# Muck the "legal product" list so that the default one is always first (and
-# is therefore visibly selected.
-
-# Commented out, until we actually have enough products for this to matter.
-
-# set w [lsearch $legal_product $default{"product"}]
-# if {$w >= 0} {
-#    set legal_product [concat $default{"product"} [lreplace $legal_product $w $w]]
-# }
-
-PutHeader("Bugzilla Query Page", "Query", 
-          "This page lets you search the database for recorded bugs.",
-          q{onLoad="selectProduct(document.forms[0]);"}, $jscript);
-
-push @::legal_resolution, "---"; # Oy, what a hack.
-
-my @logfields = ("[Bug creation]", @::log_columns);
-
-print"<P>Give me a <A HREF=\"queryhelp.cgi\">clue</A> about how to use this form.<P>";
-
-print qq{
-<FORM METHOD=GET ACTION="buglist.cgi">
-
-<table>
-<tr>
-<th align=left><A HREF="queryhelp.cgi#status">Status</a>:</th>
-<th align=left><A HREF="queryhelp.cgi#resolution">Resolution</a>:</th>
-<th align=left><A HREF="queryhelp.cgi#platform">Platform</a>:</th>
-<th align=left><A HREF="queryhelp.cgi#opsys">OpSys</a>:</th>
-<th align=left><A HREF="queryhelp.cgi#priority">Priority</a>:</th>
-<th align=left><A HREF="queryhelp.cgi#severity">Severity</a>:</th>
-};
-
-print "
-</tr>
-<tr>
-<td align=left valign=top>
-
-@{[make_selection_widget(\"bug_status\",\@::legal_bug_status,$default{'bug_status'}, $type{'bug_status'}, 1)]}
-
-</td>
-<td align=left valign=top>
-@{[make_selection_widget(\"resolution\",\@::legal_resolution,$default{'resolution'}, $type{'resolution'}, 1)]}
-
-</td>
-<td align=left valign=top>
-@{[make_selection_widget(\"rep_platform\",\@::legal_platform,$default{'platform'}, $type{'platform'}, 1)]}
-
-</td>
-<td align=left valign=top>
-@{[make_selection_widget(\"op_sys\",\@::legal_opsys,$default{'op_sys'}, $type{'op_sys'}, 1)]}
-
-</td>
-<td align=left valign=top>
-@{[make_selection_widget(\"priority\",\@::legal_priority,$default{'priority'}, $type{'priority'}, 1)]}
-
-</td>
-<td align=left valign=top>
-@{[make_selection_widget(\"bug_severity\",\@::legal_severity,$default{'bug_severity'}, $type{'bug_severity'}, 1)]}
-
-</tr>
-</table>
-
-<p>
-
-<table>
-<tr><td colspan=2>
-$emailinput1<p>
-</td></tr><tr><td colspan=2>
-$emailinput2<p>
-</td></tr>";
-
-my $inclselected = "SELECTED";
-my $exclselected = "";
-
-    
-if ($default{'bugidtype'} eq "exclude") {
-    $inclselected = "";
-    $exclselected = "SELECTED";
+foreach my $v (@::legal_versions) {
+    if ($version_set{$v}) {
+        push @versions, $v;
+    }
 }
-my $bug_id = value_quote($default{'bug_id'}); 
-
-print qq{
-<TR>
-<TD COLSPAN="3">
-<SELECT NAME="bugidtype">
-<OPTION VALUE="include" $inclselected>Only
-<OPTION VALUE="exclude" $exclselected>Exclude
-</SELECT>
-bugs numbered: 
-<INPUT TYPE="text" NAME="bug_id" VALUE="$bug_id" SIZE=30>
-</TD>
-</TR>
-};
-
-print "
-<tr>
-<td>
-Changed in the <NOBR>last <INPUT NAME=changedin SIZE=2 VALUE=\"$default{'changedin'}\"> days.</NOBR>
-</td>
-<td align=right>
-At <NOBR>least <INPUT NAME=votes SIZE=3 VALUE=\"$default{'votes'}\"> votes.</NOBR>
-</tr>
-</table>
-
-
-<table>
-<tr>
-<td rowspan=2 align=right>Where the field(s)
-</td><td rowspan=2>
-<SELECT NAME=\"chfield\" MULTIPLE SIZE=4>
-@{[make_options(\@logfields, $default{'chfield'}, $type{'chfield'})]}
-</SELECT>
-</td><td rowspan=2>
-changed.
-</td><td>
-<nobr>dates <INPUT NAME=chfieldfrom SIZE=10 VALUE=\"$default{'chfieldfrom'}\"></nobr>
-<nobr>to <INPUT NAME=chfieldto SIZE=10 VALUE=\"$default{'chfieldto'}\"></nobr>
-</td>
-</tr>
-<tr>
-<td>changed to value <nobr><INPUT NAME=chfieldvalue SIZE=10> (optional)</nobr>
-</td>
-</table>
-
-
-<P>
-
-<table>
-<tr>
-<TH ALIGN=LEFT VALIGN=BOTTOM>Program:</th>
-<TH ALIGN=LEFT VALIGN=BOTTOM>Version:</th>
-<TH ALIGN=LEFT VALIGN=BOTTOM><A HREF=describecomponents.cgi>Component:</a></th>
-";
-
-if (Param("usetargetmilestone")) {
-    print "<TH ALIGN=LEFT VALIGN=BOTTOM>Target Milestone:</th>";
+foreach my $m (@::legal_target_milestone) {
+    if ($milestone_set{$m}) {
+        push @milestones, $m;
+    }
 }
 
-print "
-</tr>
-<tr>
-
-<td align=left valign=top>
-<SELECT NAME=\"product\" MULTIPLE SIZE=5 onChange=\"selectProduct(this.form);\">
-@{[make_options(\@::product_list, $default{'product'}, $type{'product'})]}
-</SELECT>
-</td>
-
-<td align=left valign=top>
-<SELECT NAME=\"version\" MULTIPLE SIZE=5>
-@{[make_options(\@::version_list, $default{'version'}, $type{'version'})]}
-</SELECT>
-</td>
-
-<td align=left valign=top>
-<SELECT NAME=\"component\" MULTIPLE SIZE=5>
-@{[make_options(\@::component_list, $default{'component'}, $type{'component'})]}
-</SELECT>
-</td>";
-
-if (Param("usetargetmilestone")) {
-    print "
-<td align=left valign=top>
-<SELECT NAME=\"target_milestone\" MULTIPLE SIZE=5>
-@{[make_options(\@::milestone_list, $default{'target_milestone'}, $type{'target_milestone'})]}
-</SELECT>
-</td>";
-}
+# Sort the component list...
+my $comps = \%::components;
+foreach my $p (@products) {
+    my @tmp = sort { lc($a) cmp lc($b) } @{$comps->{$p}};
+    $comps->{$p} = \@tmp;
+}    
 
+# and the version list...
+my $vers = \%::versions;
+foreach my $p (@products) {
+    my @tmp = sort { lc($a) cmp lc($b) } @{$vers->{$p}};
+    $vers->{$p} = \@tmp;
+}    
 
-sub StringSearch {
-    my ($desc, $name) = (@_);
-    my $type = $name . "_type";
-    my $def = value_quote($default{$name});
-    print qq{<tr>
-<td align=right>$desc:</td>
-<td><input name=$name size=30 value="$def"></td>
-<td><SELECT NAME=$type>
-};
-    if ($default{$type} eq "") {
-        $default{$type} = "allwordssubstr";
-    }
-    foreach my $i (["substring", "case-insensitive substring"],
-                   ["casesubstring", "case-sensitive substring"],
-                   ["allwordssubstr", "all words as substrings"],
-                   ["anywordssubstr", "any words as substrings"],
-                   ["allwords", "all words"],
-                   ["anywords", "any words"],
-                   ["regexp", "regular expression"],
-                   ["notregexp", "not ( regular expression )"]) {
-        my ($n, $d) = (@$i);
-        my $sel = "";
-        if ($default{$type} eq $n) {
-            $sel = " SELECTED";
-        }
-        print qq{<OPTION VALUE="$n"$sel>$d\n};
-    }
-    print "</SELECT></TD>
-</tr>
-";
+# and the milestone list.
+my $mstones;
+if (Param('usetargetmilestone')) {
+    $mstones = \%::target_milestone;
+    foreach my $p (@products) {
+        my @tmp = sort { lc($a) cmp lc($b) } @{$mstones->{$p}};
+        $mstones->{$p} = \@tmp;
+    }    
 }
 
-print "
-</tr>
-</table>
+# "foo" or "foos" is a list of all the possible (or legal) products, 
+# components, versions or target milestones.
+# "foobyproduct" is a hash, keyed by product, of sorted lists
+# of the same data.
 
-<table border=0>
-";
+$vars->{'product'} = \@products;
 
-StringSearch("Summary", "short_desc");
-StringSearch("A description entry", "long_desc");
-StringSearch("URL", "bug_file_loc");
+# We use 'component_' because 'component' is a Template Toolkit reserved word.
+$vars->{'componentsbyproduct'} = $comps;
+$vars->{'component_'} = \@components;
 
-if (Param("usestatuswhiteboard")) {
-    StringSearch("Status whiteboard", "status_whiteboard");
-}
+$vars->{'versionsbyproduct'} = $vers;
+$vars->{'version'} = \@versions;
 
-if (@::legal_keywords) {
-    my $def = value_quote($default{'keywords'});
-    print qq{
-<TR>
-<TD ALIGN="right"><A HREF="describekeywords.cgi">Keywords</A>:</TD>
-<TD><INPUT NAME="keywords" SIZE=30 VALUE="$def"></TD>
-<TD>
-};
-    my $type = $default{"keywords_type"};
-    if ($type eq "or") {        # Backward compatability hack.
-        $type = "anywords";
-    }
-    print BuildPulldown("keywords_type",
-                        [["anywords", "Any of the listed keywords set"],
-                         ["allwords", "All of the listed keywords set"],
-                         ["nowords", "None of the listed keywords set"]],
-                        $type);
-    print qq{</TD></TR>};
+if (Param('usetargetmilestone')) {
+    $vars->{'milestonesbyproduct'} = $mstones;
+    $vars->{'target_milestone'} = \@milestones;
 }
 
-print "
-</table>
-<p>
-";
-
+$vars->{'have_keywords'} = scalar(@::legal_keywords);
 
+push @::legal_resolution, "---"; # Oy, what a hack.
+shift @::legal_resolution; 
+      # Another hack - this array contains "" for some reason. See bug 106589.
+$vars->{'resolution'} = \@::legal_resolution;
+
+$vars->{'chfield'} = ["[Bug creation]", @::log_columns];
+$vars->{'bug_status'} = \@::legal_bug_status;
+$vars->{'rep_platform'} = \@::legal_platform;
+$vars->{'op_sys'} = \@::legal_opsys;
+$vars->{'priority'} = \@::legal_priority;
+$vars->{'bug_severity'} = \@::legal_severity;
+$vars->{'userid'} = $::userid;
+
+# Boolean charts
 my @fields;
-push(@fields, ["noop", "---"]);
-ConnectToDatabase();
+push(@fields, { name => "noop", description => "---" });
 SendSQL("SELECT name, description FROM fielddefs ORDER BY sortkey");
 while (MoreSQLData()) {
-    my ($name, $description) = (FetchSQLData());
-    push(@fields, [$name, $description]);
+    my ($name, $description) = FetchSQLData();
+    push(@fields, { name => $name, description => $description });
 }
 
-my @types = (
-	     ["noop", "---"],
-	     ["equals", "equal to"],
-	     ["notequals", "not equal to"],
-	     ["casesubstring", "contains (case-sensitive) substring"],
-	     ["substring", "contains (case-insensitive) substring"],
-	     ["notsubstring", "does not contain (case-insensitive) substring"],
-	     ["allwordssubstr", "all words as (case-insensitive) substrings"],
-	     ["anywordssubstr", "any words as (case-insensitive) substrings"],
-	     ["regexp", "contains regexp"],
-	     ["notregexp", "does not contain regexp"],
-	     ["lessthan", "less than"],
-	     ["greaterthan", "greater than"],
-	     ["anywords", "any words"],
-	     ["allwords", "all words"],
-	     ["nowords", "none of the words"],
-	     ["changedbefore", "changed before"],
-	     ["changedafter", "changed after"],
-	     ["changedto", "changed to"],
-	     ["changedby", "changed by"],
-	     );
-
-
-print qq{<A NAME="chart"> </A>\n};
+$vars->{'fields'} = \@fields;
 
+# Creating new charts - if the cmd-add value is there, we define the field
+# value so the code sees it and creates the chart. It will attempt to select
+# "xyzzy" as the default, and fail. This is the correct behaviour.
 foreach my $cmd (grep(/^cmd-/, keys(%::FORM))) {
     if ($cmd =~ /^cmd-add(\d+)-(\d+)-(\d+)$/) {
-	$::FORM{"field$1-$2-$3"} = "xyzzy";
+        $::FORM{"field$1-$2-$3"} = "xyzzy";
     }
 }
-	
-#  foreach my $i (sort(keys(%::FORM))) {
-#      print "$i : " . value_quote($::FORM{$i}) . "<BR>\n";
-#  }
-
 
 if (!exists $::FORM{'field0-0-0'}) {
     $::FORM{'field0-0-0'} = "xyzzy";
 }
 
-my $jsmagic = qq{ONCLICK="document.forms[0].action='query.cgi#chart' ; document.forms[0].method='POST' ; return 1;"};
-
-my $chart;
-for ($chart=0 ; exists $::FORM{"field$chart-0-0"} ; $chart++) {
+# Create data structure of boolean chart info. It's an array of arrays of
+# arrays - with the inner arrays having three members - field, type and
+# value.
+my @charts;
+for (my $chart = 0; $::FORM{"field$chart-0-0"}; $chart++) {
     my @rows;
-    my $row;
-    for ($row = 0 ; exists $::FORM{"field$chart-$row-0"} ; $row++) {
-	my @cols;
-	my $col;
-	for ($col = 0 ; exists $::FORM{"field$chart-$row-$col"} ; $col++) {
-	    my $key = "$chart-$row-$col";
-	    my $deffield = $::FORM{"field$key"} || "";
-	    my $deftype = $::FORM{"type$key"} || "";
-	    my $defvalue = value_quote($::FORM{"value$key"} || "");
-	    my $line = "";
-	    $line .= "<TD>";
-	    $line .= BuildPulldown("field$key", \@fields, $deffield);
-	    $line .= BuildPulldown("type$key", \@types, $deftype);
-	    $line .= qq{<INPUT NAME="value$key" VALUE="$defvalue">};
-	    $line .= "</TD>\n";
-	    push(@cols, $line);
-	}
-	push(@rows, "<TR>" . join(qq{<TD ALIGN="center"> or </TD>\n}, @cols) .
-	     qq{<TD><INPUT TYPE="submit" VALUE="Or" NAME="cmd-add$chart-$row-$col" $jsmagic></TD></TR>});
-    }
-    print qq{
-<HR>
-<TABLE>
-};
-    print join('<TR><TD>And</TD></TR>', @rows);
-    print qq{
-<TR><TD><INPUT TYPE="submit" VALUE="And" NAME="cmd-add$chart-$row-0" $jsmagic>
-};
-    my $n = $chart + 1;
-    if (!exists $::FORM{"field$n-0-0"}) {
-        print qq{
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-<INPUT TYPE="submit" VALUE="Add another boolean chart" NAME="cmd-add$n-0-0" $jsmagic>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-<NOBR><A HREF="queryhelp.cgi#advancedquerying">What is this stuff?</A></NOBR>
-};
+    for (my $row = 0; $::FORM{"field$chart-$row-0"}; $row++) {
+        my @cols;
+        for (my $col = 0; $::FORM{"field$chart-$row-$col"}; $col++) {
+            push(@cols, { field => $::FORM{"field$chart-$row-$col"},
+                          type => $::FORM{"type$chart-$row-$col"},
+                          value => $::FORM{"value$chart-$row-$col"} });
+        }
+        push(@rows, \@cols);
     }
-    print qq{
-</TD>
-</TR>
-</TABLE>
-    };
+    push(@charts, \@rows);
 }
-print qq{<HR>};
 
+$default{'charts'} = \@charts;
 
-
-
-if (!$userid) {
-    print qq{<INPUT TYPE="hidden" NAME="cmdtype" VALUE="doit">};
-} else {
-    print "
-<BR>
-<INPUT TYPE=radio NAME=cmdtype VALUE=doit CHECKED> Run this query
-<BR>
-";
-
+# Named queries
+if ($::userid) {
     my @namedqueries;
-    if ($userid) {
-        SendSQL("SELECT name FROM namedqueries " .
-                "WHERE userid = $userid AND name != '$::defaultqueryname' " .
-                "ORDER BY name");
-        while (MoreSQLData()) {
-            push(@namedqueries, FetchOneColumn());
-        }
+    SendSQL("SELECT name FROM namedqueries " .
+            "WHERE userid = $::userid AND name != '$::defaultqueryname' " .
+            "ORDER BY name");
+    while (MoreSQLData()) {
+        push(@namedqueries, FetchOneColumn());
     }
     
-    
-    
-    
-    if (@namedqueries) {
-        my $namelist = make_options(\@namedqueries);
-        print qq{
-<table cellspacing=0 cellpadding=0><tr>
-<td><INPUT TYPE=radio NAME=cmdtype VALUE=editnamed> Load the remembered query:</td>
-<td rowspan=3><select name=namedcmd>$namelist</select>
-</tr><tr>
-<td><INPUT TYPE=radio NAME=cmdtype VALUE=runnamed> Run the remembered query:</td>
-</tr><tr>
-<td><INPUT TYPE=radio NAME=cmdtype VALUE=forgetnamed> Forget the remembered query:</td>
-</tr></table>};
-    }
-
-    print qq{
-<INPUT TYPE=radio NAME=cmdtype VALUE=asdefault> Remember this as the default query
-<BR>
-<INPUT TYPE=radio NAME=cmdtype VALUE=asnamed> Remember this query, and name it:
-<INPUT TYPE=text NAME=newqueryname>
-<br>&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="checkbox" NAME="tofooter" VALUE="1">
-    and put it in my page footer.
-<BR>
-    };
+    $vars->{'namedqueries'} = \@namedqueries;    
 }
 
-print qq{
-<NOBR><B>Sort By:</B>
-<SELECT NAME=\"order\">
-};
-
-my $deforder = "'Importance'";
-my @orders = ('Bug Number', $deforder, 'Assignee');
+# Sort order
+my $deforder;
+my @orders = ('Bug Number', 'Importance', 'Assignee', 'Last Changed');
 
 if ($::COOKIE{'LASTORDER'}) {
     $deforder = "Reuse same sort as last time";
@@ -928,43 +368,14 @@ if ($::COOKIE{'LASTORDER'}) {
 
 if ($::FORM{'order'}) { $deforder = $::FORM{'order'} }
 
-my $defquerytype = $userdefaultquery ? "my" : "the";
+$vars->{'userdefaultquery'} = $userdefaultquery;
+$vars->{'orders'} = \@orders;
+$default{'querytype'} = $deforder || 'Importance';
 
-print make_options(\@orders, $deforder);
-print "</SELECT></NOBR>
-<INPUT TYPE=\"submit\" VALUE=\"Submit query\">
-<INPUT TYPE=\"reset\" VALUE=\"Reset back to $defquerytype default query\">
-";
-
-if ($userdefaultquery) {
-    print qq{<BR><A HREF="query.cgi?nukedefaultquery=1">Set my default query back to the system default</A>};
-}
+# Add in the defaults.
+$vars->{'default'} = \%default;
 
-print "
-</FORM>
-";
-
-###
-### I really hate this redudancy, but if somebody for some inexplicable reason doesn't like using
-### the footer for these links, they can uncomment this section. 
-###
-
-# if (UserInGroup("tweakparams")) {
-#     print "<a href=editparams.cgi>Edit Bugzilla operating parameters</a><br>\n";
-# }
-# if (UserInGroup("editcomponents")) {
-#     print "<a href=editproducts.cgi>Edit Bugzilla products and components</a><br>\n";
-# }
-# if (UserInGroup("editkeywords")) {
-#     print "<a href=editkeywords.cgi>Edit Bugzilla keywords</a><br>\n";
-# }
-# if ($userid) {
-#     print "<a href=relogin.cgi>Log in as someone besides <b>$::COOKIE{'Bugzilla_login'}</b></a><br>\n";
-# }
-# print "<a href=userprefs.cgi>Change your password or preferences.</a><br>\n";
-# print "<a href=\"enter_bug.cgi\">Report a new bug.</a><br>\n";
-# print "<a href=\"createaccount.cgi\">Open a new Bugzilla account</a><br>\n";
-# print "<a href=\"reports.cgi\">Bug reports</a><br>\n";
-
-
-PutFooter();
+# Generate and return the UI (HTML page) from the appropriate template.
+print "Content-type: text/html\n\n";
+$template->process("search/search.html.tmpl", $vars)
+  || ThrowTemplateError($template->error());
diff --git a/queryhelp.cgi b/queryhelp.cgi
index 6a2a6880f..48a4e0855 100755
--- a/queryhelp.cgi
+++ b/queryhelp.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -19,17 +19,21 @@
 # Rights Reserved.
 #
 # Contributor(s):         Brian Bober <boberb@rpi.edu>
-#			  Terry Weissman <terry@mozilla.org>
-#			  Tara Hernandez <tara@tequilarista.org>
+#                         Terry Weissman <terry@mozilla.org>
+#                         Tara Hernandez <tara@tequilarista.org>
 
 use vars %::FORM;
 
 use diagnostics;
 use strict;
 
+use lib qw(.);
+
 require "CGI.pl";
 
 ConnectToDatabase();
+quietly_check_login();
+
 GetVersionTable();
 
 print "Content-type: text/html\n\n";
@@ -77,7 +81,7 @@ Until you get better, you can use the "brute force" method where you enter a ver
 the long list of bugs manually. Just try not to overuse this method if you don't have to as you might be slowing down
 the search for other people if there are many people searching at the same time. Finally, I would recommend learning the Boolean Chart immediately because it is extremely 
 powerful. Also, there is a navigation bar at the <a href="#bottom">bottom</a> of 
-most Bugzilla pages, and important links at the <a href="index.html">front page</a>.
+most Bugzilla pages, and important links at the <a href="index.cgi">front page</a>.
 
 
 
@@ -114,32 +118,99 @@ print qq{
 <td align="left" valign="top">
 
 <SELECT NAME="bug_status" MULTIPLE SIZE="7">
-<OPTION VALUE="UNCONFIRMED">UNCONFIRMED<OPTION VALUE="NEW">NEW<OPTION VALUE="ASSIGNED">ASSIGNED<OPTION VALUE="REOPENED">REOPENED<OPTION VALUE="RESOLVED">RESOLVED<OPTION VALUE="VERIFIED">VERIFIED<OPTION VALUE="CLOSED">CLOSED</SELECT>
+<OPTION VALUE="UNCONFIRMED">UNCONFIRMED
+<OPTION VALUE="NEW">NEW
+<OPTION VALUE="ASSIGNED">ASSIGNED
+<OPTION VALUE="REOPENED">REOPENED
+<OPTION VALUE="RESOLVED">RESOLVED
+<OPTION VALUE="VERIFIED">VERIFIED
+<OPTION VALUE="CLOSED">CLOSED
+</SELECT>
 
 </td>
 <td align="left" valign="top">
 <SELECT NAME="resolution" MULTIPLE SIZE="7">
-<OPTION VALUE="FIXED">FIXED<OPTION VALUE="INVALID">INVALID<OPTION VALUE="WONTFIX">WONTFIX<OPTION VALUE="LATER">LATER<OPTION VALUE="REMIND">REMIND<OPTION VALUE="DUPLICATE">DUPLICATE<OPTION VALUE="WORKSFORME">WORKSFORME<OPTION VALUE="MOVED">MOVED<OPTION VALUE="---">---</SELECT>
+<OPTION VALUE="FIXED">FIXED
+<OPTION VALUE="INVALID">INVALID
+<OPTION VALUE="WONTFIX">WONTFIX
+<OPTION VALUE="LATER">LATER
+<OPTION VALUE="REMIND">REMIND
+<OPTION VALUE="DUPLICATE">DUPLICATE
+<OPTION VALUE="WORKSFORME">WORKSFORME
+<OPTION VALUE="MOVED">MOVED
+<OPTION VALUE="---">---
+</SELECT>
 
 </td>
 <td align="left" valign="top">
 <SELECT NAME="rep_platform" MULTIPLE SIZE="7">
-<OPTION VALUE="All">All<OPTION VALUE="DEC">DEC<OPTION VALUE="HP">HP<OPTION VALUE="Macintosh">Macintosh<OPTION VALUE="PC">PC<OPTION VALUE="SGI">SGI<OPTION VALUE="Sun">Sun<OPTION VALUE="Other">Other</SELECT>
+<OPTION VALUE="All">All
+<OPTION VALUE="DEC">DEC
+<OPTION VALUE="HP">HP
+<OPTION VALUE="Macintosh">Macintosh
+<OPTION VALUE="PC">PC
+<OPTION VALUE="SGI">SGI
+<OPTION VALUE="Sun">Sun
+<OPTION VALUE="Other">Other
+</SELECT>
 
 </td>
 <td align="left" valign="top">
 <SELECT NAME="op_sys" MULTIPLE SIZE="7">
-<OPTION VALUE="All">All<OPTION VALUE="Windows 3.1">Windows 3.1<OPTION VALUE="Windows 95">Windows 95<OPTION VALUE="Windows 98">Windows 98<OPTION VALUE="Windows ME">Windows ME<OPTION VALUE="Windows 2000">Windows 2000<OPTION VALUE="Windows NT">Windows NT<OPTION VALUE="Mac System 7">Mac System 7<OPTION VALUE="Mac System 7.5">Mac System 7.5<OPTION VALUE="Mac System 7.6.1">Mac System 7.6.1<OPTION VALUE="Mac System 8.0">Mac System 8.0<OPTION VALUE="Mac System 8.5">Mac System 8.5<OPTION VALUE="Mac System 8.6">Mac System 8.6<OPTION VALUE="Mac System 9.0">Mac System 9.0<OPTION VALUE="Linux">Linux<OPTION VALUE="BSDI">BSDI<OPTION VALUE="FreeBSD">FreeBSD<OPTION VALUE="NetBSD">NetBSD<OPTION VALUE="OpenBSD">OpenBSD<OPTION VALUE="AIX">AIX<OPTION VALUE="BeOS">BeOS<OPTION VALUE="HP-UX">HP-UX<OPTION VALUE="IRIX">IRIX<OPTION VALUE="Neutrino">Neutrino<OPTION VALUE="OpenVMS">OpenVMS<OPTION VALUE="OS/2">OS/2<OPTION VALUE="OSF/1">OSF/1<OPTION VALUE="Solaris">Solaris<OPTION VALUE="SunOS">SunOS<OPTION VALUE="other">other</SELECT>
+<OPTION VALUE="All">All
+<OPTION VALUE="Windows 3.1">Windows 3.1
+<OPTION VALUE="Windows 95">Windows 95
+<OPTION VALUE="Windows 98">Windows 98
+<OPTION VALUE="Windows ME">Windows ME
+<OPTION VALUE="Windows 2000">Windows 2000
+<OPTION VALUE="Windows NT">Windows NT
+<OPTION VALUE="Windows XP">Windows XP
+<OPTION VALUE="Mac System 7">Mac System 7
+<OPTION VALUE="Mac System 7.5">Mac System 7.5
+<OPTION VALUE="Mac System 7.6.1">Mac System 7.6.1
+<OPTION VALUE="Mac System 8.0">Mac System 8.0
+<OPTION VALUE="Mac System 8.5">Mac System 8.5
+<OPTION VALUE="Mac System 8.6">Mac System 8.6
+<OPTION VALUE="Mac System 9.0">Mac System 9.0
+<OPTION VALUE="Linux">Linux
+<OPTION VALUE="BSDI">BSDI
+<OPTION VALUE="FreeBSD">FreeBSD
+<OPTION VALUE="NetBSD">NetBSD
+<OPTION VALUE="OpenBSD">OpenBSD
+<OPTION VALUE="AIX">AIX
+<OPTION VALUE="BeOS">BeOS
+<OPTION VALUE="HP-UX">HP-UX
+<OPTION VALUE="IRIX">IRIX
+<OPTION VALUE="Neutrino">Neutrino
+<OPTION VALUE="OpenVMS">OpenVMS
+<OPTION VALUE="OS/2">OS/2
+<OPTION VALUE="OSF/1">OSF/1
+<OPTION VALUE="Solaris">Solaris
+<OPTION VALUE="SunOS">SunOS
+<OPTION VALUE="other">other
+</SELECT>
 
 </td>
 <td align="left" valign="top">
 <SELECT NAME="priority" MULTIPLE SIZE="7">
-<OPTION VALUE="P1">P1<OPTION VALUE="P2">P2<OPTION VALUE="P3">P3<OPTION VALUE="P4">P4<OPTION VALUE="P5">P5</SELECT>
+<OPTION VALUE="P1">P1
+<OPTION VALUE="P2">P2
+<OPTION VALUE="P3">P3
+<OPTION VALUE="P4">P4
+<OPTION VALUE="P5">P5
+</SELECT>
 
 </td>
 <td align="left" valign="top">
 <SELECT NAME="bug_severity" MULTIPLE SIZE="7">
-<OPTION VALUE="blocker">blocker<OPTION VALUE="critical">critical<OPTION VALUE="major">major<OPTION VALUE="normal">normal<OPTION VALUE="minor">minor<OPTION VALUE="trivial">trivial<OPTION VALUE="enhancement">enhancement</SELECT>
+<OPTION VALUE="blocker">blocker
+<OPTION VALUE="critical">critical
+<OPTION VALUE="major">major
+<OPTION VALUE="normal">normal
+<OPTION VALUE="minor">minor
+<OPTION VALUE="trivial">trivial
+<OPTION VALUE="enhancement">enhancement
+</SELECT>
 </td>
 </tr>
 </table>
@@ -206,7 +277,7 @@ will be marked with one of the following resolutions.
 
 <ul>
 <li><b>FIXED</b> - A fix for this bug is checked into the tree and tested.
-<li><b>INVALID</b> - The problem described is not a bug 
+<li><b>INVALID</b> - The problem described is not a bug. 
 <li><b>WONTFIX</b> - The problem described is a bug which will never be fixed.
 <li><b>LATER</b> - The problem described is a bug which will not be fixed in this
 version of the product.
@@ -489,8 +560,6 @@ user with the proper permissions can edit these keywords. The following is a lis
 stored on this version of Bugzilla:
 };
 
-ConnectToDatabase();
-
 my $tableheader = qq{
 <p><table border="1" cellpadding="4" cellspacing="0">
 <tr bgcolor="#6666FF">
@@ -540,7 +609,6 @@ while (MoreSQLData()) {
 
 print "</table><p>\n";
 
-quietly_check_login();
 
 if (UserInGroup("editkeywords")) {
     print qq{<p><a href="editkeywords.cgi">Edit keywords</a>\n};
@@ -566,14 +634,14 @@ print qq{
 
 <br>
 
-<p>Module options are where you select what program, module and version the bugs you want to 
-find describe. Selecting one or more of the programs, versions, components, or milestones will limit your search.
+<p>Module options are where you select what product, module and version the bugs you want to 
+find describe. Selecting one or more of the products, versions, components, or milestones will limit your search.
 
 <p><a name="product"></a>
 <h4>Products</h4> 
 
 
-<p>Although all subprojects within the Mozilla project are similiar, there are several seperate
+<p>Although all subprojects within the Mozilla project are similar, there are several seperate
 products being developed. Each product has its own components.
 
 };
@@ -585,41 +653,41 @@ $line_count = 0;
 $max_table_size = 50;
 my @products;
 
-$tableheader = 	qq{ <p><table border=0><tr><td>
-	<table border="1" width="100%" cellpadding="4" cellspacing="0">
-	<tr bgcolor="#6666FF">
-	<th align="left">Product</th>
-	<th align="left">Description</th></tr> };
+$tableheader =         qq{ <p><table border=0><tr><td>
+        <table border="1" width="100%" cellpadding="4" cellspacing="0">
+        <tr bgcolor="#6666FF">
+        <th align="left">Product</th>
+        <th align="left">Description</th></tr> };
 
 
 print qq{
-	$tableheader
+        $tableheader
 };
 
 
 SendSQL("SELECT product,description FROM products ORDER BY product");
-	while (MoreSQLData()) {
+        while (MoreSQLData()) {
 
-	my ($product, $productdesc) = FetchSQLData();
-	next if (Param("usebuggroups") && GroupExists($product) && !UserInGroup($product));
-	push (@products, $product);
+        my ($product, $productdesc) = FetchSQLData();
+        next if (Param("usebuggroups") && GroupExists($product) && !UserInGroup($product));
+        push (@products, $product);
 
-	$line_count++;
-	if ($line_count > $max_table_size) {
-			print qq{
-			</table>
-			$tableheader
-		};
-	  	$line_count=1;
-	}
+        $line_count++;
+        if ($line_count > $max_table_size) {
+                        print qq{
+                        </table>
+                        $tableheader
+                };
+                  $line_count=1;
+        }
 
-	print qq{ <tr><th>$product</th><td>$productdesc</td></tr> };
+        print qq{ <tr><th>$product</th><td>$productdesc</td></tr> };
 
 
 }
 
 
-print qq{ 	
+print qq{         
 
 </table></td></tr></table> };
 
@@ -643,41 +711,41 @@ entered instead (milestones explained below).
  
 $line_count = 0;
 $tableheader = qq{ 
-	<p>
-	<table border="1" width="100%" cellpadding="4" cellspacing="0">
-	<tr bgcolor="#6666FF">
-	<th align="left">Component</th>
-	<th align="left">Product</th>
-	<th align="left">Description</th></tr>
+        <p>
+        <table border="1" width="100%" cellpadding="4" cellspacing="0">
+        <tr bgcolor="#6666FF">
+        <th align="left">Component</th>
+        <th align="left">Product</th>
+        <th align="left">Description</th></tr>
 };
 
-print qq{ 	
+print qq{         
 <p><a name="component"></a>
 <h4>Component</h4>
 <p>Each product has components, against which bugs can be filed. Components are parts of 
 the product, and are assigned to a module owner. The following lists 
 components and their associated products:
-		$tableheader
+                $tableheader
 };
 foreach $product (@products)
 {
 
-	SendSQL("SELECT value,description FROM components WHERE program=" . SqlQuote($product) . " ORDER BY value");
+        SendSQL("SELECT value,description FROM components WHERE program=" . SqlQuote($product) . " ORDER BY value");
 
-	while (MoreSQLData()) {
+        while (MoreSQLData()) {
 
-		my ($component, $compdesc) = FetchSQLData();
+                my ($component, $compdesc) = FetchSQLData();
 
-		$line_count++;
-		if ($line_count > $max_table_size) {
-				print qq{
-				</table>
-				$tableheader
-			};
-			$line_count=0;
-		}
-		print qq{<tr><th>$component</th><td>$product</td><td>$compdesc</td></tr>};
-	}
+                $line_count++;
+                if ($line_count > $max_table_size) {
+                                print qq{
+                                </table>
+                                $tableheader
+                        };
+                        $line_count=0;
+                }
+                print qq{<tr><th>$component</th><td>$product</td><td>$compdesc</td></tr>};
+        }
 
 }
 
@@ -885,9 +953,9 @@ queries, but it's not the easiest thing to learn (or explain).
 <OPTION VALUE="changedto">changed to
 <OPTION VALUE="changedby">changed by
 </SELECT><INPUT NAME="value0-0-0" VALUE=""><INPUT TYPE="button" VALUE="Or" ><INPUT TYPE="button" VALUE="And" 
-	NAME="cmd-add0-1-0"></td></tr>
+        NAME="cmd-add0-1-0"></td></tr>
     
-		<tr><td>&nbsp;</td><td align="center">
+                <tr><td>&nbsp;</td><td align="center">
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
         <INPUT TYPE="button" VALUE="Add another boolean chart" NAME="cmd-add1-0-0">
        
@@ -1013,9 +1081,9 @@ Field 3: What the search term is<br>
 <OPTION VALUE="changedto">changed to
 <OPTION VALUE="changedby">changed by
 </SELECT><INPUT NAME="value0-0-1" VALUE=""><INPUT TYPE="button" VALUE="Or" NAME="cmd-add0-0-2" ONCLICK="document.forms[0].action='query.cgi#chart' ; document.forms[0].method='POST' ; return 1;"><INPUT TYPE="button" VALUE="And" 
-	NAME="cmd-add0-1-0" ONCLICK="document.forms[0].action='query.cgi#chart' ; document.forms[0].method='POST' ; return 1;"></td></tr>
+        NAME="cmd-add0-1-0" ONCLICK="document.forms[0].action='query.cgi#chart' ; document.forms[0].method='POST' ; return 1;"></td></tr>
     
-		<tr><td>&nbsp;</td><td align="center">
+                <tr><td>&nbsp;</td><td align="center">
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
         <INPUT TYPE="button" VALUE="Add another boolean chart" NAME="cmd-add1-0-0" ONCLICK="document.forms[0].action='query.cgi#chart' ; document.forms[0].method='POST' ; return 1;">
        
@@ -1143,9 +1211,9 @@ the query will be anything that matches either of the terms.
 <OPTION VALUE="changedto">changed to
 <OPTION VALUE="changedby">changed by
 </SELECT><INPUT NAME="value0-1-0" VALUE=""><INPUT TYPE="button" VALUE="Or" NAME="cmd-add0-1-1" ONCLICK="document.forms[0].action='query.cgi#chart' ; document.forms[0].method='POST' ; return 1;"><INPUT TYPE="button" VALUE="And" 
-	NAME="cmd-add0-2-0" ONCLICK="document.forms[0].action='query.cgi#chart' ; document.forms[0].method='POST' ; return 1;"></td></tr>
+        NAME="cmd-add0-2-0" ONCLICK="document.forms[0].action='query.cgi#chart' ; document.forms[0].method='POST' ; return 1;"></td></tr>
     
-		<tr><td>&nbsp;</td><td align="center">
+                <tr><td>&nbsp;</td><td align="center">
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
         <INPUT TYPE="button" VALUE="Add another boolean chart" NAME="cmd-add1-0-0" ONCLICK="document.forms[0].action='query.cgi#chart' ; document.forms[0].method='POST' ; return 1;">
        
@@ -1226,12 +1294,12 @@ can think of the lines of "Or" as having parenthesis around them.
 <OPTION VALUE="changedto">changed to
 <OPTION VALUE="changedby">changed by
 </SELECT><INPUT NAME="value0-0-0" VALUE=""><INPUT TYPE="button" VALUE="Or" NAME="cmd-add0-0-1" ONCLICK="document.forms[0].action='query.cgi#chart' ; document.forms[0].method='POST' ; return 1;"><INPUT TYPE="button" VALUE="And" 
-	NAME="cmd-add0-1-0" ONCLICK="document.forms[0].action='query.cgi#chart' ; document.forms[0].method='POST' ; return 1;"></td></tr>
+        NAME="cmd-add0-1-0" ONCLICK="document.forms[0].action='query.cgi#chart' ; document.forms[0].method='POST' ; return 1;"></td></tr>
     
-		<tr>
-		<td colspan="2"><hr></td>
-		</tr><tr><td>&nbsp;</td><td>
-		<SELECT NAME="field1-0-0"><OPTION SELECTED VALUE="noop">---
+                <tr>
+                <td colspan="2"><hr></td>
+                </tr><tr><td>&nbsp;</td><td>
+                <SELECT NAME="field1-0-0"><OPTION SELECTED VALUE="noop">---
 <OPTION VALUE="groupset">groupset
 <OPTION VALUE="bug_id">Bug #
 <OPTION VALUE="short_desc">Summary
@@ -1280,9 +1348,9 @@ can think of the lines of "Or" as having parenthesis around them.
 <OPTION VALUE="changedto">changed to
 <OPTION VALUE="changedby">changed by
 </SELECT><INPUT NAME="value1-0-0" VALUE=""><INPUT TYPE="button" VALUE="Or" NAME="cmd-add1-0-1" ONCLICK="document.forms[0].action='query.cgi#chart' ; document.forms[0].method='POST' ; return 1;"><INPUT TYPE="button" VALUE="And" 
-	NAME="cmd-add1-1-0" ONCLICK="document.forms[0].action='query.cgi#chart' ; document.forms[0].method='POST' ; return 1;"></td></tr>
+        NAME="cmd-add1-1-0" ONCLICK="document.forms[0].action='query.cgi#chart' ; document.forms[0].method='POST' ; return 1;"></td></tr>
     
-		<tr><td>&nbsp;</td><td align="center">
+                <tr><td>&nbsp;</td><td align="center">
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
         <INPUT TYPE="button" VALUE="Add another boolean chart" NAME="cmd-add2-0-0" ONCLICK="document.forms[0].action='query.cgi#chart' ; document.forms[0].method='POST' ; return 1;">
        
diff --git a/quicksearch.html b/quicksearch.html
index 900180065..1b1ecb1a6 100644
--- a/quicksearch.html
+++ b/quicksearch.html
@@ -1,90 +1,95 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
+  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
   <title>Bugzilla QuickSearch</title>
 </head>
 
 <body bgcolor="#ffffff">
 
+<p>
 <small>If you are already familiar with the original 
 <a href="query.cgi">Bugzilla Query Form</a>, 
 you may prefer <a href="quicksearchhack.html">this form</a>.
 </small>
+</p>
 
-<p>
-<script src="localconfig.js"></script>
-<script src="quicksearch.js"></script>
+<script src="localconfig.js" type="text/javascript"></script>
+<script src="quicksearch.js" type="text/javascript"></script>
 
 <h1>Bugzilla QuickSearch</h1>
 
+<p>
 Type in one or more words (or word fragments) to search for:
-
-<!-- The name of the form must be "f" (used in "quicksearch.js"). -->
+</p>
 
 <form name="f" action="show_bug.cgi" method="get"
-      onsubmit="QuickSearch(); return false;">
+      onsubmit="QuickSearch(f.id.value); return false;">
   <table>
     <tr>
-      <td><input type="text" size="40" name="id"/></td>
-      <td align=left><input type="submit" value="Search"/></td>
+      <td><input type="text" size="40" name="id"></td>
+      <td align="left"><input type="submit" value="Search"></td>
       <!-- <td><a href="javascript:QuickSearch_Help();">[Help]</a></td> -->
     </tr>
   </table>
 </form>
 
-<script>
+<script type="text/javascript">
 <!--
 document.forms['f'].id.focus();
 //-->
 </script>
 
-<p>
 <h2>Getting Started</h2>
 
 <ul>
 <li> This is <b>case-insensitive</b> search.
      <ul>
      <li> &nbsp;<tt>table</tt>&nbsp;, &nbsp;<tt>Table</tt>&nbsp; 
-     and &nbsp;<tt>TABLE</tt>&nbsp; are all the same.
+     and &nbsp;<tt>TABLE</tt>&nbsp; are all the same.</li>
      </ul>
+</li>
 <li> This is <b>all words as substrings</b> search.<br>
      Therefore you should <b>use stems</b> to get better results: 
      <ul> 
      <li> Use <tt>localiz</tt> instead of <tt>localize</tt> or 
-     <tt>localization</tt>.
+     <tt>localization</tt>.</li>
      <li> Use <tt>bookmark</tt> instead of <tt>bookmarks</tt> or 
-     <tt>bookmarking</tt>.
+     <tt>bookmarking</tt>.</li>
      </ul>
+</li>
 </ul>
 
-<a name="features"/>
-<h2>Features</h2>
+<h2><a name="features">Features</a></h2>
 
 <ul>
 <li> Boolean operations: ``<tt>-foo</tt>''(NOT), ``<tt>foo bar</tt>''(AND), 
      ``<tt>foo|bar</tt>''(OR).
      <ul>
      <li> <b>NOT</b>: Use &nbsp;<tt><b>-</b><i>foo</i></tt>&nbsp; to exclude bugs 
-          with &nbsp;<tt><i>foo</i></tt>&nbsp; in the summary.
-     <li> <b>AND</b>: Space-separated words are treated as a conjunction.
-     <li> <b>OR</b>: Within a word, "|"-separated parts denote alternatives. 
-     <li> Besides "|", a comma can be used to separate alternatives.
-     <li> OR has higher precedence than AND; AND is the top level operation
+          with &nbsp;<tt><i>foo</i></tt>&nbsp; in the summary.</li>
+     <li> <b>AND</b>: Space-separated words are treated as a conjunction.</li>
+     <li> <b>OR</b>: Within a word, "|"-separated parts denote alternatives. </li>
+     <li> Besides "|", a comma can be used to separate alternatives.</li>
+     <li> OR has higher precedence than AND; AND is the top level operation</li>
      </ul>
      <i>Example:</i> &nbsp;<tt>url,location bar,field -focus</tt>&nbsp; 
      means
-     <nobr>(<tt>url</tt> OR <tt>location</tt>) AND (<tt>bar</tt> OR <tt>field</tt>) AND (NOT <tt>focus</tt>)</nobr>
-     <p>
-<li> Use &nbsp;<tt>+foo</tt>&nbsp; to search for bugs where the <b>summary</b> contains &nbsp;<tt>foo</tt>&nbsp; as a <b>substring</b>.<br>
+     (<tt>url</tt> OR <tt>location</tt>) AND (<tt>bar</tt> OR <tt>field</tt>) AND (NOT <tt>focus</tt>)
+<p>
+</li>
+<li>Use &nbsp;<tt>+foo</tt>&nbsp; to search for bugs where the <b>summary</b> contains &nbsp;<tt>foo</tt>&nbsp; as a <b>substring</b>.<br>
      Use &nbsp;<tt>#foo</tt>&nbsp; to search for bugs where the <b>summary</b> contains the <b>word</b> &nbsp;<tt>foo</tt>&nbsp; 
      <ul>
-     <li> &nbsp;<tt>+brow</tt>&nbsp; does not find all bugs in the &nbsp;<tt>Browser</tt>&nbsp; product
-     <li> &nbsp;<tt>#title</tt>&nbsp; does not find bugs bugs with &nbsp;<tt>titlebar</tt>&nbsp; or &nbsp;<tt>titled</tt>&nbsp; 
+     <li> &nbsp;<tt>+brow</tt>&nbsp; does not find all bugs in the &nbsp;<tt>Browser</tt>&nbsp; product</li>
+     <li> &nbsp;<tt>#title</tt>&nbsp; does not find bugs bugs with &nbsp;<tt>titlebar</tt>&nbsp; or &nbsp;<tt>titled</tt>&nbsp;</li>
      </ul>
      Phrases with special chars (space, comma, +, -, #, ...) can be <b>quoted</b>:
      <ul>
-     <li> &nbsp;<tt>"lock icon"</tt>&nbsp;
+     <li> &nbsp;<tt>"lock icon"</tt>&nbsp;</li>
      </ul>
 <p>
+</li>
 <li> <b>Open vs. Resolved Bugs</b>:<br>
      By default, only open (i.e. unresolved) bugs are shown.
      Use &nbsp;<tt>+DUP</tt>&nbsp; as first word in your query 
@@ -94,10 +99,10 @@ document.forms['f'].id.focus();
      regardless of status or resolution. Searching for duplicates is
      recommended if you can't find an open bug directly.
      <ul>
-     <li> &nbsp;<tt>+DUP,FIXED table border</tt>&nbsp;
-     <li> &nbsp;<tt>ALL mouse wheel</tt>&nbsp;
+     <li> &nbsp;<tt>+DUP,FIXED table border</tt>&nbsp;</li>
+     <li> &nbsp;<tt>ALL mouse wheel</tt>&nbsp;</li>
      </ul>
-<p>
+<p></li>
 <li> <b>Focus the Search with Products &amp; Components</b>:<br>
      To search for bugs in product "Foo Bar" only, add 
      &nbsp;<tt>:foo</tt>&nbsp; or &nbsp;<tt>:bar</tt>&nbsp; or both
@@ -105,6 +110,7 @@ document.forms['f'].id.focus();
      You can do this with any substring of a 
      <a href="describecomponents.cgi">product or component</a> 
      to focus the search.
+</li>
 </ul>
 
 <h2>More Tips</h2>
@@ -112,19 +118,21 @@ document.forms['f'].id.focus();
 <ul>
 <li> You can also use this tool to <b>lookup</b> a bug by its number.
      <ul>
-     <li> &nbsp;<tt>12345</tt>&nbsp;
+     <li> &nbsp;<tt>12345</tt>&nbsp;</li>
      </ul>
+</li>
 <li> A comma-separated list of bug numbers gives you a list of these bugs.
      <ul>
-     <li> &nbsp;<tt>12345,23456,34567</tt>&nbsp;
+     <li> &nbsp;<tt>12345,23456,34567</tt>&nbsp;</li>
      </ul>
+</li>
 </ul>
 
 <p>
 By default, the following fields are searched: Summary, Keywords, Product, 
 Component, Status Whiteboard. If a word looks like a part of a URL, that field
 is included in the search, too.
-<p>
+</p>
 <!--
 <small>For further details, see 
 <a href="http://bugzilla.mozilla.org/show_bug.cgi?id=61561">Bug 61561</a> and 
@@ -133,14 +141,11 @@ is included in the search, too.
   -->
 <hr>
 
+<p>
 Use the powerful 
 <a href="query.cgi">Bugzilla Query Form</a>
 for advanced queries.
+</p>
 
 </body>
 </html>
-
-
-
-
-
diff --git a/quicksearch.js b/quicksearch.js
index 7778d3598..ff43a5f1d 100644
--- a/quicksearch.js
+++ b/quicksearch.js
@@ -46,8 +46,11 @@ function do_shift(l) {
 }
 
 function go_to (url) {
-  document.location.href = url;
-  //window.open(url, "other" );
+    if ( typeof sidebar != "undefined" && sidebar == 1 ) {
+        load_relative_url(url);
+    } else {
+        document.location.href = url;
+    }
 }
 
 function map(l, f) {
@@ -600,8 +603,7 @@ function unique_id () {
     return (new Date()).getTime();
 }
 
-function ShowURL(mode) {
-    var input = document.f.id.value;
+function ShowURL(mode,input) {
     var searchURL = make_query_URL(bugzilla+"buglist.cgi", input, false);
     if (searchURL != no_result) {
         var pieces = searchURL.replace(/[\?]/g,"\n?").replace(/[\&]/g,"\n&");
@@ -684,7 +686,7 @@ function Search(url, input, searchLong) {
 // derived from http://www.cs.hmc.edu/~jruderma/s/bugz.html
 
 // QuickSearch combines lookup-by-bug-number and search
-// in a single textbox. It's name must be document.f.id .
+// in a single textbox. 
 //
 // type nothing:
 //    --> go to bugzilla front page
@@ -696,10 +698,8 @@ function Search(url, input, searchLong) {
 //    --> search summary, product, component, keywords, status whiteboard
 //        (and URL if it's an IP address, a host.name, or an absolute://URL)
 
-function QuickSearch ()
+function QuickSearch (input)
 {
-    var input = document.f.id.value;
-
     //remove leading and trailing whitespace
     input = input.replace(/^[\s]+/,"").replace(/[\s]+$/,"");
 
@@ -726,9 +726,7 @@ function QuickSearch ()
     return;
 }
 
-function LoadQuery() {
-    var input = document.f.id.value;
-
+function LoadQuery(input) {
     //remove leading and trailing whitespace
     input = input.replace(/^[\s]+/,"").replace(/[\s]+$/,"");
 
diff --git a/quicksearchhack.html b/quicksearchhack.html
index 7d788f626..17c21e955 100644
--- a/quicksearchhack.html
+++ b/quicksearchhack.html
@@ -1,33 +1,35 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
+  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
   <title>Bugzilla QuickSearch (for Hackers)</title>
 </head>
 
 <body bgcolor="#ffffff">
 
-<script src="localconfig.js"></script>
-<script src="quicksearch.js"></script>
+<script src="localconfig.js" type="text/javascript"></script>
+<script src="quicksearch.js" type="text/javascript"></script>
 
 <h1>Bugzilla QuickSearch (for Hackers)</h1>
 
+<p>
 Type in one or more words (or word fragments) to search for:
-
-<!-- The name of the form must be "f" (used in "quicksearch.js"). -->
+</p>
 
 <form name="f" action="show_bug.cgi" method="get"
-      onsubmit="QuickSearch(); return false;">
+      onsubmit="QuickSearch(f.id.value); return false;">
   <table>
     <tr>
-      <td><input type="text" size="40" name="id"/></td>
-      <td align=left><input type="submit" name="run"  value="Search"/></td>
-      <td align=left><input type="button" name="load" value="Load Query"
-                      onclick="LoadQuery();" />
+      <td><input type="text" size="40" name="id"></td>
+      <td align="left"><input type="submit" name="run"  value="Search"></td>
+      <td align="left"><input type="button" name="load" value="Load Query"
+                      onclick="LoadQuery(f.id.value);">
       </td>
     </tr>
   </table>
 </form>
 
-<script>
+<script type="text/javascript">
 <!--
 document.forms['f'].id.focus();
 //-->
@@ -39,6 +41,7 @@ words are separated by spaces.
 By default, the following fields are relevant: Summary, Keywords, 
 Product, Component, Status Whiteboard. If a word looks like a part of a
 URL, that field is included in the search, too.
+</p>
 <p>
 The generic format for a ``word'' is
 &nbsp;<tt>field1,...,fieldN:value1,...,valueM</tt>&nbsp;.
@@ -52,12 +55,13 @@ If only &nbsp;<tt>value1,...,valueM</tt>&nbsp; is given,
 the prefix (roughly) defaults to &nbsp;<tt>summary,keywords,product,component,statuswhiteboard:</tt>&nbsp; as noted above.
 You can use &nbsp;<tt>-<i>word</i></tt>&nbsp; to express the logical negation
 of &nbsp;<tt><i>word</i></tt>.&nbsp;
+</p>
 <p>
 Here is a complete listing of available fields (the Shortcut column is just 
 for access speed):
-<p>
+</p>
 
-<table border=1>
+<table border="1">
 <thead>
 <tr>
   <td><b>Searched by default</b></td>
@@ -72,7 +76,7 @@ for access speed):
 
 <tr>
   <td>&nbsp;</td>
-  <td rowspan=2><tt><nobr>UNCO,NEW,...,CLOS,</nobr><br><nobr>FIX,DUP,...</nobr> <i><nobr>(as first word)</nobr></i></tt></td>
+  <td rowspan="2"><tt>UNCO,NEW,...,CLOS,<br>FIX,DUP,...<i>(as first word)</i></tt></td>
   <td><tt>status</tt></td>
   <td>&nbsp;</td>
   <td><a href="bug_status.html">Status</a> 
@@ -150,7 +154,7 @@ for access speed):
 
 <tr>
   <td><i>yes</i></td>
-  <td rowspan=2><b>:</b><i>area</i></td>
+  <td rowspan="2"><b>:</b><i>area</i></td>
   <td><tt>product</tt></td>
   <td><tt>prod</tt></td>
   <td>Product (enum)</td>
@@ -243,8 +247,8 @@ for access speed):
 
 <p>
 Examples for some useful abbreviations:
-<p>
-<table border=1>
+</p>
+<table border="1">
 <thead>
 <tr>
   <td><b>Syntax</b></td>
@@ -294,7 +298,7 @@ Examples for some useful abbreviations:
 </tr>
 <tr>
   <td><tt>blo,cri,maj</tt></td>
-  <td><i>severe bugs</td>
+  <td><i>severe bugs</i></td>
 </tr>
 <tr>
   <td><tt>enh</tt></td>
@@ -305,12 +309,12 @@ Examples for some useful abbreviations:
   <td><b>priority:</b><i>level</i></td>
 </tr>
 <tr>
-  <td><tt>p1<tt></td>
+  <td><tt>p1</tt></td>
   <td><i>very high-priority bugs</i></td>
 </tr>
 <tr>
   <td><tt>p1-2</tt></td>
-  <td><i>high-priority bugs</td>
+  <td><i>high-priority bugs</i></td>
 </tr>
 <tr>
   <td><b>@</b><i>owner</i></td>
@@ -346,6 +350,7 @@ Examples for some useful abbreviations:
 More information can be found in the
 <a href="quicksearch.html#features">&quot;Features&quot;</a> section 
 on the <a href="quicksearch.html">introductory page</a>.
+</p>
 
 </body>
 </html>
diff --git a/quips.cgi b/quips.cgi
index 6cb889366..7441f51fc 100755
--- a/quips.cgi
+++ b/quips.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -19,47 +19,61 @@
 # Rights Reserved.
 #
 # Contributor(s): Owen Taylor <otaylor@redhat.com>
+#                 Gervase Markham <gerv@gerv.net>
 
 use diagnostics;
 use strict;
-use vars ( %::FORM );
 
-require "CGI.pl";
-
-print "Content-type: text/html\n\n";
+use vars qw(
+  %FORM
+  $template
+  $vars
+);
 
-PutHeader("Quips for the impatient", "Add your own clever headline");
+use lib qw(.);
 
-print qq{
-The buglist picks a random quip for the headline, and 
-you can extend the quip list.  Type in something clever or
-funny or boring and bonk on the button.
-
-<FORM METHOD=POST ACTION="new_comment.cgi">
-<INPUT SIZE=80 NAME="comment"><BR>
-<INPUT TYPE="submit" VALUE="Add This Quip">
-</FORM>
-};
+require "CGI.pl";
 
-if (exists $::FORM{show_quips}) {
+# Even though quips aren't (yet) in the database, we need to check
+# logins for the footer
+ConnectToDatabase();
+quietly_check_login();
 
-    print qq{
-<H2>Existing headlines</H2>
-};
+my $action = $::FORM{'action'} || "";
 
+if ($action eq "show") {
+    # Read in the entire quip list
     if (open (COMMENTS, "<data/comments")) {
-        while (<COMMENTS>) {
-            print html_quote($_),"<br>\n";
-        }
+        my @quips;
+        push (@quips, $_) while (<COMMENTS>);        
         close COMMENTS;
+        
+        $vars->{'quips'} = \@quips;
+        $vars->{'show_quips'} = 1;
+    }
+}
+
+if ($action eq "add") {
+    # Add the quip 
+    my $comment = $::FORM{"quip"};
+    if (!$comment) {
+        DisplayError("Please enter a quip in the text field.");
+        exit();
+    }
+    
+    if ($comment =~ m/</) {
+        DisplayError("Sorry - for security reasons, support for HTML tags has 
+                      been turned off in quips.");
+        exit();
     }
-    print "<P>";
-} else {
-    print qq{
-For the impatient, you can 
-<A HREF="quips.cgi?show_quips=yes">view the whole quip list</A>.
-};
-    print "<P>";
+
+    open(COMMENTS, ">>data/comments");
+    print COMMENTS $comment . "\n";
+    close(COMMENTS);
+
+    $vars->{'added_quip'} = $comment;
 }
 
-PutFooter();
+print "Content-type: text/html\n\n";
+$template->process("list/quips.html.tmpl", $vars)
+  || ThrowTemplateError($template->error());
diff --git a/relogin.cgi b/relogin.cgi
index a179bafb7..d3023c850 100755
--- a/relogin.cgi
+++ b/relogin.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -19,32 +19,56 @@
 # Rights Reserved.
 #
 # Contributor(s): Terry Weissman <terry@mozilla.org>
+#                 Gervase Markham <gerv@gerv.net>
 
 use diagnostics;
 use strict;
 
 use vars %::COOKIE;
+use vars qw($template $vars);
+
+use lib qw(.);
 
 require "CGI.pl";
 
+# We don't want to remove a random logincookie from the db, so
+# call quietly_check_login. If we're logged in after this, then
+# the logincookie must be correct
 
-print "Set-Cookie: Bugzilla_login= ; path=/; expires=Sun, 30-Jun-80 00:00:00 GMT
-Set-Cookie: Bugzilla_logincookie= ; path=/; expires=Sun, 30-Jun-80 00:00:00 GMT
-Set-Cookie: Bugzilla_password= ; path=/; expires=Sun, 30-Jun-80 00:00:00 GMT
-Content-type: text/html
+ConnectToDatabase();
+quietly_check_login();
 
-";
-PutHeader ("Relogin");
+if ($::userid) {
+    # Even though we know the userid must match, we still check it in the
+    # SQL as a sanity check, since there is no locking here, and if
+    # the user logged out from two machines simulataniously, while someone
+    # else logged in and got the same cookie, we could be logging the
+    # other user out here. Yes, this is very very very unlikely, but why
+    # take chances? - bbaetz
+    SendSQL("DELETE FROM logincookies WHERE cookie = " .
+            SqlQuote($::COOKIE{"Bugzilla_logincookie"}) .
+            "AND userid = $::userid");
+}
 
-print "<B>Your login has been forgotten</B>.</P>
-The cookie that was remembering your login is now gone.  The next time you
-do an action that requires a login, you will be prompted for it.
-<p>
+my $cookiepath = Param("cookiepath");
+print "Set-Cookie: Bugzilla_login= ; path=$cookiepath; expires=Sun, 30-Jun-80 00:00:00 GMT
+Set-Cookie: Bugzilla_logincookie= ; path=$cookiepath; expires=Sun, 30-Jun-80 00:00:00 GMT
 ";
 
 delete $::COOKIE{"Bugzilla_login"};
 
-PutFooter();
+    $vars->{'title'} = "Logged Out";
+    $vars->{'message'} = "<b>Your login has been forgotten</b>.
+                          The cookie that was remembering your login is 
+                          now gone. You will be prompted for a login the 
+                          next time it is required.";
+    $vars->{'url'} = "query.cgi?GoAheadAndLogIn=1";
+    $vars->{'link'} = "Log in again here";
+    $vars->{'user'} = {};
+    
+    print "Content-Type: text/html\n\n";
+    $template->process("global/message.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
 
 exit;
 
diff --git a/reports.cgi b/reports.cgi
index c76a411f7..2d91ebc61 100755
--- a/reports.cgi
+++ b/reports.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -41,6 +41,8 @@
 use diagnostics;
 use strict;
 
+use lib qw(.);
+
 eval "use GD";
 my $use_gd = $@ ? 0 : 1;
 eval "use Chart::Lines";
@@ -122,6 +124,10 @@ if (! defined $FORM{'product'}) {
       || DisplayError("You entered an invalid output type.") 
       && exit;
 
+    # We've checked that the product exists, and that the user can see it
+    # This means that is OK to detaint
+    trick_taint($FORM{'product'});
+
     # Output appropriate HTTP response headers
     print "Content-type: text/html\n";
     # Changing attachment to inline to resolve 46897 - zach@zachlipton.com
@@ -246,6 +252,7 @@ FIN
 </td>
 </tr>
 </table>
+</center>
 </form>
 <p>
 FIN
@@ -268,32 +275,21 @@ FIN
     my $query;
     $query = <<FIN;
 select 
-    bugs.bug_id, bugs.assigned_to, bugs.bug_severity,
-    bugs.bug_status, bugs.product, 
+    bugs.bug_id,
+    bugs.bug_status,
     assign.login_name,
-    report.login_name,
     unix_timestamp(date_format(bugs.creation_ts, '%Y-%m-%d %h:%m:%s'))
 
 from   bugs,
-       profiles assign,
-       profiles report,
-       versions projector
+       profiles assign
 where  bugs.assigned_to = assign.userid
-and    bugs.reporter = report.userid
 FIN
 
     if ($FORM{'product'} ne "-All-" ) {
         $query .= "and    bugs.product=".SqlQuote($FORM{'product'});
     }
 
-    $query .= <<FIN;
-and      
-    ( 
-    bugs.bug_status = 'NEW' or 
-    bugs.bug_status = 'ASSIGNED' or 
-    bugs.bug_status = 'REOPENED'
-    )
-FIN
+    $query .= "AND bugs.bug_status IN ('NEW', 'ASSIGNED', 'REOPENED')";
 # End build up $query string
 
     print "<font color=purple><tt>$query</tt></font><p>\n" 
@@ -318,7 +314,7 @@ FIN
     #############################
 
     my $week = 60 * 60 * 24 * 7;
-    while (my ($bid, $a, $sev, $st, $prod, $who, $rep, $ts) = FetchSQLData()) {
+    while (my ($bid, $st, $who, $ts) = FetchSQLData()) {
         next if (exists $bugs_lookup{$bid});
         
         $bugs_lookup{$bid} ++;
@@ -339,7 +335,9 @@ FIN
                 push @cdata, $_;
             }
             close COMMENTS;
-            $quip = "<i>" . $cdata[int(rand($#cdata + 1))] . "</i>";
+            if(@cdata) {
+                $quip = "<i>" . $cdata[int(rand(scalar(@cdata)))] . "</i>";
+            }
         }
     } 
 
@@ -485,9 +483,9 @@ sub daily_stats_filename {
 }
 
 sub show_chart {
-	# if we don't have the graphic mouldes don't even try to go
-	# here. Should probably return some decent error message.
-	return unless $use_gd;
+    # if we don't have the graphic mouldes don't even try to go
+    # here. Should probably return some decent error message.
+    return unless $use_gd;
 
     if (! $FORM{datasets}) {
         die_politely("You didn't select any datasets to plot");
@@ -525,6 +523,19 @@ sub chart_image_type {
 sub chart_image_name {
     my ($data_file, $type) = @_;
 
+    # This routine generates a filename from the requested fields. The problem
+    # is that we have to check the safety of doing this. We can't just require
+    # that the fields exist, because what stats were collected could change
+    # over time (eg by changing the resolutions available)
+    # Instead, just require that each field name consists only of letters
+    # and number
+
+    if ($FORM{'datasets'} !~ m/[A-Za-z0-9:]/) {
+        die "Invalid datasets $FORM{'datasets'}";
+    }
+    # Since we pass the tests, consider it OK
+    trick_taint($FORM{'datasets'});
+
     # Cache charts by generating a unique filename based on what they
     # show. Charts should be deleted by collectstats.pl nightly.
     my $id = join ("_", split (":", $FORM{datasets}));
diff --git a/robots.txt b/robots.txt
index c364fe62e..0f823cb24 100644
--- a/robots.txt
+++ b/robots.txt
@@ -1,3 +1,3 @@
 User-agent: *
-Allow: /index.html
+Allow: /index.cgi
 Disallow: /
diff --git a/runtests.sh b/runtests.sh
index 7b67b1761..f19134f90 100755
--- a/runtests.sh
+++ b/runtests.sh
@@ -4,7 +4,7 @@ TEST_VERBOSE=0
 PART1='use Test::Harness qw(&runtests $verbose); $verbose='
 PART2='; runtests @ARGV;'
 for f in $*; do
-  if [ $f == "--verbose" ] ; then
+  if [ "$f" = "--verbose" ] ; then
     TEST_VERBOSE=1
   fi
 done
diff --git a/sanitycheck.cgi b/sanitycheck.cgi
index c8f628e58..80b88d5fd 100755
--- a/sanitycheck.cgi
+++ b/sanitycheck.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -19,10 +19,13 @@
 # Rights Reserved.
 #
 # Contributor(s): Terry Weissman <terry@mozilla.org>
+#                 Matthew Tuck <matty@chariot.net.au>
 
 use diagnostics;
 use strict;
 
+use lib qw(.);
+
 require "CGI.pl";
 
 use vars %::FORM;
@@ -89,7 +92,8 @@ sub CrossCheck {
 
         Status("... from $t2.$f2");
         
-        SendSQL("SELECT DISTINCT $f2" . ($key2 ? ", $key2" : '') ." FROM $t2");
+        SendSQL("SELECT DISTINCT $f2" . ($key2 ? ", $key2" : '') ." FROM $t2 "
+                . "WHERE $f2 IS NOT NULL");
         while (MoreSQLData()) {
             my ($value, $key) = FetchSQLData();
             if (!$valid{$value} && !$exceptions{$value}) {
@@ -109,6 +113,7 @@ sub CrossCheck {
 }
 
     
+my @badbugs;
 
 
 my @row;
@@ -135,12 +140,36 @@ if (exists $::FORM{'rebuildvotecache'}) {
 
 print "OK, now running sanity checks.<P>\n";
 
+# This one goes first, because if this is wrong, then the below tests
+# will probably fail too
+
+# This isn't extensible. Thats OK; we're not adding any more enum fields
+Status("Checking for invalid enumeration values");
+foreach my $field (("bug_severity", "bug_status", "op_sys",
+                    "priority", "rep_platform", "resolution")) {
+    # undefined enum values in mysql are an empty string which equals 0
+    SendSQL("SELECT bug_id FROM bugs WHERE $field=0 ORDER BY bug_id");
+    my @invalid;
+    while (MoreSQLData()) {
+        push (@invalid, FetchOneColumn());
+    }
+    if (@invalid) {
+        Alert("Bug(s) found with invalid $field value: ".join(', ',@invalid));
+    }
+}
+
 CrossCheck("keyworddefs", "id",
            ["keywords", "keywordid"]);
 
 CrossCheck("fielddefs", "fieldid",
            ["bugs_activity", "fieldid"]);
-           
+
+CrossCheck("attachments", "attach_id",
+           ["attachstatuses", "attach_id"],
+           ["bugs_activity", "attach_id"]);
+
+CrossCheck("attachstatusdefs", "id",
+           ["attachstatuses", "statusid"]);
 
 CrossCheck("bugs", "bug_id",
            ["bugs_activity", "bug_id"],
@@ -150,7 +179,9 @@ CrossCheck("bugs", "bug_id",
            ["dependencies", "blocked"],
            ["dependencies", "dependson"],
            ["votes", "bug_id"],
-           ["keywords", "bug_id"]);
+           ["keywords", "bug_id"],
+           ["duplicates", "dupe_of", "dupe"],
+           ["duplicates", "dupe", "dupe_of"]);
 
 CrossCheck("profiles", "userid",
            ["bugs", "reporter", "bug_id"],
@@ -161,10 +192,21 @@ CrossCheck("profiles", "userid",
            ["cc", "who", "bug_id"],
            ["votes", "who", "bug_id"],
            ["longdescs", "who", "bug_id"],
+           ["logincookies", "userid"],
            ["namedqueries", "userid"],
+           ["watch", "watcher"],
+           ["watch", "watched"],
+           ["tokens", "userid"],
            ["components", "initialowner", "value"],
            ["components", "initialqacontact", "value", ["0"]]);
 
+CrossCheck("products", "product",
+           ["bugs", "product", "bug_id"],
+           ["components", "program", "value"],
+           ["milestones", "product", "value"],
+           ["versions", "program", "value"],
+           ["attachstatusdefs", "product", "name"]);
+
 
 Status("Checking groups");
 SendSQL("select bit from groups where bit != pow(2, round(log(bit) / log(2)))");
@@ -215,11 +257,28 @@ foreach my $ref (@checklist) {
     my ($product, $milestone) = (@$ref);
     SendSQL("SELECT count(*) FROM milestones WHERE product = " . SqlQuote($product) . " AND value = " . SqlQuote($milestone));
     if(FetchOneColumn() != 1) {
-        Alert("Bug(s) found with invalud product/milestone: $product/$milestone");
+        Alert("Bug(s) found with invalid product/milestone: $product/$milestone");
     }
 }
 
 
+Status("Checking default milestone/products");
+
+@checklist = ();
+SendSQL("select product, defaultmilestone from products");
+while (@row = FetchSQLData()) {
+    my @copy = @row;
+    push(@checklist, \@copy);
+}
+
+foreach my $ref (@checklist) {
+    my ($product, $milestone) = (@$ref);
+    SendSQL("SELECT count(*) FROM milestones WHERE product = " . SqlQuote($product) . " AND value = " . SqlQuote($milestone));
+    if(FetchOneColumn() != 1) {
+        Alert("Product(s) found with invalid default milestone: $product/$milestone");
+    }
+}
+
 
 Status("Checking components/products");
 
@@ -334,8 +393,9 @@ if (exists $::FORM{'rebuildkeywordcache'}) {
 }
 
 SendSQL("SELECT keywords.bug_id, keyworddefs.name " .
-        "FROM keywords, keyworddefs " .
+        "FROM keywords, keyworddefs, bugs " .
         "WHERE keyworddefs.id = keywords.keywordid " .
+        "  AND keywords.bug_id = bugs.bug_id " .
         "ORDER BY keywords.bug_id, keyworddefs.name");
 
 my $lastb;
@@ -355,24 +415,25 @@ while (1) {
     push(@list, $k);
 }
 
-my @fixlist;
+@badbugs = ();
+
 foreach my $b (keys(%keyword)) {
     if (!exists $realk{$b} || $realk{$b} ne $keyword{$b}) {
-        push(@fixlist, $b);
+        push(@badbugs, $b);
     }
 }
 foreach my $b (keys(%realk)) {
     if (!exists $keyword{$b}) {
-        push(@fixlist, $b);
+        push(@badbugs, $b);
     }
 }
-if (@fixlist) {
-    @fixlist = sort {$a <=> $b} @fixlist;
+if (@badbugs) {
+    @badbugs = sort {$a <=> $b} @badbugs;
     Alert("Bug(s) found with incorrect keyword cache: " .
-          join(', ', @fixlist));
+          join(', ', @badbugs));
     if (exists $::FORM{'rebuildkeywordcache'}) {
         Status("OK, now fixing keyword cache.");
-        foreach my $b (@fixlist) {
+        foreach my $b (@badbugs) {
             my $k = '';
             if (exists($realk{$b})) {
                 $k = $realk{$b};
@@ -381,15 +442,191 @@ if (@fixlist) {
                     SqlQuote($k) .
                     " WHERE bug_id = $b");
         }
-        SendSQL("UNLOCK TABLES");
         Status("Keyword cache fixed.");
     } else {
         print qq{<a href="sanitycheck.cgi?rebuildkeywordcache=1">Click here to rebuild the keyword cache</a><p>\n};
     }
 }
 
+if (exists $::FORM{'rebuildkeywordcache'}) {
+    SendSQL("UNLOCK TABLES");
+}
+
+###########################################################################
+# Perform duplicates table checks
+###########################################################################
+
+Status("Checking duplicates table");
+
+SendSQL("SELECT bugs.bug_id " .
+        "FROM bugs, duplicates " .
+        "WHERE bugs.resolution != 'DUPLICATE' " .
+        "  AND bugs.bug_id = duplicates.dupe " .
+        "ORDER BY bugs.bug_id");
+
+@badbugs = ();
+
+while (@row = FetchSQLData()) {
+    my ($id) = (@row);
+    push (@badbugs, $id);
+}
+
+if (@badbugs) {
+    Alert("Bug(s) found on duplicates table that are not marked duplicate: " .
+          join(', ', @badbugs));
+}
+
+SendSQL("SELECT bugs.bug_id " .
+        "FROM bugs LEFT JOIN duplicates ON bugs.bug_id = duplicates.dupe " .
+        "WHERE bugs.resolution = 'DUPLICATE' AND duplicates.dupe IS NULL " .
+        "ORDER BY bugs.bug_id");
+
+@badbugs = ();
+
+while (@row = FetchSQLData()) {
+    my ($id) = (@row);
+    push (@badbugs, $id);
+}
+
+if (@badbugs) {
+    Alert("Bug(s) found marked resolved duplicate and not on duplicates " .
+          "table: " . join(', ', @badbugs));
+}
+
+###########################################################################
+# Perform status/resolution checks
+###########################################################################
+
+Status("Checking statuses/resolutions");
+
+my @open_states = map(SqlQuote($_), OpenStates());
+my $open_states = join(', ', @open_states);
+
+@badbugs = ();
 
+SendSQL("SELECT   bug_id FROM bugs " .
+        "WHERE    bug_status IN ($open_states) " .
+        "AND      resolution != '' " .
+        "ORDER BY bug_id");
+
+while (@row = FetchSQLData()) {
+    my ($id) = (@row);
+    push(@badbugs, $id);
+}
+
+if (@badbugs > 0) {
+    Alert("Bugs with open status and a resolution: " .
+          join (", ", @badbugs));
+}
+
+@badbugs = ();
+
+SendSQL("SELECT   bug_id FROM bugs " .
+        "WHERE    bug_status NOT IN ($open_states) " .
+        "AND      resolution = '' " .
+        "ORDER BY bug_id");
+
+while (@row = FetchSQLData()) {
+    my ($id) = (@row);
+    push(@badbugs, $id);
+}
+
+if (@badbugs > 0) {
+    Alert("Bugs with non-open status and no resolution: " .
+          join (", ", @badbugs));
+}
+
+###########################################################################
+# Perform status/everconfirmed checks
+###########################################################################
+
+Status("Checking statuses/everconfirmed");
+
+@badbugs = ();
+
+SendSQL("SELECT   bug_id FROM bugs " .
+        "WHERE    bug_status = " . SqlQuote($::unconfirmedstate) . ' ' .
+        "AND      everconfirmed = 1 " .
+        "ORDER BY bug_id");
+
+while (@row = FetchSQLData()) {
+    my ($id) = (@row);
+    push(@badbugs, $id);
+}
+
+if (@badbugs > 0) {
+    Alert("Bugs that are UNCONFIRMED but have everconfirmed set: " .
+          join (", ", @badbugs));
+}
+
+@badbugs = ();
+
+SendSQL("SELECT   bug_id FROM bugs " .
+        "WHERE    bug_status IN ('NEW', 'ASSIGNED', 'REOPENED') " .
+        "AND      everconfirmed = 0 " .
+        "ORDER BY bug_id");
+
+while (@row = FetchSQLData()) {
+    my ($id) = (@row);
+    push(@badbugs, $id);
+}
+
+if (@badbugs > 0) {
+    Alert("Bugs with confirmed status but don't have everconfirmed set: " .
+          join (", ", @badbugs));
+}
+
+###########################################################################
+# Perform vote/everconfirmed checks
+###########################################################################
+
+Status("Checking votes/everconfirmed");
+
+@badbugs = ();
+
+SendSQL("SELECT   bug_id FROM bugs, products " .
+        "WHERE    bugs.product = products.product " .
+        "AND      bug_status = " . SqlQuote($::unconfirmedstate) . ' ' .
+        "AND      votestoconfirm <= votes " .
+        "ORDER BY bug_id");
+
+while (@row = FetchSQLData()) {
+    my ($id) = (@row);
+    push(@badbugs, $id);
+}
+
+if (@badbugs > 0) {
+    Alert("Bugs that have enough votes to be confirmed but haven't been: " .
+          join (", ", @badbugs));
+}
+
+###########################################################################
+# Unsent mail
+###########################################################################
+
+Status("Checking for unsent mail");
+
+@badbugs = ();
+
+SendSQL("SELECT bug_id " .
+        "FROM bugs WHERE lastdiffed < delta_ts AND ".
+        "delta_ts < date_sub(now(), INTERVAL 30 minute) ".
+        "ORDER BY bug_id");
+
+while (@row = FetchSQLData()) {
+    my ($id) = (@row);
+    push(@badbugs, $id);
+}
+
+if (@badbugs > 0) {
+    Alert("Bugs that have changes but no mail sent for at least half an hour: " .
+          join (", ", @badbugs));
+    print("Run <code>processmail rescanall</code> to fix this<p>\n");
+}
 
+###########################################################################
+# End
+###########################################################################
 
 Status("Sanity check completed.");
 PutFooter();
diff --git a/show_activity.cgi b/show_activity.cgi
index fccc21cd4..59e43b672 100755
--- a/show_activity.cgi
+++ b/show_activity.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -20,17 +20,21 @@
 #
 # Contributor(s): Terry Weissman <terry@mozilla.org>
 #                 Myk Melez <myk@mozilla.org>
+#                 Gervase Markham <gerv@gerv.net>
 
 use diagnostics;
 use strict;
 
+use lib qw(.);
+use vars qw ($template $vars);
+
 require "CGI.pl";
 
 ConnectToDatabase();
 
-######################################################################
+###############################################################################
 # Begin Data/Security Validation
-######################################################################
+###############################################################################
 
 # Check whether or not the user is currently logged in. This function 
 # sets the value of $::usergroupset, the binary number that records
@@ -42,17 +46,17 @@ quietly_check_login();
 # bug that the user is authorized to access.
 ValidateBugID($::FORM{'id'});
 
-######################################################################
+###############################################################################
 # End Data/Security Validation
-######################################################################
+###############################################################################
 
-print "Content-type: text/html\n\n";
+($vars->{'operations'}, $vars->{'incomplete_data'}) = 
+                                                 GetBugActivity($::FORM{'id'});
 
-PutHeader("Changes made to bug $::FORM{'id'}", "Activity log",
-          "Bug $::FORM{'id'}");
+$vars->{'bug_id'} = $::FORM{'id'};
 
-DumpBugActivity($::FORM{'id'});
+print "Content-type: text/html\n\n";
 
-print qq|<hr><a href="show_bug.cgi?id=$::FORM{'id'}">Back to bug $::FORM{'id'}</a>\n|;
+$template->process("bug/activity/show.html.tmpl", $vars)
+  || ThrowTemplateError($template->error());
 
-PutFooter();
diff --git a/show_bug.cgi b/show_bug.cgi
index eced9cfbe..f832a2930 100755
--- a/show_bug.cgi
+++ b/show_bug.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -23,7 +23,10 @@
 use diagnostics;
 use strict;
 
+use lib qw(.);
+
 require "CGI.pl";
+require "bug_form.pl";
 
 ConnectToDatabase();
 
@@ -47,32 +50,8 @@ if (defined ($::FORM{'id'})) {
 # End Data/Security Validation
 ######################################################################
 
-print "Content-type: text/html\n";
-print "\n";
-
-if (!defined $::FORM{'id'}) {
-    PutHeader("Search by bug number");
-    print "<FORM METHOD=GET ACTION=\"show_bug.cgi\">\n";
-    print "You may find a single bug by entering its bug id here: \n";
-    print "<INPUT NAME=id>\n";
-    print "<INPUT TYPE=\"submit\" VALUE=\"Show Me This Bug\">\n";
-    print "</FORM>\n";
-    PutFooter();
-    exit;
-}
-
 GetVersionTable();
 
-# Get the bug's summary (short description) and display it as
-# the page title.
-SendSQL("SELECT short_desc FROM bugs WHERE bug_id = $::FORM{'id'}");
-my ($summary) = FetchSQLData();
-$summary = html_quote($summary);
-PutHeader("Bug $::FORM{'id'} - $summary", "Bugzilla Bug $::FORM{'id'}", $summary );
-
-navigation_header();
-
-print "<HR>\n";
+print "Content-type: text/html\n\n";
 
-$! = 0;
-do "bug_form.pl" || die "Error doing bug_form.pl: $!";
+show_bug();
diff --git a/showattachment.cgi b/showattachment.cgi
index ae81117e5..4aaf6f17d 100755
--- a/showattachment.cgi
+++ b/showattachment.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -24,28 +24,14 @@
 use diagnostics;
 use strict;
 
-require "CGI.pl";
-
-ConnectToDatabase();
-
-quietly_check_login();
-
-if ($::FORM{attach_id} !~ /^[1-9][0-9]*$/) {
-    DisplayError("Attachment ID should be numeric.");
-    exit;
-}
+use lib qw(.);
 
-SendSQL("select bug_id, mimetype, thedata from attachments where attach_id = $::FORM{'attach_id'}");
-my ($bug_id, $mimetype, $thedata) = FetchSQLData();
-
-if (!$bug_id) {
-    DisplayError("Attachment $::FORM{attach_id} does not exist.");
-    exit;
-}
-
-# Make sure the user can see the bug to which this file is attached
-ValidateBugID($bug_id);
-
-print qq{Content-type: $mimetype\n\n$thedata};
+require "CGI.pl";
 
-    
+# Redirect to the new interface for displaying attachments.
+detaint_natural($::FORM{'attach_id'}) if defined($::FORM{'attach_id'});
+my $id = $::FORM{'attach_id'} || "";
+print "Status: 301 Permanent Redirect\n";
+print "Location: attachment.cgi?id=$id&action=view\n\n";
+exit;
+ 
diff --git a/showdependencygraph.cgi b/showdependencygraph.cgi
index df377c096..857075cb6 100755
--- a/showdependencygraph.cgi
+++ b/showdependencygraph.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -19,38 +19,43 @@
 # Rights Reserved.
 #
 # Contributor(s): Terry Weissman <terry@mozilla.org>
+#                 Gervase Markham <gerv@gerv.net>
 
 use diagnostics;
 use strict;
 
+use lib qw(.);
+
 require "CGI.pl";
 
 ConnectToDatabase();
 
 quietly_check_login();
 
-$::usergroupset = $::usergroupset; # More warning suppression silliness.
-
-######################################################################
-# Begin Data/Security Validation
-######################################################################
-
-# Make sure the bug ID is a positive integer representing an existing
-# bug that the user is authorized to access.
-if (defined $::FORM{'id'}) {
-  ValidateBugID($::FORM{'id'});
-}
+use vars qw($template $vars $userid $usergroupset);
 
-######################################################################
-# End Data/Security Validation
-######################################################################
+my %seen;
+my %edgesdone;
 
-my $id = $::FORM{'id'};
+sub CreateImagemap {
+    my $mapfilename = shift;
+    my $map = "<map name=\"imagemap\">\n";
+    my $default;
 
-my $urlbase = Param("urlbase");
+    open MAP, "<$mapfilename";
+    while(my $line = <MAP>) {
+        if($line =~ /^default ([^ ]*)(.*)$/) {
+            $default = qq{<area shape="default" href="$1">\n};
+        }
+        if ($line =~ /^rectangle \((.*),(.*)\) \((.*),(.*)\) (http[^ ]*)(.*)?$/) {
+            $map .= qq{<area name="bug$6" shape="rect" href="$5" coords="$1,$4,$3,$2">\n};
+        }
+    }
+    close MAP;
 
-my %seen;
-my %edgesdone;
+    $map .= "$default</map>";
+    return $map;
+}
 
 sub AddLink {
     my ($blocked, $dependson) = (@_);
@@ -63,138 +68,148 @@ sub AddLink {
     }
 }
 
-
-print "Content-type: text/html\n\n";
-PutHeader("Dependency graph", "Dependency graph", $id);
-
 $::FORM{'rankdir'} = "LR" if !defined $::FORM{'rankdir'};
 
+if (!defined($::FORM{'id'}) && !defined($::FORM{'doall'})) {
+    DisplayError("No bug numbers given.");
+    exit;
+}    
 
-if (defined $id) {
-    mkdir("data/webdot", 0777);
+my $filename = "data/webdot/$$.dot";
+my $urlbase = Param('urlbase');
 
-    my $filename = "data/webdot/$$.dot";
-    open(DOT, ">$filename") || die "Can't create $filename";
-    print DOT "digraph G {";
-    print DOT qq{
+open(DOT, ">$filename") || die "Can't create $filename";
+print DOT "digraph G {";
+print DOT qq{
 graph [URL="${urlbase}query.cgi", rankdir=$::FORM{'rankdir'}, size="64,64"]
 node [URL="${urlbase}show_bug.cgi?id=\\N", style=filled, color=lightgrey]
 };
-    my %baselist;
 
+my %baselist;
+
+if ($::FORM{'doall'}) {
+    SendSQL("SELECT blocked, dependson FROM dependencies");
+
+    while (MoreSQLData()) {
+        my ($blocked, $dependson) = FetchSQLData();
+        AddLink($blocked, $dependson);
+    }
+} else {
     foreach my $i (split('[\s,]+', $::FORM{'id'})) {
         $i = trim($i);
-        if ($i ne "") {
-            $baselist{$i} = 1;
-        }
+        ValidateBugID($i);
+        $baselist{$i} = 1;
     }
-    my @basearray = keys(%baselist);
 
-    if ($::FORM{'doall'}) {
-        SendSQL("select blocked, dependson from dependencies");
-        
+    my @stack = keys(%baselist);
+    foreach my $id (@stack) {
+        SendSQL("SELECT blocked, dependson 
+                 FROM   dependencies 
+                 WHERE  blocked = $id or dependson = $id");
         while (MoreSQLData()) {
-            my ($blocked, $dependson) = (FetchSQLData());
-            AddLink($blocked, $dependson);
-        }
-    } else {
-        my @stack = @basearray;
-        while (@stack) {
-            my $id = shift @stack;
-            SendSQL("select blocked, dependson from dependencies where blocked = $id or dependson = $id");
-            while (MoreSQLData()) {
-                my ($blocked, $dependson) = (FetchSQLData());
-                if ($blocked != $id && !exists $seen{$blocked}) {
-                    push @stack, $blocked;
-                }
-                if ($dependson != $id && !exists $seen{$dependson}) {
-                    push @stack, $dependson;
-                }
-                AddLink($blocked, $dependson);
+            my ($blocked, $dependson) = FetchSQLData();
+            if ($blocked != $id && !exists $seen{$blocked}) {
+                push @stack, $blocked;
             }
+
+            if ($dependson != $id && !exists $seen{$dependson}) {
+                push @stack, $dependson;
+            }
+
+            AddLink($blocked, $dependson);
         }
     }
 
-    foreach my $k (@basearray) {
+    foreach my $k (keys(%baselist)) {
         $seen{$k} = 1;
     }
-    foreach my $k (keys(%seen)) {
-        my $summary = "";
-        my $stat;
-        if ($::FORM{'showsummary'}) {
-            SendSQL("select bug_status, short_desc from bugs where bug_id = $k and bugs.groupset & $::usergroupset = bugs.groupset");
-            ($stat, $summary) = (FetchSQLData());
-            $stat = "NEW" if !defined $stat;
-            $summary = "" if !defined $summary;
-        } else {
-            SendSQL("select bug_status from bugs where bug_id = $k");
-            $stat = FetchOneColumn();
-        }
-        my @params;
-#        print DOT "$k [URL" . qq{="${urlbase}show_bug.cgi?id=$k"};
-        if ($summary ne "") {
-            $summary =~ s/([\\\"])/\\$1/g;
-            push(@params, qq{label="$k\\n$summary"});
-        }
-        if (exists $baselist{$k}) {
-            push(@params, "shape=box");
-        }
-        my $opened = ($stat eq "NEW" || $stat eq "ASSIGNED" ||
-                      $stat eq "REOPENED");
-        if ($opened) {
-            push(@params, "color=green");
-        }
-        if (@params) {
-            print DOT "$k [" . join(',', @params) . "]\n";
-        } else {
-            print DOT "$k\n";
-        }
+}
+
+foreach my $k (keys(%seen)) {
+    my $summary = "";
+    my $stat;
+    if ($::FORM{'showsummary'}) {
+        SendSQL(SelectVisible("SELECT bug_status, short_desc FROM bugs " .
+                              "WHERE bugs.bug_id = $k",
+                              $::userid,
+                              $::usergroupset));
+        ($stat, $summary) = FetchSQLData();
+        $stat = "NEW" if !defined $stat;
+        $summary = "" if !defined $summary;
+    } else {
+        SendSQL("SELECT bug_status FROM bugs WHERE bug_id = $k");
+        $stat = FetchOneColumn();
     }
+    my @params;
 
+    if ($summary ne "") {
+        $summary =~ s/([\\\"])/\\$1/g;
+        push(@params, qq{label="$k\\n$summary"});
+    }
 
-    print DOT "}\n";
-    close DOT;
-    chmod 0777, $filename;
-    
-    my $url = PerformSubsts(Param("webdotbase")) . $filename;
+    if (exists $baselist{$k}) {
+        push(@params, "shape=box");
+    }
 
-    print qq{<a href="$url.map"> <img src="$url.gif" ismap> </a><hr>\n};
+    if ($stat =~ /^(NEW|ASSIGNED|REOPENED)$/) {
+        push(@params, "color=green");
+    }
 
-    # Cleanup any old .dot files created from previous runs.
-    my $since = time() - 24 * 60 * 60;
-    foreach my $f (glob("data/webdot/*.dot")) {
-        if (ModTime($f) < $since) {
-            unlink $f;
-        }
+    if (@params) {
+        print DOT "$k [" . join(',', @params) . "]\n";
+    } else {
+        print DOT "$k\n";
     }
+}
+
+
+print DOT "}\n";
+close DOT;
+
+chmod 0777, $filename;
+
+my $webdotbase = Param('webdotbase');
+
+if ($webdotbase =~ /^https?:/) {
+     # Remote dot server
+     my $url = PerformSubsts($webdotbase) . $filename;
+     $vars->{'image_url'} = $url . ".gif";
+     $vars->{'map_url'} = $url . ".map";
 } else {
-    $::FORM{'id'} = "";
-    $::FORM{'doall'} = 0;
-    $::FORM{'showsummary'} = 0;
-}    
+    # Local dot installation
+    my $pngfilename = "data/webdot/$$.png";
+    my $mapfilename = "data/webdot/$$.map";
+    system("$webdotbase","-Tpng","-o","$pngfilename","$filename");
+    $vars->{'image_url'} = $pngfilename;
+    system("$webdotbase","-Tismap","-o","$mapfilename","$filename");
+    $vars->{'image_map'} = CreateImagemap($mapfilename);
+}
+
+# Cleanup any old .dot files created from previous runs.
+my $since = time() - 24 * 60 * 60;
+# Can't use glob, since even calling that fails taint checks for perl < 5.6
+opendir(DIR, "data/webdot/");
+my @files = grep { /\.dot$|\.png$|\.map$/ && -f "data/webdot/$_" } readdir(DIR);
+closedir DIR;
+foreach my $f (@files)
+{
+    $f = "data/webdot/$f";
+    # Here we are deleting all old files. All entries are from the
+    # data/webdot/ directory. Since we're deleting the file (not following
+    # symlinks), this can't escape to delete anything it shouldn't
+    trick_taint($f);
+    if (ModTime($f) < $since) {
+        unlink $f;
+    }
+}
+
+$vars->{'bug_id'} = $::FORM{'id'};
+$vars->{'multiple_bugs'} = ($::FORM{'id'} =~ /[ ,]/);
+$vars->{'doall'} = $::FORM{'doall'};
+$vars->{'rankdir'} = $::FORM{'rankdir'};
+$vars->{'showsummary'} = $::FORM{'showsummary'};
 
-print "
-<form>
-<table>
-<tr>
-<th align=right>Bug numbers:</th>
-<td><input name=id value=\"" . value_quote($::FORM{'id'}) . "\"></td>
-<td><input type=checkbox name=doall" . ($::FORM{'doall'} ? " checked" : "") .
-">Show <b>every</b> bug in the system with 
-dependencies</td>
-</tr>
-<tr><td colspan=3><input type=checkbox name=showsummary" .
-($::FORM{'showsummary'} ? " checked" : "") . ">Show the summary of all bugs
-</tr>
-<tr><td colspan=3><select name=rankdir>
-<option value=\"TB\"" . ($::FORM{'rankdir'} eq 'TB' ? 'selected' : '') .
-">Orient top-to-bottom
-<option value=\"LR\"" . ($::FORM{'rankdir'} eq 'LR' ? 'selected' : '') .
-">Orient left-to-right
-</select></td></tr>
-</table>
-<input type=submit value=\"Submit\">
-</form>
- ";
-
-PutFooter();
+# Generate and return the UI (HTML page) from the appropriate template.
+print "Content-type: text/html\n\n";
+$template->process("bug/dependency-graph.html.tmpl", $vars)
+  || ThrowTemplateError($template->error());
diff --git a/showdependencytree.cgi b/showdependencytree.cgi
index bab36da61..9b7060591 100755
--- a/showdependencytree.cgi
+++ b/showdependencytree.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -19,13 +19,18 @@
 # Rights Reserved.
 #
 # Contributor(s): Terry Weissman <terry@mozilla.org>
+#                 Andreas Franke <afranke@mathweb.org>
+#                 Christian Reis <kiko@async.com.br>
+#                 Myk Melez <myk@mozilla.org>
 
 use diagnostics;
 use strict;
 
+use lib qw(.);
 require "CGI.pl";
 
-# Shut up misguided -w warnings about "used only once":
+# Use global template variables.
+use vars qw($template $vars);
 
 use vars %::FORM;
 
@@ -33,82 +38,155 @@ ConnectToDatabase();
 
 quietly_check_login();
 
-$::usergroupset = $::usergroupset; # More warning suppression silliness.
+# More warning suppression silliness.
+$::userid = $::userid;
+$::usergroupset = $::usergroupset;
 
-######################################################################
-# Begin Data/Security Validation
-######################################################################
+################################################################################
+# Data/Security Validation                                                     #
+################################################################################
 
 # Make sure the bug ID is a positive integer representing an existing
 # bug that the user is authorized to access.
 ValidateBugID($::FORM{'id'});
-
-######################################################################
-# End Data/Security Validation
-######################################################################
-
 my $id = $::FORM{'id'};
-my $linkedid = qq{<a href="show_bug.cgi?id=$id">$id</a>};
-
-print "Content-type: text/html\n\n";
-PutHeader("Dependency tree", "Dependency tree", "Bug $linkedid");
 
-my %seen;
+my $hide_resolved = $::FORM{'hide_resolved'} ? 1 : 0;
+
+my $maxdepth = $::FORM{'maxdepth'} || 0;
+if ($maxdepth !~ /^\d+$/) { $maxdepth = 0 };
+
+################################################################################
+# Main Section                                                                 #
+################################################################################
+
+# The column/value to select as the target milestone for bugs,
+# either the target_milestone column or the empty string value
+# (for installations that don't use target milestones).  Makes
+# it easier to query the database for bugs because we don't
+# have to embed a conditional statement into each query.
+my $milestone_column = Param('usetargetmilestone') ? "target_milestone" : "''";
+
+# The greatest depth to which either tree goes.
+my $realdepth = 0;
+
+# Generate the tree of bugs that this bug depends on and a list of IDs
+# appearing in the tree.
+my $dependson_tree = { $id => GetBug($id) };
+my $dependson_ids = {};
+GenerateTree($id, "dependson", 1, $dependson_tree, $dependson_ids);
+$vars->{'dependson_tree'} = $dependson_tree;
+$vars->{'dependson_ids'} = [keys(%$dependson_ids)];
+
+# Generate the tree of bugs that this bug blocks and a list of IDs
+# appearing in the tree.
+my $blocked_tree = { $id => GetBug($id) };
+my $blocked_ids = {};
+GenerateTree($id, "blocked", 1, $blocked_tree, $blocked_ids);
+$vars->{'blocked_tree'} = $blocked_tree;
+$vars->{'blocked_ids'} = [keys(%$blocked_ids)];
+
+$vars->{'realdepth'}      = $realdepth;
+
+$vars->{'bugid'}          = $id;
+$vars->{'maxdepth'}       = $maxdepth;
+$vars->{'hide_resolved'}  = $hide_resolved;
+$vars->{'canedit'}        = UserInGroup("editbugs");
+
+print "Content-Type: text/html\n\n";
+$template->process("bug/dependency-tree.html.tmpl", $vars)
+  || ThrowTemplateError($template->error());
+
+################################################################################
+# Recursive Tree Generation Function                                           #
+################################################################################
+
+sub GenerateTree {
+    # Generates a dependency tree for a given bug.  Calls itself recursively
+    # to generate sub-trees for the bug's dependencies.
+    
+    my ($bug_id, $relationship, $depth, $bugs, $ids) = @_;
+    
+    # Query the database for bugs with the given dependency relationship.
+    my @dependencies = GetDependencies($bug_id, $relationship);
+    
+    # Don't do anything if this bug doesn't have any dependencies.
+    return unless scalar(@dependencies);
+    
+    # Record this depth in the global $realdepth variable if it's farther 
+    # than we've gone before.
+    $realdepth = max($realdepth, $depth);
+
+    foreach my $dep_id (@dependencies) {
+        # Get this dependency's record from the database and generate
+        # its sub-tree if we haven't already done so (which happens
+        # when bugs appear in dependency trees multiple times).
+        if (!$bugs->{$dep_id}) {
+            $bugs->{$dep_id} = GetBug($dep_id);
+            GenerateTree($dep_id, $relationship, $depth+1, $bugs, $ids);
+        }
 
-sub DumpKids {
-    my ($i, $me, $target) = (@_);
-    if (exists $seen{$i}) {
-        return;
-    }
-    $seen{$i} = 1;
-    SendSQL("select $target from dependencies where $me = $i order by $target");
-    my @list;
-    while (MoreSQLData()) {
-        push(@list, FetchOneColumn());
-    }
-    if (@list) {
-        print "<ul>\n";
-        foreach my $kid (@list) {
-            my ($bugid, $stat, $milestone) = ("", "", "");
-            my ($userid, $short_desc) = ("", "");
-            if (Param('usetargetmilestone')) {
-                SendSQL("select bug_id, bug_status, target_milestone, assigned_to, short_desc from bugs where bug_id = $kid and bugs.groupset & $::usergroupset = bugs.groupset");
-                ($bugid, $stat, $milestone, $userid, $short_desc) = (FetchSQLData());
-            } else {
-                SendSQL("select bug_id, bug_status, assigned_to, short_desc from bugs where bug_id = $kid and bugs.groupset & $::usergroupset = bugs.groupset");
-                ($bugid, $stat, $userid, $short_desc) = (FetchSQLData());
-
-            }
-            if (!defined $bugid) {
-                next;
-            }
-            my $opened = ($stat eq "NEW" || $stat eq "ASSIGNED" ||
-                          $stat eq "REOPENED");
-            print "<li>";
-            if (!$opened) {
-                print "<strike>";
-            }
-            $short_desc = html_quote($short_desc);
-            SendSQL("select login_name from profiles where userid = $userid");
-            my ($owner) = (FetchSQLData());
-            if ( (Param('usetargetmilestone')) && ($milestone) ) {
-                print qq{<a href="show_bug.cgi?id=$kid">$kid [$milestone, $owner] - $short_desc</a>};
-            } else {
-                print qq{<a href="show_bug.cgi?id=$kid">$kid [$owner] - $short_desc</a>};
-            }
-            if (!$opened) {
-                print "</strike>";
-            }
-            DumpKids($kid, $me, $target);
+        # Add this dependency to the list of this bug's dependencies 
+        # if it exists, if we haven't exceeded the maximum depth the user 
+        # wants the tree to go, and if the dependency isn't resolved 
+        # (if we're ignoring resolved dependencies).
+        if ($bugs->{$dep_id}->{'exists'}
+            && (!$maxdepth || $depth <= $maxdepth) 
+            && ($bugs->{$dep_id}->{'open'} || !$hide_resolved))
+        {
+            push (@{$bugs->{$bug_id}->{'dependencies'}}, $dep_id);
+            $ids->{$dep_id} = 1;
         }
-        print "</ul>\n";
     }
 }
 
-print "<h1>Bugs that bug $linkedid depends on</h1>";
-DumpKids($id, "blocked", "dependson");
-print "<h1>Bugs that depend on bug $linkedid</h1>";
-undef %seen;
-DumpKids($id, "dependson", "blocked");
+sub GetBug {
+    # Retrieves the necessary information about a bug, stores it in the bug cache,
+    # and returns it to the calling code.
+    my ($id) = @_;
+    
+    SendSQL(SelectVisible("SELECT 1, 
+                                  bug_status, 
+                                  short_desc, 
+                                  $milestone_column, 
+                                  assignee.userid, 
+                                  assignee.login_name
+                             FROM bugs, profiles AS assignee
+                            WHERE bugs.bug_id = $id
+                              AND bugs.assigned_to = assignee.userid", 
+                          $::userid, 
+                          $::usergroupset));
+    
+    my $bug = {};
+    
+    ($bug->{'exists'}, 
+     $bug->{'status'}, 
+     $bug->{'summary'}, 
+     $bug->{'milestone'}, 
+     $bug->{'assignee_id'}, 
+     $bug->{'assignee_email'}) = FetchSQLData();
+    
+    $bug->{'open'} = IsOpenedState($bug->{'status'});
+    $bug->{'dependencies'} = [];
+    
+    return $bug;
+}
+
+sub GetDependencies {
+    # Returns a list of dependencies for a given bug.
+    
+    my ($id, $relationship) = @_;
+    
+    my $bug_type = ($relationship eq "blocked") ? "dependson" : "blocked";
+    
+    SendSQL("  SELECT $relationship 
+                 FROM dependencies 
+                WHERE $bug_type = $id 
+             ORDER BY $relationship");
+    
+    my @dependencies = ();
+    push(@dependencies, FetchOneColumn()) while MoreSQLData();
+    
+    return @dependencies;
+}
 
-PutFooter();
diff --git a/showvotes.cgi b/showvotes.cgi
deleted file mode 100755
index bb87848f0..000000000
--- a/showvotes.cgi
+++ /dev/null
@@ -1,177 +0,0 @@
-#!/usr/bonsaitools/bin/perl -w
-# -*- Mode: perl; indent-tabs-mode: nil -*-
-#
-# The contents of this file are subject to the Mozilla Public
-# License Version 1.1 (the "License"); you may not use this file
-# except in compliance with the License. You may obtain a copy of
-# the License at http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS
-# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
-# implied. See the License for the specific language governing
-# rights and limitations under the License.
-#
-# The Original Code is the Bugzilla Bug Tracking System.
-#
-# The Initial Developer of the Original Code is Netscape Communications
-# Corporation. Portions created by Netscape are
-# Copyright (C) 1998 Netscape Communications Corporation. All
-# Rights Reserved.
-#
-# Contributor(s): Terry Weissman <terry@mozilla.org>
-#                 Stephan Niemz  <st.n@gmx.net>
-
-use diagnostics;
-use strict;
-
-require "CGI.pl";
-
-ConnectToDatabase();
-
-if (defined $::FORM{'voteon'} || (!defined $::FORM{'bug_id'} &&
-                                  !defined $::FORM{'user'})) {
-    confirm_login();
-    $::FORM{'user'} = DBNameToIdAndCheck($::COOKIE{'Bugzilla_login'});
-} else {
-  # Check whether or not the user is currently logged in without throwing
-  # an error if the user is not logged in. This function sets the value 
-  # of $::usergroupset, the binary number that records the set of groups 
-  # to which the user belongs and which gets used in ValidateBugID below
-  # to determine whether or not the user is authorized to access the bug
-  # whose votes are being shown or which is being voted on.
-  quietly_check_login();
-}
-
-################################################################################
-# Begin Data/Security Validation
-################################################################################
-
-# Make sure the bug ID is a positive integer representing an existing
-# bug that the user is authorized to access.
-if (defined $::FORM{'bug_id'}) {
-  ValidateBugID($::FORM{'bug_id'});
-}
-
-# Make sure the bug ID being voted on is a positive integer representing 
-# an existing bug that the user is authorized to access.
-if (defined $::FORM{'voteon'}) {
-  ValidateBugID($::FORM{'voteon'});
-}
-
-# Make sure the user ID is a positive integer representing an existing user.
-if (defined $::FORM{'user'}) {
-  $::FORM{'user'} =~ /^([1-9][0-9]*)$/
-    || DisplayError("The user number is invalid.") 
-    && exit;
-  SendSQL("SELECT 1 FROM profiles WHERE userid = $::FORM{'user'}");
-  FetchSQLData() 
-    || DisplayError("User #$::FORM{'user'} does not exist.") 
-    && exit;
-}
-
-################################################################################
-# End Data/Security Validation
-################################################################################
-
-print "Content-type: text/html\n\n";
-
-if (defined $::FORM{'bug_id'}) {
-    my $id = $::FORM{'bug_id'};
-    my $linkedid = qq{<a href="show_bug.cgi?id=$id">$id</a>};
-    PutHeader("Show votes", "Show votes", "Bug $linkedid");
-    SendSQL("select profiles.login_name, votes.who, votes.count from votes, profiles where votes.bug_id = " . SqlQuote($id) . " and profiles.userid = votes.who");
-    print "<table>\n";
-    print "<tr><th>Who</th><th>Number of votes</th></tr>\n";
-    my $sum = 0;
-    while (MoreSQLData()) {
-        my ($name, $userid, $count) = (FetchSQLData());
-        print qq{<tr><td><a href="showvotes.cgi?user=$userid">$name</a></td><td align=right>$count</td></tr>\n};
-        $sum += $count;
-    }
-    print "</table>";
-    print "<p>Total votes: $sum<p>\n";
-} elsif (defined $::FORM{'user'}) {
-    quietly_check_login();
-    GetVersionTable();
-    my $who = $::FORM{'user'};
-    my $name = DBID_to_name($who);
-    PutHeader("Show votes", "Show votes", $name);
-    print qq{<form action="doeditvotes.cgi">\n};
-    print "<table><tr><td></td><th>Bug \#</th><th>Summary</th><th>Votes</th></tr>\n";
-    SendSQL("lock tables bugs read, products read, votes write");
-    if (defined($::FORM{'voteon'})) {
-        # Oh, boy, what a hack.  Make sure there is an entry for this bug
-        # in the vote table, just so that things display right.
-        # Yuck yuck yuck.###
-        SendSQL("select votes.count from votes where votes.bug_id = $::FORM{'voteon'} and votes.who = $who");
-        if (!MoreSQLData()) {
-            SendSQL("insert into votes (who, bug_id, count) values ($who, $::FORM{'voteon'}, 0)");
-        }
-    }
-    my $canedit = (defined $::COOKIE{'Bugzilla_login'} &&
-                   $::COOKIE{'Bugzilla_login'} eq $name);
-    my %maxvotesperbug;
-    if( $canedit ) {
-        SendSQL("SELECT products.product, products.maxvotesperbug FROM products");
-        while (MoreSQLData()) {
-            my ($prod, $max) = (FetchSQLData());
-            $maxvotesperbug{$prod}= $max;
-        }
-    }
-    foreach my $product (sort(keys(%::prodmaxvotes))) {
-        if ($::prodmaxvotes{$product} <= 0) {
-            next;
-        }
-        my $qprod = value_quote($product);
-        SendSQL("select votes.bug_id, votes.count, bugs.short_desc, bugs.bug_status from votes, bugs where votes.who = $who and votes.bug_id = bugs.bug_id and bugs.product = " . SqlQuote($product) . "order by votes.bug_id");
-        next if !MoreSQLData(); # don't show products without any votes
-        my $sum = 0;
-        print "<tr><th>$product</th></tr>";
-        while (MoreSQLData()) {
-            my ($id, $count, $summary, $status) = (FetchSQLData());
-            if (!defined $status) {
-                next;
-            }
-            my $opened = IsOpenedState($status);
-            my $strike = $opened ? "" : "<strike>";
-            my $endstrike = $opened ? "" : "</strike>";
-            $summary = html_quote($summary);
-            $sum += $count;
-            if ($canedit) {
-                my $min = $maxvotesperbug{$product}; # minimum of these two
-                $min = $::prodmaxvotes{$product} if $::prodmaxvotes{$product} < $min;
-                if( $min < 2 ) { # checkbox
-                    my $checked = $count ? ' checked' : '';
-                    $count = qq{<input type="checkbox" name="$id" value="1"$checked>};
-                }else { # normal input
-                    $count = qq{<input name="$id" value="$count" size="5">};
-                }
-            }
-            print qq{
-<tr>
-<td></td>
-<td>$strike<a href="showvotes.cgi?bug_id=$id">$id</a>$endstrike</td>
-<td><a href="show_bug.cgi?id=$id">$summary</a></td>
-<td align="right">$count</td>
-</tr>
-};
-        }
-        my $plural = (($sum == 1) ? "" : "s");
-        print "<td colspan=3>$sum vote$plural used out of\n";
-        print "$::prodmaxvotes{$product} allowed.</td>\n";
-    }
-    print "</table>\n";
-    if ($canedit) {
-        print qq{<input type=submit value="Submit">\n};
-        print "<br>To change your votes, type in new numbers (using zero to\n";
-        print "mean no votes) or change the checkbox, and then click <b>Submit</b>.\n";
-    }
-    print "<input type=hidden name=who value=$who>";
-    print "</form>\n";
-    SendSQL("delete from votes where count <= 0");
-    SendSQL("unlock tables");
-}
-
-print qq{<a href="votehelp.html">Help!  I don't understand this voting stuff</a>};
-
-PutFooter();
diff --git a/sidebar.cgi b/sidebar.cgi
new file mode 100755
index 000000000..2805547cf
--- /dev/null
+++ b/sidebar.cgi
@@ -0,0 +1,77 @@
+#!/usr/bonsaitools/bin/perl -wT
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is the Bugzilla Bug Tracking System.
+#
+# Contributor(s): Jacob Steenhagen <jake@acutex.net>
+
+use strict;
+use diagnostics;
+
+use lib ".";
+require "CGI.pl";
+
+# Shut up "Used Only Once" errors
+use vars qw(
+  $template
+  $vars
+);
+
+ConnectToDatabase();
+quietly_check_login();
+
+###############################################################################
+# Main Body Execution
+###############################################################################
+
+$vars->{'username'} = $::COOKIE{'Bugzilla_login'} || '';
+
+if (defined $::COOKIE{'Bugzilla_login'}) {
+    SendSQL("SELECT mybugslink, userid, blessgroupset FROM profiles " .
+            "WHERE login_name = " . SqlQuote($::COOKIE{'Bugzilla_login'}));
+    my ($mybugslink, $userid, $blessgroupset) = (FetchSQLData());
+    $vars->{'userid'} = $userid;
+    $vars->{'blessgroupset'} = $blessgroupset;
+    if ($mybugslink) {
+        my $mybugstemplate = Param("mybugstemplate");
+        my %substs = ( 'userid' => url_quote($::COOKIE{'Bugzilla_login'}) );
+        $vars->{'mybugsurl'} = PerformSubsts($mybugstemplate, \%substs);
+    }
+    SendSQL("SELECT name FROM namedqueries WHERE userid = $userid AND linkinfooter");
+    while (MoreSQLData()) {
+        my ($name) = FetchSQLData();
+        push(@{$vars->{'namedqueries'}}, $name);
+    }
+}
+
+# This sidebar is currently for use with Mozilla based web browsers.
+# Internet Explorer 6 is supposed to have a similar feature, but it
+# most likely won't support XUL ;)  When that does come out, this
+# can be expanded to output normal HTML for IE.  Until then, I like
+# the way Scott's sidebar looks so I'm using that as the base for
+# this file.
+# http://bugzilla.mozilla.org/show_bug.cgi?id=37339
+
+my $useragent = $ENV{HTTP_USER_AGENT};
+if ($useragent =~ m:Mozilla/([1-9][0-9]*):i && $1 >= 5 && $useragent !~ m/compatible/i) {
+    print "Content-type: application/vnd.mozilla.xul+xml\n\n";
+    # Generate and return the XUL from the appropriate template.
+    $template->process("sidebar.xul.tmpl", $vars)
+      || ThrowTemplateError($template->error());
+} else {
+    DisplayError("sidebar.cgi currently only supports Mozilla based web browsers");
+    exit;
+}
+
+
+
diff --git a/syncshadowdb b/syncshadowdb
index 4733dbb58..18c4528dc 100755
--- a/syncshadowdb
+++ b/syncshadowdb
@@ -39,18 +39,35 @@ sub sillyness {
 
 my $verbose = 0;
 my $syncall = 0;
+my $shutdown = 0;
+my $tempdir = "data";
+my $force = 0;
+
+my $shutdown_msg = "Bugzilla is temporarily disabled while the database is backed up. Try again in a few minutes.";
 
 sub Usage {
-    print "Usage: syncshadowdb [-v] [-syncall]\n";
+    print "Usage: syncshadowdb [-v] [-syncall] [-shutdown] [-tempdir dirname] [-force]\n";
     exit;
 }
 
-foreach my $opt (@ARGV) {
+while (my $opt = shift @ARGV) {
     if ($opt eq '-v') {
         $verbose = 1;
     } elsif ($opt eq '-syncall') {
         $syncall = 1;
         $verbose = 1;
+    } elsif ($opt eq '-shutdown') {
+        $shutdown = 1;
+    } elsif ($opt eq '-tempdir') {
+        my $dir = shift @ARGV;
+        if (-d $dir) {
+            $tempdir = $dir;
+        } else {
+            print "$dir does not exist or is not a directory.  No syncing performed";
+            exit;
+        }
+    } elsif ($opt eq '-force') {
+        $force = 1;
     } elsif ($opt eq '--') {
         # do nothing - null parameter so we can use
         # multi-param system() call in globals.pl
@@ -78,6 +95,63 @@ if (!Param("shadowdb")) {
     exit;
 }
 
+if (Param("shutdownhtml") && ! $force) {
+    Verbose("Bugzilla was shutdown prior to running syncshadowdb. \n" .
+            "  If you wish to sync anyway, use the -force command line option");
+    exit;
+}
+
+my $wasshutdown = "";
+if ($shutdown) {
+    Verbose ("Shutting down bugzilla and waiting for connections to clear");
+    # Record the old shutdownhtml so it can be restored at the end (this will
+    # only be an issue if we are called using the -force command line param)
+    $wasshutdown = Param("shutdownhtml");
+    $::param{'shutdownhtml'} = $shutdown_msg;
+    WriteParams();
+    # Now we need to wait for existing connections to this database to clear. We
+    # do this by looking for connections to the main or shadow database using
+    # 'mysqladmin processlist'
+    my $cmd = "$::mysqlpath/mysqladmin -u $::db_user";
+    if ($::db_pass) { $cmd .= " -p$::db_pass" }
+    $cmd .= " processlist";
+    my $found_proc = 1;
+    # We need to put together a nice little regular expression to use in the
+    # following loop that'll tell us if the return from mysqladmin contains
+    # either the main or shadow database.
+    my @dbs = ($::db_name, Param("shadowdb"));
+    my $db_expr = "^\\s*(" . join ("\|", @dbs) . ")\\s*\$";
+    # Don't let this thing wait forever...
+    my $starttime = time();
+    while ($found_proc) {
+        $found_proc = 0;
+        open (PROC, $cmd . "|");
+        my @output = <PROC>;
+        close (PROC);
+        foreach my $line(@output) {
+            my @info = split (/\|/, $line);
+            # Ignore any line that doesn't have 9 pieces of info
+            # or contain Id (pretty printing crap)
+            if ($#info != 9 || $line =~ /Id/) { next }
+            if ($info[4] =~ m/$db_expr/) {
+                $found_proc = 1;
+            }
+        }
+        # If there are still active connections to Bugzilla 10 minutes after
+        # shutting it down, then something is wrong.
+        if ((time() - $starttime) > 600) {
+            # There should be a better way to notify the admin of something bad like
+            # this happening.
+            Verbose ("*** Waited for 10 minutes and there were still active \n" .
+                     "    connections to the bugzilla database.  Giving up.");
+            $::param{'shutdownhtml'} = $wasshutdown;
+            WriteParams();
+            exit;
+        }
+    }
+}
+
+
 my $wasusing = Param("queryagainstshadowdb");
 
 $::param{'queryagainstshadowdb'} = 1; # Force us to be able to use the
@@ -114,8 +188,10 @@ if ($syncall) {
     if ($wasusing) {
         $::param{'queryagainstshadowdb'} = 0;
         WriteParams();
-        Verbose("Disabled reading from the shadowdb. Sleeping 10 seconds to let other procs catch up.");
-        sleep(10);
+        if (! $shutdown) {
+            Verbose("Disabled reading from the shadowdb. Sleeping 10 seconds to let other procs catch up.");
+            sleep(10);
+        }
         $::param{'queryagainstshadowdb'} = 1;
     }
     my @tables;
@@ -157,7 +233,7 @@ if ($syncall) {
     }
     Verbose("Locking entire database");
     SendSQL($query);
-    my $tempfile = "data/tmpsyncshadow.$$";
+    my $tempfile = "$tempdir/tmpsyncshadow.$$";
     Verbose("Dumping database to a temp file ($tempfile).");
     my @ARGS = ("-u", $::db_user);
     if ($::db_pass) { push @ARGS, "-p$::db_pass" }
@@ -165,7 +241,7 @@ if ($syncall) {
     open SAVEOUT, ">&STDOUT";     # stash the original output stream
     open STDOUT, ">$tempfile";    # redirect to file
     select STDOUT; $| = 1;        # disable buffering
-    system("mysqldump", @ARGS);
+    system("$::mysqlpath/mysqldump", @ARGS);
     open STDOUT, ">&SAVEOUT";     # redirect back to original stream
     Verbose("Restoring from tempfile into shadowdb");
     my $extra = "-u $::db_user";
@@ -175,7 +251,7 @@ if ($syncall) {
     if ($verbose) {
         $extra .= " -v";
     }
-    open(MYSQL, "cat $tempfile | mysql $extra " .
+    open(MYSQL, "cat $tempfile | $::mysqlpath/mysql $extra " .
          Param("shadowdb") . "|") || die "Couldn't do db copy";
     my $count = 0;
     while (<MYSQL>) {
@@ -199,6 +275,11 @@ if ($syncall) {
         $::param{'queryagainstshadowdb'} = 1;
         WriteParams();
     }
+    if ($shutdown) {
+        Verbose("Restoring the original shutdown message (if any)");
+        $::param{'shutdownhtml'} = $wasshutdown;
+        WriteParams();
+    }
     Verbose("OK, done.");
 }
 
diff --git a/t/001compile.t b/t/001compile.t
index 63f59af9a..f662f0751 100644
--- a/t/001compile.t
+++ b/t/001compile.t
@@ -32,60 +32,61 @@
 # GPL.
 # 
 
-
 #################
 #Bugzilla Test 1#
 ###Compilation###
-BEGIN { use lib 't/'; }
-BEGIN { use Support::Files; }
-BEGIN { $tests = @Support::Files::testitems + 3; }
-BEGIN { use Test::More tests => $tests; }
 
 use strict;
 
-# First now we test the scripts                                                   
-my @testitems = @Support::Files::testitems; 
-# Capture the TESTERR from Test::More for printing errors.
-# This will handle verbosity for us automatically
-*TESTOUT = \*Test::More::TESTOUT;
-my $perlapp = $^X;
-
-foreach my $file (@testitems) {
-        $file =~ s/\s.*$//; # nuke everything after the first space (#comment)
-        next if (!$file); # skip null entries
-        open (FILE,$file);
-        my $bang = <FILE>;
-        close (FILE);
-        my $T = "";
-        if ($bang =~ m/#!\S*perl\s+-.*T/) {
-            $T = "T";
-        }
-        my $command = "$perlapp"." -c$T $file 2>&1";
-        my $loginfo=`$command`;
-        #print '@@'.$loginfo.'##';
-        if ($loginfo =~ /syntax ok$/im) {
-                if ($loginfo ne "$file syntax OK\n") {
-                        print TESTOUT $loginfo;
-                        ok(0,$file."--WARNING");
-                } else {
-                        ok(1,$file);
-                }
-        } else {
-                print TESTOUT $loginfo;
-                ok(0,$file."--ERROR");
-        }
-}      
-
-# and the libs:                                                                 
-use_ok('Token'); # 52                                                 
-use_ok('Bug'); # 53                                            
-use_ok('RelationSet'); # 54                                           
-
-
+use lib 't';
 
+use Support::Files;
 
+use Test::More tests => scalar(@Support::Files::testitems);
 
+# Capture the TESTOUT from Test::More or Test::Builder for printing errors.
+# This will handle verbosity for us automatically.
+my $fh;
+{
+    local $^W = 0;  # Don't complain about non-existent filehandles
+    if (-e \*Test::More::TESTOUT) {
+        $fh = \*Test::More::TESTOUT;
+    } elsif (-e \*Test::Builder::TESTOUT) {
+        $fh = \*Test::Builder::TESTOUT;
+    } else {
+        $fh = \*STDOUT;
+    }
+}
 
+my @testitems = @Support::Files::testitems;
+my $perlapp = $^X;
 
+# Test the scripts by compiling them
 
+foreach my $file (@testitems) {
+    $file =~ s/\s.*$//; # nuke everything after the first space (#comment)
+    next if (!$file); # skip null entries
+    open (FILE,$file);
+    my $bang = <FILE>;
+    close (FILE);
+    my $T = "";
+    if ($bang =~ m/#!\S*perl\s+-.*T/) {
+        $T = "T";
+    }
+    my $command = "$perlapp -c$T $file 2>&1";
+    my $loginfo=`$command`;
+    #print '@@'.$loginfo.'##';
+    if ($loginfo =~ /syntax ok$/im) {
+        if ($loginfo ne "$file syntax OK\n") {
+            ok(0,$file." --WARNING");
+            print $fh $loginfo;
+        } else {
+            ok(1,$file);
+        }
+    } else {
+        ok(0,$file." --ERROR");
+        print $fh $loginfo;
+    }
+}      
 
+exit 0;
diff --git a/t/002goodperl.t b/t/002goodperl.t
new file mode 100644
index 000000000..d3beec5ef
--- /dev/null
+++ b/t/002goodperl.t
@@ -0,0 +1,119 @@
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+# 
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+# 
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+# 
+# The Original Code are the Bugzilla Tests.
+# 
+# The Initial Developer of the Original Code is Zach Lipton
+# Portions created by Zach Lipton are 
+# Copyright (C) 2001 Zach Lipton.  All
+# Rights Reserved.
+# 
+# Contributor(s): Zach Lipton <zach@zachlipton.com>
+#                 Jacob Steenhagen <jake@acutex.net>
+#                 David D. Kilzer <ddkilzer@theracingworld.com>
+# 
+# Alternatively, the contents of this file may be used under the
+# terms of the GNU General Public License Version 2 or later (the
+# "GPL"), in which case the provisions of the GPL are applicable 
+# instead of those above.  If you wish to allow use of your 
+# version of this file only under the terms of the GPL and not to
+# allow others to use your version of this file under the MPL,
+# indicate your decision by deleting the provisions above and
+# replace them with the notice and other provisions required by
+# the GPL.  If you do not delete the provisions above, a recipient
+# may use your version of this file under either the MPL or the
+# GPL.
+# 
+
+#################
+#Bugzilla Test 2#
+####GoodPerl#####
+
+use strict;
+
+use lib 't';
+
+use Support::Files;
+
+use Test::More tests => (scalar(@Support::Files::testitems) * 2);
+
+my @testitems = @Support::Files::testitems; # get the files to test.
+
+foreach my $file (@testitems) {
+    $file =~ s/\s.*$//; # nuke everything after the first space (#comment)
+    next if (!$file); # skip null entries
+    if (! open (FILE, $file)) {
+        ok(0,"could not open $file --WARNING");
+    }
+    my $file_line1 = <FILE>;
+    close (FILE);
+
+    $file =~ m/.*\.(.*)/;
+    my $ext = $1;
+
+    if ($file_line1 !~ /\/usr\/bonsaitools\/bin\/perl/) {
+        ok(1,"$file does not have a shebang");	
+    } else {
+        my $flags;
+        if ($file eq "processmail") {
+            # special case processmail, which is tainted checked
+            $flags = "wT";
+        } elsif (!defined $ext || $ext eq "pl") {
+            # standalone programs (eg syncshadowdb) aren't taint checked yet
+            $flags = "w";
+        } elsif ($ext eq "pm") {
+            ok(0, "$file is a module, but has a shebang");
+            next;
+        } elsif ($ext eq "cgi") {
+            # cgi files must be taint checked, but only the user-accessible
+            # ones have been checked so far
+            if ($file =~ m/^edit/) {
+                $flags = "w";
+            } else {
+                $flags = "wT";
+            }
+        } else {
+            ok(0, "$file has shebang but unknown extension");
+            next;
+        }
+
+        if ($file_line1 =~ m#/usr/bonsaitools/bin/perl -$flags#) {
+            ok(1,"$file uses -$flags");
+        } else {
+            ok(0,"$file is MISSING -$flags --WARNING");
+        }
+    }
+}
+
+foreach my $file (@testitems) {
+    my $found_use_strict = 0;
+    $file =~ s/\s.*$//; # nuke everything after the first space (#comment)
+    next if (!$file); # skip null entries
+    if (! open (FILE, $file)) {
+        ok(0,"could not open $file --WARNING");
+        next;
+    }
+    while (my $file_line = <FILE>) {
+        if ($file_line =~ m/^\s*use strict/) {
+            $found_use_strict = 1;
+            last;
+        }
+    }
+    close (FILE);
+    if ($found_use_strict) {
+        ok(1,"$file uses strict");
+    } else {
+        ok(0,"$file DOES NOT use strict --WARNING");
+    }
+}
+
+exit 0;
diff --git a/t/003safesys.t b/t/003safesys.t
index 98e9d2d64..14de7c030 100644
--- a/t/003safesys.t
+++ b/t/003safesys.t
@@ -36,29 +36,42 @@
 #Bugzilla Test 3#
 ###Safesystem####
 
-BEGIN { use lib 't/'; }
-BEGIN { use Support::Files; }
-BEGIN { $tests = @Support::Files::testitems; }    
-BEGIN { use Test::More tests => $tests; }
-
 use strict;
 
+use lib 't';
+
+use Support::Files;
+
+use Test::More tests => scalar(@Support::Files::testitems);
+
+# Capture the TESTOUT from Test::More or Test::Builder for printing errors.
+# This will handle verbosity for us automatically.
+my $fh;
+{
+    local $^W = 0;  # Don't complain about non-existent filehandles
+    if (-e \*Test::More::TESTOUT) {
+        $fh = \*Test::More::TESTOUT;
+    } elsif (-e \*Test::Builder::TESTOUT) {
+        $fh = \*Test::Builder::TESTOUT;
+    } else {
+        $fh = \*STDOUT;
+    }
+}
+
 my @testitems = @Support::Files::testitems; 
-# Capture the TESTERR from Test::More for printing errors.
-# This will handle verbosity for us automatically
-*TESTOUT = \*Test::More::TESTOUT;
 my $perlapp = $^X;
 
 foreach my $file (@testitems) {
-        $file =~ s/\s.*$//; # nuke everything after the first space (#comment)
-        next if (!$file); # skip null entries
-        my $command = "$perlapp -c -It -MSupport::Systemexec $file 2>&1";
-        my $loginfo=`$command`;
-        if ($loginfo =~ /arguments for Support::Systemexec::(system|exec)/im) {
-                ok(0,"$file DOES NOT use proper system or exec calls");
-                print TESTOUT $loginfo;
-        } else {
-                ok(1,"$file uses proper system and exec calls");
-        }
+    $file =~ s/\s.*$//; # nuke everything after the first space (#comment)
+    next if (!$file); # skip null entries
+    my $command = "$perlapp -c -It -MSupport::Systemexec $file 2>&1";
+    my $loginfo=`$command`;
+    if ($loginfo =~ /arguments for Support::Systemexec::(system|exec)/im) {
+        ok(0,"$file DOES NOT use proper system or exec calls");
+        print $fh $loginfo;
+    } else {
+        ok(1,"$file uses proper system and exec calls");
+    }
 }
 
+exit 0;
diff --git a/t/004template.t b/t/004template.t
new file mode 100644
index 000000000..730aafc86
--- /dev/null
+++ b/t/004template.t
@@ -0,0 +1,126 @@
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code are the Bugzilla tests.
+#
+# The Initial Developer of the Original Code is Jacob Steenhagen.
+# Portions created by Jacob Steenhagen are
+# Copyright (C) 2001 Jacob Steenhagen. All
+# Rights Reserved.
+#
+# Contributor(s): Jacob Steenhagen <jake@acutex.net>
+#                 Zach Lipton <zach@zachlipton.com>
+#                 David D. Kilzer <ddkilzer@kilzer.net>
+#
+
+#################
+#Bugzilla Test 4#
+####Templates####
+
+use strict;
+
+use lib 't';
+
+use Support::Templates;
+
+# Bug 137589 - Disable command-line input of CGI.pm when testing
+use CGI qw(-no_debug);
+
+use File::Spec 0.82;
+use Template;
+use Test::More tests => (  scalar(@Support::Templates::referenced_files)
+                         + scalar(@Support::Templates::actual_files) * 2);
+
+# Capture the TESTOUT from Test::More or Test::Builder for printing errors.
+# This will handle verbosity for us automatically.
+my $fh;
+{
+    local $^W = 0;  # Don't complain about non-existent filehandles
+    if (-e \*Test::More::TESTOUT) {
+        $fh = \*Test::More::TESTOUT;
+    } elsif (-e \*Test::Builder::TESTOUT) {
+        $fh = \*Test::Builder::TESTOUT;
+    } else {
+        $fh = \*STDOUT;
+    }
+}
+
+my $include_path = $Support::Templates::include_path;
+
+# Check to make sure all templates that are referenced in
+# Bugzilla exist in the proper place.
+
+foreach my $file(@Support::Templates::referenced_files) {
+    my $path = File::Spec->catfile($include_path, $file);
+    if (-e $path) {
+        ok(1, "$path exists");
+    } else {
+        ok(0, "$path does not exist --ERROR");
+    }
+}
+
+# Processes all the templates to make sure they have good syntax
+my $template = Template->new(
+{
+    INCLUDE_PATH => $include_path ,
+    # Need to define filters used in the codebase, they don't
+    # actually have to function in this test, just be defined.
+    # See globals.pl for the actual codebase definitions.
+    FILTERS =>
+    {
+        html_linebreak => sub { return $_; },
+        js        => sub { return $_ } ,
+        strike    => sub { return $_ } ,
+        url_quote => sub { return $_ } ,
+    },
+}
+);
+
+open SAVEOUT, ">&STDOUT";     # stash the original output stream
+open SAVEERR, ">&STDERR";
+open STDOUT, "> /dev/null";   # discard all output
+open STDERR, "> /dev/null";
+foreach my $file(@Support::Templates::actual_files) {
+    my $path = File::Spec->catfile($include_path, $file);
+    if (-e $path) {
+        if ($template->process($file)) {
+            ok(1, "$file syntax ok");
+        }
+        else {
+            ok(0, "$file has bad syntax --ERROR");
+            print $fh $template->error() . "\n";
+        }
+    }
+    else {
+        ok(1, "$path doesn't exist, skipping test");
+    }
+}
+open STDOUT, ">&SAVEOUT";     # redirect back to original stream
+open STDERR, ">&SAVEERR";
+close SAVEOUT;
+close SAVEERR;
+
+# check to see that all templates have a version string:
+
+foreach my $file(@Support::Templates::actual_files) {
+    my $path = File::Spec->catfile($include_path, $file);
+    open(TMPL, $path);
+    my $firstline = <TMPL>;
+    if ($firstline =~ /\d+\.\d+\@[\w\.-]+/) {
+        ok(1,"$file has a version string");
+    } else {
+        ok(0,"$file does not have a version string --ERROR");
+    }
+    close(TMPL);
+}
+
+exit 0;
diff --git a/t/005no_tabs.t b/t/005no_tabs.t
new file mode 100644
index 000000000..31d584ae0
--- /dev/null
+++ b/t/005no_tabs.t
@@ -0,0 +1,54 @@
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code are the Bugzilla tests.
+#
+# The Initial Developer of the Original Code is Jacob Steenhagen.
+# Portions created by Jacob Steenhagen are
+# Copyright (C) 2001 Jacob Steenhagen. All
+# Rights Reserved.
+#
+# Contributor(s): Jacob Steenhagen <jake@acutex.net>
+#                 David D. Kilzer <ddkilzer@kilzer.net>
+#
+
+#################
+#Bugzilla Test 5#
+#####no_tabs#####
+
+use strict;
+
+use lib 't';
+
+use Support::Files;
+use Support::Templates;
+
+use File::Spec 0.82;
+use Test::More tests => (  scalar(@Support::Files::testitems)
+                         + scalar(@Support::Templates::actual_files));
+
+my @testitems = @Support::Files::testitems;
+my @templates = map(File::Spec->catfile($Support::Templates::include_path, $_),
+                    @Support::Templates::actual_files);
+push(@testitems, @templates);
+
+foreach my $file (@testitems) {
+    open (FILE, "$file");
+    if (grep /\t/, <FILE>) {
+        ok(0, "$file contains tabs --WARNING");
+    } else {
+        ok(1, "$file has no tabs");
+    }
+    close (FILE);
+}
+
+exit 0;
diff --git a/t/CVS/Entries b/t/CVS/Entries
index dba08dbc9..aa7c1f181 100644
--- a/t/CVS/Entries
+++ b/t/CVS/Entries
@@ -1,3 +1,6 @@
-/001compile.t/1.6.6.1/Sat Nov 17 07:41:55 2001//TBUGZILLA-2_14_5
-/003safesys.t/1.3.6.1/Sat Nov 17 07:41:57 2001//TBUGZILLA-2_14_5
+/001compile.t/1.8/Wed May  8 23:49:31 2002//TBUGZILLA-2_16
+/002goodperl.t/1.7/Wed May  8 23:49:31 2002//TBUGZILLA-2_16
+/003safesys.t/1.4/Wed May  8 23:49:31 2002//TBUGZILLA-2_16
+/004template.t/1.15.2.2/Fri Jul 19 14:04:12 2002//TBUGZILLA-2_16
+/005no_tabs.t/1.10/Wed May  8 23:49:32 2002//TBUGZILLA-2_16
 D/Support////
diff --git a/t/CVS/Tag b/t/CVS/Tag
index cc64cc0c3..f2ec6389c 100644
--- a/t/CVS/Tag
+++ b/t/CVS/Tag
@@ -1 +1 @@
-NBUGZILLA-2_14_5
+NBUGZILLA-2_16
diff --git a/t/Support/CVS/Entries b/t/Support/CVS/Entries
index 81b78e0fc..c28efeaf3 100644
--- a/t/Support/CVS/Entries
+++ b/t/Support/CVS/Entries
@@ -1,3 +1,4 @@
-/Files.pm/1.9.4.1/Sat Nov 17 07:41:59 2001//TBUGZILLA-2_14_5
-/Systemexec.pm/1.2.8.1/Sat Nov 17 07:41:59 2001//TBUGZILLA-2_14_5
+/Files.pm/1.9/Wed Oct 31 01:06:31 2001//TBUGZILLA-2_16
+/Systemexec.pm/1.2/Fri Oct 19 22:39:51 2001//TBUGZILLA-2_16
+/Templates.pm/1.9/Tue May  7 09:45:32 2002//TBUGZILLA-2_16
 D
diff --git a/t/Support/CVS/Tag b/t/Support/CVS/Tag
index cc64cc0c3..f2ec6389c 100644
--- a/t/Support/CVS/Tag
+++ b/t/Support/CVS/Tag
@@ -1 +1 @@
-NBUGZILLA-2_14_5
+NBUGZILLA-2_16
diff --git a/t/Support/Templates.pm b/t/Support/Templates.pm
new file mode 100644
index 000000000..07f46f700
--- /dev/null
+++ b/t/Support/Templates.pm
@@ -0,0 +1,92 @@
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code are the Bugzilla tests.
+#
+# The Initial Developer of the Original Code is Jacob Steenhagen.
+# Portions created by Jacob Steenhagen are
+# Copyright (C) 2001 Jacob Steenhagen. All
+# Rights Reserved.
+#
+# Contributor(s): Jacob Steenhagen <jake@acutex.net>
+#                 David D. Kilzer <ddkilzer@kilzer.net>
+#
+
+package Support::Templates;
+
+use diagnostics;
+use strict;
+
+use lib 't';
+use vars qw($include_path @referenced_files @actual_files);
+
+use Support::Files;
+
+use File::Find;
+use File::Spec 0.82;
+
+# Note that $include_path is assumed to only contain ONE path, not
+# a list of colon-separated paths.
+$include_path = File::Spec->catdir('template', 'en', 'default');
+@referenced_files = ();
+@actual_files = ();
+
+# Local subroutine used with File::Find
+sub find_templates {
+    # Prune CVS directories
+    if (-d $_ && $_ eq 'CVS') {
+        $File::Find::prune = 1;
+        return;
+    }
+
+    # Only include files ending in '.tmpl'
+    if (-f $_ && $_ =~ m/\.tmpl$/i) {
+        my $filename;
+        my $local_dir = File::Spec->abs2rel($File::Find::dir,
+                                            $File::Find::topdir);
+
+        if ($local_dir) {
+            $filename = File::Spec->catfile($local_dir, $_);
+        } else {
+            $filename = $_;
+        }
+
+        push(@actual_files, $filename);
+    }
+}
+
+# Scan the template include path for templates then put them in
+# in the @actual_files array to be used by various tests.
+map(find(\&find_templates, $_), split(':', $include_path));
+
+# Scan Bugzilla's perl code looking for templates used and put them
+# in the @referenced_files array to be used by the 004template.t test.
+my %seen;
+
+foreach my $file (@Support::Files::testitems) {
+    open (FILE, $file);
+    my @lines = <FILE>;
+    close (FILE);
+    foreach my $line (@lines) {
+        if ($line =~ m/template->process\(\"(.+?)\", .+?\)/) {
+            my $template = $1;
+            # Ignore templates with $ in the name, since they're
+            # probably vars, not real files
+            next if $template =~ m/\$/;
+            next if $seen{$template};
+            push (@referenced_files, $template);
+            $seen{$template} = 1;
+        }
+    }
+}
+
+1;
diff --git a/template/.cvsignore b/template/.cvsignore
new file mode 100644
index 000000000..2e42e1287
--- /dev/null
+++ b/template/.cvsignore
@@ -0,0 +1,3 @@
+.htaccess
+de
+es
diff --git a/template/CVS/Entries b/template/CVS/Entries
new file mode 100644
index 000000000..322cc0a40
--- /dev/null
+++ b/template/CVS/Entries
@@ -0,0 +1,2 @@
+/.cvsignore/1.3/Tue May  7 21:33:53 2002//TBUGZILLA-2_16
+D/en////
diff --git a/template/CVS/Entries.Log b/template/CVS/Entries.Log
new file mode 100644
index 000000000..27de40e52
--- /dev/null
+++ b/template/CVS/Entries.Log
@@ -0,0 +1,2 @@
+A D/default////
+R D/default////
diff --git a/template/CVS/Repository b/template/CVS/Repository
new file mode 100644
index 000000000..02f572838
--- /dev/null
+++ b/template/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template
diff --git a/template/CVS/Root b/template/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/CVS/Tag b/template/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/template/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/template/en/.cvsignore b/template/en/.cvsignore
new file mode 100644
index 000000000..73b23521a
--- /dev/null
+++ b/template/en/.cvsignore
@@ -0,0 +1,2 @@
+.htaccess
+custom
diff --git a/template/en/CVS/Entries b/template/en/CVS/Entries
new file mode 100644
index 000000000..a3ef794e0
--- /dev/null
+++ b/template/en/CVS/Entries
@@ -0,0 +1,2 @@
+/.cvsignore/1.1/Wed Apr 24 07:29:49 2002//TBUGZILLA-2_16
+D/default////
diff --git a/template/en/CVS/Repository b/template/en/CVS/Repository
new file mode 100644
index 000000000..96dbd4788
--- /dev/null
+++ b/template/en/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template/en
diff --git a/template/en/CVS/Root b/template/en/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/en/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/en/CVS/Tag b/template/en/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/template/en/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/template/en/default/CVS/Entries b/template/en/default/CVS/Entries
new file mode 100644
index 000000000..e620d0dbb
--- /dev/null
+++ b/template/en/default/CVS/Entries
@@ -0,0 +1,10 @@
+/index.html.tmpl/1.4.2.2/Sun Jun 23 17:36:05 2002//TBUGZILLA-2_16
+/sidebar.xul.tmpl/1.3.2.1/Wed Jul 10 00:05:58 2002//TBUGZILLA-2_16
+D/account////
+D/admin////
+D/attachment////
+D/bug////
+D/global////
+D/list////
+D/reports////
+D/search////
diff --git a/template/en/default/CVS/Entries.Log b/template/en/default/CVS/Entries.Log
new file mode 100644
index 000000000..8ecd675ef
--- /dev/null
+++ b/template/en/default/CVS/Entries.Log
@@ -0,0 +1,2 @@
+A D/request////
+R D/request////
diff --git a/template/en/default/CVS/Repository b/template/en/default/CVS/Repository
new file mode 100644
index 000000000..dc3d17b5a
--- /dev/null
+++ b/template/en/default/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template/en/default
diff --git a/template/en/default/CVS/Root b/template/en/default/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/en/default/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/en/default/CVS/Tag b/template/en/default/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/template/en/default/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/template/en/default/account/CVS/Entries b/template/en/default/account/CVS/Entries
new file mode 100644
index 000000000..3ee98f324
--- /dev/null
+++ b/template/en/default/account/CVS/Entries
@@ -0,0 +1,7 @@
+/cancel-token.txt.tmpl/1.1/Thu Apr 18 18:56:15 2002//TBUGZILLA-2_16
+/create.html.tmpl/1.3/Tue Apr 23 23:27:32 2002//TBUGZILLA-2_16
+/created.html.tmpl/1.4/Mon May  6 19:16:50 2002//TBUGZILLA-2_16
+/exists.html.tmpl/1.4.2.1/Thu May 23 08:13:49 2002//TBUGZILLA-2_16
+D/email////
+D/password////
+D/prefs////
diff --git a/template/en/default/account/CVS/Repository b/template/en/default/account/CVS/Repository
new file mode 100644
index 000000000..83af88fb4
--- /dev/null
+++ b/template/en/default/account/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template/en/default/account
diff --git a/template/en/default/account/CVS/Root b/template/en/default/account/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/en/default/account/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/en/default/account/CVS/Tag b/template/en/default/account/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/template/en/default/account/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/template/en/default/account/cancel-token.txt.tmpl b/template/en/default/account/cancel-token.txt.tmpl
new file mode 100644
index 000000000..b37d0da2d
--- /dev/null
+++ b/template/en/default/account/cancel-token.txt.tmpl
@@ -0,0 +1,39 @@
+[%# 1.0@bugzilla.org %]
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s):     John Vandenberg <zeroj@null.net>
+  #%]
+From: bugzilla-admin-daemon
+To: [% emailaddress %]
+Subject: [% tokentype %] token cancelled
+
+A token was cancelled from [% remoteaddress %].  
+If you did not request this, it could be either an honest 
+mistake or the result of a malicious hack attempt.  
+
+Take a look at the information below and forward this email 
+to [% maintainer %] if you suspect foul play.
+
+            Token: [% token %]
+       Token Type: [% tokentype %]
+             User: [% emailaddress %]
+       Issue Date: [% issuedate %]
+       Event Data: [% eventdata %]
+Cancelled Because: [% cancelaction %]
+
+
diff --git a/template/en/default/account/create.html.tmpl b/template/en/default/account/create.html.tmpl
new file mode 100644
index 000000000..da8979c91
--- /dev/null
+++ b/template/en/default/account/create.html.tmpl
@@ -0,0 +1,58 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[% PROCESS global/header.html.tmpl 
+  title = "Create a new Bugzilla account"
+%]
+
+<p>
+  To create a Bugzilla account, all that you need to do is to enter a
+  legitimate e-mail address.  The account will be created, and its
+  password will be mailed to you. Optionally you may enter your real name 
+  as well.
+</p>
+
+<form method="get" action="createaccount.cgi">
+  <table>
+    <tr>
+      <td align="right">
+        <b>E-mail address:</b>
+      </td>
+      <td>
+        <input size="35" name="login">
+        [% Param('emailsuffix') FILTER html %]
+      </td>
+    </tr>
+    
+    <tr>
+      <td align="right">
+        <b>Real name:</b>
+      </td>
+      <td>
+        <input size="35" name="realname">
+      </td>
+    </tr>
+  </table>
+  <br>
+  <input type="submit" value="Create Account">
+</form>
+
+[% PROCESS global/footer.html.tmpl %] 
diff --git a/template/en/default/account/created.html.tmpl b/template/en/default/account/created.html.tmpl
new file mode 100644
index 000000000..4a68b63fd
--- /dev/null
+++ b/template/en/default/account/created.html.tmpl
@@ -0,0 +1,42 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # login: string. The user's Bugzilla login email address.
+  #%]
+
+[% PROCESS global/header.html.tmpl 
+  title = "Account Created"
+%]
+
+<p>
+  A new account,  
+  <tt>[% login FILTER html %]</tt>,
+  has been created and a randomly-generated password has been e-mailed 
+  to that address.
+</p>
+
+<p>
+  When the e-mail arrives, 
+  <a href="query.cgi?GoAheadAndLogIn=1">log in here</a>.
+</p>
+
+[% PROCESS global/footer.html.tmpl %] 
diff --git a/template/en/default/account/email/CVS/Entries b/template/en/default/account/email/CVS/Entries
new file mode 100644
index 000000000..e222910d8
--- /dev/null
+++ b/template/en/default/account/email/CVS/Entries
@@ -0,0 +1,4 @@
+/change-new.txt.tmpl/1.3/Fri May  3 06:37:42 2002//TBUGZILLA-2_16
+/change-old.txt.tmpl/1.4/Mon May  6 19:16:46 2002//TBUGZILLA-2_16
+/confirm.html.tmpl/1.4.2.1/Thu May 23 08:13:51 2002//TBUGZILLA-2_16
+D
diff --git a/template/en/default/account/email/CVS/Repository b/template/en/default/account/email/CVS/Repository
new file mode 100644
index 000000000..1b7bcd50b
--- /dev/null
+++ b/template/en/default/account/email/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template/en/default/account/email
diff --git a/template/en/default/account/email/CVS/Root b/template/en/default/account/email/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/en/default/account/email/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/en/default/account/email/CVS/Tag b/template/en/default/account/email/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/template/en/default/account/email/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/template/en/default/account/email/change-new.txt.tmpl b/template/en/default/account/email/change-new.txt.tmpl
new file mode 100644
index 000000000..b07be609c
--- /dev/null
+++ b/template/en/default/account/email/change-new.txt.tmpl
@@ -0,0 +1,39 @@
+[%# 1.0@bugzilla.org %]
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s):     John Vandenberg <zeroj@null.net>
+  #%]
+[% expiration_ts = token_ts + (max_token_age * 86400) %]
+From: bugzilla-admin-daemon
+To: [% emailaddress %]
+Subject: Bugzilla Change Email Address Request
+
+Bugzilla has received a request to change the email address 
+for the [% oldemailaddress %] account to your address.
+
+To confirm the change, visit the following link:
+
+[% Param('urlbase') %]token.cgi?a=cfmem&t=[% token FILTER url_quote %]
+
+If you are not the person who made this request, or you wish to cancel
+this request, visit the following link:
+
+[% Param('urlbase') %]token.cgi?a=cxlem&t=[% token FILTER url_quote %]
+
+If you do nothing, the request will lapse after 
+[%- max_token_age %] days ([% time2str("%H:%M on the %o of %B, %Y", expiration_ts) %]).
diff --git a/template/en/default/account/email/change-old.txt.tmpl b/template/en/default/account/email/change-old.txt.tmpl
new file mode 100644
index 000000000..cd1334d3f
--- /dev/null
+++ b/template/en/default/account/email/change-old.txt.tmpl
@@ -0,0 +1,44 @@
+[%# 1.0@bugzilla.org %]
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s):     John Vandenberg <zeroj@null.net>
+  #%]
+[%# INTERFACE:
+  # emailaddress: string. The user's old Bugzilla login email address.
+  # newemailaddress: string. The user's new Bugzilla login email address.
+  # token: string. The token associated with this change.
+  #%]
+[% expiration_ts = token_ts + (max_token_age * 86400) %]
+From: bugzilla-admin-daemon
+To: [% emailaddress %]
+Subject: Bugzilla Change Email Address Request
+Importance: High
+X-MSMail-Priority: High
+X-Priority: 1
+
+Bugzilla has received a request to change the email address 
+for your account to [% newemailaddress %].
+
+If you are not the person who made this request, or you wish to cancel
+this request, visit the following link:
+
+[% Param('urlbase') %]token.cgi?a=cxlem&t=[% token FILTER url_quote %]
+
+If you do nothing, and [% newemailaddress %] confirms this request, the 
+change will be made permanent after 
+[%- max_token_age %] days ([% time2str("%H:%M on the %o of %B, %Y", expiration_ts) %]).
diff --git a/template/en/default/account/email/confirm.html.tmpl b/template/en/default/account/email/confirm.html.tmpl
new file mode 100644
index 000000000..140c54e0d
--- /dev/null
+++ b/template/en/default/account/email/confirm.html.tmpl
@@ -0,0 +1,47 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s):     John Vandenberg <zeroj@null.net>
+  #%]
+
+[%# INTERFACE:
+  # token: string. The token to be used in this address change.
+  #%]
+  
+[% PROCESS global/header.html.tmpl %]
+
+<p>
+  To change your email address, please enter the old email address:
+</p>
+
+<form method="post" action="token.cgi">
+  <input type="hidden" name="t" value="[% token FILTER html %]">
+  <input type="hidden" name="a" value="chgem">
+  <table>
+    <tr>
+      <th align="right">Old Email Address:</th>
+      <td><input type="input" name="email" size="36"></td>
+    </tr>
+    <tr>
+      <th align="right"> </th>
+      <td><input type="submit" value="Submit"></td>
+    </tr>
+  </table>
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/account/exists.html.tmpl b/template/en/default/account/exists.html.tmpl
new file mode 100644
index 000000000..3516dc7cc
--- /dev/null
+++ b/template/en/default/account/exists.html.tmpl
@@ -0,0 +1,38 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # login: string. The user's Bugzilla login email address.
+  #%]
+
+[% PROCESS global/header.html.tmpl 
+  title = "Account Exists"
+%]
+
+<form method="get" action="token.cgi">
+  <input type="hidden" name="a" value="reqpw">
+  <input type="hidden" name="loginname" value="[% login FILTER html %]">
+  A Bugzilla account for <tt>[% login FILTER html %]</tt> already exists. If you
+  are the account holder and have forgotten your password, 
+  <input type="submit" value="submit a request to change it">.
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/account/password/CVS/Entries b/template/en/default/account/password/CVS/Entries
new file mode 100644
index 000000000..ab1679f83
--- /dev/null
+++ b/template/en/default/account/password/CVS/Entries
@@ -0,0 +1,3 @@
+/forgotten-password.txt.tmpl/1.2/Fri May  3 06:37:47 2002//TBUGZILLA-2_16
+/set-forgotten-password.html.tmpl/1.3.2.1/Thu May 23 08:13:56 2002//TBUGZILLA-2_16
+D
diff --git a/template/en/default/account/password/CVS/Repository b/template/en/default/account/password/CVS/Repository
new file mode 100644
index 000000000..c0b31c7d7
--- /dev/null
+++ b/template/en/default/account/password/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template/en/default/account/password
diff --git a/template/en/default/account/password/CVS/Root b/template/en/default/account/password/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/en/default/account/password/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/en/default/account/password/CVS/Tag b/template/en/default/account/password/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/template/en/default/account/password/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/template/en/default/account/password/forgotten-password.txt.tmpl b/template/en/default/account/password/forgotten-password.txt.tmpl
new file mode 100644
index 000000000..bf3242c08
--- /dev/null
+++ b/template/en/default/account/password/forgotten-password.txt.tmpl
@@ -0,0 +1,38 @@
+[%# 1.0@bugzilla.org %]
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s):     John Vandenberg <zeroj@null.net>
+  #%]
+[% expiration_ts = token_ts + (max_token_age * 86400) %]
+From: bugzilla-admin-daemon
+To: [% emailaddress %]
+Subject:  Bugzilla Change Password Request
+
+You (or someone impersonating you) has requested to change your Bugzilla
+password.  To change your password, visit the following link:
+
+[%+ Param('urlbase') %]token.cgi?a=cfmpw&t=[% token FILTER url_quote %]
+
+If you are not the person who made this request, or you wish to cancel
+this request, visit the following link:
+
+[%+ Param('urlbase') %]token.cgi?a=cxlpw&t=[% token FILTER url_quote %]
+
+If you do nothing, the request will lapse after 
+[%- max_token_age %] days 
+([% time2str("%H:%M on the %o of %B, %Y", expiration_ts) -%]) or when you log in successfully.
diff --git a/template/en/default/account/password/set-forgotten-password.html.tmpl b/template/en/default/account/password/set-forgotten-password.html.tmpl
new file mode 100644
index 000000000..eaabf7dc4
--- /dev/null
+++ b/template/en/default/account/password/set-forgotten-password.html.tmpl
@@ -0,0 +1,55 @@
+<!-- 1.0@bugzilla.org -->
+ [%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[% PROCESS global/header.html.tmpl %]
+
+<p>
+  To change your password, enter a new password twice:
+</p>
+
+<form method="post" action="token.cgi">
+  <input type="hidden" name="t" value="[% token FILTER html %]">
+  <input type="hidden" name="a" value="chgpw">
+  <table>
+    <tr>
+      <th align="right">New Password:</th>
+      <td>
+        <input type="password" name="password" size="16" maxlength="16">
+      </td>
+    </tr>
+    
+    <tr>
+      <th align="right">New Password Again:</th>
+      <td>
+        <input type="password" name="matchpassword" size="16" maxlength="16">
+      </td>
+    </tr>
+    
+    <tr>
+      <th align="right">&nbsp;</th>
+      <td>
+        <input type="submit" value="Submit">
+      </td>
+    </tr>
+  </table>
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/account/prefs/CVS/Entries b/template/en/default/account/prefs/CVS/Entries
new file mode 100644
index 000000000..ea36789d8
--- /dev/null
+++ b/template/en/default/account/prefs/CVS/Entries
@@ -0,0 +1,6 @@
+/account.html.tmpl/1.1.2.1/Thu May 23 08:13:58 2002//TBUGZILLA-2_16
+/email.html.tmpl/1.1.2.3/Wed Jul 17 18:28:37 2002//TBUGZILLA-2_16
+/footer.html.tmpl/1.1.2.1/Thu May 23 08:13:59 2002//TBUGZILLA-2_16
+/permissions.html.tmpl/1.1.2.1/Thu May 23 08:13:59 2002//TBUGZILLA-2_16
+/prefs.html.tmpl/1.4.2.1/Thu May 23 08:14:00 2002//TBUGZILLA-2_16
+D
diff --git a/template/en/default/account/prefs/CVS/Repository b/template/en/default/account/prefs/CVS/Repository
new file mode 100644
index 000000000..271c63d90
--- /dev/null
+++ b/template/en/default/account/prefs/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template/en/default/account/prefs
diff --git a/template/en/default/account/prefs/CVS/Root b/template/en/default/account/prefs/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/en/default/account/prefs/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/en/default/account/prefs/CVS/Tag b/template/en/default/account/prefs/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/template/en/default/account/prefs/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/template/en/default/account/prefs/account.html.tmpl b/template/en/default/account/prefs/account.html.tmpl
new file mode 100644
index 000000000..798bb8e40
--- /dev/null
+++ b/template/en/default/account/prefs/account.html.tmpl
@@ -0,0 +1,99 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # realname: string. The user's real name, if any.
+  # login:    string. The user's Bugzilla login email address.
+  # login_change_date: string. The date the email change will be complete. (optional)
+  # new_login_name:    string. The user's new Bugzilla login whilst not confirmed. (optional)
+  #%]
+
+<table>
+  <tr>
+    <td colspan="3">
+      Please enter your existing password to confirm account changes.
+    </td>
+  </tr>
+  <tr>
+    <th align="right">Password:</th>
+    <td>
+      <input type="hidden" name="Bugzilla_login" 
+             value="[% login FILTER html %]">
+      <input type="password" name="Bugzilla_password">
+    </td>
+  </tr>              
+  <tr>
+    <td colspan="2"><hr></td>
+  </tr>
+
+  <tr>
+    <th align="right">New password:</th>
+    <td>
+      <input type="password" name="new_password1">
+    </td>
+  </tr>              
+
+  <tr>
+    <th align="right">Re-enter new password:</th>
+    <td>
+      <input type="password" name="new_password2">
+    </td>
+  </tr>              
+
+  <tr>
+    <th align="right">Your real name (optional, but encouraged):</th>
+    <td>
+      <input size="35" name="realname" value="[% realname FILTER html %]">
+    </td>
+  </tr>  
+
+  [% IF Param('allowemailchange') %]
+    [% IF login_change_date %]
+      [% IF new_login_name %]
+        <tr>
+          <th align="right">Pending email address:</th>
+          <td>[% new_login_name FILTER html %]</td>
+        </tr>
+        <tr>
+          <th align="right">Change request expires:</th>
+          <td>[% login_change_date %]</td>
+        </tr>
+      [% ELSE %]
+        <tr>
+          <th align="right">Confirmed email address:</th>
+          <td>[% login FILTER html %]
+        </tr>
+        <tr>
+          <th align="right">Completion date:</th>
+          <td>[% login_change_date %]</td>
+        </tr>
+      [% END %]
+    [% ELSE %]
+      <tr>
+        <th align="right">New email address:</th>
+        <td>
+          <input size="35" name="new_login_name">
+        </td>
+      </tr>
+    [% END %]
+  [% END %]
+  
+</table>
diff --git a/template/en/default/account/prefs/email.html.tmpl b/template/en/default/account/prefs/email.html.tmpl
new file mode 100644
index 000000000..5bf492017
--- /dev/null
+++ b/template/en/default/account/prefs/email.html.tmpl
@@ -0,0 +1,162 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # watchedusers: string. 
+  #               Comma-separated list of email addresses this user watches.
+  # excludeself:  boolean.
+  #               True if user is not receiving self-generated mail.
+  # <rolename>:   Multiple hashes, one for each rolename (e.g. owner; see 
+  #               below), keyed by reasonname (e.g. comments; again, see 
+  #               below). The value is a boolean - true if the user is 
+  #               receiving mail for that reason when in that role.
+  # Also references the 'supportwatchers' Param.
+  #%]
+
+[% useqacontact = Param('useqacontact') %]
+ 
+<table>
+  [% IF Param('supportwatchers') %]
+    <tr>
+      <td colspan="4">
+        <hr>
+      </td>
+    </tr>
+
+    <tr>
+      <td colspan="4">
+        If you want to help cover for someone when they're on vacation, or if
+        you need to do the QA related to all of their bugs, you can tell 
+        Bugzilla to send mail related to their bugs to you also.  List the 
+        email addresses of any users you wish to watch here, separated by
+        commas.
+      </td>
+    </tr>
+
+    <tr>
+      <th align="right">Users to watch:</th>
+      <td>
+        <input size="35" name="watchedusers" value="[% watchedusers %]">
+      </td>
+    </tr>
+  [% END %]
+
+  <tr>
+    <td colspan="2">
+      <p>
+        If you don't like getting a notification for "trivial"
+        changes to bugs, you can use the settings below to
+        filter some (or even all) notifications.
+      </p>
+    </td>
+  </tr>
+</table>
+
+<hr>
+
+<table>
+  <tr>
+    <td colspan="2">
+      <b>Global options:</b>
+    </td>
+  </tr>
+
+  <tr>
+    <td width="150"></td>
+    <td>
+      Only email me reports of changes made by other people
+      <input type="checkbox" name="ExcludeSelf" value="on"
+        [% " checked" IF excludeself %]>
+      <br>
+    </td>
+  </tr>
+</table>
+
+<hr>
+<b>Field/recipient specific options:</b>
+<br>
+<br>
+
+
+<table width="100%" border="1">
+  <tr>
+    <td colspan="[% useqacontact ? '5' : '4' %]" align="center" width="50%">
+      <b>When my relationship to this bug is:</b>
+    </td>
+    <td rowspan="2" width="50%">
+      <b>I want to receive mail when:</b>
+    </td>
+  </tr>
+
+  <tr>
+    <td align="center" width="10%">
+      <b>Reporter</b>
+    </td>
+    <td align="center" width="10%">
+      <b>Assignee</b>
+    </td>
+    [% IF useqacontact %]
+      <td align="center" width="10%">
+        <b>QA Contact</b>
+      </td>
+    [% END %]
+    <td align="center" width="10%">
+      <b>CC</b>
+    </td>
+    <td align="center" width="10%">
+      <b>Voter</b>
+    </td>
+  </tr>
+
+  [% FOREACH reason = [ 
+      { name = 'Removeme',    
+        description = 'I\'m added to or removed from this capacity' },
+      { name = 'Comments',    
+        description = 'New Comments are added' },
+      { name = 'Attachments', 
+        description = 'New Attachments are added' },
+      { name = 'Status',      
+        description = 'Priority, status, severity, and/or milestone changes' },
+      { name = 'Resolved',    
+        description = 'The bug is resolved or verified' },
+      { name = 'Keywords',    
+        description = 'Keywords field changes' },
+      { name = 'CC',          
+        description = 'CC field changes' },
+      { name = 'Other',       
+        description = 'Any field not mentioned above changes' } ] %]
+    <tr>
+      [% FOREACH role = [ "Reporter", "Owner", "QAcontact", "CClist", "Voter" ] 
+       %]
+        [% NEXT IF role == "QAcontact" AND NOT useqacontact %]
+        <td align="center">
+          <input type="checkbox" name="email[% role %][% reason.name %]" value="on"
+            [% " checked" IF $role.${reason.name} %]>
+        </td>
+      [% END %]
+      <td>
+        [% reason.description %]
+      </td>
+    </tr>
+  [% END %]
+</table>       
+
+<br>
diff --git a/template/en/default/account/prefs/footer.html.tmpl b/template/en/default/account/prefs/footer.html.tmpl
new file mode 100644
index 000000000..77ebd1e3a
--- /dev/null
+++ b/template/en/default/account/prefs/footer.html.tmpl
@@ -0,0 +1,76 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # mybugslink: boolean. True if the user wishes the My Bugs link to appear. 
+  # queries: array of hashes. May be empty. Each hash has two members:
+  #   name:   string. The name of the query.
+  #   footer: boolean. True if the query appears in the footer.
+  #%]
+ 
+<table>
+  <tr>
+    <th align="right">The 'My bugs' link:</th>
+    <td>
+      <select name="mybugslink">
+        <option value="1">should appear on the footer of every page</option>  
+        <option value="0" 
+          [% " selected" IF NOT mybugslink %]>should not be displayed
+        </option>  
+      </select>
+    </td>
+  </tr>    
+    
+  <input type="hidden" name="numqueries" value="[% queries.size %]">
+  [% IF queries.size %]
+    [% FOREACH query = queries %]
+      <tr>
+        <th align="right">Your query named '[% query.name FILTER html %]':</th>
+        <td>
+          <select name="query-[% loop.index %]">
+            <option value="0">should only appear in the query page</option>  
+            <option value="1" 
+              [% " selected" IF query.footer %]>
+              should appear on the footer of every page
+            </option>  
+          </select>
+        </td>
+      </tr>
+
+      <input type="hidden" name="name-[% loop.index %]" 
+             value="[% query.name FILTER html %]">
+    [% END %]
+
+  [% ELSE %]
+    <tr>
+      <td colspan="4">
+        <br>                            
+        If you create remembered queries using the 
+        <a href="query.cgi">query page</a>,
+        you can then come to this page and choose to have some of them  
+        appear in the footer of each Bugzilla page.
+        <br>
+        <br>
+      </td>
+    </tr>
+  [% END %]
+    
+</table>
diff --git a/template/en/default/account/prefs/permissions.html.tmpl b/template/en/default/account/prefs/permissions.html.tmpl
new file mode 100644
index 000000000..15bca6deb
--- /dev/null
+++ b/template/en/default/account/prefs/permissions.html.tmpl
@@ -0,0 +1,57 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # has_bits: array of strings. May be empty.
+  #           Descriptions of the permission bits the user has. 
+  # set_bits: array of strings. May be empty. 
+  #           Descriptions of the permission bits the user can set for 
+  #           other people.
+  #%]
+ 
+<table>
+  <tr>
+    <td>
+      [% IF has_bits.size %]
+        You have the following permission bits set on your account:
+        <ul>
+          [% FOREACH bit_description = has_bits %]
+            <li>[% bit_description %]</li>
+          [% END %]
+        </ul>
+      [% ELSE %]
+        There are no permission bits set on your account.
+      [% END %]
+
+      [% IF set_bits.size %]
+        And you can turn on or off the following bits for
+        <a href="editusers.cgi">other users</a>:
+        <p>
+          <ul>
+          [% FOREACH bit_description = set_bits %]
+            <li>[% bit_description %]</li>
+          [% END %]
+          </ul>
+        </p>
+      [% END %]
+    </td>
+  </tr>
+</table>
diff --git a/template/en/default/account/prefs/prefs.html.tmpl b/template/en/default/account/prefs/prefs.html.tmpl
new file mode 100644
index 000000000..2a232f875
--- /dev/null
+++ b/template/en/default/account/prefs/prefs.html.tmpl
@@ -0,0 +1,123 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # login: string. The user's Bugzilla login email address.
+  # tabs: List of hashes. May not be empty. Each hash has three members:
+  #   name: string. Name of the tab (used internally.)
+  #   description: string. Description of the tab (used in tab title.)
+  #   saveable: boolean. True if tab has a form which can be submitted.
+  #               True if user is not receiving self-generated mail.
+  # Note: For each tab name, a template "prefs/${tab.name}.tmpl" must exist, 
+  # and its interface must be fulfilled.
+  # current_tab: A direct reference to one of the hashes in the tabs list.
+  #              This tab will be displayed.
+  # changes_saved: boolean/string. True if the CGI processed form data before 
+  #                displaying anything, and can contain an optional custom
+  #                message if required (which Perl still evaluates as True).
+  #%]
+
+[% filtered_login = login FILTER html %]
+[% PROCESS global/header.html.tmpl
+   title = "User Preferences"
+   h2 = filtered_login
+   style = "td.selected_tab {
+              border-width: 2px 2px 0px;
+              border-style: solid; 
+            }
+            td.unselected_tab, td.spacer {
+              border-width: 0px 0px 2px 0px;
+              border-style: solid; 
+            }"
+ %]
+
+[% tabs = [ { name => "account", description => "Account settings", 
+              saveable => "1" },
+            { name => "email", description => "Email settings", 
+              saveable => "1" },
+            { name => "footer", description => "Page footer", 
+              saveable => "1" },
+            { name => "permissions", description => "Permissions", 
+              saveable => "0" } ] %]
+
+<center>
+  <table cellspacing="0" cellpadding="10" border="0" width="100%">
+    <tr>
+      <td class="spacer">&nbsp;</td>
+ 
+      [% FOREACH tab = tabs %]
+        [% IF tab.name == current_tab_name %]
+          [% current_tab = tab %]
+          <td align="center" bgcolor="lightblue" class="selected_tab">
+            [% tab.description %]
+          </td>
+        [% ELSE %]
+          <td align="center" bgcolor="#BBBBEE" class="unselected_tab">
+            <a href="userprefs.cgi?tab=[% tab.name %]">[% tab.description %]</a>
+          </td>
+        [% END %]
+       [% END %]
+ 
+       <td class="spacer">&nbsp;</td>
+     </tr>
+   </table>
+</center>
+
+[% IF changes_saved %]
+  <p>
+    <font color="red">
+      The changes to your 
+      [% current_tab.description FILTER lower %] have been saved.
+    </font>
+  </p>
+  [% IF changes_saved != 1 %]
+    <p>
+      [% changes_saved %]
+    </p>
+  [% END %]
+[% END %]
+
+<h3>[% current_tab.description %]</h3>
+
+<form method="post">
+  <input type="hidden" name="tab" value="[% current_tab.name %]">
+
+  [% PROCESS "account/prefs/${current_tab.name}.html.tmpl" IF current_tab.name.defined %]
+
+  [% IF current_tab.saveable %]
+    <input type="hidden" name="dosave" value="1">
+
+    <table>
+      <tr>
+        <td width="150"></td>
+        <td>
+          <input type="submit" value="Submit Changes">
+         </td>
+      </tr>
+    </table>
+  [% END %]
+  
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
+
+    
+    
diff --git a/template/en/default/admin/CVS/Entries b/template/en/default/admin/CVS/Entries
new file mode 100644
index 000000000..7066ef54e
--- /dev/null
+++ b/template/en/default/admin/CVS/Entries
@@ -0,0 +1 @@
+D/attachstatus////
diff --git a/template/en/default/admin/CVS/Entries.Log b/template/en/default/admin/CVS/Entries.Log
new file mode 100644
index 000000000..b7cf2b248
--- /dev/null
+++ b/template/en/default/admin/CVS/Entries.Log
@@ -0,0 +1,2 @@
+A D/request-type////
+R D/request-type////
diff --git a/template/en/default/admin/CVS/Repository b/template/en/default/admin/CVS/Repository
new file mode 100644
index 000000000..7f721fe47
--- /dev/null
+++ b/template/en/default/admin/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template/en/default/admin
diff --git a/template/en/default/admin/CVS/Root b/template/en/default/admin/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/en/default/admin/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/en/default/admin/CVS/Tag b/template/en/default/admin/CVS/Tag
new file mode 100644
index 000000000..445ba5a94
--- /dev/null
+++ b/template/en/default/admin/CVS/Tag
@@ -0,0 +1 @@
+TBUGZILLA-2_16
diff --git a/template/en/default/admin/attachstatus/CVS/Entries b/template/en/default/admin/attachstatus/CVS/Entries
new file mode 100644
index 000000000..2f8d2a093
--- /dev/null
+++ b/template/en/default/admin/attachstatus/CVS/Entries
@@ -0,0 +1,5 @@
+/create.html.tmpl/1.3/Tue Apr 23 23:27:26 2002//TBUGZILLA-2_16
+/delete.html.tmpl/1.3/Tue Apr 23 23:27:25 2002//TBUGZILLA-2_16
+/edit.html.tmpl/1.4/Mon May  6 19:16:58 2002//TBUGZILLA-2_16
+/list.html.tmpl/1.4/Mon May  6 19:16:58 2002//TBUGZILLA-2_16
+D
diff --git a/template/en/default/admin/attachstatus/CVS/Repository b/template/en/default/admin/attachstatus/CVS/Repository
new file mode 100644
index 000000000..4207d5695
--- /dev/null
+++ b/template/en/default/admin/attachstatus/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template/en/default/admin/attachstatus
diff --git a/template/en/default/admin/attachstatus/CVS/Root b/template/en/default/admin/attachstatus/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/en/default/admin/attachstatus/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/en/default/admin/attachstatus/CVS/Tag b/template/en/default/admin/attachstatus/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/template/en/default/admin/attachstatus/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/template/en/default/admin/attachstatus/create.html.tmpl b/template/en/default/admin/attachstatus/create.html.tmpl
new file mode 100644
index 000000000..baf8cbc49
--- /dev/null
+++ b/template/en/default/admin/attachstatus/create.html.tmpl
@@ -0,0 +1,77 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+[% PROCESS global/header.html.tmpl 
+  title = "Create Attachment Status"
+  style = "
+    th { text-align: right; vertical-align: top; }
+    td { text-align: left; vertical-align: top; }
+  "
+%]
+
+<form method="post" action="editattachstatuses.cgi">
+  <input type="hidden" name="action" value="insert">
+  <input type="hidden" name="id" value="[% id %]">
+
+  <table cellspacing="0" cellpadding="4" border="0">
+    <tr>
+      <th>Name:</th>
+      <td>
+        <input type="text" name="name" size="50" maxlength="50">
+      </td>
+    </tr>
+
+    <tr>
+      <th>Description:</th>
+      <td>
+        <textarea name="desc" rows="4" cols="50"></textarea>
+      </td>
+    </tr>
+
+    <tr>
+      <th>Sort Key:</th>
+      <td>
+        <input type="text" name="sortkey" size="5" maxlength="5">
+      </td>
+    </tr>
+
+    <tr>
+      <th>Product:</th>
+      <td>
+        <select name="product">
+          [% FOREACH item = products %]
+            <option value="[% item FILTER html %]">[% item FILTER html %]</option>
+          [% END %]
+        </select>
+      </td>
+    </tr>
+
+    <tr>
+      <th></th>
+      <td>
+        <input type="submit" value="Add">
+      </td>
+    </tr>
+
+  </table>
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/attachstatus/delete.html.tmpl b/template/en/default/admin/attachstatus/delete.html.tmpl
new file mode 100644
index 000000000..e92b97985
--- /dev/null
+++ b/template/en/default/admin/attachstatus/delete.html.tmpl
@@ -0,0 +1,55 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #                 Jeff Hedlund <jeff.hedlund@matrixsi.com>
+  #%]
+
+[%# Filter off the name here to be used multiple times below %]
+[% name = name FILTER html %]
+
+[% PROCESS global/header.html.tmpl 
+  title = "Confirm Delete of Attachment Status '$name'" 
+%]
+
+<p>
+   [% attachcount %] attachments have the status '[% name %]'. If you delete
+   it, those attachments will lose this status.
+</p>
+
+<table>
+   <tr>
+      <td colspan=2>
+         Do you really want to delete this status?
+      </td>
+   </tr>
+   <tr>
+      <td>
+         <a href="editattachstatuses.cgi?action=delete&id=[% id %]">
+            Yes, delete
+         </a>
+      </td>
+      <td align="right">
+         <a href="editattachstatuses.cgi">
+            No, don't delete
+         </a>
+      </td>
+   </tr>
+</table>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/attachstatus/edit.html.tmpl b/template/en/default/admin/attachstatus/edit.html.tmpl
new file mode 100644
index 000000000..3c2fc2b90
--- /dev/null
+++ b/template/en/default/admin/attachstatus/edit.html.tmpl
@@ -0,0 +1,81 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+[%# INTERFACE:
+  # name: string. The name of the attachment status we are editing.
+  # desc: string. Its description.
+  # sortkey: integer. Where it's sorted in the list.
+  # product: string. Which product it applies to.
+  # id: integer. Its internal ID number.
+  #%]
+
+[% PROCESS global/header.html.tmpl 
+  title = "Edit Attachment Status"
+  style = "
+    th { text-align: right; vertical-align: top; }
+    td { text-align: left; vertical-align: top; }
+  "
+%]
+
+<form method="post" action="editattachstatuses.cgi">
+  <input type="hidden" name="action" value="update">
+  <input type="hidden" name="id" value="[% id %]">
+
+  <table cellspacing="0" cellpadding="4" border="0">
+    <tr>
+      <th>Name:</th>
+      <td>
+        <input type="text" name="name" value="[% name FILTER html %]" size="50" maxlength="50">
+      </td>
+    </tr>
+
+    <tr>
+      <th>Description:</th>
+      <td>
+        <textarea name="desc" rows="4" cols="50">[% desc FILTER html %]</textarea>
+      </td>
+    </tr>
+
+    <tr>
+      <th>Sort Key:</th>
+      <td>
+        <input type="text" name="sortkey" value="[% sortkey %]" size="5" maxlength="5">
+      </td>
+    </tr>
+
+    <tr>
+      <th>Product:</th>
+      <td>
+        [% product FILTER html %]
+      </td>
+    </tr>
+
+    <tr>
+      <th></th>
+      <td>
+        <input type="submit" value="Update">
+      </td>
+    </tr>
+
+  </table>
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/attachstatus/list.html.tmpl b/template/en/default/admin/attachstatus/list.html.tmpl
new file mode 100644
index 000000000..67d5640ae
--- /dev/null
+++ b/template/en/default/admin/attachstatus/list.html.tmpl
@@ -0,0 +1,99 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+[%# INTERFACE:
+  # statusdefs: list of hashes. may be empty. Each hash has six members:
+  #   name: string. The name of the attachment status.
+  #   description: string. Its description.
+  #   sortkey: integer. Sorting priority.
+  #   product: string. The product to which the attachment status applies.
+  #   id: integer. Its internal ID number.
+  #   attachcount: integer. How many attachments have that status.
+  #%]
+
+[% PROCESS global/header.html.tmpl 
+  title = 'Administer Attachment Statuses'
+  message = message
+  style = "
+    th { text-align: left; }
+  "
+%]
+
+<table cellspacing="0" cellpadding="4" border="1">
+
+  <tr>
+    <th>Name</th>
+    <th>Description</th>
+    <th>Sort Key</th>
+    <th>Product</th>
+    <th>Action(s)</th>
+  </tr>
+
+  [% FOREACH statusdef = statusdefs %]
+
+    <tr>
+      <td>[% statusdef.name FILTER html %]</td>
+      <td>[% statusdef.description FILTER html %]</td>
+      <td>[% statusdef.sortkey %]</td>
+      <td>[% statusdef.product FILTER html %]</td>
+      <td>
+        <a href="editattachstatuses.cgi?action=edit&id=[% statusdef.id %]">
+            Edit</a>
+        &nbsp;|&nbsp;
+        <a href="editattachstatuses.cgi?action=confirmdelete&id=[% statusdef.id %]" 
+         onclick="return confirmDelete([% statusdef.attachcount %],
+                                       '[% statusdef.name FILTER js %]',
+                                       [% statusdef.id %]);">
+            Delete</a>
+      </td>
+    </tr>
+
+  [% END %]
+
+  <tr>
+    <td colspan="4"></td>
+    <td>
+      <a href="editattachstatuses.cgi?action=create">Create</a>
+    </td>
+  </tr>
+
+</table>
+<script language="JavaScript">
+  function confirmDelete(attachcount, name, id)
+  {
+    if (attachcount > 0) {
+        msg = attachcount + ' attachments have the status ' +
+              name + '.  If you delete it, those attachments ' +
+              'will lose this status.  Do you really want to ' +
+              'delete this status?';
+    }
+    else {
+        msg = 'Are you sure you want to delete attachment status ' +
+              name + '?';
+    }
+    if (confirm(msg)) {
+      location.href = "editattachstatuses.cgi?action=delete&id=" + id;
+    }
+    return false;
+  }
+</script>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/attachment/CVS/Entries b/template/en/default/attachment/CVS/Entries
new file mode 100644
index 000000000..385a2a9c8
--- /dev/null
+++ b/template/en/default/attachment/CVS/Entries
@@ -0,0 +1,8 @@
+/content-types.html.tmpl/1.1/Thu Apr 18 18:56:29 2002//TBUGZILLA-2_16
+/create.html.tmpl/1.5.2.2/Tue Jun  4 22:56:38 2002//TBUGZILLA-2_16
+/created.html.tmpl/1.4.2.1/Thu May 23 08:14:02 2002//TBUGZILLA-2_16
+/edit.html.tmpl/1.4.2.2/Tue Jun 11 09:27:21 2002//TBUGZILLA-2_16
+/list.html.tmpl/1.1/Thu Apr 18 18:56:30 2002//TBUGZILLA-2_16
+/show-multiple.html.tmpl/1.3.2.1/Thu May 23 08:14:03 2002//TBUGZILLA-2_16
+/updated.html.tmpl/1.4.2.1/Thu May 23 08:14:03 2002//TBUGZILLA-2_16
+D
diff --git a/template/en/default/attachment/CVS/Repository b/template/en/default/attachment/CVS/Repository
new file mode 100644
index 000000000..c02ae519c
--- /dev/null
+++ b/template/en/default/attachment/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template/en/default/attachment
diff --git a/template/en/default/attachment/CVS/Root b/template/en/default/attachment/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/en/default/attachment/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/en/default/attachment/CVS/Tag b/template/en/default/attachment/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/template/en/default/attachment/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/template/en/default/attachment/content-types.html.tmpl b/template/en/default/attachment/content-types.html.tmpl
new file mode 100644
index 000000000..4e7cafc47
--- /dev/null
+++ b/template/en/default/attachment/content-types.html.tmpl
@@ -0,0 +1,27 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+          <option value="text/plain">plain text (text/plain)</option>
+          <option value="text/html">HTML source (text/html)</option>
+          <option value="image/gif">GIF image (image/gif)</option>
+          <option value="image/jpeg">JPEG image (image/jpeg)</option>
+          <option value="image/png">PNG image (image/png)</option>
+          <option value="application/octet-stream">binary file (application/octet-stream)</option>
diff --git a/template/en/default/attachment/create.html.tmpl b/template/en/default/attachment/create.html.tmpl
new file mode 100644
index 000000000..15f2e9e22
--- /dev/null
+++ b/template/en/default/attachment/create.html.tmpl
@@ -0,0 +1,130 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+[%# Define strings that will serve as the title and header of this page %]
+[% title = BLOCK %]Create New Attachment for Bug #[% bugid %][% END %]
+[% h1 = BLOCK %]Create New Attachment for <a href="show_bug.cgi?id=[% bugid %]">Bug #[% bugid %]</a>[% END %]
+[% h2 = BLOCK %][% bugsummary FILTER html %][% END %]
+
+[% PROCESS global/header.html.tmpl 
+  title = title
+  h1 = h1
+  h2 = h2
+  style = "
+    th { text-align: right; vertical-align: baseline; white-space: nowrap; }
+    td { text-align: left; vertical-align: baseline; padding-bottom: 5px; }
+  "
+  onload="setContentTypeDisabledState();"
+%]
+
+<form name="entryform" method="post" action="attachment.cgi" enctype="multipart/form-data">
+  <input type="hidden" name="bugid" value="[% bugid %]">
+  <input type="hidden" name="action" value="insert">
+   
+  <table>
+    <tr>
+      <th>File:</th>
+      <td>
+        <em>Enter the path to the file on your computer.</em><br>
+        <input type="file" name="data" size="50">
+      </td>
+    </tr>
+    <tr>
+      <th>Description:</th>
+      <td>
+        <em>Describe the attachment briefly.</em><br>
+        <input type="text" name="description" size="60" maxlength="200">
+      </td>
+    </tr>
+    <tr>
+      <th></th>
+      <td>
+      </td>
+    </tr>
+    <tr>
+      <th>Content Type:</th>
+      <td>
+        <em>If the attachment is a patch, check the box below.</em><br>
+        <input type="checkbox" name="ispatch" value="1" onchange="setContentTypeDisabledState();"> patch<br><br>
+
+        <em>Otherwise, choose a method for determining the content type.</em><br>
+        <input type="radio" name="contenttypemethod" value="autodetect"> 
+          auto-detect<br>
+        <input type="radio" name="contenttypemethod" value="list"> 
+          select from list: <select name="contenttypeselection" onchange="this.form.contenttypemethod[1].checked = true;">
+            [% PROCESS "attachment/content-types.html.tmpl" %]
+          </select><br>
+        <input type="radio" name="contenttypemethod" value="manual">
+          enter manually: <input type="text" name="contenttypeentry" size="30" maxlength="200" onchange="if (this.value) this.form.contenttypemethod[2].checked = true;">
+      </td>
+    </tr>
+    <tr>
+      <th>Obsoletes:</th>
+      <td>
+        <em>(optional) Check each existing attachment made obsolete by your new attachment.</em><br>
+        [% IF attachments.size %]
+          [% FOREACH attachment = attachments %]
+            <input type="checkbox" name="obsolete" value="[% attachment.id %]">
+            <a href="attachment.cgi?id=[% attachment.id %]&amp;action=edit">[% attachment.id %]: [% attachment.description FILTER html %]</a><br>
+          [% END %]
+        [% ELSE %]
+            [no attachments can be made obsolete]
+        [% END %]
+      </td>
+    </tr>
+    <tr>
+      <th>Comment:</th>
+      <td>
+        <em>(optional) Add a comment about this attachment to the bug.</em><br>
+        <textarea wrap="soft" name="comment" rows="6" cols="80"></textarea>
+      </td>
+    </tr>
+    <tr>
+      <th>&nbsp;</th>
+      <td><input type="submit" value="Submit"></td>
+    </tr>
+  </table>
+
+</form>
+
+<script language="JavaScript" type="text/javascript">
+  <!--
+  function setContentTypeDisabledState() 
+  {
+    var entryform = document.entryform;
+
+    var isdisabled = false;
+    if (entryform.ispatch.checked) 
+      isdisabled = true;
+
+    for (var i=0 ; i<entryform.contenttypemethod.length ; i++)
+      entryform.contenttypemethod[i].disabled = isdisabled;
+
+    entryform.contenttypeselection.disabled = isdisabled;
+    entryform.contenttypeentry.disabled = isdisabled;
+  }
+  //-->
+</script>
+
+[% PROCESS global/footer.html.tmpl %]
+
+
+
diff --git a/template/en/default/attachment/created.html.tmpl b/template/en/default/attachment/created.html.tmpl
new file mode 100644
index 000000000..56e71ccba
--- /dev/null
+++ b/template/en/default/attachment/created.html.tmpl
@@ -0,0 +1,66 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+[%# INTERFACE:
+  # bugid: integer. ID of the bug we just attached an attachment to.
+  # attachid: integer. ID of the attachment just created.
+  # description: string. Description of the attachment just created.
+  # contenttype: string. The Content Type we attached it as.
+  # contenttypemethod: string. How we got the content type of the attachment.
+  #  Possible values: autodetect, list, manual.
+  # mailresults: string. who was mailed, and who wasn't.
+  #%]
+  
+[% PROCESS global/header.html.tmpl 
+  title = "Changes Submitted"
+  style = "th { text-align: left; }"
+%]
+
+<table border="1">
+  <tr>
+    <td>
+      <h2>
+        <a title="[% description FILTER html %]" href="attachment.cgi?id=[% attachid %]&amp;action=edit">Attachment #[% attachid %]</a> 
+        to <a href="show_bug.cgi?id=[% bugid %]">Bug #[% bugid %]</a> Created
+      </h2>
+
+      [% mailresults %]
+
+      [% IF contenttypemethod == 'autodetect' %]
+        <p>
+          <b>Note:</b> Bugzilla automatically detected the content type
+          <em>[% contenttype %]</em> for this attachment.  If this is 
+          incorrect, correct the value by 
+          <a href="attachment.cgi?id=[% attachid %]&amp;action=edit">editing the attachment</a>.
+        </p>
+      [% END %]
+    </td>
+    <td>
+      <a href="show_bug.cgi?id=[% bugid %]">Go back to bug #[% bugid %]</a>
+    </td>
+  </tr>
+</table>
+
+<p>
+<a href="attachment.cgi?bugid=[% bugid %]&amp;action=enter">Create Another Attachment to Bug #[% bugid %]</a>
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/attachment/edit.html.tmpl b/template/en/default/attachment/edit.html.tmpl
new file mode 100644
index 000000000..873f73b59
--- /dev/null
+++ b/template/en/default/attachment/edit.html.tmpl
@@ -0,0 +1,226 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+[%# Define strings that will serve as the title and header of this page %]
+[% title = BLOCK %]Edit Attachment #[% attachid %] for Bug #[% bugid %][% END %]
+[% h1 = BLOCK %]Edit Attachment #[% attachid %] for <a href="show_bug.cgi?id=[% bugid %]">Bug #[% bugid %]</a>[% END %]
+[% h2 = BLOCK %][% bugsummary FILTER html %][% END %]
+
+[% PROCESS global/header.html.tmpl 
+  title = title
+  h1 = h1
+  h2 = h2
+  style = "
+    th { text-align: right; vertical-align: top; }
+    td { text-align: left; vertical-align: top; }
+    td#info { text-align: right; vertical-align: top; }
+    td#actions { text-align: right; vertical-align: bottom; }
+    td#noview { text-align: left; vertical-align: center; }
+  "
+%]
+
+<script type="application/x-javascript" language="JavaScript">
+  <!--
+  function editAsComment()
+    {
+      // Get the content of the document as a string.
+      var viewFrame = document.getElementById('viewFrame');
+      var aSerializer = new XMLSerializer();
+      var contentDocument = viewFrame.contentDocument;
+      var theContent = aSerializer.serializeToString(contentDocument);
+
+      // If this is a plaintext document, remove cruft that Mozilla adds
+      // because it treats it as an HTML document with a big PRE section.
+      // http://bugzilla.mozilla.org/show_bug.cgi?id=86012
+      var contentType = '[% contenttype %]';
+      if ( contentType == 'text/plain' )
+        {
+          theContent = theContent.replace( /^<html><head\/><body><pre>/i , "" );
+          theContent = theContent.replace( /<\/pre><\/body><\/html>$/i , "" );
+          theContent = theContent.replace( /&lt;/gi , "<" );
+          theContent = theContent.replace( /&gt;/gi , ">" );
+          theContent = theContent.replace( /&amp;/gi , "&" );
+        }
+
+      // Add mail-style quote indicators (>) to the beginning of each line.
+      // ".*\n" matches lines that end with a newline, while ".+" matches
+      // the rare situation in which the last line of a file does not end
+      // with a newline.
+      theContent = theContent.replace( /(.*\n|.+)/g , ">$1" );
+
+      hideElementById('viewFrame');
+      hideElementById('editButton');
+      hideElementById('smallCommentFrame');
+
+      showElementById('undoEditButton');
+
+      // Show the TEXTAREA that will contain the editable attachment
+      // and copy the content of the attachment into it.
+      showElementById('editFrame');
+
+      var editFrame = document.getElementById('editFrame');
+      editFrame.value = theContent;
+      editFrame.value += "\n\n";
+    }
+  function undoEditAsComment()
+    {
+      // Hide the "edit attachment as comment" TEXTAREA and the "undo" button.
+      hideElementById('undoEditButton');
+      hideElementById('editFrame');
+
+      // Show the "view attachment" IFRAME, the "redo" button that allows the user
+      // to go back to editing the attachment as a comment, and the small comment field.
+      showElementById('viewFrame');
+      showElementById('redoEditButton');
+      showElementById('smallCommentFrame');
+
+    }
+  function redoEditAsComment()
+    {
+      // Hide the "view attachment" IFRAME, the "redo" button that allows the user
+      // to go back to editing the attachment as a comment, and the small comment field.
+      hideElementById('viewFrame');
+      hideElementById('redoEditButton');
+      hideElementById('smallCommentFrame');
+
+      // Show the "edit attachment as comment" TEXTAREA and the "undo" button.
+      showElementById('undoEditButton');
+      showElementById('editFrame');
+    }
+
+  function hideElementById(id)
+  {
+    var elm = document.getElementById(id);
+    if (elm) {
+      elm.style.display = 'none';
+    }
+  }
+
+  function showElementById(id, val)
+  {
+    var elm = document.getElementById(id);
+    if (elm) {
+      if (!val) val = 'inline';
+      elm.style.display = val;
+    }
+  }
+
+  function normalizeComments()
+  {
+    // Remove the unused comment field from the document so its contents
+    // do not get transmitted back to the server.
+
+    var small = document.getElementById('smallCommentFrame');
+    var big = document.getElementById('editFrame');
+    if ( small.style.display == 'none' )
+    {
+      small.parentNode.removeChild(small);
+    }
+    if ( big.style.display == 'none' )
+    {
+      big.parentNode.removeChild(big);
+    }
+  }
+  //-->
+</script>
+
+<form method="post" action="attachment.cgi" onsubmit="normalizeComments();">
+  <input type="hidden" name="id" value="[% attachid %]">
+  <input type="hidden" name="action" value="update">
+  <input type="hidden" name="contenttypemethod" value="manual">
+
+  <table width="100%">
+
+    <tr>
+      <td width="25%">
+        <small>
+        <b>Description:</b><br>
+          <textarea rows="3" cols="25" name="description" wrap="soft">[% description FILTER html %]</textarea><br>
+
+        <b>MIME Type:</b><br>
+          <input type="text" size="20" name="contenttypeentry" value="[% contenttype FILTER html %]"><br>
+
+        <b>Flags:</b><br>
+          <input type="checkbox" name="ispatch" value="1"[% " checked" IF ispatch %]>patch
+          <input type="checkbox" name="isobsolete" value="1"[% " checked" IF isobsolete %]>obsolete<br>
+
+        [% IF statusdefs.size %]
+          <b>Status:</b><br>
+            [% FOREACH def = statusdefs %]
+                <input type="checkbox" name="status" value="[% def.id %]"[% " checked" IF statuses.${def.id} %]>[% def.name FILTER html %]<br>
+            [% END %]
+        [% END %]
+
+        <div id="smallCommentFrame">
+          <b>Comment (on the bug):</b><br>
+            <textarea name="comment" rows="5" cols="25" wrap="soft"></textarea><br>
+        </div>
+
+        <input type="submit" value="Submit">
+
+        </small>
+      </td>
+
+      [% IF isviewable %]
+        <td width="75%">
+          <textarea id="editFrame" name="comment" style="height: 400px; width: 100%; display: none;" cols="80" wrap="soft"></textarea>
+          <iframe id="viewFrame" src="attachment.cgi?id=[% attachid %]&amp;action=view" style="height: 400px; width: 100%;">
+            <b>You cannot view the attachment while editing it because your browser does not support IFRAMEs.
+            <a href="attachment.cgi?id=[% attachid %]&amp;action=view">View the attachment on a separate page</a>.</b>
+          </iframe>
+          <script type="application/x-javascript" language="JavaScript">
+            <!--
+            if (typeof document.getElementById == "function") {
+              document.write('<button type="button" id="editButton" onclick="editAsComment();">Edit Attachment As Comment</button>');
+              document.write('<button type="button" id="undoEditButton" onclick="undoEditAsComment();" style="display: none;">Undo Edit As Comment</button>');
+              document.write('<button type="button" id="redoEditButton" onclick="redoEditAsComment();" style="display: none;">Redo Edit As Comment</button>');
+            }
+            //-->
+          </script>
+        </td>
+      [% ELSE %]
+        <td id="noview" width="50%">
+          <p><b>
+            Attachment cannot be viewed because its MIME type is not either text/*, image/*, or application/vnd.mozilla.*.
+            <a href="attachment.cgi?id=[% attachid %]&amp;action=view">Download the attachment instead</a>.
+          </b></p>
+        </td>
+      [% END %]
+
+    </tr>
+
+  </table>
+
+  Attachments on this Bug:
+  [% FOREACH a = attachments %]
+    [% IF a == attachid %]
+      #[% a %]
+    [% ELSE %]
+      <a href="attachment.cgi?id=[% a %]&amp;action=edit">#[% a %]</a>
+    [% END %]
+    [% " |" UNLESS loop.last() %]
+  [% END %]
+
+</form>
+
+<br>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/attachment/list.html.tmpl b/template/en/default/attachment/list.html.tmpl
new file mode 100644
index 000000000..5bc5217c9
--- /dev/null
+++ b/template/en/default/attachment/list.html.tmpl
@@ -0,0 +1,81 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+<br>
+<table cellspacing="0" cellpadding="4" border="1">
+  <tr>
+    <th bgcolor="#cccccc" align="left">Attachment</th>
+    <th bgcolor="#cccccc" align="left">Type</th>
+    <th bgcolor="#cccccc" align="left">Modified</th>
+    <th bgcolor="#cccccc" align="left">Status</th>
+    <th bgcolor="#cccccc" align="left">Actions</th>
+  </tr>
+
+  [% FOREACH attachment = attachments %]
+    <tr>
+      <td valign="top">
+        [% IF attachment.isobsolete %]
+          <strike><a href="attachment.cgi?id=[% attachment.attachid %]&amp;action=view">[% attachment.description FILTER html %]</a></strike>
+        [% ELSE %]
+          <a href="attachment.cgi?id=[% attachment.attachid %]&amp;action=view">[% attachment.description FILTER html %]</a> 
+        [% END %]
+      </td>
+
+      <td valign="top">
+        [% IF attachment.ispatch %]
+          <i>patch</i>
+        [% ELSE %]
+          [% attachment.contenttype FILTER html %]
+        [% END %]
+      </td>
+
+      <td valign="top">[% attachment.date %]</td>
+
+      <td valign="top">
+        [% IF attachment.statuses.size == 0 %]
+          <i>none</i>
+        [% ELSE %]
+          [% FOREACH s = attachment.statuses %]
+            [% s FILTER html FILTER replace('\s', '&nbsp;') %]<br>
+          [% END %]
+        [% END %]
+      </td>
+
+      <td valign="top">
+        [% IF attachment.canedit %]
+          <a href="attachment.cgi?id=[% attachment.attachid %]&amp;action=edit">Edit</a>
+        [% ELSE %]
+          None
+        [% END %]
+      </td>
+    </tr>
+  [% END %]
+
+  <tr>
+    <td colspan="4">
+      <a href="attachment.cgi?bugid=[% bugid %]&amp;action=enter">Create a New Attachment</a> (proposed patch, testcase, etc.)
+    </td>
+    <td colspan="1">
+      <a href="attachment.cgi?bugid=[% bugid %]&amp;action=viewall">View All</a>
+    </td>
+  </tr>
+</table>
+<br>
diff --git a/template/en/default/attachment/show-multiple.html.tmpl b/template/en/default/attachment/show-multiple.html.tmpl
new file mode 100644
index 000000000..b3c05f2e2
--- /dev/null
+++ b/template/en/default/attachment/show-multiple.html.tmpl
@@ -0,0 +1,98 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+[% filtered_summary = bugsummary FILTER html %]
+[% PROCESS global/header.html.tmpl 
+  title = "View All Attachments for Bug #$bugid"
+  h1 = "View All Attachments for <a href=\"show_bug.cgi?id=$bugid\">Bug #$bugid</a>"
+  h2 = filtered_summary
+  style = "
+    th { text-align: right; vertical-align: top; }
+    td { text-align: left; vertical-align: top; }
+    td#info { text-align: right; vertical-align: top; }
+    td#actions { text-align: right; vertical-align: bottom; }
+  "
+%]
+
+<br>
+
+[% FOREACH a = attachments %]
+
+  <div align="center">
+  <table cellspacing="0" cellpadding="4" border="1" width="75%">
+    <tr>
+      <td valign="top" bgcolor="#cccccc" colspan="5">
+        <big><b>Attachment #[% a.attachid %]</b></big>
+      </td>
+    </tr>
+    <tr>
+      <td valign="top">
+        [% IF a.isobsolete %]
+          <strike>[% a.description FILTER html %]</strike>
+        [% ELSE %]
+          [% a.description FILTER html %]
+        [% END %]
+      </td>
+
+      <td valign="top">
+        [% IF a.ispatch %]
+          <i>patch</i>
+        [% ELSE %]
+          [% a.contenttype FILTER html %]
+        [% END %]
+      </td>
+
+      <td valign="top">[% a.date %]</td>
+
+      <td valign="top">
+        [% IF a.statuses.size == 0 %]
+          <i>none</i>
+        [% ELSE %]
+          [% FOREACH s = a.statuses %]
+            [% s FILTER html FILTER replace('\s', '&nbsp;') %]<br>
+          [% END %]
+        [% END %]
+      </td>
+
+      <td valign="top">
+        <a href="attachment.cgi?id=[% a.attachid %]&amp;action=edit">Edit</a> 
+      </td>
+    </tr>
+  </table>
+
+  [% IF a.isviewable %]
+    <iframe src="attachment.cgi?id=[% a.attachid %]&amp;action=view" width="75%" height="350">
+      <b>You cannot view the attachment on this page because your browser does not support IFRAMEs.
+      <a href="attachment.cgi?id=[% a.attachid %]&amp;action=view">View the attachment on a separate page</a>.</b>
+    </iframe>
+  [% ELSE %]
+    <p><b>
+      Attachment cannot be viewed because its MIME type is not text/*, image/*, or application/vnd.mozilla.*.
+      <a href="attachment.cgi?id=[% a.attachid %]&action=view">Download the attachment instead</a>.
+    </b></p>
+  [% END %]
+  </div>
+
+  <br><br>
+
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/attachment/updated.html.tmpl b/template/en/default/attachment/updated.html.tmpl
new file mode 100644
index 000000000..2c7ceb24d
--- /dev/null
+++ b/template/en/default/attachment/updated.html.tmpl
@@ -0,0 +1,52 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #                 Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # bugid: integer. ID of the bug we are updating.
+  # attachid: integer. ID of the attachment we just attached.
+  # mailresults: string. Who was mailed and who wasn't. 
+  #%]
+  
+[% PROCESS global/header.html.tmpl 
+  title = "Changes Submitted"
+  style = "th { text-align: left; }"
+%]
+
+<hr>
+
+<table border="1">
+  <tr>
+    <td>
+      <h2>Changes to 
+        <a href="attachment.cgi?id=[% attachid %]&amp;action=edit">attachment [% attachid %]</a>
+        of bug [% bugid %] submitted
+      </h2>
+      [% mailresults %]
+    </td>
+
+    <td>
+      <a href="show_bug.cgi?id=[% bugid %]">Back to Bug #[% bugid %]</a>
+    </td>
+  </tr>
+</table>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/CVS/Entries b/template/en/default/bug/CVS/Entries
new file mode 100644
index 000000000..442125127
--- /dev/null
+++ b/template/en/default/bug/CVS/Entries
@@ -0,0 +1,12 @@
+/choose-xml.html.tmpl/1.4.2.1/Thu May 23 08:14:05 2002//TBUGZILLA-2_16
+/choose.html.tmpl/1.3/Tue Apr 23 23:27:50 2002//TBUGZILLA-2_16
+/comments.html.tmpl/1.1.2.1/Sat Jun 22 21:03:21 2002//TBUGZILLA-2_16
+/dependency-graph.html.tmpl/1.5.2.1/Thu May 23 08:14:05 2002//TBUGZILLA-2_16
+/dependency-tree.html.tmpl/1.4.2.1/Mon May 13 06:24:20 2002//TBUGZILLA-2_16
+/edit.html.tmpl/1.7.2.5/Tue Jul  9 01:17:59 2002//TBUGZILLA-2_16
+/navigate.html.tmpl/1.1.2.1/Thu May  9 23:15:05 2002//TBUGZILLA-2_16
+/show-multiple.html.tmpl/1.3.2.1/Thu May 23 08:14:05 2002//TBUGZILLA-2_16
+D/activity////
+D/create////
+D/process////
+D/votes////
diff --git a/template/en/default/bug/CVS/Repository b/template/en/default/bug/CVS/Repository
new file mode 100644
index 000000000..a46334b52
--- /dev/null
+++ b/template/en/default/bug/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template/en/default/bug
diff --git a/template/en/default/bug/CVS/Root b/template/en/default/bug/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/en/default/bug/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/en/default/bug/CVS/Tag b/template/en/default/bug/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/template/en/default/bug/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/template/en/default/bug/activity/CVS/Entries b/template/en/default/bug/activity/CVS/Entries
new file mode 100644
index 000000000..e04b9995d
--- /dev/null
+++ b/template/en/default/bug/activity/CVS/Entries
@@ -0,0 +1,3 @@
+/show.html.tmpl/1.3.2.1/Thu May 23 08:14:07 2002//TBUGZILLA-2_16
+/table.html.tmpl/1.1/Thu Apr 18 18:56:38 2002//TBUGZILLA-2_16
+D
diff --git a/template/en/default/bug/activity/CVS/Repository b/template/en/default/bug/activity/CVS/Repository
new file mode 100644
index 000000000..315cc7c92
--- /dev/null
+++ b/template/en/default/bug/activity/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template/en/default/bug/activity
diff --git a/template/en/default/bug/activity/CVS/Root b/template/en/default/bug/activity/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/en/default/bug/activity/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/en/default/bug/activity/CVS/Tag b/template/en/default/bug/activity/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/template/en/default/bug/activity/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/template/en/default/bug/activity/show.html.tmpl b/template/en/default/bug/activity/show.html.tmpl
new file mode 100644
index 000000000..2e44f89fd
--- /dev/null
+++ b/template/en/default/bug/activity/show.html.tmpl
@@ -0,0 +1,43 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # bug_id: integer. The bug ID.
+  #
+  # This template also needs to be called with the interface to the
+  # activity.html.tmpl template fulfilled.
+  #%]
+ 
+[% PROCESS global/header.html.tmpl 
+  title = "Changes made to bug $bug_id"
+  h1 = "Activity log"
+  h2 = "Bug <a href=\"show_bug.cgi?id=$bug_id\">$bug_id</a>"
+ %]
+
+<br>
+
+[% PROCESS bug/activity/table.html.tmpl %]
+
+<p>
+  <a href="show_bug.cgi?id=[% bug_id %]">Back to bug [% bug_id %]</a>
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/activity/table.html.tmpl b/template/en/default/bug/activity/table.html.tmpl
new file mode 100644
index 000000000..43529bd23
--- /dev/null
+++ b/template/en/default/bug/activity/table.html.tmpl
@@ -0,0 +1,91 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # operations: array of hashes. May be empty. Each has has three members:
+  #   who: string. who performed the operation
+  #   when: string. when they performed it
+  #   changes: hash. Details of what they changed. This hash has three 
+  #            compulsory and one optional member:
+  #     field: string. The name of the field
+  #     removed: string. What was removed from the field
+  #     added: string. What was added to the field
+  #     attach_id: integer. If the change was adding an attachment, its id.
+  # incomplete_data: boolean. True if some of the data is incomplete (because
+  #                  it was affected by an old Bugzilla bug.)
+  #%]
+ 
+[% IF incomplete_data %]
+  <p>
+    There used to be a bug Bugzilla which caused activity data
+    to be lost if there was a large number of cc's or dependencies.  That
+    has been fixed, however, there was some data already lost on this bug
+    that could not be regenerated.  The changes that the script could not
+    reliably determine are prefixed by '?'.
+  </p>
+[% END %]
+
+[% IF operations.size > 0 %]
+  <table border cellpadding="4">
+    <tr>
+      <th>Who</th>
+      <th>When</th>
+      <th>What</th>
+      <th>Removed</th>
+      <th>Added</th>
+    </tr>
+
+    [% FOREACH operation = operations %]     
+      <tr>
+        <td rowspan="[% operation.changes.size %]" valign="top">
+          [% operation.who %]
+        </td>
+        <td rowspan="[% operation.changes.size %]" valign="top">
+          [% operation.when %]
+        </td>
+        [% FOREACH change = operation.changes %]
+          [% "</tr><tr>" IF loop.index > 0 %]
+            <td>
+              [% IF change.attachid %]
+                <a href="attachment.cgi?id=[% change.attachid %]&amp;action=view">
+                Attachment #[% change.attachid %]</a>         
+              [% END %]
+              [% change.field %]
+            </td>
+            <td>
+              [% IF change.removed %]
+                [% change.removed FILTER html %]
+              [% ELSE %]
+                &nbsp;
+              [% END %]
+            </td>
+            <td>
+              [% IF change.added %]
+                [% change.added FILTER html %]
+              [% ELSE %]
+                &nbsp;
+              [% END %]
+            </td>
+        [% END %]
+      </tr>
+    [% END %]
+  </table>
+[% END %]
diff --git a/template/en/default/bug/choose-xml.html.tmpl b/template/en/default/bug/choose-xml.html.tmpl
new file mode 100644
index 000000000..045ad7c58
--- /dev/null
+++ b/template/en/default/bug/choose-xml.html.tmpl
@@ -0,0 +1,51 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # This template has no interface.
+  #%]
+  
+[% PROCESS global/header.html.tmpl 
+   title = "Display bugs as XML"
+ %]
+
+<form method="get" action="xml.cgi">
+  <table>
+    <tr>
+      <td>
+        Display bugs as XML by entering a list of bug numbers here:
+      </td>
+      <td>
+        <input name="id" size="30">
+        <input type="submit" value="Display as XML">
+      </td>
+    </tr>
+    
+    <tr>
+      <td>&nbsp;</td>
+      <td>
+        (e.g. 1000, 2467, 852)
+      </td>
+    </tr>
+  </table>
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/choose.html.tmpl b/template/en/default/bug/choose.html.tmpl
new file mode 100644
index 000000000..a9a62567c
--- /dev/null
+++ b/template/en/default/bug/choose.html.tmpl
@@ -0,0 +1,36 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[% UNLESS header_done %]
+  [% PROCESS global/header.html.tmpl 
+     title = "Search by bug number"
+   %]
+[% END %]
+
+<form method="get" action="show_bug.cgi">
+  <p>
+    You may find a single bug by entering its bug id here:
+    <input name="id" size="6">
+    <input type="submit" value="Show Me This Bug">
+  </p>
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/comments.html.tmpl b/template/en/default/bug/comments.html.tmpl
new file mode 100644
index 000000000..f1f8e762e
--- /dev/null
+++ b/template/en/default/bug/comments.html.tmpl
@@ -0,0 +1,53 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[% DEFAULT start_at = 0 %]
+[% count = 0 %]
+[% FOREACH comment = comments %]
+  [% IF count >= start_at %]
+    [% PROCESS a_comment %]
+  [% END %]
+  
+  [% count = count + 1 %]
+[% END %]
+
+
+[%############################################################################%]
+[%# Block for individual comments                                            #%]
+[%############################################################################%]
+
+[% BLOCK a_comment %]
+  [% IF count > 0 %]
+    <br>
+    <i>------- Additional Comment
+      <a name="c[% count %]" href="#c[% count %]">#[% count %]</a> From 
+      <a href="mailto:[% comment.email FILTER html %]">[% comment.name FILTER html %]</a>
+      [%+ comment.time %] -------
+    </i>
+  [% END %]
+    
+[%# Don't indent the <pre> block, since then the spaces are displayed in the
+  # generated HTML
+  #%]
+<pre>
+  [%- quoteUrls(comment.body) -%]
+</pre>
+[% END %]
diff --git a/template/en/default/bug/create/CVS/Entries b/template/en/default/bug/create/CVS/Entries
new file mode 100644
index 000000000..02f867eab
--- /dev/null
+++ b/template/en/default/bug/create/CVS/Entries
@@ -0,0 +1,6 @@
+/comment.txt.tmpl/1.2/Mon May  6 19:17:06 2002//TBUGZILLA-2_16
+/create.html.tmpl/1.6.2.4/Sun Jun 30 04:24:51 2002//TBUGZILLA-2_16
+/created.html.tmpl/1.4/Wed May  1 19:00:46 2002//TBUGZILLA-2_16
+/make-template.html.tmpl/1.3/Tue Apr 23 23:27:48 2002//TBUGZILLA-2_16
+/user-message.html.tmpl/1.1.2.1/Wed Jun  5 03:42:23 2002//TBUGZILLA-2_16
+D
diff --git a/template/en/default/bug/create/CVS/Repository b/template/en/default/bug/create/CVS/Repository
new file mode 100644
index 000000000..bf9e51710
--- /dev/null
+++ b/template/en/default/bug/create/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template/en/default/bug/create
diff --git a/template/en/default/bug/create/CVS/Root b/template/en/default/bug/create/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/en/default/bug/create/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/en/default/bug/create/CVS/Tag b/template/en/default/bug/create/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/template/en/default/bug/create/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/template/en/default/bug/create/comment.txt.tmpl b/template/en/default/bug/create/comment.txt.tmpl
new file mode 100644
index 000000000..595ad3a80
--- /dev/null
+++ b/template/en/default/bug/create/comment.txt.tmpl
@@ -0,0 +1,26 @@
+[%# 1.0@bugzilla.org %]
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+[%# INTERFACE:
+  # form: hash. This is the $::FORM variable from a bug submission (i.e. the
+  # fields on a template from enter_bug.cgi.) It can be used to pull out 
+  # various custom fields and format an initial Description entry from them. 
+  #%]  
+[% form.comment %]
diff --git a/template/en/default/bug/create/create.html.tmpl b/template/en/default/bug/create/create.html.tmpl
new file mode 100644
index 000000000..259f2ea8e
--- /dev/null
+++ b/template/en/default/bug/create/create.html.tmpl
@@ -0,0 +1,260 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #                 Ville Skytt� <ville.skytta@iki.fi>
+  #%]
+
+[% PROCESS global/header.html.tmpl
+  title = "Enter Bug"
+  h2 = "This page lets you enter a new bug into Bugzilla."
+%]
+
+<form method="post" action="post_bug.cgi">
+<input type="hidden" name="product" value="[% product FILTER html %]">
+
+<table cellspacing="2" cellpadding="0" border="0">
+
+  <tr>
+    <td><br></td>
+  </tr>
+
+  <tr>
+    <td></td>
+    <td colspan="3">
+    [%# Migration note: The following file corresponds to the old Param
+      # 'entryheaderhtml'
+      #%]
+    [% INCLUDE 'bug/create/user-message.html.tmpl' %]
+    </td>
+  </tr>
+  
+  <tr>
+    <td><br></td>
+  </tr>
+
+  <tr>
+    <td align="right" valign="top"><strong>Reporter:</strong></td>
+    <td valign="top">[% reporter FILTER html %]</td>
+    
+    <td align="right" valign="top"><strong>Product:</strong></td>
+    <td valign="top">[% product FILTER html %]</td>
+  </tr>
+  
+  [%# We can't use the select block in these two cases for various reasons. %]
+  <tr>
+    <td align="right" valign="top">
+      <strong>Version:</strong>
+    </td>
+    <td>
+      <select name="version" size="5">
+        [%- FOREACH v = version %]
+          <option value="[% v FILTER html %]"
+            [% " selected=\"selected\"" IF v == default.version %]>[% v FILTER html -%]
+          </option>
+        [%- END %]
+      </select>
+    </td>  
+    
+    <td align="right" valign="top">
+      <strong>
+        <a href="describecomponents.cgi?product=[% product FILTER url_quote %]">
+          Component</a>:
+      </strong>
+    </td>
+    <td>
+      <select name="component" size="5">
+        [%- FOREACH c = component_ %]
+          <option value="[% c.name FILTER html %]"
+            [% " selected=\"selected\"" IF c.name == default.component_ %]>
+            [% c.name FILTER html -%]
+          </option>
+        [%- END %]
+      </select>
+    </td>  
+  </tr>
+  
+  <tr>
+    <td>&nbsp;</td>
+    <td colspan="3"></td>
+  </tr>
+  
+  <tr>
+    [% sel = { description => 'Platform', name => 'rep_platform' } %]
+    [% INCLUDE select %]
+    
+    [% sel = { description => 'OS', name => 'op_sys' } %]
+    [% INCLUDE select %]
+  </tr>
+  
+  <tr>  
+  [% IF Param('letsubmitterchoosepriority') %]
+    [% sel = { description => 'Priority', name => 'priority' } %]
+    [% INCLUDE select %]
+  [% ELSE %]
+    <input type="hidden" name="priority" value="[% default.priority %]">
+  [% END %]
+
+  [% sel = { description => 'Severity', name => 'bug_severity' } %]
+  [% INCLUDE select %]    
+  </tr>
+  
+  <tr>
+    <td>&nbsp;</td>
+    <td colspan="3"></td>
+  </tr>
+
+[% IF bug_status.size > 1 %] 
+  <tr>
+    [% sel = { description => 'Initial State', name => 'bug_status' } %]
+    [% INCLUDE select %]
+    
+    <td colspan="2"></td>
+  </tr>
+[% ELSE %]
+  <input type="hidden" name="bug_status" value="[% default.bug_status %]">  
+[% END %]
+
+  <tr>
+    <td align="right">
+      <strong>
+        <a href="bug_status.html#assigned_to">Assigned To</a>:
+      </strong>
+    </td>
+    <td colspan="3">
+      <input name="assigned_to" size="32" 
+             value="[% assigned_to FILTER html %]">
+      (Leave blank to assign to default component owner)
+    </td>
+  </tr>
+  
+  <tr>
+    <td align="right"><strong>Cc:</strong></td>
+    <td colspan="3">
+      <input name="cc" size="45" value="[% cc FILTER html %]">
+    </td>
+  </tr>
+  
+  <tr>
+    <td>&nbsp;</td>
+    <td colspan="3"></td>
+  </tr>
+
+  <tr>
+    <td align="right"><strong>URL:</strong></td>
+    <td colspan="3">
+      <input name="bug_file_loc" size="60" 
+             value="[% bug_file_loc FILTER html %]">
+    </td>
+  </tr>
+  
+  <tr>
+    <td align="right"><strong>Summary:</strong></td>
+    <td colspan="3">
+      <input name="short_desc" size="60" value="[% short_desc FILTER html %]">
+    </td>
+  </tr>
+  
+  <tr><td align="right" valign="top"><strong>Description:</strong></td>
+    <td colspan="3">
+      <textarea wrap="hard" name="comment" rows="10" cols="80">
+        [% comment FILTER html %]</textarea>
+      <br>
+    </td>
+  </tr>
+  
+  <tr>
+    <td></td>
+    <td colspan="3">
+    [% IF group.size %]
+      <br>
+        <strong>
+          Only users in all of the selected groups can view this bug:
+        </strong>
+      <br>
+      <font size="-1">
+        (Leave all boxes unchecked to make this a public bug.)
+      </font>
+      <br>
+      <br>
+
+      <!-- Checkboxes -->
+      [% FOREACH g = group %]
+        &nbsp;&nbsp;&nbsp;&nbsp;
+        <input type="checkbox" name="bit-[% g.bit %]" value="1"
+          [% " checked=\"checked\"" IF g.checked %]>[% g.description %]<br>
+      [% END %]
+      <br>
+    [% END %]
+    </td>
+  </tr>
+  
+  <tr>
+    <td></td>
+    <td colspan="3">
+      <input type="submit" value="    Commit    " 
+             onclick="if (this.form.short_desc.value == '') 
+             { alert('Please enter a summary sentence for this bug.'); 
+               return false; } return true;">
+      &nbsp;&nbsp;&nbsp;&nbsp;
+      <input type="submit" name="maketemplate" 
+             value="Remember values as bookmarkable template">
+    </td>
+  </tr>
+
+[% IF Param('usebrowserinfo') %]
+  <tr>
+    <td></td>
+    <td colspan="3">
+      <br>
+      We've made a guess at your operating system and platform. 
+      Please check them and, if we got it wrong, email 
+      [% Param('maintainer') %].
+    </td>
+  </tr>
+[% END %]
+
+  </table>
+  <input type="hidden" name="form_name" value="enter_bug">
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
+
+[%############################################################################%]
+[%# Block for SELECT fields                                                  #%]
+[%############################################################################%]
+
+[% BLOCK select %]
+  [% IF sel.description %]
+  <td align="right">
+    <strong>
+      <a href="bug_status.html#[% sel.name %]">[% sel.description %]</a>:
+    </strong>
+  </td>
+  [% END %]
+  
+  <td>
+    <select name="[% sel.name %]">
+    [%- FOREACH x = ${sel.name} %]
+      <option value="[% x FILTER html %]"
+        [% " selected=\"selected\"" IF x == default.${sel.name} %]>[% x FILTER html -%]
+      </option>
+    [%- END %]
+    </select>
+  </td>
+[% END %]
diff --git a/template/en/default/bug/create/created.html.tmpl b/template/en/default/bug/create/created.html.tmpl
new file mode 100644
index 000000000..0264413a7
--- /dev/null
+++ b/template/en/default/bug/create/created.html.tmpl
@@ -0,0 +1,30 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[% PROCESS global/header.html.tmpl 
+  title = "Bug $id Submitted"
+%]
+
+[% PROCESS bug/process/results.html.tmpl %]
+
+<br>
+
+[%# post_bug.cgi will add a copy of the filed bug below here %]
diff --git a/template/en/default/bug/create/make-template.html.tmpl b/template/en/default/bug/create/make-template.html.tmpl
new file mode 100644
index 000000000..1e2495ff8
--- /dev/null
+++ b/template/en/default/bug/create/make-template.html.tmpl
@@ -0,0 +1,33 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[% PROCESS global/header.html.tmpl 
+  title = "Bookmarks are your friend"
+  h1 = "Template constructed"
+%]
+
+<p>
+If you bookmark <a href="enter_bug.cgi?[% url %]">this link</a>,
+going to the bookmark will bring up the enter bug page with the fields
+initialized as you've requested.
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/create/user-message.html.tmpl b/template/en/default/bug/create/user-message.html.tmpl
new file mode 100644
index 000000000..d17ea6df0
--- /dev/null
+++ b/template/en/default/bug/create/user-message.html.tmpl
@@ -0,0 +1,34 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Matthew Tuck <matty@chariot.net.au>
+  #%]
+
+[%# Migration note: this file corresponds to the old Param
+  # 'entryheaderhtml'
+  #%]
+
+[%# You can make the output of this template product-specific by using
+  # Template Toolkit IF statements.  The current product name is stored in
+  # the 'product' variable.
+  #%]
+
+Before reporting a bug, please read the <a href="bugwritinghelp.html">
+bug writing guidelines</a>, please look at the list of
+<a href="duplicates.cgi">most frequently reported bugs</a>, and please
+<a href="query.cgi">search</a> for the bug.
diff --git a/template/en/default/bug/dependency-graph.html.tmpl b/template/en/default/bug/dependency-graph.html.tmpl
new file mode 100644
index 000000000..8206a847b
--- /dev/null
+++ b/template/en/default/bug/dependency-graph.html.tmpl
@@ -0,0 +1,106 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # bug_id: integer. The number of the bug(s).
+  # multiple_bugs: boolean. True if bug_id contains > 1 bug number.
+  # doall: boolean. True if we are displaying every bug in the database.
+  # showsummary: boolean. True if we are showing bug summaries.
+  # rankdir: string. "TB" if we are ranking top-to-bottom, 
+                     "LR" if left-to-right.
+  # image_url: string. The URL of the graphic showing the dependencies.
+  # map_url: string. The URL of the map file for the image.  (Optional)
+  # image_map: string. The image map for the graphic showing the 
+                       dependencies. (Optional)
+  #%]
+
+[% title = "Dependency Graph"
+   h1 = title
+ %]
+ 
+[% IF NOT multiple_bugs AND NOT doall %]
+  [% title = "$title for bug $bug_id"
+     h1 = "$h1 for bug <a href=\"show_bug.cgi?id=$bug_id\">$bug_id</a>" 
+   %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl %]
+
+[% image_map %]
+
+<p>
+  Green circles represent open bugs.
+</p>
+
+[% IF image_map %]
+  <img src="[% image_url %]" usemap="#imagemap"> 
+[% ELSE %]
+  <a href="[% map_url %]">
+    <img src="[% image_url %]" ismap="ismap"> 
+  </a>
+[% END %]
+
+<hr>
+
+<form>
+  <table>
+    <tr>
+      <td>
+        Bug numbers:
+        <input name="id" value="[% bug_id %]">
+      </td>
+    </tr>
+    
+    <tr>
+      <td>
+        <input type="checkbox" name="doall" 
+        [% " checked" IF doall %]>
+        Show <b>every</b> bug in the system with dependencies
+      </td>
+    </tr>
+    
+    <tr>
+      <td colspan="3">
+        <input type="checkbox" name="showsummary" 
+          [% " checked" IF showsummary %]>
+        Show the summaries of all displayed bugs
+      </td>
+    </tr>
+    
+    <tr>
+      <td colspan="3">
+        <select name="rankdir">
+          <option value="TB"
+            [% " selected" IF rankdir == "TB" %]>
+            Orient top-to-bottom
+          </option>
+          <option value="LR"
+            [% " selected" IF rankdir == "LR" %]>
+            Orient left-to-right
+          </option>
+        </select>
+      </td>
+    </tr>
+  </table>
+  <input type="submit" value="Change Parameters">
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/dependency-tree.html.tmpl b/template/en/default/bug/dependency-tree.html.tmpl
new file mode 100644
index 000000000..98c0ec254
--- /dev/null
+++ b/template/en/default/bug/dependency-tree.html.tmpl
@@ -0,0 +1,198 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  # 
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Tobias Burnus <burnus@net-b.de>
+  #                 Ville Skytt� <ville.skytta@iki.fi>
+  #                 Myk Melez <myk@mozilla.org>
+  #%]
+
+[% PROCESS global/header.html.tmpl 
+   title = "Dependency tree for Bug $bugid"
+   h1    = "Dependency tree for <a href=\"show_bug.cgi?id=$bugid\">bug $bugid</a>"
+   style = "strike { background-color: #d9d9d9; color: #000000; }"
+%]
+
+[% PROCESS depthControlToolbar %]
+
+[%# Display the tree of bugs that this bug depends on. %]
+<h3>[% hide_resolved ? "Open b" : "B" %]ugs that <a href="show_bug.cgi?id=[% bugid %]">bug [% bugid %]</a> depends on</h3>
+[% IF dependson_ids.size > 0 %]
+  (
+  [% IF maxdepth -%]Up to [% maxdepth %] level[% "s" IF maxdepth > 1 %] deep | [% END %]
+  <a href="buglist.cgi?bug_id=[% dependson_ids.join(",") %]">view as bug list</a>
+  [% IF canedit && dependson_ids.size > 1 %]
+    | <a href="buglist.cgi?bug_id=[% dependson_ids.join(",") %]&amp;tweak=1">change several</a>
+  [% END %])
+  [% INCLUDE display_tree tree=dependson_tree bug_id=bugid %]
+[% ELSE %]
+  </h3>
+  <p>None</p>
+[% END %]
+
+[%# Display the tree of bugs that this bug blocks. %]
+<h3>[% hide_resolved ? "Open b" : "B" %]ugs that <a href="show_bug.cgi?id=[% bugid %]">bug [% bugid %]</a> blocks</h3>
+[% IF blocked_ids.size > 0 %]
+  (
+  [% IF maxdepth -%]Up to [% maxdepth %] level[% "s" IF maxdepth > 1 %] deep | [% END %]
+  <a href="buglist.cgi?bug_id=[% blocked_ids.join(",") %]">view as bug list</a>
+  [% IF canedit && blocked_ids.size > 1 %]
+    | <a href="buglist.cgi?bug_id=[% blocked_ids.join(",") %]&amp;tweak=1">change several</a>
+  [% END %])
+  [% INCLUDE display_tree tree=blocked_tree bug_id=bugid %]
+[% ELSE %]
+  </h3>
+  <p>None</p>
+[% END %]
+
+[% PROCESS depthControlToolbar %]
+
+[% PROCESS global/footer.html.tmpl %]
+
+
+[%###########################################################################%]
+[%# Block to display a tree                                                 #%]
+[%###########################################################################%]
+
+[% BLOCK display_tree %]
+[% tree.$bug_id.seen = 1 %]
+<ul>
+  [% FOREACH dep_id = tree.$bug_id.dependencies %]
+    [% dep = tree.$dep_id %]
+    <li>
+      [% "<strike>" IF !dep.open %]
+      <a href="show_bug.cgi?id=[% dep_id %]">[% dep_id %] 
+        [[% IF dep.milestone %][% dep.milestone FILTER html %], [% END %]
+        [% dep.assignee_email FILTER html %]] - 
+        [% IF dep.seen %]
+          <i>This bug appears elsewhere in this tree.</i></a>
+        [% ELSE %]
+          [% dep.summary FILTER html %].</a>
+        [% END %]
+      [% "</strike>" IF !dep.open %]
+      [% INCLUDE display_tree bug_id=dep_id 
+           IF dep.dependencies.size > 0 && !dep.seen %]
+    </li>
+  [% END %]
+</ul>
+[% END %]
+
+[%###########################################################################%]
+[%# Block for depth control toolbar                                         #%]
+[%###########################################################################%]
+
+[% BLOCK depthControlToolbar %]
+ <table cellpadding="3" border="0" cellspacing="0" bgcolor="#d0d0d0">
+ <tr>
+   [%# Hide/show resolved button
+       Swaps text depending on the state of hide_resolved %]
+   <td align="center">
+   <form method="get" action="showdependencytree.cgi" 
+           style="display: inline; margin: 0px;">
+     <input name="id" type="hidden" value="[% bugid %]">
+     [% IF maxdepth %]
+       <input name="maxdepth" type="hidden" value="[% maxdepth %]">
+     [% END %]
+     <input type="hidden" name="hide_resolved" value="[% hide_resolved ? 0 : 1 %]">
+     <input type="submit" value="[% hide_resolved ? "Show" : "Hide" %] Resolved">
+   </form>
+   </td>
+
+   <td>
+     Max Depth:
+   </td>
+
+   <td>
+     &nbsp;
+   </td>
+
+   <td>
+   <form method="get" action="showdependencytree.cgi"
+         style="display: inline; margin: 0px;">
+     [%# set to one form %]
+     <input type="submit" value="&nbsp;1&nbsp;" [% 
+         realdepth < 2 || maxdepth == 1 ? "disabled" : ""
+     %]>
+     <input name="id" type="hidden" value="[% bugid %]">
+     <input name="maxdepth" type="hidden" value="1">
+     <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
+   </form>
+   </td>
+
+   <td>
+   <form method="get" action="showdependencytree.cgi" 
+         style="display: inline; margin: 0px;">
+     [%# Minus one form  
+         Allow subtracting only when realdepth and maxdepth > 1 %]
+     <input name="id" type="hidden" value="[% bugid %]">
+     <input name="maxdepth" type="hidden" value="[% 
+         maxdepth == 1 ? 1 
+                       : ( maxdepth ? maxdepth - 1 : realdepth - 1 )
+     %]">
+     <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
+     <input type="submit" value="&nbsp;&lt;&nbsp;" [%
+        realdepth < 2 || ( maxdepth && maxdepth < 2 ) ? "disabled" : "" 
+     %]>
+   </form>
+   </td>
+
+   <td>
+   <form method="get" action="showdependencytree.cgi" 
+         style="display: inline; margin: 0px;">
+     [%# Limit entry form: the button can not do anything when total depth
+         is less than two, so disable it %]
+     <input name="maxdepth" size="4" maxlength="4" value="[% 
+         maxdepth > 0 && maxdepth <= realdepth ? maxdepth : ""
+     %]">
+     <input name="id" type="hidden" value="[% bugid %]">
+     <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
+     <noscript>
+       <input type="submit" value="Change" [% realdepth < 2 ? "disabled" : "" %]>
+     </noscript>
+   </form>
+   </td>
+
+   <td>
+   <form method="get" action="showdependencytree.cgi" 
+         style="display: inline; margin: 0px;">
+     [%# plus one form 
+         Disable button if total depth < 2, or if depth set to unlimited %]
+     <input name="id" type="hidden" value="[% bugid %]">
+     [% IF maxdepth %]
+       <input name="maxdepth" type="hidden" value="[% maxdepth + 1 %]">
+     [% END %]
+     <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
+     <input type="submit" value="&nbsp;&gt;&nbsp;" [% 
+            realdepth < 2 || ! maxdepth || maxdepth >= realdepth ?
+            "disabled" : ""
+     %]>
+   </form>
+   </td>
+
+   <td>
+   <form method="get" action="showdependencytree.cgi" 
+         style="display: inline; margin: 0px;">
+     [%# Unlimited button %]
+     <input name="id" type="hidden" value="[% bugid %]">
+     <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
+     <input type="submit" value="&nbsp;Unlimited&nbsp;" 
+       [% maxdepth == 0 || maxdepth == realdepth ? "disabled" : "" %]>
+   </form>
+   </td>
+ </tr>
+</table>
+[% END %]
diff --git a/template/en/default/bug/edit.html.tmpl b/template/en/default/bug/edit.html.tmpl
new file mode 100644
index 000000000..1c6737c11
--- /dev/null
+++ b/template/en/default/bug/edit.html.tmpl
@@ -0,0 +1,540 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[% filtered_desc = bug.short_desc FILTER html %]
+[% UNLESS header_done %]
+  [% PROCESS global/header.html.tmpl 
+    title = "Bug $bug.bug_id - $bug.short_desc"
+    h1 = "Bugzilla Bug $bug.bug_id"
+    h2 = filtered_desc
+    header_html = navigation_links
+   %]
+[% END %]
+
+[% PROCESS bug/navigate.html.tmpl %]
+
+<hr>
+
+<form name="changeform" method="post" action="process_bug.cgi">
+
+  <input type="hidden" name="delta_ts" value="[% bug.delta_ts %]">
+  <input type="hidden" name="longdesclength" value="[% bug.longdesclength %]">
+  <input type="hidden" name="id" value="[% bug.bug_id %]">
+
+[%# *** Platform Reporter Product OS AddCC *** %]
+
+  <table cellspacing="1" cellpadding="1" border="0">
+    <tr>      
+      <td align="right">
+        <b>Bug#:</b>
+      </td>
+      <td>
+        <a href="[% Param('urlbase') %]show_bug.cgi?id=[% bug.bug_id %]">
+          [% bug.bug_id %]</a>
+      </td>
+      
+      <td>&nbsp;</td>
+
+      <td align="right">
+        <b>Platform:</b>
+      </td>
+      [% PROCESS select selname = "rep_platform" %]
+      
+      <td align="right">
+        <b>Reporter:</b>
+      </td>
+      <td>
+        [% bug.reporter FILTER html %]
+      </td>    
+    </tr>
+    
+    <tr>
+      <td align="right">
+        <b>Product:</b>
+      </td>
+      [% PROCESS select selname => "product" %]
+      
+      <td align="right">
+        <b>OS:</b>
+      </td>
+      [% PROCESS select selname => "op_sys" %]
+
+      <td align="right">
+        <b>Add&nbsp;CC:</b>
+      </td>
+      <td>
+        <input name="newcc" size="30" value="">
+      </td>
+    </tr>
+
+[%# *** Component Version CC Priority Severity AssignedTo Milestone *** %]    
+
+    <tr>
+      <td align="right">
+        <b>
+          <a href="describecomponents.cgi?product=[% bug.product FILTER url_quote %]">
+            Component</a>:
+        </b>
+      </td>
+      <td>
+        <select name="component">
+          [% FOREACH x = component_ %]
+            <option value="[% x FILTER html %]"
+              [% " selected" IF x == bug.component %]>[% x FILTER html %]
+            </option>
+          [% END %]
+        </select>
+      </td>
+
+      <td>&nbsp;</td>
+ 
+      <td align="right">
+        <b>Version:</b>
+      </td>
+      [% PROCESS select selname => "version"  %]
+      
+      <td rowspan="4" align="right" valign="top">
+        <b>CC:</b>
+      </td>
+      <td rowspan="4" valign="top"> 
+      [% IF bug.cc %]
+        <select name="cc" multiple="multiple" size="5">
+        [% FOREACH c = bug.cc %]
+          <option value="[% c FILTER html %]">[% c FILTER html %]</option>
+        [% END %]
+        </select>
+        <br>
+        <input type="checkbox" name="removecc">Remove selected CCs
+        <br>
+      [% ELSE %]
+        <input type="hidden" name="cc" value="">
+      [% END %]
+      </td>
+    </tr>
+    
+    <tr>
+      <td align="right">
+        <b>
+          <a href="bug_status.html">Status</a>:
+        </b>
+      </td>
+      <td>[% bug.bug_status FILTER html %]</td>      
+      <td>&nbsp;</td>
+      
+      <td align="right">
+        <b><a href="bug_status.html#priority">Priority</a>:</b>
+      </td>
+      [% PROCESS select selname => "priority" %]
+    </tr>
+    
+    <tr>
+      <td align="right">
+        <b>
+          <a href="bug_status.html">Resolution</a>:
+        </b>
+      </td>
+      <td>[% bug.resolution FILTER html %]</td>      
+      <td>&nbsp;</td>
+      
+      <td align="right">
+        <b><a href="bug_status.html#severity">Severity</a>:</b>
+      </td>
+      [% PROCESS select selname = "bug_severity" %]
+      
+    </tr>
+    
+    <tr>
+      <td align="right">
+        <b>
+          <a href="bug_status.html#assigned_to">Assigned&nbsp;To</a>:
+        </b>
+      </td>
+      <td>[% bug.assigned_to FILTER html %]</td>
+      <td>&nbsp;</td>
+ 
+      [% IF Param("usetargetmilestone") && bug.target_milestone %]
+        <td align="right">
+          <b>
+            <a href="[% bug.milestoneurl FILTER html %]">Target Milestone</a>:
+          </b>
+        </td>
+        [% PROCESS select selname = "target_milestone" %]
+      [% ELSE %]
+        <td colspan="3">&nbsp;</td>
+      [% END %]
+    </tr>
+
+[%# *** QAContact URL Summary Whiteboard Keywords *** %]
+
+   [% IF Param('useqacontact') %]
+     <tr>
+       <td align="right">
+       <b>QA Contact:</b>
+       </td>
+       <td colspan="7">
+         <input name="qa_contact" 
+                value="[% bug.qa_contact FILTER html %]" size="60">
+       </td>
+     </tr>
+   [% END %]
+
+  <tr>
+    <td align="right">
+      <b>
+        [% IF bug.bug_file_loc %]
+          <a href="[% bug.bug_file_loc FILTER html %]">URL</a>:
+        [% ELSE %]
+          URL:
+        [% END %]
+      </b>
+    </td>
+    <td colspan="7">
+      <input name="bug_file_loc" 
+             value="[% bug.bug_file_loc FILTER html %]" size="60">
+    </td>
+  </tr>
+  
+  <tr>
+    <td align="right">
+      <b>Summary:</b>
+    </td>
+    <td colspan="7">
+      <input name="short_desc" 
+             value="[% bug.short_desc FILTER html %]" size="60">
+    </td>
+  </tr>
+
+  [% IF Param('usestatuswhiteboard') %] 
+    <tr>
+      <td align="right">
+        <b>Status Whiteboard:</b>
+      </td>
+      <td colspan="7">
+        <input name="status_whiteboard" 
+               value="[% bug.status_whiteboard FILTER html %]" size="60">
+      </td>
+    </tr>
+  [% END %]
+
+  [% IF use_keywords %]
+    <tr>
+      <td align="right">
+        <b>
+          <a href="describekeywords.cgi">Keywords</a>:
+        </b>
+      <td colspan="7">
+        <input name="keywords" 
+               value="[% bug.keywords.join(', ') FILTER html %]" size="60">
+      </td>
+    </tr> 
+  [% END %]
+  </table>
+  
+[%# *** Attachments *** %]
+
+  [% PROCESS attachment/list.html.tmpl 
+     attachments = bug.attachments 
+     bugid = bug.bug_id %]
+
+[%# *** Dependencies Votes *** %]
+
+  [% IF Param('usedependencies') %]
+  <table>
+    <tr>
+    [% PROCESS dependencies 
+       dep = { title => "depends on", fieldname => "dependson" } %]
+      <td rowspan="2">
+        <a href="showdependencytree.cgi?id=[% bug.bug_id %]">Show 
+        dependency tree</a>  
+
+        [% IF Param('webdotbase') %]  
+          <br>
+          <a href="showdependencygraph.cgi?id=[% bug.bug_id %]">Show 
+          dependency graph</a>
+        [% END %]
+      </td>
+    </tr>
+
+    <tr>
+    [% PROCESS dependencies 
+       dep = { title => "blocks", fieldname => "blocked" } %]
+    </tr>
+  </table>
+  [% END %]
+
+  [% IF use_votes %]
+  <table>
+    <tr>
+      <th>
+        <a href="votehelp.html">Votes</a>:
+      </th>
+      <td>
+        [% bug.votes %]&nbsp;&nbsp;&nbsp;
+        <a href="votes.cgi?action=show_bug&amp;bug_id=[% bug.bug_id %]">Show 
+        votes for this bug</a>&nbsp;&nbsp;&nbsp;
+        <a href="votes.cgi?action=show_user&amp;bug_id=[% bug.bug_id %]">Vote 
+        for this bug</a>
+      </td>
+    </tr>
+  </table>
+  [% END %]
+
+[%# *** Comments Groups *** %]
+
+  <br>
+  <b>Additional Comments:</b>
+  <br>
+  <textarea wrap="hard" name="comment" rows="10" cols="80"
+            accesskey="c"></textarea>
+  <br>
+
+  [% IF groups.size > 0 %]
+    <br>
+    <b>Only users in all of the selected groups can view this bug:</b>
+    <br>
+    <font size="-1">(Unchecking all boxes makes this a public bug.)</font>
+    <br>
+    <br>
+
+    [% FOREACH group = groups %]
+      &nbsp;&nbsp;&nbsp;&nbsp;
+      <input type="checkbox" name="bit-[% group.bit %]" value="1" 
+        [% " checked=\"checked\"" IF group.ison %]
+        [% " disabled=\"disabled\"" IF NOT group.ingroup %]>
+      [% group.description %]
+      <br>
+    [% END %]
+
+    [% IF NOT user.inallgroups %]
+      <b>
+        Only members of a group can change the visibility of a bug for 
+        that group
+      </b>
+    <br>
+    [% END %]
+
+    [% IF bug.inagroup %]
+      <p>
+        <b>But users in the roles selected below can always view this bug:</b>
+        <br>
+        <small>
+          (The assignee                                                
+          [% IF (Param('useqacontact')) %]
+             and QA contact
+          [% END %]
+          can always see a bug, and this section does not take effect unless 
+          the bug is restricted to at least one group.)
+        </small>
+      </p>
+
+      <p>
+        <input type="checkbox" name="reporter_accessible" value="1"
+          [% " checked" IF bug.reporter_accessible %]>Reporter
+        <input type="checkbox" name="cclist_accessible" value="1"
+          [% " checked" IF bug.cclist_accessible %]>CC List
+      </p>  
+    [% END %]
+  [% END %]
+
+[%# *** Knob *** %]
+
+  <br>
+  <input type="radio" name="knob" value="none" checked="checked">
+  Leave as <b>[% bug.bug_status FILTER html %]&nbsp;
+              [% bug.resolution FILTER html %]</b>
+  <br>
+
+  [% knum = 1 %]
+
+  [% IF bug.bug_status == "UNCONFIRMED" && 
+        user.canconfirm %]
+    <input type="radio" name="knob" value="confirm">
+    Confirm bug (change status to <b>NEW</b>)
+    <br>
+    [% knum = knum + 1 %]
+  [% END %]
+
+  [% IF user.canedit %]
+    [% IF bug.isopened %]
+      [% IF bug.bug_status != "ASSIGNED" && user.canconfirm %]
+        <input type="radio" name="knob" value="accept">
+        Accept bug (
+        [% "confirm bug, " IF bug.isunconfirmed %]change
+        status to <b>ASSIGNED</b>)
+        <br>
+        [% knum = knum + 1 %]
+      [% END %]
+
+      [% IF bug.resolution %]
+        <input type="radio" name="knob" value="clearresolution">
+        Clear the resolution (remove the current resolution of
+        <b>[% bug.resolution FILTER html %]</b>)<br>      
+        [% knum = knum + 1 %]
+      [% END %]
+
+      <input type="radio" name="knob" value="resolve">
+      Resolve bug, changing <a href="bug_status.html">resolution</a> to
+      <select name="resolution" 
+              onchange="document.changeform.knob[[% knum %]].checked=true">
+      [% FOREACH r = resolution %]
+        <option value="[% r FILTER html %]">[% r FILTER html %]</option>
+      [% END %]
+      </select>
+      <br>
+      [% knum = knum + 1 %]
+
+      <input type="radio" name="knob" value="duplicate">
+      Resolve bug, mark it as duplicate of bug # 
+      <input name="dup_id" size="6" 
+             onchange="if (this.value != '')
+                       {document.changeform.knob[[% knum %]].checked=true}">
+      <br>
+      [% knum = knum + 1 %]
+
+      <input type="radio" name="knob" value="reassign"> 
+      <a href="bug_status.html#assigned_to">Reassign</a> bug to
+      <input name="assigned_to" size="32" 
+             onchange="if ((this.value != '[% bug.assigned_to_email FILTER js %]') && 
+                            (this.value != '')) {
+                         document.changeform.knob[[% knum %]].checked=true; 
+                       }"  
+             value="[% bug.assigned_to_email FILTER html %]">
+      <br>
+      [% IF bug.isunconfirmed && user.canconfirm %]
+        &nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" name="andconfirm">
+        and confirm bug (change status to <b>NEW</b>)
+        <br>
+      [% END %]
+      [% knum = knum + 1 %]
+
+      <input type="radio" name="knob" value="reassignbycomponent">
+      Reassign bug to owner
+      [% "and QA contact" IF useqacontact %]
+      of selected component
+      <br>
+      [% IF bug.isunconfirmed && user.canconfirm %]
+        &nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" name="compconfirm">
+        and confirm bug (change status to <b>NEW</b>)
+        <br>
+      [% END %]
+      [% knum = knum + 1 %]
+    [% ELSE %]
+      [% IF bug.resolution != "MOVED" ||
+           (bug.resolution == "MOVED" && user.canmove) %]  
+        <input type="radio" name="knob" value="reopen"> Reopen bug
+        <br>
+        [% knum = knum + 1 %]
+      [% END %]
+      [% IF bug.bug_status == "RESOLVED" %]
+        <input type="radio" name="knob" value="verify">
+        Mark bug as <b>VERIFIED</b><br>
+        [% knum = knum + 1 %]
+      [% END %]
+      [% IF bug.bug_status != "CLOSED" %]
+        <input type="radio" name="knob" value="close">
+        Mark bug as <b>CLOSED</b><br>
+        [% knum = knum + 1 %]
+      [% END %]
+    [% END %]
+  [% END %]  
+  
+  <input type="submit" value="Commit">
+  <input type="hidden" name="form_name" value="process_bug">
+  <p>
+    <font size="+1">
+      <b>
+        <a href="show_activity.cgi?id=[% bug.bug_id %]">View Bug Activity</a>
+        &nbsp; | &nbsp;
+        <a href="long_list.cgi?buglist=[% bug.bug_id %]">Format For Printing</a>
+      </b>
+    </font>
+
+    [% IF user.canmove %]
+      &nbsp; <font size="+1"><b> | </b></font> &nbsp;
+      <input type="submit" name="action" 
+             value="[% Param("move-button-text") %]">
+    [% END %]
+  </p>  
+</form>
+
+[%# *** Additional Comments *** %]
+
+<table>
+  <tr>
+    <td align="left">
+      <b>
+        <a name="c0" href="#c0">Description</a>:
+      </b>
+    </td>
+    <td align="right" width="100%">
+      Opened: [% bug.creation_ts %]
+    </td>
+  </tr>
+</table>
+<hr>
+
+[% PROCESS bug/comments.html.tmpl 
+   comments = bug.comments 
+ %]
+  
+<hr>
+
+[% PROCESS bug/navigate.html.tmpl %]
+
+<br>
+
+[% PROCESS global/footer.html.tmpl %]
+
+
+[%############################################################################%]
+[%# Block for dependencies                                                   #%]
+[%############################################################################%]
+
+[% BLOCK dependencies %]
+  <th align="right">Bug [% bug.bug_id %] [%+ dep.title %]:</th>
+  <td>
+  [% FOREACH depbug = bug.${dep.fieldname} %]
+    [% GetBugLink(depbug, depbug) %][% " " %]
+  [% END %]
+  </td>
+  <td>
+    <input name="[% dep.fieldname %]" 
+           value="[% bug.${dep.fieldname}.join(', ') %]">
+  </td>
+[% END %]
+
+
+[%############################################################################%]
+[%# Block for SELECT fields                                                  #%]
+[%############################################################################%]
+
+[% BLOCK select %]  
+  <td>
+    <select name="[% selname %]">
+      [% FOREACH x = ${selname} %]
+        <option value="[% x FILTER html %]"
+          [% " selected" IF x == bug.${selname} %]>[% x FILTER html %]
+        </option>
+      [% END %]
+    </select>
+  </td>
+  <td>&nbsp;</td>
+[% END %]
diff --git a/template/en/default/bug/navigate.html.tmpl b/template/en/default/bug/navigate.html.tmpl
new file mode 100644
index 000000000..621acc1bf
--- /dev/null
+++ b/template/en/default/bug/navigate.html.tmpl
@@ -0,0 +1,54 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+  
+[% IF bug_list && bug_list.size > 0 %]
+  [% this_bug_idx = lsearch(bug_list, bug.bug_id) %]
+  <b>Bug List:</b>
+  [% IF this_bug_idx != -1 %]
+    ([% this_bug_idx + 1 %] of [% bug_list.size %])
+  [% END %]
+  
+  <a href="show_bug.cgi?id=[% bug_list.first %]">First</a>
+  <a href="show_bug.cgi?id=[% bug_list.last %]">Last</a>
+
+  [% IF this_bug_idx != -1 %]
+    [% IF this_bug_idx > 0 %]
+      [% prev_bug = this_bug_idx - 1 %]
+      <a href="show_bug.cgi?id=[% bug_list.$prev_bug %]">Prev</a>
+    [% ELSE %]
+      <i><font color="#777777">Prev</font></i>
+    [% END %]
+
+    [% IF this_bug_idx + 1 < bug_list.size %]
+      [% next_bug = this_bug_idx + 1 %]
+      <a href="show_bug.cgi?id=[% bug_list.$next_bug %]">Next</a>
+    [% ELSE %]
+      <i><font color="#777777">Next</font></i>
+    [% END %]
+  [% ELSE %]
+    (This bug is not in your list)
+  [% END %]
+  
+  &nbsp;&nbsp;<a href="buglist.cgi?regetlastlist=1">Show list</a>
+[% END %]
+
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="query.cgi">Query page</a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="enter_bug.cgi">Enter new bug</a>
diff --git a/template/en/default/bug/process/CVS/Entries b/template/en/default/bug/process/CVS/Entries
new file mode 100644
index 000000000..66376c839
--- /dev/null
+++ b/template/en/default/bug/process/CVS/Entries
@@ -0,0 +1,6 @@
+/confirm-duplicate.html.tmpl/1.2/Wed Apr 24 18:07:14 2002//TBUGZILLA-2_16
+/midair.html.tmpl/1.3/Sun Apr 28 22:16:14 2002//TBUGZILLA-2_16
+/next.html.tmpl/1.1/Sun Apr 21 21:30:21 2002//TBUGZILLA-2_16
+/results.html.tmpl/1.3/Wed May  1 19:00:49 2002//TBUGZILLA-2_16
+/verify-new-product.html.tmpl/1.3.2.4/Tue Jun 25 10:08:57 2002//TBUGZILLA-2_16
+D
diff --git a/template/en/default/bug/process/CVS/Repository b/template/en/default/bug/process/CVS/Repository
new file mode 100644
index 000000000..be654f07b
--- /dev/null
+++ b/template/en/default/bug/process/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template/en/default/bug/process
diff --git a/template/en/default/bug/process/CVS/Root b/template/en/default/bug/process/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/en/default/bug/process/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/en/default/bug/process/CVS/Tag b/template/en/default/bug/process/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/template/en/default/bug/process/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/template/en/default/bug/process/confirm-duplicate.html.tmpl b/template/en/default/bug/process/confirm-duplicate.html.tmpl
new file mode 100644
index 000000000..172571900
--- /dev/null
+++ b/template/en/default/bug/process/confirm-duplicate.html.tmpl
@@ -0,0 +1,73 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+[%# INTERFACE:
+  # form: hash; the form values submitted to the script
+  # original_bug_id: number; the bug number for the bug
+  #   against which a bug is being duped
+  # duplicate_bug_id: number; the bug number for the bug
+  #   being duped
+  # cclist_accessible: boolean; whether or not users on the cc: list 
+  #   of the original bug can access that bug.
+  #%]
+ 
+[% PROCESS global/header.html.tmpl title="Duplicate Warning" %]
+    
+<p>
+  When marking a bug as a duplicate, the reporter of the duplicate 
+  is normally added to the CC list of the original. The permissions 
+  on bug [% original_bug_id %] (the original) are currently set 
+  such that the reporter would not normally be able to see it.
+</p>
+
+<p>
+  <b>Adding the reporter to the CC list of bug [% original_bug_id %] 
+  [% IF cclist_accessible %]
+    will immediately
+  [% ELSE %]
+    might, in the future,
+  [% END %]
+  allow him/her access to view this bug.</b>
+  Do you wish to do this?
+</p>
+    
+<form method="post">
+
+[% PROCESS "global/hidden-fields.html.tmpl" exclude="^(Bugzilla|LDAP)_(login|password)$" %]
+
+<p>
+  <input type="radio" name="confirm_add_duplicate" value="1"> 
+    Yes, add the reporter to CC list on bug [% original_bug_id %]
+</p>
+<p>
+  <input type="radio" name="confirm_add_duplicate" value="0" checked="checked"> 
+    No, do not add the reporter to CC list on bug [% original_bug_id %]
+</p>
+<p>
+  <a href="show_bug.cgi?id=[% duplicate_bug_id %]">Throw away my changes, 
+    and revisit bug [% duplicate_bug_id %]</a>
+<p>
+  <input type="submit" value="Submit">
+</p>
+
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/process/midair.html.tmpl b/template/en/default/bug/process/midair.html.tmpl
new file mode 100644
index 000000000..a30e89b3c
--- /dev/null
+++ b/template/en/default/bug/process/midair.html.tmpl
@@ -0,0 +1,75 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+[%# INTERFACE:
+  # form: hash; the form values submitted to the script
+  # operations: array; bug activity since the user last displayed the bug form,
+  #   used by bug/activity/table.html.tmpl to display recent changes that will
+  #   be overwritten if the user submits these changes.  See that template
+  #   for further documentation.
+  # start_at: number; the comment at which show/comments.tmpl should begin
+  #   displaying comments, either the index of the last comment (if the user
+  #   entered a comment along with their change) or a number less than that
+  #   (if they didn't), in which case no comments are displayed.
+  # comments: array; all the comments on the bug.
+  # bug_id: number; the ID of the bug being changed.
+  #%]
+ 
+<h1>Mid-air collision detected!</h1>
+
+<p>
+  Someone else has made changes to this bug at the same time you were trying to.
+  The changes made were:
+</p>
+
+<p>
+  [% PROCESS "bug/activity/table.html.tmpl" incomplete_data=0 %]
+</p>
+          
+[% IF comments.size > start_at %]
+<p>
+  Added comments:
+  <blockquote>
+    [% PROCESS "bug/comments.html.tmpl" %]
+  </blockquote>
+</p>
+[% END %]
+
+<p>
+You have the following choices:
+</p>
+
+<ul>
+  <li>
+    <form method="post">
+      [% PROCESS "global/hidden-fields.html.tmpl" exclude="^(Bugzilla|LDAP)_(login|password)$" %]
+      <input type="submit" value="Submit my changes anyway">
+        This will cause all of the above changes to be overwritten
+        [% ", except for the added comment(s)" IF comments.size > start_at %].
+    </form>
+  </li>
+  <li>
+    <a href="show_bug.cgi?id=[% bug_id %]">Throw away my changes, 
+      and revisit bug [% bug_id %]</a>
+  </li>
+</ul>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/process/next.html.tmpl b/template/en/default/bug/process/next.html.tmpl
new file mode 100644
index 000000000..b7a2605e9
--- /dev/null
+++ b/template/en/default/bug/process/next.html.tmpl
@@ -0,0 +1,32 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+[%# INTERFACE:
+  # next_id : number; the ID of the next bug in the user's bug list.
+  #%]
+
+<hr>
+
+<p>
+  The next bug in your list is bug
+  <a href="show_bug.cgi?id=[% next_id %]">[% next_id %]</a>:
+</p>
+
diff --git a/template/en/default/bug/process/results.html.tmpl b/template/en/default/bug/process/results.html.tmpl
new file mode 100644
index 000000000..99dfbc11d
--- /dev/null
+++ b/template/en/default/bug/process/results.html.tmpl
@@ -0,0 +1,52 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+[%# INTERFACE:
+  # id: number; the ID of the bug that was changed/checked.
+  #
+  # type: string; the type of change/check that was made: "bug" when a bug
+  #   is changed, "dupe" when a duplication notation is added to a bug,
+  #   and "dep" when a bug is checked for changes to its dependencies.
+  #%]
+
+[% DEFAULT type="bug" %]
+
+[% 
+  title = {
+    'bug' => "Changes submitted for bug $id" , 
+    'dupe' => "Duplicate notation added to bug $id" , 
+    'dep' => "Checking for dependency changes on bug $id" , 
+    'votes' => "Bug $id confirmed by number of votes" , 
+    'created' => "Bug $id has been added to the database" , 
+  } 
+%]
+
+<table border="1">
+  <tr>
+    <td>
+      <h2>[% title.$type %]</h2>
+      [% mail %]
+    </td>
+    <td>
+      <a href="show_bug.cgi?id=[% id %]">Back To BUG# [% id %]</a>
+    </td>
+  </tr>
+</table>
diff --git a/template/en/default/bug/process/verify-new-product.html.tmpl b/template/en/default/bug/process/verify-new-product.html.tmpl
new file mode 100644
index 000000000..21c5664b8
--- /dev/null
+++ b/template/en/default/bug/process/verify-new-product.html.tmpl
@@ -0,0 +1,101 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+[%# INTERFACE:
+  # form: hash; the form values submitted to the script
+  # verify_fields: boolean; whether or not to verify 
+  #   the version, component, and target milestone fields
+  # versions: array; versions for the new product.
+  # components: array; components for the new product.
+  # milestones: array; milestones for the new product.
+  # defaults: hash; keys are names of fields, values are defaults for
+  #   those fields
+  # verify_bug_group: boolean; whether or not to ask the user
+  #   if they want to add the bug to its new product's group
+  # use_target_milestone: boolean; whether or not to use 
+  #   the target milestone field
+  #%]
+ 
+<form action="process_bug.cgi" method="post">
+
+[% PROCESS "global/hidden-fields.html.tmpl" 
+     exclude=(verify_fields ? "^version|component|target_milestone$" : "") %]
+
+[%# Verify the version, component, and target milestone fields. %]
+[% IF verify_fields %]
+  <h3>Verify Version, Component[% ", Target Milestone" IF use_target_milestone %]</h3>
+
+  <p>
+  [% IF use_target_milestone %]
+    You are moving the bug(s) to the product <b>[% form.product %]</b>, 
+    and the version, component, and/or target milestone fields are no longer
+    correct.  Please set the correct version, component, and target milestone now:
+  [% ELSE %]
+    You are moving the bug(s) to the product <b>[% form.product %]</b>, 
+    and the version and component fields are no longer correct.  
+    Please set the correct version and component now:
+  [% END %]
+  <p>
+
+  <table>
+    <tr>
+      <td>
+        <b>Version:</b><br>
+        [% PROCESS "global/select-menu.html.tmpl" name="version" options=versions default=defaults.version %]
+      </td>
+      <td>
+        <b>Component:</b><br>
+        [% PROCESS "global/select-menu.html.tmpl" name="component" options=components default=defaults.component %]
+      </td>
+      [% IF use_target_milestone %]
+        <td>
+          <b>Target Milestone:</b><br>
+        [% PROCESS "global/select-menu.html.tmpl" name="target_milestone" options=milestones default=defaults.target_milestone %]
+        </td>
+      [% END %]
+    </tr>
+  </table>
+
+[% END %]
+       
+[% IF verify_bug_group %]
+  <h3>Verify Bug Group</h3>
+
+  <p>
+    Do you want to add the bug to its new product's group (if any)?
+  </p>
+
+  <p>
+    <input type="radio" name="addtonewgroup" value="no"><b>no</b><br>
+    <input type="radio" name="addtonewgroup" value="yes"><b>yes</b><br>
+    <input type="radio" name="addtonewgroup" value="yesifinold" checked="checked">
+      <b>yes, but only if the bug was in its old product's group</b><br>
+  </p>
+[% END %]
+
+<input type="submit" value="Commit">
+
+</form>
+<hr>
+<a href="query.cgi">Cancel and Return to the Query Page</a>
+
+[% PROCESS global/footer.html.tmpl %]
+
diff --git a/template/en/default/bug/show-multiple.html.tmpl b/template/en/default/bug/show-multiple.html.tmpl
new file mode 100644
index 000000000..0e73f4ad7
--- /dev/null
+++ b/template/en/default/bug/show-multiple.html.tmpl
@@ -0,0 +1,156 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Terry Weissman <terry@mozilla.org>
+  #                 Gervase Markham <gerv@gerv.net>
+  #%]
+
+[% PROCESS global/header.html.tmpl 
+  title = "Full Text Bug Listing"
+%]
+
+[% IF bugs.first %]
+  [% FOREACH bug = bugs %]
+    [% PROCESS bug_display %]
+  [% END %]
+[% ELSE %]
+  <p>
+    You'd have more luck if you gave me some bug numbers.
+  </p>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
+
+
+[%###########################################################################%]
+[%# Block for an individual bug                                             #%]
+[%###########################################################################%]
+
+[% BLOCK bug_display %]
+  <img src="1x1.gif" width="1" height="80" align="left">
+  <div align="center">
+    <b>
+      <font ="+3">Bug [% bug.bug_id %] - [% bug.short_desc FILTER html %]</font>
+    </b>
+  </div>
+
+  <table width="100%">
+    <tr>
+      <td>
+        <b>Bug#:</b>
+        <a href="show_bug.cgi?id=[% bug.bug_id %]">[% bug.bug_id %]</a>
+      </td>
+      [% PROCESS cell attr = { description => "Product", 
+                               name => "product" } %]
+      [% PROCESS cell attr = { description => "Version", 
+                               name => "version" } %]
+      [% PROCESS cell attr = { description => "Platform", 
+                               name => "rep_platform" } %]
+    </tr>
+    
+    <tr>
+      [% PROCESS cell attr = { description => "OS/Version", 
+                               name => "op_sys" } %]
+      [% PROCESS cell attr = { description => "Status", 
+                               name => "bug_status" } %]
+      [% PROCESS cell attr = { description => "Severity", 
+                               name => "bug_severity" } %]
+      [% PROCESS cell attr = { description => "Priority", 
+                               name => "priority" } %]
+    </tr>
+    
+    <tr>
+      [% PROCESS cell attr = { description => "Resolution", 
+                               name => "resolution" } %]
+      [% PROCESS cell attr = { description => "Assigned To", 
+                               name => "assigned_to" } %]
+      [% PROCESS cell attr = { description => "Reported By", 
+                               name => "reporter" } %]
+      [% IF Param('useqacontact') %]
+        [% PROCESS cell attr = { description => "QA Contact", 
+                                 name => "qa_contact" } %]
+      [% END %]
+    </tr>
+    
+    <tr>
+      <td colspan="2">
+        <b>Component:</b>&nbsp;
+        [% bug.component %]
+      </td>
+    
+      <td colspan="2">
+      [% IF Param('usetargetmilestone') %]
+          <b>Target Milestone:</b>&nbsp;
+          [% bug.target_milestone FILTER html %]
+      [% END %]
+      </td>
+    </tr>
+    
+    <tr>
+      <td colspan="4">
+        <b>URL:</b>&nbsp;
+        <a href="[% bug.bug_file_loc %]">[% bug.bug_file_loc FILTER html %]</a> 
+    </tr>
+    
+    <tr>
+      <td colspan="4">
+        <b>Summary:</b>&nbsp;[% bug.short_desc FILTER html %]
+      </td>
+    </tr>
+     
+    [% IF use_keywords %]
+      <tr>
+        <td colspan="4">
+          <b>Keywords: </b>&nbsp;[% bug.keywords FILTER html %]
+        </td>
+      </tr>
+    [% END %]
+
+    [% IF Param("usestatuswhiteboard") %]
+      <tr>
+        <td colspan="4">
+          <b>Status Whiteboard:</b>&nbsp;
+          [% bug.status_whiteboard FILTER html %]
+        </td>
+      </tr>
+    [% END %]
+
+    <tr>
+      <td colspan="4">
+        <b>Description:</b>
+      </td>
+    </tr>
+  </table>
+
+  [% PROCESS bug/comments.html.tmpl 
+     comments = bug.comments %]
+  
+  <hr>
+[% END %]
+
+
+[%###########################################################################%]
+[%# Block for standard table cells                                          #%]
+[%###########################################################################%]
+
+[% BLOCK cell %]
+  <td>
+    <b>[% attr.description%]:</b>&nbsp;
+    [% bug.${attr.name} FILTER html %]
+  </td>
+[% END %]
diff --git a/template/en/default/bug/votes/CVS/Entries b/template/en/default/bug/votes/CVS/Entries
new file mode 100644
index 000000000..e4f3a8a64
--- /dev/null
+++ b/template/en/default/bug/votes/CVS/Entries
@@ -0,0 +1,4 @@
+/delete-all.html.tmpl/1.4/Mon May  6 19:17:09 2002//TBUGZILLA-2_16
+/list-for-bug.html.tmpl/1.4.2.3/Sat Jun 22 10:35:09 2002//TBUGZILLA-2_16
+/list-for-user.html.tmpl/1.6.2.1/Thu May 23 08:14:16 2002//TBUGZILLA-2_16
+D
diff --git a/template/en/default/bug/votes/CVS/Repository b/template/en/default/bug/votes/CVS/Repository
new file mode 100644
index 000000000..c3729ce96
--- /dev/null
+++ b/template/en/default/bug/votes/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template/en/default/bug/votes
diff --git a/template/en/default/bug/votes/CVS/Root b/template/en/default/bug/votes/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/en/default/bug/votes/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/en/default/bug/votes/CVS/Tag b/template/en/default/bug/votes/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/template/en/default/bug/votes/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/template/en/default/bug/votes/delete-all.html.tmpl b/template/en/default/bug/votes/delete-all.html.tmpl
new file mode 100644
index 000000000..c50b0cb1c
--- /dev/null
+++ b/template/en/default/bug/votes/delete-all.html.tmpl
@@ -0,0 +1,50 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # This template has no interface. 
+  #%]
+  
+[% PROCESS global/header.html.tmpl
+           title = "Remove your votes?"
+ %]
+
+<p>
+  You are about to remove all of your bug votes. Are you sure you wish to 
+  remove your vote from every bug you've voted on?
+</p>
+
+<form action="votes.cgi" method="post">
+    <input type="hidden" name="action" value="vote">
+  <p>
+    <input type="radio" name="delete_all_votes" value="1">
+    Yes, delete all my votes
+  </p>
+  <p>
+    <input type="radio" name="delete_all_votes" value="0" checked="checked">
+    No, go back and review my votes
+  </p>
+  <p>
+    <input type="submit" value="Submit">
+  </p>
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/votes/list-for-bug.html.tmpl b/template/en/default/bug/votes/list-for-bug.html.tmpl
new file mode 100644
index 000000000..32a786aa8
--- /dev/null
+++ b/template/en/default/bug/votes/list-for-bug.html.tmpl
@@ -0,0 +1,57 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # bug_id: integer. ID of the bug we are listing the votes for.
+  # users: list of hashes. May be empty. Each hash has two members:
+  #   name: string. The login name of the user whose vote is attached
+  #   count: integer. The number of times that user has votes for this bug.
+  # total: integer. The total number of votes for this bug. 
+  #%]
+  
+[% PROCESS global/header.html.tmpl
+           title = "Show Votes"
+           h2 = "Bug <a href=\"show_bug.cgi?id=$bug_id\">$bug_id</a>"
+ %]
+ 
+<table cellspacing="4">
+  <tr>
+    <th>Who</th>
+    <th>Number of votes</th>
+  </tr>
+
+  [% FOREACH voter = users %]
+    <tr>
+      <td>
+        <a href="votes.cgi?action=show_user&amp;user=[% voter.name FILTER url_quote %]">
+          [% voter.name FILTER html %]
+        </a>
+      </td>
+      <td align="right">
+        [% voter.count %]
+      </td>
+    </tr>
+  [% END %]
+</table>
+
+<p>Total votes: [% total %]</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/votes/list-for-user.html.tmpl b/template/en/default/bug/votes/list-for-user.html.tmpl
new file mode 100644
index 000000000..5f442e0bc
--- /dev/null
+++ b/template/en/default/bug/votes/list-for-user.html.tmpl
@@ -0,0 +1,132 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[% PROCESS global/header.html.tmpl
+           title = "Show Votes"
+           h2 = voting_user.name
+ %]
+
+[% canedit = 1 IF voting_user.login == user.login %]
+
+[% IF votes_recorded %]
+  <p>
+    <font color="red">
+      The changes to your votes have been saved.
+    </font>
+  </p>
+[% ELSE %]
+  <br>
+[% END %]
+
+[% IF products.size %]
+  <form action="votes.cgi">
+    <input type="hidden" name="action" value="vote">
+    <table cellspacing="4">
+      <tr>
+        <td></td>
+        <th>Bug #</th>
+        <th>Summary</th>
+        <th>Votes</th>
+      </tr>
+
+      [% FOREACH product = products %]
+        <tr>
+          <th>[% product.name FILTER html %]</th>
+          <td></td>
+          [% IF product.maxperbug < product.maxvotes AND
+                product.maxperbug > 1 %]
+            <td>
+              <font size="-1">
+                (Note: only [% product.maxperbug %] vote
+                [% "s" IF product.maxperbug != 1 %] allowed per bug in 
+                this product.)
+              </font>
+            </td>
+          [% END %]
+        </tr>
+
+        [% FOREACH bug = product.bugs %]
+          <tr>
+            <td></td>
+            <td>
+              [% "<strike>" IF NOT bug.opened %]
+                <a href="show_bug.cgi?id=[% bug.id %]">
+                  [% bug.id %]</a>
+              [% "</strike>" IF NOT bug.opened %]
+            </td>
+            <td>
+              <a href="votes.cgi?action=show_bug&amp;bug_id=[% bug.id %]">
+                [% bug.summary FILTER html %]
+              </a>
+            </td>
+            <td align="right">
+              [% IF canedit %]
+                [% IF product.onevoteonly %]
+                  <input type="checkbox" name="[% bug.id %]" value="1"
+                    [% " checked" IF bug.count %]>
+                [% ELSE %]
+                  <input name="[% bug.id %]" value="[% bug.count %]" 
+                         size="2">
+                [% END %]
+              [% ELSE %]
+                [% bug.count %]
+              [% END %]
+            </td>
+          </tr>
+        [% END %]
+
+        <tr>
+          <td></td>
+          <td colspan="3">[% product.total %] vote
+            [% "s" IF product.total != 1 %] used out of [% product.maxvotes %]
+            allowed.
+            <br>
+            <br>
+          </td>
+        </tr>
+      [% END %]
+    </table>
+
+    [% IF canedit %]
+      <input type="submit" value="Change My Votes">
+      <br>
+      <br>
+      To change your votes, type in new numbers (using zero to
+      mean no votes) or change the checkbox, and then click 
+      <b>Change My Votes</b>.
+    [% END %]  
+  </form>
+[% ELSE %]
+  <p>
+    [% IF canedit %]
+    You are
+    [% ELSE %]
+    This user is
+    [% END %]
+    currently not voting on any bugs.
+  </p>
+[% END %]
+
+<p>
+  <a href="votehelp.html">Help with voting</a>.
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/global/CVS/Entries b/template/en/default/global/CVS/Entries
new file mode 100644
index 000000000..261c6fc84
--- /dev/null
+++ b/template/en/default/global/CVS/Entries
@@ -0,0 +1,11 @@
+/banner.html.tmpl/1.1.2.1/Tue Jun  4 05:56:34 2002//TBUGZILLA-2_16
+/choose-product.html.tmpl/1.6/Mon May  6 19:17:11 2002//TBUGZILLA-2_16
+/code-error.html.tmpl/1.4/Mon May  6 19:17:11 2002//TBUGZILLA-2_16
+/footer.html.tmpl/1.6/Tue May  7 21:56:40 2002//TBUGZILLA-2_16
+/header.html.tmpl/1.5.2.7/Thu Jul  4 11:21:00 2002//TBUGZILLA-2_16
+/hidden-fields.html.tmpl/1.2.2.2/Mon Jul 22 11:06:25 2002//TBUGZILLA-2_16
+/message.html.tmpl/1.3/Mon May  6 19:17:11 2002//TBUGZILLA-2_16
+/select-menu.html.tmpl/1.1.2.1/Mon Jun  3 22:34:12 2002//TBUGZILLA-2_16
+/useful-links.html.tmpl/1.2.2.6/Wed Jul 10 00:06:00 2002//TBUGZILLA-2_16
+/user-error.html.tmpl/1.4/Mon May  6 19:17:12 2002//TBUGZILLA-2_16
+D
diff --git a/template/en/default/global/CVS/Repository b/template/en/default/global/CVS/Repository
new file mode 100644
index 000000000..1763962b6
--- /dev/null
+++ b/template/en/default/global/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template/en/default/global
diff --git a/template/en/default/global/CVS/Root b/template/en/default/global/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/en/default/global/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/en/default/global/CVS/Tag b/template/en/default/global/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/template/en/default/global/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/template/en/default/global/banner.html.tmpl b/template/en/default/global/banner.html.tmpl
new file mode 100644
index 000000000..2b23de30c
--- /dev/null
+++ b/template/en/default/global/banner.html.tmpl
@@ -0,0 +1,34 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #                 Matthew Tuck <matty@chariot.net.au>
+  #%]
+
+[%# Migration note: this file corresponds to the old Param 'bannerhtml' %]
+
+    <table bgcolor="#000000" width="100%" border="0" cellpadding="0"
+           cellspacing="0">
+      <tr>
+        <td>
+          <font color="#FFFFFF" size="8"><center>
+            Bugzilla Version [% Param("version") %]
+          </center></font>
+        </td>
+      </tr>
+    </table>
diff --git a/template/en/default/global/choose-product.html.tmpl b/template/en/default/global/choose-product.html.tmpl
new file mode 100644
index 000000000..e8d9aaf5c
--- /dev/null
+++ b/template/en/default/global/choose-product.html.tmpl
@@ -0,0 +1,48 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # proddesc: hash. May be empty. The hash keys are the products, and the values
+  # are their descriptions.
+  #%]
+
+[% DEFAULT title = "Choose a Product" %]
+[% PROCESS global/header.html.tmpl %]
+
+<table>
+
+[% FOREACH p = proddesc.keys.sort %]
+  <tr>
+    <th align="right" valign="top">
+      <a href="[% target %]?product=[% p FILTER url_quote %]
+                                       [%- "&amp;format=$format" IF format %]">
+      [% p FILTER html %]</a>:
+    </th>
+
+    [% IF proddesc.$p %]
+      <td valign="top">&nbsp;[% proddesc.$p %]</td>
+    [% END %]
+  </tr>
+[% END %]
+        
+</table>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/global/code-error.html.tmpl b/template/en/default/global/code-error.html.tmpl
new file mode 100644
index 000000000..637fba6b1
--- /dev/null
+++ b/template/en/default/global/code-error.html.tmpl
@@ -0,0 +1,64 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # header_done: boolean. True if the header has already been printed.
+  # error: string. The error message to be printed. May contain HTML.
+  # variables: hash. Useful data about the problem. The keys are the variable
+  #  names, and the values the variable values.
+  #%]
+  
+[% UNLESS header_done %]
+  [% PROCESS global/header.html.tmpl %]
+[% END %]
+
+<tt>
+  <p>
+    Bugzilla has suffered an internal error. Please save this page and send
+    it to [% Param("maintainer") %] with details of what you were doing at 
+    the time this message appeared.
+  </p>
+  <script> <!--
+    document.write("<p>URL: " + document.location + "</p>");
+  // -->
+  </script>
+</tt>
+
+<table cellpadding="20">
+  <tr>
+    <td bgcolor="#ff0000">
+      <font size="+2">
+        [% error %]
+      </font>
+    </td>
+  </tr>
+</table>
+
+[% IF variables %]
+  <pre>
+Variables:
+  [% FOREACH key = variables.keys %]
+    [%+ key %]: [%+ variables.$key %]
+  [% END %]
+  </pre>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/global/footer.html.tmpl b/template/en/default/global/footer.html.tmpl
new file mode 100644
index 000000000..c932f92b9
--- /dev/null
+++ b/template/en/default/global/footer.html.tmpl
@@ -0,0 +1,61 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # This template has no interface. However, you must fulfill the interface to
+  # global/useful-links.html.tmpl.
+  #%]
+  
+[%# Migration note: this whole file corresponds to the old Param 'footerhtml' %]
+  
+<table border="0">
+  <tr>
+    <td bgcolor="#000000" valign="top">
+      <table border="0" cellpadding="10" cellspacing="0" width="100%"
+             bgcolor="lightyellow">
+        <tr>
+          <td>
+          
+[%# Migration note: this section corresponds to the old Param 'blurbhtml' %]
+ 
+           This is <b>Bugzilla</b>: the Mozilla bug system.  For more 
+            information about what Bugzilla is and what it can do, see 
+            <a href="http://www.bugzilla.org/">bugzilla.org</a>.
+            
+[%# End section %]
+
+            <br>
+
+[%# Migration note: useful-links.html.tmpl corresponds to %commandmenu% %]
+
+           [% PROCESS "global/useful-links.html.tmpl" %]
+
+          </td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+
+</body>
+</html>
+
+[% CALL SyncAnyPendingShadowChanges() IF SyncAnyPendingShadowChanges %]
diff --git a/template/en/default/global/header.html.tmpl b/template/en/default/global/header.html.tmpl
new file mode 100644
index 000000000..5047ceb63
--- /dev/null
+++ b/template/en/default/global/header.html.tmpl
@@ -0,0 +1,103 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # (All the below interface elements are optional.)
+  # title: string. Page title.
+  # h1: string. Main page header.
+  # h2: string. Page subheader.
+  # header_html: string. Any other HTML to go inside the <head> tags.
+  # javascript: string. Javascript to go in the header.
+  # 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.
+  #%]
+
+[% DEFAULT
+  h1 = title
+  h2 = ""
+  bgcolor = "#FFFFFF"
+  onload = ""
+%]
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+  <head>
+    <title>[% title FILTER html %]</title>
+    
+[%# Migration note: contents of the old Param 'headerhtml' would go here %]
+
+    [% header_html %]
+    
+    [% IF javascript %]
+      <script type="text/javascript" language="JavaScript">
+        [% javascript %]
+      </script>
+    [% END %]
+    
+    [% IF style %]
+      <style type="text/css">
+        [% style %]
+      </style>
+    [% END %]
+    
+    [% IF style_urls %]
+      [% FOREACH style_url = style_urls %]
+        <link href="[% style_url %]" rel="stylesheet" type="text/css">
+      [% END %]
+    [% END %]
+  
+  </head>
+  
+[%# Migration note: contents of the old Param 'bodyhtml' go in the body tag,
+  # but set the bgcolor and onload attributes in the DEFAULT directive above.
+  #%]
+
+  <body bgcolor="[% bgcolor %]" onload="[% onload %]">
+
+[%# Migration note: the following file corresponds to the old Param
+  # 'bannerhtml'
+  #%]
+  
+[% INCLUDE global/banner.html.tmpl %]
+    
+[% IF h1 || h2 %]
+    <table border="0" cellspacing="0">
+      <tr>
+        <td valign="top" align="left">
+          <table border="0" cellpadding="0" cellspacing="2">
+            <tr>
+              <td valign="top" align="left" nowrap="nowrap">
+                <font size="+1"><b>[% h1 %]</b></font>
+              </td>
+            </tr>
+          </table>
+        </td>
+        <td valign="middle">&nbsp;</td>
+        <td valign="middle" align="left">[% h2 %]</td>
+      </tr>
+    </table>
+[% END %]
+
+[% IF message %]
+  <table width="100%" cellspacing="0" cellpadding="5" border="1"><tr><td>
+    <font color="green">[% message %]</font>
+  </td></tr></table>
+[% END %]
diff --git a/template/en/default/global/hidden-fields.html.tmpl b/template/en/default/global/hidden-fields.html.tmpl
new file mode 100644
index 000000000..e622e7b90
--- /dev/null
+++ b/template/en/default/global/hidden-fields.html.tmpl
@@ -0,0 +1,33 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+[%# INTERFACE:
+  # form: hash; the form fields/values for which to generate hidden fields.
+  # exclude: string; a regular expression matching fields to exclude
+  #   from the list of hidden fields generated by this template
+  #%]
+ 
+[%# Generate hidden form fields for non-excluded fields. %]
+[% FOREACH field = form %]
+  [% NEXT IF exclude && field.key.search(exclude) %]
+  <input type="hidden" name="[% field.key %]"
+         value="[% field.value | html | html_linebreak %]">
+[% END %]
diff --git a/template/en/default/global/message.html.tmpl b/template/en/default/global/message.html.tmpl
new file mode 100644
index 000000000..14e1f10d0
--- /dev/null
+++ b/template/en/default/global/message.html.tmpl
@@ -0,0 +1,42 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s):
+  #%]
+  
+[%# INTERFACE:
+  # url: string. An optional URL to go to.
+  # link: string. The link text for that URL.
+  #%]
+
+[% DEFAULT title = "Bugzilla Message" %]
+
+[% PROCESS global/header.html.tmpl %]
+
+[%# The "header" template automatically displays the contents of a "message"
+    variable if it finds one, so it is not necessary to display the message
+    here. %]
+
+[%# Display a URL if the calling script has included one. %]
+[% IF url && link %]
+  <p>
+    <a href="[% url %]">[% link %]</a>
+  </p>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/global/select-menu.html.tmpl b/template/en/default/global/select-menu.html.tmpl
new file mode 100644
index 000000000..c27f60e8b
--- /dev/null
+++ b/template/en/default/global/select-menu.html.tmpl
@@ -0,0 +1,56 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+[%# INTERFACE:
+  # name: string; the name of the menu.
+  #
+  # options: array or hash; the items with which to populate the array.
+  #   If a hash is passed, the hash keys become the names displayed
+  #   to the user while the hash values become the value of the item.
+  # 
+  # default: string; the item selected in the menu by default.
+  # 
+  #%]
+ 
+[%# Get the scalar representation of the options reference, 
+  # which looks like "ARRAY(0xA352BA3F)" or "HASH(0xA352BA3F)",
+  # so we can figure out whether it is a reference to an array
+  # or a hash.
+  #%]
+[% options_type = BLOCK %][% options %][% END %]
+
+<select name="[% name FILTER html %]">
+  [% IF options_type.search("ARRAY") %]
+    [% FOREACH value = options %]
+      <option value="[% value FILTER html %]"
+              [% " selected" IF value == default %]>
+        [% value FILTER html %]
+      </option>
+    [% END %]
+  [% ELSIF values_type.search("HASH") %]
+    [% FOREACH option = options %]
+      <option value="[% option.value FILTER html %]" 
+              [% " selected" IF option.value == default %]>
+        [% option.key FILTER html %]
+      </option>
+    [% END %]
+  [% END %]
+</select>
diff --git a/template/en/default/global/useful-links.html.tmpl b/template/en/default/global/useful-links.html.tmpl
new file mode 100644
index 000000000..cd8b231c3
--- /dev/null
+++ b/template/en/default/global/useful-links.html.tmpl
@@ -0,0 +1,124 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # user: hash. Information about the user. If the user is not logged in,
+  #       user.login is undefined.
+  #   login: string. The user's Bugzilla login email address.
+  #   showmybugslink: boolean. True if user wants My Bugs in the footer.
+  #   queries: list of strings. The names of those of the user's named
+  #     queries which should be displayed in the footer.
+  #   groups: hash. Keys are group names, values are true if user in that group.
+  #     The keys used in this template are
+  #     tweakparams, editcomponents, creategroups, editkeywords, confirm,
+  #     editbugs, editusers. 
+  #%]
+
+[%# Migration note: this whole file corresponds to the old %commandmenu% 
+    substitution param in 'footerhtml' %]
+
+<form method="get" action="show_bug.cgi">
+  <table width="100%">
+    <tr>
+      <td>
+        Actions:
+      </td>
+      
+      <td valign="middle" nowrap>
+        <a href="enter_bug.cgi">New</a> | 
+        <a href="query.cgi">Query</a> |
+        
+        <input type="submit" value="Find"> bug # 
+        <input name="id" size="6"> | 
+        
+        <a href="reports.cgi">Reports</a> 
+       
+        [% IF user.login && Param('usevotes') %]
+          | <a href="votes.cgi?action=show_user">My Votes</a>
+        [% END %]      
+      </td>
+
+      <td>&nbsp;</td>
+      
+    [% IF user.login %] 
+
+      <td valign="middle">
+        Edit <a href="userprefs.cgi">prefs</a>
+        [% ", <a href='editparams.cgi'>parameters</a>" 
+                                                   IF user.groups.tweakparams %]
+        [% ", <a href='editusers.cgi'>users</a>"     IF user.groups.editusers 
+                                                  || (user.blessgroupset > 0) %]
+        [% ", <a href='editproducts.cgi'>products</a>" 
+                                                IF user.groups.editcomponents %]
+        [% ", <a href='editattachstatuses.cgi'> attachment&nbsp;statuses</a>" 
+                                                IF user.groups.editcomponents %]
+        [% ", <a href='editgroups.cgi'>groups</a>" 
+                                                  IF user.groups.creategroups %]
+        [% ", <a href='editkeywords.cgi'>keywords</a>" 
+                                                  IF user.groups.editkeywords %]
+        [% " | <a href='sanitycheck.cgi'>Sanity&nbsp;check</a>" 
+                                                   IF user.groups.tweakparams %]
+
+        | <a href="relogin.cgi">Log&nbsp;out</a>&nbsp;[% user.login %]
+      </td>
+    </tr> 
+
+    [%# Preset queries %]
+    
+    [% preset_queries = user.showmybugslink %]
+    [% FOREACH q = user.queries %]
+      [% preset_queries = 1 IF q.linkinfooter %]
+    [% END %]
+      
+    <tr>
+      [% IF preset_queries %]
+        <td>
+          Preset&nbsp;Queries:
+        </td>
+      [% END %]
+      
+      <td colspan="3">
+        [% IF user.showmybugslink %]
+          [% filtered_username = user.login FILTER url_quote %]
+          <a href="[% Param('mybugstemplate').replace('%userid%', filtered_username) %]">My&nbsp;Bugs</a>
+          [% print_pipe = 1 %]
+        [% END %]
+
+        [% FOREACH q = user.queries %]
+          [% IF q.linkinfooter %]
+            [% " | " IF print_pipe %]
+            <a href="buglist.cgi?cmdtype=runnamed&amp;namedcmd=[% q.name FILTER url_quote %]"><nobr>[% q.name FILTER html %]</nobr></a>
+            [% print_pipe = 1 %]
+          [% END %]        
+        [% END %]
+      </td>
+    </tr>
+      
+    [% ELSE %]    
+      <td valign="middle" align="right">
+        <a href="createaccount.cgi">New&nbsp;Account</a> | 
+        <a href="query.cgi?GoAheadAndLogIn=1">Log&nbsp;In</a>
+      </td>
+    </tr>
+    [% END %]
+    
+  </table>                
+</form>
diff --git a/template/en/default/global/user-error.html.tmpl b/template/en/default/global/user-error.html.tmpl
new file mode 100644
index 000000000..f24b5293f
--- /dev/null
+++ b/template/en/default/global/user-error.html.tmpl
@@ -0,0 +1,45 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # header_done: boolean. True if the header has already been printed.
+  # error: string. The error message to be displayed. May contain HTML.
+  #%]
+  
+[% UNLESS header_done %]
+  [% PROCESS global/header.html.tmpl %]
+[% END %]
+
+<table cellpadding="20">
+  <tr>
+    <td bgcolor="#ff0000">
+      <font size="+2">
+        [% error %]
+      </font>
+    </td>
+  </tr>
+</table>
+
+<p>
+  Please press <b>Back</b> and try again.
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/index.html.tmpl b/template/en/default/index.html.tmpl
new file mode 100644
index 000000000..0b1f28e80
--- /dev/null
+++ b/template/en/default/index.html.tmpl
@@ -0,0 +1,91 @@
+<!-- 1.0@bugzilla.org -->
+[%# -*- mode: html -*- %]
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Terry Weissman <terry@mozilla.org>
+  #                 Jacob Steenhagen <jake@acutex.net>
+  #%]
+
+[%# INTERFACE:
+  # username: string. The login name of the user, if any.
+  #%]
+
+[% PROCESS global/header.html.tmpl
+  title = 'Bugzilla Main Page'
+%]
+
+<script type="text/javascript" language="JavaScript">
+<!--
+function addSidebar() {
+      if ((typeof window.sidebar == "object") && (typeof window.sidebar.addPanel == "function"))
+      {
+         window.sidebar.addPanel ("Bugzilla", "[% Param('urlbase') %]sidebar.cgi", "");
+      }
+      else
+      {
+         var rv = window.confirm ("This page is enhanced for use with Netscape 6.  " + "Would you like to upgrade now?");
+         if (rv)
+            document.location.href = "http://home.netscape.com/download/index.html";
+      }
+   }
+//-->
+</script>
+
+
+<table width="100%"><tr>
+ <td>
+  <p>This is where we put in lots of nifty words explaining all about Bugzilla.</p>
+
+  But it all boils down to a choice of:
+  <p>
+  <a href="query.cgi">Query existing bug reports</a><br>
+  <a href="enter_bug.cgi">Enter a new bug report</a><br>
+  <a href="reports.cgi">Get summary reports</a><br>
+  </p><p>
+[% IF username %]
+  <a href="userprefs.cgi">Change password or user preferences</a><br>
+  <a href="relogin.cgi">Logout [% username FILTER html %]</a><br>
+[% ELSE %]
+  <a href="query.cgi?GoAheadAndLogIn=1">Log in to an existing account</a><br>
+  <a href="createaccount.cgi">Open a new Bugzilla account</a><br>
+[% END %]
+  </p><p>
+  <a href="javascript:addSidebar()">Add to Sidebar</a> (Requires Mozilla or Netscape 6)<br>
+  </p>
+  <form name="f" action="show_bug.cgi" method="get"
+      onsubmit="QuickSearch(f.id.value); return false;"> 
+  <p>
+  Enter a bug # or some search terms:<br>
+  <input type="text" name="id">
+  <input type="submit" value="Show">
+  <a href="quicksearch.html">[Help]</a>
+  </p>
+  </form>
+ </td>
+ <td align="right"><img src="ant.jpg" width="329" height="220" border="2" alt="ant.jpg [8.5k]"></td>
+</tr></table>
+
+<script type="text/javascript" language="JavaScript" src="localconfig.js"></script>
+<script type="text/javascript" language="JavaScript" src="quicksearch.js"></script>
+<script type="text/javascript">
+<!--
+document.forms['f'].id.focus();
+//-->
+</script>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/list/CVS/Entries b/template/en/default/list/CVS/Entries
new file mode 100644
index 000000000..c00b54785
--- /dev/null
+++ b/template/en/default/list/CVS/Entries
@@ -0,0 +1,9 @@
+/change-columns.html.tmpl/1.3/Tue Apr 23 23:27:34 2002//TBUGZILLA-2_16
+/edit-multiple.html.tmpl/1.4.2.2/Sun Jun 30 04:24:57 2002//TBUGZILLA-2_16
+/list-rdf.rdf.tmpl/1.1/Thu Apr 18 18:56:55 2002//TBUGZILLA-2_16
+/list-simple.html.tmpl/1.4.2.1/Thu May 23 08:14:22 2002//TBUGZILLA-2_16
+/list.html.tmpl/1.3.2.2/Wed Jun  5 02:23:12 2002//TBUGZILLA-2_16
+/quips.html.tmpl/1.4.2.1/Thu May 23 08:14:23 2002//TBUGZILLA-2_16
+/server-push.html.tmpl/1.2/Mon May  6 19:17:19 2002//TBUGZILLA-2_16
+/table.html.tmpl/1.4.2.2/Mon Jul  1 03:30:23 2002//TBUGZILLA-2_16
+D
diff --git a/template/en/default/list/CVS/Repository b/template/en/default/list/CVS/Repository
new file mode 100644
index 000000000..3db4437da
--- /dev/null
+++ b/template/en/default/list/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template/en/default/list
diff --git a/template/en/default/list/CVS/Root b/template/en/default/list/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/en/default/list/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/en/default/list/CVS/Tag b/template/en/default/list/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/template/en/default/list/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/template/en/default/list/change-columns.html.tmpl b/template/en/default/list/change-columns.html.tmpl
new file mode 100644
index 000000000..96e56e8eb
--- /dev/null
+++ b/template/en/default/list/change-columns.html.tmpl
@@ -0,0 +1,51 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  # 
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Dave Lawrence <dkl@redhat.com>
+  #%]
+
+[% PROCESS global/header.html.tmpl
+  title = "Change Columns"
+%]
+
+Check which columns you wish to appear on the list, and then click
+on submit.  (Cookies are required.)
+<p>
+<form action="colchange.cgi">
+<input type="hidden" name="rememberedquery" value="[% buffer %]">
+[% FOREACH column = masterlist %]
+  <input type="checkbox" id="[% column %]" name="column_[% column %]" [% "CHECKED" IF lsearch(collist, column) != -1 %]>
+  <label for="[% column %]">[% desc.${column} %]</label><br>
+[% END %]
+</p><p>
+<input id="nosplitheader" type="radio" name="splitheader" value="0" [% "CHECKED" IF ! splitheader %]>
+<label for="nosplitheader">Normal headers (prettier)</label><br>
+<input id="splitheader" type="radio" name="splitheader" value="1" [% "CHECKED" IF splitheader %]>
+<label for="splitheader">Stagger headers (often makes list more compact)</label>
+</p><p>
+<input type="submit" value="Submit">
+</form>
+<form action="colchange.cgi">
+<input type="hidden" name="rememberedquery" value="[% buffer %]">
+<input type="hidden" name="resetit" value="1">
+<input type="submit" value="Reset to Bugzilla default">
+</form>
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
+
diff --git a/template/en/default/list/edit-multiple.html.tmpl b/template/en/default/list/edit-multiple.html.tmpl
new file mode 100644
index 000000000..c67154347
--- /dev/null
+++ b/template/en/default/list/edit-multiple.html.tmpl
@@ -0,0 +1,316 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+<script type="text/javascript" language="JavaScript">
+  var numelements = document.forms.changeform.elements.length;
+  function SetCheckboxes(value) {
+      var item;
+      for (var i=0 ; i<numelements ; i++) {
+          item = document.forms.changeform.elements[i];
+          item.checked = value;
+      }
+  }
+  document.write(' <input type="button" name="uncheck_all" value="Uncheck All" onclick="SetCheckboxes(false);">');
+  document.write(' <input type="button" name="check_all" value="Check All" onclick="SetCheckboxes(true);">');
+</script>
+
+<hr>
+
+<p><font size="-1">
+  To change multiple bugs:
+  <ol>
+    <li>Check the bugs you want to change above.</li>
+    <li>Make your changes in the form fields below.  If the change
+        you are making requires an explanation, include it in
+        the comments box.</li>
+    <li>Click the <em>Commit</em> button.</li>
+  </ol>
+</font></p>
+
+<table id="form">
+  <tr>
+
+    <th><label for="product">Product:</label></th>
+    <td>
+      [% PROCESS selectmenu menuname = "product" 
+                            menuitems = products %]
+    </td>
+
+    <th><label for="version">Version:</label></th>
+    <td>
+      [% PROCESS selectmenu menuname = "version" 
+                            menuitems = versions %]
+    </td>
+
+  </tr>
+  <tr>
+
+    <th>
+      <label for="rep_platform">
+        <a href="bug_status.html#rep_platform">Platform</a>:
+      </label>
+    </th>
+    <td>
+      [% PROCESS selectmenu menuname = "rep_platform" 
+                            menuitems = platforms %]
+    </td>
+
+    <th>
+      <label for="priority">
+        <a href="bug_status.html#priority">Priority</a>:
+      </label>
+    </th>
+    <td>
+      [% PROCESS selectmenu menuname = "priority" 
+                            menuitems = priorities %]
+    </td>
+
+  </tr>
+  <tr>
+
+    <th><label for="component">Component:</label></th>
+    <td>
+      [% PROCESS selectmenu menuname = "component" 
+                            menuitems = components %]
+    </td>
+
+    <th>
+      <label for="bug_severity">
+        <a href="bug_status.html#severity">Severity</a>:
+      </label>
+    </th>
+    <td>
+      [% PROCESS selectmenu menuname = "bug_severity" 
+                            menuitems = severities %]
+    </td>
+
+  </tr>
+  <tr>
+
+    <th><label for="target_milestone">Target Milestone:</label></th>
+    <td colspan="3">
+      [% PROCESS selectmenu menuname = "target_milestone" 
+                            menuitems = targetmilestones %]
+    </td>
+
+  </tr>
+
+  [% IF Param("useqacontact") %]
+    <tr>
+      <th><label for="qa_contact">QA Contact:</label></th>
+      <td colspan="3">
+        <input id="qa_contact" 
+               name="qa_contact" 
+               value="[% dontchange FILTER html %]" 
+               size="32">
+      </td>
+    </tr>
+  [% END %]
+
+  <tr>
+
+    <th><label for="masscc">CC List:</label></th>
+    <td colspan="3">
+      <input id="masscc" name="masscc" size="32">
+      <select name="ccaction">
+        <option value="add">Add these to the CC List</option>
+        <option value="remove">Remove these from the CC List</option>
+      </select>
+    </td>
+
+  </tr>
+
+  [% IF use_keywords %]
+    <tr>
+
+      <th>
+        <label for="keywords">
+          <a href="describekeywords.cgi">Keywords</a>:
+        </label>
+      </th>
+      <td colspan="3">
+        <input id="keywords" name="keywords" size="32">
+        <select name="keywordaction">
+          <option value="add">Add these keywords</option>
+          <option value="delete">Delete these keywords</option>
+          <option value="makeexact">Make the keywords be exactly this list</option>
+        </select>
+      </td>
+
+    </tr>
+  [% END %]
+
+</table>
+
+<input type="hidden" name="multiupdate" value="Y">
+
+<label for="comment"><b>Additional Comments:</b></label><br>
+<textarea id="comment" name="comment" rows="5" cols="80" wrap="hard"></textarea><br>
+
+[% IF groups.size > 0 %]
+
+  <b>Groupset:</b><br>
+  <table border="1">
+    <tr>
+      <th>Don&apos;t<br>change<br>this group<br>restriction</td>
+      <th>Remove<br>bugs<br>from this<br>group</td>
+      <th>Add<br>bugs<br>to this<br>group</td>
+      <th>Group Name:</td>
+    </tr>
+
+    [% FOREACH group = groups %]
+    <tr>
+      <td align="center">
+        <input type="radio" name="bit-[% group.bit %]" value="-1" checked="checked">
+      </td>
+      <td align="center">
+        <input type="radio" name="bit-[% group.bit %]" value="0">
+      </td>
+      [% IF group.isactive %]
+        <td align="center">
+          <input type="radio" name="bit-[% group.bit %]" value="1">
+        </td>
+      [% ELSE %]
+        <td>&nbsp;</td>
+        [% foundinactive = 1 %]
+      [% END %]
+
+      <td>
+        [% IF group.isactive %]
+          [% group.description %]
+        [% ELSE %]
+          [% group.description FILTER strike %]
+        [% END %]
+      </td>
+
+    </tr>
+    [% END %]
+
+  </table>
+
+  [% IF foundinactive %]
+    <font size="-1">(Note: Bugs may not be added to <strike>inactive 
+    groups</strike>, only removed.)</font><br>
+  [% END %]
+
+[% END %]
+
+
+
+[% knum = 0 %]
+<input id="knob-none" type="radio" name="knob" value="none" checked="checked">
+<label for="knob-none">Do nothing else</label><br>
+
+[% IF bugstatuses.size == 1 && bugstatuses.0 == unconfirmedstate %]
+  [% knum = knum + 1 %]
+  <input id="knob-confirm" type="radio" name="knob" value="confirm">
+  <label for="knob-confirm">
+    Confirm bugs (change status to <b>NEW</b>)
+  </label><br>
+[% END %]
+
+[% knum = knum + 1 %]
+<input id="knob-accept" type="radio" name="knob" value="accept">
+<label for="knob-accept">
+  Accept bugs (change status to <b>ASSIGNED</b>)
+</label><br>
+
+[%# If all the bugs being changed are open, allow the user to close them. %]
+[% IF !bugstatuses.containsany(closedstates) %]
+  [% knum = knum + 1 %]
+  <input id="knob-clearresolution" type="radio" name="knob" value="clearresolution">
+  <label for="knob-clearresolution">Clear the resolution</label><br>
+
+  [% knum = knum + 1 %]
+  <input id="knob-resolve" type="radio" name="knob" value="resolve">
+  <label for="knob-resolve">
+    Resolve bugs, changing <a href="bug_status.html">resolution</a> to
+  </label>
+  <select name="resolution" onchange="document.forms.changeform.knob[[% knum %]].checked=true">
+    [% FOREACH resolution = resolutions %]
+      [% NEXT IF !resolution %]
+      <option value="[% resolution FILTER html %]" [% selected IF resolution == "FIXED" %]>
+        [% resolution FILTER html %]
+      </option>
+    [% END %]
+  </select><br>
+
+[% END %]
+
+[%# If all the bugs are closed, allow the user to reopen them. %]
+[% IF !bugstatuses.containsany(openstates) %]
+  [% knum = knum + 1 %]
+  <input id="knob-reopen" type="radio" name="knob" value="reopen">
+  <label for="knob-reopen">Reopen bugs</label><br>
+[% END %]
+
+[% IF bugstatuses.size == 1 %]
+  [% IF bugstatuses.contains('RESOLVED') %]
+    [% knum = knum + 1 %]
+    <input id="knob-verify" type="radio" name="knob" value="verify">
+    <label for="knob-verify">Mark bugs as <b>VERIFIED</b></label><br>
+  [% ELSIF bugstatuses.contains('VERIFIED') %]
+    [% knum = knum + 1 %]
+    <input id="knob-close" type="radio" name="knob" value="close">
+    <label for="knob-close">Mark bugs as <b>CLOSED</b></label><br>
+  [% END %]
+[% END %]
+
+[% knum = knum + 1 %]
+<input id="knob-reassign" type="radio" name="knob" value="reassign">
+<label for="knob-reassign"><a href="bug_status.html#assigned_to">
+  Reassign</a> bugs to
+</label>
+<input name="assigned_to" 
+       value="[% user.login FILTER html %]"
+       onchange="document.forms.changeform.knob[[% knum %]].checked = true;"
+       size="32"><br>
+
+[% knum = knum + 1 %]
+<input id="knob-reassignbycomponent" 
+       type="radio" 
+       name="knob" 
+       value="reassignbycomponent">
+<label for="knob-reassignbycomponent">
+  Reassign bugs to owner of selected component
+</label><br>
+
+<input type="submit" value="Commit">
+
+[% IF ismover %]
+  <input type="submit" name="action" value="[% Param('move-button-text') %]">
+[% END %]
+
+
+[%############################################################################%]
+[%# Select Menu Block                                                        #%]
+[%############################################################################%]
+
+[% BLOCK selectmenu %]
+  <select id="[% menuname %]" name="[% menuname %]">
+    <option value="[% dontchange FILTER html %]" selected="selected">
+      [% dontchange FILTER html %]
+    </option>
+    [% FOREACH menuitem = menuitems %]
+      <option value="[% menuitem FILTER html %]">[% menuitem FILTER html %]</option>
+    [% END %]
+  </select>
+[% END %]
diff --git a/template/en/default/list/list-rdf.rdf.tmpl b/template/en/default/list/list-rdf.rdf.tmpl
new file mode 100644
index 000000000..c8beb50e3
--- /dev/null
+++ b/template/en/default/list/list-rdf.rdf.tmpl
@@ -0,0 +1,54 @@
+[% template_version = "1.0@bugzilla.org" %]
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+<?xml version="1.0"?>
+<!-- [% template_version %] -->
+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:bz="http://www.bugzilla.org/rdf#">
+
+<bz:result about="[% Param('urlbase') %]buglist.cgi?[% urlquerypart FILTER html %]">
+
+  <bz:bugs>
+    <Seq>
+    [% FOREACH bug = bugs %]
+      <li>
+        
+        <bz:bug about="[% Param('urlbase') %]show_bug.cgi?id=[% bug.id %]">
+          
+          <bz:id>[% bug.id %]</bz:id>
+        
+        [% FOREACH column = displaycolumns %]
+          <bz:[% column %]>[% bug.$column FILTER html %]</bz:[% column %]>
+        [% END %]
+        
+        </bz:bug>
+      
+      </li>
+
+    [% END %]
+
+    </Seq>
+
+  </bz:bugs>
+
+</bz:result>
+
+</RDF>
diff --git a/template/en/default/list/list-simple.html.tmpl b/template/en/default/list/list-simple.html.tmpl
new file mode 100644
index 000000000..25c8c82ec
--- /dev/null
+++ b/template/en/default/list/list-simple.html.tmpl
@@ -0,0 +1,53 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+[%# INTERFACE:
+  # title: string. The title for this page. (optional)
+  #%]
+
+[%############################################################################%]
+[%# Initialization                                                           #%]
+[%############################################################################%]
+
+[% DEFAULT title = "Bug List" %]
+[% title = title FILTER html %]
+
+
+[%############################################################################%]
+[%# Bug Table                                                                #%]
+[%############################################################################%]
+
+<html>
+
+  <head>
+    <title>[% title %]</title>
+    <link href="css/buglist.css" rel="stylesheet" type="text/css">
+  </head>
+
+  <body>
+    [% IF bugs.size == 0 %]
+      <h3>Zarro Boogs found.</h3>
+    [% ELSE %]
+      [% PROCESS list/table.html.tmpl %]
+    [% END %]
+  </body>
+
+</html>
diff --git a/template/en/default/list/list.html.tmpl b/template/en/default/list/list.html.tmpl
new file mode 100644
index 000000000..8ffba004f
--- /dev/null
+++ b/template/en/default/list/list.html.tmpl
@@ -0,0 +1,162 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+[%############################################################################%]
+[%# Template Initialization                                                  #%]
+[%############################################################################%]
+
+[% DEFAULT title = "Bug List" %]
+[% style_urls = [ "css/buglist.css" ] %]
+[% qorder = order FILTER url_quote IF order %]
+
+
+[%############################################################################%]
+[%# Page Header                                                              #%]
+[%############################################################################%]
+
+[% PROCESS global/header.html.tmpl
+  title = title
+  style = style
+%]
+
+<div align="center">
+  <b>[% currenttime %]</b><br>
+
+  [% IF debug %]
+    <p>[% query FILTER html %]</p>
+  [% END %]
+
+  [% IF quip %]
+    <a href="quips.cgi"><i>[% quip FILTER html %]</i></a>
+  [% END %]
+
+</div>
+
+[% IF toolong %]
+  <h2>
+    This list is too long for Bugzilla's little mind; the 
+    Next/Prev/First/Last buttons won't appear on individual bugs.
+  </h2>
+[% END %]
+
+<hr>
+
+
+[%############################################################################%]
+[%# Preceding Status Line                                                    #%]
+[%############################################################################%]
+
+[% IF bugs.size > 9 %]
+  [% bugs.size %] bugs found.
+[% END %]
+
+
+[%############################################################################%]
+[%# Start of Change Form                                                     #%]
+[%############################################################################%]
+
+[% IF dotweak %]
+  <form name="changeform" method="post" action="process_bug.cgi">
+[% END %]
+
+
+[%############################################################################%]
+[%# Bug Table                                                                #%]
+[%############################################################################%]
+
+[% FLUSH %]
+[% PROCESS list/table.html.tmpl %]
+
+[%############################################################################%]
+[%# Succeeding Status Line                                                   #%]
+[%############################################################################%]
+
+[% IF bugs.size == 0 %]
+  Zarro Boogs found.
+  <p>
+    <a href="query.cgi">Query Page</a>
+    &nbsp;&nbsp;<a href="enter_bug.cgi">Enter New Bug</a>
+    <a href="query.cgi?[% urlquerypart %]">Edit this query</a>
+  </p>
+
+[% ELSIF bugs.size == 1 %]
+  One bug found.
+
+[% ELSE %]
+  [% bugs.size %] bugs found.
+
+[% END %]
+
+<br>
+
+
+[%############################################################################%]
+[%# Rest of Change Form                                                      #%]
+[%############################################################################%]
+
+[% IF dotweak %]
+
+  [% PROCESS "list/edit-multiple.html.tmpl" %]
+  
+  </form>
+
+  <hr>
+
+[% END %]
+
+
+[%############################################################################%]
+[%# Navigation Bar                                                           #%]
+[%############################################################################%]
+
+[% IF bugs.size > 0 %]
+  <form method="post" action="long_list.cgi">
+    <input type="hidden" name="buglist" value="[% buglist %]">
+    <input type="submit" value="Long Format">
+
+    <a href="query.cgi">Query Page</a> &nbsp;&nbsp;
+    <a href="enter_bug.cgi">Enter New Bug</a> &nbsp;&nbsp;
+    <a href="colchange.cgi?[% urlquerypart %]">Change Columns</a> &nbsp;&nbsp;
+
+    [% IF bugs.size > 1 && caneditbugs && !dotweak %]
+      <a href="buglist.cgi?[% urlquerypart %]
+        [%- "&order=$qorder" FILTER html IF order %]&amp;tweak=1">Change Several 
+        Bugs at Once</a>
+      &nbsp;&nbsp;
+    [% END %]
+
+    [% IF bugowners %]
+      <a href="mailto:[% bugowners %]">Send Mail to Bug Owners</a> &nbsp;&nbsp;
+    [% END %]
+
+    <a href="query.cgi?[% urlquerypart %]">Edit this Query</a> &nbsp;&nbsp;
+
+  </form>
+
+[% END %]
+
+
+[%############################################################################%]
+[%# Page Footer                                                              #%]
+[%############################################################################%]
+
+[% PROCESS global/footer.html.tmpl %]
+
diff --git a/template/en/default/list/quips.html.tmpl b/template/en/default/list/quips.html.tmpl
new file mode 100644
index 000000000..c874b14d7
--- /dev/null
+++ b/template/en/default/list/quips.html.tmpl
@@ -0,0 +1,72 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # added_quip: string. Defined if the CGI added a quip data before 
+  #                displaying anything; if defined, its value is that quip.
+  # show_quips: boolean. True if we are showing the entire quip list.
+  # quips: list of strings. Defined iff show_quips is true. List of all quips.
+  #%]
+
+[% PROCESS global/header.html.tmpl
+           title = "Bugzilla Quip System"
+           h1 = "Add your own clever headline"
+ %]
+
+[% IF added_quip %]
+  <p>
+    <font color="red">
+      Your quip '<tt>[% added_quip FILTER html %]</tt>' has been added.
+    </font>
+  </p>
+[% END %]
+
+<p>
+  Bugzilla will pick a random quip for the headline on each bug list, and 
+  you can extend the quip list. Type in something clever or funny or boring 
+  (but not obscene or offensive, please) and bonk on the button.
+</p>
+
+<form method="post" action="quips.cgi">
+  <input type="hidden" name="action" value="add">
+  <input size="80" name="quip">
+  <p>
+    <input type="submit" value="Add This Quip">
+  </p>
+</form>
+
+[% IF show_quips %]
+  <h2>
+    Existing quips:
+  </h2>
+  <ul>
+    [% FOREACH quip = quips %]
+      <li>[% quip %]</li>
+    [% END %]
+  </ul>
+[% ELSE %]
+  <p>
+    Those who like their wisdom in large doses can 
+    <a href="quips.cgi?action=show">view the whole quip list</a>.
+  </p>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/list/server-push.html.tmpl b/template/en/default/list/server-push.html.tmpl
new file mode 100644
index 000000000..9b7131654
--- /dev/null
+++ b/template/en/default/list/server-push.html.tmpl
@@ -0,0 +1,41 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+[%# INTERFACE:
+  # debug: boolean. True if we want the query displayed while we wait.
+  # query: string. The SQL query which makes the buglist.
+  #%]
+  
+<html>
+  <head>
+    <title>Bugzilla is pondering your query</title>
+  </head>
+  <body>
+    <h1 style="margin-top: 20%; text-align: center;">Please stand by ...</h1>
+
+    [% IF debug %]
+      <p>
+        <code>[% query FILTER html %]</code>
+      </p>
+    [% END %]
+
+  </body>
+</html>
diff --git a/template/en/default/list/table.html.tmpl b/template/en/default/list/table.html.tmpl
new file mode 100644
index 000000000..6d5ee0d6c
--- /dev/null
+++ b/template/en/default/list/table.html.tmpl
@@ -0,0 +1,150 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Myk Melez <myk@mozilla.org>
+  #%]
+
+[%############################################################################%]
+[%# Initialization                                                           #%]
+[%############################################################################%]
+
+[%# 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.
+  #%]
+[% abbrev = 
+  {
+    "severity"          => { maxlength => 3 , title => "Sev" } , 
+    "priority"          => { maxlength => 3 , title => "Pri" } , 
+    "platform"          => { maxlength => 3 , title => "Plt" } , 
+    "status"            => { maxlength => 4 } , 
+    "reporter"          => { maxlength => 30 , ellipsis => "..." } , 
+    "owner"             => { maxlength => 30 , ellipsis => "..." } , 
+    "qa_contact"        => { maxlength => 30 , ellipsis => "..." , title => "QAContact" } , 
+    "resolution"        => { maxlength => 4 } , 
+    "summary"           => { maxlength => 60 , ellipsis => "..." , wrap => 1 } ,
+    "summaryfull"       => { wrap => 1 } ,
+    "status_whiteboard" => { title => "StatusSummary" , wrap => 1 } , 
+    "component"         => { maxlength => 8 , title => "Comp" } , 
+    "product"           => { maxlength => 8 } , 
+    "version"           => { maxlength => 5 , title => "Vers" } , 
+    "os"                => { maxlength => 4 } , 
+    "target_milestone"  => { title => "TargetM" } , 
+  }
+%]
+
+[% qorder = order FILTER url_quote IF order %]
+
+[%############################################################################%]
+[%# Table Header                                                             #%]
+[%############################################################################%]
+
+[% tableheader = BLOCK %]
+  <table class="bz_buglist" cellspacing="0" cellpadding="4" width="100%">
+    <colgroup>
+      <col class="bz_id_column">
+      [% FOREACH id = displaycolumns %]
+      <col class="bz_[% id %]_column">
+      [% END %]
+    </colgroup>
+
+    <tr align="left">
+      <th colspan="[% splitheader ? 2 : 1 %]">
+        <a href="buglist.cgi?[% urlquerypart %]&amp;order=bugs.bug_id">ID</a>
+      </th>
+
+      [% IF splitheader %]
+
+        [% FOREACH id = displaycolumns %]
+          [% NEXT UNLESS loop.count() % 2 == 0 %]
+          [% column = columns.$id %]
+          [% PROCESS columnheader %]
+        [% END %]
+
+        </tr><tr align="left"><th>&nbsp;</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 %]&amp;order=
+      [% column.name FILTER url_quote FILTER html %]
+      [% ",$qorder" FILTER html IF order %]">
+        [%- abbrev.$id.title || column.title -%]</a>
+  </th>
+[% END %]
+
+
+[%############################################################################%]
+[%# Bug Table                                                                #%]
+[%############################################################################%]
+
+[% FOREACH bug = bugs %]
+  [% FLUSH IF loop.count() % 10 == 1 %]
+
+  [%# At the beginning of every hundred bugs in the list, start a new table. %]
+  [% IF loop.count() % 100 == 1 %]
+    [% tableheader %]
+  [% END %]
+
+  <tr class="bz_[% bug.severity %] bz_[% bug.priority %] [%+ "bz_secure" IF (bug.groupset && !usebuggroups) %]">
+
+    <td>
+      [% IF dotweak %]<input type="checkbox" name="id_[% bug.id %]">[% END %]
+      <a href="show_bug.cgi?id=[% bug.id %]">[% bug.id %]</a>
+    </td>
+
+    [% FOREACH column = displaycolumns %]
+    <td>
+      [% '<nobr>' IF NOT abbrev.$column.wrap %]
+      [%- bug.$column.truncate(abbrev.$column.maxlength, abbrev.$column.ellipsis) FILTER html -%]
+      [%- '</nobr>' IF NOT abbrev.$column.wrap %]
+    </td>
+    [% END %]
+
+  </tr>
+
+  [%# At the end of every hundred bugs in the list, or at the end of the list,
+    # end the current table. 
+    #%]
+  [% IF loop.last() || loop.count() % 100 == 0 %]
+    </table>
+  [% END %]
+
+[% END %]
+
diff --git a/template/en/default/reports/CVS/Entries b/template/en/default/reports/CVS/Entries
new file mode 100644
index 000000000..9b1c1b1e2
--- /dev/null
+++ b/template/en/default/reports/CVS/Entries
@@ -0,0 +1,6 @@
+/components.html.tmpl/1.4.2.2/Thu May 30 19:38:22 2002//TBUGZILLA-2_16
+/duplicates-simple.html.tmpl/1.1/Fri Apr 26 23:18:53 2002//TBUGZILLA-2_16
+/duplicates-table.html.tmpl/1.1.2.2/Thu Jun 13 22:22:32 2002//TBUGZILLA-2_16
+/duplicates.html.tmpl/1.4.2.1/Thu May 23 08:14:26 2002//TBUGZILLA-2_16
+/keywords.html.tmpl/1.4/Wed Apr 24 18:27:43 2002//TBUGZILLA-2_16
+D
diff --git a/template/en/default/reports/CVS/Repository b/template/en/default/reports/CVS/Repository
new file mode 100644
index 000000000..8992c8591
--- /dev/null
+++ b/template/en/default/reports/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template/en/default/reports
diff --git a/template/en/default/reports/CVS/Root b/template/en/default/reports/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/en/default/reports/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/en/default/reports/CVS/Tag b/template/en/default/reports/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/template/en/default/reports/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/template/en/default/reports/components.html.tmpl b/template/en/default/reports/components.html.tmpl
new file mode 100644
index 000000000..b6d5010d0
--- /dev/null
+++ b/template/en/default/reports/components.html.tmpl
@@ -0,0 +1,97 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Bradley Baetz <bbaetz@student.usyd.edu.au>
+  #%]
+
+[%# INTERFACE:
+  # product: string. The product this is the components list for.
+  # components: List of hashes. May be empty. Each hash has four members:
+  #   name: string. Name of the component.
+  #   description: string. Description of the component. May contain HTML.
+  #   initialowner: string. Component's initial owner.
+  #   initialqacontact: string. Component's initial QA contact.
+  #%]
+  
+[% filtered_product = product FILTER html %]
+[% PROCESS global/header.html.tmpl 
+  title = "Components for $product"
+  h2 = filtered_product %]
+
+[% IF Param("useqacontact") %]
+  [% numcols = 3 %]
+[% ELSE %]
+  [% numcols = 2 %]
+[% END %]
+
+[% IF components.size == 0 %]
+  This product has no components.
+[% ELSE %]
+  <table>
+    <tr>
+      <th align="left">Component</th>
+      <th align="left">Default Owner</th>
+      [% IF Param("useqacontact") %]
+        <th align="left">Default QA Contact</th>
+      [% END %]
+    </tr>
+
+    [% FOREACH comp = components %]
+      [% INCLUDE describe_comp %]
+    [% END %]
+    <tr>
+      <td colspan="[% numcols %]">
+        <hr>
+      </td>
+    </tr>
+  </table>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
+
+[%############################################################################%]
+[%# BLOCK for components                                                      %]
+[%############################################################################%]
+
+[% BLOCK describe_comp %]
+  <tr>
+    <td colspan="[% numcols %]">
+      <hr>
+    </td>
+  </tr>
+  <tr>
+    <td rowspan="2">
+      <a name="[% comp.name FILTER html %]">[% comp.name FILTER html %]</a>
+    </td>
+    <td>
+      <a href="mailto:[% comp.initialowner %][% Param('emailsuffix') %]">
+      [% comp.initialowner FILTER html %]</a>
+    </td>
+    [% IF Param("useqacontact") %]
+      <td>
+        <a href="mailto:[% comp.initialqacontact %][% Param('emailsuffix') %]">
+        [% comp.initialqacontact %]</a>
+      </td>
+    [% END %]
+  </tr>
+  <tr>
+    <td colspan="[% numcols - 1 %]">
+      [% comp.description %]
+    </td>
+  </tr>
+[% END %]
diff --git a/template/en/default/reports/duplicates-simple.html.tmpl b/template/en/default/reports/duplicates-simple.html.tmpl
new file mode 100644
index 000000000..481dd6eca
--- /dev/null
+++ b/template/en/default/reports/duplicates-simple.html.tmpl
@@ -0,0 +1,42 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # You need to fulfill the interface to duplicates-table.html.tmpl.
+  #%]
+  
+<html>
+
+  [% IF product %]
+    [% title = "Most Frequently Reported Bugs for $product" %]
+  [% ELSE %]   
+    [% title = "Most Frequently Reported Bugs" %]
+  [% END%]
+
+  <head>
+    <title>[% title %]</title>
+  </head>
+
+  <body>
+    [% PROCESS "reports/duplicates-table.html.tmpl" %]
+  </body>
+
+</html>
diff --git a/template/en/default/reports/duplicates-table.html.tmpl b/template/en/default/reports/duplicates-table.html.tmpl
new file mode 100644
index 000000000..df1da0d70
--- /dev/null
+++ b/template/en/default/reports/duplicates-table.html.tmpl
@@ -0,0 +1,142 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # bugs: list of hashes. May be empty. Each hash has nine members:
+  #   id: integer. The bug number
+  #   count: integer. The number of dupes
+  #   delta: integer. The change in count in the last $changedsince days
+  #   component: string. The bug's component
+  #   bug_severity: string. The bug's severity.
+  #   op_sys: string. The bug's reported OS.
+  #   target_milestone: string. The bug's TM.
+  #   short_desc: string. The bug's summary.
+  #   bug_status: string. The bug's status.
+  #   
+  # bug_ids: list of integers. May be empty. The IDs of the bugs in $bugs.
+  #  
+  # sortby: string. the column on which we are sorting the buglist.
+  # reverse: boolean. True if we are reversing the current sort.
+  # maxrows: integer. Max number of rows to display.
+  # changedsince: integer. The number of days ago for the changedsince column.
+  # openonly: boolean. True if we are only showing open bugs.    
+  # product: string. Restrict to this product only.
+  #%]
+  
+[%# *** Column Headers *** %]
+
+<table border>
+  <tr bgcolor="#CCCCCC">
+    [% FOREACH column = [ { name => "id", description => "Bug #" },
+                          { name => "count", description => "Dupe<br>Count" },
+                          { name => "delta", 
+                      description => "Change in last<br>$changedsince day(s)" },
+                          { name => "component", description => "Component" },
+                          { name => "bug_severity", description => "Severity" },
+                          { name => "op_sys", description => "Op Sys" }, 
+                          { name => "target_milestone", 
+                            description => "Target<br>Milestone" },
+                          { name => "short_desc", description => "Summary" } ] 
+     %]
+                          
+      [%# Small hack to keep delta column out if we don't need it %]
+      [% NEXT IF column.name == "delta" AND NOT dobefore %]                     
+
+      <td>
+        <center>
+          <b>
+            [% bug_ids_string = bug_ids.join(',') %]
+            <a href="duplicates.cgi?sortby=[% column.name %]
+              [% IF sortby == column.name %]
+                [% "&reverse=1" IF NOT reverse %]
+              [% ELSE %]
+                [%-# Some columns start off reversed %]
+                [% "&reverse=1" IF column.name.match('delta|count') %]
+              [% END %]
+              [% "&maxrows=$maxrows" IF maxrows %]
+              [% "&changedsince=$changedsince" IF changedsince %]
+              [% "&openonly=1" IF openonly %]
+              [% "&product=$product" IF product %]
+              [% "&format=$format" IF format %]
+              [% "&bug_id=$bug_ids_string&sortvisible=1" IF sortvisible %]">
+              [% column.description %]</a>
+          </b>
+        </center>
+      </td>
+    [% END %]
+  </tr>
+  
+[% IF NOT sortby %]
+  [% sortby = "count"; reverse = "1" %]
+[% END %]
+
+[% IF sortby == "id" OR sortby == "count" OR sortby == "delta" %]
+  [%# Numeric sort %]
+  [% sortedbugs = bugs.nsort(sortby) %]
+[% ELSE %]
+  [% sortedbugs = bugs.sort(sortby) %]
+[% END %]
+
+[% IF reverse %]
+  [% bugs = sortedbugs.reverse %]
+[% ELSE %]
+  [% bugs = sortedbugs %]
+[% END %]
+
+[%# *** Buglist *** %]
+
+[%# We need to keep track of the bug IDs we are actually displaying, because
+  # if the user decides to sort the visible list, we need to know what that
+  # list actually is. %]
+[% vis_bug_ids = [] %]
+
+[% FOREACH bug = bugs %]
+  [% LAST IF loop.index() >= maxrows %]
+  [% vis_bug_ids.push(bug.id) %]      
+
+  <tr>
+    <td>
+      <center>
+        [% "<strike>" IF bug.resolution != "" %]
+        <a href="show_bug.cgi?id=[% bug.id %]">[% bug.id %]</a>
+        [% "</strike>" IF bug.resolution != "" %]
+      </center>
+    </td>
+
+    <td>
+      <center>
+        [% bug.count %]
+      </center>
+    </td>
+
+    [% IF dobefore %]
+      <td><center>[% bug.delta %]</center></td>
+    [% END %]
+
+    <td>[% bug.component %]</td>
+    <td><center>[% bug.bug_severity %]</center></td>
+    <td><center>[% bug.op_sys %]</center></td>
+    <td><center>[% bug.target_milestone %]</center></td>
+    <td>[% bug.short_desc FILTER html %]</td>
+  </tr>
+[% END %]
+
+</table>
diff --git a/template/en/default/reports/duplicates.html.tmpl b/template/en/default/reports/duplicates.html.tmpl
new file mode 100644
index 000000000..64ba5e120
--- /dev/null
+++ b/template/en/default/reports/duplicates.html.tmpl
@@ -0,0 +1,175 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # products: list of strings. The products this user can see.
+  #  
+  # sortby: string. the column on which we are sorting the buglist.
+  # reverse: boolean. True if we are reversing the current sort.
+  # maxrows: integer. Max number of rows to display.
+  # changedsince: integer. The number of days ago for the changedsince column.
+  # openonly: boolean. True if we are only showing open bugs.    
+  # product: string. Restrict to this product only.
+  #
+  # Additionally, you need to fulfill the interface to
+  # duplicates-table.html.tmpl.
+  #%]
+ 
+[% IF product %]
+  [% title = "Most Frequently Reported Bugs for $product" %]
+[% ELSE %]   
+  [% title = "Most Frequently Reported Bugs" %]
+[% END%]
+
+[% PROCESS global/header.html.tmpl %]
+
+<p>
+  <a href="#explanation">What is this data?</a>
+  <br>
+  <a href="#params">Change parameters</a>
+</p>
+
+[% PROCESS "reports/duplicates-table.html.tmpl" %]
+
+<br>
+<br>
+
+[%# *** Parameters *** %]
+
+[% bug_ids_string = vis_bug_ids.join(',') %]
+
+<h3><a name="params">Change Parameters</a></h3>
+
+<form method="get" action="duplicates.cgi">
+  <input type="hidden" name="sortby" value="[% sortby %]">
+  <input type="hidden" name="reverse" value="[% reverse %]">
+  <input type="hidden" name="bug_id" value="[% bug_ids_string %]">
+  <table>
+    <tr>
+      <td>When sorting or restricting,
+          work with:</td>
+      <td>
+        <input type="radio" name="sortvisible" id="entirelist" value="0" 
+          [% "checked" IF NOT sortvisible %]>         
+        <label for="entirelist">
+          entire list
+        </label>
+        <br>        
+        <input type="radio" name="sortvisible" id="visiblelist" value="1" 
+          [% "checked" IF sortvisible %]> 
+        <label for="visiblelist">
+          currently visible list
+        </label>
+      </td>
+      <td rowspan="4" valign="top">Restrict to products:</td>
+      <td rowspan="4" valign="top">
+        <select name="product" size="5" multiple="multiple">
+          [% FOREACH p = products %]
+            <option name="[% p %]"
+            [% " selected" IF product == p %]>[% p %]</option>
+          [% END %]
+        </select>
+      </td>
+     </tr>
+
+    <tr>
+      <td>Max rows:</td>
+      <td>
+        <input size="4" name="maxrows" value="[% maxrows %]">
+      </td>
+    </tr>
+
+    <tr>
+      <td>Change column is change in the last:</td>
+      <td>
+        <input size="4" name="changedsince" value="[% changedsince %]"> days
+      </td>
+    </tr>
+
+    <tr>
+      <td>
+        <label for="openonly">
+          Open bugs only:
+        </label>
+      </td>
+      <td>
+        <input type="checkbox" name="openonly" id="openonly" value="1" 
+          [% "checked" IF openonly %]>      
+      </td>
+    </tr>
+
+  </table>
+
+  <input type="submit" value="Change"> 
+</form>
+
+<form method="post" action="buglist.cgi">
+  <input type="hidden" name="bug_id" value="[% bug_ids_string %]">
+  <input type="hidden" name="order" value="Reuse same sort as last time">
+  Or just give this to me as a <input type="submit" value="bug list">. 
+  (Note: the order may not be the same.)
+</form>
+
+<hr>
+
+<b>
+  <a name="explanation">What are "Most Frequently Reported Bugs"?</a>
+</b>
+
+<blockquote>
+  The Most Frequent Bugs page lists the known open bugs which 
+  are reported most frequently in recent builds of Mozilla. It is 
+  automatically generated from the Bugzilla database every 24 hours, by 
+  counting the number of direct and indirect duplicates of bugs.
+  This information is provided in order to assist in minimizing
+  the amount of duplicate bugs entered into Bugzilla which in turn cuts down
+  on development time.
+</blockquote>
+
+<b>How do I use this list?</b>
+
+<ul>
+  <li>Review the most frequent bugs list.</li>
+  <li>If problem is listed:</li>
+
+  <ul>
+    <li>Click on Bug # link to confirm that you have found the same bug and 
+      comment if you have additional information. Or move on with your testing
+      of the product.
+    </li>
+  </ul>
+
+  <li>If problem not listed:</li>
+
+  <ul>
+    <li>Go to the <a href="query.cgi">Bugzilla Search</a>
+      page to try and locate a similar bug that has already been written.</li>
+    <li>If you find your bug in Bugzilla, feel free to comment with any new or
+      additional data you may have.</li>
+    <li>If you cannot find your problem already documented in Bugzilla, go to
+      the
+      <a href="http://www.mozilla.org/quality/help/bug-form.html">Bugzilla
+        Helper</a>
+      and post a new bug.</li>
+  </ul>
+</ul>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/reports/keywords.html.tmpl b/template/en/default/reports/keywords.html.tmpl
new file mode 100644
index 000000000..665e360c0
--- /dev/null
+++ b/template/en/default/reports/keywords.html.tmpl
@@ -0,0 +1,75 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # keywords: array of hashes. May be empty. Each has has three members:
+  #   name: the name of the keyword
+  #   description: keyword description. May be HTML.
+  #   bugcount: number of bugs with that keyword
+  # caneditkeywords: boolean. True if this user can edit keywords
+ %]
+ 
+[% PROCESS global/header.html.tmpl 
+  title = "Bugzilla Keyword Descriptions"
+%]
+
+[% FOREACH keyword = keywords %]
+  [% IF loop.index % 50 == 0 %]
+    [% IF loop.index != 0 %]
+       </table>
+    [% END %]
+    
+    <table border="1" cellpadding="4" cellspacing="0">
+      <tr bgcolor="#6666FF">
+        <th align="left">Name</th>
+        <th align="left">Description</th>
+        <th align="left">Bugs</th>
+      </tr>
+  [% END %]  
+  
+  <tr>
+    <th>
+      <a name="[% keyword.name FILTER html %]">
+        [% keyword.name FILTER html %]</a>
+    </th>
+    <td>[% keyword.description %]</td>
+    <td align="right">
+      [% IF keyword.bugcount > 0 %]
+        <a href="buglist.cgi?keywords=[% keyword.name FILTER url_quote %]">
+          [% keyword.bugcount %]</a>
+      [% ELSE %]
+        none
+      [% END %]
+    </td>
+  </tr>
+[% END %]
+
+[% IF keywords.size > 0 %]
+  </table>
+[% END %]
+
+[% IF caneditkeywords %]
+  <p>
+    <a href="editkeywords.cgi">Edit keywords</a>.
+  </p>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/search/CVS/Entries b/template/en/default/search/CVS/Entries
new file mode 100644
index 000000000..07eaa5551
--- /dev/null
+++ b/template/en/default/search/CVS/Entries
@@ -0,0 +1,5 @@
+/boolean-charts.html.tmpl/1.1/Fri Apr 26 20:03:08 2002//TBUGZILLA-2_16
+/form.html.tmpl/1.2.2.5/Thu Jul 11 19:28:05 2002//TBUGZILLA-2_16
+/knob.html.tmpl/1.2.2.2/Sat Jun 22 23:56:00 2002//TBUGZILLA-2_16
+/search.html.tmpl/1.8.2.1/Tue Jun  4 22:56:40 2002//TBUGZILLA-2_16
+D
diff --git a/template/en/default/search/CVS/Repository b/template/en/default/search/CVS/Repository
new file mode 100644
index 000000000..13f16b4a0
--- /dev/null
+++ b/template/en/default/search/CVS/Repository
@@ -0,0 +1 @@
+mozilla/webtools/bugzilla/template/en/default/search
diff --git a/template/en/default/search/CVS/Root b/template/en/default/search/CVS/Root
new file mode 100644
index 000000000..cdb6f4a07
--- /dev/null
+++ b/template/en/default/search/CVS/Root
@@ -0,0 +1 @@
+:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
diff --git a/template/en/default/search/CVS/Tag b/template/en/default/search/CVS/Tag
new file mode 100644
index 000000000..f2ec6389c
--- /dev/null
+++ b/template/en/default/search/CVS/Tag
@@ -0,0 +1 @@
+NBUGZILLA-2_16
diff --git a/template/en/default/search/boolean-charts.html.tmpl b/template/en/default/search/boolean-charts.html.tmpl
new file mode 100644
index 000000000..2d25f91f0
--- /dev/null
+++ b/template/en/default/search/boolean-charts.html.tmpl
@@ -0,0 +1,118 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+  
+[% types = [
+  { name => "noop", description => "---" },
+  { name => "equals", description => "is equal to" },
+  { name => "notequals", description => "is not equal to" },
+  { name => "substring", description => "contains the string" },
+  { name => "casesubstring", description => "contains the string (exact case)" },
+  { name => "notsubstring", description => "does not contain the string" },
+  { name => "allwordssubstr", description => "contains all of the strings" },
+  { name => "anywordssubstr", description => "contains any of the strings" },
+  { name => "regexp", description => "contains regexp" },
+  { name => "notregexp", description => "does not contain regexp" },
+  { name => "lessthan", description => "is less than" },
+  { name => "greaterthan", description => "is greater than" },
+  { name => "anywords", description => "contains any of the words" },
+  { name => "allwords", description => "contains all of the words" },
+  { name => "nowords", description => "contains none of the words" },
+  { name => "changedbefore", description => "changed before" },
+  { name => "changedafter", description => "changed after" },
+  { name => "changedfrom", description => "changed from" },
+  { name => "changedto", description => "changed to" },
+  { name => "changedby", description => "changed by" } ] %]
+
+  <p>
+    <strong>
+      <a name="chart" href="queryhelp.cgi#advancedquerying">
+      Advanced Querying Using Boolean Charts</a>:
+    </strong>
+  </p>
+
+[%# Whoever wrote the original version of boolean charts had a seriously twisted mind %]
+
+[% jsmagic = "onclick=\"document.forms[0].action='query.cgi#chart'; document.forms[0].method='POST'; return 1;\"" %]
+
+[% FOREACH chart = default.charts %]
+  [% chartnum = loop.count - 1 %]
+  <table>
+  [% FOREACH row = chart %]
+    [% rownum = loop.count - 1 %]
+    <tr>
+    [% FOREACH col = row %]
+      [% colnum = loop.count - 1 %]
+      <td>
+        <select name="[% "field${chartnum}-${rownum}-${colnum}" %]">
+          [% FOREACH field = fields %]
+            <option value="[% field.name %]"
+              [%- " selected" IF field.name == col.field %]>[% field.description %]</option>
+          [% END %]
+        </select>
+
+        <select name="[% "type${chartnum}-${rownum}-${colnum}" %]">
+          [% FOREACH type = types %]
+            <option value="[% type.name %]"
+              [%- " selected" IF type.name == col.type %]>[% type.description %]</option>
+          [% END %]
+        </select>
+
+        <input name="[% "value${chartnum}-${rownum}-${colnum}" %]" 
+               value="[% col.value FILTER html %]"> 
+      </td>
+      
+      [% IF NOT col == row.last %]
+        <td align="center"> 
+          Or 
+        </td>    
+      [% ELSE %]
+        <td>
+          [% newor = colnum + 1 %]
+          <input type="submit" value="Or" 
+                 name="cmd-add[% "${chartnum}-${rownum}-${newor}" %]" [% $jsmagic %]>
+        </td>
+      [% END %]
+      
+    [% END %]
+    </tr>
+    
+    [% IF NOT row == chart.last %]
+    <tr>
+      <td>And</td>
+    </tr>    
+    [% ELSE %]
+    <tr>
+      <td>
+        [% newand = rownum + 1; newchart = chartnum + 1 %]
+        <input type="submit" value="And" 
+               name="cmd-add[% "${chartnum}-${newand}-0" %]"[% $jsmagic %]> 
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+        <input type="submit" value="Add another boolean chart" 
+               name="cmd-add[% newchart %]-0-0" [% $jsmagic %]>
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+      </td>
+    </tr>   
+    [% END %]
+    
+  [% END %]
+  </table>
+  <hr>
+[% END %]
diff --git a/template/en/default/search/form.html.tmpl b/template/en/default/search/form.html.tmpl
new file mode 100644
index 000000000..5e6a4d458
--- /dev/null
+++ b/template/en/default/search/form.html.tmpl
@@ -0,0 +1,672 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Chris Lahey <clahey@ximian.com> [javascript fixes]
+  #                 Christian Reis <kiko@async.com.br> [javascript rewrite]
+  #                 Gervase Markham <gerv@gerv.net>
+  #%]
+  
+  [%# Note: use Template comments and not JS ones here, to avoid bloating
+    what we actually send to the browser %]
+
+<script language="JavaScript" type="text/javascript"> <!--
+
+var first_load = true;         [%# is this the first time we load the page? %]
+var last_sel = new Array();    [%# caches last selection %]
+
+var cpts = new Array();
+var vers = new Array();
+[% IF Param('usetargetmilestone') %]
+var tms = new Array();
+[% END %]
+
+[%# Create three arrays of components, versions and target milestones, indexed 
+  # numerically according to the product they refer to. #%]
+
+[% n = 0 %]
+[% FOREACH p = product %]
+  cpts[[% n %]] = [ 
+    [%- FOREACH item = componentsbyproduct.$p %]'[% item FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ];
+  vers[[% n %]] = [ 
+    [%- FOREACH item = versionsbyproduct.$p -%]'[%  item FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ];
+  [% IF Param('usetargetmilestone') %]
+  tms[[% n %]]  = [ 
+     [%- FOREACH item = milestonesbyproduct.$p %]'[% item FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ];
+  [% END %]
+  [% n = n+1 %]
+[% END %]
+
+[%# updateSelect(array, sel, target, merging)
+  #
+  # Adds to the target select object all elements in array that
+  # correspond to the elements selected in source.
+  # - array should be a array of arrays, indexed by number. the
+  #   array should contain the elements that correspond to that
+  #   product. 
+  # - sel is a list of selected items, either whole or a diff
+  #   depending on merging.
+  # - target should be the target select object.
+  # - merging (boolean) determines if we are mergine in a diff or
+  #   substituting the whole selection. a diff is used to optimize adding
+  #   selections.
+  #
+  # Example (compsel is a select form control)
+  #
+  #     var components = Array();
+  #     components[1] = [ 'ComponentA', 'ComponentB' ];
+  #     components[2] = [ 'ComponentC', 'ComponentD' ];
+  #     source = [ 2 ];
+  #     updateSelect(components, source, compsel, 0, 0);
+  #
+  # would clear compsel and add 'ComponentC' and 'ComponentD' to it.
+  #
+  %]
+
+function updateSelect(array, sel, target, merging) {
+        
+    var i, item;
+
+    [%# If we have no versions/components/milestones %]
+    if (array.length < 1) {
+        target.options.length = 0;
+        return false;
+    }
+
+    if (merging) {
+        [%# array merging/sorting in the case of multiple selections %]
+        [%# merge in the current options with the first selection %]
+        item = merge_arrays(array[sel[0]], target.options, 1);
+
+        [%# merge the rest of the selection with the results %]
+        for (i = 1 ; i < sel.length ; i++) {
+            item = merge_arrays(array[sel[i]], item, 0);
+        }
+    } else if ( sel.length > 1 ) {
+        [%# here we micro-optimize for two arrays to avoid merging with a
+            null array %]
+        item = merge_arrays(array[sel[0]],array[sel[1]], 0);
+
+        [%# merge the arrays. not very good for multiple selections. %]
+        for (i = 2; i < sel.length; i++) {
+            item = merge_arrays(item, array[sel[i]], 0);
+        }
+    } else { [%# single item in selection, just get me the list %]
+        item = array[sel[0]];
+    }
+
+    [%# clear select %]
+    target.options.length = 0;
+
+    [%# load elements of list into select %]
+    for (i = 0; i < item.length; i++) {
+        target.options[i] = new Option(item[i], item[i]);
+    }
+    return true;
+}
+
+[%# Returns elements in a that are not in b. 
+  # NOT A REAL DIFF: does not check the reverse.
+  #    - a,b: arrays of values to be compare. %]
+function fake_diff_array(a, b) {
+    var newsel = new Array();
+    var found = false;
+
+    [%# do a boring array diff to see who's new %]
+    for (var ia in a) {
+        for (var ib in b) {
+            if (a[ia] == b[ib]) {
+                found = true;
+            }
+        }
+        if (!found) {
+            newsel[newsel.length] = a[ia];
+        }
+        found = false;
+    }
+    return newsel;
+}
+
+[%# takes two arrays and sorts them by string, returning a new, sorted
+  # array. the merge removes dupes, too.
+  #    - a, b: arrays to be merge.
+  #    - b_is_select: if true, then b is actually an optionitem and as
+  #      such we need to use item.value on it. %]
+function merge_arrays(a, b, b_is_select) {
+    var pos_a = 0;
+    var pos_b = 0;
+    var ret = new Array();
+    var bitem, aitem;
+
+    [%# iterate through both arrays and add the larger item to the return
+       list. remove dupes, too. Use toLowerCase to provide
+       case-insensitivity. %]
+    while ((pos_a < a.length) && (pos_b < b.length)) {
+        if (b_is_select) {
+            bitem = b[pos_b].value;
+        } else {
+            bitem = b[pos_b];
+        }
+        aitem = a[pos_a];
+
+        [%# smaller item in list a %]
+        if (aitem.toLowerCase() < bitem.toLowerCase()) {
+            ret[ret.length] = aitem;
+            pos_a++;
+        } else {
+            [%# smaller item in list b %]
+            if (aitem.toLowerCase() > bitem.toLowerCase()) {
+                ret[ret.length] = bitem;
+                pos_b++;
+            } else {
+                [%# list contents are equal, inc both counters. %]
+                ret[ret.length] = aitem;
+                pos_a++;
+                pos_b++;
+            }
+        }
+    }
+
+    [%# catch leftovers here. these sections are ugly code-copying. %]
+    if (pos_a < a.length) {
+        for (; pos_a < a.length ; pos_a++) {
+            ret[ret.length] = a[pos_a];
+        }
+    }
+
+    if (pos_b < b.length) {
+        for (; pos_b < b.length; pos_b++) {
+            if (b_is_select) {
+                bitem = b[pos_b].value;
+            } else {
+                bitem = b[pos_b];
+            }
+            ret[ret.length] = bitem;
+        }
+    }
+    return ret;
+}
+
+[%# Returns an array of indexes or values from a select form control.
+  #    - control: select control from which to find selections
+  #    - findall: boolean, store all options when true or just the selected 
+  #      indexes
+  #    - want_values: boolean; we store values when true and indexes when
+  #      false %]
+function get_selection(control, findall, want_values) {
+    var ret = new Array();
+
+    if ((!findall) && (control.selectedIndex == -1)) {
+        return ret;
+    }
+
+    for (var i=0; i<control.length; i++) {
+        if (findall || control.options[i].selected) {
+            ret[ret.length] = want_values ? control.options[i].value : i;
+        }
+    }
+    return ret;
+}
+
+[%# Selects items in control that have index defined in sel
+  #    - control: SELECT control to be restored
+  #    - selnames: array of indexes in select form control %]
+function restoreSelection(control, selnames) {
+    [%# right. this sucks. but I see no way to avoid going through the
+      # list and comparing to the contents of the control. %]
+    for (var j=0; j < selnames.length; j++) {
+        for (var i=0; i < control.options.length; i++) {
+            if (control.options[i].value == selnames[j]) {
+                control.options[i].selected = true;
+            }
+        }
+    }
+}
+
+[%# selectProduct reads the selection from f.product and updates
+  # f.version, component and target_milestone accordingly.
+  #     - f: a form containing product, component, varsion and
+  #       target_milestone select boxes.
+  # globals (3vil!):
+  #     - cpts, vers, tms: array of arrays, indexed by product name. the
+  #       subarrays contain a list of names to be fed to the respective
+  #       selectboxes. For bugzilla, these are generated with perl code
+  #       at page start.
+  #     - first_load: boolean, specifying if it is the first time we load
+  #       the query page.
+  #     - last_sel: saves our last selection list so we know what has
+  #       changed, and optimize for additions. %]
+function selectProduct(f) {
+    [%# this is to avoid handling events that occur before the form
+        itself is ready, which could happen in buggy browsers. %]
+    if ((!f) || (!f.product)) {
+        return;
+    }
+
+    [%# if this is the first load and nothing is selected, no need to
+        merge and sort all components; perl gives it to us sorted. %]
+    if ((first_load) && (f.product.selectedIndex == -1)) {
+        first_load = false;
+        return;
+    }
+    
+    [%# turn first_load off. this is tricky, since it seems to be
+        redundant with the above clause. It's not: if when we first load
+        the page there is _one_ element selected, it won't fall into that
+        clause, and first_load will remain 1. Then, if we unselect that
+        item, selectProduct will be called but the clause will be valid
+        (since selectedIndex == -1), and we will return - incorrectly -
+        without merge/sorting. %]
+    first_load = false;
+
+    [%# - sel keeps the array of products we are selected. 
+        - merging says if it is a full list or just a list of products that
+          were added to the current selection. %]
+    var merging = false;
+    var sel = Array();
+
+    [%# if nothing selected, pick all %]
+    var findall = f.product.selectedIndex == -1;
+    sel = get_selection(f.product, findall, false);
+    if (!findall) {
+        [%# save sel for the next invocation of selectProduct() %]
+        var tmp = sel;
+    
+        [%# this is an optimization: if we have just added products to an
+            existing selection, no need to clear the form controls and add 
+            everybody again; just merge the new ones with the existing 
+            options. %]
+        if ((last_sel.length > 0) && (last_sel.length < sel.length)) {
+            sel = fake_diff_array(sel, last_sel);
+            merging = true;
+        }
+        last_sel = tmp;
+    }
+    [%# save original options selected %]
+    var saved_cpts = get_selection(f.component, false, true);
+    var saved_vers = get_selection(f.version, false, true);
+    [% IF Param('usetargetmilestone') %]
+    var saved_tms = get_selection(f.target_milestone, false, true);
+    [% END %]
+
+    [%# do the actual fill/update, reselect originally selected options %]
+    updateSelect(cpts, sel, f.component, merging);
+    restoreSelection(f.component, saved_cpts);
+    updateSelect(vers, sel, f.version, merging);
+    restoreSelection(f.version, saved_vers);
+    [% IF Param('usetargetmilestone') %]
+    updateSelect(tms, sel, f.target_milestone, merging);
+    restoreSelection(f.target_milestone, saved_tms);
+    [% END %]
+}
+
+// -->
+</script>
+
+[% query_variants = [ 
+  { value => "allwordssubstr", description => "contains all of the words/strings" },
+  { value => "anywordssubstr", description => "contains any of the words/strings" },
+  { value => "substring", description => "contains the string" },
+  { value => "casesubstring", description => "contains the string (exact case)" },
+  { value => "allwords", description => "contains all of the words" },
+  { value => "anywords", description => "contains any of the words" },
+  { value => "regexp", description => "matches the regexp" },
+  { value => "notregexp", description => "doesn't match the regexp" } ] %]
+     
+[%# *** Summary *** %]
+
+<table>
+  <tr>
+    <th align="right">Summary:</th>
+    <td>
+      <select name="short_desc_type">
+      [% FOREACH qv = query_variants %]
+        <option value="[% qv.value %]"
+          [% " selected" IF default.short_desc_type.0 == qv.value %]>[% qv.description %]</option>
+      [% END %]              
+      </select>
+    </td>
+    <td>
+      <input name="short_desc" size="40" value="[% default.short_desc.0 FILTER html %]">
+    </td>
+    <td>
+      <input type="submit" value="[% button_name %]">
+    </td>
+  </tr>  
+
+[%# *** Product Component Version Target *** %]
+
+  <tr>
+    <td colspan="4">
+      <table>
+        <tr valign="bottom">
+          <th align="left">Product:</th>
+          <th align="left"><a href="describecomponents.cgi">Component</a>:</th>
+          <th align="left">Version:</th>
+
+        [% IF (Param("usetargetmilestone")) %]
+          <th align="left">Target:</th>
+        [% END %]
+        </tr>
+
+        <tr valign="top">
+
+          [%# Can't use the select block here because of onChange and the fact that
+              'component' is a toolkit reserved word - we use 'component_' instead. %]
+          <td align="left">
+            <select name="product" multiple="multiple" size="5" onchange="selectProduct(this.form);">
+            [% FOREACH p = product %]
+              <option value="[% p FILTER html %]"
+                [% " selected" IF lsearch(default.product, p) != -1 %]>
+                [% p FILTER html %]</option>
+            [% END %]
+            </select>
+          </td>
+
+          <td align="left">
+            <select name="component" multiple="multiple" size="5">
+            [% FOREACH c = component_ %]
+              <option value="[% c FILTER html %]"
+                [% " selected" IF lsearch(default.component, c) != -1 %]>
+                [% c FILTER html %]</option>
+            [% END %]
+            </select>
+          </td>
+
+          [% PROCESS select sel = { name => 'version', size => 5 } %]
+
+        [% IF Param('usetargetmilestone') && target_milestone.size > 0 %]
+          [% PROCESS select sel = { name => 'target_milestone', size => 5 } %]
+        [% END %]
+        </tr>
+      </table>
+    </td>
+  </tr>
+  
+[%# *** Comment URL Whiteboard Keywords *** %]
+
+  [% FOREACH field = [ 
+    { name => "long_desc", description => "A&nbsp;comment" },
+    { name => "bug_file_loc", description => "The&nbsp;URL" },
+    { name => "status_whiteboard", description => "Whiteboard" } ] %]
+
+    [% UNLESS field.name == 'status_whiteboard' AND NOT Param('usestatuswhiteboard') %]
+    <tr>
+      <th align="right">[% field.description %]:</th>
+      <td>
+        <select name="[% field.name %]_type">
+        [% FOREACH qv = query_variants %]
+          [% type = "${field.name}_type" %]                   
+          <option value="[% qv.value %]"
+            [% " selected" IF default.$type.0 == qv.value %]>[% qv.description %]</option>
+        [% END %]              
+        </select>
+      </td>
+      <td><input name="[% field.name %]" size="40" value="
+        [% default.${field.name}.0 FILTER html %]">
+      </td>
+      <td></td>
+    </tr>  
+    [% END %]
+  [% END %]
+
+  [% IF have_keywords %]
+    <tr>
+      <th align="right"><a href="describekeywords.cgi">Keywords</a>:</th>
+      <td>
+        <select name="keywords_type">
+        [% FOREACH qv = [ 
+          { name => "allwords", description => "contains all of the keywords" },
+          { name => "anywords", description => "contains any of the keywords" },
+          { name => "nowords",  description => "contains none of the keywords" } ] %]
+
+          <option value="[% qv.name %]"
+            [% " selected" IF default.keywords_type.0 == qv.name %]>
+            [% qv.description %]</option>
+        [% END %]
+        </select>
+      </td>
+      <td>
+        <input name="keywords" size="40" value="[% default.keywords.0 FILTER html %]">
+      </td>
+    </tr>
+  [% END %]
+</table>  
+
+<hr>
+
+[%# *** Status Resolution Severity Priority Hardware OS *** %]
+
+<table>
+  <tr>
+    <th align="left"><a href="queryhelp.cgi#status">Status</a>:</th>
+    <th align="left"><a href="queryhelp.cgi#resolution">Resolution</a>:</th>
+    <th align="left"><a href="queryhelp.cgi#severity">Severity</a>:</th>
+    <th align="left"><a href="queryhelp.cgi#priority">Priority</a>:</th>
+    <th align="left"><a href="queryhelp.cgi#platform">Hardware</a>:</th>
+    <th align="left"><a href="queryhelp.cgi#opsys">OS</a>:</th>
+  </tr>
+
+  <tr valign="top">
+    [% PROCESS select sel = { name => 'bug_status', size => 7 } %]
+    [% PROCESS select sel = { name => 'resolution', size => 7 } %]
+    [% PROCESS select sel = { name => 'bug_severity', size => 7 } %]    
+    [% PROCESS select sel = { name => 'priority', size => 7 } %]    
+    [% PROCESS select sel = { name => 'rep_platform', size => 7 } %]
+    [% PROCESS select sel = { name => 'op_sys', size => 7 } %]
+  </tr>
+</table>
+
+<p>
+
+[%# *** Email Numbering Votes *** %]
+
+<table>
+  <tr>
+    <td>
+      <fieldset>
+        <legend>
+          <strong>
+            <a href="queryhelp.cgi#peopleinvolved">Email</a> and Numbering
+          </strong>  
+        </legend>
+
+
+<table>
+  <tr>
+  [% FOREACH n = [1, 2] %]
+    <td>
+
+
+<table cellspacing="0" cellpadding="0">
+  <tr>
+    <td>
+      Any of:
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input type="checkbox" name="emailassigned_to[% n %]" 
+             id="emailassigned_to[% n %]" value="1"
+             [% " checked" IF default.emailassigned_to.$n %]>
+      <label for="emailassigned_to[% n %]">
+        bug owner
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input type="checkbox" name="emailreporter[% n %]" 
+             id="emailreporter[% n %]" value="1"
+             [% " checked" IF default.emailreporter.$n %]>
+      <label for="emailreporter[% n %]">
+        reporter
+      </label>
+    </td>
+  </tr>
+  [% IF Param('useqacontact') %]
+  <tr>
+    <td>
+      <input type="checkbox" name="emailqa_contact[% n %]" 
+             id="emailqa_contact[% n %]" value="1"
+             [% " checked" IF default.emailqa_contact.$n %]>
+      <label for="emailqa_contact[% n %]">
+        QA contact
+      </label>
+    </td>
+  </tr>
+  [% END %]
+  <tr>
+    <td>
+      <input type="checkbox" name="emailcc[% n %]" 
+             id="emailcc[% n %]" value="1"
+             [% " checked" IF default.emailcc.$n %]>
+      <label for="emailcc[% n %]">
+        CC list member
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+        <input type="checkbox" name="emaillongdesc[% n %]" 
+               id="emaillongdesc[% n %]" value="1"
+               [% " checked" IF default.emaillongdesc.$n %]>
+      <label for="emaillongdesc[% n %]">
+        commenter
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <select name="emailtype[% n %]">
+      [% FOREACH qv = [ 
+        { name => "substring", description => "contains" },
+        { name => "exact", description => "is" },
+        { name => "regexp", description => "matches regexp" },
+        { name => "notregexp", description => "doesn't match regexp" } ] %]
+        
+        <option value="[% qv.name %]"
+          [% " selected" IF default.emailtype.$n == qv.name %]>[% qv.description %]</option>
+      [% END %]
+      </select>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="email[% n %]" size="25" value="[% default.email.$n FILTER html %]">
+    </td>
+  </tr>
+</table>
+
+    
+    </td>
+  [% END %]
+  </tr>
+</table>
+<hr>
+<table>  
+  <tr>
+    <td>
+      <select name="bugidtype">
+        <option value="include"[% " selected" IF default.bugidtype.0 == "include" %]>Only include</option>
+        <option value="exclude"[% " selected" IF default.bugidtype.0 == "exclude" %]>Exclude</option>
+      </select>
+      bugs numbered: 
+    </td>
+    <td>
+      <input type="text" name="bug_id" value="[% default.bug_id.0 FILTER html %]" size="20">
+    </td>
+  </tr>
+  <tr>
+    <td></td>
+    <td>(comma-separated list)</td>
+  </tr>
+  [% IF Param('usevotes') %]
+    <tr>
+      <td align="right">
+        Only bugs with at least:
+      </td>
+      <td>
+        <input name="votes" size="3" value="[% default.votes.0 FILTER html %]"> votes
+      </td>
+    </tr>
+  [% END %]
+</table>
+
+
+      </fieldset>
+    </td>
+   
+[%# *** Bug Changes *** %]
+
+    <td valign="top">
+      <fieldset>
+        <legend><strong>Bug Changes</strong></legend>
+
+
+<dl>
+  <dt>Only bugs changed in the last </dt>
+  <dd><input name="changedin" size="3" value="[% default.changedin.0 FILTER html %]"> days</dd>
+</dl>
+
+<dl>
+  <dt>Only bugs where any of the fields</dt>
+  <dd>
+    <select name="chfield" multiple="multiple" size="4">
+    [% FOREACH field = chfield %]
+      <option value="[% field FILTER html %]"
+        [% " selected" IF lsearch(default.chfield, field) != -1 %]>
+        [% field FILTER html %]</option>
+    [% END %]
+    </select>
+  </dd>
+
+  <dt>were changed between</dt>
+  <dd>
+    <input name="chfieldfrom" size="10" value="[% default.chfieldfrom.0 FILTER html %]">
+    and <input name="chfieldto" size="10" value="[% default.chfieldto.0 FILTER html %]">
+    <br>(YYYY-MM-DD)
+  </dd>
+  <dt>to this value: (optional)</dt>
+  <dd>
+    <input name="chfieldvalue" size="20" value="[% default.chfieldvalue.0 FILTER html %]">
+  </dd>
+</dl>
+
+
+       </fieldset>
+     </td>
+  </tr>
+</table>
+
+[%# Note: the <form> tag is unclosed at the end of this template %]
+
+[%############################################################################%]
+[%# Block for SELECT fields                                                  #%]
+[%############################################################################%]
+
+[% BLOCK select %]
+  <td align="left">
+    <select name="[% sel.name %]" multiple="multiple" size="[% sel.size %]">
+    [% FOREACH name = ${sel.name} %]
+      <option value="[% name FILTER html %]"
+        [% " selected" IF lsearch(default.${sel.name}, name) != -1 %]>
+        [% name FILTER html %]</option>
+    [% END %]
+    </select>
+  </td>
+[% END %]
diff --git a/template/en/default/search/knob.html.tmpl b/template/en/default/search/knob.html.tmpl
new file mode 100644
index 000000000..8755f6f92
--- /dev/null
+++ b/template/en/default/search/knob.html.tmpl
@@ -0,0 +1,99 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #                 Tobias Burnus <burnus@net-b.de>
+  #                 Jouni Heikniemi <jouni@heikniemi.net>
+  #%]
+
+[%# This is not necessary for English templates, but useful for localisers. %]
+[% ordersdesc = {
+   "Reuse same sort as last time" => "Reuse same sort as last time",
+   "Bug Number"   => "Bug Number",
+   "Importance"   => "Importance",
+   "Assignee"     => "Assignee",
+   "Last Changed" => "Last Changed" } %]
+
+<br>
+[% IF NOT userid %]
+   <input type="hidden" name="cmdtype" value="doit">
+[% ELSE %]
+   <input type="radio" name="cmdtype" value="doit" checked="checked">
+     Run this query
+   <br>
+   [% IF namedqueries.size > 0 %]
+     <br>
+     <table cellspacing="0" cellpadding="0">
+       <tr>
+         <td>
+           <input type="radio" name="cmdtype" value="editnamed">
+           Load my remembered query:
+         </td>
+         <td rowspan="3">
+           &nbsp;&nbsp;<select name="namedcmd">
+             [% FOREACH query = namedqueries %]
+               <option value="[% query FILTER html %]">
+                 [% query FILTER html %]</option>
+             [% END %]
+           </select>
+         </td>
+       </tr>  
+       <tr>
+         <td>
+           <input type="radio" name="cmdtype" value="runnamed">
+           Run my remembered query:
+         </td>
+       </tr>
+       <tr>
+          <td>
+           <input type="radio" name="cmdtype" value="forgetnamed">
+           Forget my remembered query:
+         </td>
+       </tr>
+     </table>
+     <br>
+   [% END %]
+   <input type="radio" name="cmdtype" value="asdefault">
+     Remember this as my default query
+   <br>
+   <input type="radio" name="cmdtype" value="asnamed">
+     Remember this query, and name it: 
+     <input type="text" name="newqueryname">
+     <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+     <input type="checkbox" name="tofooter" value="1">
+       and put it in my page footer
+[% END %]
+
+  <p>
+    Sort results by:
+    <select name="order">
+    [% FOREACH order = orders %]
+      <option value="[% order FILTER html %]"
+        [% " selected" IF default.order.0 == order %]>
+           [% ordersdesc.$order FILTER html %]</option> 
+    [% END %]
+    </select>
+
+    <input type="submit" value="[% button_name %]">
+    [% IF userdefaultquery %]
+       <p>
+         <a href="query.cgi?nukedefaultquery=1">
+           Set my default query back to the system default</a>
+       </p>
+    [% END %]
+  </p>
diff --git a/template/en/default/search/search.html.tmpl b/template/en/default/search/search.html.tmpl
new file mode 100644
index 000000000..09e83add8
--- /dev/null
+++ b/template/en/default/search/search.html.tmpl
@@ -0,0 +1,51 @@
+<!-- 1.0@bugzilla.org -->
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Gervase Markham <gerv@gerv.net>
+  #%]
+
+[%# INTERFACE:
+  # This template has no interface. However, to use it, you need to fulfill
+  # the interfaces of search/form.html.tmpl, search/knob.html.tmpl and
+  # search/boolean-charts.html.tmpl.
+  #%]
+
+[% PROCESS global/header.html.tmpl 
+  title = "Search for bugs"
+  onload = "selectProduct(document.forms['queryform']);"
+%]
+
+[% button_name = "Search" %]
+
+<form method="get" action="buglist.cgi" name="queryform">
+
+[% PROCESS search/form.html.tmpl %]
+
+[% PROCESS search/knob.html.tmpl %]
+
+<hr>
+
+[% PROCESS "search/boolean-charts.html.tmpl" %]
+
+<p>
+  Give me a <a href="queryhelp.cgi">clue</a> about how to use this form.
+</p>
+
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/sidebar.xul.tmpl b/template/en/default/sidebar.xul.tmpl
new file mode 100644
index 000000000..cab1270af
--- /dev/null
+++ b/template/en/default/sidebar.xul.tmpl
@@ -0,0 +1,119 @@
+[% template_version = "1.0@bugzilla.org" %]
+[%# -*- mode: sgml -*- %]
+[%# The contents of this file are subject to the Mozilla Public
+  # License Version 1.1 (the "License"); you may not use this file
+  # except in compliance with the License. You may obtain a copy of
+  # the License at http://www.mozilla.org/MPL/
+  #
+  # Software distributed under the License is distributed on an "AS
+  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+  # implied. See the License for the specific language governing
+  # rights and limitations under the License.
+  #
+  # The Original Code is the Bugzilla Bug Tracking System.
+  #
+  # The Initial Developer of the Original Code is Netscape Communications
+  # Corporation. Portions created by Netscape are
+  # Copyright (C) 1998 Netscape Communications Corporation. All
+  # Rights Reserved.
+  #
+  # Contributor(s): Jacob Steenhagen <jake@acutex.net>
+  #                 Scott Collins <scc@mozilla.org>
+  #                 Christopher A. Aillon <christopher@aillon.com>
+  #%]
+<?xml version="1.0"?>
+<!-- [% template_version %] -->
+<?xml-stylesheet href="chrome://communicator/skin/" type="text/css"?>
+<?xml-stylesheet href="[% Param('urlbase') %]css/panel.css" type="text/css"?>
+<window
+  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+  xmlns:html="http://www.w3.org/1999/xhtml"
+  orient="vertical"
+  onload="document.getElementById('query-field').addEventListener('keypress', initial_keypress_handler, true)">
+
+<!-- Load QuickSearch libraries -->
+<script type="application/x-javascript" src="localconfig.js"/>
+<script type="application/x-javascript" src="quicksearch.js"/>
+<script type="application/x-javascript"><![CDATA[
+
+// Tell QuickSearch that the source of this is the sidebar
+var sidebar = 1;
+
+function load_relative_url( aRelativeURL ) {
+    aRelativeURL = '[% Param('urlbase') %]' + aRelativeURL;
+    _content.location = aRelativeURL;
+}
+
+function initial_keypress_handler( aEvent ) {
+    this.removeAttribute("class");
+    this.addEventListener("keypress", normal_keypress_handler, true);
+    this.removeEventListener("keypress", initial_keypress_handler, true);
+}
+
+function normal_keypress_handler( aEvent ) {
+    if ( aEvent.keyCode == 13 )
+      QuickSearch(this.value);
+}
+
+]]></script>
+
+  <textbox id="query-field" class="descriptive-content" value="enter query" onfocus="this.setSelectionRange(0,this.value.length)"/>
+
+  <separator class="groove"/>
+
+  <box autostretch="never" valign="top">
+    <box orient="vertical" flex="1">
+      <text class="text-link" onclick="load_relative_url('query.cgi')" value="new query"/>
+      <text class="text-link" onclick="load_relative_url('reports.cgi')" value="reports"/>
+      <text class="text-link" onclick="load_relative_url('enter_bug.cgi')" value="new bug"/>
+      <separator class="thin"/>
+
+[% IF username %]
+      <text class="text-link" onclick="load_relative_url('userprefs.cgi')" value="edit prefs"/>
+  [%- IF UserInGroup('tweakparams') %]
+      <text class="text-link" onclick="load_relative_url('editparams.cgi')" value="edit params"/>
+  [%- END %]
+  [%- IF UserInGroup('editusers') || blessgroupset %]
+      <text class="text-link" onclick="load_relative_url('editusers.cgi')" value="edit users"/>
+  [%- END %]
+  [%- IF UserInGroup('editcomponents') %]
+      <text class="text-link" onclick="load_relative_url('editcomponents.cgi')" value="edit components"/>
+  [%- END %]
+  [%- IF UserInGroup('creategroups') %]
+      <text class="text-link" onclick="load_relative_url('editgroups.cgi')" value="edit groups"/>
+  [%- END %]
+  [%- IF UserInGroup('editkeywords') %]
+      <text class="text-link" onclick="load_relative_url('editkeywords.cgi')" value="edit keywords"/>
+  [%- END %]
+  [%- IF UserInGroup('tweakparams') %]
+      <text class="text-link" onclick="load_relative_url('sanitycheck.cgi')" value="sanity check"/>
+  [%- END %]
+      <text class="text-link" onclick="load_relative_url('relogin.cgi')" value="logout [% username FILTER html %]"/>
+      <separator class="thin"/>
+  [%- IF mybugsurl %]
+      <text class="text-link" onclick="load_relative_url('[% mybugsurl FILTER html %]')" value="my bugs"/>
+  [%- END %]
+  [%- IF Param('usevotes') %]
+      <text class="text-link" onclick="load_relative_url('votes.cgi?action=show_user')" value="my votes"/>
+  [%- END %]
+
+  [%- FOREACH name = namedqueries %]
+      <text class="text-link" onclick="load_relative_url('buglist.cgi?cmdtype=runnamed&amp;namedcmd=[% name FILTER url_quote %]')" value="[% name FILTER html %]"/>
+  [% END %]
+
+[% ELSE %]
+      <text class="text-link" onclick="load_relative_url('createaccount.cgi')" value="new user"/>
+      <text class="text-link" onclick="load_relative_url('query.cgi?GoAheadAndLogIn=1')" value="log in"/>
+[% END %]
+
+    </box>
+  </box>
+
+  <spring flex="1"/>
+  <box orient="horizontal">
+    <spring flex="1"/>
+    <html align="right">
+      <html:a class="text-link" href="[% Param('urlbase') %]sidebar.cgi">reload</html:a>
+    </html>
+  </box>
+</window>
diff --git a/token.cgi b/token.cgi
index 2fed15ad0..72406223f 100755
--- a/token.cgi
+++ b/token.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -28,11 +28,16 @@
 use diagnostics;
 use strict;
 
+use lib qw(.);
+
+use vars qw($template $vars);
+
 # Include the Bugzilla CGI and general utility library.
 require "CGI.pl";
 
 # Establish a connection to the database backend.
 ConnectToDatabase();
+quietly_check_login();
 
 # Use the "Token" module that contains functions for doing various
 # token-related tasks.
@@ -65,10 +70,13 @@ if ($::FORM{'t'}) {
       exit;
   }
 
+
+  Token::CleanTokenTable();
+
   # Make sure the token exists in the database.
   SendSQL( "SELECT tokentype FROM tokens WHERE token = $::quotedtoken" );
   (my $tokentype = FetchSQLData())
-    || DisplayError("The token you submitted does not exist.")
+    || DisplayError("The token you submitted does not exist, has expired, or has been cancelled.")
     && exit;
 
   # Make sure the token is the correct type for the action being taken.
@@ -77,6 +85,20 @@ if ($::FORM{'t'}) {
     Token::Cancel($::token, "user tried to use token to change password");
     exit;
   }
+  if ( ($::action eq 'cxlem') 
+      && (($tokentype ne 'emailold') && ($tokentype ne 'emailnew')) ) {
+    DisplayError("That token cannot be used to cancel an email address change.");
+    Token::Cancel($::token, 
+                  "user tried to use token to cancel email address change");
+    exit;
+  }
+  if ( grep($::action eq $_ , qw(cfmem chgem)) 
+      && ($tokentype ne 'emailnew') ) {
+    DisplayError("That token cannot be used to change your email address.");
+    Token::Cancel($::token, 
+                  "user tried to use token to confirm email address change");
+    exit;
+  }
 }
 
 # If the user is requesting a password change, make sure they submitted
@@ -128,6 +150,12 @@ if ($::action eq 'reqpw') {
     cancelChangePassword(); 
 } elsif ($::action eq 'chgpw') { 
     changePassword(); 
+} elsif ($::action eq 'cfmem') {
+    confirmChangeEmail();
+} elsif ($::action eq 'cxlem') {
+    cancelChangeEmail();
+} elsif ($::action eq 'chgem') {
+    changeEmail();
 } else { 
     # If the action that the user wants to take (specified in the "a" form field)
     # is none of the above listed actions, display an error telling the user 
@@ -142,72 +170,39 @@ exit;
 ################################################################################
 
 sub requestChangePassword {
-
     Token::IssuePasswordToken($::FORM{'loginname'});
 
-    # Return HTTP response headers.
-    print "Content-Type: text/html\n\n";
+    $vars->{'title'} = "Request to Change Password";
+    $vars->{'message'} = "A token for changing your password has been 
+                          emailed to you. Follow the instructions in 
+                          that email to change your password.";
 
-    PutHeader("Request to Change Password");
-    print qq|
-        <p>
-        A token for changing your password has been emailed to you.
-        Follow the instructions in that email to change your password.
-        </p>
-    |;
-    PutFooter();
+    print "Content-Type: text/html\n\n";
+    $template->process("global/message.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
 }
 
 sub confirmChangePassword {
-
-    # Return HTTP response headers.
+    $vars->{'title'} = "Change Password";
+    $vars->{'token'} = $::token;
+    
     print "Content-Type: text/html\n\n";
-
-    PutHeader("Change Password");
-    print qq|
-      <p>
-      To change your password, enter a new password twice:
-      </p>
-      <form method="post" action="token.cgi">
-        <input type="hidden" name="t" value="$::token">
-        <input type="hidden" name="a" value="chgpw">
-        <table>
-          <tr>
-            <th align="right">New Password:</th>
-            <td><input type="password" name="password" size="16" maxlength="16"></td>
-          </tr>
-          <tr>
-            <th align="right">New Password Again:</th>
-            <td><input type="password" name="matchpassword" size="16" maxlength="16"></td>
-          </tr>
-          <tr>
-            <th align="right">&nbsp;</th>
-            <td><input type="submit" value="Submit"></td>
-          </tr>
-        </table>
-      </form>
-    |;
-    PutFooter();
+    $template->process("account/password/set-forgotten-password.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
 }
 
-sub cancelChangePassword {
-    
+sub cancelChangePassword {    
     Token::Cancel($::token, "user requested cancellation");
 
-    # Return HTTP response headers.
-    print "Content-Type: text/html\n\n";
+    $vars->{'title'} = "Cancel Request to Change Password";
+    $vars->{'message'} = "Your request has been cancelled.";
 
-    PutHeader("Cancel Request to Change Password");
-    print qq|
-      <p>
-      Your request has been cancelled.
-      </p>
-    |;
-    PutFooter();
+    print "Content-Type: text/html\n\n";
+    $template->process("global/message.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
 }
 
 sub changePassword {
-
     # Quote the password and token for inclusion into SQL statements.
     my $cryptedpassword = Crypt($::FORM{'password'});
     my $quotedpassword = SqlQuote($cryptedpassword);
@@ -225,19 +220,117 @@ sub changePassword {
     SendSQL("DELETE FROM tokens WHERE token = $::quotedtoken");
     SendSQL("UNLOCK TABLES");
 
+    InvalidateLogins($userid);
+
+    $vars->{'title'} = "Password Changed";
+    $vars->{'message'} = "Your password has been changed.";
+
+    print "Content-Type: text/html\n\n";
+    $template->process("global/message.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
+}
+
+sub confirmChangeEmail {
+    # Return HTTP response headers.
+    print "Content-Type: text/html\n\n";
+
+    $vars->{'title'} = "Confirm Change Email";
+    $vars->{'token'} = $::token;
+
+    $template->process("account/email/confirm.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
+}
+
+sub changeEmail {
+
+    # Get the user's ID from the tokens table.
+    SendSQL("SELECT userid, eventdata FROM tokens 
+              WHERE token = $::quotedtoken");
+    my ($userid, $eventdata) = FetchSQLData();
+    my ($old_email, $new_email) = split(/:/,$eventdata);
+    my $quotednewemail = SqlQuote($new_email);
+
+    # Check the user entered the correct old email address
+    if($::FORM{'email'} ne $old_email) {
+        DisplayError("Email Address confirmation failed");
+        exit;
+    }
+    # The new email address should be available as this was 
+    # confirmed initially so cancel token if it is not still available
+    if (! ValidateNewUser($new_email,$old_email)) {
+        DisplayError("Account $new_email already exists.");
+        Token::Cancel($::token,"Account $new_email already exists.");
+        exit;
+    } 
+
+    # Update the user's login name in the profiles table and delete the token
+    # from the tokens table.
+    SendSQL("LOCK TABLES profiles WRITE , tokens WRITE");
+    SendSQL("UPDATE   profiles
+         SET      login_name = $quotednewemail
+         WHERE    userid = $userid");
+    SendSQL("DELETE FROM tokens WHERE token = $::quotedtoken");
+    SendSQL("DELETE FROM tokens WHERE userid = $userid 
+                                  AND tokentype = 'emailnew'");
+    SendSQL("UNLOCK TABLES");
+
     # Return HTTP response headers.
     print "Content-Type: text/html\n\n";
 
-    # Let the user know their password has been changed.
-    PutHeader("Password Changed");
-    print qq|
-      <p>
-      Your password has been changed.
-      </p>
-    |;
-    PutFooter();
+    # Let the user know their email address has been changed.
+
+    $vars->{'title'} = "Bugzilla Login Changed";
+    $vars->{'message'} = "Your Bugzilla login has been changed.";
+
+    $template->process("global/message.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
 }
 
+sub cancelChangeEmail {
+    # Get the user's ID from the tokens table.
+    SendSQL("SELECT userid, tokentype, eventdata FROM tokens 
+             WHERE token = $::quotedtoken");
+    my ($userid, $tokentype, $eventdata) = FetchSQLData();
+    my ($old_email, $new_email) = split(/:/,$eventdata);
+
+    if($tokentype eq "emailold") {
+        $vars->{'message'} = "The request to change the email address " .
+            "for your account to $new_email has been cancelled.";
+
+        SendSQL("SELECT login_name FROM profiles WHERE userid = $userid");
+        my $actualemail = FetchSQLData();
+        
+        # check to see if it has been altered
+        if($actualemail ne $old_email) {
+            my $quotedoldemail = SqlQuote($old_email);
+
+            SendSQL("LOCK TABLES profiles WRITE");
+            SendSQL("UPDATE   profiles
+                 SET      login_name = $quotedoldemail
+                 WHERE    userid = $userid");
+            SendSQL("UNLOCK TABLES");
+            $vars->{'message'} .= 
+                "  Your old account settings have been reinstated.";
+        } 
+    } 
+    else {
+        $vars->{'message'} = "The request to change the email address " .
+            "for the $old_email account to $new_email has been cancelled.";
+    }
+    Token::Cancel($::token, $vars->{'message'});
+
+    SendSQL("LOCK TABLES tokens WRITE");
+    SendSQL("DELETE FROM tokens 
+             WHERE userid = $userid 
+             AND tokentype = 'emailold' OR tokentype = 'emailnew'");
+    SendSQL("UNLOCK TABLES");
+
+    # Return HTTP response headers.
+    print "Content-Type: text/html\n\n";
 
+    $vars->{'title'} = "Cancel Request to Change Email Address";
 
+    $template->process("global/message.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
+}
 
diff --git a/userprefs.cgi b/userprefs.cgi
index fad31b4e4..649008864 100755
--- a/userprefs.cgi
+++ b/userprefs.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -17,16 +17,19 @@
 #                 Dan Mosedale <dmose@mozilla.org>
 #                 Alan Raetz <al_raetz@yahoo.com>
 #                 David Miller <justdave@syndicomm.com>
-#
+#                 Christopher Aillon <christopher@aillon.com>
+#                 Gervase Markham <gerv@gerv.net>
 
 use diagnostics;
 use strict;
 
+use lib qw(.);
+
 require "CGI.pl";
 
 use RelationSet;
 
-# Shut up misguided -w warnings about "used only once".  "use vars" just
+# Shut up misguided -w warnings about "used only once". "use vars" just
 # doesn't work for me.
 sub sillyness {
     my $zz;
@@ -34,615 +37,366 @@ sub sillyness {
     $zz = $::usergroupset;
 }
 
-my $userid;
-
-my $showNewEmailTech;
-
-# Note the use of arrays instead of hashes: we want the items
-# displayed in the same order as they appear in the array.
-
-my @emailGroups = (
-        'Owner',        'the Bug Owner',
-        'Reporter',     'the Reporter',
-        'QAcontact',    'the QA contact',
-        'CClist',       'on the CC list',
-        'Voter',        'a Voter'
-        );
-
-my @emailFlags = (
-        'Removeme',     'When I\'m added to or removed from this capacity',
-        'Comments',     'New Comments',
-        'Attachments',  'New Attachments',
-        'Status',       'Priority, status, severity, and milestone changes',
-        'Resolved',     'When the bug is resolved or verified',
-        'Keywords',     'Keywords field changes',
-        'CC',           'CC field changes',
-        'Other',        'Any field not mentioned above changes'
-        );
-
-my $defaultEmailFlagString =
-        'ExcludeSelf~'               . 'on~' .
-
-        'emailOwnerRemoveme~'        . 'on~' .
-        'emailOwnerComments~'        . 'on~' .
-        'emailOwnerAttachments~'     . 'on~' .
-        'emailOwnerStatus~'          . 'on~' .
-        'emailOwnerResolved~'        . 'on~' .
-        'emailOwnerKeywords~'        . 'on~' .
-        'emailOwnerCC~'              . 'on~' .
-        'emailOwnerOther~'           . 'on~' .
-
-        'emailReporterRemoveme~'     . 'on~' .
-        'emailReporterComments~'     . 'on~' .
-        'emailReporterAttachments~'  . 'on~' .
-        'emailReporterStatus~'       . 'on~' .
-        'emailReporterResolved~'     . 'on~' .
-        'emailReporterKeywords~'     . 'on~' .
-        'emailReporterCC~'           . 'on~' .
-        'emailReporterOther~'        . 'on~' .
-
-        'emailQAcontactRemoveme~'    . 'on~' .
-        'emailQAcontactComments~'    . 'on~' .
-        'emailQAcontactAttachments~' . 'on~' .
-        'emailQAcontactStatus~'      . 'on~' .
-        'emailQAcontactResolved~'    . 'on~' .
-        'emailQAcontactKeywords~'    . 'on~' .
-        'emailQAcontactCC~'          . 'on~' .
-        'emailQAcontactOther~'       . 'on~' .
-
-        'emailCClistRemoveme~'       . 'on~' .
-        'emailCClistComments~'       . 'on~' .
-        'emailCClistAttachments~'    . 'on~' .
-        'emailCClistStatus~'         . 'on~' .
-        'emailCClistResolved~'       . 'on~' .
-        'emailCClistKeywords~'       . 'on~' .
-        'emailCClistCC~'             . 'on~' .
-        'emailCClistOther~'          . 'on~' .
-
-        'emailVoterRemoveme~'        . 'on~' .
-        'emailVoterComments~'        . 'on~' .
-        'emailVoterAttachments~'     . 'on~' .
-        'emailVoterStatus~'          . 'on~' .
-        'emailVoterResolved~'        . 'on~' .
-        'emailVoterKeywords~'        . 'on~' .
-        'emailVoterCC~'              . 'on~' .
-        'emailVoterOther~'           . 'on' ;
-
-sub EmitEntry {
-    my ($description, $entry) = (@_);
-    print qq{<TR><TH ALIGN="right">$description:</TH><TD>$entry</TD></TR>\n};
-}
+# Use global template variables.
+use vars qw($template $vars $userid);
+
+# The default email flags leave all email on.
+my $defaultflagstring = "ExcludeSelf~on~";
+
+my @roles = ("Owner", "Reporter", "QAcontact", "CClist", "Voter");
+my @reasons = ("Removeme", "Comments", "Attachments", "Status", "Resolved", 
+               "Keywords", "CC", "Other");
 
-sub Error {
-    my ($msg) = (@_);
-    print qq{
-$msg
-<P>
-Please hit <B>back</B> and try again.
-};
-    PutFooter();
-    exit();
+foreach my $role (@roles) {
+    foreach my $reason (@reasons) {
+        $defaultflagstring .= "email$role$reason~on~";
+    }
 }
 
+# Remove final "~".
+chop $defaultflagstring;
 
-sub ShowAccount {
+###############################################################################
+# Each panel has two functions - panel Foo has a DoFoo, to get the data 
+# necessary for displaying the panel, and a SaveFoo, to save the panel's 
+# contents from the form data (if appropriate.) 
+# SaveFoo may be called before DoFoo.    
+###############################################################################
+sub DoAccount {
     SendSQL("SELECT realname FROM profiles WHERE userid = $userid");
-    my ($realname) = (FetchSQLData());
-
-    $realname = value_quote($realname);
-        
-    EmitEntry("Old password",
-              qq|<input type=hidden name="Bugzilla_login" value="$::COOKIE{Bugzilla_login}">| .
-              qq|<input type=password name="Bugzilla_password">|);
-    EmitEntry("New password",
-              qq{<input type=password name="pwd1">});
-    EmitEntry("Re-enter new password", 
-              qq{<input type=password name="pwd2">});
-    EmitEntry("Your real name (optional)",
-              qq{<INPUT SIZE=35 NAME="realname" VALUE="$realname">});
+    $vars->{'realname'} = FetchSQLData();
+
+    if(Param('allowemailchange')) {
+        SendSQL("SELECT tokentype, issuedate + INTERVAL 3 DAY, eventdata 
+                    FROM tokens
+                    WHERE userid = $userid
+                    AND tokentype LIKE 'email%' 
+                    ORDER BY tokentype ASC LIMIT 1");
+        if(MoreSQLData()) {
+            my ($tokentype, $change_date, $eventdata) = &::FetchSQLData();
+            $vars->{'login_change_date'} = $change_date;
+
+            if($tokentype eq 'emailnew') {
+                my ($oldemail,$newemail) = split(/:/,$eventdata);
+                $vars->{'new_login_name'} = $newemail;
+            }
+        }
+    }
 }
 
 sub SaveAccount {
-    if ($::FORM{'Bugzilla_password'} ne ""
-        || $::FORM{'pwd1'} ne "" || $::FORM{'pwd2'} ne "") {
+    my $pwd1 = $::FORM{'new_password1'};
+    my $pwd2 = $::FORM{'new_password2'};
+
+    if ($::FORM{'Bugzilla_password'} ne "" || 
+        $pwd1 ne "" || $pwd2 ne "") 
+    {
         my $old = SqlQuote($::FORM{'Bugzilla_password'});
-        my $pwd1 = SqlQuote($::FORM{'pwd1'});
-        my $pwd2 = SqlQuote($::FORM{'pwd2'});
         SendSQL("SELECT cryptpassword FROM profiles WHERE userid = $userid");
         my $oldcryptedpwd = FetchOneColumn();
-        if ( !$oldcryptedpwd ) {
-            Error("I was unable to retrieve your old password from the database.");
-        }
-        if ( crypt($::FORM{'Bugzilla_password'}, $oldcryptedpwd) ne $oldcryptedpwd ) {
-            Error("You did not enter your old password correctly.");
+        if (!$oldcryptedpwd) {
+            DisplayError("I was unable to retrieve your old password from the database.");
+            exit;
         }
-        if ($pwd1 ne $pwd2) {
-            Error("The two passwords you entered did not match.");
+        if (crypt($::FORM{'Bugzilla_password'}, $oldcryptedpwd) ne 
+                  $oldcryptedpwd) 
+        {
+            DisplayError("You did not enter your old password correctly.");
+            exit;
         }
-        if ($::FORM{'pwd1'} eq '') {
-            Error("You must enter a new password.");
-        }
-        my $passworderror = ValidatePassword($::FORM{'pwd1'});
-        Error($passworderror) if $passworderror;
 
-        my $cryptedpassword = SqlQuote(Crypt($::FORM{'pwd1'}));
-        SendSQL("UPDATE  profiles 
-                 SET     cryptpassword = $cryptedpassword 
-                 WHERE   userid = $userid");
+        if ($pwd1 ne "" || $pwd2 ne "")
+        {
+            if ($pwd1 ne $pwd2) {
+                DisplayError("The two passwords you entered did not match.");
+                exit;
+            }
+            if ($::FORM{'new_password1'} eq '') {
+                DisplayError("You must enter a new password.");
+                exit;
+            }
+            my $passworderror = ValidatePassword($pwd1);
+            (DisplayError($passworderror) && exit) if $passworderror;
+        
+            my $cryptedpassword = SqlQuote(Crypt($pwd1));
+            SendSQL("UPDATE profiles 
+                     SET    cryptpassword = $cryptedpassword 
+                     WHERE  userid = $userid");
+            # Invalidate all logins except for the current one
+            InvalidateLogins($userid, $::COOKIE{"Bugzilla_logincookie"});
+        }
     }
-    SendSQL("UPDATE profiles SET " .
-            "realname = " . SqlQuote($::FORM{'realname'}) .
-            " WHERE userid = $userid");
-}
 
-#
-# Set email flags in database based on the parameter string.
-#
-sub setEmailFlags ($) {
+    if(Param("allowemailchange") && $::FORM{'new_login_name'}) {
+        my $old_login_name = $::FORM{'Bugzilla_login'};
+        my $new_login_name = trim($::FORM{'new_login_name'});
 
-    my $emailFlagString = $_[0];
+        if($old_login_name ne $new_login_name) {
+            if( $::FORM{'Bugzilla_password'} eq "") {
+                DisplayError("You must enter your old password to 
+                                             change email address.");
+                exit;
+            }
 
-    SendSQL("UPDATE profiles SET emailflags = " .
-            SqlQuote($emailFlagString) . " WHERE userid = $userid");
-}
+            use Token;
+            # Block multiple email changes for the same user.
+            if (Token::HasEmailChangeToken($userid)) {
+                DisplayError("Email change already in progress; 
+                                          please check your email.");
+                exit;
+            }
+
+            # Before changing an email address, confirm one does not exist.
+            CheckEmailSyntax($new_login_name);
+            trick_taint($new_login_name);
+            if (!ValidateNewUser($new_login_name)) {
+                DisplayError("Account $new_login_name already exists");
+                exit;
+            }
 
+            Token::IssueEmailChangeToken($userid,$old_login_name,
+                                                 $new_login_name);
 
-sub ShowEmailOptions () {
+            $vars->{'changes_saved'} = 
+                "An email has been sent to both old and new email 
+                 addresses to confirm the change of email address.";
+        }
+    }
 
+    SendSQL("UPDATE profiles SET " .
+            "realname = " . SqlQuote(trim($::FORM{'realname'})) .
+            " WHERE userid = $userid");
+}
+
+
+sub DoEmail {
     if (Param("supportwatchers")) {
         my $watcheduserSet = new RelationSet;
         $watcheduserSet->mergeFromDB("SELECT watched FROM watch WHERE" .
                                     " watcher=$userid");
-        my $watchedusers = $watcheduserSet->toString();
-
-        print qq{
-<TR><TD COLSPAN="4"><HR></TD></TR>
-<TR><TD COLSPAN="4">
-If you want to help cover for someone when they're on vacation, or if
-you need to do the QA related to all of their bugs, you can tell bugzilla
-to send mail related to their bugs to you also.  List the email addresses
-of any users you wish to watch here, separated by commas.
-</TD></TR>};
-
-        EmitEntry("Users to watch",
-              qq{<INPUT SIZE=35 NAME="watchedusers" VALUE="$watchedusers">});
+        $vars->{'watchedusers'} = $watcheduserSet->toString();
     }
 
-    print qq{<TR><TD COLSPAN="2"><HR></TD></TR>};
-
-    showAdvancedEmailFilterOptions();
-
-print qq {
-<TABLE CELLSPACING="0" CELLPADDING="10" BORDER=0 WIDTH="100%">
-<TR><TD>};
-
-}
-
-sub showAdvancedEmailFilterOptions () {
-
-    my $flags;
-    my $notify;
-    my %userEmailFlags = ();
-
-    print qq{
-        <TR><TD COLSPAN="2"><center>
-        <font size=+1>Advanced Email Filtering Options</font>
-        </center>
-        </TD></TR><tr><td colspan="2">
-        <p>
-        <center>
-        If you don't like getting a notification for "trivial"
-        changes to bugs, you can use the settings below to
-        filter some (or even all) notifications.
-        </center></td></tr></table>
-       <hr width=800 align=center>
-    };
-
     SendSQL("SELECT emailflags FROM profiles WHERE userid = $userid");
 
-    ($flags) = FetchSQLData();
+    my ($flagstring) = FetchSQLData();
 
-    # if the emailflags haven't been set before, that means that this user 
-    # hasn't been to (the email pane of?) userprefs.cgi since the change to 
-    # use emailflags.  create a default flagset for them, based on
+    # If the emailflags haven't been set before, that means that this user 
+    # hasn't been to the email pane of userprefs.cgi since the change to 
+    # use emailflags. Create a default flagset for them, based on
     # static defaults. 
-    #
-    if ( !$flags ) {
-        $flags = $defaultEmailFlagString;
-        setEmailFlags($flags);
+    if (!$flagstring) {
+        $flagstring = $defaultflagstring;
+        SendSQL("UPDATE profiles SET emailflags = " .
+                SqlQuote($flagstring) . " WHERE userid = $userid");
     }
 
-    # the 255 param is here, because without a third param, split will
-    # trim any trailing null fields, which causes perl to eject lots of
-    # warnings.  any suitably large number would do.
-    #
-    %userEmailFlags = split(/~/ , $flags, 255);
-
-    showExcludeSelf(\%userEmailFlags);
-
-    # print STDERR "$flags\n";
-
-    print qq{
-                <hr width=800 align=left>
-                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-                  <b>Field/recipient specific options:</b><br><br>
-              };
-
-
-    my @tmpGroups = @emailGroups;
-    while ((my $groupName,my $groupText) = splice(@tmpGroups,0,2) ) {
-        printEmailPrefGroup($groupName,$groupText,\%userEmailFlags);
+    # The 255 param is here, because without a third param, split will
+    # trim any trailing null fields, which causes Perl to eject lots of
+    # warnings. Any suitably large number would do.
+    my %emailflags = split(/~/, $flagstring, 255);
+
+    # Determine the value of the "excludeself" global email preference.
+    # Note that the value of "excludeself" is assumed to be off if the
+    # preference does not exist in the user's list, unlike other 
+    # preferences whose value is assumed to be on if they do not exist.
+    if (exists($emailflags{'ExcludeSelf'}) 
+        && $emailflags{'ExcludeSelf'} eq 'on')
+    {
+        $vars->{'excludeself'} = 1;
     }
-
-}
-
-sub showExcludeSelf (\%) {
-
-     my %CurrentFlags = %{$_[0]};
-     
-     my $excludeSelf = " ";
-
-     while ( my ($key,$value) = each (%CurrentFlags) ) {
-
-     # print qq{flag name: $key    value: $value<br>};
-
-        if ( $key eq 'ExcludeSelf' ) {
-
-                if ( $value eq 'on' ) {
-
-                        $excludeSelf = "CHECKED";
-                        }
-                }
-        }
-
-        print qq {
-                <table><tr><td colspan=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-                <b>Global options:</b></tr>
-                <tr><td width=150></td><td>
-                Do not email me bugs that I change
-             <input type="checkbox" name="ExcludeSelf" VALUE="on" $excludeSelf>
-                <br>
-                </td>
-                </tr>
-                </table>
-                };
-
-}
-
-sub printEmailPrefGroup ($$\%) {
-
-    my ($groupName,$textName,$refCurrentFlags) = @_[0,1,2];
-    my @tmpFlags = @emailFlags;
-
-    print qq {<table cellspacing=0 cellpadding=6> };
-    print qq {<tr><td colspan=2> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-                When I\'m $textName, email me:</td></tr> };
-
-    while ((my $flagName,my $flagText) = splice(@tmpFlags,0,2)) {
-
-        printEmailOption($groupName . $flagName, $flagText, $refCurrentFlags);
+    else {
+        $vars->{'excludeself'} = 0;
     }
-    print qq { </table> };
-    print qq { <hr WIDTH=320 ALIGN=left> };
-}
-
-sub printEmailOption ($$\%) {
-
-    my $value= '';
-
-    my ($optionName,$description,$refCurrentFlags) = @_[0,1,2];
-
-    #print qq{ email$optionName: $$refCurrentFlags{"email$optionName"} <br>};
-
-    # if the db value is 'on', then mark that checkbox
-    if ($$refCurrentFlags{"email$optionName"} eq 'on'){
-        $value = 'CHECKED';
-    }
-
-    # **** Kludge ... also mark on if the value in $$refCurrentFlags in undef
-    if (!defined($$refCurrentFlags{"email$optionName"})) {
-        $value = 'CHECKED';
+    
+    # Parse the info into a hash of hashes; the first hash keyed by role,
+    # the second by reason, and the value being 1 or 0 for (on or off).
+    # Preferences not existing in the user's list are assumed to be on.
+    foreach my $role (@roles) {
+        $vars->{$role} = {};
+        foreach my $reason (@reasons) {
+            my $key = "email$role$reason";
+            if (!exists($emailflags{$key}) || $emailflags{$key} eq 'on') {
+                $vars->{$role}{$reason} = 1;
+            }
+            else {
+                $vars->{$role}{$reason} = 0;
+            }
+        }
     }
-
-    print qq{
-        <tr><td width=320></td>
-        <td><input type="checkbox" name="email$optionName" VALUE="on" $value>
-        $description</td>
-        </tr>
-    };
 }
 
-sub SaveEmailOptions () {
-
-    # I don't understand: global variables and %FORM variables are
-    # not preserved between ShowEmailOptions() and SaveEmailOptions()
-    # The form value here is from a hidden variable just before the SUBMIT.
-
-    my $useNewEmailTech = $::FORM{'savedEmailTech'};
-    my $updateString;
-
-    if ( defined $::FORM{'ExcludeSelf'}) {
+# Note: we no longer store "off" values in the database.
+sub SaveEmail {
+    my $updateString = "";
+    
+    if (defined $::FORM{'ExcludeSelf'}) {
         $updateString .= 'ExcludeSelf~on';
     } else {
         $updateString .= 'ExcludeSelf~';
     }
-    my @tmpGroups = @emailGroups;
-
-    while ((my $groupName,my $groupText) = splice(@tmpGroups,0,2) ) {
-
-        my @tmpFlags = @emailFlags;
-
-        while ((my $flagName,my $flagText) = splice(@tmpFlags,0,2) ) {
-
-            my $entry = 'email' . $groupName . $flagName;
-            my $entryValue;
-
-            if (!defined $::FORM{$entry} ) {
-                $entryValue = "";
-            } else {
-                $entryValue = $::FORM{$entry};
-            }
-
-            $updateString .= '~' . $entry . '~' . $entryValue;
+    
+    foreach my $role (@roles) {
+        foreach my $reason (@reasons) {
+            # Add this preference to the list without giving it a value,
+            # which is the equivalent of setting the value to "off."
+            $updateString .= "~email$role$reason~";
+            
+            # If the form field for this preference is defined, then we
+            # know the checkbox was checked, so set the value to "on".
+            $updateString .= "on" if defined $::FORM{"email$role$reason"};
         }
     }
-        
-    #open(FID,">updateString");
-    #print qq{UPDATE STRING: $updateString <br>};
-    #close(FID);
-
-    SendSQL("UPDATE profiles SET emailflags = " .
-            SqlQuote($updateString) . " WHERE userid = $userid");
-
-    if (Param("supportwatchers") ) {
-
-        if (exists $::FORM{'watchedusers'}) {
-
-            # Just in case.  Note that this much locking is actually overkill:
-            # we don't really care if anyone reads the watch table.  So 
-            # some small amount of contention could be gotten rid of by
-            # using user-defined locks rather than table locking.
-            #
-            SendSQL("LOCK TABLES watch WRITE, profiles READ");
-
-            # what the db looks like now
-            #
-            my $origWatchedUsers = new RelationSet;
-            $origWatchedUsers->mergeFromDB("SELECT watched FROM watch WHERE" .
-                                           " watcher=$userid");
-
-            # update the database to look like the form
-            #
-            my $newWatchedUsers = new RelationSet($::FORM{'watchedusers'});
-            my @CCDELTAS = $origWatchedUsers->generateSqlDeltas(
-                                                             $newWatchedUsers, 
-                                                             "watch", 
-                                                             "watcher", 
-                                                             $userid,
-                                                             "watched");
-            $CCDELTAS[0] eq "" || SendSQL($CCDELTAS[0]);
-            $CCDELTAS[1] eq "" || SendSQL($CCDELTAS[1]);
-
-            # all done
-            #
-            SendSQL("UNLOCK TABLES");
-        
-        }
+            
+    SendSQL("UPDATE profiles SET emailflags = " . SqlQuote($updateString) . 
+            " WHERE userid = $userid");
+
+    if (Param("supportwatchers") && exists $::FORM{'watchedusers'}) {
+        # Just in case.  Note that this much locking is actually overkill:
+        # we don't really care if anyone reads the watch table.  So 
+        # some small amount of contention could be gotten rid of by
+        # using user-defined locks rather than table locking.
+        SendSQL("LOCK TABLES watch WRITE, profiles READ");
+
+        # what the db looks like now
+        my $origWatchedUsers = new RelationSet;
+        $origWatchedUsers->mergeFromDB("SELECT watched FROM watch WHERE" .
+                                       " watcher=$userid");
+
+        # Update the database to look like the form
+        my $newWatchedUsers = new RelationSet($::FORM{'watchedusers'});
+        my @CCDELTAS = $origWatchedUsers->generateSqlDeltas(
+                                                         $newWatchedUsers, 
+                                                         "watch", 
+                                                         "watcher", 
+                                                         $userid,
+                                                         "watched");
+        ($CCDELTAS[0] eq "") || SendSQL($CCDELTAS[0]);
+        ($CCDELTAS[1] eq "") || SendSQL($CCDELTAS[1]);
+
+        SendSQL("UNLOCK TABLES");       
     }
 }
 
 
-
-sub ShowFooter {
+sub DoFooter {
     SendSQL("SELECT mybugslink FROM profiles " .
             "WHERE userid = $userid");
-    my ($mybugslink) = (FetchSQLData());
-    my $entry =
-        BuildPulldown("mybugslink",
-                      [["1", "should appear"],
-                       ["0", "should not be displayed"]],
-                      $mybugslink);
-    EmitEntry("The 'My bugs' link at the footer of each page", $entry);
+    $vars->{'mybugslink'} = FetchSQLData();
+    
     SendSQL("SELECT name, linkinfooter FROM namedqueries " .
             "WHERE userid = $userid");
-    my $count = 0;
+    
+    my @queries;        
     while (MoreSQLData()) {
-        my ($name, $linkinfooter) = (FetchSQLData());
-        if ($name eq $::defaultqueryname) {
-            next;
-        }
-        my $entry =
-            BuildPulldown("query-$count",
-                          [["0", "should only appear in the query page"],
-                           ["1", "should appear on the footer of every page"]],
-                          $linkinfooter);
-        EmitEntry("Your query named '$name'", $entry);
-        my $q = value_quote($name);
-        print qq{<INPUT TYPE=HIDDEN NAME="name-$count" VALUE="$q">\n};
-        $count++;
-    }
-    print qq{<INPUT TYPE=HIDDEN NAME="numqueries" VALUE="$count">\n};
-    if (!$count) {
-        print qq{
-<TR><TD COLSPAN="4">                            
-If you go create remembered queries in the <A HREF="query.cgi">query page</A>,
-you can then come to this page and choose to have some of them appear in the 
-footer of each Bugzilla page.
-</TD></TR>};
+        my ($name, $footer) = (FetchSQLData());
+        next if ($name eq $::defaultqueryname);
+        
+        push (@queries, { name => $name, footer => $footer });        
     }
+    
+    $vars->{'queries'} = \@queries;
 }
               
-    
 sub SaveFooter {
     my %old;
     SendSQL("SELECT name, linkinfooter FROM namedqueries " .
             "WHERE userid = $userid");
     while (MoreSQLData()) {
-        my ($name, $linkinfooter) = (FetchSQLData());
-        $old{$name} = $linkinfooter;
+        my ($name, $footer) = (FetchSQLData());
+        $old{$name} = $footer;
     }
     
-    for (my $c=0 ; $c<$::FORM{'numqueries'} ; $c++) {
+    for (my $c = 0; $c < $::FORM{'numqueries'}; $c++) {
         my $name = $::FORM{"name-$c"};
         if (exists $old{$name}) {
             my $new = $::FORM{"query-$c"};
             if ($new ne $old{$name}) {
+                detaint_natural($new);
                 SendSQL("UPDATE namedqueries SET linkinfooter = $new " .
                         "WHERE userid = $userid " .
                         "AND name = " . SqlQuote($name));
             }
         } else {
-            Error("Hmm, the $name query seems to have gone away.");
+            DisplayError("Hmm, the $name query seems to have gone away.");
         }
     }
-    SendSQL("UPDATE profiles SET mybugslink = " . SqlQuote($::FORM{'mybugslink'}) .
-            " WHERE userid = $userid");
+    SendSQL("UPDATE profiles SET mybugslink = " . 
+            SqlQuote($::FORM{'mybugslink'}) . " WHERE userid = $userid");
+
+    # Regenerate cached info about queries in footer.            
+    $vars->{'user'} = GetUserInfo($::userid);
 }
     
-
-
-sub ShowPermissions {
-    print "You have the following permission bits set on your account:\n";
-    print "<P><UL>\n";
-    my $found = 0;
+    
+sub DoPermissions {
+    my (@has_bits, @set_bits);
+    
     SendSQL("SELECT description FROM groups " .
             "WHERE bit & $::usergroupset != 0 " .
             "ORDER BY bit");
     while (MoreSQLData()) {
-        my ($description) = (FetchSQLData());
-        print "<LI>$description\n";
-        $found = 1;
-    }
-    if ($found == 0) {
-        print "<LI>(No extra permission bits have been set).\n";
+        push(@has_bits, FetchSQLData());
     }
-    print "</UL>\n";
+    
     SendSQL("SELECT blessgroupset FROM profiles WHERE userid = $userid");
     my $blessgroupset = FetchOneColumn();
     if ($blessgroupset) {
-        print "And you can turn on or off the following bits for\n";
-        print qq{<A HREF="editusers.cgi">other users</A>:\n};
-        print "<P><UL>\n";
         SendSQL("SELECT description FROM groups " .
                 "WHERE bit & $blessgroupset != 0 " .
                 "ORDER BY bit");
         while (MoreSQLData()) {
-            my ($description) = (FetchSQLData());
-            print "<LI>$description\n";
+            push(@set_bits, FetchSQLData());
         }
-        print "</UL>\n";
     }
+    
+    $vars->{'has_bits'} = \@has_bits;
+    $vars->{'set_bits'} = \@set_bits;    
 }
-        
-
-
 
-######################################################################
-################# Live code (not sub defs) starts here ###############
+# No SavePermissions() because this panel has no changeable fields.
 
+###############################################################################
+# Live code (not subroutine definitions) starts here
+###############################################################################
 
+ConnectToDatabase();
 confirm_login();
 
-print "Content-type: text/html\n\n";
-
 GetVersionTable();
 
-PutHeader("User Preferences", "User Preferences", $::COOKIE{'Bugzilla_login'});
-
-#  foreach my $k (sort(keys(%::FORM))) {
-#      print "<pre>" . value_quote($k) . ": " . value_quote($::FORM{$k}) . "\n</pre>";
-#  }
-
-my $bank = $::FORM{'bank'} || "account";
-
-my @banklist = (
-                ["account", "Account settings",
-                 \&ShowAccount, \&SaveAccount],
-                ["diffs", "Email settings",
-                                 \&ShowEmailOptions, \&SaveEmailOptions],
-                ["footer", "Page footer",
-                 \&ShowFooter, \&SaveFooter],
-                ["permissions", "Permissions",
-                 \&ShowPermissions, undef]
-                );
+$vars->{'login'} = $::COOKIE{'Bugzilla_login'};
+$vars->{'changes_saved'} = $::FORM{'dosave'};
 
+my $current_tab_name = $::FORM{'tab'} || "account";
 
-my $numbanks = @banklist;
-my $numcols = $numbanks + 2;
-
-my $headcol = '"lightblue"';
-
-print qq{
-<CENTER>
-<TABLE CELLSPACING="0" CELLPADDING="10" BORDER=0 WIDTH="100%">
-<TR>
-<TH COLSPAN="$numcols" BGCOLOR="lightblue">User preferences</TH>
-</TR>
-<TR><TD BGCOLOR=$headcol>&nbsp;</TD>
-};
-
-
-my $bankdescription;
-my $showfunc;
-my $savefunc;
-
-foreach my $i (@banklist) {
-    my ($name, $description) = (@$i);
-    my $color = "";
-    if ($name eq $bank) {
-        print qq{<TD ALIGN="center">$description</TD>};
-        my $zz;
-        ($zz, $bankdescription, $showfunc, $savefunc) = (@$i);
-    } else {
-        print qq{<TD ALIGN="center" BGCOLOR="lightblue"><A HREF="userprefs.cgi?bank=$name">$description</A></TD>};
-    }
-}
-print qq{
-<TD BGCOLOR=$headcol>&nbsp;</TD></TR>
-</TABLE>
-</CENTER>
-<P>
-};
-
+$vars->{'current_tab_name'} = $current_tab_name;
 
-
-
-if (defined $bankdescription) {
-    $userid = DBNameToIdAndCheck($::COOKIE{'Bugzilla_login'});
-
-    if ($::FORM{'dosave'}) {
-        &$savefunc;
-        print "Your changes have been saved.";
-    }
-    print qq{<H3>$bankdescription</H3><FORM METHOD="POST"><TABLE>};
-
-    # execute subroutine from @banklist based on bank selected.
-    &$showfunc;
-
-    print qq{</TABLE><INPUT TYPE="hidden" NAME="dosave" VALUE="1">};
-    print qq{<INPUT TYPE="hidden" NAME="savedEmailTech" VALUE="};
-
-    # default this to 0 if it's not already set
-    #
-    if (defined $showNewEmailTech) {
-        print qq{$showNewEmailTech">};
-    } else {
-        print qq{0">};
-    }
-    print qq{<INPUT TYPE="hidden" NAME="bank" VALUE="$bank"> };
-
-    if ($savefunc) {
-              print qq{<table><tr><td width=150></td><td>
-                        <INPUT TYPE="submit" VALUE="Submit Changes">
-                        </td></tr></table> };
-    }
-    print qq{</FORM>\n};
-} else {
-    print "<P>Please choose from the above links which settings you wish to change.</P>";
+# Do any saving, and then display the current tab.
+SWITCH: for ($current_tab_name) {
+    /^account$/ && do {
+        SaveAccount() if $::FORM{'dosave'};
+        DoAccount();
+        last SWITCH;
+    };
+    /^email$/ && do {
+        SaveEmail() if $::FORM{'dosave'};
+        DoEmail();
+        last SWITCH;
+    };
+    /^footer$/ && do {
+        SaveFooter() if $::FORM{'dosave'};
+        DoFooter();
+        last SWITCH;
+    };
+    /^permissions$/ && do {
+        DoPermissions();
+        last SWITCH;
+    };
 }
 
+# Generate and return the UI (HTML page) from the appropriate template.
+print "Content-type: text/html\n\n";
+$template->process("account/prefs/prefs.html.tmpl", $vars)
+  || ThrowTemplateError($template->error());
 
-print "<P>";
-
-
-PutFooter();
diff --git a/votehelp.html b/votehelp.html
index 8f95c0169..5d49d469f 100644
--- a/votehelp.html
+++ b/votehelp.html
@@ -1,4 +1,5 @@
-<HTML>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
 <!--
      The contents of this file are subject to the Mozilla Public
      License Version 1.1 (the "License"); you may not use this file
@@ -21,51 +22,62 @@
 
      Contributor(s): Terry Weissman <terry@mozilla.org>
 -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<title>Bugzilla Voting</title>
+</head>
 
-<TITLE>Bugzilla Voting</TITLE>
-<H1>Bugzilla Voting</H1>
+<body>
+<h1>Bugzilla Voting</h1>
 
+<p>
 Bugzilla has a "voting" feature.  Each product allows users to have a
 certain number of votes.  (Some products may not allow any, which
 means you can't vote on things in that product at all.) With your
 vote, you indicate which bugs you think are the most important to be
 fixed.
+</p>
 
 <p>
-
 Depending on how the administrator has configured the relevant
 product, you may be able to vote for the same bug more than one time.
 But remember, you only have so many votes to use in total!  So, you
 can either vote a little for many bugs, or vote a lot for a few bugs.
+</p>
 
 <p>
-
 To look at votes:
+</p>
 
 <ul>
   <li> Go to the query page.  Do a normal query, but enter 1 in the
        "At least ___ votes" field.  This will show you items that
-       match your query that have at least one vote.
+       match your query that have at least one vote.</li>
 </ul>
 
 <p>
-
 To vote for a bug:
+</p>
 
 <ul>
-  <li> Bring up the bug in question.
+  <li> Bring up the bug in question.</li>
   <li> Click on the "Vote for this bug" link that appears just above
        the "Additional Comments" field.  (If no such link appears,
-       then voting may not be allowed in this bug's product.)
+       then voting may not be allowed in this bug's product.)</li>
   <li> Indicate how many votes you want to give this bug.  This page
        also displays how many votes you've given to other bugs, so you
-       may rebalance your votes as necessary.
+       may rebalance your votes as necessary.</li>
 </ul>
 
+<p>
 You will automatically get email notifying you of any changes that
 occur on bugs you vote for.
+</p>
 
 <p>
-
-You may review your votes at any time by clicking on the "Change your
-password or preferences" link at the bottom of the query page.
+You may review your votes at any time by clicking on the "<a
+href="votes.cgi?action=show_user">My Votes</a>" link in
+the page footer.
+</p>
+</body>
+</html>
diff --git a/votes.cgi b/votes.cgi
new file mode 100644
index 000000000..7a387e0e1
--- /dev/null
+++ b/votes.cgi
@@ -0,0 +1,352 @@
+#!/usr/bonsaitools/bin/perl -wT
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is the Bugzilla Bug Tracking System.
+#
+# The Initial Developer of the Original Code is Netscape Communications
+# Corporation. Portions created by Netscape are
+# Copyright (C) 1998 Netscape Communications Corporation. All
+# Rights Reserved.
+#
+# Contributor(s): Terry Weissman <terry@mozilla.org>
+#                 Stephan Niemz  <st.n@gmx.net>
+#                 Christopher Aillon <christopher@aillon.com>
+#                 Gervase Markham <gerv@gerv.net>
+
+use diagnostics;
+use strict;
+use lib ".";
+
+require "CGI.pl";
+
+use vars qw($usergroupset);
+
+# Use global template variables
+use vars qw($template $vars);
+
+ConnectToDatabase();
+
+# If the action is show_bug, you need a bug_id.
+# If the action is show_user, you can supply a userid to show the votes for
+# another user, otherwise you see your own.
+# If the action is vote, your votes are set to those encoded in the URL as 
+# <bug_id>=<votes>.
+#
+# If no action is defined, we default to show_bug if a bug_id is given,
+# otherwise to show_user.
+my $action = $::FORM{'action'} || 
+                                 ($::FORM{'bug_id'} ? "show_bug" : "show_user");
+
+if ($action eq "show_bug" ||
+    ($action eq "show_user" && defined($::FORM{'user'}))) 
+{
+    quietly_check_login();
+}
+else {
+    confirm_login();
+}
+
+################################################################################
+# Begin Data/Security Validation
+################################################################################
+
+# Make sure the bug ID is a positive integer representing an existing
+# bug that the user is authorized to access.
+if (defined $::FORM{'bug_id'}) {
+  ValidateBugID($::FORM{'bug_id'});
+}
+
+################################################################################
+# End Data/Security Validation
+################################################################################
+
+if ($action eq "show_bug") {
+    show_bug();
+} 
+elsif ($action eq "show_user") {
+    show_user();
+}
+elsif ($action eq "vote") {
+    record_votes();
+    show_user();
+}
+else {
+    DisplayError("Unknown action: " . html_quote($action));
+}
+
+exit;
+
+# Display the names of all the people voting for this one bug.
+sub show_bug {
+    my $bug_id = $::FORM{'bug_id'} 
+                  || DisplayError("Please give a bug ID to show the votes for.")
+                  && exit;
+    my $total = 0;
+    my @users;
+    
+    SendSQL("SELECT profiles.login_name, votes.who, votes.count 
+             FROM votes, profiles 
+             WHERE votes.bug_id = $bug_id 
+               AND profiles.userid = votes.who");
+                   
+    while (MoreSQLData()) {
+        my ($name, $userid, $count) = (FetchSQLData());
+        push (@users, { name => $name, id => $userid, count => $count });
+        $total += $count;
+    }
+    
+    $vars->{'bug_id'} = $bug_id;
+    $vars->{'users'} = \@users;
+    $vars->{'total'} = $total;
+    
+    print "Content-type: text/html\n\n";
+    $template->process("bug/votes/list-for-bug.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
+}
+
+# Display all the votes for a particular user. If it's the user
+# doing the viewing, give them the option to edit them too.
+sub show_user {
+    GetVersionTable();
+    
+    # If a bug_id is given, and we're editing, we'll add it to the votes list.
+    my $bug_id = $::FORM{'bug_id'} || "";
+        
+    my $name = $::FORM{'user'} || $::COOKIE{'Bugzilla_login'};
+    my $who = DBname_to_id($name);
+    
+    # After DBNameToIdAndCheck is templatised and prints a Content-Type, 
+    # the above should revert to a call to that function, and this 
+    # special error handling should go away.
+    if (!$who) {
+        DisplayError(html_quote($name) . " is not a valid username.\n");
+        exit;
+    }
+    
+    my $canedit = 1 if ($name eq $::COOKIE{'Bugzilla_login'});
+    
+    SendSQL("LOCK TABLES bugs READ, products READ, votes WRITE,
+             cc AS selectVisible_cc READ");
+    
+    if ($canedit && $bug_id) {
+        # Make sure there is an entry for this bug
+        # in the vote table, just so that things display right.
+        SendSQL("SELECT votes.count FROM votes 
+                 WHERE votes.bug_id = $bug_id AND votes.who = $who");
+        if (!FetchOneColumn()) {
+            SendSQL("INSERT INTO votes (who, bug_id, count) 
+                     VALUES ($who, $bug_id, 0)");
+        }
+    }
+    
+    # Calculate the max votes per bug for each product; doing it here means
+    # we can do it all in one query.
+    my %maxvotesperbug;
+    if($canedit) {
+        SendSQL("SELECT products.product, products.maxvotesperbug 
+                 FROM products");
+        while (MoreSQLData()) {
+            my ($prod, $max) = FetchSQLData();
+            $maxvotesperbug{$prod} = $max;
+        }
+    }
+    
+    my @products;
+    
+    # Read the votes data for this user for each product
+    foreach my $product (sort(keys(%::prodmaxvotes))) {
+        next if $::prodmaxvotes{$product} <= 0;
+        
+        my @bugs;
+        my $total = 0;
+        my $onevoteonly = 0;
+        
+        SendSQL("SELECT votes.bug_id, votes.count, bugs.short_desc,
+                        bugs.bug_status 
+                  FROM  votes, bugs 
+                  WHERE votes.who = $who 
+                    AND votes.bug_id = bugs.bug_id 
+                    AND bugs.product = " . SqlQuote($product) . 
+                 "ORDER BY votes.bug_id");        
+        
+        while (MoreSQLData()) {
+            my ($id, $count, $summary, $status) = FetchSQLData();
+            next if !defined($status);
+            $total += $count;
+             
+            # Next if user can't see this bug. So, the totals will be correct
+            # and they can see there are votes 'missing', but not on what bug
+            # they are. This seems a reasonable compromise; the alternative is
+            # to lie in the totals.
+            next if !CanSeeBug($id, $who, $usergroupset);            
+            
+            push (@bugs, { id => $id, 
+                           summary => $summary,
+                           count => $count,
+                           opened => IsOpenedState($status) });
+        }
+        
+        $onevoteonly = 1 if (min($::prodmaxvotes{$product},
+                                 $maxvotesperbug{$product}) == 1);
+        
+        # Only add the product for display if there are any bugs in it.
+        if ($#bugs > -1) {                         
+            push (@products, { name => $product,
+                               bugs => \@bugs,
+                               onevoteonly => $onevoteonly,
+                               total => $total,
+                               maxvotes => $::prodmaxvotes{$product},
+                               maxperbug => $maxvotesperbug{$product} });
+        }
+    }
+
+    SendSQL("DELETE FROM votes WHERE count <= 0");
+    SendSQL("UNLOCK TABLES");
+    
+    $vars->{'voting_user'} = { "login" => $name };
+    $vars->{'products'} = \@products;
+
+    print "Content-type: text/html\n\n";
+    $template->process("bug/votes/list-for-user.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
+}
+
+# Update the user's votes in the database.
+sub record_votes {
+    ############################################################################
+    # Begin Data/Security Validation
+    ############################################################################
+
+    # Build a list of bug IDs for which votes have been submitted.  Votes
+    # are submitted in form fields in which the field names are the bug 
+    # IDs and the field values are the number of votes.
+    my @buglist = grep {/^[1-9][0-9]*$/} keys(%::FORM);
+
+    # If no bugs are in the buglist, let's make sure the user gets notified
+    # that their votes will get nuked if they continue.
+    if (scalar(@buglist) == 0) {
+        if (!defined($::FORM{'delete_all_votes'})) {
+            print "Content-type: text/html\n\n";
+            $template->process("bug/votes/delete-all.html.tmpl", $vars)
+              || ThrowTemplateError($template->error());
+            exit();
+        }
+        elsif ($::FORM{'delete_all_votes'} == 0) {
+            print "Location: votes.cgi\n\n";
+            exit();
+        }
+    }
+
+    # Call ValidateBugID on each bug ID to make sure it is a positive
+    # integer representing an existing bug that the user is authorized 
+    # to access, and make sure the number of votes submitted is also
+    # a non-negative integer (a series of digits not preceded by a
+    # minus sign).
+    foreach my $id (@buglist) {
+      ValidateBugID($id);
+      detaint_natural($::FORM{$id})
+        || DisplayError("Only use non-negative numbers for your bug votes.")
+        && exit;
+    }
+
+    ############################################################################
+    # End Data/Security Validation
+    ############################################################################
+
+    GetVersionTable();
+
+    my $who = DBNameToIdAndCheck($::COOKIE{'Bugzilla_login'});
+
+    # If the user is voting for bugs, make sure they aren't overstuffing
+    # the ballot box.
+    if (scalar(@buglist)) {
+        SendSQL("SELECT bugs.bug_id, bugs.product, products.maxvotesperbug
+                 FROM bugs, products
+                 WHERE products.product = bugs.product
+                   AND bugs.bug_id IN (" . join(", ", @buglist) . ")");
+
+        my %prodcount;
+
+        while (MoreSQLData()) {
+            my ($id, $prod, $max) = FetchSQLData();
+            $prodcount{$prod} ||= 0;
+            $prodcount{$prod} += $::FORM{$id};
+            
+            # Make sure we haven't broken the votes-per-bug limit
+            if ($::FORM{$id} > $max) {                
+                $prod = html_quote($prod);
+                my $votes = html_quote($::FORM{$id});
+                
+                DisplayError("You may only use at most $max votes for a single
+                              bug in the <tt>$prod</tt> product, but you are
+                              trying to use $votes.", "Illegal vote");
+                exit();
+            } 
+        }
+
+        # Make sure we haven't broken the votes-per-product limit
+        foreach my $prod (keys(%prodcount)) {
+            if ($prodcount{$prod} > $::prodmaxvotes{$prod}) {
+                $prod = html_quote($prod);
+                
+                DisplayError("You may only use at most $::prodmaxvotes{$prod}
+                              votes for bugs in the <tt>$prod</tt> product, 
+                              but you are trying to use $prodcount{$prod}.",
+                              "Illegal vote");
+                exit();
+            }
+        }
+    }
+
+    # Update the user's votes in the database.  If the user did not submit 
+    # any votes, they may be using a form with checkboxes to remove all their
+    # votes (checkboxes are not submitted along with other form data when
+    # they are not checked, and Bugzilla uses them to represent single votes
+    # for products that only allow one vote per bug).  In that case, we still
+    # need to clear the user's votes from the database.
+    my %affected;
+    SendSQL("LOCK TABLES bugs write, votes write, products read");
+    
+    # Take note of, and delete the user's old votes from the database.
+    SendSQL("SELECT bug_id FROM votes WHERE who = $who");
+    while (MoreSQLData()) {
+        my $id = FetchOneColumn();
+        $affected{$id} = 1;
+    }
+    
+    SendSQL("DELETE FROM votes WHERE who = $who");
+    
+    # Insert the new values in their place
+    foreach my $id (@buglist) {
+        if ($::FORM{$id} > 0) {
+            SendSQL("INSERT INTO votes (who, bug_id, count) 
+                     VALUES ($who, $id, $::FORM{$id})");
+        }
+        
+        $affected{$id} = 1;
+    }
+    
+    # Update the cached values in the bugs table
+    foreach my $id (keys %affected) {
+        SendSQL("SELECT sum(count) FROM votes WHERE bug_id = $id");
+        my $v = FetchOneColumn();
+        $v ||= 0;
+        SendSQL("UPDATE bugs SET votes = $v, delta_ts=delta_ts 
+                 WHERE bug_id = $id");
+        CheckIfVotedConfirmed($id, $who);
+    }
+
+    SendSQL("UNLOCK TABLES");
+
+    $vars->{'votes_recorded'} = 1;
+}
diff --git a/whineatnews.pl b/whineatnews.pl
index 98c3c1db3..b364836a5 100755
--- a/whineatnews.pl
+++ b/whineatnews.pl
@@ -62,7 +62,10 @@ foreach my $email (sort (keys %bugs)) {
     foreach my $i (@{$bugs{$email}}) {
         $msg .= "  ${urlbase}show_bug.cgi?id=$i\n"
     }
-    open(SENDMAIL, "|/usr/lib/sendmail -t") || die "Can't open sendmail";
+
+    my $sendmailparam = Param('sendmailnow') ? '' : "-ODeliveryMode=deferred";
+    open SENDMAIL, "|/usr/lib/sendmail $sendmailparam -t -i"
+        or die "Can't open sendmail";
     print SENDMAIL $msg;
     close SENDMAIL;
     print "$email      " . join(" ", @{$bugs{$email}}) . "\n";
diff --git a/xml.cgi b/xml.cgi
index 51093890e..8a0bbf1e4 100755
--- a/xml.cgi
+++ b/xml.cgi
@@ -1,4 +1,4 @@
-#!/usr/bonsaitools/bin/perl -w
+#!/usr/bonsaitools/bin/perl -wT
 # -*- Mode: perl; indent-tabs-mode: nil -*-
 #
 # The contents of this file are subject to the Mozilla Public
@@ -20,38 +20,37 @@
 #
 # Contributor(s): Dawn Endico    <endico@mozilla.org>
 #                 Terry Weissman <terry@mozilla.org>
+#                 Gervase Markham <gerv@gerv.net>
 
 use diagnostics;
 use strict;
+
+use lib qw(.);
+
 use Bug;
 require "CGI.pl";
 
-if (!defined $::FORM{'id'} || $::FORM{'id'} !~ /^\s*\d+(,\d+)*\s*$/) {
-  print "Content-type: text/html\n\n";
-  PutHeader("Display as XML");
-  print "<FORM METHOD=GET ACTION=\"xml.cgi\">\n";
-  print "Display bugs as XML by entering a list of bug numbers here:\n";
-  print "<INPUT NAME=id>\n";
-  print "<INPUT TYPE=\"submit\" VALUE=\"Display as XML\"><br>\n";
-  print "  (e.g. 1000,1001,1002)\n";
-  print "</FORM>\n";
-  PutFooter();
-  exit;
-}
+use vars qw($template $vars);
 
+ConnectToDatabase();
 quietly_check_login();
-my $exporter;
-if (defined $::COOKIE{"Bugzilla_login"}) {
-  $exporter = $::COOKIE{"Bugzilla_login"};
+
+if (!defined $::FORM{'id'} || !$::FORM{'id'}) {
+    print "Content-Type: text/html\n\n";
+    $template->process("bug/choose-xml.html.tmpl", $vars)
+      || ThrowTemplateError($template->error());
+    exit;
 }
 
-my @ids = split ( /,/, $::FORM{'id'} );
+my $exporter = $::COOKIE{"Bugzilla_login"} || undef;
+
+my @ids = split (/[, ]+/, $::FORM{'id'});
 
-print "Content-type: text/plain\n\n";
-print Bug::XML_Header( Param("urlbase"), $::param{'version'}, 
-                        Param("maintainer"), $exporter );
+print "Content-type: text/xml\n\n";
+print Bug::XML_Header(Param("urlbase"), $::param{'version'}, 
+                      Param("maintainer"), $exporter);
 foreach my $id (@ids) {
-  my $bug = new Bug($id, $::userid);
+  my $bug = new Bug(trim($id), $::userid);
   print $bug->emitXML;
 }
 
-- 
GitLab