[Rt-commit] rt branch, menuing, created. rt-3.9.4-328-g3422b6e

Alex Vandiver alexmv at bestpractical.com
Fri Nov 5 08:42:52 EDT 2010


The branch, menuing has been created
        at  3422b6e9a4d34cbba0c4e9f129fccbeeabe10562 (commit)

- Log -----------------------------------------------------------------
commit 5c6fa829cc3e9ec58373f9bad62df61f93cac655
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Mon Nov 1 18:12:23 2010 -0400

    Tidy the html we generate a bit

diff --git a/share/html/Elements/CreateTicket b/share/html/Elements/CreateTicket
index e2d61dc..f14e837 100755
--- a/share/html/Elements/CreateTicket
+++ b/share/html/Elements/CreateTicket
@@ -45,13 +45,9 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-<form
-    action="<% RT->Config->Get('WebPath') %><% $SendTo %>"
-    name="CreateTicketInQueue"
-    id="CreateTicketInQueue"
+<form action="<% RT->Config->Get('WebPath') %><% $SendTo %>" name="CreateTicketInQueue" id="CreateTicketInQueue" \
 % $m->callback(CallbackName => 'InFormElement');
 >
-
 <&|/l, $m->scomp('/Elements/SelectNewTicketQueue', OnChange => 'document.CreateTicketInQueue.submit()', SendTo => $SendTo ) &><input type="submit" class="button" value="New ticket in" />&nbsp;[_1]</&>
 % $m->callback(CallbackName => 'BeforeFormEnd');
 </form>
diff --git a/share/html/Widgets/TitleBoxStart b/share/html/Widgets/TitleBoxStart
index 84bbf16..62663db 100755
--- a/share/html/Widgets/TitleBoxStart
+++ b/share/html/Widgets/TitleBoxStart
@@ -48,21 +48,17 @@
 <div class="titlebox<% $class ? " $class " : '' %>" id="<% $id %>">
   <div class="titlebox-title<% $title_class ? " $title_class" : ''%>">
 % if ($hideable) {
-    <span class="widget"><a href="#" 
-	onclick="return rollup('<%$tid%>');" 
-	title="Toggle visibility"></a>
-	</span>
+    <span class="widget"><a href="#" onclick="return rollup('<%$tid%>');" title="Toggle visibility"></a></span>
 % }
-    <span class="left">
-      	<% $title_href ? qq[<a href="$title_href">] : '' | n 
+    <span class="left"><%
+            $title_href ? qq[<a href="$title_href">] : '' | n
         %><% $title %><% $title_raw |n %><% $title_href ? "</a>" : '' |n%></span>
-    <span class="right<%($titleright_href || $titleright || $titleright_raw) ? '' : '-empty' %>">
-	<% $titleright_href ? qq[<a href="$titleright_href">] : '' | n %>
-	<% $titleright  %><% $titleright_raw |n%><% $titleright_href ? "</a>" : '' |n%>
+    <span class="right<%($titleright_href || $titleright || $titleright_raw) ? '' : '-empty' %>">\
+	<% $titleright_href ? qq[<a href="$titleright_href">] : '' | n %>\
+	<% $titleright  %><% $titleright_raw |n%><% $titleright_href ? "</a>" : '' |n%>\
     </span>
   </div>
   <div class="titlebox-content <% $bodyclass %>" id="<% $tid %>">
-
 <%ARGS>
 $class => ''
 $bodyclass => ''

commit d98f147df26b49e5ccc98d5122159a378e9547d1
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Mon Nov 1 15:52:45 2010 -0400

    generalized the "Redirect and show results" mechanism
    
    get dashboard create/modify to use the redirect mechanism
    
    Give modifydashboard a form id
    
    Slightly improve css on the dashboard modification page

diff --git a/share/html/Dashboards/Modify.html b/share/html/Dashboards/Modify.html
index cb90aa9..a04be04 100755
--- a/share/html/Dashboards/Modify.html
+++ b/share/html/Dashboards/Modify.html
@@ -47,13 +47,12 @@
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => $title &>
 <& /Dashboards/Elements/Tabs,
-    current_subtab => $current_subtab,
     Title => $title,
     $Create ? () : (DashboardObj => $Dashboard),
 &>
 <& /Elements/ListActions, actions => \@results &>
 
-<form action="<%RT->Config->Get('WebPath')%>/Dashboards/Modify.html" method="post" enctype="multipart/form-data" name="ModifyDashboard">
+<form action="<%RT->Config->Get('WebPath')%>/Dashboards/Modify.html" method="post" enctype="multipart/form-data" name="ModifyDashboard" id="ModifyDashboard">
 
 %unless ($Dashboard->Id) {
 <input type="hidden" class="hidden" name="id" value="new" />
@@ -63,16 +62,14 @@
 
 <&|/Widgets/TitleBox, title => loc('Basics') &>
 <table>
-<tr><td align="right">
-<&|/l&>Name</&>:
-</td>
-<td><input name="Name" value="<%$Dashboard->Name%>" /></td>
+    <tr>
+     <td class="label"><&|/l&>Name</&>:</td>
+     <td class="value"><input name="Name" value="<%$Dashboard->Name%>" /></td>
+    </tr>
+    <tr>
+    <td class="label"><&|/l&>Privacy</&>:</td>
+    <td><& /Dashboards/Elements/SelectPrivacy, Name => "Privacy", Objects => \@privacies, Default => $Dashboard->Privacy &></td>
 </tr>
-<tr><td align="right">
-<&|/l&>Privacy</&>:
-</td><td>
-<& /Dashboards/Elements/SelectPrivacy, Name => "Privacy", Objects => \@privacies, Default => $Dashboard->Privacy &>
-</td></tr>
 </table>
 </&>
 <& /Elements/Submit, Name => 'Save', Label =>( $Create ? loc('Create') : loc('Save Changes') ) &>
@@ -148,6 +145,17 @@ if (!$Create && !$tried_create && $id && $ARGS{'Save'}) {
 
 }
 
+
+# This code does automatic redirection if any updates happen.
+$m->comp(
+    '/Elements/MaybeRedirectForResults',
+    Actions     => \@results,
+    Path        => 'Dashboards/Modify.html',
+    id              => $id,
+    ARGSRef     => \%ARGS
+);
+
+
 my $can_delete = $Dashboard->CurrentUserCanDelete;
 
 if (!$Create && !$tried_create && $id && $ARGS{'Delete'}) {
diff --git a/share/html/Ticket/Elements/MaybeRedirectForResults b/share/html/Elements/MaybeRedirectForResults
similarity index 94%
rename from share/html/Ticket/Elements/MaybeRedirectForResults
rename to share/html/Elements/MaybeRedirectForResults
index e31b5a5..0cf933b 100644
--- a/share/html/Ticket/Elements/MaybeRedirectForResults
+++ b/share/html/Elements/MaybeRedirectForResults
@@ -48,8 +48,8 @@
 <%args>
 $Actions => []
 $ARGSRef => {}
-$Path    => 'Ticket/Display.html'
-$TicketObj
+$Path
+$id
 </%args>
 <%init>
 if ( @$Actions ) {
@@ -59,7 +59,7 @@ if ( @$Actions ) {
     my $key = Digest::MD5::md5_hex( rand(1024) );
     push @{ $session{"Actions"}->{$key} ||= [] }, @$Actions;
     $session{'i'}++;
-    my $url = RT->Config->Get('WebURL') . "$Path?id=" . $TicketObj->id . "&results=" . $key;
+    my $url = RT->Config->Get('WebURL') . "$Path?id=" . $id . "&results=" . $key;
     $url .= '#' . $ARGSRef->{Anchor} if $ARGSRef->{Anchor};
     RT::Interface::Web::Redirect($url);
 }
diff --git a/share/html/Ticket/Display.html b/share/html/Ticket/Display.html
index c8c5b27..155d300 100755
--- a/share/html/Ticket/Display.html
+++ b/share/html/Ticket/Display.html
@@ -197,10 +197,10 @@ $m->callback(
 
 # This code does automatic redirection if any updates happen. 
 $m->comp(
-    'Elements/MaybeRedirectForResults',
+    '/Elements/MaybeRedirectForResults',
     Actions     => \@Actions,
     Path        => 'Ticket/Display.html',
-    TicketObj   => $TicketObj,
+    id          => $TicketObj->id,
     ARGSRef     => \%ARGS
 );
 

commit 2d96251218b2b06b3e3b106c9e847304e1f9e34e
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Tue Nov 2 22:21:36 2010 -0400

    Cleanup to the ModifyTemplate html

diff --git a/share/html/Admin/Elements/ModifyTemplate b/share/html/Admin/Elements/ModifyTemplate
index 42a158c..e7dfe3f 100755
--- a/share/html/Admin/Elements/ModifyTemplate
+++ b/share/html/Admin/Elements/ModifyTemplate
@@ -47,38 +47,23 @@
 %# END BPS TAGGED BLOCK }}}
 <table>
 <tr>
-<td align="right">
-<&|/l&>Name</&>:
-</td>
-<td>
-<input name="Name" value="<%$Name%>" size="20" /><br />
-</td>
+<td class="label"><&|/l&>Name</&>:</td>
+<td class="value"><input name="Name" value="<%$Name%>" size="20" /></td>
 </tr>
 <tr>
-<td align="right">
-<&|/l&>Description</&>: 
-</td>
-<td>
-<input name="Description" value="<%$Description%>" size="80" /><br />
-</td>
+<td class="label"><&|/l&>Description</&>:</td>
+<td class="value"><input name="Description" value="<%$Description%>" size="80" /></td>
 </tr>
 <tr>
-<td align="right">
-<&|/l&>Type</&>:
-</td>
-<td>
+<td class="label"><&|/l&>Type</&>:</td>
+<td class="value">
 <input type="radio" name="Type" value="Perl" <% $Type eq "Perl" ? 'checked="checked"' : "" |n %>><&|/l&>Perl</&></input><br />
 <input type="radio" name="Type" value="Simple" <% $Type eq "Simple" ? 'checked="checked"' : "" |n %>><&|/l&>Simple</&></input><br />
 </td>
 </tr>
 <tr>
-<td align="right" valign="top">
-<&|/l&>Content</&>:<br />
-</td>
-<td>
-<textarea name="Content" rows="25" cols="80" wrap="soft">
-<%$Content%></textarea>
-</td>
+<td class="label" valign="top"><&|/l&>Content</&>:</td>
+<td class="value"><textarea name="Content" rows="25" cols="80" wrap="soft"><%$Content%></textarea></td>
 </tr>
 </table>
 

commit d9ea12b74d159f9e9137e2930c458aa59d3ea7e5
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Tue Nov 2 18:39:28 2010 -0400

    Remove duplicated testing code

diff --git a/t/web/gnupg-tickyboxes.t b/t/web/gnupg-tickyboxes.t
index 05239c1..e798645 100644
--- a/t/web/gnupg-tickyboxes.t
+++ b/t/web/gnupg-tickyboxes.t
@@ -2,7 +2,7 @@
 use strict;
 use warnings;
 
-use RT::Test::GnuPG tests => 29, gnupg_options => { passphrase => 'rt-test' };
+use RT::Test::GnuPG tests => 20, gnupg_options => { passphrase => 'rt-test' };
 
 use RT::Action::SendEmail;
 
@@ -37,7 +37,7 @@ my %mail = (
 diag "check in read-only mode that queue's props influence create/update ticket pages";
 {
     foreach my $variant ( @variants ) {
-        set_queue_crypt_options( %$variant );
+        set_queue_crypt_options( $queue =>  %$variant );
         $m->goto_create_ticket( $queue );
         $m->form_name('TicketCreate');
         if ( $variant->{'Encrypt'} ) {
@@ -53,7 +53,7 @@ diag "check in read-only mode that queue's props influence create/update ticket
     }
 
     # to avoid encryption/signing during create
-    set_queue_crypt_options();
+    set_queue_crypt_options($queue);
 
     my $ticket = RT::Ticket->new( RT->SystemUser );
     my ($id) = $ticket->Create(
@@ -64,7 +64,7 @@ diag "check in read-only mode that queue's props influence create/update ticket
     ok $id, 'ticket created';
 
     foreach my $variant ( @variants ) {
-        set_queue_crypt_options( %$variant );
+        set_queue_crypt_options( $queue => %$variant );
         $m->get( $m->rt_base_url . "/Ticket/Update.html?Action=Respond&id=$id" );
         $m->form_number(3);
         if ( $variant->{'Encrypt'} ) {
@@ -81,47 +81,4 @@ diag "check in read-only mode that queue's props influence create/update ticket
 }
 
 
-sub create_a_ticket {
-    my %args = (@_);
-
-    RT::Test->clean_caught_mails;
-
-    $m->goto_create_ticket( $queue );
-    $m->form_name('TicketCreate');
-    $m->field( Subject    => 'test' );
-    $m->field( Requestors => 'rt-test at example.com' );
-    $m->field( Content    => 'Some content' );
-
-    foreach ( qw(Sign Encrypt) ) {
-        if ( $args{ $_ } ) {
-            $m->tick( $_ => 1 );
-        } else {
-            $m->untick( $_ => 1 );
-        }
-    }
-
-    $m->submit;
-    is $m->status, 200, "request successful";
-
-    $m->content_lacks('unable to sign outgoing email messages');
-
-    $m->get_ok('/'); # ensure that the mail has been processed
-
-    my @mail = RT::Test->fetch_caught_mails;
-    check_text_emails( \%args, @mail );
-}
-
-sub set_queue_crypt_options {
-    my %args = @_;
-    $m->get_ok("/Admin/Queues/Modify.html?id=". $queue->id);
-    $m->form_with_fields('Sign', 'Encrypt');
-    foreach my $opt ('Sign', 'Encrypt') {
-        if ( $args{$opt} ) {
-            $m->tick($opt => 1);
-        } else {
-            $m->untick($opt => 1);
-        }
-    }
-    $m->submit;
-}
 

commit e7dfa50e8925f8611d93bf1b194ee0e4399cd0b5
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 22:53:39 2010 -0400

    Cleanup to the Dashboards management code

diff --git a/share/html/Dashboards/Subscription.html b/share/html/Dashboards/Subscription.html
index c4eb1d3..3bc3140 100644
--- a/share/html/Dashboards/Subscription.html
+++ b/share/html/Dashboards/Subscription.html
@@ -54,7 +54,7 @@
 <& /Elements/ListActions, actions => \@results &>
 
 <form action="<%RT->Config->Get('WebPath')%>/Dashboards/Subscription.html" method="post" enctype="multipart/form-data" name="SubscribeDashboard">
-<input type="hidden" class="hidden" name="DashboardId" value="<% $fields{'DashboardId'} %>" />
+<input type="hidden" class="hidden" name="id" value="<% $fields{'DashboardId'} %>" />
 <table width="100%" border="0">
 <tr>
 
@@ -197,20 +197,20 @@ my $SubscriptionObj = RT::Attribute->new($session{'CurrentUser'});
 
 # first let's see if we already have a subscription to this DashboardId
 for my $sub ($session{'CurrentUser'}->UserObj->Attributes->Named('Subscription')) {
-    next unless $sub->SubValue('DashboardId') == $DashboardId;
+    next unless $sub->SubValue('DashboardId') == $id;
     $SubscriptionObj = $sub;
     last;
 }
 
-$DashboardId = $SubscriptionObj->Id
+$id = $SubscriptionObj->Id
              ? $SubscriptionObj->SubValue('DashboardId')
-             : $ARGS{'DashboardId'};
+             : $ARGS{'id'};
 
-($val, $msg) = $DashboardObj->LoadById($DashboardId);
-$val || Abort(loc("Couldn't load dashboard [_1]: [_2].", $DashboardId, $msg));
+($val, $msg) = $DashboardObj->LoadById($id);
+$val || Abort(loc("Couldn't load dashboard [_1]: [_2].", $id, $msg));
 
 my %fields = (
-    DashboardId => $DashboardId,
+    DashboardId => $id,
     Frequency   => 'daily',
     Hour        => '06:00',
     Dow         => 'Monday',
@@ -238,9 +238,9 @@ for my $field (keys %fields) {
 if (defined $ARGS{Save}) {
     # update
     if ($SubscriptionObj->Id) {
-        $DashboardId = delete $fields{'DashboardId'}; # immutable
+        $id = delete $fields{'DashboardId'}; # immutable
         ($val, $msg) = $SubscriptionObj->SetSubValues(%fields);
-        $fields{'DashboardId'} = $DashboardId;
+        $fields{'DashboardId'} = $id;
 
         # not so good to spew base64-encoded data at the user :)
         if ($msg =~ /^Content changed from/) {
@@ -251,12 +251,12 @@ if (defined $ARGS{Save}) {
     }
     # create
     else {
-        Abort(loc("Unable to subscribe to dashboard [_1]: Permission denied", $DashboardId))
+        Abort(loc("Unable to subscribe to dashboard [_1]: Permission denied", $id))
             unless $DashboardObj->CurrentUserCanSubscribe;
 
         my ($val, $msg) = $SubscriptionObj->Create(
             Name        => 'Subscription',
-            Description => 'Subscription to dashboard ' . $DashboardId,
+            Description => 'Subscription to dashboard ' . $id,
             ContentType => 'storable',
             Object      => $session{'CurrentUser'}->UserObj,
             Content     => \%fields,
@@ -281,7 +281,7 @@ else {
 
 </%INIT>
 <%ARGS>
-$DashboardId => undef
+$id => undef
 $Frequency   => undef
 $Hour        => undef
 $Dow         => undef
diff --git a/t/web/dashboards.t b/t/web/dashboards.t
index b3fee67..d50ef83 100644
--- a/t/web/dashboards.t
+++ b/t/web/dashboards.t
@@ -153,7 +153,7 @@ $m->content_contains("50 newest unowned tickets");
 $m->content_lacks("Bookmarked Tickets");
 $m->content_contains("dashboard test", "ticket subject");
 
-$m->get_ok("/Dashboards/Subscription.html?DashboardId=$id");
+$m->get_ok("/Dashboards/Subscription.html?id=$id");
 $m->form_name('SubscribeDashboard');
 $m->click_button(name => 'Save');
 $m->content_contains("Permission denied");

commit 4ff560cb655651fc49868232b0e8176e2a9437a6
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Fri Nov 5 00:32:28 2010 -0400

    Remove old comments and debugging statements

diff --git a/share/html/Admin/Queues/People.html b/share/html/Admin/Queues/People.html
index 4dfeb77..1647a06 100755
--- a/share/html/Admin/Queues/People.html
+++ b/share/html/Admin/Queues/People.html
@@ -131,13 +131,6 @@
 my $current_tab;
 my ($field, @results, $User, $Users, $Groups, $watcher, $user_msg, $group_msg);
 
-# Load the queue
-#If we get handed two ids, mason will make them an array. bleck.
-# We want teh first one. Just because there's no other sensible way
-# to deal
-
-
-
 my $QueueObj = RT::Queue->new($session{'CurrentUser'});
 $QueueObj->Load($id) || Abort(loc("Couldn't load queue", $id));
 
@@ -163,7 +156,6 @@ unless ($OnlySearchForPeople or $OnlySearchForGroup) {
 
         next unless RT::Queue->IsManageableRoleGroupType($type);
 
-        $RT::Logger->debug("Adding a watcher $id to $type\n");
         my ($code, $msg) = $QueueObj->AddWatcher(
             Type => $type,
             PrincipalId => $id,

commit 1c3689a3ba5a9fad48f349656462f21abeb46afe
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Sat Sep 25 09:20:01 2010 -0400

    replace RT's menuing library (unusued) with one from jifty

diff --git a/lib/RT/Interface/Web/Menu.pm b/lib/RT/Interface/Web/Menu.pm
index 899f209..1665d7b 100644
--- a/lib/RT/Interface/Web/Menu.pm
+++ b/lib/RT/Interface/Web/Menu.pm
@@ -47,24 +47,269 @@
 # END BPS TAGGED BLOCK }}}
 
 package RT::Interface::Web::Menu;
-use warnings;
+
 use strict;
+use warnings;
+
+
+use base qw/Class::Accessor::Fast/;
+use URI;
+use Scalar::Util qw(weaken);
+
+__PACKAGE__->mk_accessors(qw(
+    label sort_order link target escape_label class render_children_inline
+    raw_html
+));
+
+=head1 NAME
+
+RT::Interface::Web::Menu - Handle the API for menu navigation
+
+=head1 METHODS
+
+=head2 new PARAMHASH
+
+Creates a new L<RT::Interface::Web::Menu> object.  Possible keys in the
+I<PARAMHASH> are L</label>, L</parent>, L</sort_order>, L</url>, and
+L</active>.  See the subroutines with the respective name below for
+each option's use.
+
+=cut
 
 sub new {
-    my $class = shift;
-    my $self = bless {}, $class;
-    $self->{'root_node'} = RT::Interface::Web::Menu::Item->new();
+    my $package = shift;
+    my $args = ref($_[0]) eq 'HASH' ? shift @_ : {@_};
+
+    my $parent = delete $args->{'parent'};
+    $args->{sort_order} ||= 0;
+
+    # Class::Accessor only wants a hashref;
+    my $self = $package->SUPER::new( $args );
+
+    # make sure our reference is weak
+    $self->parent($parent) if defined $parent;
+
     return $self;
 }
 
 
-sub as_hash_of_hashes {
+=head2 label [STRING]
+
+Sets or returns the string that the menu item will be displayed as.
+
+=cut
+
+=head2 parent [MENU]
+
+Gets or sets the parent L<RT::Interface::Web::Menu> of this item; this defaults
+to null. This ensures that the reference is weakened.
+
+=head2 raw_html [STRING]
+
+Sets the content of this menu item to a raw blob of HTML. When
+asked or output, rather than constructing a link, Jifty will return
+this raw content. No escaping is done.
 
+=cut
+
+sub parent {
+    my $self = shift;
+    if (@_) {
+        $self->{parent} = shift;
+        weaken $self->{parent};
+    }
+
+    return $self->{parent};
 }
 
-sub root {
+
+=head2 sort_order [NUMBER]
+
+Gets or sets the sort order of the item, as it will be displayed under
+the parent.  This defaults to adding onto the end.
+
+=head2 link
+
+Gets or set a L<Jifty::Web::Form::Link> object that represents this
+menu item. If you're looking to do complex ajaxy things with menus,
+this is likely the option you want.
+
+=head2 target [STRING]
+
+Get or set the frame or pseudo-target for this link. something like L<_blank>
+
+=cut
+
+=head2 class [STRING]
+
+Gets or sets the CSS class the link should have in addition to the default
+classes.  This is only used if L</link> isn't specified.
+
+=head2 render_children_inline [BOOLEAN]
+
+Gets or sets whether children are rendered inline as a menu "group" instead
+of a true submenu.  Only used when rendering with YUI for now.
+Defaults to false.
+
+Note that YUI doesn't support rendering nested menu groups, so having direct
+parent/children render_children_inline is likely not going to do what you
+want or expect.
+
+=head2 url
+
+Gets or sets the URL that the menu's link goes to.  If the link
+provided is not absolute (does not start with a "/"), then is is
+treated as relative to it's parent's url, and made absolute.
+
+=cut
+
+sub url {
+    my $self = shift;
+    if (@_) {
+        $self->{url} = shift;
+        $self->{url} = URI->new_abs($self->{url}, $self->parent->url . "/")->as_string
+            if defined $self->{url} and $self->parent and $self->parent->url;
+        $self->{url} =~ s!///!/! if $self->{url};
+    }
+    return $self->{url};
+}
+
+=head2 active [BOOLEAN]
+
+Gets or sets if the menu item is marked as active.  Setting this
+cascades to all of the parents of the menu item.
+
+=cut
+
+sub active {
+    my $self = shift;
+    if (@_) {
+        $self->{active} = shift;
+        $self->parent->active($self->{active}) if defined $self->parent;
+    }
+    return $self->{active};
+}
+
+=head2 child KEY [, PARAMHASH]
+
+If only a I<KEY> is provided, returns the child with that I<KEY>.
+
+Otherwise, creates or overwrites the child with that key, passing the
+I<PARAMHASH> to L<RT::Interface::Web::Menu/new>.  Additionally, the paramhash's
+L</label> defaults to the I<KEY>, and the L</sort_order> defaults to the
+pre-existing child's sort order (if a C<KEY> is being over-written) or
+the end of the list, if it is a new C<KEY>.
+
+If the paramhash contains a key called C<menu>, that will be used instead
+of creating a new RT::Interface::Web::Menu.
+
+
+=cut
+
+sub child {
+    my $self  = shift;
+    my $key   = shift;
+    my $proto = ref $self || $self;
+
+    if ( my %args = @_ ) {
+
+        # Clear children ordering cache
+        delete $self->{children_list};
+
+        my $child;
+        if ( $child = $args{menu} ) {
+            $child->parent($self);
+        } else {
+            $child = $proto->new(
+                {   parent     => $self,
+                    label        => $key,
+                    escape_label => 1,
+                    %args
+                }
+            );
+        }
+        $self->{children}{$key} = $child;
+
+        $child->sort_order( $args{sort_order} || (scalar values %{ $self->{children} })  )
+            unless ($child->sort_order());
+
+        # URL is relative to parents, and cached, so set it up now
+        $child->url( $child->{url} );
+
+        # Figure out the URL
+        my $url
+            = (     defined $child->link
+                and ref $child->link
+                and $child->link->can('url') )
+            ? $child->link->url
+            : $child->url;
+
+        # Activate it
+        if ( defined $url and length $url and Jifty->web->request ) {
+
+            # XXX TODO cleanup for mod_perl
+            my $base_path = Jifty->web->request->path;
+            chomp($base_path);
+
+            $base_path =~ s/index\.html$//;
+            $base_path =~ s/\/+$//;
+            $url       =~ s/\/+$//;
+
+            if ( $url eq $base_path ) {
+                $self->{children}{$key}->active(1);
+            }
+        }
+    }
+
+    return $self->{children}{$key};
+}
+
+=head2 active_child
+
+Returns the first active child node, or C<undef> is there is none.
+
+=cut
+
+sub active_child {
+    my $self = shift;
+    foreach my $kid ($self->children) {
+        return $kid if $kid->active;
+    }
+    return undef;
+}
+
+
+=head2 delete KEY
+
+Removes the child with the provided I<KEY>.
+
+=cut
+
+sub delete {
+    my $self = shift;
+    my $key = shift;
+    delete $self->{children_list};
+    delete $self->{children}{$key};
+}
+
+=head2 children
+
+Returns the children of this menu item in sorted order; as an array in
+array context, or as an array reference in scalar context.
+
+=cut
+
+sub children {
     my $self = shift;
-    return $self->{'root_node'};
+    my @kids;
+    if ($self->{children_list}) {
+        @kids = @{$self->{children_list}};
+    } else {
+        @kids = values %{$self->{children} || {}};
+        @kids = sort {$a->{sort_order} <=> $b->{sort_order}} @kids;
+        $self->{children_list} = \@kids;
+    }
+    return wantarray ? @kids : \@kids;
 }
 
 1;
diff --git a/lib/RT/Interface/Web/Menu/Item.pm b/lib/RT/Interface/Web/Menu/Item.pm
deleted file mode 100644
index e5efa29..0000000
--- a/lib/RT/Interface/Web/Menu/Item.pm
+++ /dev/null
@@ -1,87 +0,0 @@
-# BEGIN BPS TAGGED BLOCK {{{
-#
-# COPYRIGHT:
-#
-# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-#                                          <jesse at bestpractical.com>
-#
-# (Except where explicitly superseded by other copyright notices)
-#
-#
-# LICENSE:
-#
-# This work is made available to you under the terms of Version 2 of
-# the GNU General Public License. A copy of that license should have
-# been provided with this software, but in any event can be snarfed
-# from www.gnu.org.
-#
-# This work is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301 or visit their web page on the internet at
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-#
-#
-# CONTRIBUTION SUBMISSION POLICY:
-#
-# (The following paragraph is not intended to limit the rights granted
-# to you to modify and distribute this software under the terms of
-# the GNU General Public License and is only of importance to you if
-# you choose to contribute your changes and enhancements to the
-# community by submitting them to Best Practical Solutions, LLC.)
-#
-# By intentionally submitting any modifications, corrections or
-# derivatives to this work, or any other work intended for use with
-# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-# you are the copyright holder for those contributions and you grant
-# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-# royalty-free, perpetual, license to use, copy, create derivative
-# works based on those contributions, and sublicense and distribute
-# those contributions and any derivatives thereof.
-#
-# END BPS TAGGED BLOCK }}}
-
-package RT::Interface::Web::Menu::Item;
-
-
-sub new {
-    my $class = shift;
-    my $self = bless {},$class;
-    $self->{'_attributes'} = {};
-    return($self);
-}
-
-sub label { my $self = shift; $self->_accessor( label => @_) } ;
-sub absolute_url { my $self = shift; $self->_accessor( absolute_url => @_) } ;
-sub rt_path { my $self = shift; $self->_accessor( rt_path => @_) } ;
-sub hilight { my $self = shift; $self->_accessor( hilight => @_);
-              $self->parent->hilight(1);
-            } ;
-sub sort_order { my $self = shift; $self->_accessor( sort_order => @_) } ;
-
-sub add_child {
-}
-
-sub delete {
-}
-
-sub children {
-
-}
-
-sub _accessor {
-    my $self = shift;
-    my $key = shift;
-    if (@_){ 
-        $self->{'attributes'}->{$key} = shift;
-
-    }
-    return $self->{'_attributes'}->{$key};
-}
-
-1;

commit fa534d8b6ef0b9fa6a1505b897c02d8d20f5900f
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Thu Nov 4 19:08:36 2010 -0400

    Rename "label" to "title", and "url" to "path"

diff --git a/lib/RT/Interface/Web/Menu.pm b/lib/RT/Interface/Web/Menu.pm
index 1665d7b..3b85470 100644
--- a/lib/RT/Interface/Web/Menu.pm
+++ b/lib/RT/Interface/Web/Menu.pm
@@ -57,7 +57,7 @@ use URI;
 use Scalar::Util qw(weaken);
 
 __PACKAGE__->mk_accessors(qw(
-    label sort_order link target escape_label class render_children_inline
+    title sort_order link target escape_title class render_children_inline
     raw_html
 ));
 
@@ -70,7 +70,7 @@ RT::Interface::Web::Menu - Handle the API for menu navigation
 =head2 new PARAMHASH
 
 Creates a new L<RT::Interface::Web::Menu> object.  Possible keys in the
-I<PARAMHASH> are L</label>, L</parent>, L</sort_order>, L</url>, and
+I<PARAMHASH> are L</title>, L</parent>, L</sort_order>, L</path>, and
 L</active>.  See the subroutines with the respective name below for
 each option's use.
 
@@ -93,7 +93,7 @@ sub new {
 }
 
 
-=head2 label [STRING]
+=head2 title [STRING]
 
 Sets or returns the string that the menu item will be displayed as.
 
@@ -155,23 +155,23 @@ Note that YUI doesn't support rendering nested menu groups, so having direct
 parent/children render_children_inline is likely not going to do what you
 want or expect.
 
-=head2 url
+=head2 path
 
 Gets or sets the URL that the menu's link goes to.  If the link
 provided is not absolute (does not start with a "/"), then is is
-treated as relative to it's parent's url, and made absolute.
+treated as relative to it's parent's path, and made absolute.
 
 =cut
 
-sub url {
+sub path {
     my $self = shift;
     if (@_) {
-        $self->{url} = shift;
-        $self->{url} = URI->new_abs($self->{url}, $self->parent->url . "/")->as_string
-            if defined $self->{url} and $self->parent and $self->parent->url;
-        $self->{url} =~ s!///!/! if $self->{url};
+        $self->{path} = shift;
+        $self->{path} = URI->new_abs($self->{path}, $self->parent->path . "/")->as_string
+            if defined $self->{path} and $self->parent and $self->parent->path;
+        $self->{path} =~ s!///!/! if $self->{path};
     }
-    return $self->{url};
+    return $self->{path};
 }
 
 =head2 active [BOOLEAN]
@@ -196,7 +196,7 @@ If only a I<KEY> is provided, returns the child with that I<KEY>.
 
 Otherwise, creates or overwrites the child with that key, passing the
 I<PARAMHASH> to L<RT::Interface::Web::Menu/new>.  Additionally, the paramhash's
-L</label> defaults to the I<KEY>, and the L</sort_order> defaults to the
+L</title> defaults to the I<KEY>, and the L</sort_order> defaults to the
 pre-existing child's sort order (if a C<KEY> is being over-written) or
 the end of the list, if it is a new C<KEY>.
 
@@ -222,8 +222,8 @@ sub child {
         } else {
             $child = $proto->new(
                 {   parent     => $self,
-                    label        => $key,
-                    escape_label => 1,
+                    title        => $key,
+                    escape_title => 1,
                     %args
                 }
             );
@@ -234,28 +234,28 @@ sub child {
             unless ($child->sort_order());
 
         # URL is relative to parents, and cached, so set it up now
-        $child->url( $child->{url} );
+        $child->path( $child->{path} );
 
         # Figure out the URL
-        my $url
+        my $path
             = (     defined $child->link
                 and ref $child->link
-                and $child->link->can('url') )
-            ? $child->link->url
-            : $child->url;
+                and $child->link->can('path') )
+            ? $child->link->path
+            : $child->path;
 
         # Activate it
-        if ( defined $url and length $url and Jifty->web->request ) {
+        if ( defined $path and length $path ) {
 
             # XXX TODO cleanup for mod_perl
-            my $base_path = Jifty->web->request->path;
+            my $base_path = '';
             chomp($base_path);
 
             $base_path =~ s/index\.html$//;
             $base_path =~ s/\/+$//;
-            $url       =~ s/\/+$//;
+            $path      =~ s/\/+$//;
 
-            if ( $url eq $base_path ) {
+            if ( $path eq $base_path ) {
                 $self->{children}{$key}->active(1);
             }
         }

commit 76c168463be2c047ff1ddba3a756f48e7df3f4d5
Author: Alex Vandiver <alexmv at bestpractical.com>
Date:   Thu Nov 4 19:04:26 2010 -0400

    Remove some jifty-specific parts, including ->link

diff --git a/lib/RT/Interface/Web/Menu.pm b/lib/RT/Interface/Web/Menu.pm
index 3b85470..151d44f 100644
--- a/lib/RT/Interface/Web/Menu.pm
+++ b/lib/RT/Interface/Web/Menu.pm
@@ -57,7 +57,7 @@ use URI;
 use Scalar::Util qw(weaken);
 
 __PACKAGE__->mk_accessors(qw(
-    title sort_order link target escape_title class render_children_inline
+    title sort_order target escape_title class render_children_inline
     raw_html
 ));
 
@@ -107,7 +107,7 @@ to null. This ensures that the reference is weakened.
 =head2 raw_html [STRING]
 
 Sets the content of this menu item to a raw blob of HTML. When
-asked or output, rather than constructing a link, Jifty will return
+asked or output, rather than constructing a link, we will return
 this raw content. No escaping is done.
 
 =cut
@@ -128,12 +128,6 @@ sub parent {
 Gets or sets the sort order of the item, as it will be displayed under
 the parent.  This defaults to adding onto the end.
 
-=head2 link
-
-Gets or set a L<Jifty::Web::Form::Link> object that represents this
-menu item. If you're looking to do complex ajaxy things with menus,
-this is likely the option you want.
-
 =head2 target [STRING]
 
 Get or set the frame or pseudo-target for this link. something like L<_blank>
@@ -237,12 +231,7 @@ sub child {
         $child->path( $child->{path} );
 
         # Figure out the URL
-        my $path
-            = (     defined $child->link
-                and ref $child->link
-                and $child->link->can('path') )
-            ? $child->link->path
-            : $child->path;
+        my $path = $child->path;
 
         # Activate it
         if ( defined $path and length $path ) {

commit feac87fa15e61592984347c178f879cb07286ad8
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 22:49:01 2010 -0400

    Import superfish

diff --git a/etc/RT_Config.pm.in b/etc/RT_Config.pm.in
index 2c06e10..647db67 100755
--- a/etc/RT_Config.pm.in
+++ b/etc/RT_Config.pm.in
@@ -2194,6 +2194,8 @@ Set(@JSFilesInHead, qw/
     titlebox-state.js
     util.js
     userautocomplete.js
+    superfish.js
+    supersubs.js
 /);
 
 =item C<$JSMinPath>
diff --git a/share/html/NoAuth/css/base/main.css b/share/html/NoAuth/css/base/main.css
index af80183..9c63d85 100644
--- a/share/html/NoAuth/css/base/main.css
+++ b/share/html/NoAuth/css/base/main.css
@@ -54,6 +54,9 @@
 @import "theme-editor.css";
 @import "ticket.css";
 @import "tablesorter.css";
+ at import "superfish.css";
+ at import "superfish-navbar.css";
+ at import "superfish-vertical.css";
 
 % $m->callback(CallbackName => 'End');
 
diff --git a/share/html/NoAuth/css/base/superfish-navbar.css b/share/html/NoAuth/css/base/superfish-navbar.css
new file mode 100644
index 0000000..68c7135
--- /dev/null
+++ b/share/html/NoAuth/css/base/superfish-navbar.css
@@ -0,0 +1,93 @@
+
+/*** adding the class sf-navbar in addition to sf-menu creates an all-horizontal nav-bar menu ***/
+.sf-navbar {
+	background:		#BDD2FF;
+	height:			2.5em;
+	padding-bottom:	2.5em;
+	position:		relative;
+}
+.sf-navbar li {
+	background:		#AABDE6;
+	position:		static;
+}
+.sf-navbar a {
+	border-top:		none;
+}
+.sf-navbar li ul {
+	width:			44em; /*IE6 soils itself without this*/
+}
+.sf-navbar li li {
+	background:		#BDD2FF;
+	position:		relative;
+}
+.sf-navbar li li ul {
+	width:			13em;
+}
+.sf-navbar li li li {
+	width:			100%;
+}
+.sf-navbar ul li {
+	width:			auto;
+	float:			left;
+}
+.sf-navbar a, .sf-navbar a:visited {
+	border:			none;
+}
+.sf-navbar li.current {
+	background:		#BDD2FF;
+}
+.sf-navbar li:hover,
+.sf-navbar li.sfHover,
+.sf-navbar li li.current,
+.sf-navbar a:focus, .sf-navbar a:hover, .sf-navbar a:active {
+	background:		#BDD2FF;
+}
+.sf-navbar ul li:hover,
+.sf-navbar ul li.sfHover,
+ul.sf-navbar ul li:hover li,
+ul.sf-navbar ul li.sfHover li,
+.sf-navbar ul a:focus, .sf-navbar ul a:hover, .sf-navbar ul a:active {
+	background:		#D1DFFF;
+}
+ul.sf-navbar li li li:hover,
+ul.sf-navbar li li li.sfHover,
+.sf-navbar li li.current li.current,
+.sf-navbar ul li li a:focus, .sf-navbar ul li li a:hover, .sf-navbar ul li li a:active {
+	background:		#E6EEFF;
+}
+ul.sf-navbar .current ul,
+ul.sf-navbar ul li:hover ul,
+ul.sf-navbar ul li.sfHover ul {
+	left:			0;
+	top:			2.5em; /* match top ul list item height */
+}
+ul.sf-navbar .current ul ul {
+	top: 			-999em;
+}
+
+.sf-navbar li li.current > a {
+	font-weight:	bold;
+}
+
+/*** point all arrows down ***/
+/* point right for anchors in subs */
+.sf-navbar ul .sf-sub-indicator { background-position: -10px -100px; }
+.sf-navbar ul a > .sf-sub-indicator { background-position: 0 -100px; }
+/* apply hovers to modern browsers */
+.sf-navbar ul a:focus > .sf-sub-indicator,
+.sf-navbar ul a:hover > .sf-sub-indicator,
+.sf-navbar ul a:active > .sf-sub-indicator,
+.sf-navbar ul li:hover > a > .sf-sub-indicator,
+.sf-navbar ul li.sfHover > a > .sf-sub-indicator {
+	background-position: -10px -100px; /* arrow hovers for modern browsers*/
+}
+
+/*** remove shadow on first submenu ***/
+.sf-navbar > li > ul {
+	background: transparent;
+	padding: 0;
+	-moz-border-radius-bottomleft: 0;
+	-moz-border-radius-topright: 0;
+	-webkit-border-top-right-radius: 0;
+	-webkit-border-bottom-left-radius: 0;
+}
\ No newline at end of file
diff --git a/share/html/NoAuth/css/base/superfish-vertical.css b/share/html/NoAuth/css/base/superfish-vertical.css
new file mode 100644
index 0000000..8025b78
--- /dev/null
+++ b/share/html/NoAuth/css/base/superfish-vertical.css
@@ -0,0 +1,23 @@
+/*** adding sf-vertical in addition to sf-menu creates a vertical menu ***/
+.sf-vertical, .sf-vertical li {
+	width:	10em;
+}
+/* this lacks ul at the start of the selector, so the styles from the main CSS file override it where needed */
+.sf-vertical li:hover ul,
+.sf-vertical li.sfHover ul {
+	left:	10em; /* match ul width */
+	top:	0;
+}
+
+/*** alter arrow directions ***/
+.sf-vertical .sf-sub-indicator { background-position: -10px 0; } /* IE6 gets solid image only */
+.sf-vertical a > .sf-sub-indicator { background-position: 0 0; } /* use translucent arrow for modern browsers*/
+
+/* hover arrow direction for modern browsers*/
+.sf-vertical a:focus > .sf-sub-indicator,
+.sf-vertical a:hover > .sf-sub-indicator,
+.sf-vertical a:active > .sf-sub-indicator,
+.sf-vertical li:hover > a > .sf-sub-indicator,
+.sf-vertical li.sfHover > a > .sf-sub-indicator {
+	background-position: -10px 0; /* arrow hovers for modern browsers*/
+}
\ No newline at end of file
diff --git a/share/html/NoAuth/css/base/superfish.css b/share/html/NoAuth/css/base/superfish.css
new file mode 100644
index 0000000..cc33fdb
--- /dev/null
+++ b/share/html/NoAuth/css/base/superfish.css
@@ -0,0 +1,136 @@
+
+/*** ESSENTIAL STYLES ***/
+.sf-menu, .sf-menu * {
+	margin:			0;
+	padding:		0;
+	list-style:		none;
+}
+.sf-menu {
+	line-height:	1.0;
+}
+.sf-menu ul {
+	position:		absolute;
+	top:			-999em;
+	width:			10em; /* left offset of submenus need to match (see below) */
+}
+.sf-menu ul li {
+	width:			100%;
+}
+.sf-menu li:hover {
+	visibility:		inherit; /* fixes IE7 'sticky bug' */
+}
+.sf-menu li {
+	float:			left;
+	position:		relative;
+}
+.sf-menu a {
+	display:		block;
+	position:		relative;
+}
+.sf-menu li:hover ul,
+.sf-menu li.sfHover ul {
+	left:			0;
+	top:			2.5em; /* match top ul list item height */
+	z-index:		99;
+}
+ul.sf-menu li:hover li ul,
+ul.sf-menu li.sfHover li ul {
+	top:			-999em;
+}
+ul.sf-menu li li:hover ul,
+ul.sf-menu li li.sfHover ul {
+	left:			10em; /* match ul width */
+	top:			0;
+}
+ul.sf-menu li li:hover li ul,
+ul.sf-menu li li.sfHover li ul {
+	top:			-999em;
+}
+ul.sf-menu li li li:hover ul,
+ul.sf-menu li li li.sfHover ul {
+	left:			10em; /* match ul width */
+	top:			0;
+}
+
+/*** DEMO SKIN ***/
+.sf-menu {
+	float:			left;
+	margin-bottom:	1em;
+}
+.sf-menu a {
+	border-left:	1px solid #fff;
+	border-top:		1px solid #CFDEFF;
+	padding: 		.75em 1em;
+	text-decoration:none;
+}
+.sf-menu a, .sf-menu a:visited  { /* visited pseudo selector so IE6 applies text colour*/
+	color:			#13a;
+}
+.sf-menu li {
+	background:		#BDD2FF;
+}
+.sf-menu li li {
+	background:		#AABDE6;
+}
+.sf-menu li li li {
+	background:		#9AAEDB;
+}
+.sf-menu li:hover, .sf-menu li.sfHover,
+.sf-menu a:focus, .sf-menu a:hover, .sf-menu a:active {
+	background:		#CFDEFF;
+	outline:		0;
+}
+
+/*** arrows **/
+.sf-menu a.sf-with-ul {
+	padding-right: 	2.25em;
+	min-width:		1px; /* trigger IE7 hasLayout so spans position accurately */
+}
+.sf-sub-indicator {
+	position:		absolute;
+	display:		block;
+	right:			.75em;
+	top:			1.05em; /* IE6 only */
+	width:			10px;
+	height:			10px;
+	text-indent: 	-999em;
+	overflow:		hidden;
+	background:		url('../images/arrows-ffffff.png') no-repeat -10px -100px; /* 8-bit indexed alpha png. IE6 gets solid image only */
+}
+a > .sf-sub-indicator {  /* give all except IE6 the correct values */
+	top:			.8em;
+	background-position: 0 -100px; /* use translucent arrow for modern browsers*/
+}
+/* apply hovers to modern browsers */
+a:focus > .sf-sub-indicator,
+a:hover > .sf-sub-indicator,
+a:active > .sf-sub-indicator,
+li:hover > a > .sf-sub-indicator,
+li.sfHover > a > .sf-sub-indicator {
+	background-position: -10px -100px; /* arrow hovers for modern browsers*/
+}
+
+/* point right for anchors in subs */
+.sf-menu ul .sf-sub-indicator { background-position:  -10px 0; }
+.sf-menu ul a > .sf-sub-indicator { background-position:  0 0; }
+/* apply hovers to modern browsers */
+.sf-menu ul a:focus > .sf-sub-indicator,
+.sf-menu ul a:hover > .sf-sub-indicator,
+.sf-menu ul a:active > .sf-sub-indicator,
+.sf-menu ul li:hover > a > .sf-sub-indicator,
+.sf-menu ul li.sfHover > a > .sf-sub-indicator {
+	background-position: -10px 0; /* arrow hovers for modern browsers*/
+}
+
+/*** shadows for all but IE6 ***/
+.sf-shadow ul {
+	background:	url('../images/shadow.png') no-repeat bottom right;
+	padding: 0 8px 9px 0;
+	-moz-border-radius-bottomleft: 17px;
+	-moz-border-radius-topright: 17px;
+	-webkit-border-top-right-radius: 17px;
+	-webkit-border-bottom-left-radius: 17px;
+}
+.sf-shadow ul.sf-shadow-off {
+	background: transparent;
+}
diff --git a/share/html/NoAuth/css/images/arrows-ffffff.png b/share/html/NoAuth/css/images/arrows-ffffff.png
new file mode 100644
index 0000000..995df52
Binary files /dev/null and b/share/html/NoAuth/css/images/arrows-ffffff.png differ
diff --git a/share/html/NoAuth/css/images/shadow.png b/share/html/NoAuth/css/images/shadow.png
new file mode 100644
index 0000000..c04d21b
Binary files /dev/null and b/share/html/NoAuth/css/images/shadow.png differ
diff --git a/share/html/NoAuth/js/superfish.js b/share/html/NoAuth/js/superfish.js
new file mode 100644
index 0000000..2d74318
--- /dev/null
+++ b/share/html/NoAuth/js/superfish.js
@@ -0,0 +1,121 @@
+
+/*
+ * Superfish v1.4.8 - jQuery menu widget
+ * Copyright (c) 2008 Joel Birch
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * 	http://www.opensource.org/licenses/mit-license.php
+ * 	http://www.gnu.org/licenses/gpl.html
+ *
+ * CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt
+ */
+
+;(function($){
+	$.fn.superfish = function(op){
+
+		var sf = $.fn.superfish,
+			c = sf.c,
+			$arrow = $(['<span class="',c.arrowClass,'"> &#187;</span>'].join('')),
+			over = function(){
+				var $$ = $(this), menu = getMenu($$);
+				clearTimeout(menu.sfTimer);
+				$$.showSuperfishUl().siblings().hideSuperfishUl();
+			},
+			out = function(){
+				var $$ = $(this), menu = getMenu($$), o = sf.op;
+				clearTimeout(menu.sfTimer);
+				menu.sfTimer=setTimeout(function(){
+					o.retainPath=($.inArray($$[0],o.$path)>-1);
+					$$.hideSuperfishUl();
+					if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);}
+				},o.delay);
+			},
+			getMenu = function($menu){
+				var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0];
+				sf.op = sf.o[menu.serial];
+				return menu;
+			},
+			addArrow = function($a){ $a.addClass(c.anchorClass).append($arrow.clone()); };
+
+		return this.each(function() {
+			var s = this.serial = sf.o.length;
+			var o = $.extend({},sf.defaults,op);
+			o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){
+				$(this).addClass([o.hoverClass,c.bcClass].join(' '))
+					.filter('li:has(ul)').removeClass(o.pathClass);
+			});
+			sf.o[s] = sf.op = o;
+
+			$('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over,out).each(function() {
+				if (o.autoArrows) addArrow( $('>a:first-child',this) );
+			})
+			.not('.'+c.bcClass)
+				.hideSuperfishUl();
+
+			var $a = $('a',this);
+			$a.each(function(i){
+				var $li = $a.eq(i).parents('li');
+				$a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);});
+			});
+			o.onInit.call(this);
+
+		}).each(function() {
+			var menuClasses = [c.menuClass];
+			if (sf.op.dropShadows  && !($.browser.msie && $.browser.version < 7)) menuClasses.push(c.shadowClass);
+			$(this).addClass(menuClasses.join(' '));
+		});
+	};
+
+	var sf = $.fn.superfish;
+	sf.o = [];
+	sf.op = {};
+	sf.IE7fix = function(){
+		var o = sf.op;
+		if ($.browser.msie && $.browser.version > 6 && o.dropShadows && o.animation.opacity!=undefined)
+			this.toggleClass(sf.c.shadowClass+'-off');
+		};
+	sf.c = {
+		bcClass     : 'sf-breadcrumb',
+		menuClass   : 'sf-js-enabled',
+		anchorClass : 'sf-with-ul',
+		arrowClass  : 'sf-sub-indicator',
+		shadowClass : 'sf-shadow'
+	};
+	sf.defaults = {
+		hoverClass	: 'sfHover',
+		pathClass	: 'overideThisToUse',
+		pathLevels	: 1,
+		delay		: 800,
+		animation	: {opacity:'show'},
+		speed		: 'normal',
+		autoArrows	: true,
+		dropShadows : true,
+		disableHI	: false,		// true disables hoverIntent detection
+		onInit		: function(){}, // callback functions
+		onBeforeShow: function(){},
+		onShow		: function(){},
+		onHide		: function(){}
+	};
+	$.fn.extend({
+		hideSuperfishUl : function(){
+			var o = sf.op,
+				not = (o.retainPath===true) ? o.$path : '';
+			o.retainPath = false;
+			var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass)
+					.find('>ul').hide().css('visibility','hidden');
+			o.onHide.call($ul);
+			return this;
+		},
+		showSuperfishUl : function(){
+			var o = sf.op,
+				sh = sf.c.shadowClass+'-off',
+				$ul = this.addClass(o.hoverClass)
+					.find('>ul:hidden').css('visibility','visible');
+			sf.IE7fix.call($ul);
+			o.onBeforeShow.call($ul);
+			$ul.animate(o.animation,o.speed,function(){ sf.IE7fix.call($ul); o.onShow.call($ul); });
+			return this;
+		}
+	});
+
+})(jQuery);
diff --git a/share/html/NoAuth/js/supersubs.js b/share/html/NoAuth/js/supersubs.js
new file mode 100644
index 0000000..a6fce65
--- /dev/null
+++ b/share/html/NoAuth/js/supersubs.js
@@ -0,0 +1,90 @@
+
+/*
+ * Supersubs v0.2b - jQuery plugin
+ * Copyright (c) 2008 Joel Birch
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * 	http://www.opensource.org/licenses/mit-license.php
+ * 	http://www.gnu.org/licenses/gpl.html
+ *
+ *
+ * This plugin automatically adjusts submenu widths of suckerfish-style menus to that of
+ * their longest list item children. If you use this, please expect bugs and report them
+ * to the jQuery Google Group with the word 'Superfish' in the subject line.
+ *
+ */
+
+;(function($){ // $ will refer to jQuery within this closure
+
+	$.fn.supersubs = function(options){
+		var opts = $.extend({}, $.fn.supersubs.defaults, options);
+		// return original object to support chaining
+		return this.each(function() {
+			// cache selections
+			var $$ = $(this);
+			// support metadata
+			var o = $.meta ? $.extend({}, opts, $$.data()) : opts;
+			// get the font size of menu.
+			// .css('fontSize') returns various results cross-browser, so measure an em dash instead
+			var fontsize = $('<li id="menu-fontsize">&#8212;</li>').css({
+				'padding' : 0,
+				'position' : 'absolute',
+				'top' : '-999em',
+				'width' : 'auto'
+			}).appendTo($$).width(); //clientWidth is faster, but was incorrect here
+			// remove em dash
+			$('#menu-fontsize').remove();
+			// cache all ul elements
+			$ULs = $$.find('ul');
+			// loop through each ul in menu
+			$ULs.each(function(i) {
+				// cache this ul
+				var $ul = $ULs.eq(i);
+				// get all (li) children of this ul
+				var $LIs = $ul.children();
+				// get all anchor grand-children
+				var $As = $LIs.children('a');
+				// force content to one line and save current float property
+				var liFloat = $LIs.css('white-space','nowrap').css('float');
+				// remove width restrictions and floats so elements remain vertically stacked
+				var emWidth = $ul.add($LIs).add($As).css({
+					'float' : 'none',
+					'width'	: 'auto'
+				})
+				// this ul will now be shrink-wrapped to longest li due to position:absolute
+				// so save its width as ems. Clientwidth is 2 times faster than .width() - thanks Dan Switzer
+				.end().end()[0].clientWidth / fontsize;
+				// add more width to ensure lines don't turn over at certain sizes in various browsers
+				emWidth += o.extraWidth;
+				// restrict to at least minWidth and at most maxWidth
+				if (emWidth > o.maxWidth)		{ emWidth = o.maxWidth; }
+				else if (emWidth < o.minWidth)	{ emWidth = o.minWidth; }
+				emWidth += 'em';
+				// set ul to width in ems
+				$ul.css('width',emWidth);
+				// restore li floats to avoid IE bugs
+				// set li width to full width of this ul
+				// revert white-space to normal
+				$LIs.css({
+					'float' : liFloat,
+					'width' : '100%',
+					'white-space' : 'normal'
+				})
+				// update offset position of descendant ul to reflect new width of parent
+				.each(function(){
+					var $childUl = $('>ul',this);
+					var offsetDirection = $childUl.css('left')!==undefined ? 'left' : 'right';
+					$childUl.css(offsetDirection,emWidth);
+				});
+			});
+
+		});
+	};
+	// expose defaults
+	$.fn.supersubs.defaults = {
+		minWidth		: 9,		// requires em unit.
+		maxWidth		: 25,		// requires em unit.
+		extraWidth		: 0			// extra width can ensure lines don't sometimes turn over due to slight browser differences in how they round-off values
+	};
+
+})(jQuery); // plugin code ends

commit c2081da0bd5d3ea3b1e34076ad42d6ae2a02bb73
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Mon Nov 1 12:48:34 2010 -0400

    tighten up superfish styles so menuing doesn't break horribly

diff --git a/share/html/NoAuth/css/base/superfish-navbar.css b/share/html/NoAuth/css/base/superfish-navbar.css
index 68c7135..9a3f24c 100644
--- a/share/html/NoAuth/css/base/superfish-navbar.css
+++ b/share/html/NoAuth/css/base/superfish-navbar.css
@@ -2,8 +2,8 @@
 /*** adding the class sf-navbar in addition to sf-menu creates an all-horizontal nav-bar menu ***/
 .sf-navbar {
 	background:		#BDD2FF;
-	height:			2.5em;
-	padding-bottom:	2.5em;
+	height:			2em;
+	padding-bottom:	2em;
 	position:		relative;
 }
 .sf-navbar li {
@@ -59,7 +59,7 @@ ul.sf-navbar .current ul,
 ul.sf-navbar ul li:hover ul,
 ul.sf-navbar ul li.sfHover ul {
 	left:			0;
-	top:			2.5em; /* match top ul list item height */
+	top:			2em; /* match top ul list item height */
 }
 ul.sf-navbar .current ul ul {
 	top: 			-999em;
@@ -90,4 +90,4 @@ ul.sf-navbar .current ul ul {
 	-moz-border-radius-topright: 0;
 	-webkit-border-top-right-radius: 0;
 	-webkit-border-bottom-left-radius: 0;
-}
\ No newline at end of file
+}
diff --git a/share/html/NoAuth/css/base/superfish.css b/share/html/NoAuth/css/base/superfish.css
index cc33fdb..d2ae2f0 100644
--- a/share/html/NoAuth/css/base/superfish.css
+++ b/share/html/NoAuth/css/base/superfish.css
@@ -30,7 +30,7 @@
 .sf-menu li:hover ul,
 .sf-menu li.sfHover ul {
 	left:			0;
-	top:			2.5em; /* match top ul list item height */
+	top:			2em; /* match top ul list item height */
 	z-index:		99;
 }
 ul.sf-menu li:hover li ul,

commit 269fa002381be3e78831df60f397f47a88467776
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 22:50:32 2010 -0400

    Give SharedSetting an 'id' method as an alias to Id

diff --git a/lib/RT/SharedSetting.pm b/lib/RT/SharedSetting.pm
index 5eab2ea..32a515d 100644
--- a/lib/RT/SharedSetting.pm
+++ b/lib/RT/SharedSetting.pm
@@ -295,6 +295,9 @@ sub Id {
     return $self->{'Id'};
 }
 
+*id = \&Id;
+
+
 =head2 Privacy
 
 Returns the principal object to whom this shared setting belongs, in a string

commit e9c2a037a3dcaf5de61866a32b8afe638119a269
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Thu Nov 4 19:09:08 2010 -0400

    Remove old Navigation UI, and replace with new menus

diff --git a/lib/RT/Interface/Web.pm b/lib/RT/Interface/Web.pm
index c50c1a7..1c8d276 100755
--- a/lib/RT/Interface/Web.pm
+++ b/lib/RT/Interface/Web.pm
@@ -65,6 +65,7 @@ package RT::Interface::Web;
 
 use RT::SavedSearches;
 use URI qw();
+use RT::Interface::Web::Menu;
 use RT::Interface::Web::Session;
 use Digest::MD5 ();
 use Encode qw();
@@ -284,6 +285,13 @@ sub MaybeShowNoAuthPage {
     $m->abort;
 }
 
+sub InitializeMenu {
+    $HTML::Mason::Commands::m->notes('menu', RT::Interface::Web::Menu->new());
+    $HTML::Mason::Commands::m->notes('page-menu', RT::Interface::Web::Menu->new());
+
+}
+
+
 =head2 ShowRequestedPage  \%ARGS
 
 This function, called exclusively by RT's autohandler, dispatches
@@ -297,6 +305,8 @@ sub ShowRequestedPage {
 
     my $m = $HTML::Mason::Commands::m;
 
+    InitializeMenu();
+
     SendSessionCookie();
 
     # If the user isn't privileged, they can only see SelfService
@@ -810,6 +820,13 @@ package HTML::Mason::Commands;
 
 use vars qw/$r $m %session/;
 
+sub Menu {
+    return $HTML::Mason::Commands::m->notes('menu');
+}
+
+sub PageMenu {
+    return $HTML::Mason::Commands::m->notes('page-menu');
+}
 
 =head2 loc ARRAY
 
diff --git a/share/html/Elements/Menu b/share/html/Elements/Menu
index 9c5f78d..e188abe 100755
--- a/share/html/Elements/Menu
+++ b/share/html/Elements/Menu
@@ -45,76 +45,18 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-<ul<% !$level ? ' id="system-menu"' : ''|n %><% $menu_class ? qq[ class="$menu_class"] : ''|n %>>
-<div<% $menu_class ? qq[ class="$menu_class"] : ''|n %>><div class="wrapper">
-<%perl>
- my $sep         = 0;
- my $postsep     = 0;
- my $accesskey   = 1;
- 
- $count = 0;
- $class = {};
-
-my @tabs = sort keys %$toptabs;
- foreach $tab (@tabs) {
-     $count++;
-
-     my $current = $current_toptab || '';
-     my $path    = $toptabs->{$tab}->{'path'} || "";
-     my $target  = $toptabs->{$tab}->{'target'} || "";
-     
-     $path    =~ s#/index.html$##gi;
-     $current =~ s#/index.html$##gi;
-     
-     $sep     = $toptabs->{$tab}->{'separator'} ? 1 : 0;
-
-     my @aclass;
-     push @aclass, 'selected' if $path eq $current;
-     push @aclass, 'odd' if $level % 2;
-     $class->{a} = join ' ', @aclass;
-
-     my @li;
-     push @li, 'first' if $count == 1;
-     push @li, 'pre-separator' if $sep;
-     push @li, 'post-separator' if $postsep;
-     push @li, 'last' if ( $tab eq $tabs[-1]);
-     $class->{li} = join ' ', @li;
-
-     my $url = ($toptabs->{$tab}->{'path'}||'') =~ /^(?:https?|mailto):/i
-         ? $toptabs->{$tab}->{'path'} || ''
-         : RT->Config->Get('WebPath') . "/" . $toptabs->{$tab}->{'path'};
-     
-</%perl>
-    <li<% $class->{'li'} ? qq[ class="$class->{li}"] : ''|n %>><% $count > 1 && !$postsep && qq[<span class="bullet">&#183; </span>]|n%><a href="<% $url %>" <% $class->{a} && qq[ class="$class->{a}"] |n %> <% $target && qq[ target="$target"] |n %> <% !$level && " accesskey='".$accesskey++."'" |n %>><% $toptabs->{$tab}->{'title'}%></a>
-%
-%# Second-level items
-%     if ($toptabs->{$tab}->{'subtabs'}
-%         and keys %{$toptabs->{$tab}->{'subtabs'}})
-%     {
-          <& /Elements/Menu, level => $level+1, 
-                             current_toptab => $toptabs->{$tab}->{'current_subtab'},
-                             toptabs => $toptabs->{$tab}->{'subtabs'},
-                             last_level => $toptabs->{$tab}->{last_system_menu_level} &>
-%     }
-  </li>
-%     if ($sep) {
-  <li class="separator">&#183;&#183;&#183;</li>
-%     }
-%
-%     $postsep = $sep;
+<ul <%$id ? 'id="'.$id.'"' : '' |n%><% $toplevel? 'class="sf-menu sf-js-enabled sf-shadow"' : '' |n %>>
+% for my $child ($menu->children) {
+<li><a href="<%RT->Config->Get('WebPath')%><%$child->path%>"><%$child->title%></a>
+% next unless ($child->has_children);
+<& Menu, menu => $child, toplevel => 0 &>
+</li>
 % }
-</div></div>
 </ul>
-
 <%INIT>
-my ($tab, $class, $count, @ul);
-push @ul, 'last-menu-level' if $last_level;
-push @ul, 'odd' if $level % 2;
-my $menu_class = join ' ', @ul;
 </%INIT>
 <%ARGS>
-$toptabs => {}
-$current_toptab => ''
-$level => 0
-$last_level => 0
+$menu
+$id => undef
+$toplevel => 1
 </%ARGS>
diff --git a/share/html/Elements/PageLayout b/share/html/Elements/PageLayout
index 0ba9529..52f0d1a 100755
--- a/share/html/Elements/PageLayout
+++ b/share/html/Elements/PageLayout
@@ -55,121 +55,24 @@
 </div>
 
 % if ( $show_menu ) {
-<div id="nav">
-<& /Elements/Menu, toptabs => $toptabs, current_toptab => $current_toptab &>
-</div>
+<div id="nav"><& /Elements/Menu, menu => Menu(), id => 'app-nav' &></div>
+
+<div id="page-navigation"><& /Elements/Menu, menu => PageMenu(), id => 'page-menu', 'parent_id' => 'page' &></div>
 % }
+<script type="text/javascript">
+jQuery(document).ready(function(){ jQuery("#app-nav").superfish(); });
+jQuery(document).ready(function(){ jQuery("#page-menu").superfish(); });
+jQuery(document).ready(function(){ jQuery("#actions-menu").superfish(); });
+</script>
 
 <div id="header">
 <h1><% $title %></h1>
-<div id="page-navigation">
 % my $sep       = 0;
 % my $postsep   = 0;
 % my $count     = 0;
 % my $class     = { };
 % 
-  <ul id="page-menu" <% (($actions && %$actions) || ($subactions && %$subactions)) && q[ class="actions-present"] | n %>>
-    <div><div><div>
-<%perl>
- if ($page_tabs) {
-     my @tabs = ( sort grep { $_ !~ /^(?:current_toptab|this)$/ } keys %{$page_tabs});
-     my $tab_idx = -1;
-     foreach my $tab ( @tabs ) {
-         $count++;
-         $tab_idx++;
-
-         my $current = $page_tabs->{current_toptab} || "";
-         my $path    = $page_tabs->{$tab}->{'path'} || "";
-         
-         $path    =~ s#(/index\.html)?(\?)?$##gi;
-         $current =~ s#(/index\.html)?(\?)?$##gi;
-         
-         $sep = $toptabs->{$tab}->{'separator'} ? 1 : 0;
-
-         my $next_tab = $tabs[$tab_idx+1];
-         if ($next_tab && $toptabs->{$next_tab}->{'pre_separator'}) {
-            $sep = 1;
-         }
-
-         $class->{a} = $path eq $current ? ' class="selected"' : undef;
-
-         my @li;
-         push @li, 'first' if $count == 1;
-         push @li, 'pre-separator' if $sep;
-         push @li, 'post-separator' if $postsep;
-         push @li, 'last' if $tab eq $tabs[-1];
-         $class->{li} = join ' ', @li;
-
-         my $href = $page_tabs->{$tab}->{'path'} || "";
-         $href = RT->Config->Get('WebPath') .'/'. $href
-            unless $path =~ /^\w+:/;
-         my $target = $page_tabs->{$tab}->{'target'} || '';
-         $target = $m->interp->apply_escapes( $target, 'h' );
-</%perl>
-    <li<% $class->{li} ? qq[ class="$class->{li}"] : ''|n %>><% $count > 1 && !$postsep && "&#183; "|n%><a href="<% $href %>"<%$class->{a}|n%><% $class->{a} ? ' name="focus"' : ''|n %><% $target? " target='$target'": '' |n %>><% $page_tabs->{$tab}->{'title'} %></a></li>
-%
-%         if ($sep) {
-    <li class="separator">&#183;&#183;&#183;</li>
-%         }
-%         $postsep = $sep;
-%     }
-% } else {
-&nbsp;
-% }
-    </div></div></div>
-  </ul>
-
-% if (($actions && %$actions) || ($subactions && %$subactions)) {
-  <ul id="actions-menu">
-    <div><div><div>
-<%perl>
- $sep       = 0;
- $postsep   = 0;
- $count     = 0;
- $class     = { };
 
- for my $type ($actions, $subactions) {
-
- if ($type && %$type) {
-     my @actions  = sort keys %{$type};
-     my $action_idx = -1;
-     foreach my $action (@actions) {
-         $count++;
-         $action_idx++;
-
-         $sep = $type->{$action}->{'separator'} ? 1 : 0;
-
-         my $next_action = $actions[$action_idx+1];
-         if ($next_action && $type->{$next_action}->{'pre_separator'}) {
-            $sep = 1;
-         }
-
-         my @li;
-         push @li, 'first' if $count == 1;
-         push @li, 'pre-separator' if $sep;
-         push @li, 'post-separator' if $postsep;
-         push @li, 'last' if $action  eq $actions[-1];
-
-         $class->{li} = join ' ', @li;
-</%perl>
-    <li<% $class->{li} ? qq[ class="$class->{li}"] : ''|n %>><% $count > 1 && !$postsep && qq[<span class="bullet">&#183; </span>]|n%>
-%         if ($type->{"$action"}->{'html'}) {
-      <% $type->{"$action"}->{'html'} | n %>
-%         } elsif ($type->{$action}->{path})  {
-      <a href="<%RT->Config->Get('WebPath')%>/<%$type->{$action}->{'path'}%>"<% $type->{$action}->{class} && ' class="'.$type->{$action}->{class}.'"' |n %><% $type->{$action}->{id} && ' id="'.$type->{$action}->{id}.'"' |n %>><%$type->{$action}->{'title'}%></a>
-%         }
-    </li>
-%         if ($sep) {
-    <li class="separator">&#183;&#183;&#183;</li>
-%         }
-%         $postsep = $sep;
-%     }
-% }
-% }
-    </div></div></div>
-  </ul>
-% }
-</div>
 </div>
 <div id="body">
 % $m->callback( %ARGS, CallbackName => 'BeforeBody' );
diff --git a/share/html/Elements/PersonalQuickbar b/share/html/Elements/PersonalQuickbar
index f815366..6e4aecd 100644
--- a/share/html/Elements/PersonalQuickbar
+++ b/share/html/Elements/PersonalQuickbar
@@ -52,9 +52,6 @@ $Prefs => '/Prefs/Other.html'
     <span class="hide"><a href="#skipnav"><&|/l&>Skip Menu</&></a> | </span>
 % if ($session{'CurrentUser'}->Name) {
     <&|/l, "<span>".$session{'CurrentUser'}->Name."</span>" &>Logged in as [_1]</&>
-%     if ( $session{'CurrentUser'}->HasRight( Right => 'ModifySelf', Object => $RT::System ) ) {
-    | <a href="<%RT->Config->Get('WebPath')%><%$Prefs%>"><&|/l&>Preferences</&></a>
-%     }
 % } else {
     <&|/l&>Not logged in.</&>
 % }
diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 833ab9c..19955d8 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -65,44 +65,29 @@ my $basetopactions = {
 	B => { html => $m->scomp('/Elements/SimpleSearch') 
 		}
 	};
-my $basetabs = {     A => { title => loc('Homepage'),
-                           path => 'index.html',
-                         },
-                    Ab => { title => loc('Simple Search'),
-                        path => 'Search/Simple.html'
-                         },
-                    B => { title => loc('Tickets'),
-                        path => 'Search/Build.html'
-                      },
-                    C => { title => loc('Tools'),
-                           path => 'Tools/index.html'
-                         },
-                 };
 
-if ($session{'CurrentUser'}->HasRight( Right => 'ShowConfigTab', 
-				       Object => $RT::System )) {
-    $basetabs->{E} = { title => loc('Configuration'),
-                       path => 'Admin/',
-		     };
-}
+Menu->child( A => title => loc('Homepage'), path => 'index.html' );
+Menu->child( Ab   => title => loc('Simple Search'), path => 'Search/Simple.html' );
+Menu->child( B => title => loc('Tickets'), path => 'Search/Build.html' );
+Menu->child( C => title => loc('Tools'),   path => 'Tools/index.html' );
 
-if ($session{'CurrentUser'}->HasRight( Right => 'ModifySelf', 
-				       Object => $RT::System )) {
-    $basetabs->{K} = { title => loc('Preferences'),
-                       path => 'Prefs/Other.html'
-		     };
+if ( $session{'CurrentUser'}->HasRight( Right  => 'ShowConfigTab', Object => $RT::System )) {
+    Menu->child( E => title => loc('Configuration'), path => 'Admin/' );
 }
 
-if ($session{'CurrentUser'}->HasRight( Right => 'ShowApprovalsTab',
-                        Object => $RT::System )) {
-    $basetabs->{P} = { title => loc('Approval'),
-                        path => 'Approvals/'
-            };
+if ( $session{'CurrentUser'}->HasRight( Right  => 'ModifySelf', Object => $RT::System )) {
+    Menu->child( K    => title => loc('Preferences'), path => 'Prefs/Other.html' );
 }
 
-if (!defined $toptabs) {
-   $toptabs = $basetabs;
+if (
+     $session{'CurrentUser'}->HasRight( Right  => 'ShowApprovalsTab',
+                                        Object => $RT::System )
+   )
+{
+    Menu->child( P    => title => loc('Approval'),
+                 path => 'Approvals/' );
 }
+
 if (!defined $topactions) {
    $topactions = $basetopactions;
 }
diff --git a/share/html/NoAuth/css/web2/layout.css b/share/html/NoAuth/css/web2/layout.css
index c1f2eb3..75a7b32 100644
--- a/share/html/NoAuth/css/web2/layout.css
+++ b/share/html/NoAuth/css/web2/layout.css
@@ -68,7 +68,7 @@ div#body {
     -webkit-border-top-left-radius: 0.5em;
     -moz-border-radius-bottomleft: 0.5em;
     -webkit-border-bottom-left-radius: 0.5em;
-    margin-left: 10.5em;
+    margin-left: 1em;
     margin-top: 5.6em;
     margin-right: 0;
     margin-bottom: 0em;
@@ -217,8 +217,9 @@ div#quick-personal {
 
 div#header h1 {
  position: absolute;
- left: 7.25em;
+ left: 0.5em;
  right: 20em;
+ top: 3em;
  overflow: hidden;
  height: 1em;
  font-size: 1.4em;
diff --git a/share/html/NoAuth/css/web2/nav.css b/share/html/NoAuth/css/web2/nav.css
index eb71cdb..345d96a 100644
--- a/share/html/NoAuth/css/web2/nav.css
+++ b/share/html/NoAuth/css/web2/nav.css
@@ -45,159 +45,30 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-div#nav {
- position: absolute;
- left: 0;
- font-size: 0.9em;
- top: 3.2em;
- width: 10.5em;
- background: #fff;
- -moz-border-radius-bottomright: 0.5em;
- -webkit-border-bottom-right-radius: 0.5em;
-  border-left: 1px solid #999;  
-border-top: 1px solid #999;
-
- -moz-border-radius-topright: 0.5em;
- -webkit-border-top-right-radius: 0.5em;
- z-index: 99;
-
-
+#nav {
+    background: #fff;
 }
 
-#nav #system-menu {
-    overflow: hidden;
+#page-navigation {
+    position: absolute;
+    top: 7.8em;
+    right: 0em;
+    left: auto;
+    z-index: 9999;
 }
-
-div#nav ul {
- padding-left: 0.75em;
- margin-left: 0;
- padding-right: 0.75em;
- list-style-type: none;
-}
-
-div#nav li:first-child {
- border-top: 1px solid #ccc;
- padding-top: 0.25em;
-
+.sf-menu {
+    z-index: 9999;
+    width: 100%;
 }
 
-div#nav li {
- padding: 0.125em;
- padding-bottom: 0.25em;
- margin-bottom: 0.25em;
- border-bottom: 1px solid #ccc;
- padding-left: 0.5em;
- margin-right: 0.25em;
- margin-left: 0em;
+.sf-menu a {
+    padding-top: 0.5em;
+    padding-bottom: 0.5em;
 }
-
-div#nav li li:first-child {
-    margin-top: 0.25em;
-}
-div#nav li li {
-    margin-left: -0.5em;
-    padding-left: 0.25em;
-    margin-right: -0.5em;
-}
-
-div#nav li li:last-child {
-    margin-bottom: 0; 
-    padding-bottom: 0;
-    border: none;
-}
-
-div#nav .bullet {
- display: none;
+.sf-menu li:hover {
+    background-color: #fff;
 }
 
-div#nav .separator {
-display: none;
-}
-
-
-div#nav a, div#page-navigation a{
- text-decoration: none;
- font-weight: normal;
- color: #000;
-}
-
-div#nav a:hover, div#page-navigation a:hover {
- text-decoration: underline;
-}
-
-
-
-div#nav a.selected, div#page-navigation a.selected {
-  font-weight: bold;
-}
-
-
-div#nav a.selected:after {
-/* content: " > " */
+.sf-menu li, .sf-menu li li, .sf-menu li li li {
+    background-color: #ccc;
 }
-
-div#page-navigation {
- background: white;
- position: relative;
- width:100%;
- z-index: 10;
-
-}
-
-
-div#page-navigation ul#page-menu {
- display: block;
- position: absolute;
- left: 8em;
- font-size: 0.9em;
- top: 2.3em;
- background-color: white;
- right: 0em;
- padding-top:0.3em;
- padding-bottom:0.5em;
- border-top: 1px solid #aaa;
- overflow: auto;
-}
-
-/* ie hack */
-* html div#page-navigation ul#page-menu {
-    left: 6.5em;
-    top: 3.2em;
-    padding-left: 2em;
-    width: 88%;
-}
-
-
-div#page-navigation ul#actions-menu {
- position: absolute;
- right: 0em;
- top: 5.6em;
- margin-top: 0em;
- padding: 0.25em;
- padding-left: 0.5em;
- padding-right: 0.5em;
-
- background: #dedede;
- border-left: 1px solid #aaa;
- border-bottom: 2px solid #aaa;
- -moz-border-radius-bottomleft: 0.5em;
- -webkit-border-bottom-left-radius: 0.5em;
- -moz-border-radius-topright: 0.25em;
- -webkit-border-top-right-radius: 0.25em;
-
-
-
-}
-
-
-
-div#page-navigation ul li{
- display: inline;
-
-}
-
-
-ul.page-navigation ul.page-menu {
- float: right;
-}
-

commit 5cd9b36e48aa611c3143bbb448fbb84ed1cdfc73
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 22:56:16 2010 -0400

    Significant work toward new Tabs navigation

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 19955d8..b4e059d 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -2,10 +2,10 @@
 %#
 %# COPYRIGHT:
 %#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%# This software is CopyRight (c) 1996-2010 Best Practical Solutions, LLC
 %#                                          <jesse at bestpractical.com>
 %#
-%# (Except where explicitly superseded by other copyright notices)
+%# (Except where explicitly superseded by other copyRight notices)
 %#
 %#
 %# LICENSE:
@@ -23,13 +23,13 @@
 %# You should have received a copy of the GNU General Public License
 %# along with this program; if not, write to the Free Software
 %# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
+%# 02110-1301 or visit their web Page on the internet at
 %# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
 %#
 %#
 %# CONTRIBUTION SUBMISSION POLICY:
 %#
-%# (The following paragraph is not intended to limit the rights granted
+%# (The following paragraph is not intended to limit the Rights granted
 %# to you to modify and distribute this software under the terms of
 %# the GNU General Public License and is only of importance to you if
 %# you choose to contribute your changes and enhancements to the
@@ -38,7 +38,7 @@
 %# By intentionally submitting any modifications, corrections or
 %# derivatives to this work, or any other work intended for use with
 %# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
+%# you are the copyRight holder for those contributions and you grant
 %# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
 %# royalty-free, perpetual, license to use, copy, create derivative
 %# works based on those contributions, and sublicense and distribute
@@ -58,46 +58,539 @@
 &>
 <a name="skipnav" id="skipnav" accesskey="8"></a>
 <%INIT>
-my $action;
-my $basetopactions = {
-	A => { html => $m->scomp('/Elements/CreateTicket')	
-		},
-	B => { html => $m->scomp('/Elements/SimpleSearch') 
-		}
-	};
-
-Menu->child( A => title => loc('Homepage'), path => 'index.html' );
-Menu->child( Ab   => title => loc('Simple Search'), path => 'Search/Simple.html' );
-Menu->child( B => title => loc('Tickets'), path => 'Search/Build.html' );
-Menu->child( C => title => loc('Tools'),   path => 'Tools/index.html' );
-
-if ( $session{'CurrentUser'}->HasRight( Right  => 'ShowConfigTab', Object => $RT::System )) {
-    Menu->child( E => title => loc('Configuration'), path => 'Admin/' );
+
+my $request_path = $HTML::Mason::Commands::r->uri;
+
+my $query_string = sub {
+    my %args = @_;
+    my $u    = URI->new();
+    $u->query_form(%args);
+    return $u->query;
+};
+
+my $PREFS_NAV = RT::Interface::Web::Menu->new(
+               { title => loc('Preferences'), path => '/Prefs/Other.html' } );
+$PREFS_NAV->child( loc('Settings'), path => '/Prefs/Other.html', );
+$PREFS_NAV->child( loc('About me'), path => '/User/Prefs.html', );
+$PREFS_NAV->child( loc('Search options'),
+                   path => '/Prefs/SearchOptions.html', );
+$PREFS_NAV->child( loc('RT at a glance'), path => '/Prefs/MyRT.html', );
+$PREFS_NAV->child( 'Quick search' => title => loc('Quick search'), path => '/Prefs/Quicksearch.html' );
+
+if ( $request_path =~ qr{.*} ) {
+    Menu->child( home => title =>  loc('HomePage'), path => '/' );
+    my $tickets = Menu->child( search => title => loc('Tickets'),
+                               path => '/Search/Build.html' );
+    $tickets->child( new => title => loc('New Search') => path =>
+                     "/Search/Build.html?NewQuery=1" );
+    my $new = $tickets->child( create => title => loc('New ticket'),
+                               path => '/Ticket/Create.html' );
+
+    my $q = RT::Queues->new( $session{'CurrentUser'} );
+    $q->FindAllRows;
+    while ( my $queue = $q->Next ) {
+        next unless $queue->CurrentUserHasRight('CreateTicket');
+        $new->child( $queue->id => title => $queue->Name,
+                     path => '/Ticket/Create.html?Queue=' . $queue->id );
+    }
+
+    my $tools = Menu->child( loc('Tools'), path => '/Tools/index.html' );
+    my $dashes = $tools->child( loc('Dashboards'), path => '/Dashboards/index.html' );
+
+    $dashes->child( loc('Select'), path => "/Dashboards/index.html" );
+    my $dashboard = RT::Dashboard->new( $session{CurrentUser} );
+    if ( $dashboard->_PrivacyObjects( create => 1 ) ) {
+        $dashes->child( loc('Create') => path => "/Dashboards/Modify.html?Create=1" );
+    }
+    my $reports = $tools->child( loc('Reports'),
+                                 path => '/Tools/Reports/index.html' );
+    $reports->child( loc('Resolved by owner'),
+                     path => '/Tools/Reports/ResolvedByOwner.html', );
+    $reports->child( loc('Resolved in date range'),
+                     path => '/Tools/Reports/ResolvedByDates.html', );
+    $reports->child( loc('Created in a date range'),
+                     path => '/Tools/Reports/CreatedByDates.html', );
+
+    $tools->child( loc('My Day'), path => '/Tools/MyDay.html' );
+    if ( $session{'CurrentUser'}
+         ->HasRight( Right => 'ShowApprovalsTab', Object => $RT::System ) )
+    {
+        $tools->child( loc('Approval'), path => '/Approvals/' );
+    }
+
+    if ( $session{'CurrentUser'}
+         ->HasRight( Right => 'ShowConfigTab', Object => $RT::System ) )
+    {
+        my $admin = Menu->child( Config => title => loc('Configuration'),
+                                 path   => '/Admin/' );
+        $admin->child( loc('Users'),  path => '/Admin/Users/', );
+        $admin->child( loc('Groups'), path => '/Admin/Groups/', );
+        my $queues = $admin->child( queues => title => loc('Queues'),
+                                    path => '/Admin/Queues/', );
+        $queues->child( loc('Select'), path => "/Admin/Queues/" );
+        $queues->child( loc('Create'),
+                        path => "/Admin/Queues/Modify.html?Create=1" );
+        $admin->child( loc('Custom Fields'), path => '/Admin/CustomFields/',
+        );
+        $admin->child( loc('Rules'), path => '/admin/rules/', );
+
+        my $admin_global
+            = $admin->child( loc('Global'), path => '/Admin/Global/', );
+
+        $admin_global->child( loc('Templates'),
+                              path => '/Admin/Global/Templates.html', );
+
+#        my $workflows = $admin_global->child( loc('Workflows'), path => '/Admin/Global/Workflows/index.html', );
+#        {
+#            $workflows->child( loc('Overview')     => path => "/Admin/Global/Workflows/index.html" );
+#            $workflows->child( loc('Localization') => path => "/Admin/Global/Workflows/Localization.html" );
+#            $workflows->child( loc('Mappings')     => path => "/Admin/Global/Workflows/Mappings.html" );
+#        }
+
+        my $cfadmin = $admin_global->child( loc('Custom Fields'),
+                           path => '/Admin/Global/CustomFields/index.html', );
+        {
+            $cfadmin->child( loc('Users') => text =>
+                                 loc('Select custom fields for all users'),
+                             path => '/Admin/Global/CustomFields/Users.html'
+                           );
+
+            $cfadmin->child(
+                          loc('Groups') => text =>
+                              loc('Select custom fields for all user groups'),
+                          path => '/Admin/Global/CustomFields/Groups.html'
+            );
+
+            $cfadmin->child( loc('Queues') => text =>
+                                 loc('Select custom fields for all queues'),
+                             path => '/Admin/Global/CustomFields/Queues.html'
+                           );
+
+            $cfadmin->child(
+                    loc('Tickets') => text =>
+                        loc('Select custom fields for tickets in all queues'),
+                    path => '/Admin/Global/CustomFields/Queue-Tickets.html'
+            );
+
+            $cfadmin->child(
+                loc('Ticket Transactions') => text =>
+                    loc(
+                    'Select custom fields for transactions on tickets in all queues'
+                    ),
+                path => 'Admin/Global/CustomFields/Queue-Transactions.html'
+            );
+
+        }
+
+        $admin_global->child( loc('Group Rights'),
+                              path => '/Admin/Global/GroupRights.html', );
+        $admin_global->child( loc('User Rights'),
+                              path => '/Admin/Global/UserRights.html', );
+        $admin_global->child( loc('RT at a glance'),
+                              path => '/Admin/Global/MyRT.html', );
+        $admin_global->child( loc('System'),
+                              path => '/Admin/Global/System.html', );
+
+        my $admin_tools
+            = $admin->child( loc('Tools'), path => '/Admin/Tools/', );
+        $admin_tools->child( loc('System Configuration'),
+                             path => '/Admin/Tools/Configuration.html', );
+        $admin_tools->child( loc('Shredder'),
+                             path => '/Admin/Tools/Shredder', );
+    }
+    if ( $session{'CurrentUser'}->UserObj
+         && $session{'CurrentUser'}->HasRight( Right  => 'ModifySelf',
+                                               Object => $RT::System )
+       )
+    {
+
+        if ( $session{'CurrentUser'}
+             ->HasRight( Right => 'ModifySelf', Object => $RT::System ) )
+        {
+
+            Menu->child( 'Preferences' => menu => $PREFS_NAV, Order => 99 );
+        }
+    }
+
+}
+
+if ( $request_path =~ qr'Dashboards/(\d+)?' ) {
+    if ( my $id = ( $1 || $m->request_args->{'id'} ) ) {
+        my $obj = RT::Dashboard->new( $session{'CurrentUser'} );
+        $obj->LoadById($id);
+        if ( $obj and $obj->id ) {
+            my $tabs = PageMenu;
+            $tabs->child( loc('Basics'),
+                          path => "/Dashboards/Modify.html?id=" . $obj->id );
+            $tabs->child( loc('Content'),
+                          path => "/Dashboards/Queries.html?id=" . $obj->id );
+            $tabs->child( loc('Subscription'),
+                         path => "/Dashboards/Subscription.html?id=" . $obj->id )
+                if $obj->CurrentUserCanSubscribe;
+            $tabs->child( loc('Show'),
+                        path => "/Dashboards/" . $obj->id . "/" . $obj->Name )
+
+        }
+    }
+}
+
+if ( $request_path =~ qr'/SelfService' ) {
+
+    my $queues = RT::Queues->new( $session{'CurrentUser'} );
+    $queues->FindAllRows;
+
+    my $queue_count = 0;
+    my $queue_id    = 1;
+
+    while ( my $queue = $queues->Next ) {
+        next unless $queue->CurrentUserHasRight('CreateTicket');
+        $queue_id = $queue->id;
+        $queue_count++;
+        last if ( $queue_count > 1 );
+    }
+
+    my $TOP = Menu();
+
+    $TOP->child( loc('Open tickets'),   path => '/SelfService/', );
+    $TOP->child( loc('Closed tickets'), path => '/SelfService/Closed.html', );
+    if ( $queue_count > 1 ) {
+        $TOP->child( loc('New ticket'),
+                     path => '/SelfService/CreateTicketInQueue.html' );
+    } else {
+        $TOP->child( loc('New ticket'),
+                     path => '/SelfService/Create.html?queue=' . $queue_id );
+    }
+
+    if ( $session{'CurrentUser'}
+         ->HasRight( Right => 'ModifySelf', Object => $RT::System ) )
+    {
+        $TOP->child( loc('Preferences'), path => '/SelfService/Prefs.html' );
+    }
+
+    # XXX TODO RENDER GOTO TICKET WIDGET
+    #Menu->child( B =>  html => $m->scomp('GotoTicket'))
+}
+
+if ( $request_path =~ qr'Admin/Queues' ) {
+    if ( $session{'CurrentUser'}
+         ->HasRight( Object => $RT::System, Right => 'AdminQueue' ) )
+    {
+    }
+    if ( my $id = $m->request_args->{'id'} ) {
+        my $queue_obj = RT::Queue->new( $session{'CurrentUser'} );
+        $queue_obj->Load($id);
+
+        my $queue
+            = PageMenu->child(
+                   $queue_obj->Name => path => "/Admin/Queues/Modify.html?id="
+                       . $id );
+        $queue->child( loc('Basics'),
+                       path => "/Admin/Queues/Modify.html?id=" . $id );
+        $queue->child( loc('Watchers'),
+                       path => "/Admin/Queues/People.html?id=" . $id );
+        $queue->child( loc('Templates'),
+                       path => "/Admin/Queues/Templates.html?id=" . $id );
+
+        $queue->child( loc('Ticket Custom Fields'),
+             path => '/Admin/Queues/CustomFields.html?sub_type=RT::Ticket&id='
+                 . $id );
+
+        $queue->child( loc('Transaction Custom Fields'),
+            path =>
+                '/Admin/Queues/CustomFields.html?sub_type=RT::Ticket-RT::Transaction&id='
+                . $id );
+
+        $queue->child( loc('Group Rights'),
+                       path => "/Admin/Queues/GroupRights.html?id=" . $id );
+        $queue->child( loc('User Rights'),
+                       path => "/Admin/Queues/UserRights.html?id=" . $id );
+    }
+}
+
+if ( $request_path =~ qr'/Admin/Users' ) {
+    if ( $session{'CurrentUser'}
+         ->HasRight( Object => $RT::System, Right => 'AdminUsers' ) )
+    {
+        PageMenu->child( loc('Select'), path => "/Admin/Users/" );
+        PageMenu->child( loc('Create'),
+                         path      => "/Admin/Users/Modify.html?Create=1",
+                         separator => 1
+                       );
+    }
+    if ( my $id = $m->request_args->{'id'} ) {
+        my $obj = RT::User->new( $session{'CurrentUser'} );
+        $obj->Load($id);
+        my $tabs = PageMenu->child(
+                                 'current' => title => $obj->Name,
+                                 path => "/Admin/Users/Modify.html?id=" . $id,
+        );
+        $tabs->child( loc('Basics'),
+                      path => "/Admin/Users/Modify.html?id=" . $id );
+        $tabs->child( loc('Memberships'),
+                      path => "/Admin/Users/Memberships.html?id=" . $id );
+        $tabs->child( loc('History'),
+                      path => "/Admin/Users/History.html?id=" . $id );
+        $tabs->child( loc('RT at a glance'),
+                      path => "/Admin/Users/MyRT.html?id=" . $id );
+        if ( RT->Config->Get('GnuPG')->{'enable'} ) {
+            $tabs->child( loc('GnuPG'),
+                          path => "/Admin/Users/GnuPG.html?id=" . $id );
+        }
+    }
+
 }
 
-if ( $session{'CurrentUser'}->HasRight( Right  => 'ModifySelf', Object => $RT::System )) {
-    Menu->child( K    => title => loc('Preferences'), path => 'Prefs/Other.html' );
+if ( $request_path =~ qr'Admin/Groups' ) {
+
+    PageMenu->child( loc('Select') => path => "/Admin/Groups/" );
+    PageMenu->child(
+                loc('Create') => path => "/Admin/Groups/Modify.html?Create=1",
+                separator     => 1 );
+    if ( my $id = $m->request_args->{'id'} ) {
+        my $obj = RT::Group->new( $session{'CurrentUser'} );
+        $obj->Load($id);
+        my $tabs = PageMenu->child( $obj->Name,
+                        path => "/Admin/Groups/Modify.html?id=" . $id );
+        $tabs->child( loc('Basics') => path => "/Admin/Groups/Modify.html?id="
+                      . $obj->id );
+        $tabs->child(
+                    loc('Members') => path => "/Admin/Groups/Members.html?id="
+                        . $obj->id );
+        $tabs->child( loc('Group Rights') => path =>
+                      "/Admin/Groups/GroupRights.html?id=" . $obj->id );
+        $tabs->child(
+             loc('User Rights') => path => "/Admin/Groups/UserRights.html?id="
+                 . $obj->id );
+        $tabs->child(
+                    loc('History') => path => "/Admin/Groups/History.html?id="
+                        . $obj->id );
+    }
 }
 
-if (
-     $session{'CurrentUser'}->HasRight( Right  => 'ShowApprovalsTab',
-                                        Object => $RT::System )
-   )
-{
-    Menu->child( P    => title => loc('Approval'),
-                 path => 'Approvals/' );
+if ( $request_path =~ qr'Admin/CustomFields/' ) {
+    if ( $session{'CurrentUser'}
+         ->HasRight( Object => $RT::System, Right => 'AdminCustomField' ) )
+    {
+        PageMenu->child( loc('Select'), path => "/Admin/CustomFields/" );
+        PageMenu->child( loc('Create') => path =>
+                         "/Admin/CustomFields/Modify.html?Create=1", );
+
+    }
+    if ( my $id = $m->request_args->{'id'} ) {
+        my $obj = RT::CustomField->new( $session{'CurrentUser'} );
+        $obj->Load($id);
+        my $tabs = PageMenu->child( $obj->Name,
+                        path => "/Admin/CustomFields/Modify.html?id=" . $id );
+
+        $tabs->child(
+                loc('Basics') => path => "/Admin/CustomFields/Modify.html?id="
+                    . $id );
+        $tabs->child( loc('Group Rights') => path =>
+                      "/Admin/CustomFields/GroupRights.html?id=" . $id );
+        $tabs->child( loc('User Rights') => path =>
+                      "/Admin/CustomFields/UserRights.html?id=" . $id );
+
+        if ( $obj->LookupType =~ /^RT::Queue-/io ) {
+            $tabs->child( loc('Applies to'),
+                       path => "/Admin/CustomFields/Objects.html?id=" . $id );
+        }
+
+    }
+
 }
 
-if (!defined $topactions) {
-   $topactions = $basetopactions;
+if ( $request_path =~ qr'Admin/Rules' ) {
+    PageMenu->child( loc('Select'), path => "/Admin/Rules/" );
+    PageMenu->child( loc('Create'),
+                     path => "/Admin/Rules/Modify.html?Create=1" );
 }
-                    
-# Now let callbacks add their extra tabs
-$m->callback(
-    topactions => $topactions, 
-    toptabs    => $toptabs,
-    %ARGS
-);
+
+if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
+    my $search = Menu()->child('search');
+    my $actions = PageMenu()->child( transitions => title => loc('Actions'), sort_order => 99 );
+    if ( ( $m->request_args->{'id'} || '' ) =~ /^(\d+)$/ ) {
+        my $id  = $1;
+        my $obj = RT::Ticket->new( $session{'CurrentUser'} );
+        $obj->Load($id);
+
+        my $tabs = PageMenu()
+            ; #->child( "#" . $id => class => "currentnav",path => "/Ticket/Display.html?id=" . $id);
+
+        $tabs->child(
+                 loc('Display') => path => "/Ticket/Display.html?id=" . $id );
+
+        $tabs->child(
+                 loc('History') => path => "/Ticket/History.html?id=" . $id );
+        $tabs->child(
+                   loc('Basics') => path => "/Ticket/Modify.html?id=" . $id );
+
+        $tabs->child(
+               loc('Dates') => path => "/Ticket/ModifyDates.html?id=" . $id );
+        $tabs->child( loc('People'),
+                      path => "/Ticket/ModifyPeople.html?id=" . $id );
+        $tabs->child( loc('Links'),
+                      path => "/Ticket/ModifyLinks.html?id=" . $id );
+        $tabs->child( loc('Jumbo'),
+                      path => "/Ticket/ModifyAll.html?id=" . $id );
+
+        my %can
+            = ( ModifyTicket => $obj->CurrentUserHasRight('ModifyTicket') );
+
+        if (    $can{'ModifyTicket'}
+             or $obj->CurrentUserHasRight('ReplyToTicket') )
+        {
+            $actions->child( loc('Reply'),
+                     path => "/Ticket/Update.html?Action=Respond&id=" . $id );
+        }
+
+        if ( $can{'ModifyTicket'} ) {
+            my $current = $obj->Status;
+            my $schema  = $obj->QueueObj->lifecycle;
+            my $i       = 1;
+            foreach my $next ( $schema->transitions($current) ) {
+                my $action = $schema->transition_action( $current => $next );
+                next if $action eq 'hide';
+
+                my $url = '/Ticket/';
+                if ($action) {
+
+                    $url .= "Update.html?"
+                        . $query_string->( Action        => $action,
+                                           DefaultStatus => $next,
+                                           id            => $id
+                                         );
+                } else {
+
+                   $url .= "Display.html?" .$query_string->(Status => $next, id => $id );
+                }
+                $actions->child( loc( $schema->transition_label( $current => $next ) ) => path => $url );
+            }
+
+        }
+        if ( $obj->CurrentUserHasRight('OwnTicket') ) {
+            if ( $obj->OwnerObj->id == RT->Nobody->id ) {
+                $actions->child( loc('Take') => path =>
+                                "/Ticket/Display.html?Action=Take&id=" . $id )
+                    if (    $can{'ModifyTicket'}
+                         or $obj->CurrentUserHasRight('TakeTicket') );
+            } elsif ( $obj->OwnerObj->id != $session{'CurrentUser'}->id ) {
+                $actions->child( loc('Steal') => path =>
+                               "/Ticket/Display.html?Action=Steal&id=" . $id )
+                    if (    $can{'ModifyTicket'}
+                         or $obj->CurrentUserHasRight('StealTicket') );
+            }
+        }
+
+        if (    $can{'ModifyTicket'}
+             or $obj->CurrentUserHasRight('CommentOnTicket') )
+        {
+            $actions->child( loc('Comment') => path =>
+                             "/Ticket/Update.html?action=comment&id=" . $id );
+        }
+
+# $actions->{'_ZZ'} = { html => $m->scomp( '/Ticket/Elements/Bookmark', id => $obj->id ), };
+
+        if ( defined $session{"tickets"} ) {
+
+            # we have to update session data if we get new ItemMap
+            my $updatesession = 1
+                unless ( $session{"tickets"}->{'item_map'} );
+
+            my $item_map = $session{"tickets"}->ItemMap;
+
+            if ($updatesession) {
+                $session{"tickets"}->PrepForSerialization();
+            }
+
+            # Don't display prev links if we're on the first ticket
+            if ( $item_map->{$id}->{prev} ) {
+                $search->child(
+                       '<< ' . loc('First') => class => "nav",
+                       path => "/Ticket/Display.html?id=" . $item_map->{first}
+                );
+                $search->child( '< ' . loc('Prev') => class => "nav",
+                                path => "/Ticket/Display.html?id="
+                                    . $item_map->{$id}->{prev}
+                              );
+
+                # Don't display next links if we're on the last ticket
+                if ( $item_map->{$id}->{next} ) {
+                    $search->child( loc('next') . ' >' => class => "nav",
+                                    path => "/Ticket/Display.html?id="
+                                        . $item_map->{$id}->{next}
+                                  );
+                    $search->child(
+                        loc('Last') . ' >>' => class => "nav",
+                        path => "/Ticket/Display.html?id=" . $item_map->{last}
+                    );
+                }
+            }
+        }
+    }
+    my $args      = '';
+    my $has_query = '';
+
+    my $current_search = $session{"CurrentSearchHash"} || {};
+    my $search_id
+        = $m->request_args->{'SavedSearchId'}
+        || $search->{'SearchId'}
+        || '';
+
+    $has_query = 1
+        if ( $m->request_args->{'Query'} or $current_search->{'Query'} );
+
+    my %query_args = (
+
+        SavedSearchId => ( $search_id eq 'new' ) ? undef : $search_id,
+        Query  => $m->request_args->{'Query'}  || $current_search->{'Query'},
+        Format => $m->request_args->{'Format'} || $current_search->{'Format'},
+        OrderBy => $m->request_args->{'OrderBy'}
+            || $current_search->{'OrderBy'},
+        Order => $m->request_args->{'Order'} || $current_search->{'Order'},
+        Page  => $m->request_args->{'Page'}  || $current_search->{'Page'},
+        RowsPerPage => ( defined $m->request_args->{'RowsPerPage'}
+                           ? $m->request_args->{'RowsPerPage'}
+                           : $current_search->{'RowsPerPage'}
+                         )
+                     );
+
+    $args = "?" . $query_string->(%query_args);
+
+
+        my $current_search_menu = $search->child( current_search => title => loc('Current Search'));
+        $current_search_menu->child( edit_search => title => loc('Edit Search') => path => "/Search/Build.html" . ( ($has_query) ? $args : '' ) );
+        $current_search_menu->child( loc('Advanced') => path => "/Search/Edit.html$args" );
+    if ($has_query) {
+        if ($request_path =~ qr|^Search/Results.html|
+            &&                        #XXX TODO better abstraction
+            $session{'CurrentUser'}
+            ->HasRight( Right => 'SuperUser', Object => $RT::System )
+           )
+        {
+            my $shred_args =
+                URI->new->query_param(
+                               search          => 1,
+                               plugin          => 'Tickets',
+                               'Tickets:query' => $query_args{'Query'},
+                               'Tickets:limit' => $query_args{'RowsPerPage'}
+                );
+
+            $current_search_menu->child( 'shredder' => title => loc('Shredder'),
+                            path => 'Admin/Tools/Shredder/?' . $shred_args );
+        }
+
+        $current_search_menu->child( results => title =>
+                 loc('Show Results') => path => "/Search/Results.html$args" );
+
+        $current_search_menu->child( bulk => title =>
+                     loc('Bulk Update') => path => "/Search/Bulk.html$args" );
+
+    }
+}
+
+
+
+
 
 </%INIT>
 <%ARGS>

commit c8a9714e16d1ef42b1268735e096c54b3350b794
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Mon Oct 18 14:00:39 2010 +0900

    move menu to the upper right-hand corner

diff --git a/share/html/Elements/Logout b/share/html/Elements/Logout
index 3f5bca7..e69de29 100644
--- a/share/html/Elements/Logout
+++ b/share/html/Elements/Logout
@@ -1,65 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
- | <a href="<% RT->Config->Get('WebPath') %>/NoAuth/Logout.html<% $URL ? "?URL=". $URL : '' %>"><&|/l&>Logout</&></a>
-<%ARGS>
-$URL => undef
-</%ARGS>
-<%INIT>
-my $show = 0;
-if ( $session{'CurrentUser'}->Name
-    && ( !RT->Config->Get('WebExternalAuth')
-        || RT->Config->Get('WebFallbackToInternalAuth')
-    )
-) {
-    $show = 1;
-}
-
-$m->callback( %ARGS, URL => \$URL, show => \$show );
-
-return unless $show;
-</%INIT>
diff --git a/share/html/Elements/PageLayout b/share/html/Elements/PageLayout
index 52f0d1a..4e9c39d 100755
--- a/share/html/Elements/PageLayout
+++ b/share/html/Elements/PageLayout
@@ -55,7 +55,7 @@
 </div>
 
 % if ( $show_menu ) {
-<div id="nav"><& /Elements/Menu, menu => Menu(), id => 'app-nav' &></div>
+<div id="main-navigation"><& /Elements/Menu, menu => Menu(), id => 'app-nav' &></div>
 
 <div id="page-navigation"><& /Elements/Menu, menu => PageMenu(), id => 'page-menu', 'parent_id' => 'page' &></div>
 % }
diff --git a/share/html/Elements/PersonalQuickbar b/share/html/Elements/PersonalQuickbar
index 6e4aecd..0c6893e 100644
--- a/share/html/Elements/PersonalQuickbar
+++ b/share/html/Elements/PersonalQuickbar
@@ -51,10 +51,8 @@ $Prefs => '/Prefs/Other.html'
 <div id="quick-personal">
     <span class="hide"><a href="#skipnav"><&|/l&>Skip Menu</&></a> | </span>
 % if ($session{'CurrentUser'}->Name) {
-    <&|/l, "<span>".$session{'CurrentUser'}->Name."</span>" &>Logged in as [_1]</&>
 % } else {
     <&|/l&>Not logged in.</&>
 % }
 % $m->callback( %ARGS );
-<& Logout, %ARGS &>
 </div>
diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index b4e059d..7252b68 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -68,15 +68,6 @@ my $query_string = sub {
     return $u->query;
 };
 
-my $PREFS_NAV = RT::Interface::Web::Menu->new(
-               { title => loc('Preferences'), path => '/Prefs/Other.html' } );
-$PREFS_NAV->child( loc('Settings'), path => '/Prefs/Other.html', );
-$PREFS_NAV->child( loc('About me'), path => '/User/Prefs.html', );
-$PREFS_NAV->child( loc('Search options'),
-                   path => '/Prefs/SearchOptions.html', );
-$PREFS_NAV->child( loc('RT at a glance'), path => '/Prefs/MyRT.html', );
-$PREFS_NAV->child( 'Quick search' => title => loc('Quick search'), path => '/Prefs/Quicksearch.html' );
-
 if ( $request_path =~ qr{.*} ) {
     Menu->child( home => title =>  loc('HomePage'), path => '/' );
     my $tickets = Menu->child( search => title => loc('Tickets'),
@@ -198,22 +189,29 @@ if ( $request_path =~ qr{.*} ) {
         $admin_tools->child( loc('Shredder'),
                              path => '/Admin/Tools/Shredder', );
     }
+    my $about_me =  Menu->child( 'preferences' => title => loc("Logged in as [_1]", $session{'CurrentUser'}->Name), sort_rder => 99 );
     if ( $session{'CurrentUser'}->UserObj
          && $session{'CurrentUser'}->HasRight( Right  => 'ModifySelf',
                                                Object => $RT::System )
        )
     {
+$about_me->child( loc('Settings'), path => '/Prefs/Other.html', );
+$about_me->child( loc('About me'), path => '/User/Prefs.html', );
+$about_me->child( loc('Search options'),
+                   path => '/Prefs/SearchOptions.html', );
+$about_me->child( loc('RT at a glance'), path => '/Prefs/MyRT.html', );
+$about_me->child( 'Quick search' => title => loc('Quick search'), path => '/Prefs/Quicksearch.html' );
 
-        if ( $session{'CurrentUser'}
-             ->HasRight( Right => 'ModifySelf', Object => $RT::System ) )
-        {
 
-            Menu->child( 'Preferences' => menu => $PREFS_NAV, Order => 99 );
-        }
+if ( $session{'CurrentUser'}->Name
+    && ( !RT->Config->Get('WebExternalAuth')
+        || RT->Config->Get('WebFallbackToInternalAuth')
+    )
+) {
+  $about_me->child(logout => title => loc('Logout'),  path =>'/NoAuth/Logout.html');
     }
-
 }
-
+}
 if ( $request_path =~ qr'Dashboards/(\d+)?' ) {
     if ( my $id = ( $1 || $m->request_args->{'id'} ) ) {
         my $obj = RT::Dashboard->new( $session{'CurrentUser'} );
diff --git a/share/html/NoAuth/css/web2/layout.css b/share/html/NoAuth/css/web2/layout.css
index 75a7b32..511418e 100644
--- a/share/html/NoAuth/css/web2/layout.css
+++ b/share/html/NoAuth/css/web2/layout.css
@@ -69,7 +69,7 @@ div#body {
     -moz-border-radius-bottomleft: 0.5em;
     -webkit-border-bottom-left-radius: 0.5em;
     margin-left: 1em;
-    margin-top: 5.6em;
+    margin-top: 3em;
     margin-right: 0;
     margin-bottom: 0em;
     min-height: 10%;
@@ -219,7 +219,7 @@ div#header h1 {
  position: absolute;
  left: 0.5em;
  right: 20em;
- top: 3em;
+ top: 1.6em;
  overflow: hidden;
  height: 1em;
  font-size: 1.4em;
diff --git a/share/html/NoAuth/css/web2/nav.css b/share/html/NoAuth/css/web2/nav.css
index 345d96a..652a38e 100644
--- a/share/html/NoAuth/css/web2/nav.css
+++ b/share/html/NoAuth/css/web2/nav.css
@@ -45,19 +45,22 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-#nav {
-    background: #fff;
+#main-navigation {
+    position: absolute;
+    top: 0;
+    right: 0;
+    left: auto;
+    z-index: 9999;
 }
 
 #page-navigation {
     position: absolute;
-    top: 7.8em;
+    top: 5.5em;
     right: 0em;
     left: auto;
-    z-index: 9999;
+    z-index: 9995;
 }
 .sf-menu {
-    z-index: 9999;
     width: 100%;
 }
 
@@ -70,5 +73,5 @@
 }
 
 .sf-menu li, .sf-menu li li, .sf-menu li li li {
-    background-color: #ccc;
+    background-color: #eee;
 }

commit 2dcfb33a4d39fbedc70b87c876975403ffa48997
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Thu Nov 4 19:16:06 2010 -0400

    Add a "key" field, to track what we were added as under our parent

diff --git a/lib/RT/Interface/Web/Menu.pm b/lib/RT/Interface/Web/Menu.pm
index 151d44f..d8b55c3 100644
--- a/lib/RT/Interface/Web/Menu.pm
+++ b/lib/RT/Interface/Web/Menu.pm
@@ -58,7 +58,7 @@ use Scalar::Util qw(weaken);
 
 __PACKAGE__->mk_accessors(qw(
     title sort_order target escape_title class render_children_inline
-    raw_html
+    raw_html key
 ));
 
 =head1 NAME
@@ -216,6 +216,7 @@ sub child {
         } else {
             $child = $proto->new(
                 {   parent     => $self,
+                    key         => $key,
                     title        => $key,
                     escape_title => 1,
                     %args
diff --git a/share/html/Elements/Menu b/share/html/Elements/Menu
index e188abe..2dd99e4 100755
--- a/share/html/Elements/Menu
+++ b/share/html/Elements/Menu
@@ -47,16 +47,29 @@
 %# END BPS TAGGED BLOCK }}}
 <ul <%$id ? 'id="'.$id.'"' : '' |n%><% $toplevel? 'class="sf-menu sf-js-enabled sf-shadow"' : '' |n %>>
 % for my $child ($menu->children) {
-<li><a href="<%RT->Config->Get('WebPath')%><%$child->path%>"><%$child->title%></a>
+%   my $item_id = lc($parent_id."-".$child->key);
+%   $item_id =~ s/\s/-/g;
+<li>
+<a id="<%$item_id%>" \
+<% $child->path ? 'href="'.RT->Config->Get('WebPath').$child->path.'"' : '' |n%> \
+> \
+% if ($child->escape_title) {
+<%$child->title |n%>
+% } else {
+<%$child->title%>
+% }
+</a>
 % next unless ($child->has_children);
-<& Menu, menu => $child, toplevel => 0 &>
+<& Menu, menu => $child, toplevel => 0, parent_id => ($parent_id? $parent_id."-": '').$child->key &>
 </li>
 % }
 </ul>
 <%INIT>
+
 </%INIT>
 <%ARGS>
 $menu
 $id => undef
 $toplevel => 1
+$parent_id => ''
 </%ARGS>

commit e19515ce6b335be9ebae8625fc208f9b7fc76797
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Thu Nov 4 19:22:30 2010 -0400

    Update titles of several admin pages

diff --git a/share/html/Admin/Queues/CustomFields.html b/share/html/Admin/Queues/CustomFields.html
index addce57..8f2e1c2 100755
--- a/share/html/Admin/Queues/CustomFields.html
+++ b/share/html/Admin/Queues/CustomFields.html
@@ -63,7 +63,7 @@ my $FriendlySubTypes =
   RT::CustomField->new( $session{'CurrentUser'} )
   ->FriendlyLookupType( $Object->CustomFieldLookupType );
 
-my $title = loc( 'Edit Custom Fields for [_1]', $Object->Name );
+my $title = loc( 'Custom Fields for queue [_1]', $Object->Name );
 
 </%INIT>
 <%ARGS>
diff --git a/share/html/Admin/Queues/Modify.html b/share/html/Admin/Queues/Modify.html
index d784adb..3916508 100755
--- a/share/html/Admin/Queues/Modify.html
+++ b/share/html/Admin/Queues/Modify.html
@@ -158,7 +158,7 @@ if ($Create) {
     else {
         $QueueObj->Load($id) || $QueueObj->Load($Name) || Abort(loc("Couldn't load queue '[_1]'", $Name));
     }
-    $title = loc('Editing Configuration for queue [_1]', $QueueObj->Name);
+    $title = loc('Configuration for queue [_1]', $QueueObj->Name);
     
     $current_tab = 'Admin/Queues/Modify.html?id='.$QueueObj->id;
 }
diff --git a/share/html/Admin/Queues/People.html b/share/html/Admin/Queues/People.html
index 1647a06..773419a 100755
--- a/share/html/Admin/Queues/People.html
+++ b/share/html/Admin/Queues/People.html
@@ -45,11 +45,12 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-<& /Elements/Header, Title => loc('Modify people related to queue [_1]', $QueueObj->Name) &>
+<& /Elements/Header, Title => $title &>
+
 <& /Admin/Elements/QueueTabs, id => $id, 
     QueueObj => $QueueObj,                                                      
     current_tab => $current_tab, 
-    Title => loc('Modify people related to queue [_1]', $QueueObj->Name) &>
+    Title => $title &>
 
 <& /Elements/ListActions, actions => \@results &>
 
@@ -189,6 +190,7 @@ if ( $ARGS{'GroupString'} ) {
     $group_msg = loc("No principals selected.");
 }
 $current_tab = 'Admin/Queues/People.html?id=' . $QueueObj->id;
+my $title = loc('People related to queue [_1]', $QueueObj->Name);
 </%INIT>
 
 <%ARGS>
diff --git a/t/web/cf_access.t b/t/web/cf_access.t
index b870914..3eaf827 100644
--- a/t/web/cf_access.t
+++ b/t/web/cf_access.t
@@ -36,10 +36,10 @@ my ( $cf, $cfid, $tid );
     $m->follow_link( text => 'Queues' );
     $m->title_is(q/Admin queues/, 'admin-queues screen');
     $m->follow_link( text => 'General' );
-    $m->title_is(q/Editing Configuration for queue General/, 'admin-queue: general');
+    $m->title_is(q/Configuration for queue General/, 'admin-queue: general');
     $m->follow_link( text => 'Ticket Custom Fields' );
 
-    $m->title_is(q/Edit Custom Fields for General/, 'admin-queue: general cfid');
+    $m->title_is(q/Custom Fields for queue General/, 'admin-queue: general cfid');
     $m->form_name('EditCustomFields');
 
     # Sort by numeric IDs in names
diff --git a/t/web/cf_date.t b/t/web/cf_date.t
index d24950e..1cce18b 100644
--- a/t/web/cf_date.t
+++ b/t/web/cf_date.t
@@ -41,10 +41,10 @@ ok $queue && $queue->id, 'loaded or created queue';
     $m->follow_link( text => 'Queues' );
     $m->title_is( q/Admin queues/, 'admin-queues screen' );
     $m->follow_link( text => 'General' );
-    $m->title_is( q/Editing Configuration for queue General/,
+    $m->title_is( q/Configuration for queue General/,
         'admin-queue: general' );
     $m->follow_link( text => 'Ticket Custom Fields' );
-    $m->title_is( q/Edit Custom Fields for General/,
+    $m->title_is( q/Custom Fields for queue General/,
         'admin-queue: general cfid' );
 
     $m->form_name('EditCustomFields');
diff --git a/t/web/cf_datetime.t b/t/web/cf_datetime.t
index cc98872..82c3e3a 100644
--- a/t/web/cf_datetime.t
+++ b/t/web/cf_datetime.t
@@ -42,9 +42,9 @@ ok $queue && $queue->id, 'loaded or created queue';
     $m->follow_link( text => 'Queues' );
     $m->title_is(q/Admin queues/, 'admin-queues screen');
     $m->follow_link( text => 'General' );
-    $m->title_is(q/Editing Configuration for queue General/, 'admin-queue: general');
+    $m->title_is(q/Configuration for queue General/, 'admin-queue: general');
     $m->follow_link( text => 'Ticket Custom Fields' );
-    $m->title_is(q/Edit Custom Fields for General/, 'admin-queue: general cfid');
+    $m->title_is(q/Custom Fields for queue General/, 'admin-queue: general cfid');
 
     $m->form_name('EditCustomFields');
     $m->tick( "AddCustomField" => $cfid );
diff --git a/t/web/cf_onqueue.t b/t/web/cf_onqueue.t
index 86eaa4d..9f07c4f 100644
--- a/t/web/cf_onqueue.t
+++ b/t/web/cf_onqueue.t
@@ -47,7 +47,7 @@ diag "Edit the CF value for default queue";
     $m->follow_link( url => '/Admin/Queues/' );
     $m->title_is(q/Admin queues/, 'queues configuration screen');
     $m->follow_link( text => "1" );
-    $m->title_is(q/Editing Configuration for queue General/, 'default queue configuration screen');
+    $m->title_is(q/Configuration for queue General/, 'default queue configuration screen');
     $m->content_contains('QueueCFTest', 'CF QueueCFTest displayed on default queue' );
     $m->submit_form(
         form_number => 3,
diff --git a/t/web/cf_select_one.t b/t/web/cf_select_one.t
index 8161208..5c672bf 100644
--- a/t/web/cf_select_one.t
+++ b/t/web/cf_select_one.t
@@ -57,9 +57,9 @@ diag "apply the CF to General queue";
     $m->follow_link( text => 'Queues' );
     $m->title_is(q/Admin queues/, 'admin-queues screen');
     $m->follow_link( text => 'General' );
-    $m->title_is(q/Editing Configuration for queue General/, 'admin-queue: general');
+    $m->title_is(q/Configuration for queue General/, 'admin-queue: general');
     $m->follow_link( text => 'Ticket Custom Fields' );
-    $m->title_is(q/Edit Custom Fields for General/, 'admin-queue: general cfid');
+    $m->title_is(q/Custom Fields for queue General/, 'admin-queue: general cfid');
 
     $m->form_name('EditCustomFields');
     $m->tick( "AddCustomField" => $cfid );
diff --git a/t/web/watching-queues.t b/t/web/watching-queues.t
index 8dc536b..4d9ec6b 100644
--- a/t/web/watching-queues.t
+++ b/t/web/watching-queues.t
@@ -64,9 +64,9 @@ diag "add self as AdminCc on General" if $ENV{'TEST_VERBOSE'};
     $m->follow_link( text => 'Queues' );
     $m->title_is('Admin queues', 'queues page');
     $m->follow_link( text => 'General' );
-    $m->title_is('Editing Configuration for queue General');
+    $m->title_is('Configuration for queue General');
     $m->follow_link( text => 'Watchers' );
-    $m->title_is('Modify people related to queue General');
+    $m->title_is('People related to queue General');
 
     $m->submit_form_ok({
         form_number => 3,
@@ -77,7 +77,7 @@ diag "add self as AdminCc on General" if $ENV{'TEST_VERBOSE'};
         },
     });
 
-    $m->title_is('Modify people related to queue General', 'caught the right form! :)');
+    $m->title_is('People related to queue General', 'caught the right form! :)');
 
     $m->submit_form_ok({
         form_number => 3,
@@ -86,7 +86,7 @@ diag "add self as AdminCc on General" if $ENV{'TEST_VERBOSE'};
         },
     });
 
-    $m->title_is('Modify people related to queue General', 'caught the right form! :)');
+    $m->title_is('People related to queue General', 'caught the right form! :)');
 
     my $queue = RT::Queue->new(RT->SystemUser);
     $queue->Load('General');
@@ -119,9 +119,9 @@ diag "add self as Cc on General" if $ENV{'TEST_VERBOSE'};
     $m->follow_link( text => 'Queues' );
     $m->title_is('Admin queues', 'queues page');
     $m->follow_link( text => 'General' );
-    $m->title_is('Editing Configuration for queue General');
+    $m->title_is('Configuration for queue General');
     $m->follow_link( text => 'Watchers' );
-    $m->title_is('Modify people related to queue General');
+    $m->title_is('People related to queue General');
 
     $m->submit_form_ok({
         form_number => 3,
@@ -132,7 +132,7 @@ diag "add self as Cc on General" if $ENV{'TEST_VERBOSE'};
         },
     });
 
-    $m->title_is('Modify people related to queue General', 'caught the right form! :)');
+    $m->title_is('People related to queue General', 'caught the right form! :)');
 
     $m->submit_form_ok({
         form_number => 3,
@@ -141,7 +141,7 @@ diag "add self as Cc on General" if $ENV{'TEST_VERBOSE'};
         },
     });
 
-    $m->title_is('Modify people related to queue General', 'caught the right form! :)');
+    $m->title_is('People related to queue General', 'caught the right form! :)');
 
     my $queue = RT::Queue->new(RT->SystemUser);
     $queue->Load('General');
@@ -174,9 +174,9 @@ diag "add self as AdminCc on Fancypants" if $ENV{'TEST_VERBOSE'};
     $m->follow_link( text => 'Queues' );
     $m->title_is('Admin queues', 'queues page');
     $m->follow_link( text => 'Fancypants' );
-    $m->title_is('Editing Configuration for queue Fancypants');
+    $m->title_is('Configuration for queue Fancypants');
     $m->follow_link( text => 'Watchers' );
-    $m->title_is('Modify people related to queue Fancypants');
+    $m->title_is('People related to queue Fancypants');
 
     $m->submit_form_ok({
         form_number => 3,
@@ -187,7 +187,7 @@ diag "add self as AdminCc on Fancypants" if $ENV{'TEST_VERBOSE'};
         },
     });
 
-    $m->title_is('Modify people related to queue Fancypants', 'caught the right form! :)');
+    $m->title_is('People related to queue Fancypants', 'caught the right form! :)');
 
     $m->submit_form_ok({
         form_number => 3,
@@ -196,7 +196,7 @@ diag "add self as AdminCc on Fancypants" if $ENV{'TEST_VERBOSE'};
         },
     });
 
-    $m->title_is('Modify people related to queue Fancypants', 'caught the right form! :)');
+    $m->title_is('People related to queue Fancypants', 'caught the right form! :)');
 
     ok($other_queue->IsWatcher(Type => 'AdminCc', PrincipalId => $user->PrincipalId), 'added root as AdminCc on Fancypants');
 }
@@ -231,9 +231,9 @@ diag "add group as Cc on Loopy" if $ENV{'TEST_VERBOSE'};
     $m->follow_link( text => 'Queues' );
     $m->title_is('Admin queues', 'queues page');
     $m->follow_link( text => 'Loopy' );
-    $m->title_is('Editing Configuration for queue Loopy');
+    $m->title_is('Configuration for queue Loopy');
     $m->follow_link( text => 'Watchers' );
-    $m->title_is('Modify people related to queue Loopy');
+    $m->title_is('People related to queue Loopy');
 
     $m->submit_form_ok({
         form_number => 3,
@@ -244,7 +244,7 @@ diag "add group as Cc on Loopy" if $ENV{'TEST_VERBOSE'};
         },
     });
 
-    $m->title_is('Modify people related to queue Loopy', 'caught the right form! :)');
+    $m->title_is('People related to queue Loopy', 'caught the right form! :)');
 
     $m->submit_form_ok({
         form_number => 3,
@@ -253,7 +253,7 @@ diag "add group as Cc on Loopy" if $ENV{'TEST_VERBOSE'};
         },
     });
 
-    $m->title_is('Modify people related to queue Loopy', 'caught the right form! :)');
+    $m->title_is('People related to queue Loopy', 'caught the right form! :)');
 
     ok($loopy_queue->IsWatcher(Type => 'Cc', PrincipalId => $group->PrincipalId), 'added Groupies as Cc on Loopy');
 }
@@ -294,9 +294,9 @@ diag "add other group as AdminCc on Loopy" if $ENV{'TEST_VERBOSE'};
     $m->follow_link( text => 'Queues' );
     $m->title_is('Admin queues', 'queues page');
     $m->follow_link( text => 'Loopy' );
-    $m->title_is('Editing Configuration for queue Loopy');
+    $m->title_is('Configuration for queue Loopy');
     $m->follow_link( text => 'Watchers' );
-    $m->title_is('Modify people related to queue Loopy');
+    $m->title_is('People related to queue Loopy');
 
     $m->submit_form_ok({
         form_number => 3,
@@ -307,7 +307,7 @@ diag "add other group as AdminCc on Loopy" if $ENV{'TEST_VERBOSE'};
         },
     });
 
-    $m->title_is('Modify people related to queue Loopy', 'caught the right form! :)');
+    $m->title_is('People related to queue Loopy', 'caught the right form! :)');
 
     $m->submit_form_ok({
         form_number => 3,
@@ -316,7 +316,7 @@ diag "add other group as AdminCc on Loopy" if $ENV{'TEST_VERBOSE'};
         },
     });
 
-    $m->title_is('Modify people related to queue Loopy', 'caught the right form! :)');
+    $m->title_is('People related to queue Loopy', 'caught the right form! :)');
 
     ok($loopy_queue->IsWatcher(Type => 'AdminCc', PrincipalId => $outer_group->PrincipalId), 'added Groupies 2.0 as AdminCc on Loopy');
 }

commit 6f3d90e578d1d8cea1f9d21d0bfbca368e6c7a48
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Thu Nov 4 19:24:46 2010 -0400

    Move closing </div> from PageLayout into Header, which opened it

diff --git a/share/html/Elements/Header b/share/html/Elements/Header
index fa7d9e0..a6f6e39 100755
--- a/share/html/Elements/Header
+++ b/share/html/Elements/Header
@@ -87,6 +87,7 @@
 
 <div id="quickbar">
   <& /Elements/PersonalQuickbar, %ARGS &>
+</div>
 % }
 
 <%INIT>
diff --git a/share/html/Elements/PageLayout b/share/html/Elements/PageLayout
index 4e9c39d..90c3e5e 100755
--- a/share/html/Elements/PageLayout
+++ b/share/html/Elements/PageLayout
@@ -51,9 +51,6 @@
 % }
 </div>
 
-%# End of div#quickbar from /Elements/Header
-</div>
-
 % if ( $show_menu ) {
 <div id="main-navigation"><& /Elements/Menu, menu => Menu(), id => 'app-nav' &></div>
 

commit a7a608db2058b6ba44be7a22f732e8c858623a3c
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Fri Nov 5 02:41:15 2010 -0400

    Add names and ids to forms, and use them in tests

diff --git a/share/html/Admin/CustomFields/GroupRights.html b/share/html/Admin/CustomFields/GroupRights.html
index 4295e70..db4ae39 100644
--- a/share/html/Admin/CustomFields/GroupRights.html
+++ b/share/html/Admin/CustomFields/GroupRights.html
@@ -53,7 +53,7 @@
 &>
 <& /Elements/ListActions, actions => \@results &>
 
-  <form method="post" action="GroupRights.html">
+  <form method="post" action="GroupRights.html" id="ModifyGroupRights" name="ModifyGroupRights">
     <input type="hidden" class="hidden" name="id" value="<% $CustomFieldObj->id %>" />
 
     <& /Admin/Elements/EditRights, Context => $CustomFieldObj, Principals => \@principals &>
diff --git a/share/html/Admin/CustomFields/Modify.html b/share/html/Admin/CustomFields/Modify.html
index 51f162b..278ef7b 100644
--- a/share/html/Admin/CustomFields/Modify.html
+++ b/share/html/Admin/CustomFields/Modify.html
@@ -53,7 +53,7 @@
 <& /Elements/ListActions, actions => \@results &>
 
 
-<form method="post" action="Modify.html" name="ModifyCustomField">
+<form method="post" action="Modify.html" name="ModifyCustomField" id="ModifyCustomField">
 <input type="hidden" class="hidden" name="id" value="<% $id %>" />
 
 <table>
diff --git a/share/html/Admin/CustomFields/UserRights.html b/share/html/Admin/CustomFields/UserRights.html
index a4bbd80..238fc4a 100644
--- a/share/html/Admin/CustomFields/UserRights.html
+++ b/share/html/Admin/CustomFields/UserRights.html
@@ -51,7 +51,7 @@ current_tab => "Admin/CustomFields/UserRights.html?id=".$id,
 Title => $title, &>
 <& /Elements/ListActions, actions => \@results &>
 
-  <form method="post" action="UserRights.html">
+  <form method="post" action="UserRights.html" name="ModifyUserRights" id="ModifyUserRights">
     <input type="hidden" class="hidden" name="id" value="<% $CustomFieldObj->id %>" />
     <& /Admin/Elements/EditRights, Context => $CustomFieldObj, Principals => \@principals &>
     <& /Elements/Submit, Caption => loc("Be sure to save your changes"), Reset => 1 &>
diff --git a/share/html/Admin/Elements/EditScrip b/share/html/Admin/Elements/EditScrip
index aa0861a..3141541 100755
--- a/share/html/Admin/Elements/EditScrip
+++ b/share/html/Admin/Elements/EditScrip
@@ -47,7 +47,7 @@
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/ListActions, actions => \@actions &>
   
-<form method="post" action="Scrip.html">
+<form method="post" action="Scrip.html" id="ModifyScrip" name="ModifyScrip">
 <input type="hidden" class="hidden" name="id" value="<% $id %>" />
 <input type="hidden" class="hidden" name="Queue" value="<% $Queue %>" />
 
diff --git a/share/html/Admin/Global/GroupRights.html b/share/html/Admin/Global/GroupRights.html
index 09fe1e9..ca0ac62 100755
--- a/share/html/Admin/Global/GroupRights.html
+++ b/share/html/Admin/Global/GroupRights.html
@@ -51,7 +51,7 @@
     Title => loc('Modify global group rights') &>  
 <& /Elements/ListActions, actions => \@results &>
 
-<form method="post" action="GroupRights.html">
+<form method="post" action="GroupRights.html" id="ModifyGroupRights" name="ModifyGroupRights">
   <& /Admin/Elements/EditRights, Context => $RT::System, Principals => \@principals &>
   <& /Elements/Submit, Label => loc('Modify Group Rights'), Reset => 1 &>
 </form>
diff --git a/share/html/Admin/Global/Template.html b/share/html/Admin/Global/Template.html
index 86d93a7..185de19 100755
--- a/share/html/Admin/Global/Template.html
+++ b/share/html/Admin/Global/Template.html
@@ -53,7 +53,7 @@
     Title => $title &>
 <& /Elements/ListActions, actions => \@results &>
 
-<form method="post" name="ModifyTemplate" action="Template.html">
+<form method="post" name="ModifyTemplate" id="ModifyTemplate" action="Template.html">
 %if ($Create ) {
 <input type="hidden" class="hidden" name="Template" value="new" />
 % } else {
@@ -123,8 +123,8 @@ if ($TemplateObj->Id()) {
 
 </%INIT>
 <%ARGS>
-$Queue => undef
-$Template => undef
-$Create => undef
-$Name => undef
+$Queue => ''
+$Template => ''
+$Create => ''
+$Name => ''
 </%ARGS>
diff --git a/share/html/Admin/Global/UserRights.html b/share/html/Admin/Global/UserRights.html
index f92f7ae..2e9e245 100755
--- a/share/html/Admin/Global/UserRights.html
+++ b/share/html/Admin/Global/UserRights.html
@@ -51,7 +51,7 @@
     Title => loc('Modify global user rights') &>  
 <& /Elements/ListActions, actions => \@results &>
 
-<form method="post" action="UserRights.html">
+<form method="post" action="UserRights.html" name="ModifyUserRights" id="ModifyUserRights">
   <& /Admin/Elements/EditRights, Context => $RT::System, Principals => \@principals &>
   <& /Elements/Submit, Label => loc('Modify User Rights'), Reset => 1 &>
 </form>
diff --git a/share/html/Admin/Groups/GroupRights.html b/share/html/Admin/Groups/GroupRights.html
index f82c60e..268ecf2 100755
--- a/share/html/Admin/Groups/GroupRights.html
+++ b/share/html/Admin/Groups/GroupRights.html
@@ -52,7 +52,7 @@
     Title => loc('Modify group rights for group [_1]', $GroupObj->Name) &>
 <& /Elements/ListActions, actions => \@results &>
 
-  <form method="post" action="GroupRights.html">
+  <form method="post" action="GroupRights.html" id="ModifyGroupRights" name="ModifyGroupRights">
     <input type="hidden" class="hidden" name="id" value="<% $GroupObj->id %>" />
     <& /Admin/Elements/EditRights, Context => $GroupObj, Principals => \@principals &>
     <& /Elements/Submit, Label => loc('Modify Group Rights'), Reset => 1 &>
diff --git a/share/html/Admin/Groups/UserRights.html b/share/html/Admin/Groups/UserRights.html
index c7809d1..c0209c6 100755
--- a/share/html/Admin/Groups/UserRights.html
+++ b/share/html/Admin/Groups/UserRights.html
@@ -52,7 +52,7 @@
     Title => loc('Modify user rights for group [_1]', $GroupObj->Name) &>  
 <& /Elements/ListActions, actions => \@results &>
 
-  <form method="post" action="UserRights.html">
+  <form method="post" action="UserRights.html" name="ModifyUserRights" id="ModifyUserRights">
     <input type="hidden" class="hidden" name="id" value="<% $GroupObj->id %>" />
     <& /Admin/Elements/EditRights, Context => $GroupObj, Principals => \@principals &>
     <& /Elements/Submit, Label => loc('Modify User Rights'), Reset => 1 &>
diff --git a/share/html/Admin/Queues/GroupRights.html b/share/html/Admin/Queues/GroupRights.html
index e0073d0..93a9b51 100755
--- a/share/html/Admin/Queues/GroupRights.html
+++ b/share/html/Admin/Queues/GroupRights.html
@@ -52,7 +52,7 @@
     Title => loc('Modify group rights for queue [_1]', $QueueObj->Name) &>
 <& /Elements/ListActions, actions => \@results &>
 
-<form method="post" action="GroupRights.html">
+<form method="post" action="GroupRights.html" id="ModifyGroupRights" name="ModifyGroupRights">
   <input type="hidden" class="hidden" name="id" value="<% $QueueObj->id %>" />
 
 % $m->callback( %ARGS, QueueObj => $QueueObj, results => \@results, principals => \@principals );
diff --git a/share/html/Admin/Queues/Template.html b/share/html/Admin/Queues/Template.html
index c109e93..092a230 100755
--- a/share/html/Admin/Queues/Template.html
+++ b/share/html/Admin/Queues/Template.html
@@ -54,7 +54,7 @@
      Title => $title &>
 <& /Elements/ListActions, actions => \@results &>
 
-<form method="post" name="ModifyTemplate" action="Template.html">
+<form method="post" name="ModifyTemplate" id="ModifyTemplate" action="Template.html">
 %if ($Create ) {
 <input type="hidden" class="hidden" name="Template" value="new" />
 % } else {
diff --git a/share/html/Admin/Queues/UserRights.html b/share/html/Admin/Queues/UserRights.html
index 20cbd50..a27b103 100755
--- a/share/html/Admin/Queues/UserRights.html
+++ b/share/html/Admin/Queues/UserRights.html
@@ -52,7 +52,7 @@
     Title => loc('Modify user rights for queue [_1]', $QueueObj->Name) &>
 <& /Elements/ListActions, actions => \@results &>
 
-<form method="post" action="UserRights.html">
+<form method="post" action="UserRights.html" name="ModifyUserRights" id="ModifyUserRights">
   <input type="hidden" class="hidden" name="id" value="<% $QueueObj->id %>" />
 
 %# XXX TODO put this somewhere more reasonable      
diff --git a/share/html/Approvals/index.html b/share/html/Approvals/index.html
index debf9aa..a6b81c2 100755
--- a/share/html/Approvals/index.html
+++ b/share/html/Approvals/index.html
@@ -49,7 +49,7 @@
 <& /Approvals/Elements/Tabs, Title => loc("My approvals") &>
 
 <& /Elements/ListActions, actions => \@actions &>
-<form method="post">
+<form method="post" name="Approvals" id="Approvals">
 <& Elements/PendingMyApproval, %ARGS &>
 <& /Elements/Submit, Label => loc('Go!') &>
 </form>
diff --git a/share/html/Prefs/Other.html b/share/html/Prefs/Other.html
index a3cde93..d342e4d 100644
--- a/share/html/Prefs/Other.html
+++ b/share/html/Prefs/Other.html
@@ -52,7 +52,7 @@
 &>
 <& /Elements/ListActions, actions => \@results &>
 
-<form method="post" action="Other.html">
+<form method="post" action="Other.html" name="ModifyPreferences" id="ModifyPreferences">
 % foreach my $section( RT->Config->Sections ) {
 <&|/Widgets/TitleBox, title => loc( $section ) &>
 % foreach my $option( RT->Config->Options( Section => $section ) ) {
diff --git a/share/html/Search/Bulk.html b/share/html/Search/Bulk.html
index a1a6bf9..d726dcc 100755
--- a/share/html/Search/Bulk.html
+++ b/share/html/Search/Bulk.html
@@ -59,7 +59,7 @@
     &>
 
 <& /Elements/ListActions, actions => \@results &>
-<form method="post" action="<% RT->Config->Get('WebPath') %>/Search/Bulk.html" enctype="multipart/form-data">
+<form method="post" action="<% RT->Config->Get('WebPath') %>/Search/Bulk.html" enctype="multipart/form-data" name="BulkUpdate" id="BulkUpdate">
 % foreach my $var (qw(Query Format OrderBy Order Rows Page SavedChartSearchId)) {
 <input type="hidden" class="hidden" name="<%$var%>" value="<%$ARGS{$var} || ''%>" />
 %}
diff --git a/share/html/Search/Edit.html b/share/html/Search/Edit.html
index 2d3730f..fb6a1cb 100755
--- a/share/html/Search/Edit.html
+++ b/share/html/Search/Edit.html
@@ -60,7 +60,7 @@
 
 <& Elements/NewListActions, actions => \@actions &>
 
-<form method="post" action="Build.html">
+<form method="post" action="Build.html" id="BuildQueryAdvanced" name="BuildQueryAdvanced">
 <input type="hidden" class="hidden" name="SavedSearchId" value="<% $SavedSearchId %>" />
 <input type="hidden" class="hidden" name="SavedChartSearchId" value="<% $SavedChartSearchId %>" />
 <&|/Widgets/TitleBox, title => loc('Query'), &>
diff --git a/share/html/Ticket/Forward.html b/share/html/Ticket/Forward.html
index 1ad025f..6554026 100644
--- a/share/html/Ticket/Forward.html
+++ b/share/html/Ticket/Forward.html
@@ -54,7 +54,7 @@
 % $m->callback(CallbackName => 'BeforeActionList', Actions => \@results, ARGSRef => \%ARGS, Ticket => $TicketObj);
 <& /Elements/ListActions, actions => \@results &>
 
-<form action="Forward.html" name="ForwardMessage" method="post">
+<form action="Forward.html" id="ForwardMessage" name="ForwardMessage" method="post">
 % $m->callback( CallbackName => 'FormStart', ARGSRef => \%ARGS );
 <input type="hidden" class="hidden" name="id" value="<% $id %>" /><br />
 <input type="hidden" class="hidden" name="QuoteTransaction" value="<% $ARGS{'QuoteTransaction'} || '' %>" />
diff --git a/share/html/Ticket/Modify.html b/share/html/Ticket/Modify.html
index 75872ab..7f84c1b 100755
--- a/share/html/Ticket/Modify.html
+++ b/share/html/Ticket/Modify.html
@@ -53,7 +53,7 @@
 % $m->callback(CallbackName => 'BeforeActionList', Actions => \@results, ARGSRef => \%ARGS, Ticket => $TicketObj);
 
 <& /Elements/ListActions, actions => \@results &>
-<form method="post" action="Modify.html" enctype="multipart/form-data">
+<form method="post" action="Modify.html" enctype="multipart/form-data" name="TicketModify" id="TicketModify">
 % $m->callback( CallbackName => 'FormStart', ARGSRef => \%ARGS );
 <input type="hidden" class="hidden" name="id" value="<% $TicketObj->Id %>" />
 
diff --git a/t/approval/admincc.t b/t/approval/admincc.t
index 614ecc6..67bf5af 100644
--- a/t/approval/admincc.t
+++ b/t/approval/admincc.t
@@ -247,7 +247,7 @@ $m_ceo->content_contains('second approval', 'ceo: see both approvals');
 
 # now let's approve the first one via cto
 $m->submit_form(
-    form_number => 3,
+    form_name   => 'Approvals',
     fields      => { 'Approval-' . $first_approval->id . '-Action' => 'approve', },
 );
 
@@ -261,7 +261,7 @@ $m_ceo->content_lacks( 'first approval', 'ceo: first approval is gone' );
 $m_ceo->content_contains( 'second approval', 'ceo: second approval is still here' );
 
 $m_coo->submit_form(
-    form_number => 3,
+    form_name => 'Approvals',
     fields      => { 'Approval-' . $second_approval->id . '-Action' => 'approve', },
 );
 
diff --git a/t/customfields/access_via_queue.t b/t/customfields/access_via_queue.t
index e7d816e..df41a58 100644
--- a/t/customfields/access_via_queue.t
+++ b/t/customfields/access_via_queue.t
@@ -98,7 +98,7 @@ ok( RT::Test->set_rights(
 my ($baseurl, $m) = RT::Test->started_ok;
 ok $m->login( tester => 'password' ), 'logged in';
 
-diag "check that we have no the CF on the create";
+diag "check that we don't have the cf on create";
 {
     $m->submit_form(
         form_name => "CreateTicketInQueue",
@@ -118,7 +118,7 @@ diag "check that we have no the CF on the create";
     $m->content_lacks($cf_name, "don't see CF");
 
     $m->follow_link( text => 'Custom Fields' );
-    $form = $m->form_number(3);
+    $form = $m->form_name('TicketModify');
     $cf_field = "Object-RT::Ticket-$tid-CustomField-". $cf->id ."-Value";
     ok !$form->find_input( $cf_field ), 'no form field on the page';
 }
@@ -143,12 +143,12 @@ diag "check that owner can see and edit CF";
     $m->content_contains($cf_name, "see CF");
 
     $m->follow_link( text => 'Custom Fields' );
-    my $form = $m->form_number(3);
+    my $form = $m->form_name('TicketModify');
     my $cf_field = "Object-RT::Ticket-$tid-CustomField-". $cf->id ."-Value";
     ok $form->find_input( $cf_field ), 'form field on the page';
 
     $m->submit_form(
-        form_number => 3,
+        form_name => 'TicketModify',
         fields => {
             $cf_field => "changed cf",
         },
diff --git a/t/customfields/ip.t b/t/customfields/ip.t
index 0078082..a7616d6 100644
--- a/t/customfields/ip.t
+++ b/t/customfields/ip.t
@@ -82,7 +82,7 @@ diag "create a ticket and edit IP field using Edit page"
 
     $agent->follow_link_ok( { text => 'Basics', n => "1" },
         "Followed 'Basics' link" );
-    $agent->form_number(3);
+    $agent->form_name('TicketModify');
 
     is( $agent->value($cf_field), '', 'IP is empty' );
     $agent->field( $cf_field => $val );
@@ -99,7 +99,7 @@ diag "create a ticket and edit IP field using Edit page"
     $val = "  172.16.0.2  \n  ";
     $agent->follow_link_ok( { text => 'Basics', n => "1" },
         "Followed 'Basics' link" );
-    $agent->form_number(3);
+    $agent->form_name('TicketModify');
     is( $agent->value($cf_field), '172.16.0.1', 'IP is in input box' );
     $agent->field( $cf_field => $val );
     $agent->click('SubmitTicket');
@@ -278,7 +278,7 @@ diag "test the operators in search page" if $ENV{'TEST_VERBOSE'};
 {
     $agent->get_ok( $baseurl . "/Search/Build.html?Query=Queue='General'" );
     $agent->content_contains('CF.{IP}', 'got CF.{IP}');
-    my $form = $agent->form_number(3);
+    my $form = $agent->form_name('BuildQuery');
     my $op = $form->find_input("'CF.{IP}'Op");
     ok( $op, "found 'CF.{IP}'Op" );
     is_deeply( [ $op->possible_values ], [ '=', '!=', '<', '>' ], 'op values' );
diff --git a/t/customfields/iprange.t b/t/customfields/iprange.t
index 81493fc..b8cc6ea 100644
--- a/t/customfields/iprange.t
+++ b/t/customfields/iprange.t
@@ -99,7 +99,7 @@ diag "create a ticket and edit IP field using Edit page" if $ENV{'TEST_VERBOSE'}
 
     $agent->follow_link_ok( { text => 'Basics', n => "1" },
         "Followed 'Basics' link" );
-    $agent->form_number(3);
+    $agent->form_name('TicketModify');
 
     like( $agent->value($cf_field), qr/^\s*$/, 'IP is empty' );
     $agent->field( $cf_field => $val );
@@ -116,7 +116,7 @@ diag "create a ticket and edit IP field using Edit page" if $ENV{'TEST_VERBOSE'}
     $val = "  172.16.0.2  \n  ";
     $agent->follow_link_ok( { text => 'Basics', n => "1" },
         "Followed 'Basics' link" );
-    $agent->form_number(3);
+    $agent->form_name('TicketModify');
     like( $agent->value($cf_field),
         qr/^\s*\Q172.16.0.1\E\s*$/, 'IP is in input box' );
     $agent->field( $cf_field => $val );
@@ -133,7 +133,7 @@ diag "create a ticket and edit IP field using Edit page" if $ENV{'TEST_VERBOSE'}
     $val = '172.16.0.0-172.16.0.255';
     $agent->follow_link_ok( { text => 'Basics', n => "1" },
         "Followed 'Basics' link" );
-    $agent->form_number(3);
+    $agent->form_name('TicketModify');
     like( $agent->value($cf_field),
         qr/^\s*\Q172.16.0.2\E\s*$/, 'IP is in input box' );
     $agent->field( $cf_field => $val );
@@ -150,7 +150,7 @@ diag "create a ticket and edit IP field using Edit page" if $ENV{'TEST_VERBOSE'}
     $val = '172.16/16';
     $agent->follow_link_ok( { text => 'Basics', n => "1" },
         "Followed 'Basics' link" );
-    $agent->form_number(3);
+    $agent->form_name('TicketModify');
     is( $agent->value($cf_field),
         '172.16.0.0-172.16.0.255', 'IP is in input box' );
     $agent->field( $cf_field => $val );
@@ -461,7 +461,7 @@ diag "test the operators in search page" if $ENV{'TEST_VERBOSE'};
 {
     $agent->get_ok( $baseurl . "/Search/Build.html?Query=Queue='General'" );
     $agent->content_contains('CF.{IP}', 'got CF.{IP}');
-    my $form = $agent->form_number(3);
+    my $form = $agent->form_name('BuildQuery');
     my $op = $form->find_input("'CF.{IP}'Op");
     ok( $op, "found 'CF.{IP}'Op" );
     is_deeply( [ $op->possible_values ], [ '=', '!=', '<', '>' ], 'op values' );
diff --git a/t/customfields/iprangev6.t b/t/customfields/iprangev6.t
index 63bfdc7..7c2f645 100644
--- a/t/customfields/iprangev6.t
+++ b/t/customfields/iprangev6.t
@@ -115,7 +115,7 @@ diag "create a ticket and edit IP field using Edit page" if $ENV{'TEST_VERBOSE'}
 
     $agent->follow_link_ok( { text => 'Basics', n => "1" },
         "Followed 'Basics' link" );
-    $agent->form_number(3);
+    $agent->form_name('TicketModify');
 
     is( $agent->value($cf_field), '', 'IP is empty' );
     $agent->field( $cf_field => $val );
@@ -131,7 +131,7 @@ diag "create a ticket and edit IP field using Edit page" if $ENV{'TEST_VERBOSE'}
     diag "set IP with spaces around" if $ENV{'TEST_VERBOSE'};
     $agent->follow_link_ok( { text => 'Basics', n => "1" },
         "Followed 'Basics' link" );
-    $agent->form_number(3);
+    $agent->form_name('TicketModify');
     is( $agent->value($cf_field), $val, 'IP is in input box' );
     $val = 'bbcd' . ':abcd' x 7;
     $agent->field( $cf_field => "   $val   " );
@@ -147,7 +147,7 @@ diag "create a ticket and edit IP field using Edit page" if $ENV{'TEST_VERBOSE'}
     diag "replace IP with a range" if $ENV{'TEST_VERBOSE'};
     $agent->follow_link_ok( { text => 'Basics', n => "1" },
         "Followed 'Basics' link" );
-    $agent->form_number(3);
+    $agent->form_name('TicketModify');
     is( $agent->value($cf_field), $val, 'IP is in input box' );
     $val = 'abcd' . ':0000' x 7 . '-' . 'abcd' . ':ffff' x 7;
     $agent->field( $cf_field => 'abcd::/16' );
@@ -163,7 +163,7 @@ diag "create a ticket and edit IP field using Edit page" if $ENV{'TEST_VERBOSE'}
     diag "delete range, add another range using CIDR" if $ENV{'TEST_VERBOSE'};
     $agent->follow_link_ok( { text => 'Basics', n => "1" },
         "Followed 'Basics' link" );
-    $agent->form_number(3);
+    $agent->form_name('TicketModify');
     is( $agent->value($cf_field), $val, 'IP is in input box' );
     $val = 'bb00' . ':0000' x 7 . '-' . 'bbff' . ':ffff' x 7;
     $agent->field( $cf_field => $val );
diff --git a/t/customfields/ipv6.t b/t/customfields/ipv6.t
index 8b11df5..2eb08c4 100644
--- a/t/customfields/ipv6.t
+++ b/t/customfields/ipv6.t
@@ -100,7 +100,7 @@ diag "create a ticket and edit IP field using Edit page"
 
     $agent->follow_link_ok( { text => 'Basics', n => "1" },
         "Followed 'Basics' link" );
-    $agent->form_number(3);
+    $agent->form_name('TicketModify');
 
     is( $agent->value($cf_field), '', 'IP is empty' );
     $agent->field( $cf_field => $valid{$ip} );
@@ -120,7 +120,7 @@ diag "create a ticket and edit IP field using Edit page"
 
     $agent->follow_link_ok( { text => 'Basics', n => "1" },
         "Followed 'Basics' link" );
-    $agent->form_number(3);
+    $agent->form_name('TicketModify');
     is( $agent->value($cf_field), $valid{$ip}, 'IP is in input box' );
     $agent->field( $cf_field => $new_ip );
     $agent->click('SubmitTicket');
diff --git a/t/lifecycles/basics.t b/t/lifecycles/basics.t
index b5e472e..1448d7b 100644
--- a/t/lifecycles/basics.t
+++ b/t/lifecycles/basics.t
@@ -82,7 +82,7 @@ diag "new ->(open it)-> open";
     }
 
     $m->follow_link_ok({text => 'Open It'});
-    $m->form_number(3);
+    $m->form_name('TicketUpdate');
     $m->click('SubmitTicket');
 
     is $tstatus->($tid), 'open', 'changed status';
@@ -111,7 +111,7 @@ diag "open ->(stall)-> stalled";
     }
 
     $m->follow_link_ok({text => 'Stall'});
-    $m->form_number(3);
+    $m->form_name('TicketUpdate');
     $m->click('SubmitTicket');
 
     is $tstatus->($tid), 'stalled', 'changed status';
@@ -149,7 +149,7 @@ diag "open -> deleted, only via modify";
     is $tstatus->($tid), 'open', 'ticket is open';
 
     $m->get_ok( '/Ticket/Modify.html?id='. $tid );
-    my $form = $m->form_number(3);
+    my $form = $m->form_name('TicketModify');
     ok my $input = $form->find_input('Status'), 'found status selector';
 
     my @form_values = $input->possible_values;
@@ -168,7 +168,7 @@ diag "deleted -> X via modify, only open is available";
     is $tstatus->($tid), 'deleted', 'ticket is deleted';
 
     $m->get_ok( '/Ticket/Modify.html?id='. $tid );
-    my $form = $m->form_number(3);
+    my $form = $m->form_name('TicketModify');
     ok my $input = $form->find_input('Status'), 'found status selector';
 
     my @form_values = $input->possible_values;
diff --git a/t/ticket/scrips_batch.t b/t/ticket/scrips_batch.t
index b52a26b..7866d24 100644
--- a/t/ticket/scrips_batch.t
+++ b/t/ticket/scrips_batch.t
@@ -21,7 +21,7 @@ my $sid;
     $m->follow_link_ok( { text => $queue->Name } );
     $m->follow_link_ok( { text => 'Scrips' } );
     $m->follow_link_ok( { url_regex => qr'Scrip.html\?create=1' } );
-    $m->form_number(3);
+    $m->form_name('ModifyScrip');
     $m->field('Scrip-new-Description' => 'test');
     $m->select('Scrip-new-ScripCondition' => 'On Transaction');
     $m->select('Scrip-new-ScripAction' => 'User Defined');
@@ -32,9 +32,9 @@ my $sid;
     $m->submit;
     $m->content_contains("Scrip Created");
 
-    ($sid) = ($m->content =~ /Scrip\s*#(\d+)/);
 
-    my $form = $m->form_number(3);
+    my $form = $m->form_name('ModifyScrip');
+    $sid = $form->value('id');
     is $m->value("Scrip-$sid-Description"), 'test', 'correct description';
     is value_name($form, "Scrip-$sid-ScripCondition"), 'On Transaction', 'correct condition';
     is value_name($form, "Scrip-$sid-ScripAction"), 'User Defined', 'correct action';
@@ -62,13 +62,13 @@ END
     $m->submit;
 
     $m->goto_create_ticket( $queue );
-    $m->form_number(3);
+    $m->form_name('TicketCreate');
     $m->submit;
 
     is_deeply parse_handle($tmp_fh), ['Create'], 'Create';
 
     $m->follow_link_ok( { text => 'Resolve' } );
-    $m->form_number(3);
+    $m->form_name('TicketUpdate');
     $m->field( "UpdateContent" => 'resolve it' );
     $m->click('SubmitTicket');
 
diff --git a/t/web/attachment_encoding.t b/t/web/attachment_encoding.t
index 85c5bbc..323f2bc 100644
--- a/t/web/attachment_encoding.t
+++ b/t/web/attachment_encoding.t
@@ -19,7 +19,7 @@ diag 'test without attachments' if $ENV{TEST_VERBOSE};
 {
     $m->get_ok( $baseurl . '/Ticket/Create.html?Queue=1' );
 
-    $m->form_number(3);
+    $m->form_name('TicketModify');
     $m->submit_form(
         form_number => 3,
         fields      => { Subject => '标题', Content => '测试' },
@@ -54,7 +54,7 @@ diag 'test with attachemnts' if $ENV{TEST_VERBOSE};
 
     $m->get_ok( $baseurl . '/Ticket/Create.html?Queue=1' );
 
-    $m->form_number(3);
+    $m->form_name('TicketModify');
     $m->submit_form(
         form_number => 3,
         fields => { Subject => '标题', Content => '测试', Attach => $file },
diff --git a/t/web/basic.t b/t/web/basic.t
index dafe6bf..06d05b6 100644
--- a/t/web/basic.t
+++ b/t/web/basic.t
@@ -28,7 +28,7 @@ my $url = $agent->rt_base_url;
 {
     $agent->goto_create_ticket(1);
     is ($agent->status, 200, "Loaded Create.html");
-    $agent->form_number(3);
+    $agent->form_name('TicketCreate');
     my $string = Encode::decode_utf8("I18N Web Testing æøå");
     $agent->field('Subject' => "Ticket with utf8 body");
     $agent->field('Content' => $string);
@@ -49,7 +49,7 @@ my $url = $agent->rt_base_url;
 {
     $agent->goto_create_ticket(1);
     is ($agent->status, 200, "Loaded Create.html");
-    $agent->form_number(3);
+    $agent->form_name('TicketCreate');
 
     my $string = Encode::decode_utf8("I18N Web Testing æøå");
     $agent->field('Subject' => $string);
@@ -70,7 +70,7 @@ my $url = $agent->rt_base_url;
 # Update time worked in hours
 {
     $agent->follow_link( text_regex => qr/Basics/ );
-    $agent->submit_form( form_number => 3,
+    $agent->submit_form( form_name => 'TicketModify',
         fields => { TimeWorked => 5, 'TimeWorked-TimeUnits' => "hours" }
     );
 
diff --git a/t/web/cf_access.t b/t/web/cf_access.t
index 3eaf827..b79b95a 100644
--- a/t/web/cf_access.t
+++ b/t/web/cf_access.t
@@ -115,7 +115,7 @@ diag "check that we have no the CF on the create"
 
     $m->follow_link( text => 'Custom Fields' );
     $m->content_lacks('Upload multiple images', 'has no upload image field');
-    $form = $m->form_number(3);
+    $form = $m->form_name('TicketModify');
     $upload_field = "Object-RT::Ticket-$tid-CustomField-$cfid-Upload";
     ok !$form->find_input( $upload_field ), 'no form field on the page';
 }
diff --git a/t/web/cf_date.t b/t/web/cf_date.t
index 1cce18b..4e75a24 100644
--- a/t/web/cf_date.t
+++ b/t/web/cf_date.t
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use RT::Test tests => 35;
+use RT::Test tests => 33;
 
 my ( $baseurl, $m ) = RT::Test->started_ok;
 ok $m->login, 'logged in as root';
@@ -88,7 +88,7 @@ diag 'check search build page';
 {
     $m->get_ok( $baseurl . '/Search/Build.html?Query=Queue=1' );
 
-    $m->form_number(3);
+    $m->form_name('BuildQuery');
     my ($cf_op) =
       $m->find_all_inputs( type => 'option', name_regex => qr/test cf date/ );
     is_deeply(
@@ -112,7 +112,7 @@ diag 'check search build page';
     $m->content_lacks( '2010-05-06', 'did not get the wrong ticket' );
 
     $m->get_ok( $baseurl . '/Search/Build.html?Query=Queue=1' );
-    $m->form_number(3);
+    $m->form_name('BuildQuery');
     $m->submit_form(
         fields => {
             $cf_op->name    => '<',
@@ -123,7 +123,7 @@ diag 'check search build page';
     $m->content_contains( 'Found 1 ticket', 'Found 1 ticket' );
 
     $m->get_ok( $baseurl . '/Search/Build.html?Query=Queue=1' );
-    $m->form_number(3);
+    $m->form_name('BuildQuery');
     $m->submit_form(
         fields => {
             $cf_op->name    => '>',
@@ -134,7 +134,7 @@ diag 'check search build page';
     $m->content_contains( 'Found 1 ticket', 'Found 1 ticket' );
 
     $m->get_ok( $baseurl . '/Search/Build.html?Query=Queue=1' );
-    $m->form_number(3);
+    $m->form_name('BuildQuery');
     $m->submit_form(
         fields => {
             $cf_op->name    => '=',
@@ -145,7 +145,7 @@ diag 'check search build page';
     $m->content_contains( 'Found 0 tickets', 'Found 0 tickets' );
 
     $m->get_ok( $baseurl . '/Search/Build.html?Query=Queue=1' );
-    $m->form_number(3);
+    $m->form_name('BuildQuery');
     $m->submit_form(
         fields => {
             $cf_op->name    => '<',
@@ -156,7 +156,7 @@ diag 'check search build page';
     $m->content_contains( 'Found 0 tickets', 'Found 0 tickets' );
 
     $m->get_ok( $baseurl . '/Search/Build.html?Query=Queue=1' );
-    $m->form_number(3);
+    $m->form_name('BuildQuery');
     $m->submit_form(
         fields => {
             $cf_op->name    => '>',
diff --git a/t/web/cf_datetime.t b/t/web/cf_datetime.t
index 82c3e3a..ec2b5f5 100644
--- a/t/web/cf_datetime.t
+++ b/t/web/cf_datetime.t
@@ -124,7 +124,7 @@ diag 'check search build page';
 {
     $m->get_ok( $baseurl . '/Search/Build.html?Query=Queue=1' );
 
-    $m->form_number(3);
+    $m->form_name('BuildQuery');
     my ($cf_op) =
       $m->find_all_inputs( type => 'option', name_regex => qr/test cf datetime/ );
     is_deeply(
@@ -159,7 +159,7 @@ diag 'check search build page';
     $m->login( 'shanghai', 'password', logout => 1 );
 
     $m->get_ok( $baseurl . '/Search/Build.html?Query=Queue=1' );
-    $m->form_number(3);
+    $m->form_name('BuildQuery');
     $m->submit_form(
         fields => {
             $cf_op->name    => '=',
@@ -170,7 +170,7 @@ diag 'check search build page';
     $m->content_contains( 'Found 1 ticket', 'Found 1 ticket' );
 
     $m->get_ok( $baseurl . '/Search/Build.html?Query=Queue=1' );
-    $m->form_number(3);
+    $m->form_name('BuildQuery');
     $m->submit_form(
         fields => {
             $cf_op->name    => '<',
@@ -181,7 +181,7 @@ diag 'check search build page';
     $m->content_contains( 'Found 2 ticket', 'Found 2 ticket' );
 
     $m->get_ok( $baseurl . '/Search/Build.html?Query=Queue=1' );
-    $m->form_number(3);
+    $m->form_name('BuildQuery');
     $m->submit_form(
         fields => {
             $cf_op->name    => '>',
@@ -192,7 +192,7 @@ diag 'check search build page';
     $m->content_contains( 'Found 2 tickets', 'Found 2 tickets' );
 
     $m->get_ok( $baseurl . '/Search/Build.html?Query=Queue=1' );
-    $m->form_number(3);
+    $m->form_name('BuildQuery');
     $m->submit_form(
         fields => {
             $cf_op->name    => '=',
@@ -203,7 +203,7 @@ diag 'check search build page';
     $m->content_contains( 'Found 1 ticket', 'Found 1 ticket' );
 
     $m->get_ok( $baseurl . '/Search/Build.html?Query=Queue=1' );
-    $m->form_number(3);
+    $m->form_name('BuildQuery');
     $m->submit_form(
         fields => {
             $cf_op->name    => '=',
diff --git a/t/web/cf_select_one.t b/t/web/cf_select_one.t
index 5c672bf..f4bd5d3 100644
--- a/t/web/cf_select_one.t
+++ b/t/web/cf_select_one.t
@@ -95,12 +95,12 @@ diag "check that values of the CF are case insensetive(asd vs. ASD)";
     $m->title_like(qr/Modify ticket/i, 'modify ticket');
     $m->content_contains($cf_name, 'CF on the page');
 
-    my $value = $m->form_number(3)->value("Object-RT::Ticket-$tid-CustomField-$cfid-Values");
+    my $value = $m->form_name('TicketModify')->value("Object-RT::Ticket-$tid-CustomField-$cfid-Values");
     is lc $value, 'asd', 'correct value is selected';
     $m->submit;
     $m->content_unlike(qr/\Q$cf_name\E.*?changed/mi, 'field is not changed');
 
-    $value = $m->form_number(3)->value("Object-RT::Ticket-$tid-CustomField-$cfid-Values");
+    $value = $m->form_name('TicketModify')->value("Object-RT::Ticket-$tid-CustomField-$cfid-Values");
     is lc $value, 'asd', 'the same value is still selected';
 
     my $ticket = RT::Ticket->new( RT->SystemUser );
@@ -117,14 +117,14 @@ diag "check that 0 is ok value of the CF";
     $m->title_like(qr/Modify ticket/i, 'modify ticket');
     $m->content_contains($cf_name, 'CF on the page');
 
-    my $value = $m->form_number(3)->value("Object-RT::Ticket-$tid-CustomField-$cfid-Values");
+    my $value = $m->form_name('TicketModify')->value("Object-RT::Ticket-$tid-CustomField-$cfid-Values");
     is lc $value, 'asd', 'correct value is selected';
     $m->select("Object-RT::Ticket-$tid-CustomField-$cfid-Values" => 0 );
     $m->submit;
     $m->content_like(qr/\Q$cf_name\E.*?changed/mi, 'field is changed');
     $m->content_lacks('0 is no longer a value for custom field', 'no bad message in results');
 
-    $value = $m->form_number(3)->value("Object-RT::Ticket-$tid-CustomField-$cfid-Values");
+    $value = $m->form_name('TicketModify')->value("Object-RT::Ticket-$tid-CustomField-$cfid-Values");
     is lc $value, '0', 'new value is selected';
 
     my $ticket = RT::Ticket->new( RT->SystemUser );
@@ -141,13 +141,13 @@ diag "check that we can set empty value when the current is 0";
     $m->title_like(qr/Modify ticket/i, 'modify ticket');
     $m->content_contains($cf_name, 'CF on the page');
 
-    my $value = $m->form_number(3)->value("Object-RT::Ticket-$tid-CustomField-$cfid-Values");
+    my $value = $m->form_name('TicketModify')->value("Object-RT::Ticket-$tid-CustomField-$cfid-Values");
     is lc $value, '0', 'correct value is selected';
     $m->select("Object-RT::Ticket-$tid-CustomField-$cfid-Values" => '' );
     $m->submit;
     $m->content_contains('0 is no longer a value for custom field', '0 is no longer a value');
 
-    $value = $m->form_number(3)->value("Object-RT::Ticket-$tid-CustomField-$cfid-Values");
+    $value = $m->form_name('TicketModify')->value("Object-RT::Ticket-$tid-CustomField-$cfid-Values");
     is $value, '', '(no value) is selected';
 
     my $ticket = RT::Ticket->new( RT->SystemUser );
diff --git a/t/web/crypt-gnupg.t b/t/web/crypt-gnupg.t
index 96e91a5..16f2e08 100644
--- a/t/web/crypt-gnupg.t
+++ b/t/web/crypt-gnupg.t
@@ -389,7 +389,7 @@ like($m->content, qr/$key1/, "first key shows up in preferences");
 like($m->content, qr/$key2/, "second key shows up in preferences");
 like($m->content, qr/$key1.*?$key2/s, "first key shows up before the second");
 
-$m->form_number(3);
+$m->form_name('ModifyPreferences');
 $m->select("PreferredKey" => $key2);
 $m->submit;
 
diff --git a/t/web/gnupg-select-keys-on-create.t b/t/web/gnupg-select-keys-on-create.t
index 619812b..377bc28 100644
--- a/t/web/gnupg-select-keys-on-create.t
+++ b/t/web/gnupg-select-keys-on-create.t
@@ -20,7 +20,7 @@ diag "check that signing doesn't work if there is no key";
     RT::Test->clean_caught_mails;
 
     ok $m->goto_create_ticket( $queue ), "UI -> create ticket";
-    $m->form_number(3);
+    $m->form_name('TicketCreate');
     $m->tick( Sign => 1 );
     $m->field( Requestors => 'rt-test at example.com' );
     $m->field( Content => 'Some content' );
@@ -47,7 +47,7 @@ diag "check that things don't work if there is no key";
     RT::Test->clean_caught_mails;
 
     ok $m->goto_create_ticket( $queue ), "UI -> create ticket";
-    $m->form_number(3);
+    $m->form_name('TicketCreate');
     $m->tick( Encrypt => 1 );
     $m->field( Requestors => 'rt-test at example.com' );
     $m->field( Content => 'Some content' );
@@ -61,7 +61,7 @@ diag "check that things don't work if there is no key";
         'problems with keys'
     );
 
-    my $form = $m->form_number(3);
+    my $form = $m->form_name('TicketCreate');
     ok !$form->find_input( 'UseKey-rt-test at example.com' ), 'no key selector';
 
     my @mail = RT::Test->fetch_caught_mails;
@@ -85,7 +85,7 @@ diag "check that things still doesn't work if key is not trusted";
     RT::Test->clean_caught_mails;
 
     ok $m->goto_create_ticket( $queue ), "UI -> create ticket";
-    $m->form_number(3);
+    $m->form_name('TicketCreate');
     $m->tick( Encrypt => 1 );
     $m->field( Requestors => 'rt-test at example.com' );
     $m->field( Content => 'Some content' );
@@ -99,7 +99,7 @@ diag "check that things still doesn't work if key is not trusted";
         'problems with keys'
     );
 
-    my $form = $m->form_number(3);
+    my $form = $m->form_name('TicketCreate');
     ok my $input = $form->find_input( 'UseKey-rt-test at example.com' ), 'found key selector';
     is scalar $input->possible_values, 1, 'one option';
 
@@ -134,7 +134,7 @@ diag "check that things still doesn't work if two keys are not trusted";
     RT::Test->clean_caught_mails;
 
     ok $m->goto_create_ticket( $queue ), "UI -> create ticket";
-    $m->form_number(3);
+    $m->form_name('TicketCreate');
     $m->tick( Encrypt => 1 );
     $m->field( Requestors => 'rt-test at example.com' );
     $m->field( Content => 'Some content' );
@@ -148,7 +148,7 @@ diag "check that things still doesn't work if two keys are not trusted";
         'problems with keys'
     );
 
-    my $form = $m->form_number(3);
+    my $form = $m->form_name('TicketCreate');
     ok my $input = $form->find_input( 'UseKey-rt-test at example.com' ), 'found key selector';
     is scalar $input->possible_values, 2, 'two options';
 
@@ -181,7 +181,7 @@ diag "check that we see key selector even if only one key is trusted but there a
     RT::Test->clean_caught_mails;
 
     ok $m->goto_create_ticket( $queue ), "UI -> create ticket";
-    $m->form_number(3);
+    $m->form_name('TicketCreate');
     $m->tick( Encrypt => 1 );
     $m->field( Requestors => 'rt-test at example.com' );
     $m->field( Content => 'Some content' );
@@ -195,7 +195,7 @@ diag "check that we see key selector even if only one key is trusted but there a
         'problems with keys'
     );
 
-    my $form = $m->form_number(3);
+    my $form = $m->form_name('TicketCreate');
     ok my $input = $form->find_input( 'UseKey-rt-test at example.com' ), 'found key selector';
     is scalar $input->possible_values, 2, 'two options';
 
@@ -210,7 +210,7 @@ diag "check that key selector works and we can select trusted key";
     RT::Test->clean_caught_mails;
 
     ok $m->goto_create_ticket( $queue ), "UI -> create ticket";
-    $m->form_number(3);
+    $m->form_name('TicketCreate');
     $m->tick( Encrypt => 1 );
     $m->field( Requestors => 'rt-test at example.com' );
     $m->field( Content => 'Some content' );
@@ -224,7 +224,7 @@ diag "check that key selector works and we can select trusted key";
         'problems with keys'
     );
 
-    my $form = $m->form_number(3);
+    my $form = $m->form_name('TicketCreate');
     ok my $input = $form->find_input( 'UseKey-rt-test at example.com' ), 'found key selector';
     is scalar $input->possible_values, 2, 'two options';
 
@@ -244,7 +244,7 @@ diag "check encrypting of attachments";
     RT::Test->clean_caught_mails;
 
     ok $m->goto_create_ticket( $queue ), "UI -> create ticket";
-    $m->form_number(3);
+    $m->form_name('TicketCreate');
     $m->tick( Encrypt => 1 );
     $m->field( Requestors => 'rt-test at example.com' );
     $m->field( Content => 'Some content' );
@@ -259,7 +259,7 @@ diag "check encrypting of attachments";
         'problems with keys'
     );
 
-    my $form = $m->form_number(3);
+    my $form = $m->form_name('TicketCreate');
     ok my $input = $form->find_input( 'UseKey-rt-test at example.com' ), 'found key selector';
     is scalar $input->possible_values, 2, 'two options';
 
diff --git a/t/web/gnupg-select-keys-on-update.t b/t/web/gnupg-select-keys-on-update.t
index b0f1498..2f4cdbf 100644
--- a/t/web/gnupg-select-keys-on-update.t
+++ b/t/web/gnupg-select-keys-on-update.t
@@ -33,7 +33,7 @@ diag "check that signing doesn't work if there is no key";
 
     ok $m->goto_ticket( $tid ), "UI -> ticket #$tid";
     $m->follow_link_ok( { text => 'Reply' }, 'ticket -> reply' );
-    $m->form_number(3);
+    $m->form_name('TicketUpdate');
     $m->tick( Sign => 1 );
     $m->field( UpdateCc => 'rt-test at example.com' );
     $m->field( UpdateContent => 'Some content' );
@@ -63,7 +63,7 @@ diag "check that things don't work if there is no key";
 
     ok $m->goto_ticket( $tid ), "UI -> ticket #$tid";
     $m->follow_link_ok( { text => 'Reply' }, 'ticket -> reply' );
-    $m->form_number(3);
+    $m->form_name('TicketUpdate');
     $m->tick( Encrypt => 1 );
     $m->field( UpdateCc => 'rt-test at example.com' );
     $m->field( UpdateContent => 'Some content' );
@@ -77,7 +77,7 @@ diag "check that things don't work if there is no key";
         'problems with keys'
     );
 
-    my $form = $m->form_number(3);
+    my $form = $m->form_name('TicketUpdate');
     ok !$form->find_input( 'UseKey-rt-test at example.com' ), 'no key selector';
 
     my @mail = RT::Test->fetch_caught_mails;
@@ -103,7 +103,7 @@ diag "check that things still doesn't work if key is not trusted";
 
     ok $m->goto_ticket( $tid ), "UI -> ticket #$tid";
     $m->follow_link_ok( { text => 'Reply' }, 'ticket -> reply' );
-    $m->form_number(3);
+    $m->form_name('TicketUpdate');
     $m->tick( Encrypt => 1 );
     $m->field( UpdateCc => 'rt-test at example.com' );
     $m->field( UpdateContent => 'Some content' );
@@ -117,7 +117,7 @@ diag "check that things still doesn't work if key is not trusted";
         'problems with keys'
     );
 
-    my $form = $m->form_number(3);
+    my $form = $m->form_name('TicketUpdate');
     ok my $input = $form->find_input( 'UseKey-rt-test at example.com' ), 'found key selector';
     is scalar $input->possible_values, 1, 'one option';
 
@@ -153,7 +153,7 @@ diag "check that things still doesn't work if two keys are not trusted";
 
     ok $m->goto_ticket( $tid ), "UI -> ticket #$tid";
     $m->follow_link_ok( { text => 'Reply' }, 'ticket -> reply' );
-    $m->form_number(3);
+    $m->form_name('TicketUpdate');
     $m->tick( Encrypt => 1 );
     $m->field( UpdateCc => 'rt-test at example.com' );
     $m->field( UpdateContent => 'Some content' );
@@ -167,7 +167,7 @@ diag "check that things still doesn't work if two keys are not trusted";
         'problems with keys'
     );
 
-    my $form = $m->form_number(3);
+    my $form = $m->form_name('TicketUpdate');
     ok my $input = $form->find_input( 'UseKey-rt-test at example.com' ), 'found key selector';
     is scalar $input->possible_values, 2, 'two options';
 
@@ -201,7 +201,7 @@ diag "check that we see key selector even if only one key is trusted but there a
 
     ok $m->goto_ticket( $tid ), "UI -> ticket #$tid";
     $m->follow_link_ok( { text => 'Reply' }, 'ticket -> reply' );
-    $m->form_number(3);
+    $m->form_name('TicketUpdate');
     $m->tick( Encrypt => 1 );
     $m->field( UpdateCc => 'rt-test at example.com' );
     $m->field( UpdateContent => 'Some content' );
@@ -215,7 +215,7 @@ diag "check that we see key selector even if only one key is trusted but there a
         'problems with keys'
     );
 
-    my $form = $m->form_number(3);
+    my $form = $m->form_name('TicketUpdate');
     ok my $input = $form->find_input( 'UseKey-rt-test at example.com' ), 'found key selector';
     is scalar $input->possible_values, 2, 'two options';
 
@@ -231,7 +231,7 @@ diag "check that key selector works and we can select trusted key";
 
     ok $m->goto_ticket( $tid ), "UI -> ticket #$tid";
     $m->follow_link_ok( { text => 'Reply' }, 'ticket -> reply' );
-    $m->form_number(3);
+    $m->form_name('TicketUpdate');
     $m->tick( Encrypt => 1 );
     $m->field( UpdateCc => 'rt-test at example.com' );
     $m->field( UpdateContent => 'Some content' );
@@ -245,7 +245,7 @@ diag "check that key selector works and we can select trusted key";
         'problems with keys'
     );
 
-    my $form = $m->form_number(3);
+    my $form = $m->form_name('TicketUpdate');
     ok my $input = $form->find_input( 'UseKey-rt-test at example.com' ), 'found key selector';
     is scalar $input->possible_values, 2, 'two options';
 
@@ -266,7 +266,7 @@ diag "check encrypting of attachments";
 
     ok $m->goto_ticket( $tid ), "UI -> ticket #$tid";
     $m->follow_link_ok( { text => 'Reply' }, 'ticket -> reply' );
-    $m->form_number(3);
+    $m->form_name('TicketUpdate');
     $m->tick( Encrypt => 1 );
     $m->field( UpdateCc => 'rt-test at example.com' );
     $m->field( UpdateContent => 'Some content' );
@@ -281,7 +281,7 @@ diag "check encrypting of attachments";
         'problems with keys'
     );
 
-    my $form = $m->form_number(3);
+    my $form = $m->form_name('TicketUpdate');
     ok my $input = $form->find_input( 'UseKey-rt-test at example.com' ), 'found key selector';
     is scalar $input->possible_values, 2, 'two options';
 
diff --git a/t/web/gnupg-tickyboxes.t b/t/web/gnupg-tickyboxes.t
index e798645..29f2b4e 100644
--- a/t/web/gnupg-tickyboxes.t
+++ b/t/web/gnupg-tickyboxes.t
@@ -66,7 +66,7 @@ diag "check in read-only mode that queue's props influence create/update ticket
     foreach my $variant ( @variants ) {
         set_queue_crypt_options( $queue => %$variant );
         $m->get( $m->rt_base_url . "/Ticket/Update.html?Action=Respond&id=$id" );
-        $m->form_number(3);
+        $m->form_name('TicketUpdate');
         if ( $variant->{'Encrypt'} ) {
             ok $m->value('Encrypt', 2), "encrypt tick box is checked";
         } else {
diff --git a/t/web/html_template.t b/t/web/html_template.t
index 0976847..0e2453f 100644
--- a/t/web/html_template.t
+++ b/t/web/html_template.t
@@ -22,8 +22,8 @@ diag('make Autoreply template a html one and add utf8 chars')
     $m->follow_link_ok( { text => 'Templates' },     '-> Templates' );
     $m->follow_link_ok( { text => 'Autoreply' },     '-> Autoreply' );
 
-    $m->form_number(3);
     $m->submit_form(
+        form_name => 'ModifyTemplate',
         fields => {
             Content => <<'EOF',
 Subject: AutoReply: {$Ticket->Subject}
@@ -46,9 +46,8 @@ diag('create a ticket to see the autoreply mail') if $ENV{TEST_VERBOSE};
 {
     $m->get_ok( $baseurl . '/Ticket/Create.html?Queue=1' );
 
-    $m->form_number(3);
     $m->submit_form(
-        form_number => 3,
+        form_name => 'TicketCreate',
         fields      => { Subject => '标题', Content => '测试', },
     );
     $m->content_like( qr/Ticket \d+ created/i, 'created the ticket' );
diff --git a/t/web/query_builder.t b/t/web/query_builder.t
index fec5128..79df326 100644
--- a/t/web/query_builder.t
+++ b/t/web/query_builder.t
@@ -143,7 +143,7 @@ diag "click advanced, enter 'C1 OR ( C2 AND C3 )', apply, aggregators should sta
 {
     my $response = $agent->get($url."Search/Edit.html");
     ok( $response->is_success, "Fetched /Search/Edit.html" );
-    ok($agent->form_number(3), "found the form");
+    ok($agent->form_name('BuildQueryAdvanced'), "found the form");
     $agent->field("Query", "Status = 'new' OR ( Status = 'open' AND Subject LIKE 'office' )");
     $agent->submit;
     is( getQueryFromForm,
@@ -225,7 +225,7 @@ diag "input a condition, select (several conditions), click delete";
 {
     my $response = $agent->get( $url."Search/Edit.html" );
     ok $response->is_success, "Fetched /Search/Edit.html";
-    ok $agent->form_number(3), "found the form";
+    ok $agent->form_name('BuildQueryAdvanced'), "found the form";
     $agent->field("Query", "( Status = 'new' OR Status = 'open' )");
     $agent->submit;
     is( getQueryFromForm,
diff --git a/t/web/rights.t b/t/web/rights.t
index 01b62c4..65a9e7b 100644
--- a/t/web/rights.t
+++ b/t/web/rights.t
@@ -16,7 +16,7 @@ sub get_rights {
     my $agent = shift;
     my $principal_id = shift;
     my $object = shift;
-    $agent->form_number(3);
+    $agent->form_name('ModifyGroupRights');
     my @inputs = $agent->current_form->find_input("SetRights-$principal_id-$object");
     my @rights = sort grep $_, map $_->possible_values, grep $_ && $_->value, @inputs;
     return @rights;
@@ -33,7 +33,7 @@ my ($everyone, $everyone_gid);
 diag "revoke all global rights from Everyone group";
 my @has = get_rights( $m, $everyone_gid, 'RT::System-1' );
 if ( @has ) {
-    $m->form_number(3);
+    $m->form_name('ModifyGroupRights');
     $m->untick("SetRights-$everyone_gid-RT::System-1", $_) foreach @has;
     $m->submit;
     
@@ -44,7 +44,7 @@ if ( @has ) {
 
 diag "grant SuperUser right to everyone";
 {
-    $m->form_number(3);
+    $m->form_name('ModifyGroupRights');
     $m->tick("SetRights-$everyone_gid-RT::System-1", 'SuperUser');
     $m->submit;
 
@@ -56,7 +56,7 @@ diag "grant SuperUser right to everyone";
 
 diag "revoke the right";
 {
-    $m->form_number(3);
+    $m->form_name('ModifyGroupRights');
     $m->untick("SetRights-$everyone_gid-RT::System-1", 'SuperUser');
     $m->submit;
 
@@ -69,7 +69,7 @@ diag "revoke the right";
 
 diag "return rights the group had in the beginning";
 if ( @has ) {
-    $m->form_number(3);
+    $m->form_name('ModifyGroupRights');
     $m->tick("SetRights-$everyone_gid-RT::System-1", $_) for @has;
     $m->submit;
 
diff --git a/t/web/search_bulk_update_links.t b/t/web/search_bulk_update_links.t
index 29b99e9..9307dda 100644
--- a/t/web/search_bulk_update_links.t
+++ b/t/web/search_bulk_update_links.t
@@ -41,7 +41,7 @@ $m->get_ok( $url . "/Search/Bulk.html?Query=id=$search_tickets[0]&Rows=10" );
 $m->content_contains( 'Current Links', 'has current links part' );
 $m->content_lacks( 'DeleteLink--', 'no delete link stuff' );
 $m->submit_form(
-    form_number => 3,
+    form_name => 'BulkUpdate',
     fields      => {
         'Ticket-DependsOn' => $link_tickets[0],
         'Ticket-MemberOf'  => $link_tickets[1],
@@ -77,7 +77,7 @@ $m->get_ok( $url . "/Search/Bulk.html?Query=$query&Rows=10" );
 $m->content_contains( 'Current Links', 'has current links part' );
 $m->content_lacks( 'DeleteLink--', 'no delete link stuff' );
 
-$m->form_number(3);
+$m->form_name('BulkUpdate');
 my @fields = qw/Owner AddRequestor DeleteRequestor AddCc DeleteCc AddAdminCc
 DeleteAdminCc Subject Priority Queue Status Starts_Date Told_Date Due_Date
 Resolved_Date UpdateSubject UpdateContent/;
@@ -87,7 +87,7 @@ for my $field ( @fields ) {
 
 # test DependsOn, MemberOf and RefersTo
 $m->submit_form(
-    form_number => 3,
+    form_name => 'BulkUpdate',
     fields      => {
         'Ticket-DependsOn' => $link_tickets[0],
         'Ticket-MemberOf'  => $link_tickets[1],
@@ -106,7 +106,7 @@ $m->content_contains(
     'found refers to link' );
 
 $m->submit_form(
-    form_number => 3,
+    form_name => 'BulkUpdate',
     fields      => {
         "DeleteLink--DependsOn-fsck.com-rt://$rtname/ticket/$link_tickets[0]" =>
           1,
@@ -122,7 +122,7 @@ $m->content_lacks( 'DeleteLink--', 'links are all deleted' );
 # test DependedOnBy, Members and ReferredToBy
 
 $m->submit_form(
-    form_number => 3,
+    form_name => 'BulkUpdate',
     fields      => {
         'DependsOn-Ticket' => $link_tickets[0],
         'MemberOf-Ticket'  => $link_tickets[1],
@@ -141,7 +141,7 @@ $m->content_contains(
     'found referrd to link' );
 
 $m->submit_form(
-    form_number => 3,
+    form_name => 'BulkUpdate',
     fields      => {
         "DeleteLink-fsck.com-rt://$rtname/ticket/$link_tickets[0]-DependsOn-" =>
           1,
diff --git a/t/web/ticket-create-utf8.t b/t/web/ticket-create-utf8.t
index 461ebb8..a43ee4c 100644
--- a/t/web/ticket-create-utf8.t
+++ b/t/web/ticket-create-utf8.t
@@ -32,7 +32,7 @@ ok $m->login, 'logged in';
 # create a ticket with a subject only
 foreach my $test_str ( $ru_test, $l1_test ) {
     ok $m->goto_create_ticket( $q ), "go to create ticket";
-    $m->form_number(3);
+    $m->form_name('TicketCreate');
     $m->field( Subject => $test_str );
     $m->submit;
 
@@ -49,7 +49,7 @@ foreach my $test_str ( $ru_test, $l1_test ) {
 foreach my $test_str ( $ru_test, $l1_test ) {
     foreach my $support_str ( $ru_support, $l1_support ) {
         ok $m->goto_create_ticket( $q ), "go to create ticket";
-        $m->form_number(3);
+        $m->form_name('TicketCreate');
         $m->field( Subject => $test_str );
         $m->field( Content => $support_str );
         $m->submit;
@@ -72,7 +72,7 @@ foreach my $test_str ( $ru_test, $l1_test ) {
 foreach my $test_str ( $ru_test, $l1_test ) {
     foreach my $support_str ( $ru_support, $l1_support ) {
         ok $m->goto_create_ticket( $q ), "go to create ticket";
-        $m->form_number(3);
+        $m->form_name('TicketCreate');
         $m->field( Subject => $test_str );
         $m->field( Content => $support_str );
         $m->submit;
diff --git a/t/web/ticket_forward.t b/t/web/ticket_forward.t
index 045cdf5..c187c29 100644
--- a/t/web/ticket_forward.t
+++ b/t/web/ticket_forward.t
@@ -10,9 +10,8 @@ ok $m->login, 'logged in as root';
 RT::Test->set_mail_catcher;
 $m->get_ok( $baseurl . '/Ticket/Create.html?Queue=1' );
 
-$m->form_number(3);
 $m->submit_form(
-    form_number => 3,
+    form_name   => 'TicketCreate',
     fields      => {
         Subject => 'test forward',
         Content => 'this is content',
@@ -27,7 +26,7 @@ diag "Foward Ticket" if $ENV{TEST_VERBOSE};
         'follow 1st Forward to forward ticket' );
 
     $m->submit_form(
-        form_number => 3,
+        form_name   => 'ForwardMessage',
         fields      => {
             To  => 'rt-test, rt-to at example.com',
             Cc  => 'rt-cc at example.com',
@@ -50,7 +49,7 @@ diag "Foward Transaction" if $ENV{TEST_VERBOSE};
 {
     $m->follow_link_ok( { text => 'Forward', n => 2 }, 'follow 2nd Forward' );
     $m->submit_form(
-        form_number => 3,
+        form_name   => 'ForwardMessage',
         fields      => {
             To  => 'rt-test, rt-to at example.com',
             Cc  => 'rt-cc at example.com',
diff --git a/t/web/ticket_owner.t b/t/web/ticket_owner.t
index 2e562f9..cd1def6 100644
--- a/t/web/ticket_owner.t
+++ b/t/web/ticket_owner.t
@@ -95,7 +95,7 @@ diag "user A can not change owner after create";
     my $test_cb = sub {
         my $agent = shift;
         $agent->get("/Ticket/Modify.html?id=$id");
-        my $form = $agent->form_number(3);
+        my $form = $agent->form_name('TicketModify');
         is $form->value('Owner'), $user_b->id, 'correct owner selected';
         $agent->select('Owner', RT->Nobody->id);
         $agent->submit;
@@ -130,7 +130,7 @@ diag "on reply correct owner is selected";
     $agent_a->goto_ticket( $id );
     $agent_a->follow_link_ok({text => 'Reply'}, 'Ticket -> Basics');
 
-    my $form = $agent_a->form_number(3);
+    my $form = $agent_a->form_name('TicketUpdate');
     is $form->value('Owner'), '', 'empty value selected';
     $agent_a->submit;
 
diff --git a/t/web/ticket_owner_autocomplete.t b/t/web/ticket_owner_autocomplete.t
index 6aff007..05cbcb9 100644
--- a/t/web/ticket_owner_autocomplete.t
+++ b/t/web/ticket_owner_autocomplete.t
@@ -95,7 +95,7 @@ diag "user A can not change owner after create";
     my $test_cb = sub {
         my $agent = shift;
         $agent->get("/Ticket/Modify.html?id=$id");
-        my $form = $agent->form_number(3);
+        my $form = $agent->form_name('TicketModify');
         is $form->value('Owner'), $user_b->Name, 'correct owner selected';
         $form->value('Owner', RT->Nobody->Name);
         $agent->submit;

commit bcde58f17824e71e3d16cce98f1acd266bf841d9
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Fri Nov 5 00:50:36 2010 -0400

    Use the new menu ids in tests

diff --git a/t/customfields/access_via_queue.t b/t/customfields/access_via_queue.t
index df41a58..b6a1abe 100644
--- a/t/customfields/access_via_queue.t
+++ b/t/customfields/access_via_queue.t
@@ -117,7 +117,7 @@ diag "check that we don't have the cf on create";
     ok $tid, "created a ticket succesfully";
     $m->content_lacks($cf_name, "don't see CF");
 
-    $m->follow_link( text => 'Custom Fields' );
+    $m->follow_link( id => 'page-basics');
     $form = $m->form_name('TicketModify');
     $cf_field = "Object-RT::Ticket-$tid-CustomField-". $cf->id ."-Value";
     ok !$form->find_input( $cf_field ), 'no form field on the page';
@@ -142,7 +142,7 @@ diag "check that owner can see and edit CF";
     ok $m->goto_ticket( $tid ), "opened ticket";
     $m->content_contains($cf_name, "see CF");
 
-    $m->follow_link( text => 'Custom Fields' );
+    $m->follow_link( id => 'page-basics');
     my $form = $m->form_name('TicketModify');
     my $cf_field = "Object-RT::Ticket-$tid-CustomField-". $cf->id ."-Value";
     ok $form->find_input( $cf_field ), 'form field on the page';
diff --git a/t/ticket/scrips_batch.t b/t/ticket/scrips_batch.t
index 7866d24..d4004fb 100644
--- a/t/ticket/scrips_batch.t
+++ b/t/ticket/scrips_batch.t
@@ -2,7 +2,7 @@
 use strict;
 use warnings;
 
-use RT::Test tests => '19';
+use RT::Test tests => '17';
 use_ok('RT');
 use_ok('RT::Ticket');
 
@@ -16,11 +16,9 @@ ok $m->login, 'logged in as root';
 
 my $sid;
 {
-    $m->follow_link_ok( { text => 'Configuration' } );
-    $m->follow_link_ok( { text => 'Queues' } );
+    $m->follow_link_ok( { id => 'config-queues' } );
     $m->follow_link_ok( { text => $queue->Name } );
-    $m->follow_link_ok( { text => 'Scrips' } );
-    $m->follow_link_ok( { url_regex => qr'Scrip.html\?create=1' } );
+    $m->follow_link_ok( { id => 'page-scrips-create'});
     $m->form_name('ModifyScrip');
     $m->field('Scrip-new-Description' => 'test');
     $m->select('Scrip-new-ScripCondition' => 'On Transaction');
diff --git a/t/web/cf_access.t b/t/web/cf_access.t
index b79b95a..2a183a8 100644
--- a/t/web/cf_access.t
+++ b/t/web/cf_access.t
@@ -1,7 +1,7 @@
 #!/usr/bin/perl -w
 use strict;
 
-use RT::Test tests => 26;
+use RT::Test tests => 23;
 $RT::Test::SKIP_REQUEST_WORK_AROUND = 1;
 
 my ($baseurl, $m) = RT::Test->started_ok;
@@ -13,11 +13,7 @@ ok $m->login, 'logged in';
 
 diag "Create a CF";
 {
-    $m->follow_link( text => 'Configuration' );
-    $m->title_is(q/RT Administration/, 'admin screen');
-    $m->follow_link( text => 'Custom Fields' );
-    $m->title_is(q/Select a Custom Field/, 'admin-cf screen');
-    $m->follow_link( text => 'Create' );
+    $m->follow_link( id => 'config-custom-fields-create');
     $m->submit_form(
         form_name => "ModifyCustomField",
         fields => {
@@ -33,12 +29,10 @@ diag "apply the CF to General queue";
 my ( $cf, $cfid, $tid );
 {
     $m->title_is(q/Created CustomField img/, 'admin-cf created');
-    $m->follow_link( text => 'Queues' );
-    $m->title_is(q/Admin queues/, 'admin-queues screen');
+    $m->follow_link( id => 'config-queues');
     $m->follow_link( text => 'General' );
     $m->title_is(q/Configuration for queue General/, 'admin-queue: general');
-    $m->follow_link( text => 'Ticket Custom Fields' );
-
+    $m->follow_link( id => 'page-ticket-custom-fields');
     $m->title_is(q/Custom Fields for queue General/, 'admin-queue: general cfid');
     $m->form_name('EditCustomFields');
 
@@ -113,7 +107,7 @@ diag "check that we have no the CF on the create"
     $tid = $1 if $m->content =~ /Ticket (\d+) created/i;
     ok $tid, "a ticket is created succesfully";
 
-    $m->follow_link( text => 'Custom Fields' );
+    $m->follow_link( id => 'page-basics');
     $m->content_lacks('Upload multiple images', 'has no upload image field');
     $form = $m->form_name('TicketModify');
     $upload_field = "Object-RT::Ticket-$tid-CustomField-$cfid-Upload";
@@ -156,9 +150,7 @@ diag "create a ticket with an image";
 }
 
 $m->get( $m->rt_base_url );
-$m->follow_link( text => 'Tickets' );
-$m->follow_link( text => 'New Query' );
-
+$m->follow_link( id => 'search-new');
 $m->title_is(q/Query Builder/, 'Query building');
 $m->submit_form(
     form_name => "BuildQuery",
diff --git a/t/web/cf_date.t b/t/web/cf_date.t
index 4e75a24..7a28806 100644
--- a/t/web/cf_date.t
+++ b/t/web/cf_date.t
@@ -15,11 +15,7 @@ my $cf_name = 'test cf date';
 my $cfid;
 diag "Create a CF";
 {
-    $m->follow_link( text => 'Configuration' );
-    $m->title_is( q/RT Administration/, 'admin screen' );
-    $m->follow_link( text => 'Custom Fields' );
-    $m->title_is( q/Select a Custom Field/, 'admin-cf screen' );
-    $m->follow_link( text => 'Create' );
+    $m->follow_link( id => 'config-custom-fields-create');
     $m->submit_form(
         form_name => "ModifyCustomField",
         fields    => {
@@ -38,7 +34,7 @@ my $queue = RT::Test->load_or_create_queue( Name => 'General' );
 ok $queue && $queue->id, 'loaded or created queue';
 
 {
-    $m->follow_link( text => 'Queues' );
+    $m->follow_link( id => 'config-queues-select');
     $m->title_is( q/Admin queues/, 'admin-queues screen' );
     $m->follow_link( text => 'General' );
     $m->title_is( q/Configuration for queue General/,
diff --git a/t/web/cf_datetime.t b/t/web/cf_datetime.t
index ec2b5f5..5b67579 100644
--- a/t/web/cf_datetime.t
+++ b/t/web/cf_datetime.t
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use RT::Test tests => 44;
+use RT::Test tests => 42;
 RT->Config->Set( 'Timezone' => 'EST5EDT' ); # -04:00
 
 my ($baseurl, $m) = RT::Test->started_ok;
@@ -16,11 +16,7 @@ my $cf_name = 'test cf datetime';
 my $cfid;
 diag "Create a CF";
 {
-    $m->follow_link( text => 'Configuration' );
-    $m->title_is(q/RT Administration/, 'admin screen');
-    $m->follow_link( text => 'Custom Fields' );
-    $m->title_is(q/Select a Custom Field/, 'admin-cf screen');
-    $m->follow_link( text => 'Create' );
+    $m->follow_link( id => 'config-custom-fields-create');
     $m->submit_form(
         form_name => "ModifyCustomField",
         fields => {
diff --git a/t/web/cf_onqueue.t b/t/web/cf_onqueue.t
index 9f07c4f..511606d 100644
--- a/t/web/cf_onqueue.t
+++ b/t/web/cf_onqueue.t
@@ -1,18 +1,14 @@
 #!/usr/bin/perl -w
 use strict;
 
-use RT::Test tests => 14;
+use RT::Test tests => 12;
 my ($baseurl, $m) = RT::Test->started_ok;
 
 ok $m->login, 'logged in';
 
 diag "Create a queue CF";
 {
-    $m->follow_link( text => 'Configuration' );
-    $m->title_is(q/RT Administration/, 'admin screen');
-    $m->follow_link( text => 'Custom Fields' );
-    $m->title_is(q/Select a Custom Field/, 'admin-cf screen');
-    $m->follow_link( text => 'Create' );
+    $m->follow_link( id => 'config-custom-fields-create');
     $m->submit_form(
         form_name => "ModifyCustomField",
         fields => {
diff --git a/t/web/cf_select_one.t b/t/web/cf_select_one.t
index f4bd5d3..207ffe8 100644
--- a/t/web/cf_select_one.t
+++ b/t/web/cf_select_one.t
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use RT::Test tests => 46;
+use RT::Test tests => 43;
 
 my ($baseurl, $m) = RT::Test->started_ok;
 ok $m->login, 'logged in as root';
@@ -13,11 +13,7 @@ my $cf_name = 'test select one value';
 my $cfid;
 diag "Create a CF";
 {
-    $m->follow_link( text => 'Configuration' );
-    $m->title_is(q/RT Administration/, 'admin screen');
-    $m->follow_link( text => 'Custom Fields' );
-    $m->title_is(q/Select a Custom Field/, 'admin-cf screen');
-    $m->follow_link( text => 'Create' );
+    $m->follow_link( id => 'config-custom-fields-create');
     $m->submit_form(
         form_name => "ModifyCustomField",
         fields => {
@@ -54,11 +50,10 @@ ok $queue && $queue->id, 'loaded or created queue';
 
 diag "apply the CF to General queue";
 {
-    $m->follow_link( text => 'Queues' );
-    $m->title_is(q/Admin queues/, 'admin-queues screen');
+    $m->follow_link( id => 'config-queues');
     $m->follow_link( text => 'General' );
     $m->title_is(q/Configuration for queue General/, 'admin-queue: general');
-    $m->follow_link( text => 'Ticket Custom Fields' );
+    $m->follow_link( id => 'page-ticket-custom-fields');
     $m->title_is(q/Custom Fields for queue General/, 'admin-queue: general cfid');
 
     $m->form_name('EditCustomFields');
@@ -91,7 +86,7 @@ diag "create a ticket using API with 'asd'(not 'ASD') as value of the CF";
 diag "check that values of the CF are case insensetive(asd vs. ASD)";
 {
     ok $m->goto_ticket( $tid ), "opened ticket's page";
-    $m->follow_link( text => 'Custom Fields' );
+    $m->follow_link( id => 'page-basics');
     $m->title_like(qr/Modify ticket/i, 'modify ticket');
     $m->content_contains($cf_name, 'CF on the page');
 
@@ -113,7 +108,7 @@ diag "check that values of the CF are case insensetive(asd vs. ASD)";
 diag "check that 0 is ok value of the CF";
 {
     ok $m->goto_ticket( $tid ), "opened ticket's page";
-    $m->follow_link( text => 'Custom Fields' );
+    $m->follow_link( id => 'page-basics');
     $m->title_like(qr/Modify ticket/i, 'modify ticket');
     $m->content_contains($cf_name, 'CF on the page');
 
@@ -137,7 +132,7 @@ diag "check that 0 is ok value of the CF";
 diag "check that we can set empty value when the current is 0";
 {
     ok $m->goto_ticket( $tid ), "opened ticket's page";
-    $m->follow_link( text => 'Custom Fields' );
+    $m->follow_link( id => 'page-basics');
     $m->title_like(qr/Modify ticket/i, 'modify ticket');
     $m->content_contains($cf_name, 'CF on the page');
 
diff --git a/t/web/dashboards-groups.t b/t/web/dashboards-groups.t
index 2f75eda..fef7755 100644
--- a/t/web/dashboards-groups.t
+++ b/t/web/dashboards-groups.t
@@ -1,7 +1,7 @@
 #!/usr/bin/perl -w
 use strict;
 
-use RT::Test nodata => 1, tests => 40;
+use RT::Test nodata => 1, tests => 39;
 my ($baseurl, $m) = RT::Test->started_ok;
 
 my $url = $m->rt_base_url;
@@ -53,16 +53,15 @@ ok($inner_group->HasMemberRecursively($user_obj->PrincipalId), "inner has user r
 
 ok $m->login(customer => 'customer'), "logged in";
 
-$m->get_ok("$url/Dashboards");
 
-$m->follow_link_ok({text => "New"});
+$m->follow_link_ok({ id => 'tools-dashboards-create'});
 $m->form_name('ModifyDashboard');
 is_deeply([$m->current_form->find_input('Privacy')->possible_values], ["RT::User-" . $user_obj->Id], "the only selectable privacy is user");
 $m->content_lacks('Delete', "Delete button hidden because we are creating");
 
 $user_obj->PrincipalObj->GrantRight(Right => 'CreateGroupDashboard', Object => $inner_group);
 
-$m->follow_link_ok({text => "New"});
+$m->follow_link_ok({ id => 'tools-dashboards-create'});
 $m->form_name('ModifyDashboard');
 is_deeply([$m->current_form->find_input('Privacy')->possible_values], ["RT::User-" . $user_obj->Id, "RT::Group-" . $inner_group->Id], "the only selectable privacies are user and inner group (not outer group)");
 $m->field("Name" => 'inner dashboard');
diff --git a/t/web/dashboards-permissions.t b/t/web/dashboards-permissions.t
index bce51dd..dc66d8a 100644
--- a/t/web/dashboards-permissions.t
+++ b/t/web/dashboards-permissions.t
@@ -2,7 +2,7 @@
 use strict;
 use warnings;
 
-use RT::Test nodata => 1, tests => 7;
+use RT::Test nodata => 1, tests => 6;
 my ($baseurl, $m) = RT::Test->started_ok;
 
 my $url = $m->rt_base_url;
@@ -28,9 +28,8 @@ $user_obj->PrincipalObj->GrantRight(Right => $_, Object => $RT::System)
 
 ok $m->login(customer => 'customer'), "logged in";
 
-$m->get_ok("$url/Dashboards");
 
-$m->follow_link_ok({text => "New"});
+$m->follow_link_ok( {id => 'tools-dashboards-create'});
 $m->form_name('ModifyDashboard');
 is_deeply([$m->current_form->find_input('Privacy')->possible_values], ["RT::User-" . $user_obj->Id], "the only selectable privacy is user");
 $m->content_lacks('Delete', "Delete button hidden because we are creating");
diff --git a/t/web/dashboards.t b/t/web/dashboards.t
index d50ef83..dd3de37 100644
--- a/t/web/dashboards.t
+++ b/t/web/dashboards.t
@@ -64,7 +64,7 @@ $m->content_contains("Create");
 $m->get_ok($url."Dashboards/index.html");
 $m->content_contains("New", "'New' link because we now have ModifyOwnDashboard");
 
-$m->follow_link_ok({text => "New"});
+$m->follow_link_ok({ id => 'tools-dashboards-create'});
 $m->form_name('ModifyDashboard');
 $m->field("Name" => 'different dashboard');
 $m->content_lacks('Delete', "Delete button hidden because we are creating");
@@ -141,7 +141,7 @@ $ticket->Create(
 	Subject   => 'dashboard test',
 );
 
-$m->follow_link_ok({text => 'different dashboard'});
+$m->follow_link_ok({id => 'page-show'});
 $m->content_contains("50 highest priority tickets I own");
 $m->content_contains("50 newest unowned tickets");
 $m->content_lacks("Bookmarked Tickets");
@@ -231,7 +231,7 @@ $m->click_button(value => 'Create');
 $m->content_lacks("No permission to create dashboards");
 $m->content_contains("Saved dashboard system dashboard");
 
-$m->follow_link_ok({text => 'Queries'});
+$m->follow_link_ok({id => 'page-content'});
 
 $form = $m->form_name('Dashboard-Searches-body');
 @input = $form->find_input('Searches-body-Available');
@@ -244,7 +244,7 @@ $m->content_contains("Dashboard updated");
 
 $m->content_contains("The following queries may not be visible to all users who can see this dashboard.");
 
-$m->follow_link_ok({text => 'system dashboard'});
+$m->follow_link_ok({id => 'page-show'});
 $m->content_contains("personal search", "saved search shows up");
 $m->content_contains("dashboard test", "matched ticket shows up");
 
diff --git a/t/web/html_template.t b/t/web/html_template.t
index 0e2453f..b6e9d08 100644
--- a/t/web/html_template.t
+++ b/t/web/html_template.t
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use RT::Test tests => 18;
+use RT::Test tests => 16;
 use Encode;
 my ( $baseurl, $m ) = RT::Test->started_ok;
 ok $m->login, 'logged in as root';
@@ -17,9 +17,7 @@ diag('make Autoreply template a html one and add utf8 chars')
   if $ENV{TEST_VERBOSE};
 
 {
-    $m->follow_link_ok( { text => 'Configuration' }, '-> Configuration' );
-    $m->follow_link_ok( { text => 'Global' },        '-> Global' );
-    $m->follow_link_ok( { text => 'Templates' },     '-> Templates' );
+    $m->follow_link_ok( { id => 'config-global-templates' },     '-> Templates' );
     $m->follow_link_ok( { text => 'Autoreply' },     '-> Autoreply' );
 
     $m->submit_form(
diff --git a/t/web/rights.t b/t/web/rights.t
index 65a9e7b..5c7fc2b 100644
--- a/t/web/rights.t
+++ b/t/web/rights.t
@@ -2,14 +2,12 @@
 use strict;
 use warnings;
 
-use RT::Test tests => 14;
+use RT::Test tests => 12;
 
 my ($baseurl, $m) = RT::Test->started_ok;
 ok $m->login, "logged in";
 
-$m->follow_link_ok({ text => 'Configuration' });
-$m->follow_link_ok({ text => 'Global' });
-$m->follow_link_ok({ text => 'Group Rights' });
+$m->follow_link_ok({ id => 'config-global-group-rights'});
 
 
 sub get_rights {
diff --git a/t/web/rights1.t b/t/web/rights1.t
index 55544fa..5b284d0 100644
--- a/t/web/rights1.t
+++ b/t/web/rights1.t
@@ -52,7 +52,7 @@ ok ($grantid,$grantmsg);
 $agent->reload();
 $agent->content_contains('Logout', "Reloaded page successfully");
 ok($agent->find_link( 
-		       text => 'Preferences'), "Found prefs pane" );
+		       id => 'preferences-settings' ), "Found prefs pane" );
 ($revokeid,$revokemsg) = $user_obj->PrincipalObj->RevokeRight(Right => 'ModifySelf');
 ok ($revokeid,$revokemsg);
 # Good.  Now load the search page and test Load/Save Search.
diff --git a/t/web/search_rss.t b/t/web/search_rss.t
index da68dcf..d273e36 100644
--- a/t/web/search_rss.t
+++ b/t/web/search_rss.t
@@ -22,7 +22,7 @@ $agent->form_name('BuildQuery');
 $agent->field('idOp', '>');
 $agent->field('ValueOfid', '0');
 $agent->submit('DoSearch');
-$agent->follow_link_ok({text=>'Show Results'});
+$agent->follow_link_ok({id => 'search-current_search-results'});
 
 for ( 1 .. 5 ) {
     $agent->content_contains('Ticket ' . $_);
diff --git a/t/web/ticket_forward.t b/t/web/ticket_forward.t
index c187c29..6e467b6 100644
--- a/t/web/ticket_forward.t
+++ b/t/web/ticket_forward.t
@@ -22,7 +22,7 @@ RT::Test->clean_caught_mails;
 
 diag "Foward Ticket" if $ENV{TEST_VERBOSE};
 {
-    $m->follow_link_ok( { text => 'Forward' },
+    $m->follow_link_ok( { id => 'page-transitions-forward'},
         'follow 1st Forward to forward ticket' );
 
     $m->submit_form(
diff --git a/t/web/ticket_owner_autocomplete.t b/t/web/ticket_owner_autocomplete.t
index 05cbcb9..a9df337 100644
--- a/t/web/ticket_owner_autocomplete.t
+++ b/t/web/ticket_owner_autocomplete.t
@@ -128,7 +128,7 @@ diag "on reply correct owner is selected";
     is $ticket->Owner, $user_b->id, 'correct owner';
 
     $agent_a->goto_ticket( $id );
-    $agent_a->follow_link_ok({text => 'Reply'}, 'Ticket -> Basics');
+    $agent_a->follow_link_ok( { id => 'page-transitions-reply' }, 'Reply' );
 
     my $form = $agent_a->form_number(3);
     is $form->value('Owner'), '', 'empty value selected';

commit fdd78be9958a400fe5c3275ec60004dc40290567
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Fri Nov 5 00:58:24 2010 -0400

    Add back SimpleSearch and CreateTicket

diff --git a/share/html/Elements/PageLayout b/share/html/Elements/PageLayout
index 90c3e5e..1380940 100755
--- a/share/html/Elements/PageLayout
+++ b/share/html/Elements/PageLayout
@@ -56,6 +56,7 @@
 
 <div id="page-navigation"><& /Elements/Menu, menu => PageMenu(), id => 'page-menu', 'parent_id' => 'page' &></div>
 % }
+<div id="widgets"><& /Elements/Widgets &></div>
 <script type="text/javascript">
 jQuery(document).ready(function(){ jQuery("#app-nav").superfish(); });
 jQuery(document).ready(function(){ jQuery("#page-menu").superfish(); });
diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 7252b68..9bc641a 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -72,6 +72,8 @@ if ( $request_path =~ qr{.*} ) {
     Menu->child( home => title =>  loc('HomePage'), path => '/' );
     my $tickets = Menu->child( search => title => loc('Tickets'),
                                path => '/Search/Build.html' );
+    $tickets->child( simple => title => loc('Simple Search') => path =>
+                     "/Search/Simple.html" );
     $tickets->child( new => title => loc('New Search') => path =>
                      "/Search/Build.html?NewQuery=1" );
     my $new = $tickets->child( create => title => loc('New ticket'),
diff --git a/share/html/Elements/Widgets b/share/html/Elements/Widgets
new file mode 100644
index 0000000..f87a68a
--- /dev/null
+++ b/share/html/Elements/Widgets
@@ -0,0 +1,4 @@
+<div class="widgets">
+<& /Elements/SimpleSearch &>
+<& /Elements/CreateTicket &>
+</div>

commit b42a457c45527c0f9e85d93e9a6ab27d2b977cf0
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Fri Nov 5 04:13:13 2010 -0400

    Flesh out menus more fully

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 9bc641a..194a67f 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -116,22 +116,35 @@ if ( $request_path =~ qr{.*} ) {
     {
         my $admin = Menu->child( Config => title => loc('Configuration'),
                                  path   => '/Admin/' );
-        $admin->child( loc('Users'),  path => '/Admin/Users/', );
-        $admin->child( loc('Groups'), path => '/Admin/Groups/', );
-        my $queues = $admin->child( queues => title => loc('Queues'),
-                                    path => '/Admin/Queues/', );
+        my $users = $admin->child( loc('Users'),  path => '/Admin/Users/', );
+        $users->child( loc('Select'), path => "/Admin/Users/" );
+        $users->child( loc('Create'), path => "/Admin/Users/Modify.html?Create=1" );
+
+
+        my $groups = $admin->child( loc('Groups'), path => '/Admin/Groups/', );
+
+        $groups->child( loc('Select'), path => "/Admin/Groups/" );
+        $groups->child( loc('Create'), path => "/Admin/Groups/Modify.html?Create=1" );
+
+
+        my $queues = $admin->child( queues => title => loc('Queues'), path => '/Admin/Queues/', );
         $queues->child( loc('Select'), path => "/Admin/Queues/" );
-        $queues->child( loc('Create'),
-                        path => "/Admin/Queues/Modify.html?Create=1" );
-        $admin->child( loc('Custom Fields'), path => '/Admin/CustomFields/',
+        $queues->child( loc('Create'), path => "/Admin/Queues/Modify.html?Create=1" );
+        my $cfs = $admin->child( 'custom-fields' => title => loc('Custom Fields'), path => '/Admin/CustomFields/',
         );
-        $admin->child( loc('Rules'), path => '/admin/rules/', );
+        $cfs->child( select => title => loc('Select'), path => "/Admin/CustomFields/" );
+        $cfs->child( create => title => loc('Create'), path => "/Admin/CustomFields/Modify.html?Create=1" );
 
         my $admin_global
-            = $admin->child( loc('Global'), path => '/Admin/Global/', );
+            = $admin->child( global=> title => loc('Global'), path => '/Admin/Global/', );
 
-        $admin_global->child( loc('Templates'),
+        my $scrips = $admin_global->child( loc('Scrips'), path => '/Admin/Global/Scrips.html', );
+        $scrips->child( loc('Select'), path => "/Admin/Global/Scrips.html" );
+        $scrips->child( loc('Create'), path => "/Admin/Global/Scrip.html?Create=1" );
+        my $templates = $admin_global->child( loc('Templates'),
                               path => '/Admin/Global/Templates.html', );
+        $templates->child( loc('Select'), path => "/Admin/Global/Templates.html" );
+        $templates->child( loc('Create'), path => "/Admin/Global/Template.html?Create=1" );
 
 #        my $workflows = $admin_global->child( loc('Workflows'), path => '/Admin/Global/Workflows/index.html', );
 #        {
@@ -197,22 +210,24 @@ if ( $request_path =~ qr{.*} ) {
                                                Object => $RT::System )
        )
     {
-$about_me->child( loc('Settings'), path => '/Prefs/Other.html', );
-$about_me->child( loc('About me'), path => '/User/Prefs.html', );
-$about_me->child( loc('Search options'),
-                   path => '/Prefs/SearchOptions.html', );
-$about_me->child( loc('RT at a glance'), path => '/Prefs/MyRT.html', );
-$about_me->child( 'Quick search' => title => loc('Quick search'), path => '/Prefs/Quicksearch.html' );
-
-
-if ( $session{'CurrentUser'}->Name
-    && ( !RT->Config->Get('WebExternalAuth')
-        || RT->Config->Get('WebFallbackToInternalAuth')
-    )
-) {
-  $about_me->child(logout => title => loc('Logout'),  path =>'/NoAuth/Logout.html');
+        $about_me->child( settings => title => loc('Settings'), path => '/Prefs/Other.html', );
+        $about_me->child( about_me => title => loc('About me'), path => '/User/Prefs.html', );
+        $about_me->child( search_options => title => loc('Search options'),
+                          path => '/Prefs/SearchOptions.html', );
+        $about_me->child( myrt => title =>  loc('RT at a glance'), path => '/Prefs/MyRT.html',
+        );
+        $about_me->child( quicksearch => title => 'Quick search' => title => loc('Quick search'),
+                          path => '/Prefs/Quicksearch.html' );
+    }
+
+    if ( $session{'CurrentUser'}->Name
+         && (   !RT->Config->Get('WebExternalAuth')
+              || RT->Config->Get('WebFallbackToInternalAuth') )
+       )
+    {
+        $about_me->child( logout => title => loc('Logout'),
+                          path   => '/NoAuth/Logout.html' );
     }
-}
 }
 if ( $request_path =~ qr'Dashboards/(\d+)?' ) {
     if ( my $id = ( $1 || $m->request_args->{'id'} ) ) {
@@ -272,25 +287,38 @@ if ( $request_path =~ qr'/SelfService' ) {
 }
 
 if ( $request_path =~ qr'Admin/Queues' ) {
-    if ( $session{'CurrentUser'}
-         ->HasRight( Object => $RT::System, Right => 'AdminQueue' ) )
+    if ( $session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminQueue' ) )
     {
     }
-    if ( my $id = $m->request_args->{'id'} ) {
+    if ( my $id = $m->request_args->{'id'} ||$m->request_args->{'Queue'}) {
         my $queue_obj = RT::Queue->new( $session{'CurrentUser'} );
         $queue_obj->Load($id);
 
-        my $queue
-            = PageMenu->child(
-                   $queue_obj->Name => path => "/Admin/Queues/Modify.html?id="
-                       . $id );
-        $queue->child( loc('Basics'),
+        my $queue = PageMenu();
+        $queue->child( basics => title =>loc('Basics'),
                        path => "/Admin/Queues/Modify.html?id=" . $id );
-        $queue->child( loc('Watchers'),
+        $queue->child( people => title => loc('Watchers'),
                        path => "/Admin/Queues/People.html?id=" . $id );
-        $queue->child( loc('Templates'),
+        my $templates = $queue->child( templates => title => loc('Templates'),
                        path => "/Admin/Queues/Templates.html?id=" . $id );
 
+
+
+        $templates->child( select => title => loc('Select'), path => "/Admin/Queues/Templates.html?id=".$id );
+        $templates->child( create => title =>  loc('Create'), path  => "/Admin/Queues/Template.html?Create=1;Queue=".$id );
+
+        my $scrips = $queue->child( scrips => title => loc('Scrips'),
+                       path => "/Admin/Queues/Scrips.html?id=" . $id );
+
+
+
+        $scrips->child( select => title => loc('Select'), path => "/Admin/Queues/Scrips.html?id=".$id );
+        $scrips->child( create => title =>  loc('Create'), path  => "/Admin/Queues/Scrip.html?Create=1;Queue=".$id );
+
+
+
+
+
         $queue->child( loc('Ticket Custom Fields'),
              path => '/Admin/Queues/CustomFields.html?sub_type=RT::Ticket&id='
                  . $id );
@@ -311,11 +339,8 @@ if ( $request_path =~ qr'/Admin/Users' ) {
     if ( $session{'CurrentUser'}
          ->HasRight( Object => $RT::System, Right => 'AdminUsers' ) )
     {
-        PageMenu->child( loc('Select'), path => "/Admin/Users/" );
-        PageMenu->child( loc('Create'),
-                         path      => "/Admin/Users/Modify.html?Create=1",
-                         separator => 1
-                       );
+        PageMenu->child( select => title => loc('Select'), path => "/Admin/Users/" );
+        PageMenu->child( create => title => loc('Create'), path => "/Admin/Users/Modify.html?Create=1" );
     }
     if ( my $id = $m->request_args->{'id'} ) {
         my $obj = RT::User->new( $session{'CurrentUser'} );
@@ -586,9 +611,49 @@ if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
                      loc('Bulk Update') => path => "/Search/Bulk.html$args" );
 
     }
+
 }
 
 
+    if ( $request_path =~ /^\/(?:index.html|$)/ ) {
+
+        my @dashboards = $m->comp("/Dashboards/Elements/ListOfDashboards");
+        my $limit      = 7;
+
+        $m->callback( Dashboards   => \@dashboards,
+                      Limit        => \$limit,
+                      CallbackName => 'MassageDashboards',
+                    );
+
+        my $more = 0;
+        if ( @dashboards > $limit ) {
+            $more = 1;
+            splice @dashboards, $limit;
+        }
+
+        my $position = 0;
+
+        for my $dash (@dashboards) {
+            PageMenu->child(
+                        'dashboard-' . $dash->id,
+                        title => $dash->Name,
+                        path => 'Dashboards/' . $dash->id . '/' . $dash->Name,
+            );
+        }
+
+        PageMenu()->child( home => title => loc('Home'), path => 'index.html' );
+
+        if ($more) {
+            $tabs->{"D-more"} = { title => loc('More'),
+                                  path  => 'Dashboards/index.html',
+                                };
+        }
+
+    }
+
+
+
+
 
 
 

commit f8b39cf55eac8627e970c5c540a2b65f3f99ad97
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Fri Nov 5 04:14:13 2010 -0400

    Put a class on the current logged in user

diff --git a/lib/RT/Test/Web.pm b/lib/RT/Test/Web.pm
index 6fac2ef..e6bb0e7 100644
--- a/lib/RT/Test/Web.pm
+++ b/lib/RT/Test/Web.pm
@@ -90,7 +90,7 @@ sub login {
         Test::More::diag("error: page has no Logout");
         return 0;
     }
-    unless ( $self->content =~ m{<span>\Q$user\E</span>}i ) {
+    unless ( $self->content =~ m{<span class="current-user">\Q$user\E</span>}i ) {
         Test::More::diag("Page has no user name");
         return 0;
     }
diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 194a67f..71e7722 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -204,7 +204,14 @@ if ( $request_path =~ qr{.*} ) {
         $admin_tools->child( loc('Shredder'),
                              path => '/Admin/Tools/Shredder', );
     }
-    my $about_me =  Menu->child( 'preferences' => title => loc("Logged in as [_1]", $session{'CurrentUser'}->Name), sort_rder => 99 );
+    my $about_me = Menu->child(
+                    'preferences' => title =>
+                        loc('Logged in as <span class="current-user">[_1]</span>',
+                        $session{'CurrentUser'}->Name
+                        ),
+                    escape_title => 0,
+                    sort_order   => 99
+    );
     if ( $session{'CurrentUser'}->UserObj
          && $session{'CurrentUser'}->HasRight( Right  => 'ModifySelf',
                                                Object => $RT::System )

commit 961b3c3b8806586200828e1ca0549f4f6196e646
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Mon Nov 1 11:27:14 2010 -0400

    Menuing HTML is now pretty and ~well indented and easy to read

diff --git a/share/html/Elements/Menu b/share/html/Elements/Menu
index 2dd99e4..a35b7f7 100755
--- a/share/html/Elements/Menu
+++ b/share/html/Elements/Menu
@@ -45,25 +45,27 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-<ul <%$id ? 'id="'.$id.'"' : '' |n%><% $toplevel? 'class="sf-menu sf-js-enabled sf-shadow"' : '' |n %>>
+
+<%" " x $depth%><ul<%$id ? ' id="'.$id.'"' : '' |n%><% $toplevel? ' class="sf-menu sf-js-enabled sf-shadow"' : '' |n %>>
 % for my $child ($menu->children) {
-%   my $item_id = lc($parent_id."-".$child->key);
+%   my $item_id = lc(($parent_id? $parent_id."-" : "") .$child->key);
 %   $item_id =~ s/\s/-/g;
-<li>
-<a id="<%$item_id%>" \
-<% $child->path ? 'href="'.RT->Config->Get('WebPath').$child->path.'"' : '' |n%> \
-> \
+<%" " x ($depth+1)%><li>\
+<a id="<%$item_id%>" <% $child->path ? ' href="'.RT->Config->Get('WebPath').$child->path.'"' : '' |n%>>\
 % if ($child->escape_title) {
-<%$child->title |n%>
+<%$child->title |n%>\
 % } else {
-<%$child->title%>
+<%$child->title%>\
 % }
-</a>
-% next unless ($child->has_children);
-<& Menu, menu => $child, toplevel => 0, parent_id => ($parent_id? $parent_id."-": '').$child->key &>
+</a>\
+% if ($child->has_children) {
+<& Menu, menu => $child, toplevel => 0, parent_id => ($parent_id? $parent_id."-": '').$child->key, depth=> ($depth+1) &>
+<%" " x ($depth+1)%></li>
+% } else {
 </li>
 % }
-</ul>
+% }
+<%" " x $depth%></ul>\
 <%INIT>
 
 </%INIT>
@@ -72,4 +74,5 @@ $menu
 $id => undef
 $toplevel => 1
 $parent_id => ''
+$depth => 0
 </%ARGS>

commit c8b6fa9d05d4e7d427df01fe6ac577792f08e56f
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Mon Nov 1 22:07:19 2010 -0400

    added a property to menuing to determine whether to <a> menu items

diff --git a/lib/RT/Interface/Web/Menu.pm b/lib/RT/Interface/Web/Menu.pm
index d8b55c3..0c1f90c 100644
--- a/lib/RT/Interface/Web/Menu.pm
+++ b/lib/RT/Interface/Web/Menu.pm
@@ -58,7 +58,7 @@ use Scalar::Util qw(weaken);
 
 __PACKAGE__->mk_accessors(qw(
     title sort_order target escape_title class render_children_inline
-    raw_html key
+    link_item raw_html key
 ));
 
 =head1 NAME
@@ -215,10 +215,11 @@ sub child {
             $child->parent($self);
         } else {
             $child = $proto->new(
-                {   parent     => $self,
+                {   parent      => $self,
                     key         => $key,
-                    title        => $key,
-                    escape_title => 1,
+                    title       => $key,
+                    escape_title=> 1,
+                    link_item   => 1,
                     %args
                 }
             );
diff --git a/share/html/Elements/Menu b/share/html/Elements/Menu
index a35b7f7..08fa385 100755
--- a/share/html/Elements/Menu
+++ b/share/html/Elements/Menu
@@ -51,13 +51,17 @@
 %   my $item_id = lc(($parent_id? $parent_id."-" : "") .$child->key);
 %   $item_id =~ s/\s/-/g;
 <%" " x ($depth+1)%><li>\
+% if ($child->link_item) {
 <a id="<%$item_id%>" <% $child->path ? ' href="'.RT->Config->Get('WebPath').$child->path.'"' : '' |n%>>\
+% }
 % if ($child->escape_title) {
-<%$child->title |n%>\
-% } else {
 <%$child->title%>\
+% } else {
+<%$child->title |n%>\
 % }
+% if ($child->link_item) {
 </a>\
+% }
 % if ($child->has_children) {
 <& Menu, menu => $child, toplevel => 0, parent_id => ($parent_id? $parent_id."-": '').$child->key, depth=> ($depth+1) &>
 <%" " x ($depth+1)%></li>

commit 9e8124379b71633e388810d9baba18f0ec7d8b46
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Mon Nov 1 14:27:35 2010 -0400

    Updates to get scrip edit HTML to not be so painfully unreadable

diff --git a/share/html/Admin/Elements/EditScrip b/share/html/Admin/Elements/EditScrip
index 3141541..37d0dbe 100755
--- a/share/html/Admin/Elements/EditScrip
+++ b/share/html/Admin/Elements/EditScrip
@@ -54,32 +54,32 @@
 <&| /Widgets/TitleBox, title => loc('Scrip Fields') &>
 <table>
 
-<tr><td align="right"><&|/l&>Description</&>:</td><td>
-<input name="Scrip-<% $id %>-Description" 
-    size="60"
+<tr><td class="label"><&|/l&>Description</&>:</td><td class="value">\
+<input name="Scrip-<% $id %>-Description" \
+    size="60" \
     value="<% $ARGS{"Scrip-$id-Description"} || $scrip->Description || '' %>" />
 </td></tr>
 
-<tr><td align="right"><&|/l&>Condition</&>:</td><td>
+<tr><td class="label"><&|/l&>Condition</&>:</td><td class="value">\
 <& /Admin/Elements/SelectScripCondition,
     Name => "Scrip-$id-ScripCondition",
     Default => $ARGS{"Scrip-$id-ScripCondition"} || $scrip->ConditionObj->Id,
 &></td></tr>
 
-<tr><td align="right"><&|/l&>Action</&>:</td><td>
+<tr><td class="label"><&|/l&>Action</&>:</td><td class="value">\
 <& /Admin/Elements/SelectScripAction,
     Name => "Scrip-$id-ScripAction",
     Default => $ARGS{"Scrip-$id-ScripAction"} || $scrip->ActionObj->Id,
 &></td></tr>
 
-<tr><td align="right"><&|/l&>Template</&>:</td><td>
+<tr><td class="label"><&|/l&>Template</&>:</td><td class="value">\
 <& /Admin/Elements/SelectTemplate,
     Name => "Scrip-$id-Template",
     Default => $ARGS{"Scrip-$id-Template"} || $scrip->TemplateObj->Id,
     Queue => $Queue,
 &></td></tr>
 
-<tr><td align="right"><&|/l&>Stage</&>:</td><td>
+<tr><td class="label"><&|/l&>Stage</&>:</td><td class="value">\
 <& /Admin/Elements/SelectStage,
     Name => "Scrip-$id-Stage",
     Default => $ARGS{"Scrip-$id-Stage"} || $scrip->Stage,
@@ -100,21 +100,21 @@
 <i><&|/l&>(Use these fields when you choose 'User Defined' for a condition or action)</&></i>
 </td></tr>
 
-<tr><td class="labeltop"><&|/l&>Custom condition</&>:</td><td>
+<tr><td class="labeltop"><&|/l&>Custom condition</&>:</td><td class="value">
 % my $code = $ARGS{"Scrip-$id-CustomIsApplicableCode"} || $scrip->CustomIsApplicableCode || '';
 % my $lines = @{[ $code =~ /\n/gs ]} + 3;
 % $lines = $min_lines if $lines < $min_lines;
 <textarea cols="80" rows="<% $lines %>" name="Scrip-<% $id %>-CustomIsApplicableCode"><% $code %></textarea>
 </td></tr>
 
-<tr><td class="labeltop"><&|/l&>Custom action preparation code</&>:</td><td>
+<tr><td class="labeltop"><&|/l&>Custom action preparation code</&>:</td><td class="value">
 % $code = $ARGS{"Scrip-$id-CustomPrepareCode"} || $scrip->CustomPrepareCode || '';
 % $lines = @{[ $code =~ /\n/gs ]} + 3;
 % $lines = $min_lines if $lines < $min_lines;
 <textarea cols="80" rows="<% $lines %>" name="Scrip-<% $id %>-CustomPrepareCode"><% $code %></textarea>
 </td></tr>
 
-<tr><td class="labeltop"><&|/l&>Custom action cleanup code</&>:</td><td>
+<tr><td class="labeltop"><&|/l&>Custom action cleanup code</&>:</td><td class="value">
 % $code = $ARGS{"Scrip-$id-CustomCommitCode"} || $scrip->CustomCommitCode || '';
 % $lines = @{[ $code =~ /\n/gs ]} + 3;
 % $lines = $min_lines if $lines < $min_lines;
diff --git a/share/html/Admin/Elements/SelectTemplate b/share/html/Admin/Elements/SelectTemplate
index 54001c5..d077389 100755
--- a/share/html/Admin/Elements/SelectTemplate
+++ b/share/html/Admin/Elements/SelectTemplate
@@ -47,19 +47,12 @@
 %# END BPS TAGGED BLOCK }}}
 <select name="<%$Name%>">
 <option value="" 
-<% defined($Default) && $Default eq 'none' && qq[ selected="selected"] |n %>
->-</option>
+<% defined($Default) && $Default eq 'none' && qq[ selected="selected"] |n %>>-</option>
 %while  (my $Template = $PrimaryTemplates->Next) {
-<option value="<%$Template->Id%>"
-<% ($Template->Id == $Default) && qq[ selected="selected"] |n %>
-><% loc($Template->Name) %>
-</option>
+<option value="<%$Template->Id%>" <% ($Template->Id == $Default) && qq[ selected="selected"] |n %>><% loc($Template->Name) %></option>
 %}
 %while  (my $Template = $OtherTemplates->Next) {
-<option value="<%$Template->Id%>"
-<% defined($Default) && ($Template->Id == $Default) && qq[ selected="selected"] |n %>
-><&|/l, loc($Template->Name) &>Global template: [_1]</&>
-</option>
+<option value="<%$Template->Id%>" <% defined($Default) && ($Template->Id == $Default) && qq[ selected="selected"] |n %>><&|/l, loc($Template->Name) &>Global template: [_1]</&></option>
 %}
 </select>
 
@@ -78,10 +71,8 @@ $OtherTemplates->OrderBy(FIELD => 'Name');
 
 </%INIT>
 <%ARGS>
-
 $Queue => undef
 $Default => 'none'
 $DefaultQueue => undef
 $Name => 'Template'
-
 </%ARGS>

commit 76b57e8ccb4c962c263ca8c18569e90bca50d24c
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Mon Nov 1 14:57:05 2010 -0400

    Queue - cf mapping navigation

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 71e7722..55ee7f6 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -326,25 +326,17 @@ if ( $request_path =~ qr'Admin/Queues' ) {
 
 
 
-        $queue->child( loc('Ticket Custom Fields'),
-             path => '/Admin/Queues/CustomFields.html?sub_type=RT::Ticket&id='
-                 . $id );
-
-        $queue->child( loc('Transaction Custom Fields'),
-            path =>
-                '/Admin/Queues/CustomFields.html?sub_type=RT::Ticket-RT::Transaction&id='
-                . $id );
-
-        $queue->child( loc('Group Rights'),
-                       path => "/Admin/Queues/GroupRights.html?id=" . $id );
-        $queue->child( loc('User Rights'),
-                       path => "/Admin/Queues/UserRights.html?id=" . $id );
+        my $ticket_cfs = $queue->child( loc('Ticket Custom Fields'), path => '/Admin/Queues/CustomFields.html?SubType=RT::Ticket&id=' . $id );
+
+        my $txn_cfs = $queue->child( loc('Transaction Custom Fields'), path => '/Admin/Queues/CustomFields.html?SubType=RT::Ticket-RT::Transaction&id=' . $id );
+
+        $queue->child( loc('Group Rights'), path => "/Admin/Queues/GroupRights.html?id=" . $id );
+        $queue->child( loc('User Rights'), path => "/Admin/Queues/UserRights.html?id=" . $id );
     }
 }
 
 if ( $request_path =~ qr'/Admin/Users' ) {
-    if ( $session{'CurrentUser'}
-         ->HasRight( Object => $RT::System, Right => 'AdminUsers' ) )
+    if ( $session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminUsers' ) )
     {
         PageMenu->child( select => title => loc('Select'), path => "/Admin/Users/" );
         PageMenu->child( create => title => loc('Create'), path => "/Admin/Users/Modify.html?Create=1" );
diff --git a/t/customfields/sort_order.t b/t/customfields/sort_order.t
index 3dfdf3f..d210f31 100644
--- a/t/customfields/sort_order.t
+++ b/t/customfields/sort_order.t
@@ -51,8 +51,7 @@ diag "reorder CFs: C, A and B";
 {
     $m->get( '/Admin/Queues/' );
     $m->follow_link_ok( {text => $queue->id} );
-    $m->follow_link_ok( {text => 'Ticket Custom Fields'} );
-
+    $m->follow_link_ok( {id  => 'page-ticket-custom-fields'} );
     my @tmp = ($m->content =~ /(CF [ABC])/g);
     is_deeply(\@tmp, ['CF B', 'CF A', 'CF C']);
 
@@ -83,8 +82,7 @@ diag "check ticket create, display and edit pages";
     
     @tmp = ($m->content =~ /(CF [ABC])/g);
     is_deeply(\@tmp, ['CF C', 'CF A', 'CF B']);
-
-    $m->follow_link_ok( {text => 'Custom Fields'} );
+    $m->follow_link_ok( {id => 'page-basics'});
 
     @tmp = ($m->content =~ /(CF [ABC])/g);
     is_deeply(\@tmp, ['CF C', 'CF A', 'CF B']);

commit bf512d2cf21dcf63c836b7d90e10ef0f2c3d6bee
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Tue Nov 2 16:11:51 2010 -0400

    A bunch of whitespace removal in generated html

diff --git a/share/html/Elements/Footer b/share/html/Elements/Footer
index d221a66..d004663 100755
--- a/share/html/Elements/Footer
+++ b/share/html/Elements/Footer
@@ -51,22 +51,13 @@
 % $m->callback( %ARGS );
 <div id="footer">
 % if ($m->{'rt_base_time'}) {
-  <p id="time">
-    <span><&|/l&>Time to display</&>: <%Time::HiRes::tv_interval( $m->{'rt_base_time'} )%></span>
-  </p>
+  <p id="time"><span><&|/l&>Time to display</&>: <%Time::HiRes::tv_interval( $m->{'rt_base_time'} )%></span></p>
 %}
-  <p id="bpscredits">
-    <span>
-<&|/l,     '&#187;&#124;&#171;', $RT::VERSION, '2010', '<a href="http://www.bestpractical.com?rt='.$RT::VERSION.'">Best Practical Solutions, LLC</a>', &>[_1] RT [_2] Copyright 1996-[_3] [_4].</&>
-</span>
-</p>
+  <p id="bpscredits"><span><&|/l,     '&#187;&#124;&#171;', $RT::VERSION, '2010', '<a href="http://www.bestpractical.com?rt='.$RT::VERSION.'">Best Practical Solutions, LLC</a>', &>[_1] RT [_2] Copyright 1996-[_3] [_4].</&>
+</span></p>
 % if (!$Menu) {
-  <p id="legal">
-<&|/l&>Distributed under version 2 <a href="http://www.gnu.org/copyleft/gpl.html"> of the GNU GPL.</a></&><br />
-<&|/l, '<a href="mailto:sales at bestpractical.com">sales at bestpractical.com</a>' &>To inquire about support, training, custom development or licensing, please contact [_1].</&><br />
-  </p>
+  <p id="legal"><&|/l&>Distributed under version 2 <a href="http://www.gnu.org/copyleft/gpl.html"> of the GNU GPL.</a></&><br /><&|/l, '<a href="mailto:sales at bestpractical.com">sales at bestpractical.com</a>' &>To inquire about support, training, custom development or licensing, please contact [_1].</&><br /></p>
 % }
-
 </div>
 % if ($Debug >= 2 ) {
 % require Data::Dumper;
@@ -75,10 +66,8 @@
 <%$d->Dump() %>
 </pre>
 % }
-
   </body>
 </html>
-
 <%ARGS>
 $Debug => 0
 $Menu => 1
diff --git a/share/html/Elements/ShowLinks b/share/html/Elements/ShowLinks
index 15db6d7..eff8c50 100755
--- a/share/html/Elements/ShowLinks
+++ b/share/html/Elements/ShowLinks
@@ -47,13 +47,12 @@
 %# END BPS TAGGED BLOCK }}}
 <table>
   <tr>
-    <td class="labeltop"><& ShowRelationLabel, id => $id, Label => loc('Depends on'), Relation => 'DependsOn' &>:
+    <td class="labeltop"><& ShowRelationLabel, id => $id, Label => loc('Depends on'), Relation => 'DependsOn' &>:\
 % if ($can_create) {
         <span class="create">(<a href="<%$clone->{'DependsOn-new'}%>"><% loc('Create') %></a>)</span>
 % }
     </td>
     <td class="value">
-
 <%PERL>
 my ( @active, @inactive, @not_tickets );
 for my $link ( @{ $Ticket->DependsOn->ItemsArrayRef } ) {
@@ -71,8 +70,6 @@ for my $link ( @{ $Ticket->DependsOn->ItemsArrayRef } ) {
     }
 }
 </%PERL>
-
-
 <ul>
 % for my $Link (@not_tickets, @active, @inactive) {
 <li><& ShowLink, URI => $Link &></li>
@@ -81,7 +78,7 @@ for my $link ( @{ $Ticket->DependsOn->ItemsArrayRef } ) {
     </td>
   </tr>
   <tr>
-    <td class="labeltop"><& ShowRelationLabel, id => $id, Label => loc('Depended on by'), Relation => 'DependedOnBy' &>:
+    <td class="labeltop"><& ShowRelationLabel, id => $id, Label => loc('Depended on by'), Relation => 'DependedOnBy' &>:\
 % if ($can_create) {
         <span class="create">(<a href="<%$clone->{'new-DependsOn'}%>"><% loc('Create') %></a>)</span>
 % }
@@ -95,7 +92,7 @@ for my $link ( @{ $Ticket->DependsOn->ItemsArrayRef } ) {
     </td>
   </tr>
   <tr>
-    <td class="labeltop"><& ShowRelationLabel, id => $id, Label => loc('Parents'), Relation => 'Parents' &>:
+    <td class="labeltop"><& ShowRelationLabel, id => $id, Label => loc('Parents'), Relation => 'Parents' &>:\
 % if ($can_create) {
         <span class="create">(<a href="<%$clone->{'MemberOf-new'}%>"><% loc('Create') %></a>)</span>
 % }
@@ -103,7 +100,7 @@ for my $link ( @{ $Ticket->DependsOn->ItemsArrayRef } ) {
     <td class="value"><& /Ticket/Elements/ShowParents, Ticket => $Ticket &></td>
   </tr>
   <tr>
-    <td class="labeltop"><& ShowRelationLabel, id => $id, Label => loc('Children'), Relation => 'Children' &>:
+    <td class="labeltop"><& ShowRelationLabel, id => $id, Label => loc('Children'), Relation => 'Children' &>:\
 % if ($can_create) {
         <span class="create">(<a href="<%$clone->{'new-MemberOf'}%>"><% loc('Create') %></a>)</span>
 % }
@@ -111,7 +108,7 @@ for my $link ( @{ $Ticket->DependsOn->ItemsArrayRef } ) {
     <td class="value"><& /Ticket/Elements/ShowMembers, Ticket => $Ticket &></td>
   </tr>
   <tr>
-    <td class="labeltop"><& ShowRelationLabel, id => $id, Label => loc('Refers to'), Relation => 'RefersTo' &>:
+    <td class="labeltop"><& ShowRelationLabel, id => $id, Label => loc('Refers to'), Relation => 'RefersTo' &>:\
 % if ($can_create) {
         <span class="create">(<a href="<%$clone->{'RefersTo-new'}%>"><% loc('Create') %></a>)</span>
 % }
@@ -125,7 +122,7 @@ for my $link ( @{ $Ticket->DependsOn->ItemsArrayRef } ) {
     </td>
   </tr>
   <tr>
-    <td class="labeltop"><& ShowRelationLabel, id => $id, Label => loc('Referred to by'), Relation => 'ReferredToBy' &>:
+    <td class="labeltop"><& ShowRelationLabel, id => $id, Label => loc('Referred to by'), Relation => 'ReferredToBy' &>:\
 % if ($can_create) {
         <span class="create">(<a href="<%$clone->{'new-RefersTo'}%>"><% loc('Create') %></a>)</span>
 % }
@@ -139,13 +136,9 @@ for my $link ( @{ $Ticket->DependsOn->ItemsArrayRef } ) {
 </ul>
     </td>
   </tr>
-
-
 % # Allow people to add more rows to the table
 % $m->callback( %ARGS );
-
 </table>
-
 <%INIT>
 
 my $id = $Ticket->id;
@@ -179,7 +172,6 @@ for my $relation ( qw(MemberOf Members DependsOn DependedOnBy)) {
 }
 
 </%INIT>
-
 <%ARGS>
 $Ticket => undef
 </%ARGS>
diff --git a/share/html/Ticket/Elements/EditBasics b/share/html/Ticket/Elements/EditBasics
index 50a0b7a..31249b6 100755
--- a/share/html/Ticket/Elements/EditBasics
+++ b/share/html/Ticket/Elements/EditBasics
@@ -132,10 +132,10 @@ for my $field (@fields) {
 <table>
 % }
 % for my $field (@fields) {
-  <tr class="<% lc $field->{'name'} %>">
-    <td class="label"><&|/l&><% $field->{'name'} %></&>:</td>
-    <td class="value"><% $field->{'html'} |n %></td>
-  </tr>
+ <tr class="<% lc $field->{'name'} %>">\
+<td class="label"><&|/l&><% $field->{'name'} %></&>:</td>\
+<td class="value"><% $field->{'html'} |n %></td>\
+</tr>
 % }
 % $m->callback( CallbackName => 'EndOfList', TicketObj => $TicketObj, %ARGS, Fields => \@fields );
 % unless ($InTable) {
diff --git a/share/html/Ticket/Elements/Reminders b/share/html/Ticket/Elements/Reminders
index 678f441..be95a0f 100644
--- a/share/html/Ticket/Elements/Reminders
+++ b/share/html/Ticket/Elements/Reminders
@@ -129,9 +129,7 @@ $Ticket
 <table>
 <tr class="input-row">
 <td class="label"><label class="horizontal" for="NewReminder-Subject" ><&|/l&>Subject</&>:</label></td>
-<td class="value">
-<input type="text" size="15" name="NewReminder-Subject" id="NewReminder-Subject" />
-</td>
+<td class="value"><input type="text" size="15" name="NewReminder-Subject" id="NewReminder-Subject" /></td>
 </tr>
 <tr class="input-row">
 <td class="label">
@@ -141,9 +139,7 @@ $Ticket
 </tr>
 <tr class="input-row">
 <td class="label"><label class="horizontal" for="NewReminder-Due" ><&|/l&>Due</&>:</label></td>
-<td class="value">
-<& /Elements/SelectDate, Name => "NewReminder-Due", Default => "" &>
-</td>
+<td class="value"><& /Elements/SelectDate, Name => "NewReminder-Due", Default => "" &></td>
 </tr>
 </table>
 </%method>
@@ -152,11 +148,8 @@ $Ticket
 $Reminder
 $Ticket
 </%args>
-<input
-    type="checkbox" 
-    name="Complete-Reminder-<%$Reminder->id%>" 
-    <% $Reminder->Status eq 'resolved' ? 'checked="checked"' : '' %> 
-/> 
+<input type="checkbox" name="Complete-Reminder-<%$Reminder->id%>" \
+    <% $Reminder->Status eq 'resolved' ? 'checked="checked"' : '' %> />
     <input type="text" size="15" name="Reminder-Subject-<% $Reminder->id %>" value="<%$Reminder->Subject%>" /> &bull; 
     <& /Elements/SelectOwner, Name => 'Reminder-Owner-'.$Reminder->id, Queue => $Ticket->QueueObj, Default => $Reminder->Owner, DefaultValue => 0  &>
     <& /Elements/SelectDate, Name => 'Reminder-Due-'.$Reminder->id, Default => $Reminder->DueObj->Date &>
@@ -167,12 +160,9 @@ $Ticket
 $Reminder
 $Ticket
 </%args>
-<input
-    type="checkbox" 
-    name="Complete-Reminder-<%$Reminder->id%>" 
-    <% $Reminder->Status eq 'resolved' ? 'checked="checked"' : '' %> 
-/> 
-    <%$Reminder->Subject%> &bull; 
-    <%$Reminder->OwnerObj->Name%>
+<input type="checkbox" name="Complete-Reminder-<%$Reminder->id%>" \
+    <% $Reminder->Status eq 'resolved' ? 'checked="checked"' : '' %> />
+    <%$Reminder->Subject%> &bull; \
+    <%$Reminder->OwnerObj->Name%> \
     <%$Reminder->DueObj->Unix>0  ? "&bull; ". $Reminder->DueObj->AgeAsString : '' |n%><br />
 </%method>
diff --git a/share/html/Ticket/Elements/ShowDates b/share/html/Ticket/Elements/ShowDates
index 2c3a8e2..141dec7 100755
--- a/share/html/Ticket/Elements/ShowDates
+++ b/share/html/Ticket/Elements/ShowDates
@@ -47,23 +47,23 @@
 %# END BPS TAGGED BLOCK }}}
 <table>
   <tr class="date created">
-    <td class="label"><&|/l&>Created</&>:</td>
+    <td class="label"><&|/l&>Created</&>:</td>\
     <td class="value"><% $Ticket->CreatedObj->AsString %></td>
   </tr>
   <tr class="date starts">
-    <td class="label"><&|/l&>Starts</&>:</td>
+    <td class="label"><&|/l&>Starts</&>:</td>\
     <td class="value"><% $Ticket->StartsObj->AsString %></td>
   </tr>
   <tr class="date started">
-    <td class="label"><&|/l&>Started</&>:</td>
+    <td class="label"><&|/l&>Started</&>:</td>\
     <td class="value"><% $Ticket->StartedObj->AsString %></td>
   </tr>
   <tr class="date told">
-    <td class="label"><a href="<% RT->Config->Get('WebPath') %>/Ticket/Display.html?id=<% $Ticket->id %>&Action=SetTold"><&|/l&>Last Contact</&></a>:</td>
+    <td class="label"><a href="<% RT->Config->Get('WebPath') %>/Ticket/Display.html?id=<% $Ticket->id %>&Action=SetTold"><&|/l&>Last Contact</&></a>:</td>\
     <td class="value"><% $Ticket->ToldObj->AsString %></td>
   </tr>
   <tr class="date due">
-    <td class="label"><&|/l&>Due</&>:</td>
+    <td class="label"><&|/l&>Due</&>:</td>\
 % my $due = $Ticket->DueObj;
 % if ( $due && $due->Unix > 0 && $due->Diff < 0 ) {
     <td class="value"><% $due->AsString  %></span></td>
@@ -72,11 +72,11 @@
 % }
   </tr>
   <tr class="date resolved">
-    <td class="label"><&|/l&>Closed</&>:</td>
+    <td class="label"><&|/l&>Closed</&>:</td>\
     <td class="value"><% $Ticket->ResolvedObj->AsString  %></td>
   </tr>
   <tr class="date updated">
-    <td class="label"><&|/l&>Updated</&>:</td>
+    <td class="label"><&|/l&>Updated</&>:</td>\
 % my $UpdatedString = $Ticket->LastUpdated ? loc("[_1] by [_2]", $Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name) : loc("Never");
 % if ($UpdatedLink) {
     <td class="value"><a href="#lasttrans"><% $UpdatedString | h %></a></td>
diff --git a/share/html/Ticket/Elements/ShowHistory b/share/html/Ticket/Elements/ShowHistory
index d0e7fc5..1af57a8 100755
--- a/share/html/Ticket/Elements/ShowHistory
+++ b/share/html/Ticket/Elements/ShowHistory
@@ -79,7 +79,6 @@ if ($ShowDisplayModes or $ShowTitle) {
 <div class="history">
 <& /Widgets/TitleBoxStart, title => $title, titleright_raw => $titleright &>
 % }
-
 <div id="ticket-history">
 <%perl>
 my $trans_content = {};
diff --git a/share/html/Ticket/Elements/ShowSummary b/share/html/Ticket/Elements/ShowSummary
index 101a3de..6d0871e 100755
--- a/share/html/Ticket/Elements/ShowSummary
+++ b/share/html/Ticket/Elements/ShowSummary
@@ -49,41 +49,26 @@
 <tr>
   <td valign="top" class="boxcontainer">
 % $m->callback( %ARGS, CallbackName => 'LeftColumnTop' );
-
     <&| /Widgets/TitleBox, title => loc('The Basics'),
         (($can_modify || $can_modify_cf) ? (title_href => RT->Config->Get('WebPath')."/Ticket/Modify.html?id=".$Ticket->Id) : ()),
         class => 'ticket-info-basics',
-    &>
-        <& /Ticket/Elements/ShowBasics, Ticket => $Ticket &>
-    </&>
-
+    &><& /Ticket/Elements/ShowBasics, Ticket => $Ticket &></&>
 % if ($Ticket->CustomFields->First) {
     <&| /Widgets/TitleBox, title => loc('Custom Fields'),
         (($can_modify || $can_modify_cf) ? (title_href => RT->Config->Get('WebPath')."/Ticket/Modify.html?id=".$Ticket->Id) : ()),
         class => 'ticket-info-cfs',
-    &>
-        <& /Ticket/Elements/ShowCustomFields, Ticket => $Ticket &>
-    </&>
+    &><& /Ticket/Elements/ShowCustomFields, Ticket => $Ticket &></&>
 % }
-
     <&| /Widgets/TitleBox, title => loc('People'),
         (($can_modify || $can_modify_owner) ? (title_href => RT->Config->Get('WebPath')."/Ticket/ModifyPeople.html?id=".$Ticket->Id) : ()),
         class => 'ticket-info-people',
-    &>
-        <& /Ticket/Elements/ShowPeople, Ticket => $Ticket &>
-    </&>
-
+    &><& /Ticket/Elements/ShowPeople, Ticket => $Ticket &></&>
     <& /Ticket/Elements/ShowAttachments, Ticket => $Ticket, Attachments => $Attachments &>
-
     <& /Ticket/Elements/ShowRequestor, Ticket => $Ticket &>
-
 % $m->callback( %ARGS, CallbackName => 'LeftColumn' );
-
   </td>
   <td valign="top" class="boxcontainer">
-
 % $m->callback( %ARGS, CallbackName => 'RightColumnTop' );
-
 % if ( RT->Config->Get('EnableReminders') ) {
     <&|/Widgets/TitleBox, title => loc("Reminders"),
         title_href => RT->Config->Get('WebPath')."/Ticket/Reminders.html?id=".$Ticket->Id,
@@ -97,14 +82,10 @@
         </td></tr></table>
     </&>
 % }
-
     <&| /Widgets/TitleBox, title => loc("Dates"),
         ($can_modify ? (title_href => RT->Config->Get('WebPath')."/Ticket/ModifyDates.html?id=".$Ticket->Id) : ()),
         class => 'ticket-info-dates',
-    &>
-        <& /Ticket/Elements/ShowDates, Ticket => $Ticket &>
-    </&>
-
+    &><& /Ticket/Elements/ShowDates, Ticket => $Ticket &></&>
 % my (@extra);
 % push @extra, titleright_raw => '<a href="'. RT->Config->Get('WebPath'). '/Ticket/Graphs/index.html?id='.$Ticket->id.'">'.loc('Graph').'</a>' unless RT->Config->Get('DisableGraphViz');
 % $m->callback( %ARGS, CallbackName => 'LinksExtra', extra => \@extra );
@@ -112,12 +93,8 @@
         ($can_modify ? (title_href => RT->Config->Get('WebPath')."/Ticket/ModifyLinks.html?id=".$Ticket->Id) : ()),
         class => 'ticket-info-links',
         @extra,
-    &>
-        <& /Elements/ShowLinks, Ticket => $Ticket &>
-    </&>
-
+    &><& /Elements/ShowLinks, Ticket => $Ticket &></&>
 % $m->callback( %ARGS, CallbackName => 'RightColumn' );
-
   </td>
 </tr>
 </table>
diff --git a/share/html/Ticket/Elements/ShowTransaction b/share/html/Ticket/Elements/ShowTransaction
index 7dd55c0..d20653a 100755
--- a/share/html/Ticket/Elements/ShowTransaction
+++ b/share/html/Ticket/Elements/ShowTransaction
@@ -47,37 +47,33 @@
 %# END BPS TAGGED BLOCK }}}
 <div class="ticket-transaction <% $type_class %> <% $RowNum % 2 ? 'odd' : 'even' %>">
 % $m->callback( titlebar_cmd => \$titlebar_commands, Transaction => $Transaction, %ARGS, CallbackName => 'ModifyDisplay' );
-
 <div class="ticket-transaction">
 % $m->callback( titlebar_cmd => \$titlebar_commands, Transaction => $Transaction, %ARGS, CallbackName => 'ModifyCommand' );
   <div class="metadata">
     <span class="type">
-      <a name="txn-<% $Transaction->Id %>" href="<% $DisplayPath %>#txn-<% $Transaction->Id %>">#</a>
+      <a name="txn-<% $Transaction->Id %>" href="<% $DisplayPath %>#txn-<% $Transaction->Id %>">#</a>\
       <% $LastTransaction ? '<a id="lasttrans" name="lasttrans"></a>' : ''|n %>
     </span>
 % $m->callback( Transaction => $Transaction, %ARGS, CallbackName => 'AfterAnchor' );
     <span class="date"><% $transdate|n %></span>
 % my $desc = $Transaction->BriefDescription;
 % $m->callback( text => \$desc, Transaction => $Transaction, %ARGS, CallbackName => 'ModifyDisplay' );
-    <span class="description">
-      <& /Elements/ShowUser, User => $Transaction->CreatorObj &> - <% $TicketString %> <% $desc %>
+    <span class="description">\
+<& /Elements/ShowUser, User => $Transaction->CreatorObj &> - <% $TicketString %> <% $desc %>\
 % $m->callback( Transaction => $Transaction, %ARGS, CallbackName => 'AfterDescription' );
-    </span>
+</span>
 % $m->callback( TimeTaken => \$TimeTaken, Transaction => $Transaction, %ARGS, CallbackName => 'ModifyTimeTaken' );
-    <span class="time-taken"><% $TimeTaken %></span>
+    <span class="time-taken"><% $TimeTaken %></span>\
     <span class="actions<% $titlebar_commands ? '': ' hidden'%>"><% $titlebar_commands |n %></span>
   </div>
-
     <div class="content">
 % if ( $type_class eq 'message' ) {
       <& /Elements/ShowCustomFields, Object => $Transaction &>
 % }
 % $m->comp('ShowTransactionAttachments', %ARGS, Parent => 0) unless ($Collapsed ||!$ShowBody);
     </div>
-
 </div>
 </div>
-
 <%ARGS>
 $Ticket => undef
 $Transaction => undef
diff --git a/share/html/Ticket/Elements/ShowTransactionAttachments b/share/html/Ticket/Elements/ShowTransactionAttachments
index ab904eb..c49d328 100644
--- a/share/html/Ticket/Elements/ShowTransactionAttachments
+++ b/share/html/Ticket/Elements/ShowTransactionAttachments
@@ -63,18 +63,15 @@ foreach my $message ( grep $_->__Value('Parent') == $Parent, @$Attachments ) {
     if ( $size ) {
 </%PERL>
 <div class="downloadattachment">
-<a href="<% $AttachPath %>/<% $Transaction->Id %>/<% $message->Id %>/<% ($message->Filename ||'')| u%>"><&|/l&>Download</&> <% $message->Filename || loc('(untitled)') %></a>
+<a href="<% $AttachPath %>/<% $Transaction->Id %>/<% $message->Id %>/<% ($message->Filename ||'')| u%>"><&|/l&>Download</&> <% $message->Filename || loc('(untitled)') %></a>\
 % if ( $DownloadableHeaders && !$message->Filename && $message->ContentType =~ /text/  ) {
  / <a href="<% $AttachPath %>/WithHeaders/<% $message->Id %>"><% loc('with headers') %></a>
 % }
-
 % $m->callback(CallbackName => 'AfterDownloadLinks', ARGSRef => \%ARGS, Ticket => $Ticket, Transaction => $Transaction, Attachment => $message);
-
 <br />
 <span class="downloadcontenttype"><% $message->ContentType %> <% $size_to_str->( $size ) %></span>
 </div>
 %   }
-
 %# If there is sub-messages, open a dedicated div
 % if ( scalar ( grep $_->__Value('Parent') == $message->id, @$Attachments ) ) {
 <div class="messageattachments">

commit 50dfaa658feef679e9c9e47abcc20cbe714b99e3
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Mon Nov 1 19:37:13 2010 -0400

    add personal saved searches to prefs menus

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 55ee7f6..33c0429 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -221,12 +221,26 @@ if ( $request_path =~ qr{.*} ) {
         $about_me->child( about_me => title => loc('About me'), path => '/User/Prefs.html', );
         $about_me->child( search_options => title => loc('Search options'),
                           path => '/Prefs/SearchOptions.html', );
-        $about_me->child( myrt => title =>  loc('RT at a glance'), path => '/Prefs/MyRT.html',
-        );
-        $about_me->child( quicksearch => title => 'Quick search' => title => loc('Quick search'),
-                          path => '/Prefs/Quicksearch.html' );
-    }
+        $about_me->child( myrt => title => loc('RT at a glance'),
+                          path => '/Prefs/MyRT.html', );
+        $about_me->child( quicksearch => title => 'Quick search' => title =>
+                              loc('Quick search'),
+                          path => '/Prefs/Quicksearch.html'
+                        );
+
+        my $searches = [ $m->comp(
+                          "/Search/Elements/SearchesForObject",
+                          Object => RT::System->new( $session{'CurrentUser'} )) ];
+        my $i = 0;
+        for my $search (@$searches) {
+            $about_me->child( "search-" . $i++,
+                      title => $search->[0],
+                      path  => "/Prefs/Search.html?" . $query_string->(
+                          name => ref( $search->[1] ) . '-' . $search->[1]->Id),
+            );
 
+        }
+    }
     if ( $session{'CurrentUser'}->Name
          && (   !RT->Config->Get('WebExternalAuth')
               || RT->Config->Get('WebFallbackToInternalAuth') )

commit 2ba558417c473734cb36d37bcf15bd28c5431277
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Mon Nov 1 19:37:40 2010 -0400

    perltidy

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 33c0429..b211fee 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -69,7 +69,7 @@ my $query_string = sub {
 };
 
 if ( $request_path =~ qr{.*} ) {
-    Menu->child( home => title =>  loc('HomePage'), path => '/' );
+    Menu->child( home => title => loc('HomePage'), path => '/' );
     my $tickets = Menu->child( search => title => loc('Tickets'),
                                path => '/Search/Build.html' );
     $tickets->child( simple => title => loc('Simple Search') => path =>
@@ -88,12 +88,14 @@ if ( $request_path =~ qr{.*} ) {
     }
 
     my $tools = Menu->child( loc('Tools'), path => '/Tools/index.html' );
-    my $dashes = $tools->child( loc('Dashboards'), path => '/Dashboards/index.html' );
+    my $dashes = $tools->child( loc('Dashboards'),
+                                path => '/Dashboards/index.html' );
 
     $dashes->child( loc('Select'), path => "/Dashboards/index.html" );
     my $dashboard = RT::Dashboard->new( $session{CurrentUser} );
     if ( $dashboard->_PrivacyObjects( create => 1 ) ) {
-        $dashes->child( loc('Create') => path => "/Dashboards/Modify.html?Create=1" );
+        $dashes->child(
+                loc('Create') => path => "/Dashboards/Modify.html?Create=1" );
     }
     my $reports = $tools->child( loc('Reports'),
                                  path => '/Tools/Reports/index.html' );
@@ -116,35 +118,46 @@ if ( $request_path =~ qr{.*} ) {
     {
         my $admin = Menu->child( Config => title => loc('Configuration'),
                                  path   => '/Admin/' );
-        my $users = $admin->child( loc('Users'),  path => '/Admin/Users/', );
+        my $users = $admin->child( loc('Users'), path => '/Admin/Users/', );
         $users->child( loc('Select'), path => "/Admin/Users/" );
-        $users->child( loc('Create'), path => "/Admin/Users/Modify.html?Create=1" );
+        $users->child( loc('Create'),
+                       path => "/Admin/Users/Modify.html?Create=1" );
 
-
-        my $groups = $admin->child( loc('Groups'), path => '/Admin/Groups/', );
+        my $groups
+            = $admin->child( loc('Groups'), path => '/Admin/Groups/', );
 
         $groups->child( loc('Select'), path => "/Admin/Groups/" );
-        $groups->child( loc('Create'), path => "/Admin/Groups/Modify.html?Create=1" );
-
+        $groups->child( loc('Create'),
+                        path => "/Admin/Groups/Modify.html?Create=1" );
 
-        my $queues = $admin->child( queues => title => loc('Queues'), path => '/Admin/Queues/', );
+        my $queues = $admin->child( queues => title => loc('Queues'),
+                                    path => '/Admin/Queues/', );
         $queues->child( loc('Select'), path => "/Admin/Queues/" );
-        $queues->child( loc('Create'), path => "/Admin/Queues/Modify.html?Create=1" );
-        my $cfs = $admin->child( 'custom-fields' => title => loc('Custom Fields'), path => '/Admin/CustomFields/',
-        );
-        $cfs->child( select => title => loc('Select'), path => "/Admin/CustomFields/" );
-        $cfs->child( create => title => loc('Create'), path => "/Admin/CustomFields/Modify.html?Create=1" );
-
-        my $admin_global
-            = $admin->child( global=> title => loc('Global'), path => '/Admin/Global/', );
-
-        my $scrips = $admin_global->child( loc('Scrips'), path => '/Admin/Global/Scrips.html', );
+        $queues->child( loc('Create'),
+                        path => "/Admin/Queues/Modify.html?Create=1" );
+        my $cfs = $admin->child(
+                             'custom-fields' => title => loc('Custom Fields'),
+                             path => '/Admin/CustomFields/', );
+        $cfs->child( select => title => loc('Select'),
+                     path   => "/Admin/CustomFields/" );
+        $cfs->child( create => title => loc('Create'),
+                     path => "/Admin/CustomFields/Modify.html?Create=1" );
+
+        my $admin_global =
+            $admin->child( global => title => loc('Global'),
+                           path   => '/Admin/Global/', );
+
+        my $scrips = $admin_global->child( loc('Scrips'),
+                                        path => '/Admin/Global/Scrips.html', );
         $scrips->child( loc('Select'), path => "/Admin/Global/Scrips.html" );
-        $scrips->child( loc('Create'), path => "/Admin/Global/Scrip.html?Create=1" );
+        $scrips->child( loc('Create'),
+                        path => "/Admin/Global/Scrip.html?Create=1" );
         my $templates = $admin_global->child( loc('Templates'),
-                              path => '/Admin/Global/Templates.html', );
-        $templates->child( loc('Select'), path => "/Admin/Global/Templates.html" );
-        $templates->child( loc('Create'), path => "/Admin/Global/Template.html?Create=1" );
+                                    path => '/Admin/Global/Templates.html', );
+        $templates->child( loc('Select'),
+                           path => "/Admin/Global/Templates.html" );
+        $templates->child( loc('Create'),
+                           path => "/Admin/Global/Template.html?Create=1" );
 
 #        my $workflows = $admin_global->child( loc('Workflows'), path => '/Admin/Global/Workflows/index.html', );
 #        {
@@ -206,7 +219,8 @@ if ( $request_path =~ qr{.*} ) {
     }
     my $about_me = Menu->child(
                     'preferences' => title =>
-                        loc('Logged in as <span class="current-user">[_1]</span>',
+                        loc(
+                        'Logged in as <span class="current-user">[_1]</span>',
                         $session{'CurrentUser'}->Name
                         ),
                     escape_title => 0,
@@ -217,8 +231,10 @@ if ( $request_path =~ qr{.*} ) {
                                                Object => $RT::System )
        )
     {
-        $about_me->child( settings => title => loc('Settings'), path => '/Prefs/Other.html', );
-        $about_me->child( about_me => title => loc('About me'), path => '/User/Prefs.html', );
+        $about_me->child( settings => title => loc('Settings'),
+                          path     => '/Prefs/Other.html', );
+        $about_me->child( about_me => title => loc('About me'),
+                          path     => '/User/Prefs.html', );
         $about_me->child( search_options => title => loc('Search options'),
                           path => '/Prefs/SearchOptions.html', );
         $about_me->child( myrt => title => loc('RT at a glance'),
@@ -261,7 +277,7 @@ if ( $request_path =~ qr'Dashboards/(\d+)?' ) {
             $tabs->child( loc('Content'),
                           path => "/Dashboards/Queries.html?id=" . $obj->id );
             $tabs->child( loc('Subscription'),
-                         path => "/Dashboards/Subscription.html?id=" . $obj->id )
+                      path => "/Dashboards/Subscription.html?id=" . $obj->id )
                 if $obj->CurrentUserCanSubscribe;
             $tabs->child( loc('Show'),
                         path => "/Dashboards/" . $obj->id . "/" . $obj->Name )
@@ -308,52 +324,67 @@ if ( $request_path =~ qr'/SelfService' ) {
 }
 
 if ( $request_path =~ qr'Admin/Queues' ) {
-    if ( $session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminQueue' ) )
+    if ( $session{'CurrentUser'}
+         ->HasRight( Object => $RT::System, Right => 'AdminQueue' ) )
     {
     }
-    if ( my $id = $m->request_args->{'id'} ||$m->request_args->{'Queue'}) {
+    if ( my $id = $m->request_args->{'id'} || $m->request_args->{'Queue'} ) {
         my $queue_obj = RT::Queue->new( $session{'CurrentUser'} );
         $queue_obj->Load($id);
 
         my $queue = PageMenu();
-        $queue->child( basics => title =>loc('Basics'),
+        $queue->child( basics => title => loc('Basics'),
                        path => "/Admin/Queues/Modify.html?id=" . $id );
         $queue->child( people => title => loc('Watchers'),
                        path => "/Admin/Queues/People.html?id=" . $id );
-        my $templates = $queue->child( templates => title => loc('Templates'),
-                       path => "/Admin/Queues/Templates.html?id=" . $id );
-
-
-
-        $templates->child( select => title => loc('Select'), path => "/Admin/Queues/Templates.html?id=".$id );
-        $templates->child( create => title =>  loc('Create'), path  => "/Admin/Queues/Template.html?Create=1;Queue=".$id );
-
-        my $scrips = $queue->child( scrips => title => loc('Scrips'),
-                       path => "/Admin/Queues/Scrips.html?id=" . $id );
-
-
-
-        $scrips->child( select => title => loc('Select'), path => "/Admin/Queues/Scrips.html?id=".$id );
-        $scrips->child( create => title =>  loc('Create'), path  => "/Admin/Queues/Scrip.html?Create=1;Queue=".$id );
-
+        my $templates = $queue->child(
+                              templates => title => loc('Templates'),
+                              path => "/Admin/Queues/Templates.html?id=" . $id
+        );
 
+        $templates->child( select => title => loc('Select'),
+                           path => "/Admin/Queues/Templates.html?id=" . $id );
+        $templates->child(
+                   create => title => loc('Create'),
+                   path => "/Admin/Queues/Template.html?Create=1;Queue=" . $id
+        );
 
+        my $scrips = $queue->child(
+                                 scrips => title => loc('Scrips'),
+                                 path => "/Admin/Queues/Scrips.html?id=" . $id
+        );
 
+        $scrips->child( select => title => loc('Select'),
+                        path => "/Admin/Queues/Scrips.html?id=" . $id );
+        $scrips->child(
+                      create => title => loc('Create'),
+                      path => "/Admin/Queues/Scrip.html?Create=1;Queue=" . $id
+        );
 
-        my $ticket_cfs = $queue->child( loc('Ticket Custom Fields'), path => '/Admin/Queues/CustomFields.html?SubType=RT::Ticket&id=' . $id );
+        my $ticket_cfs = $queue->child( loc('Ticket Custom Fields'),
+              path => '/Admin/Queues/CustomFields.html?SubType=RT::Ticket&id='
+                  . $id );
 
-        my $txn_cfs = $queue->child( loc('Transaction Custom Fields'), path => '/Admin/Queues/CustomFields.html?SubType=RT::Ticket-RT::Transaction&id=' . $id );
+        my $txn_cfs = $queue->child( loc('Transaction Custom Fields'),
+            path =>
+                '/Admin/Queues/CustomFields.html?SubType=RT::Ticket-RT::Transaction&id='
+                . $id );
 
-        $queue->child( loc('Group Rights'), path => "/Admin/Queues/GroupRights.html?id=" . $id );
-        $queue->child( loc('User Rights'), path => "/Admin/Queues/UserRights.html?id=" . $id );
+        $queue->child( loc('Group Rights'),
+                       path => "/Admin/Queues/GroupRights.html?id=" . $id );
+        $queue->child( loc('User Rights'),
+                       path => "/Admin/Queues/UserRights.html?id=" . $id );
     }
 }
 
 if ( $request_path =~ qr'/Admin/Users' ) {
-    if ( $session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminUsers' ) )
+    if ( $session{'CurrentUser'}
+         ->HasRight( Object => $RT::System, Right => 'AdminUsers' ) )
     {
-        PageMenu->child( select => title => loc('Select'), path => "/Admin/Users/" );
-        PageMenu->child( create => title => loc('Create'), path => "/Admin/Users/Modify.html?Create=1" );
+        PageMenu->child( select => title => loc('Select'),
+                         path   => "/Admin/Users/" );
+        PageMenu->child( create => title => loc('Create'),
+                         path => "/Admin/Users/Modify.html?Create=1" );
     }
     if ( my $id = $m->request_args->{'id'} ) {
         my $obj = RT::User->new( $session{'CurrentUser'} );
@@ -388,21 +419,22 @@ if ( $request_path =~ qr'Admin/Groups' ) {
         my $obj = RT::Group->new( $session{'CurrentUser'} );
         $obj->Load($id);
         my $tabs = PageMenu->child( $obj->Name,
-                        path => "/Admin/Groups/Modify.html?id=" . $id );
-        $tabs->child( loc('Basics') => path => "/Admin/Groups/Modify.html?id="
+                    path => "/Admin/Groups/Modify.html?id=" . $id );
+        $tabs->child(
+                  loc('Basics') => path => "/Admin/Groups/Modify.html?id="
                       . $obj->id );
         $tabs->child(
-                    loc('Members') => path => "/Admin/Groups/Members.html?id="
-                        . $obj->id );
+                loc('Members') => path => "/Admin/Groups/Members.html?id="
+                    . $obj->id );
         $tabs->child( loc('Group Rights') => path =>
                       "/Admin/Groups/GroupRights.html?id=" . $obj->id );
+        $tabs->child( loc('User Rights') => path =>
+                      "/Admin/Groups/UserRights.html?id=" . $obj->id );
         $tabs->child(
-             loc('User Rights') => path => "/Admin/Groups/UserRights.html?id="
-                 . $obj->id );
-        $tabs->child(
-                    loc('History') => path => "/Admin/Groups/History.html?id="
-                        . $obj->id );
+                loc('History') => path => "/Admin/Groups/History.html?id="
+                    . $obj->id );
     }
+
 }
 
 if ( $request_path =~ qr'Admin/CustomFields/' ) {
@@ -444,8 +476,9 @@ if ( $request_path =~ qr'Admin/Rules' ) {
 }
 
 if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
-    my $search = Menu()->child('search');
-    my $actions = PageMenu()->child( transitions => title => loc('Actions'), sort_order => 99 );
+    my $search  = Menu()->child('search');
+    my $actions = PageMenu()
+        ->child( transitions => title => loc('Actions'), sort_order => 99 );
     if ( ( $m->request_args->{'id'} || '' ) =~ /^(\d+)$/ ) {
         my $id  = $1;
         my $obj = RT::Ticket->new( $session{'CurrentUser'} );
@@ -499,9 +532,12 @@ if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
                                          );
                 } else {
 
-                   $url .= "Display.html?" .$query_string->(Status => $next, id => $id );
+                    $url .= "Display.html?"
+                        . $query_string->( Status => $next, id => $id );
                 }
-                $actions->child( loc( $schema->transition_label( $current => $next ) ) => path => $url );
+                $actions->child(
+                      loc( $schema->transition_label( $current => $next ) ) =>
+                          path => $url );
             }
 
         }
@@ -587,17 +623,20 @@ if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
         Order => $m->request_args->{'Order'} || $current_search->{'Order'},
         Page  => $m->request_args->{'Page'}  || $current_search->{'Page'},
         RowsPerPage => ( defined $m->request_args->{'RowsPerPage'}
-                           ? $m->request_args->{'RowsPerPage'}
-                           : $current_search->{'RowsPerPage'}
-                         )
+                         ? $m->request_args->{'RowsPerPage'}
+                         : $current_search->{'RowsPerPage'}
+                       )
                      );
 
     $args = "?" . $query_string->(%query_args);
 
-
-        my $current_search_menu = $search->child( current_search => title => loc('Current Search'));
-        $current_search_menu->child( edit_search => title => loc('Edit Search') => path => "/Search/Build.html" . ( ($has_query) ? $args : '' ) );
-        $current_search_menu->child( loc('Advanced') => path => "/Search/Edit.html$args" );
+    my $current_search_menu
+        = $search->child( current_search => title => loc('Current Search') );
+    $current_search_menu->child(
+                   edit_search => title => loc('Edit Search') => path =>
+                       "/Search/Build.html" . ( ($has_query) ? $args : '' ) );
+    $current_search_menu->child(
+                        loc('Advanced') => path => "/Search/Edit.html$args" );
     if ($has_query) {
         if ($request_path =~ qr|^Search/Results.html|
             &&                        #XXX TODO better abstraction
@@ -607,67 +646,64 @@ if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
         {
             my $shred_args =
                 URI->new->query_param(
-                               search          => 1,
-                               plugin          => 'Tickets',
-                               'Tickets:query' => $query_args{'Query'},
-                               'Tickets:limit' => $query_args{'RowsPerPage'}
+                                 search          => 1,
+                                 plugin          => 'Tickets',
+                                 'Tickets:query' => $query_args{'Query'},
+                                 'Tickets:limit' => $query_args{'RowsPerPage'}
                 );
 
-            $current_search_menu->child( 'shredder' => title => loc('Shredder'),
-                            path => 'Admin/Tools/Shredder/?' . $shred_args );
+            $current_search_menu->child(
+                                'shredder' => title => loc('Shredder'),
+                                path => 'Admin/Tools/Shredder/?' . $shred_args
+            );
         }
 
-        $current_search_menu->child( results => title =>
-                 loc('Show Results') => path => "/Search/Results.html$args" );
+        $current_search_menu->child(
+                            results => title => loc('Show Results') => path =>
+                                "/Search/Results.html$args" );
 
-        $current_search_menu->child( bulk => title =>
-                     loc('Bulk Update') => path => "/Search/Bulk.html$args" );
+        $current_search_menu->child(
+                                bulk => title => loc('Bulk Update') => path =>
+                                    "/Search/Bulk.html$args" );
 
     }
 
 }
 
+if ( $request_path =~ /^\/(?:index.html|$)/ ) {
 
-    if ( $request_path =~ /^\/(?:index.html|$)/ ) {
+    my @dashboards = $m->comp("/Dashboards/Elements/ListOfDashboards");
+    my $limit      = 7;
 
-        my @dashboards = $m->comp("/Dashboards/Elements/ListOfDashboards");
-        my $limit      = 7;
-
-        $m->callback( Dashboards   => \@dashboards,
-                      Limit        => \$limit,
-                      CallbackName => 'MassageDashboards',
-                    );
+    $m->callback( Dashboards   => \@dashboards,
+                  Limit        => \$limit,
+                  CallbackName => 'MassageDashboards',
+                );
 
-        my $more = 0;
-        if ( @dashboards > $limit ) {
-            $more = 1;
-            splice @dashboards, $limit;
-        }
+    my $more = 0;
+    if ( @dashboards > $limit ) {
+        $more = 1;
+        splice @dashboards, $limit;
+    }
 
-        my $position = 0;
+    my $position = 0;
 
-        for my $dash (@dashboards) {
-            PageMenu->child(
-                        'dashboard-' . $dash->id,
+    for my $dash (@dashboards) {
+        PageMenu->child('dashboard-' . $dash->id,
                         title => $dash->Name,
                         path => 'Dashboards/' . $dash->id . '/' . $dash->Name,
-            );
-        }
-
-        PageMenu()->child( home => title => loc('Home'), path => 'index.html' );
-
-        if ($more) {
-            $tabs->{"D-more"} = { title => loc('More'),
-                                  path  => 'Dashboards/index.html',
-                                };
-        }
-
+                       );
     }
 
+    PageMenu()->child( home => title => loc('Home'), path => 'index.html' );
 
+    if ($more) {
+        $tabs->{"D-more"} = { title => loc('More'),
+                              path  => 'Dashboards/index.html',
+                            };
+    }
 
-
-
+}
 
 
 </%INIT>

commit 21a611f5e14f44be59e9ce728744f0c1c88d56cf
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Fri Nov 5 02:18:44 2010 -0400

    Respect Order and OrderBy in search tab

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index b211fee..e2e1fb9 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -627,6 +627,12 @@ if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
                          : $current_search->{'RowsPerPage'}
                        )
                      );
+    for my $field (qw(Order OrderBy)) {
+        if (ref($query_args{$field}) eq 'ARRAY') {
+        $query_args{$field} = join("|",@{$query_args{$field}});
+        }
+    }
+
 
     $args = "?" . $query_string->(%query_args);
 

commit 7e138dd5d6d0d9ac152fbba68b3c4be586fd35f6
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Mon Nov 1 20:05:42 2010 -0400

    Add back 'Offline' and 'Watching Queues' under Tools

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index e2e1fb9..ea96f73 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -106,7 +106,11 @@ if ( $request_path =~ qr{.*} ) {
     $reports->child( loc('Created in a date range'),
                      path => '/Tools/Reports/CreatedByDates.html', );
 
-    $tools->child( loc('My Day'), path => '/Tools/MyDay.html' );
+    $tools->child( my_day => title => loc('My Day'), path => '/Tools/MyDay.html' );
+
+    $tools->child( offline => title => loc('Offline'), path => '/Tools/Offline.html');
+    $tools->child( watching => title => loc('Watching Queues'), path => '/Tools/Watching.html');
+
     if ( $session{'CurrentUser'}
          ->HasRight( Right => 'ShowApprovalsTab', Object => $RT::System ) )
     {

commit 3969569308d9d95718c7dad0d16c71bbd9b84c5d
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Mon Nov 1 22:07:55 2010 -0400

    Bring back bookmark ("star") links

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index ea96f73..d88976c 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -490,6 +490,7 @@ if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
 
         my $tabs = PageMenu()
             ; #->child( "#" . $id => class => "currentnav",path => "/Ticket/Display.html?id=" . $id);
+        $tabs->child ( bookmark => title => $m->scomp( '/Ticket/Elements/Bookmark', id => $id ), escape_title => 0, link_item => 0);
 
         $tabs->child(
                  loc('Display') => path => "/Ticket/Display.html?id=" . $id );
@@ -566,7 +567,6 @@ if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
                              "/Ticket/Update.html?action=comment&id=" . $id );
         }
 
-# $actions->{'_ZZ'} = { html => $m->scomp( '/Ticket/Elements/Bookmark', id => $obj->id ), };
 
         if ( defined $session{"tickets"} ) {
 

commit 5ca0b8c5569b02642444fb7e7af2d21aa00e2543
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Fri Nov 5 01:05:20 2010 -0400

    Fix dashboard tests

diff --git a/t/web/dashboard_with_deleted_saved_search.t b/t/web/dashboard_with_deleted_saved_search.t
index a7225ce..60c0179 100644
--- a/t/web/dashboard_with_deleted_saved_search.t
+++ b/t/web/dashboard_with_deleted_saved_search.t
@@ -39,7 +39,7 @@ $m->submit_form(
 );
 
 $m->content_contains('Saved dashboard bar', 'dashboard saved' );
-my $dashboard_queries_link = $m->find_link( text_regex => qr/Queries/ );
+my $dashboard_queries_link = $m->find_link( text_regex => qr/Content/ );
 my ( $dashboard_id ) = $dashboard_queries_link->url =~ /id=(\d+)/;
 
 $m->get_ok( $url . "/Dashboards/Queries.html?id=$dashboard_id" );
diff --git a/t/web/dashboards-groups.t b/t/web/dashboards-groups.t
index fef7755..668fa84 100644
--- a/t/web/dashboards-groups.t
+++ b/t/web/dashboards-groups.t
@@ -1,7 +1,7 @@
 #!/usr/bin/perl -w
 use strict;
 
-use RT::Test nodata => 1, tests => 39;
+use RT::Test nodata => 1, tests => 35;
 my ($baseurl, $m) = RT::Test->started_ok;
 
 my $url = $m->rt_base_url;
@@ -69,7 +69,14 @@ $m->field("Privacy" => "RT::Group-" . $inner_group->Id);
 $m->content_lacks('Delete', "Delete button hidden because we are creating");
 
 $m->click_button(value => 'Create');
-$m->content_lacks("No permission to create dashboards");
+
+$m->content_contains("Permission denied", "we lack SeeGroupDashboard");
+$user_obj->PrincipalObj->GrantRight(
+    Right  => 'SeeGroupDashboard',
+    Object => $inner_group,
+);
+$m->reload;
+$m->content_lacks("Permission denied", "we now have SeeGroupDashboard");
 $m->content_contains("Saved dashboard inner dashboard");
 $m->content_lacks('Delete', "Delete button hidden because we lack DeleteDashboard");
 
@@ -82,18 +89,10 @@ is($dashboard->Name, "inner dashboard");
 is($dashboard->Privacy, 'RT::Group-' . $inner_group->Id, "correct privacy");
 is($dashboard->PossibleHiddenSearches, 0, "all searches are visible");
 
-$m->no_warnings_ok;
+$m->warning_like(qr/Permission denied/, "got a permission denied warning when trying to see the dashboard");
 
 $m->get_ok("/Dashboards/Modify.html?id=$id");
-$m->content_lacks("inner dashboard", "no SeeGroupDashboard right");
-$m->content_contains("Permission denied");
-
-$m->warning_like(qr/Permission denied/, "got a permission denied warning");
-
-$user_obj->PrincipalObj->GrantRight(Right => 'SeeGroupDashboard', Object => $inner_group);
-$m->get_ok("/Dashboards/Modify.html?id=$id");
 $m->content_contains("inner dashboard", "we now have SeeGroupDashboard right");
 $m->content_lacks("Permission denied");
-
 $m->content_contains('Subscription', "Subscription link not hidden because we have SubscribeDashboard");
 
diff --git a/t/web/dashboards.t b/t/web/dashboards.t
index dd3de37..b5d07d9 100644
--- a/t/web/dashboards.t
+++ b/t/web/dashboards.t
@@ -1,7 +1,7 @@
 #!/usr/bin/perl -w
 use strict;
 
-use RT::Test tests => 109;
+use RT::Test tests => 110;
 my ($baseurl, $m) = RT::Test->started_ok;
 
 my $url = $m->rt_base_url;
@@ -63,20 +63,19 @@ $m->content_contains("Create");
 
 $m->get_ok($url."Dashboards/index.html");
 $m->content_contains("New", "'New' link because we now have ModifyOwnDashboard");
-
 $m->follow_link_ok({ id => 'tools-dashboards-create'});
 $m->form_name('ModifyDashboard');
 $m->field("Name" => 'different dashboard');
 $m->content_lacks('Delete', "Delete button hidden because we are creating");
 $m->click_button(value => 'Create');
-$m->content_lacks("No permission to create dashboards");
-$m->content_contains("Saved dashboard different dashboard");
-$m->content_lacks('Delete', "Delete button hidden because we lack DeleteOwnDashboard");
-
-$m->get_ok($url."Dashboards/index.html");
-$m->content_lacks("different dashboard", "we lack SeeOwnDashboard");
 
+$m->content_contains("Permission denied", "we lack SeeOwnDashboard");
 $user_obj->PrincipalObj->GrantRight(Right => 'SeeOwnDashboard', Object => $RT::System);
+$m->reload;
+$m->content_lacks("Permission denied", "we now have SeeOwnDashboard");
+$m->content_contains("Saved dashboard different dashboard");
+$m->content_lacks('Delete', "Delete button hidden because we lack DeleteOwnDashboard");
+$m->warning_like(qr/Permission denied/, "got a permission denied warning when trying to see the dashboard");
 
 $m->get_ok($url."Dashboards/index.html");
 $m->content_contains("different dashboard", "we now have SeeOwnDashboard");
@@ -84,13 +83,13 @@ $m->content_lacks("Permission denied");
 
 $m->follow_link_ok({text => "different dashboard"});
 $m->content_contains("Basics");
-$m->content_contains("Queries");
+$m->content_contains("Content");
 $m->content_lacks("Subscription", "we don't have the SubscribeDashboard right");
 
 $m->follow_link_ok({text => "Basics"});
 $m->content_contains("Modify the dashboard different dashboard");
 
-$m->follow_link_ok({text => "Queries"});
+$m->follow_link_ok({text => "Content"});
 $m->content_contains("Modify the queries of dashboard different dashboard");
 my $form = $m->form_name('Dashboard-Searches-body');
 my @input = $form->find_input('Searches-body-Available');
@@ -144,13 +143,15 @@ $ticket->Create(
 $m->follow_link_ok({id => 'page-show'});
 $m->content_contains("50 highest priority tickets I own");
 $m->content_contains("50 newest unowned tickets");
-$m->content_lacks("Bookmarked Tickets");
+$m->content_unlike( qr/Bookmarked Tickets.*Bookmarked Tickets/s,
+    'only dashboard queries show up' );
 $m->content_contains("dashboard test", "ticket subject");
 
 $m->get_ok("/Dashboards/$id/This fragment left intentionally blank");
 $m->content_contains("50 highest priority tickets I own");
 $m->content_contains("50 newest unowned tickets");
-$m->content_lacks("Bookmarked Tickets");
+$m->content_unlike( qr/Bookmarked Tickets.*Bookmarked Tickets/s,
+    'only dashboard queries show up' );
 $m->content_contains("dashboard test", "ticket subject");
 
 $m->get_ok("/Dashboards/Subscription.html?id=$id");
@@ -169,7 +170,8 @@ $m->follow_link_ok({text => "Subscription"});
 $m->content_contains("Subscribe to dashboard different dashboard");
 $m->content_contains("Unowned Tickets");
 $m->content_contains("My Tickets");
-$m->content_lacks("Bookmarked Tickets", "only dashboard queries show up");
+$m->content_unlike( qr/Bookmarked Tickets.*Bookmarked Tickets/s,
+    'only dashboard queries show up' );
 
 $m->form_name('SubscribeDashboard');
 $m->click_button(name => 'Save');

commit 0ba5edea9fe05c5ca72d2d4c1af13c594345a22c
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Fri Nov 5 01:19:09 2010 -0400

    Add and reorganize more menus

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index d88976c..2aebe1b 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -211,13 +211,15 @@ if ( $request_path =~ qr{.*} ) {
                               path => '/Admin/Global/UserRights.html', );
         $admin_global->child( loc('RT at a glance'),
                               path => '/Admin/Global/MyRT.html', );
-        $admin_global->child( loc('System'),
-                              path => '/Admin/Global/System.html', );
+        $admin_global->child( loc('Theme'),
+                              path => '/Admin/Global/Theme.html', );
 
         my $admin_tools
             = $admin->child( loc('Tools'), path => '/Admin/Tools/', );
         $admin_tools->child( loc('System Configuration'),
                              path => '/Admin/Tools/Configuration.html', );
+        $admin_tools->child( loc('SQL Queries'),
+                             path => '/Admin/Tools/Queries.html', );
         $admin_tools->child( loc('Shredder'),
                              path => '/Admin/Tools/Shredder', );
     }
@@ -235,25 +237,26 @@ if ( $request_path =~ qr{.*} ) {
                                                Object => $RT::System )
        )
     {
-        $about_me->child( settings => title => loc('Settings'),
+        my $settings = $about_me->child( settings => title => loc('Settings'),
                           path     => '/Prefs/Other.html', );
-        $about_me->child( about_me => title => loc('About me'),
+        $settings->child( about_me => title => loc('About me'),
                           path     => '/User/Prefs.html', );
-        $about_me->child( search_options => title => loc('Search options'),
+        $settings->child( search_options => title => loc('Search options'),
                           path => '/Prefs/SearchOptions.html', );
-        $about_me->child( myrt => title => loc('RT at a glance'),
+        $settings->child( myrt => title => loc('RT at a glance'),
                           path => '/Prefs/MyRT.html', );
-        $about_me->child( quicksearch => title => 'Quick search' => title =>
+        $settings->child( quicksearch => title => 'Quick search' => title =>
                               loc('Quick search'),
                           path => '/Prefs/Quicksearch.html'
                         );
 
+        my $search_menu = $settings->child( 'saved-searches' => title => 'Saved Searches');
         my $searches = [ $m->comp(
                           "/Search/Elements/SearchesForObject",
                           Object => RT::System->new( $session{'CurrentUser'} )) ];
         my $i = 0;
         for my $search (@$searches) {
-            $about_me->child( "search-" . $i++,
+            $search_menu->child( "search-" . $i++,
                       title => $search->[0],
                       path  => "/Prefs/Search.html?" . $query_string->(
                           name => ref( $search->[1] ) . '-' . $search->[1]->Id),

commit f691fb8e1e0be3247ad82e9a5fef932d6929c29b
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Tue Nov 2 16:03:32 2010 +0800

    update walk.t

diff --git a/t/web/walk.t b/t/web/walk.t
index 87a78c2..af41398 100644
--- a/t/web/walk.t
+++ b/t/web/walk.t
@@ -52,8 +52,8 @@ diag 'walk into /Admin' if $ENV{TEST_VERBOSE};
         $m->back;
 
         $m->follow_link_ok( { text => 'root' }, '-> root' );
-        for my $tab ( 'History', 'Memberships', 'RT at a glance', 'Basics' ) {
-            $m->follow_link_ok( { text => $tab }, "-> $tab" );
+        for my $id ( 'rt-at-a-glance', 'memberships', 'history', 'basics' ) {
+            $m->follow_link_ok( { id => 'page-current-' . $id }, "-> $id" );
         }
     }
 
@@ -69,10 +69,10 @@ diag 'walk into /Admin' if $ENV{TEST_VERBOSE};
         $m->back;
 
         $m->follow_link_ok( { text => 'group_foo' }, '-> group_foo' );
-        for my $tab ( 'History', 'Members', 'Group Rights', 'User Rights',
-            'Basics' )
+        for my $id ( 'history', 'members', 'group-rights', 'user-rights',
+            'basics' )
         {
-            $m->follow_link_ok( { text => $tab }, "-> $tab" );
+            $m->follow_link_ok( { id => 'page-group_foo-' . $id }, "-> $id" );
         }
     }
 
@@ -85,22 +85,27 @@ diag 'walk into /Admin' if $ENV{TEST_VERBOSE};
         $m->back;
 
         $m->follow_link_ok( { text => 'General' }, '-> General' );
-        for my $tab (
-            'Watchers',                  'Scrips',
-            'Templates',                 'Ticket Custom Fields',
-            'Transaction Custom Fields', 'Group Rights',
-            'User Rights',               'History',
-            'Basics',
+        for my $id (
+            'people',                    'scrips',
+            'templates',                 'ticket-custom-fields',
+            'transaction-custom-fields', 'group-rights',
+            'user-rights',               'basics',
           )
         {
-            $m->follow_link_ok( { text => $tab }, "-> $tab" );
+            $m->follow_link_ok( { id => 'page-' . $id }, "-> $id" );
         }
     }
 
     diag 'walk into /Admin/CustomFields' if $ENV{TEST_VERBOSE};
     {
         my $cf = RT::CustomField->new($RT::SystemUser);
-        ok( $cf->Create( Name => 'cf_foo', Type => 'Freeform' ) );
+        ok(
+            $cf->Create(
+                Name       => 'cf_foo',
+                Type       => 'Freeform',
+                LookupType => 'RT::Queue-RT::Ticket',
+            )
+        );
         $m->get_ok( $baseurl, 'homepage' );
         $m->follow_link_ok( { text => 'Configuration' }, '-> Configuration' );
         $m->follow_link_ok( { text => 'Custom Fields' }, '-> Custom Fields' );
@@ -109,12 +114,8 @@ diag 'walk into /Admin' if $ENV{TEST_VERBOSE};
 
         $m->follow_link_ok( { text => 'cf_foo' }, '-> cf_foo' );
 
-        for my $tab ( 'Applies to', 'Group Rights', 'User Rights', 'Basics' ) {
-
-            # very weird, 'Applies to' fails with ->follow_link_ok
-            #        $m->follow_link_ok( { text => $tab }, "-> $tab" );
-            $m->follow_link( text => $tab );
-            is( $m->status, 200, "-> $tab" );
+        for my $id ( 'applies-to', 'group-rights', 'user-rights', 'basics' ) {
+            $m->follow_link_ok( { id => 'page-cf_foo-' . $id }, "-> $id" );
         }
     }
 
@@ -124,11 +125,9 @@ diag 'walk into /Admin' if $ENV{TEST_VERBOSE};
         $m->follow_link_ok( { text => 'Configuration' }, '-> Configuration' );
         $m->follow_link_ok( { text => 'Tools' },         '-> Tools' );
 
-        for my $tab ( 'System Configuration', 'SQL Queries', 'Shredder' ) {
-
-            #            $m->follow_link_ok( { text => $tab }, "-> $stab" );
-            $m->follow_link( text => $tab );
-            is( $m->status, 200, "-> $tab" );
+        for my $tab ( 'Configuration.html', 'Queries.html', 'Shredder' ) {
+            $m->follow_link_ok( { url_regex => qr!/Admin/Tools/$tab! },
+                "-> /Admin/Tools/$tab" );
         }
     }
 
@@ -138,32 +137,21 @@ diag 'walk into /Admin' if $ENV{TEST_VERBOSE};
         $m->follow_link_ok( { text => 'Configuration' }, '-> Configuration' );
         $m->follow_link_ok( { text => 'Global' },        '-> Global' );
 
-        for my $tab ( 'Group Rights', 'User Rights', 'RT at a glance', 'Theme' )
+        for my $id ( 'group-rights', 'user-rights', 'rt-at-a-glance', 'theme' )
         {
-            $m->follow_link_ok( { text => $tab }, "-> $tab" );
+            $m->follow_link_ok( { id => 'config-global-' . $id }, "-> $id" );
         }
 
-        for my $tab ( 'Scrips', 'Templates' ) {
-            $m->follow_link_ok( { text => 'Global' }, '-> Global' );
-            $m->follow_link_ok( { text => $tab },     "-> $tab" );
-            $m->follow_link_ok( { text => 'Create' }, '-> Create' );
-            $m->back;
-            $m->follow_link_ok( { text => '1' },      '-> 1' );
-            $m->follow_link_ok( { text => 'Select' }, '-> Select' );
+        for my $tab ( 'scrips', 'templates' ) {
+            $m->follow_link_ok( { id => "config-global-" . $tab }, "-> $tab" );
+            for my $id (qw/create select/) {
+                $m->follow_link_ok( { id => "config-global-" . $tab . "-$id" },
+                    "-> $id" );
+            }
+            $m->follow_link_ok( { text => '1' }, '-> 1' );
         }
     }
 
-    diag 'walk into /Prefs' if $ENV{TEST_VERBOSE};
-    {
-        $m->get_ok( $baseurl, 'homepage' );
-        $m->follow_link_ok( { text => 'Preferences' }, '-> Preferences' );
-
-        for
-          my $tab ( 'Settings', 'About me', 'Search options', 'RT at a glance' )
-        {
-            $m->follow_link_ok( { text => $tab }, "-> $tab" );
-        }
-    }
 }
 
 diag 'walk into /Approvals' if $ENV{TEST_VERBOSE};
@@ -175,3 +163,14 @@ diag 'walk into /Approvals' if $ENV{TEST_VERBOSE};
     is( $m->status, 200, '-> Approvals' );
 }
 
+diag 'walk into /Prefs' if $ENV{TEST_VERBOSE};
+{
+    for my $id (
+        'settings',    'about_me', 'search_options', 'myrt',
+        'quicksearch', 'search-0', 'search-1',       'search-2',
+        'logout'
+      )
+    {
+        $m->follow_link_ok( { id => 'preferences-' . $id }, "-> $id" );
+    }
+}

commit a203975095e57f42506ec0f74141ae8c631980bf
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Tue Nov 2 09:51:33 2010 -0400

    add more unique ids to some menu items

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 2aebe1b..b4da748 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -114,17 +114,17 @@ if ( $request_path =~ qr{.*} ) {
     if ( $session{'CurrentUser'}
          ->HasRight( Right => 'ShowApprovalsTab', Object => $RT::System ) )
     {
-        $tools->child( loc('Approval'), path => '/Approvals/' );
+        $tools->child( approval => title => loc('Approval'), path => '/Approvals/' );
     }
 
     if ( $session{'CurrentUser'}
          ->HasRight( Right => 'ShowConfigTab', Object => $RT::System ) )
     {
-        my $admin = Menu->child( Config => title => loc('Configuration'),
+        my $admin = Menu->child( config => title => loc('Configuration'),
                                  path   => '/Admin/' );
-        my $users = $admin->child( loc('Users'), path => '/Admin/Users/', );
-        $users->child( loc('Select'), path => "/Admin/Users/" );
-        $users->child( loc('Create'),
+        my $users = $admin->child( users => title => loc('Users'), path => '/Admin/Users/', );
+        $users->child( select => title => loc('Select'), path => "/Admin/Users/" );
+        $users->child( create => title => loc('Create'),
                        path => "/Admin/Users/Modify.html?Create=1" );
 
         my $groups

commit 9bf492abf65d8948f14416607e9a3685c966f9a9
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Tue Nov 2 09:52:01 2010 -0400

    move Configuration to live under the Tools menu

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index b4da748..0771803 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -120,7 +120,7 @@ if ( $request_path =~ qr{.*} ) {
     if ( $session{'CurrentUser'}
          ->HasRight( Right => 'ShowConfigTab', Object => $RT::System ) )
     {
-        my $admin = Menu->child( config => title => loc('Configuration'),
+        my $admin = $tools->child( config => title => loc('Configuration'),
                                  path   => '/Admin/' );
         my $users = $admin->child( users => title => loc('Users'), path => '/Admin/Users/', );
         $users->child( select => title => loc('Select'), path => "/Admin/Users/" );
diff --git a/t/ticket/scrips_batch.t b/t/ticket/scrips_batch.t
index d4004fb..1cfc732 100644
--- a/t/ticket/scrips_batch.t
+++ b/t/ticket/scrips_batch.t
@@ -16,7 +16,7 @@ ok $m->login, 'logged in as root';
 
 my $sid;
 {
-    $m->follow_link_ok( { id => 'config-queues' } );
+    $m->follow_link_ok( { id => 'tools-config-queues' } );
     $m->follow_link_ok( { text => $queue->Name } );
     $m->follow_link_ok( { id => 'page-scrips-create'});
     $m->form_name('ModifyScrip');
diff --git a/t/web/cf_access.t b/t/web/cf_access.t
index 2a183a8..cf7279f 100644
--- a/t/web/cf_access.t
+++ b/t/web/cf_access.t
@@ -13,7 +13,7 @@ ok $m->login, 'logged in';
 
 diag "Create a CF";
 {
-    $m->follow_link( id => 'config-custom-fields-create');
+    $m->follow_link( id => 'tools-config-custom-fields-create');
     $m->submit_form(
         form_name => "ModifyCustomField",
         fields => {
@@ -29,7 +29,7 @@ diag "apply the CF to General queue";
 my ( $cf, $cfid, $tid );
 {
     $m->title_is(q/Created CustomField img/, 'admin-cf created');
-    $m->follow_link( id => 'config-queues');
+    $m->follow_link( id => 'tools-config-queues');
     $m->follow_link( text => 'General' );
     $m->title_is(q/Configuration for queue General/, 'admin-queue: general');
     $m->follow_link( id => 'page-ticket-custom-fields');
diff --git a/t/web/cf_date.t b/t/web/cf_date.t
index 7a28806..be421a7 100644
--- a/t/web/cf_date.t
+++ b/t/web/cf_date.t
@@ -15,7 +15,7 @@ my $cf_name = 'test cf date';
 my $cfid;
 diag "Create a CF";
 {
-    $m->follow_link( id => 'config-custom-fields-create');
+    $m->follow_link( id => 'tools-config-custom-fields-create');
     $m->submit_form(
         form_name => "ModifyCustomField",
         fields    => {
@@ -34,7 +34,7 @@ my $queue = RT::Test->load_or_create_queue( Name => 'General' );
 ok $queue && $queue->id, 'loaded or created queue';
 
 {
-    $m->follow_link( id => 'config-queues-select');
+    $m->follow_link( id => 'tools-config-queues-select');
     $m->title_is( q/Admin queues/, 'admin-queues screen' );
     $m->follow_link( text => 'General' );
     $m->title_is( q/Configuration for queue General/,
diff --git a/t/web/cf_datetime.t b/t/web/cf_datetime.t
index 5b67579..95f5c17 100644
--- a/t/web/cf_datetime.t
+++ b/t/web/cf_datetime.t
@@ -16,7 +16,7 @@ my $cf_name = 'test cf datetime';
 my $cfid;
 diag "Create a CF";
 {
-    $m->follow_link( id => 'config-custom-fields-create');
+    $m->follow_link( id => 'tools-config-custom-fields-create');
     $m->submit_form(
         form_name => "ModifyCustomField",
         fields => {
diff --git a/t/web/cf_onqueue.t b/t/web/cf_onqueue.t
index 511606d..2c020b7 100644
--- a/t/web/cf_onqueue.t
+++ b/t/web/cf_onqueue.t
@@ -8,7 +8,7 @@ ok $m->login, 'logged in';
 
 diag "Create a queue CF";
 {
-    $m->follow_link( id => 'config-custom-fields-create');
+    $m->follow_link( id => 'tools-config-custom-fields-create');
     $m->submit_form(
         form_name => "ModifyCustomField",
         fields => {
diff --git a/t/web/cf_select_one.t b/t/web/cf_select_one.t
index 207ffe8..86f05cd 100644
--- a/t/web/cf_select_one.t
+++ b/t/web/cf_select_one.t
@@ -13,7 +13,7 @@ my $cf_name = 'test select one value';
 my $cfid;
 diag "Create a CF";
 {
-    $m->follow_link( id => 'config-custom-fields-create');
+    $m->follow_link( id => 'tools-config-custom-fields-create');
     $m->submit_form(
         form_name => "ModifyCustomField",
         fields => {
@@ -50,7 +50,7 @@ ok $queue && $queue->id, 'loaded or created queue';
 
 diag "apply the CF to General queue";
 {
-    $m->follow_link( id => 'config-queues');
+    $m->follow_link( id => 'tools-config-queues');
     $m->follow_link( text => 'General' );
     $m->title_is(q/Configuration for queue General/, 'admin-queue: general');
     $m->follow_link( id => 'page-ticket-custom-fields');
diff --git a/t/web/html_template.t b/t/web/html_template.t
index b6e9d08..6a2a5be 100644
--- a/t/web/html_template.t
+++ b/t/web/html_template.t
@@ -17,7 +17,7 @@ diag('make Autoreply template a html one and add utf8 chars')
   if $ENV{TEST_VERBOSE};
 
 {
-    $m->follow_link_ok( { id => 'config-global-templates' },     '-> Templates' );
+    $m->follow_link_ok( { id => 'tools-config-global-templates' },     '-> Templates' );
     $m->follow_link_ok( { text => 'Autoreply' },     '-> Autoreply' );
 
     $m->submit_form(
diff --git a/t/web/rights.t b/t/web/rights.t
index 5c7fc2b..63a0878 100644
--- a/t/web/rights.t
+++ b/t/web/rights.t
@@ -7,7 +7,7 @@ use RT::Test tests => 12;
 my ($baseurl, $m) = RT::Test->started_ok;
 ok $m->login, "logged in";
 
-$m->follow_link_ok({ id => 'config-global-group-rights'});
+$m->follow_link_ok({ id => 'tools-config-global-group-rights'});
 
 
 sub get_rights {
diff --git a/t/web/walk.t b/t/web/walk.t
index af41398..90fd030 100644
--- a/t/web/walk.t
+++ b/t/web/walk.t
@@ -139,13 +139,13 @@ diag 'walk into /Admin' if $ENV{TEST_VERBOSE};
 
         for my $id ( 'group-rights', 'user-rights', 'rt-at-a-glance', 'theme' )
         {
-            $m->follow_link_ok( { id => 'config-global-' . $id }, "-> $id" );
+            $m->follow_link_ok( { id => 'tools-config-global-' . $id }, "-> $id" );
         }
 
         for my $tab ( 'scrips', 'templates' ) {
-            $m->follow_link_ok( { id => "config-global-" . $tab }, "-> $tab" );
+            $m->follow_link_ok( { id => "tools-config-global-" . $tab }, "-> $tab" );
             for my $id (qw/create select/) {
-                $m->follow_link_ok( { id => "config-global-" . $tab . "-$id" },
+                $m->follow_link_ok( { id => "tools-config-global-" . $tab . "-$id" },
                     "-> $id" );
             }
             $m->follow_link_ok( { text => '1' }, '-> 1' );

commit 6ef3774b53913c2c96d6bddf4c4142b63ccb9075
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Tue Nov 2 10:24:50 2010 -0400

    cleanup of the top-of-page widgets

diff --git a/share/html/Elements/Widgets b/share/html/Elements/Widgets
index f87a68a..778a846 100644
--- a/share/html/Elements/Widgets
+++ b/share/html/Elements/Widgets
@@ -1,4 +1,4 @@
-<div class="widgets">
+<div id="topactions">
 <& /Elements/SimpleSearch &>
 <& /Elements/CreateTicket &>
 </div>
diff --git a/share/html/NoAuth/css/web2/layout.css b/share/html/NoAuth/css/web2/layout.css
index 511418e..af99a8b 100644
--- a/share/html/NoAuth/css/web2/layout.css
+++ b/share/html/NoAuth/css/web2/layout.css
@@ -84,8 +84,8 @@ div#body {
 #topactions {
  position: absolute;
  background: transparent;
- top: 3.8em; 
- right: 1em;
+ top: 3.2em;
+ right: 0.7em;
  width: auto;
  min-width: 42em;
  font-size: 0.9em;
@@ -169,7 +169,7 @@ div#footer #bpscredits {
 
 /* logo stuff */
 
-div#logo a {
+div#logo {
     position: absolute;
     left: 2px;
     top: 0;
@@ -183,12 +183,11 @@ div#logo a img {
 }
 
 div#logo .rtname {
-    position: absolute;
+    position: relative;
     font-weight: bold;
-    top: 0.5em;
-    left: 30%;
-    right: 30%;
     text-align: center;
+    top: -0.8em;
+    left: 0.5em;
 }
 
 
diff --git a/share/html/NoAuth/css/web2/nav.css b/share/html/NoAuth/css/web2/nav.css
index 652a38e..ed1103a 100644
--- a/share/html/NoAuth/css/web2/nav.css
+++ b/share/html/NoAuth/css/web2/nav.css
@@ -55,7 +55,7 @@
 
 #page-navigation {
     position: absolute;
-    top: 5.5em;
+    top: 5.4em;
     right: 0em;
     left: auto;
     z-index: 9995;
@@ -75,3 +75,11 @@
 .sf-menu li, .sf-menu li li, .sf-menu li li li {
     background-color: #eee;
 }
+
+#page-navigation .sf-menu li, #page-navigation .sf-menu li li, #page-navigation .sf-menu li li li {
+    background-color: #fff;
+}
+
+#page-navigation .sf-menu a:visited, #page-navigation .sf-menu a {
+    border: none;
+}

commit 81fef376aaa4cbe9532a9d2cdae281b41bf5aeee
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Fri Nov 5 01:16:48 2010 -0400

    Move Dashboards under the "homepage" menu.

diff --git a/share/html/Dashboards/Modify.html b/share/html/Dashboards/Modify.html
index a04be04..34bee87 100755
--- a/share/html/Dashboards/Modify.html
+++ b/share/html/Dashboards/Modify.html
@@ -87,6 +87,9 @@ my $tried_create = 0;
 # user went directly to Modify.html
 $Create = 1 if !$id;
 
+
+my $redirect_to ='/Dashboards/Modify.html';
+
 use RT::Dashboard;
 
 my $Dashboard = RT::Dashboard->new($session{'CurrentUser'});
@@ -114,6 +117,10 @@ else {
 
         push @results, $msg;
         $id = $Dashboard->Id;
+        if (!$Dashboard->id || ! $Dashboard->CurrentUserCanSee) {
+            $redirect_to='/Dashboards/index.html';
+
+        }
     }
     else {
         my ($ok, $msg) = $Dashboard->LoadById($id);
@@ -146,26 +153,27 @@ if (!$Create && !$tried_create && $id && $ARGS{'Save'}) {
 }
 
 
+my $can_delete = $Dashboard->CurrentUserCanDelete;
+
+if (!$Create && !$tried_create && $id && $ARGS{'Delete'}) {
+    my ($ok, $msg) = $Dashboard->Delete();
+    if (!$ok) {
+             Abort(loc("Couldn't delete dashboard [_1]: [_2]", $id, $msg));
+             }
+
+    push @results, $msg;
+    $redirect_to = '/Dashboards/index.html';
+}
+
 # This code does automatic redirection if any updates happen.
 $m->comp(
     '/Elements/MaybeRedirectForResults',
     Actions     => \@results,
-    Path        => 'Dashboards/Modify.html',
+    Path        => $redirect_to,
     id              => $id,
     ARGSRef     => \%ARGS
 );
 
-
-my $can_delete = $Dashboard->CurrentUserCanDelete;
-
-if (!$Create && !$tried_create && $id && $ARGS{'Delete'}) {
-    my ($ok, $msg) = $Dashboard->Delete();
-    $ok || Abort(loc("Couldn't delete dashboard [_1]: [_2]", $id, $msg));
-
-    # put the user back into a useful place with a message
-    RT::Interface::Web::Redirect(RT->Config->Get('WebURL')."Dashboards/index.html?Deleted=$id");
-
-}
 </%INIT>
 
 <%ARGS>
diff --git a/share/html/Dashboards/index.html b/share/html/Dashboards/index.html
index 2bda8be..505cc95 100644
--- a/share/html/Dashboards/index.html
+++ b/share/html/Dashboards/index.html
@@ -79,9 +79,6 @@ use RT::Dashboard;
 my $dashboards = $m->comp("/Dashboards/Elements/DashboardsForObjects");
 
 my @actions;
-if (defined $Deleted) {
-    push @actions, loc("Deleted dashboard [_1]", $Deleted);
-}
 
 my @personal_dashboards = sort { $a->Id <=> $b->Id } @{ $dashboards->{personal} || [] };
 my @system_dashboards = sort { $a->Id <=> $b->Id } @{ $dashboards->{system} || [] };
@@ -101,7 +98,4 @@ $m->callback(
     CallbackName       => 'MassageDashboards',
 );
 </%INIT>
-<%ARGS>
-$Deleted => undef
-</%ARGS>
 
diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 0771803..496745f 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -69,7 +69,37 @@ my $query_string = sub {
 };
 
 if ( $request_path =~ qr{.*} ) {
-    Menu->child( home => title => loc('HomePage'), path => '/' );
+    my $home = Menu->child( home => title => loc('HomePage'), path => '/' );
+    my @dashboards = $m->comp("/Dashboards/Elements/ListOfDashboards");
+    my $limit      = 7;
+
+    my $more = 0;
+    if ( @dashboards > $limit ) {
+        $more = 1;
+        splice @dashboards, $limit;
+    }
+
+    my $position = 0;
+
+    if (@dashboards) {
+    my $dashes = Menu()->child('home');
+    for my $dash (@dashboards) {
+        $home->child('dashboard-' . $dash->id,
+                        title => $dash->Name,
+                        path => '/Dashboards/' . $dash->id . '/' . $dash->Name,
+                       );
+    }
+
+
+    if ($more) {
+        $dashes->child( title => loc('More...'),
+                              path  => 'Dashboards/index.html',
+                            );
+    }
+    }
+
+
+
     my $tickets = Menu->child( search => title => loc('Tickets'),
                                path => '/Search/Build.html' );
     $tickets->child( simple => title => loc('Simple Search') => path =>
@@ -97,6 +127,12 @@ if ( $request_path =~ qr{.*} ) {
         $dashes->child(
                 loc('Create') => path => "/Dashboards/Modify.html?Create=1" );
     }
+
+
+
+
+
+
     my $reports = $tools->child( loc('Reports'),
                                  path => '/Tools/Reports/index.html' );
     $reports->child( loc('Resolved by owner'),
@@ -685,37 +721,7 @@ if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
 
 if ( $request_path =~ /^\/(?:index.html|$)/ ) {
 
-    my @dashboards = $m->comp("/Dashboards/Elements/ListOfDashboards");
-    my $limit      = 7;
-
-    $m->callback( Dashboards   => \@dashboards,
-                  Limit        => \$limit,
-                  CallbackName => 'MassageDashboards',
-                );
-
-    my $more = 0;
-    if ( @dashboards > $limit ) {
-        $more = 1;
-        splice @dashboards, $limit;
-    }
-
-    my $position = 0;
-
-    for my $dash (@dashboards) {
-        PageMenu->child('dashboard-' . $dash->id,
-                        title => $dash->Name,
-                        path => 'Dashboards/' . $dash->id . '/' . $dash->Name,
-                       );
-    }
-
-    PageMenu()->child( home => title => loc('Home'), path => 'index.html' );
-
-    if ($more) {
-        $tabs->{"D-more"} = { title => loc('More'),
-                              path  => 'Dashboards/index.html',
-                            };
-    }
-
+    PageMenu()->child(edit => title => loc('Edit'), path => '/Prefs/MyRT.html');
 }
 
 
diff --git a/t/web/dashboards-groups.t b/t/web/dashboards-groups.t
index 668fa84..776e9b5 100644
--- a/t/web/dashboards-groups.t
+++ b/t/web/dashboards-groups.t
@@ -1,7 +1,7 @@
 #!/usr/bin/perl -w
 use strict;
 
-use RT::Test nodata => 1, tests => 35;
+use RT::Test nodata => 1, tests => 33;
 my ($baseurl, $m) = RT::Test->started_ok;
 
 my $url = $m->rt_base_url;
@@ -70,7 +70,7 @@ $m->content_lacks('Delete', "Delete button hidden because we are creating");
 
 $m->click_button(value => 'Create');
 
-$m->content_contains("Permission denied", "we lack SeeGroupDashboard");
+$m->content_contains("created", "we lack SeeGroupDashboard, so we end up back at the index.");
 $user_obj->PrincipalObj->GrantRight(
     Right  => 'SeeGroupDashboard',
     Object => $inner_group,
@@ -89,7 +89,6 @@ is($dashboard->Name, "inner dashboard");
 is($dashboard->Privacy, 'RT::Group-' . $inner_group->Id, "correct privacy");
 is($dashboard->PossibleHiddenSearches, 0, "all searches are visible");
 
-$m->warning_like(qr/Permission denied/, "got a permission denied warning when trying to see the dashboard");
 
 $m->get_ok("/Dashboards/Modify.html?id=$id");
 $m->content_contains("inner dashboard", "we now have SeeGroupDashboard right");
diff --git a/t/web/dashboards.t b/t/web/dashboards.t
index b5d07d9..81765a2 100644
--- a/t/web/dashboards.t
+++ b/t/web/dashboards.t
@@ -1,7 +1,7 @@
 #!/usr/bin/perl -w
 use strict;
 
-use RT::Test tests => 110;
+use RT::Test tests => 108;
 my ($baseurl, $m) = RT::Test->started_ok;
 
 my $url = $m->rt_base_url;
@@ -68,14 +68,12 @@ $m->form_name('ModifyDashboard');
 $m->field("Name" => 'different dashboard');
 $m->content_lacks('Delete', "Delete button hidden because we are creating");
 $m->click_button(value => 'Create');
-
-$m->content_contains("Permission denied", "we lack SeeOwnDashboard");
+$m->content_contains("Saved dashboard different dashboard");
 $user_obj->PrincipalObj->GrantRight(Right => 'SeeOwnDashboard', Object => $RT::System);
-$m->reload;
+$m->get($url."Dashboards/index.html");
+$m->follow_link_ok({ text => 'different dashboard'});
 $m->content_lacks("Permission denied", "we now have SeeOwnDashboard");
-$m->content_contains("Saved dashboard different dashboard");
 $m->content_lacks('Delete', "Delete button hidden because we lack DeleteOwnDashboard");
-$m->warning_like(qr/Permission denied/, "got a permission denied warning when trying to see the dashboard");
 
 $m->get_ok($url."Dashboards/index.html");
 $m->content_contains("different dashboard", "we now have SeeOwnDashboard");
@@ -200,7 +198,7 @@ $m->content_contains('Delete', "Delete button shows because we have DeleteOwnDas
 
 $m->form_name('ModifyDashboard');
 $m->click_button(name => 'Delete');
-$m->content_contains("Deleted dashboard $id");
+$m->content_contains("Deleted dashboard");
 
 $m->get("/Dashboards/Modify.html?id=$id");
 $m->content_lacks("different dashboard", "dashboard was deleted");
diff --git a/t/web/walk.t b/t/web/walk.t
index 90fd030..a062bcc 100644
--- a/t/web/walk.t
+++ b/t/web/walk.t
@@ -166,8 +166,8 @@ diag 'walk into /Approvals' if $ENV{TEST_VERBOSE};
 diag 'walk into /Prefs' if $ENV{TEST_VERBOSE};
 {
     for my $id (
-        'settings',    'about_me', 'search_options', 'myrt',
-        'quicksearch', 'search-0', 'search-1',       'search-2',
+        'settings',    'settings-about_me', 'settings-search_options', 'settings-myrt',
+        'settings-quicksearch', 'settings-saved-searches-search-0', 'settings-saved-searches-search-1',       'settings-saved-searches-search-2',
         'logout'
       )
     {

commit 765beea068e0ec5f3878fc72f030c7a929f23b53
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Tue Nov 2 12:35:51 2010 -0400

    Start abstracting away some cachebusting for dashboard attributes

diff --git a/lib/RT/Record.pm b/lib/RT/Record.pm
index 8ff462e..77d0b65 100755
--- a/lib/RT/Record.pm
+++ b/lib/RT/Record.pm
@@ -224,7 +224,9 @@ Deletes all attributes with the matching name for this object.
 sub DeleteAttribute {
     my $self = shift;
     my $name = shift;
-    return $self->Attributes->DeleteEntry( Name => $name );
+    my ($val,$msg) =  $self->Attributes->DeleteEntry( Name => $name );
+    $self->ClearAttributes;
+    return ($val,$msg);
 }
 
 =head2 FirstAttribute NAME
@@ -245,6 +247,12 @@ sub FirstAttribute {
 }
 
 
+sub ClearAttributes {
+    my $self = shift;
+    delete $self->{'attributes'};
+
+}
+
 sub _Handle { return $RT::Handle }
 
 
@@ -352,7 +360,7 @@ sub LoadByCols {
     my $self = shift;
 
     # We don't want to hang onto this
-    delete $self->{'attributes'};
+    $self->ClearAttributes;
 
     return $self->SUPER::LoadByCols( @_ ) unless $self->_Handle->CaseSensitive;
 
diff --git a/lib/RT/SharedSetting.pm b/lib/RT/SharedSetting.pm
index 32a515d..6a527a2 100644
--- a/lib/RT/SharedSetting.pm
+++ b/lib/RT/SharedSetting.pm
@@ -258,11 +258,11 @@ where status is true upon success.
 
 sub Delete {
     my $self = shift;
-
     return (0, $self->loc("Permission denied"))
         unless $self->CurrentUserCanDelete;
 
     my ($status, $msg) = $self->{'Attribute'}->Delete;
+    $self->CurrentUser->ClearAttributes; # force the current user's attribute cache to be cleaned up
     if ($status) {
         return (1, $self->loc("Deleted [_1]", $self->ObjectName));
     } else {
@@ -333,7 +333,7 @@ This does not deal with ACLs, this only looks at membership.
 sub IsVisibleTo {
     my $self    = shift;
     my $to      = shift;
-    my $privacy = $self->Privacy;
+    my $privacy = $self->Privacy || '';
 
     # if the privacies are the same, then they can be seen. this handles
     # a personal setting being visible to that user.

commit bd2a3aaec2129885444eba912dcfd70d1c71c8f6
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Tue Nov 2 12:52:27 2010 -0400

    After custom field update, redirect back to the same page, so it's a GET
    rather than a POST

diff --git a/share/html/Admin/CustomFields/Modify.html b/share/html/Admin/CustomFields/Modify.html
index 278ef7b..75be4d9 100644
--- a/share/html/Admin/CustomFields/Modify.html
+++ b/share/html/Admin/CustomFields/Modify.html
@@ -269,8 +269,23 @@ CustomFieldObj => $CustomFieldObj, CustomFieldValueObj => $cfv, ARGSRef => \%ARG
     }
 }
 
+
+
+
 $id = $CustomFieldObj->id if $CustomFieldObj->id;
 
+
+# This code does automatic redirection if any updates happen.
+$m->comp(
+    '/Elements/MaybeRedirectForResults',
+    Actions     => \@results,
+    Path        => '/Admin/CustomFields/Modify.html',
+    id              => $id,
+    ARGSRef     => \%ARGS
+);
+
+
+
 my $EnabledChecked = qq[checked="checked"];
 $EnabledChecked = '' if $CustomFieldObj->Disabled;
 
diff --git a/t/web/cf_access.t b/t/web/cf_access.t
index cf7279f..3a741f6 100644
--- a/t/web/cf_access.t
+++ b/t/web/cf_access.t
@@ -28,7 +28,7 @@ diag "Create a CF";
 diag "apply the CF to General queue";
 my ( $cf, $cfid, $tid );
 {
-    $m->title_is(q/Created CustomField img/, 'admin-cf created');
+    $m->title_is(q/Editing CustomField img/, 'admin-cf created');
     $m->follow_link( id => 'tools-config-queues');
     $m->follow_link( text => 'General' );
     $m->title_is(q/Configuration for queue General/, 'admin-queue: general');

commit 3e40e86a6ad026cdb87000f2c1866bf998f75b3e
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Tue Nov 2 13:50:50 2010 -0400

    Modifying a group now redirects after submit

diff --git a/share/html/Admin/Groups/Modify.html b/share/html/Admin/Groups/Modify.html
index 0ec934e..b81c9f8 100755
--- a/share/html/Admin/Groups/Modify.html
+++ b/share/html/Admin/Groups/Modify.html
@@ -160,6 +160,19 @@ if  ( ($SetEnabled) and ( $Disabled != $Group->Disabled) ) {
     push @results, $msg;
 }
 
+# This code does automatic redirection if any updates happen.
+$m->comp(
+    '/Elements/MaybeRedirectForResults',
+    Actions     => \@results,
+    Path        => '/Admin/Groups/Modify.html',
+    id              => $id,
+    ARGSRef     => \%ARGS
+);
+
+
+
+
+
 unless ($Group->Disabled()) {
     $EnabledChecked ='checked="checked"';
 }

commit 2f2ad9ff2fbeb5faf61b0ddf6329fd568ce1a7e6
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Tue Nov 2 15:34:58 2010 -0400

    Fully ported the current state of Ticket/Elements/Tabs to the new
    menuing.
    
    Disabled ACL checking on some Ticket tabs, since it wasn't accurate enough

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 496745f..37e80ab 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -529,42 +529,77 @@ if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
 
         my $tabs = PageMenu()
             ; #->child( "#" . $id => class => "currentnav",path => "/Ticket/Display.html?id=" . $id);
-        $tabs->child ( bookmark => title => $m->scomp( '/Ticket/Elements/Bookmark', id => $id ), escape_title => 0, link_item => 0);
+        $tabs->child( bookmark => title =>
+                          $m->scomp( '/Ticket/Elements/Bookmark', id => $id ),
+                      escape_title => 0,
+                      link_item    => 0
+                    );
 
         $tabs->child(
                  loc('Display') => path => "/Ticket/Display.html?id=" . $id );
 
         $tabs->child(
                  loc('History') => path => "/Ticket/History.html?id=" . $id );
-        $tabs->child(
-                   loc('Basics') => path => "/Ticket/Modify.html?id=" . $id );
 
-        $tabs->child(
-               loc('Dates') => path => "/Ticket/ModifyDates.html?id=" . $id );
-        $tabs->child( loc('People'),
-                      path => "/Ticket/ModifyPeople.html?id=" . $id );
-        $tabs->child( loc('Links'),
-                      path => "/Ticket/ModifyLinks.html?id=" . $id );
-        $tabs->child( loc('Jumbo'),
-                      path => "/Ticket/ModifyAll.html?id=" . $id );
-
-        my %can
-            = ( ModifyTicket => $obj->CurrentUserHasRight('ModifyTicket') );
-
-        if (    $can{'ModifyTicket'}
-             or $obj->CurrentUserHasRight('ReplyToTicket') )
-        {
-            $actions->child( loc('Reply'),
-                     path => "/Ticket/Update.html?Action=Respond&id=" . $id );
+        my %can = (
+              ModifyTicket    => $obj->CurrentUserHasRight('ModifyTicket'),
+              Watch    => $obj->CurrentUserHasRight('Watch'),
+              WatchAsAdminCc    => $obj->CurrentUserHasRight('WatchAsAdminCc'),
+              OwnTicket       => $obj->CurrentUserHasRight('OwnTicket'),
+              StealTicket     => $obj->CurrentUserHasRight('StealTicket'),
+              TakeTicket      => $obj->CurrentUserHasRight('TakeTicket'),
+              ReplyToTicket   => $obj->CurrentUserHasRight('ReplyToTicket'),
+              CommentOnTicket => $obj->CurrentUserHasRight('CommentOnTicket'),
+              ModifyCustomField => $obj->CurrentUserHasRight('ModifyCustomField'),
+              _ModifyOwner => (       $obj->CurrentUserHasRight('OwnTicket')
+                                   || $obj->CurrentUserHasRight('TakeTicket')
+                                   || $obj->CurrentUserHasRight('StealTicket')
+                              )
+                  );
+        # comment out until we can do it for an individual custom field
+        #if ( $can{ModifyTicket} || $can{ModifyCustomField} ) {
+            $tabs->child( basics => title => loc('Basics'),
+                          path => "/Ticket/Modify.html?id=" . $id, );
+        #}
+
+        if ( $can{ModifyTicket} || $can{_ModifyOwner} ||$can{Watch} ||$can{WatchAsAdminCc}) {
+            $tabs->child( people => title => loc('People'),
+                          path => "/Ticket/ModifyPeople.html?id=" . $id, );
+        }
+
+        if ( $can{ModifyTicket} ) {
+            $tabs->child( dates => title => loc('Dates'), path => "/Ticket/ModifyDates.html?id=" . $id, );
+            $tabs->child( links => title => loc('Links'), path => "/Ticket/ModifyLinks.html?id=" . $id, );
+        }
+
+        #if (    $can{ModifyTicket} || $can{ModifyCustomField} || $can{_ModifyOwner} ) {
+            $tabs->child( jumbo => title => loc('Jumbo'), path => "/Ticket/ModifyAll.html?id=" . $id, );
+        #}
+
+        if ( RT->Config->Get('EnableReminders') ) {
+            $tabs->child( reminders => title => loc('Reminders'), path => "/Ticket/Reminders.html?id=" . $id, );
+        }
+
+        if ( $can{'ModifyTicket'} or $can{'ReplyToTicket'} ) {
+            $actions->child(
+                        reply => title => loc('Reply'), path => "/Ticket/Update.html?Action=Respond;id=" . $id,
+            );
+        }
+
+        if ( $obj->CurrentUserHasRight('ForwardMessage') ) {
+            $actions->child( forward => title => loc('Forward'), path => "/Ticket/Forward.html?id=" . $id, );
         }
 
         if ( $can{'ModifyTicket'} ) {
             my $current = $obj->Status;
-            my $schema  = $obj->QueueObj->lifecycle;
+            my $lifecycle  = $obj->QueueObj->lifecycle;
             my $i       = 1;
-            foreach my $next ( $schema->transitions($current) ) {
-                my $action = $schema->transition_action( $current => $next );
+            foreach my $next ( $lifecycle->transitions($current) ) {
+                my $action = $lifecycle->transition_action( $current => $next );
                 next if $action eq 'hide';
+            my $check = $lifecycle->check_right( $current => $next );
+            $can{$check} = $obj->CurrentUserHasRight($check) unless exists $can{$check};
+            next unless $can{$check};
 
                 my $url = '/Ticket/';
                 if ($action) {
@@ -580,32 +615,41 @@ if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
                         . $query_string->( Status => $next, id => $id );
                 }
                 $actions->child(
-                      loc( $schema->transition_label( $current => $next ) ) =>
+                      loc( $lifecycle->transition_label( $current => $next ) ) =>
                           path => $url );
             }
 
         }
-        if ( $obj->CurrentUserHasRight('OwnTicket') ) {
-            if ( $obj->OwnerObj->id == RT->Nobody->id ) {
-                $actions->child( loc('Take') => path =>
-                                "/Ticket/Display.html?Action=Take&id=" . $id )
-                    if (    $can{'ModifyTicket'}
-                         or $obj->CurrentUserHasRight('TakeTicket') );
-            } elsif ( $obj->OwnerObj->id != $session{'CurrentUser'}->id ) {
-                $actions->child( loc('Steal') => path =>
-                               "/Ticket/Display.html?Action=Steal&id=" . $id )
-                    if (    $can{'ModifyTicket'}
-                         or $obj->CurrentUserHasRight('StealTicket') );
+        if ( $can{OwnTicket} ) {
+            if ( $obj->OwnerObj->Id == RT->Nobody->id
+                 && ( $can{'ModifyTicket'} or $can{'TakeTicket'} ) )
+            {
+                $actions->child(
+                        take => path => "/Ticket/Display.html?Action=Take;id="
+                            . $id,
+                        title => loc('Take')
+                    ),
+                    ;
             }
-        }
 
-        if (    $can{'ModifyTicket'}
-             or $obj->CurrentUserHasRight('CommentOnTicket') )
-        {
-            $actions->child( loc('Comment') => path =>
-                             "/Ticket/Update.html?action=comment&id=" . $id );
+            elsif (    $obj->OwnerObj->id != RT->Nobody->id
+                    && $obj->OwnerObj->id != $session{CurrentUser}->id
+                    && ( $can{'ModifyTicket'} or $can{'StealTicket'} ) )
+            {
+
+                $actions->child(
+                        steal => title => loc('Steal'),
+                        path => "/Ticket/Display.html?Action=Steal;id=" . $id,
+                );
+            }
         }
 
+        if ( $can{'ModifyTicket'} || $can{'CommentOnTicket'} ) {
+            $actions->child(
+                        comment => title => loc('Comment'),
+                        path => "/Ticket/Update.html?Action=Comment;id=" . $id,
+            );
+        }
 
         if ( defined $session{"tickets"} ) {
 
@@ -622,22 +666,26 @@ if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
             # Don't display prev links if we're on the first ticket
             if ( $item_map->{$id}->{prev} ) {
                 $search->child(
-                       '<< ' . loc('First') => class => "nav",
+                       'first',
+                       title => '<< ' . loc('First') => class => "nav",
                        path => "/Ticket/Display.html?id=" . $item_map->{first}
                 );
-                $search->child( '< ' . loc('Prev') => class => "nav",
-                                path => "/Ticket/Display.html?id="
-                                    . $item_map->{$id}->{prev}
-                              );
+                $search->child(
+                        prev => title => '< ' . loc('Prev') => class => "nav",
+                        path => "/Ticket/Display.html?id="
+                            . $item_map->{$id}->{prev}
+                );
 
                 # Don't display next links if we're on the last ticket
                 if ( $item_map->{$id}->{next} ) {
-                    $search->child( loc('next') . ' >' => class => "nav",
-                                    path => "/Ticket/Display.html?id="
-                                        . $item_map->{$id}->{next}
-                                  );
                     $search->child(
-                        loc('Last') . ' >>' => class => "nav",
+                        next => title => loc('next') . ' >' => class => "nav",
+                        path => "/Ticket/Display.html?id="
+                            . $item_map->{$id}->{next}
+                    );
+                    $search->child(
+                        last        => title => loc('Last')
+                            . ' >>' => class => "nav",
                         path => "/Ticket/Display.html?id=" . $item_map->{last}
                     );
                 }
@@ -659,6 +707,7 @@ if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
     my %query_args = (
 
         SavedSearchId => ( $search_id eq 'new' ) ? undef : $search_id,
+    SavedChartSearchId => $m->request_args->{'SavedChartSearchId'} || $current_search->{SavedChartSearchId},
         Query  => $m->request_args->{'Query'}  || $current_search->{'Query'},
         Format => $m->request_args->{'Format'} || $current_search->{'Format'},
         OrderBy => $m->request_args->{'OrderBy'}
@@ -698,7 +747,7 @@ if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
                                  search          => 1,
                                  plugin          => 'Tickets',
                                  'Tickets:query' => $query_args{'Query'},
-                                 'Tickets:limit' => $query_args{'RowsPerPage'}
+                                 'Tickets:limit' => $query_args{'Rows'}
                 );
 
             $current_search_menu->child(
@@ -714,6 +763,7 @@ if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
         $current_search_menu->child(
                                 bulk => title => loc('Bulk Update') => path =>
                                     "/Search/Bulk.html$args" );
+    $current_search_menu->child( chart => path  => "Search/Chart.html$args", title => loc('Graph'),);
 
     }
 
diff --git a/share/html/Ticket/Elements/Tabs b/share/html/Ticket/Elements/Tabs
index 828396c..979ab78 100755
--- a/share/html/Ticket/Elements/Tabs
+++ b/share/html/Ticket/Elements/Tabs
@@ -1,398 +1 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-<%INIT>
-my $tabs       = {};
-my $searchtabs = {};
-my $actions;
-
-if ($Ticket) {
-
-    my $id = $Ticket->id();
-
-    my $current = $Ticket->Status;
-    my $lifecycle  = $Ticket->QueueObj->lifecycle;
-    my %has;
-    my $i = 1;
-
-    if ( defined $session{'tickets'} ) {
-
-        # we have to update session data if we get new ItemMap
-        my $updatesession = 1 unless ( $session{'tickets'}->{'item_map'} );
-
-        my $item_map = $session{'tickets'}->ItemMap;
-
-        if ($updatesession) {
-            $session{'i'}++;
-            $session{'tickets'}->PrepForSerialization();
-        }
-
-        # Don't display prev links if we're on the first ticket
-        if ( $item_map->{ $Ticket->Id }->{prev} ) {
-            if ( $item_map->{first} ) {
-                $searchtabs->{'_a'} = {
-                    class => "nav",
-                    path  => "Ticket/Display.html?id=" . $item_map->{first},
-                    title => '<< ' . loc('First')
-                };
-            }
-            $searchtabs->{"_b"} = {
-                class => "nav",
-                path  => "Ticket/Display.html?id=" . $item_map->{ $Ticket->Id }->{prev},
-                title => '< ' . loc('Prev')
-            };
-        }
-
-        # Don't display next links if we're on the last ticket
-        if ( $item_map->{ $Ticket->Id }->{next} ) {
-            $searchtabs->{'d'} = {
-                class => "nav",
-                path  => "Ticket/Display.html?id=" . $item_map->{ $Ticket->Id }->{next},
-                title => loc('Next') . ' >'
-            };
-            if ( $item_map->{last} ) {
-                $searchtabs->{'e'} = {
-                    class => "nav",
-                    path  => "Ticket/Display.html?id=" . $item_map->{last},
-                    title => loc('Last') . ' >>'
-                };
-            }
-        }
-    }
-
-    $tabs->{"this"} = {
-        class          => "currentnav",
-        path           => "Ticket/Display.html?id=" . $Ticket->id,
-        title          => "#" . $id,
-        current_subtab => $current_subtab
-    };
-
-    my %can = (
-        ModifyTicket      => $Ticket->CurrentUserHasRight('ModifyTicket'),
-        OwnTicket         => $Ticket->CurrentUserHasRight('OwnTicket'),
-        StealTicket         => $Ticket->CurrentUserHasRight('StealTicket'),
-        TakeTicket         => $Ticket->CurrentUserHasRight('TakeTicket'),
-        ReplyToTicket     => $Ticket->CurrentUserHasRight('ReplyToTicket'),
-        CommentOnTicket     => $Ticket->CurrentUserHasRight('CommentOnTicket'),
-        ModifyCustomField => $Ticket->CurrentUserHasRight('ModifyCustomField'),
-        _ModifyOwner      => (
-                   $Ticket->CurrentUserHasRight('OwnTicket')
-                || $Ticket->CurrentUserHasRight('TakeTicket')
-                || $Ticket->CurrentUserHasRight('StealTicket')
-        )
-    );
-
-    my $ticket_page_tabs = {
-        _A => {
-            title => loc('Display'),
-            path  => "Ticket/Display.html?id=" . $id,
-        },
-
-        _Ab => {
-            title => loc('History'),
-            path  => "Ticket/History.html?id=" . $id,
-        },
-    };
-
-    if ( $can{ModifyTicket} || $can{ModifyCustomField} ) {
-        $ticket_page_tabs->{_B} = {
-            title => loc('Basics'),
-            path  => "Ticket/Modify.html?id=" . $id,
-        };
-    }
-
-    if ( $can{ModifyTicket} || $can{_ModifyOwner} ) {
-        $ticket_page_tabs->{_D} = {
-            title => loc('People'),
-            path  => "Ticket/ModifyPeople.html?id=" . $id,
-        };
-    }
-
-    if ( $can{ModifyTicket} ) {
-        $ticket_page_tabs->{_C} = {
-            title => loc('Dates'),
-            path  => "Ticket/ModifyDates.html?id=" . $id,
-        };
-        $ticket_page_tabs->{_E} = {
-            title => loc('Links'),
-            path  => "Ticket/ModifyLinks.html?id=" . $id,
-        };
-    }
-
-    if ( $can{ModifyTicket} || $can{ModifyCustomField} || $can{_ModifyOwner} ) {
-        $ticket_page_tabs->{_X} = {
-            title => loc('Jumbo'),
-            path  => "Ticket/ModifyAll.html?id=" . $id,
-        };
-    }
-
-    if ( RT->Config->Get('EnableReminders') ) {
-        $ticket_page_tabs->{_F} = {
-            title     => loc('Reminders'),
-            path      => "Ticket/Reminders.html?id=" . $id,
-            separator => 1,
-        };
-    }
-
-    foreach my $tab ( sort keys %{$ticket_page_tabs} ) {
-        if ( $ticket_page_tabs->{$tab}->{'path'} eq $current_tab ) {
-            $ticket_page_tabs->{$tab}->{"subtabs"} = $subtabs;
-            $tabs->{'this'}->{"current_subtab"} = $ticket_page_tabs->{$tab}->{"path"};
-        }
-    }
-    $tabs->{'this'}->{"subtabs"} = $ticket_page_tabs;
-    $current_tab = "Ticket/Display.html?id=" . $id;
-
-    if ( $can{'ModifyTicket'} or $can{'ReplyToTicket'} ) {
-        $actions->{'E'} = {
-            title => loc('Reply'),
-            path  => "Ticket/Update.html?Action=Respond;id=" . $id,
-        };
-    }
-
-    if ( $Ticket->CurrentUserHasRight('ForwardMessage') ) {
-        $actions->{'FA'} = {
-            title => loc('Forward'),
-            path  => "Ticket/Forward.html?id=" . $id,
-        };
-    }
-
-    if ( $can{'ModifyTicket'} ) {
-        foreach my $next ( $lifecycle->transitions($current) ) {
-            my $action = $lifecycle->transition_action( $current => $next );
-            next if $action eq 'hide';
-
-            my $check = $lifecycle->check_right( $current => $next );
-            $has{$check} = $Ticket->CurrentUserHasRight($check)
-                unless exists $has{$check};
-            next unless $has{$check};
-
-            my $path = 'Ticket/';
-            if ($action) {
-                $path .= "Update.html?"
-                    . $m->comp(
-                    '/Elements/QueryString',
-                    Action        => $action,
-                    DefaultStatus => $next,
-                    id            => $id
-                    );
-            } else {
-                $path .= "Display.html?"
-                    . $m->comp(
-                    '/Elements/QueryString',
-                    Status => $next,
-                    id     => $id
-                    );
-            }
-            $actions->{ 'G' . $i++ } = {
-                path  => $path,
-                title => loc( $lifecycle->transition_label( $current => $next ) ),
-            };
-        }
-    }
-    if ( $can{OwnTicket} ) {
-        if ($Ticket->OwnerObj->Id == RT->Nobody->id
-            && (   $can{'ModifyTicket'} or $can{'TakeTicket'})
-            )
-        {
-            $actions->{'B'} = {
-                path  => "Ticket/Display.html?Action=Take;id=" . $id,
-                title => loc('Take'),
-                }
-
-        } elsif ( $Ticket->OwnerObj->id != RT->Nobody->id
-                    && $Ticket->OwnerObj->id != $session{CurrentUser}->id
-                    && ( $can{'ModifyTicket'} or $can{'StealTicket'})
-                )
-        {
-
-            $actions->{'C'} = {
-                path  => "Ticket/Display.html?Action=Steal;id=" . $id,
-                title => loc('Steal'),
-            };
-        }
-    }
-
-    if (   $can{'ModifyTicket'} || $can{'CommentOnTicket'}) {
-        $actions->{'F'} = {
-            title => loc('Comment'),
-            path  => "Ticket/Update.html?Action=Comment;id=" . $id,
-        };
-    }
-
-    $actions->{'_ZZ'} = { html => $m->scomp( '/Ticket/Elements/Bookmark', id => $Ticket->id ), };
-
-
-if (( defined $actions->{B} || defined $actions->{C} )
-    && (   defined $actions->{E}
-        || defined $actions->{F}
-        || defined $actions->{G} )
-    )
-{
-
-    if    ( defined $actions->{C} ) { $actions->{C}->{separator} = 1 }
-    elsif ( defined $actions->{B} ) { $actions->{B}->{separator} = 1 }
-}
-
-$actions->{ 'G' . 1 }{pre_separator} = 1;
-
-# Separator between the last status and the next set of actions
-$actions->{ 'G' . ( $i - 1 ) }{separator} = 1;
-}
-
-$actions = $ARGS{actions} if defined $ARGS{actions};
-
-my $args      = '';
-my $has_query = '';
-my %query_args;
-my $search_id
-    = $ARGS{'SavedSearchId'}
-    || $session{'CurrentSearchHash'}->{'SearchId'}
-    || '';
-my $chart_search_id = $ARGS{'SavedChartSearchId'} || '';
-
-$has_query = 1 if ( $ARGS{'Query'} or $session{'CurrentSearchHash'}->{'Query'} );
-
-%query_args = (
-    SavedSearchId => ( $search_id eq 'new' ) ? undef : $search_id,
-    SavedChartSearchId => $chart_search_id,
-    Query              => $ARGS{'Query'} || $session{'CurrentSearchHash'}->{'Query'},
-    Format             => $ARGS{'Format'} || $session{'CurrentSearchHash'}->{'Format'},
-    OrderBy            => $ARGS{'OrderBy'} || $session{'CurrentSearchHash'}->{'OrderBy'},
-    Order              => $ARGS{'Order'} || $session{'CurrentSearchHash'}->{'Order'},
-    Page               => $ARGS{'Page'} || $session{'CurrentSearchHash'}->{'Page'},
-    RowsPerPage        => $ARGS{'RowsPerPage'} || $session{'CurrentSearchHash'}->{'RowsPerPage'},
-);
-
-$args = "?" . $m->comp( '/Elements/QueryString', %query_args );
-
-$tabs->{"f"} = {
-    path  => "Search/Build.html?NewQuery=1",
-    title => loc('New Search')
-};
-$tabs->{"g"} = {
-    path => "Search/Build.html" . ( ($has_query) ? $args : '' ),
-    title => loc('Edit Search')
-};
-$tabs->{"h"} = {
-    path      => "Search/Edit.html$args",
-    title     => loc('Advanced'),
-    separator => 1
-};
-
-if ($has_query) {
-
-    if ( $current_tab =~ m{Search/Results.html} ) {
-        $current_tab = "Search/Results.html$args";
-
-        if ( $session{'CurrentUser'}->HasRight( Right => 'SuperUser', Object => $RT::System ) ) {
-            my $shred_args = $m->comp(
-                '/Elements/QueryString',
-                Search          => 1,
-                Plugin          => 'Tickets',
-                'Tickets:query' => $query_args{'Query'},
-                'Tickets:limit' => $query_args{'Rows'}
-            );
-
-            $tabs->{"shredder"} = {
-                path  => 'Admin/Tools/Shredder/?' . $shred_args,
-                title => loc('Shredder')
-            };
-
-        }
-    }
-    if ( $current_tab =~ m{Search/(Bulk|Build|Edit)\.html} ) {
-        $current_tab = "Search/$1.html$args";
-    }
-
-    $tabs->{"i"} = {
-        path  => "Search/Results.html$args",
-        title => loc('Show Results'),
-    };
-
-    $tabs->{"j"} = {
-        path  => "Search/Bulk.html$args",
-        title => loc('Bulk Update'),
-    };
-
-    $tabs->{"k"} = {
-        path  => "Search/Chart.html$args",
-        title => loc('Graph'),
-    };
-
-}
-
-foreach my $searchtab ( keys %{$searchtabs} ) {
-    ( $searchtab =~ /^_/ )
-        ? $tabs->{ "s" . $searchtab }
-        = $searchtabs->{$searchtab}
-        : $tabs->{ "z_" . $searchtab } = $searchtabs->{$searchtab};
-}
-
-$m->callback( Ticket => $Ticket, actions => $actions, tabs => $tabs, %ARGS, args => \%ARGS );
-$m->comp(
-    "/Elements/Tabs",
-    tabs           => $tabs,
-    actions        => $actions,
-    current_tab    => $current_tab,
-    current_toptab => $ARGS{current_toptab} || 'Search/Build.html',
-    Title          => $Title
-);
-
-return;
-
-</%INIT>
-
-  
-<%ARGS>
-$Ticket => undef
-$subtabs => undef
-$current_tab => ''
-$current_subtab => ''
-$Title => undef
-$RowsPerPage => undef
-</%ARGS>
+<&/Elements/Tabs &>

commit aef6eda8b9e17c533558cb97b12a10e81c585870
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Fri Nov 5 05:16:49 2010 -0400

    Remove older tab components, and all vestiges of toptabs, etc

diff --git a/share/html/Admin/CustomFields/GroupRights.html b/share/html/Admin/CustomFields/GroupRights.html
index db4ae39..ee85364 100644
--- a/share/html/Admin/CustomFields/GroupRights.html
+++ b/share/html/Admin/CustomFields/GroupRights.html
@@ -46,11 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/CustomFieldTabs,
-    id => $id,
-    current_tab => "Admin/CustomFields/GroupRights.html?id=".$id,
-    Title => $title
-&>
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>
 
   <form method="post" action="GroupRights.html" id="ModifyGroupRights" name="ModifyGroupRights">
diff --git a/share/html/Admin/CustomFields/Modify.html b/share/html/Admin/CustomFields/Modify.html
index 75be4d9..cecedc5 100644
--- a/share/html/Admin/CustomFields/Modify.html
+++ b/share/html/Admin/CustomFields/Modify.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/CustomFieldTabs,
-    id => $CustomFieldObj->Id ,
-    current_tab => $current_tab,
-    Title => $title &>
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>
 
 
@@ -158,14 +155,12 @@
 my ($title, @results, $Disabled);
 
 my $CustomFieldObj = RT::CustomField->new( $session{'CurrentUser'} );
-my $current_tab = 'Admin/CustomFields/Modify.html';
 
 $m->callback(CallbackName => 'Initial', Pattern => \$Pattern, ARGSRef => \%ARGS);
 
 unless ( $id ) {
     $title = loc("Create a CustomField");
     $id    = 'new';
-    $current_tab .= '?Create=1';
 }
 else {
     if ( $id eq 'new' ) {
@@ -186,7 +181,6 @@ else {
         $CustomFieldObj->Load( $id ) || $m->comp("/Elements/Error", Why => loc('No CustomField') );
         $title = loc( 'Editing CustomField [_1]', $CustomFieldObj->Name );
     }
-    $current_tab .= "?id=$id";
 }
 
 if ( $ARGS{'Update'} && $id ne 'new' ) {
diff --git a/share/html/Admin/CustomFields/Objects.html b/share/html/Admin/CustomFields/Objects.html
index 484ef7a..ab9a509 100644
--- a/share/html/Admin/CustomFields/Objects.html
+++ b/share/html/Admin/CustomFields/Objects.html
@@ -46,11 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/CustomFieldTabs,
-    id => $id,
-    current_tab => "Admin/CustomFields/Objects.html?id=".$id,
-    Title => $title
-    &>
+<& /Elements/Tabs &>
 
 <& /Elements/ListActions, actions => \@results &>
 
diff --git a/share/html/Admin/CustomFields/UserRights.html b/share/html/Admin/CustomFields/UserRights.html
index 238fc4a..48afc73 100644
--- a/share/html/Admin/CustomFields/UserRights.html
+++ b/share/html/Admin/CustomFields/UserRights.html
@@ -46,9 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/CustomFieldTabs, id => $id, 
-current_tab => "Admin/CustomFields/UserRights.html?id=".$id,
-Title => $title, &>
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>
 
   <form method="post" action="UserRights.html" name="ModifyUserRights" id="ModifyUserRights">
diff --git a/share/html/Admin/CustomFields/index.html b/share/html/Admin/CustomFields/index.html
index 9156bbf..e385b97 100644
--- a/share/html/Admin/CustomFields/index.html
+++ b/share/html/Admin/CustomFields/index.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/CustomFieldTabs,
-    current_tab => 'Admin/CustomFields/', 
-    Title => $title,
-&>
+<& /Elements/Tabs &>
 
 % my $tmp = RT::CustomField->new( $session{'CurrentUser'} );
 % if ( $Type ) {
diff --git a/share/html/Admin/Elements/CustomFieldTabs b/share/html/Admin/Elements/CustomFieldTabs
deleted file mode 100644
index e5254ff..0000000
--- a/share/html/Admin/Elements/CustomFieldTabs
+++ /dev/null
@@ -1,121 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-<& /Admin/Elements/Tabs, 
-    current_tab => 'Admin/CustomFields/',
-    subtabs => $tabs, 
-    current_subtab => $current_tab, 
-    Title => $Title &>
-<%INIT>
-my $tabs;
-
-if ($id) {
-    my $cf = RT::CustomField->new( $session{'CurrentUser'} );
-    $cf->Load($id);
-    $tabs = {
-        this => {
-            title => $cf->Name,
-            path  => "Admin/CustomFields/Modify.html?id=" . $id,
-            current_subtab => $current_tab,
-
-            subtabs => {
-
-                C => { title => loc('Basics'),
-                       path  => "Admin/CustomFields/Modify.html?id=" . $id,
-                },
-                F => { title => loc('Group Rights'),
-                       path  => "Admin/CustomFields/GroupRights.html?id="
-                         . $id, },
-                G => {
-                    title => loc('User Rights'),
-                    path => "Admin/CustomFields/UserRights.html?id=" . $id,
-                },
-
-            } }
-
-    };
-
-
-    if ($cf->LookupType =~ /^RT::(?:Queue|Group)(?:\Z|-)/i) {
-	$tabs->{'this'}->{subtabs}->{D} = {
-	title => loc('Applies to'),
-	    path  => "Admin/CustomFields/Objects.html?id=" . $id,
-	};
-    }
-}
-
-if ( $session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminCustomField')
-     || $session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminCustomFieldValues') ) {
-  $tabs->{"A"} = { title => loc('Select'),
-                        path => "Admin/CustomFields/",
-                           };
-}
-if ($session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminCustomField')) {
-  $tabs->{"B"} = { title => loc('Create'),
-                        path => "Admin/CustomFields/Modify.html?Create=1",
-                        separator => 1,
-                           };
-}
-
-  # Now let callbacks add their extra tabs
-  $m->callback( %ARGS, tabs => $tabs );
-
-foreach my $tab (sort keys %{$tabs->{'this'}->{'subtabs'}}) {
-    if ($tabs->{'this'}->{'subtabs'}->{$tab}->{'path'} eq $current_tab) {
-	$tabs->{'this'}->{'subtabs'}->{$tab}->{'subtabs'} = $subtabs;
-	$tabs->{'this'}->{'subtabs'}->{$tab}->{'current_subtab'} = $current_subtab;
-    }
-}
-if( $id ) { $current_tab = "Admin/CustomFields/Modify.html?id=" . $id }
-</%INIT>
-<%ARGS>
-$Title => undef
-$id => undef
-$current_tab => undef
-$subtabs => undef
-$current_subtab => undef
-</%ARGS>
diff --git a/share/html/Admin/Elements/GlobalCustomFieldTabs b/share/html/Admin/Elements/GlobalCustomFieldTabs
deleted file mode 100755
index 64e5c53..0000000
--- a/share/html/Admin/Elements/GlobalCustomFieldTabs
+++ /dev/null
@@ -1,105 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-<& /Admin/Elements/SystemTabs, subtabs => $tabs, 
-    current_tab => 'Admin/Global/CustomFields/index.html', 
-    current_subtab => $current_tab, 
-    Title => $Title &>
-<%INIT>
-
-my $tabs = {
-
-    A => {
-        title => loc('Users'),
-        text => loc('Select custom fields for all users'),
-        path => 'Admin/Global/CustomFields/Users.html',
-    },
-
-    B => {
-        title => loc('Groups'),
-        text => loc('Select custom fields for all user groups'),
-        path => 'Admin/Global/CustomFields/Groups.html',
-    },
-
-    C => {
-        title => loc('Queues'),
-        text => loc('Select custom fields for all queues'),
-        path => 'Admin/Global/CustomFields/Queues.html',
-    },
-
-    F => {
-        title => loc('Tickets'),
-        text => loc('Select custom fields for tickets in all queues'),
-        path => 'Admin/Global/CustomFields/Queue-Tickets.html',
-    },
-
-    G => {
-        title => loc('Ticket Transactions'),
-        text => loc('Select custom fields for transactions on tickets in all queues'),
-        path => 'Admin/Global/CustomFields/Queue-Transactions.html',
-    },
-
-};
-  # Now let callbacks add their extra tabs
-  $m->callback( %ARGS, tabs => $tabs );
-
-  foreach my $tab (sort keys %{$tabs}) {
-    if ($tabs->{$tab}->{'path'} eq $current_tab) {
-      $tabs->{$tab}->{"subtabs"} = $subtabs;
-      $tabs->{$tab}->{"current_subtab"} = $current_subtab;
-    }
-  }
-</%INIT>
-
-  
-<%ARGS>
-$id => undef
-$current_tab => ''
-$subtabs => undef
-$current_subtab => undef
-$Title => undef
-</%ARGS>
diff --git a/share/html/Admin/Elements/GroupTabs b/share/html/Admin/Elements/GroupTabs
deleted file mode 100755
index f20259e..0000000
--- a/share/html/Admin/Elements/GroupTabs
+++ /dev/null
@@ -1,102 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-<& /Admin/Elements/Tabs, 
-    subtabs => $tabs, 
-    current_tab => 'Admin/Groups/', 
-    current_subtab => $current_tab, 
-    Title => $Title &>
-<%INIT>
-my $tabs;
-
-if ( $GroupObj and $GroupObj->id ) {
-$tabs->{"this"} = { class => "currentnav",                                                           
-                    path  => "Admin/Groups/Modify.html?id=" . $GroupObj->id,
-                    title => $GroupObj->Name,
-                    current_subtab => $current_subtab,
-        subtabs => {
-        C => { title => loc('Basics'),
-               path  => "Admin/Groups/Modify.html?id=" . $GroupObj->id },
-
-        D => { title => loc('Members'),
-               path  => "Admin/Groups/Members.html?id=" . $GroupObj->id },
-
-        F => { title => loc('Group Rights'),
-               path  => "Admin/Groups/GroupRights.html?id=" . $GroupObj->id, },
-        G => { title => loc('User Rights'),
-               path  => "Admin/Groups/UserRights.html?id=" . $GroupObj->id, },
-        H => { title => loc('History'),
-               path  => "Admin/Groups/History.html?id=" . $GroupObj->id },
-    }
-}
-}
-$tabs->{"A"} = { title => loc('Select'),
-                 path  => "Admin/Groups/", };
-$tabs->{"B"} = { title     => loc('Create'),
-                 path      => "Admin/Groups/Modify.html?Create=1",
-		 separator => 1, };
-
-# Now let callbacks add their extra tabs
-$m->callback( %ARGS, tabs => $tabs );
-foreach my $tab ( sort keys %{$tabs->{'this'}->{'subtabs'}} ) {  
-    if ( $tabs->{'this'}->{'subtabs'}->{$tab}->{'path'} eq $current_tab ) {
-        $tabs->{'this'}->{'subtabs'}->{$tab}->{"subtabs"}        = $subtabs; 
-        $tabs->{'this'}->{'subtabs'}->{$tab}->{"current_subtab"} = $current_subtab; 
-    }                                                                           
-}   
-        $tabs->{'this'}->{"current_subtab"} = $current_tab; 
-        $current_tab = "Admin/Groups/Modify.html?id=".$GroupObj->id if $GroupObj;
-
-</%INIT>
-<%ARGS>
-$GroupObj => undef
-$subtabs => undef
-$current_subtab => undef
-$current_tab => undef
-$Title => undef
-</%ARGS>
-
diff --git a/share/html/Admin/Elements/ObjectCustomFields b/share/html/Admin/Elements/ObjectCustomFields
index f076e5b..92402e4 100644
--- a/share/html/Admin/Elements/ObjectCustomFields
+++ b/share/html/Admin/Elements/ObjectCustomFields
@@ -46,17 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& $ObjectTabs,
-$id ? (
-    id => $Object->id, 
-    current_tab => "Admin/$Types/CustomFields.html?$sub_type_url&id=".$id, 
-    current_subtab => "Admin/$Types/CustomFields.html?$sub_type_url&id=".$id, 
-    "${Type}Obj" => $Object,
-) : (
-    current_tab => "Admin/Global/CustomFields/${QualifiedType}s.html",
-),
-    Title => $title
-    &>
+<& /Elements/Tabs &>
 
 <& /Admin/Elements/EditCustomFields, %ARGS, title => $title, Object => $Object &>
 <%INIT>
@@ -68,7 +58,6 @@ $id ? (
 
 my $Type = $1;
 my $Types = $Type.'s';
-my $ObjectTabs;
 my $Object = $ObjectType->new($session{'CurrentUser'});
 
 
@@ -83,10 +72,6 @@ if (defined $SubType && $SubType =~/^RT::(.*)$/)  {
 
 if ($id) { 
     $Object->Load($id) || Abort(loc("Couldn't load object [_1]", $id), SuppressHeader => 1);
-    $ObjectTabs = "/Admin/Elements/${Type}Tabs";
-} else {
-    $ObjectTabs = "/Admin/Elements/GlobalCustomFieldTabs";
-
 } 
 
 my $title; 
diff --git a/share/html/Admin/Elements/QueueTabs b/share/html/Admin/Elements/QueueTabs
deleted file mode 100755
index 88b62ee..0000000
--- a/share/html/Admin/Elements/QueueTabs
+++ /dev/null
@@ -1,123 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-<& /Admin/Elements/Tabs, 
-    subtabs => $tabs, 
-    current_tab => 'Admin/Queues/', 
-    current_subtab => $current_tab, 
-    Title => $Title &>
-
-<%INIT>
-my $tabs;
-if ($id) {
-  $tabs->{'this'}  = {
-                title => $QueueObj->Name,
-  		     	path => "Admin/Queues/Modify.html?id=".$id,
-                    current_subtab => $current_tab,     
-                subtabs => {
-		 C => { title => loc('Basics'),
-  		     	path => "Admin/Queues/Modify.html?id=".$id,
-			   },
-		 D => { title => loc('Watchers'),
-		 	path => "Admin/Queues/People.html?id=".$id,
-		      },
-
-		 E => { title => loc('Scrips'),
-			     path => "Admin/Queues/Scrips.html?id=".$id,
-			   },
-		 F => { title => loc('Templates'),
-				path => "Admin/Queues/Templates.html?id=".$id,
-			      },
-
-                 G1 => { title => loc('Ticket Custom Fields'),
-                        path => 'Admin/Queues/CustomFields.html?SubType=RT::Ticket&id='.$id,
-                        },
-
-                 G2 => { title => loc('Transaction Custom Fields'),
-                        path => 'Admin/Queues/CustomFields.html?SubType=RT::Ticket-RT::Transaction&id='.$id,
-                        },
-
-		 H => { title => loc('Group Rights'),
-			  path => "Admin/Queues/GroupRights.html?id=".$id,
-			},	
-		 I => { title => loc('User Rights'),
-			  path => "Admin/Queues/UserRights.html?id=".$id,
-			},
-			J => { title => loc('History'),
-			  path  => "Admin/Queues/History.html?id=" . $QueueObj->id 
-			},
-        }
-        };
-}
-if ($session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminQueue')) {
-  $tabs->{"A"} = { title => loc('Select'),
-  		     	path => "Admin/Queues/",
-			   };
-  $tabs->{"B"} = { title => loc('Create'),
-  		     	path => "Admin/Queues/Modify.html?Create=1",
-		 separator => 1, };
-}
-
-  # Now let callbacks add their extra tabs
-  $m->callback( %ARGS, tabs => $tabs );
-foreach my $tab ( sort keys %{$tabs->{'this'}->{'subtabs'}} ) {  
-    if ( $tabs->{'this'}->{'subtabs'}->{$tab}->{'path'} eq $current_tab ) {
-        $tabs->{'this'}->{'subtabs'}->{$tab}->{"subtabs"}        = $subtabs; 
-        $tabs->{'this'}->{'subtabs'}->{$tab}->{"current_subtab"} = $current_subtab; 
-    }                                                                           
-}   
-  		     	$current_tab = "Admin/Queues/Modify.html?id=".$id if $id;
-</%INIT>
-  
-<%ARGS>
-$QueueObj => undef
-$id => undef
-$subtabs => undef
-$current_subtab => ''
-$current_tab => ''
-$Title => undef
-</%ARGS>
diff --git a/share/html/Admin/Elements/SystemTabs b/share/html/Admin/Elements/SystemTabs
deleted file mode 100755
index 58ea660..0000000
--- a/share/html/Admin/Elements/SystemTabs
+++ /dev/null
@@ -1,102 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-<& /Admin/Elements/Tabs, subtabs => $tabs, 
-    current_tab => 'Admin/Global/', 
-    current_subtab => $current_tab, 
-    Title => $Title &>
-
-<%INIT>
-  my $tabs = {
-                
-               A => { title => loc('Scrips'),
-                           path => 'Admin/Global/Scrips.html',
-                         },
-               B => { title => loc('Templates'),
-                        path => 'Admin/Global/Templates.html',
-                      },
-              
-                F => { title => loc('Custom Fields'),
-                        path => 'Admin/Global/CustomFields/index.html',
-                        },
-
-                G => { title => loc('Group Rights'),
-                                path => 'Admin/Global/GroupRights.html',
-                      },
-                H => { title => loc('User Rights'),
-                                path => 'Admin/Global/UserRights.html',
-                      },
-                I => { title => loc('RT at a glance'),
-                                path => 'Admin/Global/MyRT.html',
-                      },
-                J => { title => loc('Theme'),
-                                path => 'Admin/Global/Theme.html',
-                      },
-
-};
-
-  # Now let callbacks add their extra tabs
-  $m->callback( %ARGS, tabs => $tabs );
-
-  if ($current_tab) {
-    foreach my $tab (sort keys %{$tabs}) {
-      if ($tabs->{$tab}->{'path'} eq $current_tab) {
-        $tabs->{$tab}->{"subtabs"} = $subtabs || {};
-        $tabs->{$tab}->{"current_subtab"} = $current_subtab;
-      }
-    }
-  }
-</%INIT>
-
-  
-<%ARGS>
-$id => undef
-$current_tab => undef
-$subtabs => undef
-$current_subtab => undef
-$Title => undef
-</%ARGS>
diff --git a/share/html/Admin/Elements/Tabs b/share/html/Admin/Elements/Tabs
deleted file mode 100755
index e187f73..0000000
--- a/share/html/Admin/Elements/Tabs
+++ /dev/null
@@ -1,95 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-<& /Elements/Tabs, 
-    tabs => $tabs, 
-    current_toptab => 'Admin/', 
-    current_tab => $current_tab, 
-    Title => $Title &>
-
-<%INIT>
-  my $tabs = { A => { title => loc('Users'),
-			  path => 'Admin/Users/',
-			},
-	       B => { title => loc('Groups'),
-			   path => 'Admin/Groups/',
-			 },
-	       C => { title => loc('Queues'),
-			   path => 'Admin/Queues/',
-			 },
-	       D => { 'title' => loc('Custom Fields'),
-			   path => 'Admin/CustomFields/',
-			 },
-	       E => { 'title' => loc('Global'),
-			   path => 'Admin/Global/',
-			 },
-	       F => { 'title' => loc('Tools'),
-			   path => 'Admin/Tools/',
-			 },
-	     };
-
-  # Now let callbacks add their extra tabs
-  $m->callback( %ARGS, tabs => $tabs );
-
-  if( defined $current_tab ) {
-    foreach my $tab (keys %{$tabs}) {
-      if ($tabs->{$tab}->{'path'} eq $current_tab) {
-        $tabs->{$tab}->{"subtabs"}        = $subtabs;
-        $tabs->{$tab}->{"current_subtab"} = $current_subtab;
-      }
-    }
-  }
-
-</%INIT>
-
-
-<%ARGS>
-$subtabs => undef
-$current_tab => undef
-$current_subtab => undef
-$Title => undef
-</%ARGS>
diff --git a/share/html/Admin/Elements/ToolTabs b/share/html/Admin/Elements/ToolTabs
deleted file mode 100755
index 63edf8e..0000000
--- a/share/html/Admin/Elements/ToolTabs
+++ /dev/null
@@ -1,85 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-<& /Admin/Elements/Tabs,
-    Title          => $Title,
-    current_tab    => 'Admin/Tools/',
-    subtabs        => $tabs,
-    current_subtab => $current_tab,
-&>
-
-<%INIT>
-    my $tabs = {
-        A => { title => loc('System Configuration'),
-               path => 'Admin/Tools/Configuration.html',
-        },
-        B => { title => loc('SQL Queries'),
-               path => 'Admin/Tools/Queries.html',
-        },
-        E => { title => loc('Shredder'),
-               path  => 'Admin/Tools/Shredder/',
-        },
-    };
-
-    # Now let callbacks add their extra tabs
-    $m->callback( %ARGS, tabs => $tabs );
-
-    foreach my $tab ( values %{$tabs} ) {
-        next unless $tab->{'path'} eq $current_tab;
-
-        $tab->{"subtabs"} = $subtabs;
-        $tab->{"current_subtab"} = $current_subtab;
-    }
-</%INIT>
-
-<%ARGS>
-$id => undef
-$current_tab => undef
-$subtabs => undef
-$current_subtab => undef
-$Title => undef
-</%ARGS>
diff --git a/share/html/Admin/Elements/UserTabs b/share/html/Admin/Elements/UserTabs
deleted file mode 100755
index 86d9ba7..0000000
--- a/share/html/Admin/Elements/UserTabs
+++ /dev/null
@@ -1,116 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-<& /Admin/Elements/Tabs, 
-    subtabs => $tabs,
-    current_tab => 'Admin/Users/', 
-    current_subtab => $current_tab, 
-    Title => $Title &>
-<%INIT>
-my $tabs;
-if ($id) {
-$tabs->{'this'} = { title => eval { $UserObj->Name },
-
-		path => "Admin/Users/Modify.html?id=".$id,
-subtabs => {
-	       Basics => { title => loc('Basics'),
-				path => "Admin/Users/Modify.html?id=".$id
-			},
-	       Memberships => { title => loc('Memberships'),
-			   path => "Admin/Users/Memberships.html?id=".$id
-			 },
-	       History => { title => loc('History'),
-			   path => "Admin/Users/History.html?id=".$id
-			 },
-	       'MyRT' => { title => loc('RT at a glance'),
-			   path => "Admin/Users/MyRT.html?id=".$id
-			 },
-	}
-};
-    if ( RT->Config->Get('GnuPG')->{'Enable'} ) {
-        $tabs->{'this'}{'subtabs'}{'GnuPG'} = {
-            title => loc('GnuPG'),
-            path  => "Admin/Users/GnuPG.html?id=".$id,
-        };
-    }
-}
-
-if ($session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminUsers')) {
-  $tabs->{"A"} = { title => loc('Select'),
-  		     	path => "Admin/Users/",
-			   };
-  $tabs->{"B"} = { title => loc('Create'),
-  		     	path => "Admin/Users/Modify.html?Create=1",
-		separator => 1,
-	};
-}
-
-  # Now let callbacks add their extra tabs
-  $m->callback( %ARGS, tabs => $tabs );
-                                                                                
-#foreach my $tab ( sort keys %{$tabs} ) {                                        
-#    if ( $tabs->{$tab}->{'path'} eq $current_subtab ) {                         
-#        $tabs->{$tab}->{"current_subtab"} = $current_subtab;                    
-#    }                                                                           
-#}                                                                               
-foreach my $tab ( sort keys %{$tabs->{'this'}->{'subtabs'}} ) {  
-    if ( $tabs->{'this'}->{'subtabs'}->{$tab}->{'path'} eq $current_tab ) {
-        $tabs->{'this'}->{'subtabs'}->{$tab}->{"subtabs"}        = $subtabs; 
-        $tabs->{'this'}->{'subtabs'}->{$tab}->{"current_subtab"} = $current_subtab; 
-    }                                                                           
-}   
-$tabs->{'this'}->{"current_subtab"} = $current_tab; 
-$current_tab = "Admin/Users/Modify.html?id=".$id if $id;
-</%INIT>
-<%ARGS>
-$UserObj => undef
-$id => undef
-$current_tab => undef
-$subtabs => undef
-$current_subtab => undef
-$Title => undef
-</%ARGS>
diff --git a/share/html/Admin/Global/CustomFields/Groups.html b/share/html/Admin/Global/CustomFields/Groups.html
index 51839fe..815e0b4 100644
--- a/share/html/Admin/Global/CustomFields/Groups.html
+++ b/share/html/Admin/Global/CustomFields/Groups.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/GlobalCustomFieldTabs,
-    current_tab => "Admin/Global/CustomFields/Groups.html",
-    current_subtab => "Admin/Global/CustomFields/Groups.html",
-    Title => $title
+<& /Elements/Tabs
     &>
     <& /Admin/Elements/EditCustomFields, %ARGS, title => $title, ObjectType => 'RT::Group', Object=> $object &>
 <%INIT>
diff --git a/share/html/Admin/Global/CustomFields/Queue-Tickets.html b/share/html/Admin/Global/CustomFields/Queue-Tickets.html
index 08a30e8..1838d0a 100755
--- a/share/html/Admin/Global/CustomFields/Queue-Tickets.html
+++ b/share/html/Admin/Global/CustomFields/Queue-Tickets.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/GlobalCustomFieldTabs,
-    current_tab => "Admin/Global/CustomFields/Queue-Tickets.html",
-    current_subtab => "Admin/Global/CustomFields/Queue-Tickets.html",
-    Title => $title
+<& /Elements/Tabs
     &>
     <& /Admin/Elements/EditCustomFields, %ARGS, title => $title, ObjectType => 'RT::Queue', Object=> $object, SubType => 'RT::Ticket' &>
 <%INIT>
diff --git a/share/html/Admin/Global/CustomFields/Queue-Transactions.html b/share/html/Admin/Global/CustomFields/Queue-Transactions.html
index 5eef8d9..160d7ca 100755
--- a/share/html/Admin/Global/CustomFields/Queue-Transactions.html
+++ b/share/html/Admin/Global/CustomFields/Queue-Transactions.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/GlobalCustomFieldTabs,
-    current_tab => "Admin/Global/CustomFields/Queue-Transactions.html",
-    current_subtab => "Admin/Global/CustomFields/Queue-Transactions.html",
-    Title => $title
+<& /Elements/Tabs
     &>
     <& /Admin/Elements/EditCustomFields, %ARGS, title => $title, ObjectType => 'RT::Queue', Object=> $object, SubType => 'RT::Ticket-RT::Transaction' &>
 <%INIT>
diff --git a/share/html/Admin/Global/CustomFields/Queues.html b/share/html/Admin/Global/CustomFields/Queues.html
index aa57c4d..b3d8a92 100644
--- a/share/html/Admin/Global/CustomFields/Queues.html
+++ b/share/html/Admin/Global/CustomFields/Queues.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/GlobalCustomFieldTabs,
-    current_tab => "Admin/Global/CustomFields/Queues.html",
-    current_subtab => "Admin/Global/CustomFields/Queues.html",
-    Title => $title
+<& /Elements/Tabs
     &>
     <& /Admin/Elements/EditCustomFields, %ARGS, title => $title, ObjectType => 'RT::Queue', Object=> $object &>
 <%INIT>
diff --git a/share/html/Admin/Global/CustomFields/Users.html b/share/html/Admin/Global/CustomFields/Users.html
index 38cc1f1..33972e5 100644
--- a/share/html/Admin/Global/CustomFields/Users.html
+++ b/share/html/Admin/Global/CustomFields/Users.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/GlobalCustomFieldTabs,
-    current_tab => "Admin/Global/CustomFields/Users.html",
-    current_subtab => "Admin/Global/CustomFields/Users.html",
-    Title => $title
+<& /Elements/Tabs
     &>
     <& /Admin/Elements/EditCustomFields, %ARGS, title => $title, ObjectType => 'RT::User', Object=> $object &>
 <%INIT>
diff --git a/share/html/Admin/Global/CustomFields/index.html b/share/html/Admin/Global/CustomFields/index.html
index cbbf481..80f5da1 100644
--- a/share/html/Admin/Global/CustomFields/index.html
+++ b/share/html/Admin/Global/CustomFields/index.html
@@ -47,7 +47,7 @@
 %# END BPS TAGGED BLOCK }}}
 % $m->callback( %ARGS, tabs => $tabs );
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/GlobalCustomFieldTabs, Title => $title &>
+<& /Elements/Tabs &>
 
 <ul>
 % foreach my $key (sort keys %$tabs) {
diff --git a/share/html/Admin/Global/GroupRights.html b/share/html/Admin/Global/GroupRights.html
index ca0ac62..fb8bd1b 100755
--- a/share/html/Admin/Global/GroupRights.html
+++ b/share/html/Admin/Global/GroupRights.html
@@ -46,9 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => loc('Modify global group rights') &>
-<& /Admin/Elements/SystemTabs, 
-    current_tab => 'Admin/Global/GroupRights.html', 
-    Title => loc('Modify global group rights') &>  
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>
 
 <form method="post" action="GroupRights.html" id="ModifyGroupRights" name="ModifyGroupRights">
@@ -63,5 +61,3 @@ my @results = ProcessACLs(\%ARGS);
 # Principal collections
 my @principals = GetPrincipalsMap($RT::System, qw(System Roles Groups));
 </%INIT>
-<%ARGS>
-</%ARGS>
diff --git a/share/html/Admin/Global/MyRT.html b/share/html/Admin/Global/MyRT.html
index da9cb22..2f67984 100644
--- a/share/html/Admin/Global/MyRT.html
+++ b/share/html/Admin/Global/MyRT.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => loc("RT at a glance") &>
-<& /Admin/Elements/SystemTabs,
-    current_tab => 'Admin/Global/MyRT.html',
-    Title => loc("RT at a glance"),
-&>
+<& /Elements/Tabs &>
 
 <& /Widgets/SelectionBox:header, nojs => 1 &>
 
diff --git a/share/html/Admin/Global/Scrip.html b/share/html/Admin/Global/Scrip.html
index 53eb22f..93ad265 100755
--- a/share/html/Admin/Global/Scrip.html
+++ b/share/html/Admin/Global/Scrip.html
@@ -46,41 +46,18 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/SystemTabs, 
-    current_tab => 'Admin/Global/Scrips.html', 
-    current_subtab => $current_subtab, 
-    subtabs => $subtabs, 
-    Title => $title &>
-
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>
 <& /Admin/Elements/EditScrip, title => $title,  %ARGS, id => $id &>
 
 <%init>
-my $subtabs = {
-    A => {
-        title     => loc('Select'),
-        path      => "Admin/Global/Scrips.html",
-    },
-    B => {
-        title     => loc('New'),
-        path      => "Admin/Global/Scrip.html?create=1&Queue=0",
-        separator => 1,
-    },
-};
-
 my ($id, @results) = $m->comp( '/Admin/Elements/EditScrip:Process', %ARGS );
 
-my ($title, $current_subtab);
+my ($title);
 if ( $id ) {
-    $current_subtab = "Admin/Global/Scrip.html?id=$id&Queue=0";
     $title = loc("Modify a scrip that applies to all queues");
-    $subtabs->{"C"} = {
-        title => loc('Scrip #[_1]', $id),
-        path  => "Admin/Global/Scrip.html?id=$id&Queue=0",
-    };
 }
 else {
-    $current_subtab = "Admin/Global/Scrip.html?create=1&Queue=0";
     $title = loc("Add a scrip which will apply to all queues");
 }
 </%init>
diff --git a/share/html/Admin/Global/Scrips.html b/share/html/Admin/Global/Scrips.html
index 7fe3a14..baafe50 100755
--- a/share/html/Admin/Global/Scrips.html
+++ b/share/html/Admin/Global/Scrips.html
@@ -46,32 +46,13 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title  &>
-<& /Admin/Elements/SystemTabs, 
-    current_tab => 'Admin/Global/Scrips.html', 
-    current_subtab => 'Admin/Global/Scrips.html', 
-    subtabs => $subtabs, 
-    Title => $title &>
+<& /Elements/Tabs &>
 <& /Admin/Elements/EditScrips, title => $title, id => $id, %ARGS &>
 </form>
 <%init>
-
-my $subtabs = {
-		 A => { title => loc('Select'),
-  		     	path => "Admin/Global/Scrips.html",
-			   },
-		 B => { title => loc('Create'),
-  		     	path => "Admin/Global/Scrip.html?create=1&Queue=0",
-			separator => 1,
-			   }
-	      };
 my $title = loc("Modify scrips which apply to all queues");
-
 my (@actions);
-
 </%init>
-
-
-
 <%ARGS>
 $id => 0
 </%ARGS>
diff --git a/share/html/Admin/Global/Template.html b/share/html/Admin/Global/Template.html
index 185de19..a5fb3a1 100755
--- a/share/html/Admin/Global/Template.html
+++ b/share/html/Admin/Global/Template.html
@@ -46,11 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/SystemTabs, 
-    current_tab => 'Admin/Global/Templates.html', 
-    current_subtab => $current_subtab, 
-    subtabs => $subtabs, 
-    Title => $title &>
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>
 
 <form method="post" name="ModifyTemplate" id="ModifyTemplate" action="Template.html">
@@ -75,21 +71,10 @@
 <%INIT>
 
 my $TemplateObj = RT::Template->new($session{'CurrentUser'});
-my  ($title, @results, $current_subtab, $SubmitLabel);
-
-my $subtabs = {
-		 A => { title => loc('Select'),
-  		     	path => "Admin/Global/Templates.html"
-			   },
-		 B => { title => loc('New'),
-  		     	path => "Admin/Global/Template.html?Create=1&Queue=0",
-			separator => 1,
-			   }
-	      };
+my  ($title, @results, $SubmitLabel);
 
 if ($Create) {
   $title = loc("Create a template");
-  $current_subtab = "Admin/Global/Template.html?Create=1&Queue=0";
   $SubmitLabel = loc('Create');
 }
 
@@ -111,10 +96,6 @@ if ($TemplateObj->Id()) {
   my @aresults = UpdateRecordObject( AttributesRef => \@attribs, 
 				     Object => $TemplateObj, 
 				     ARGSRef => \%ARGS);
-  $current_subtab = "Admin/Global/Template.html?Queue=0&Template=".$TemplateObj->Id();
-  $subtabs->{"C"} = { title => loc('Template #[_1]', $TemplateObj->Id()),
-  		     	path => "Admin/Global/Template.html?Queue=0&Template=".$TemplateObj->Id(),
-			};
   push @results, @aresults;
 
   my ($ok, $msg) = $TemplateObj->CompileCheck;
diff --git a/share/html/Admin/Global/Templates.html b/share/html/Admin/Global/Templates.html
index dfb5a49..81c14a8 100755
--- a/share/html/Admin/Global/Templates.html
+++ b/share/html/Admin/Global/Templates.html
@@ -46,32 +46,13 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title, FeedURI => 'templates' &>
-<& /Admin/Elements/SystemTabs, 
-    current_tab => 'Admin/Global/Templates.html', 
-    current_subtab => 'Admin/Global/Templates.html', 
-    subtabs => $subtabs, 
-    Title => $title &>
+<& /Elements/Tabs &>
 <& /Admin/Elements/EditTemplates, title => $title, %ARGS &>
 </form>
 <%init>
-
-my $subtabs = {
-		 A => { title => loc('Select'),
-  		     	path => "Admin/Global/Templates.html"
-			   },
-		 B => { title => loc('Create'),
-  		     	path => "Admin/Global/Template.html?Create=1&Queue=0",
-			separator => 1,
-			   }
-	      };
 my $title = loc("Modify templates which apply to all queues");
-
 my (@actions);
-
 </%init>
-
-
-
 <%ARGS>
 $id => undef
 </%ARGS>
diff --git a/share/html/Admin/Global/Theme.html b/share/html/Admin/Global/Theme.html
index 276d704..c3894c1 100644
--- a/share/html/Admin/Global/Theme.html
+++ b/share/html/Admin/Global/Theme.html
@@ -49,9 +49,7 @@
     Title => loc("Theme"),
     LinkRel => { stylesheet => '/NoAuth/css/farbtastic.css' }
     &>
-<& /Admin/Elements/SystemTabs, 
-    current_tab => 'Admin/Global/Theme.html', 
-    Title => loc("Theme") &>
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>
 
 <script type="text/javascript" src="<%RT->Config->Get('WebPath')%>/NoAuth/js/farbtastic.js"></script>
diff --git a/share/html/Admin/Global/UserRights.html b/share/html/Admin/Global/UserRights.html
index 2e9e245..85410ba 100755
--- a/share/html/Admin/Global/UserRights.html
+++ b/share/html/Admin/Global/UserRights.html
@@ -46,9 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => loc('Modify global user rights') &>
-<& /Admin/Elements/SystemTabs, 
-    current_tab => 'Admin/Global/UserRights.html',
-    Title => loc('Modify global user rights') &>  
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>
 
 <form method="post" action="UserRights.html" name="ModifyUserRights" id="ModifyUserRights">
@@ -56,7 +54,6 @@
   <& /Elements/Submit, Label => loc('Modify User Rights'), Reset => 1 &>
 </form>
 <%INIT>
-# Update the acls.
 my @results = ProcessACLs(\%ARGS);
 my @principals = GetPrincipalsMap($RT::System, 'Users');
 </%INIT>
diff --git a/share/html/Admin/Global/index.html b/share/html/Admin/Global/index.html
index 8ea14e8..f7667cf 100755
--- a/share/html/Admin/Global/index.html
+++ b/share/html/Admin/Global/index.html
@@ -45,13 +45,11 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-% $m->callback( %ARGS, tabs => $tabs );
 <& /Admin/Elements/Header, Title => loc('Admin/Global configuration') &>
-<& /Admin/Elements/SystemTabs, 
-    Title => loc('Admin/Global configuration') &>
-    <& /Elements/ListMenu, items => $tabs &>
+<& /Elements/Tabs &>
+    <& /Elements/ListMenu, items => $items &>
 <%INIT>
-  my $tabs = {
+  my $items = {
                 
                A => { title => loc('Scrips'),
                            text => loc('Modify scrips which apply to all queues'),
diff --git a/share/html/Admin/Groups/GroupRights.html b/share/html/Admin/Groups/GroupRights.html
index 268ecf2..8e99ec8 100755
--- a/share/html/Admin/Groups/GroupRights.html
+++ b/share/html/Admin/Groups/GroupRights.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => loc('Modify group rights for group [_1]', $GroupObj->Name) &>
-<& /Admin/Elements/GroupTabs, 
-    GroupObj => $GroupObj, 
-    current_tab => 'Admin/Groups/GroupRights.html?id='.$id, 
-    Title => loc('Modify group rights for group [_1]', $GroupObj->Name) &>
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>
 
   <form method="post" action="GroupRights.html" id="ModifyGroupRights" name="ModifyGroupRights">
diff --git a/share/html/Admin/Groups/History.html b/share/html/Admin/Groups/History.html
index abcb18a..d685d28 100644
--- a/share/html/Admin/Groups/History.html
+++ b/share/html/Admin/Groups/History.html
@@ -46,11 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title  &>
-<& /Admin/Elements/GroupTabs, 
-    id => $id, 
-    GroupObj => $GroupObj,
-    current_subtab => $current_tab, 
-    Title => $title &>
+<& /Elements/Tabs &>
 
 <& /Ticket/Elements/ShowHistory,
     Ticket => $GroupObj,
@@ -58,7 +54,6 @@
 &>
 
 <%INIT>
-my $current_tab = 'Admin/Groups/History.html?id='.$id;
 my $GroupObj = RT::Group->new($session{'CurrentUser'});
 $GroupObj->Load($id) || Abort("Couldn't load group '$id'");
 my $title = loc("History of the group [_1]", $GroupObj->Name);
diff --git a/share/html/Admin/Groups/Members.html b/share/html/Admin/Groups/Members.html
index ec2c0f6..6793d79 100755
--- a/share/html/Admin/Groups/Members.html
+++ b/share/html/Admin/Groups/Members.html
@@ -46,9 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/GroupTabs, GroupObj => $Group, 
-    current_tab => 'Admin/Groups/Members.html?id='.$id, 
-    Title => $title &>
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>
 
 <form action="<% RT->Config->Get('WebPath') %>/Admin/Groups/Members.html" method="post">
diff --git a/share/html/Admin/Groups/Modify.html b/share/html/Admin/Groups/Modify.html
index b81c9f8..5e9cce5 100755
--- a/share/html/Admin/Groups/Modify.html
+++ b/share/html/Admin/Groups/Modify.html
@@ -47,10 +47,7 @@
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title  &>
 
-<& /Admin/Elements/GroupTabs, 
-    GroupObj => $Group, 
-    current_tab => $current_tab, 
-    Title => $title &>
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>
 
 
@@ -99,18 +96,15 @@
 </form>
 <%INIT>
 
-my $current_tab;
 my  ($title, @results, $Disabled, $EnabledChecked);
 
 my $Group = RT::Group->new($session{'CurrentUser'});
 
 if ($Create) {
-    $current_tab = 'Admin/Groups/Modify.html?Create=1';
     $title = loc("Create a new group");
 } 
 
 else {
-    $current_tab = 'Admin/Groups/Modify.html?id='.$id;
     if ($id eq 'new' ) {
 	
 	my ($create_id, $create_msg) = $Group->CreateUserDefinedGroup(Name =>
diff --git a/share/html/Admin/Groups/UserRights.html b/share/html/Admin/Groups/UserRights.html
index c0209c6..c547b32 100755
--- a/share/html/Admin/Groups/UserRights.html
+++ b/share/html/Admin/Groups/UserRights.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => loc('Modify user rights for group [_1]', $GroupObj->Name) &>
-<& /Admin/Elements/GroupTabs, 
-    GroupObj => $GroupObj, 
-    current_tab => 'Admin/Groups/UserRights.html?id='.$id, 
-    Title => loc('Modify user rights for group [_1]', $GroupObj->Name) &>  
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>
 
   <form method="post" action="UserRights.html" name="ModifyUserRights" id="ModifyUserRights">
diff --git a/share/html/Admin/Groups/index.html b/share/html/Admin/Groups/index.html
index ba03568..34d8f98 100755
--- a/share/html/Admin/Groups/index.html
+++ b/share/html/Admin/Groups/index.html
@@ -46,9 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/GroupTabs, current_tab => 'Admin/Groups/',
-    current_subtab => 'Admin/Groups/', 
-    Title => $title &>
+<& /Elements/Tabs &>
 <% $caption %>:<br />
 
 % unless ( $Groups->Count ) {
diff --git a/share/html/Admin/Queues/CustomField.html b/share/html/Admin/Queues/CustomField.html
index da3b8ff..62a7982 100755
--- a/share/html/Admin/Queues/CustomField.html
+++ b/share/html/Admin/Queues/CustomField.html
@@ -46,12 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/QueueTabs, id => $QueueObj->Id, 
-    QueueObj => $QueueObj,                                                      
-    current_tab => 'Admin/Queues/CustomFields.html?id='.$QueueObj->id, 
-    current_subtab => $current_subtab, 
-    subtabs => $subtabs, 
-    Title => $title &>
+<& /Elements/Tabs &>
 
 <& /Admin/Elements/EditCustomField, title => $title, %ARGS &>
 
@@ -59,7 +54,7 @@
 my $QueueObj = RT::Queue->new($session{'CurrentUser'});
 $QueueObj->Load($Queue);
 
-my ($title, $current_subtab);
+my ($title);
 
 unless($QueueObj->id) {
     Abort(loc("Queue [_1] not found", $Queue));
@@ -67,16 +62,8 @@ unless($QueueObj->id) {
 if ($CustomField) {
     $title = loc('Modify a CustomField for queue [_1]', $QueueObj->Name()); 
 }else {
-    $current_subtab = "Admin/Queues/CustomField.html?create=1&Queue=".$QueueObj->id;
     $title = loc('Create a CustomField for queue [_1]', $QueueObj->Name()); 
 }
-
-my $subtabs = {
-		 A => { title => loc('New custom field'),
-  		     	path => "Admin/Queues/CustomField.html?create=1&Queue=".$QueueObj->id
-			   }
-	      };
-
 </%INIT>
 <%ARGS>
 $CustomField => undef
diff --git a/share/html/Admin/Queues/CustomFields.html b/share/html/Admin/Queues/CustomFields.html
index 8f2e1c2..2975cce 100755
--- a/share/html/Admin/Queues/CustomFields.html
+++ b/share/html/Admin/Queues/CustomFields.html
@@ -46,12 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<&    /Admin/Elements/QueueTabs,
-    id => $Object->id, 
-    current_tab => "Admin/Queues/CustomFields.html?SubType=$SubType&id=$id", 
-    current_subtab => "Admin/Queues/CustomFields.html?SubType=$SubType&id=$id", 
-    QueueObj => $Object,
-    Title => $title
+<&    /Elements/Tabs
     &>
 
     <& /Admin/Elements/EditCustomFields, %ARGS, title => $title, Object => $Object, ObjectType => 'RT::Queue' &>
diff --git a/share/html/Admin/Queues/GroupRights.html b/share/html/Admin/Queues/GroupRights.html
index 93a9b51..d19584b 100755
--- a/share/html/Admin/Queues/GroupRights.html
+++ b/share/html/Admin/Queues/GroupRights.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => loc('Modify group rights for queue [_1]', $QueueObj->Name) &>
-<& /Admin/Elements/QueueTabs, id => $id, 
-    QueueObj => $QueueObj,
-    current_tab => $current_tab, 
-    Title => loc('Modify group rights for queue [_1]', $QueueObj->Name) &>
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>
 
 <form method="post" action="GroupRights.html" id="ModifyGroupRights" name="ModifyGroupRights">
@@ -73,8 +70,6 @@ if (!defined $id) {
 my $QueueObj = RT::Queue->new($session{'CurrentUser'});
 $QueueObj->Load($id) || Abort(loc("Couldn't load queue [_1]",$id));
 
-my $current_tab = 'Admin/Queues/GroupRights.html?id='.$QueueObj->id;
-
 # Principal collections
 my @principals = GetPrincipalsMap($QueueObj, qw(System Roles Groups));
 </%INIT>
diff --git a/share/html/Admin/Queues/History.html b/share/html/Admin/Queues/History.html
index b33beff..6a19eba 100644
--- a/share/html/Admin/Queues/History.html
+++ b/share/html/Admin/Queues/History.html
@@ -46,11 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title  &>
-<& /Admin/Elements/QueueTabs, 
-    id => $id, 
-    QueueObj => $QueueObj,
-    current_subtab => $current_tab, 
-    Title => $title &>
+<& /Elements/Tabs &>
 
 <& /Ticket/Elements/ShowHistory,
     Ticket => $QueueObj,
@@ -58,7 +54,6 @@
 &>
 
 <%INIT>
-my $current_tab = 'Admin/Queues/History.html?id='.$id;
 my $QueueObj = RT::Queue->new($session{'CurrentUser'});
 $QueueObj->Load($id) || Abort("Couldn't load queue '$id'");
 my $title = loc("History of the queue [_1]", $QueueObj->Name);
diff --git a/share/html/Admin/Queues/Modify.html b/share/html/Admin/Queues/Modify.html
index 3916508..9757827 100755
--- a/share/html/Admin/Queues/Modify.html
+++ b/share/html/Admin/Queues/Modify.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/QueueTabs, id => $QueueObj->id, 
-    QueueObj => $QueueObj,
-    current_tab => $current_tab, 
-    Title => $title &>
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>
 
 
@@ -140,14 +137,13 @@
 
 
 <%INIT>
-my ($title, $current_tab, @results, $Disabled, $EnabledChecked);
+my ($title, @results, $Disabled, $EnabledChecked);
 my $QueueObj = RT::Queue->new( $session{'CurrentUser'} );
 $QueueObj->Load( $id ) if !$id || $id eq 'new';
 
 $EnabledChecked = 'checked="checked"';
 
 if ($Create) {
-    $current_tab = 'Admin/Queues/Modify.html?Create=1';
     $title = loc("Create a queue");
 } else {
     if ( defined $id && $id eq 'new' ) {
@@ -159,8 +155,6 @@ if ($Create) {
         $QueueObj->Load($id) || $QueueObj->Load($Name) || Abort(loc("Couldn't load queue '[_1]'", $Name));
     }
     $title = loc('Configuration for queue [_1]', $QueueObj->Name);
-    
-    $current_tab = 'Admin/Queues/Modify.html?id='.$QueueObj->id;
 }
 if ( $QueueObj->Id ) {
     my @attribs= qw(Description CorrespondAddress CommentAddress Name
diff --git a/share/html/Admin/Queues/People.html b/share/html/Admin/Queues/People.html
index 773419a..9925d98 100755
--- a/share/html/Admin/Queues/People.html
+++ b/share/html/Admin/Queues/People.html
@@ -47,10 +47,7 @@
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => $title &>
 
-<& /Admin/Elements/QueueTabs, id => $id, 
-    QueueObj => $QueueObj,                                                      
-    current_tab => $current_tab, 
-    Title => $title &>
+<& /Elements/Tabs &>
 
 <& /Elements/ListActions, actions => \@results &>
 
@@ -129,7 +126,6 @@
 
 <%INIT>
 
-my $current_tab;
 my ($field, @results, $User, $Users, $Groups, $watcher, $user_msg, $group_msg);
 
 my $QueueObj = RT::Queue->new($session{'CurrentUser'});
@@ -189,7 +185,6 @@ if ( $ARGS{'GroupString'} ) {
 } else {
     $group_msg = loc("No principals selected.");
 }
-$current_tab = 'Admin/Queues/People.html?id=' . $QueueObj->id;
 my $title = loc('People related to queue [_1]', $QueueObj->Name);
 </%INIT>
 
diff --git a/share/html/Admin/Queues/Scrip.html b/share/html/Admin/Queues/Scrip.html
index a4f2bb5..f2b7fb8 100755
--- a/share/html/Admin/Queues/Scrip.html
+++ b/share/html/Admin/Queues/Scrip.html
@@ -46,12 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/QueueTabs, id => $QueueObj->Id,
-    QueueObj => $QueueObj,
-    current_tab => 'Admin/Queues/Scrips.html?id='.$QueueObj->id,
-    current_subtab => $current_subtab,
-    subtabs => $subtabs,
-    Title => $title &>
+<& /Elements/Tabs &>
 
 <& /Elements/ListActions, actions => \@results &>
 <& /Admin/Elements/EditScrip, title => $title,  %ARGS, id => $id &>
@@ -63,30 +58,13 @@ unless( $QueueObj->id ) {
     Abort(loc("Queue [_1] not found", $id));
 }
 
-my ($title, $current_subtab);
-my $subtabs = {
-    A => {
-        title => loc('Select scrip'),
-        path  => "Admin/Queues/Scrips.html?id=".$QueueObj->id,
-    },
-    B => {
-        title => loc('New scrip'),
-        path => "Admin/Queues/Scrip.html?create=1&Queue=".$QueueObj->id,
-        separator => 1,
-    },
-};
+my ($title);
 
 ($id, my @results) = $m->comp( '/Admin/Elements/EditScrip:Process', %ARGS );
 
 if ( $id ) {
-    $current_subtab = "Admin/Queues/Scrip.html?id=$id&Queue=". $QueueObj->id;
     $title = loc("Modify a scrip for queue [_1]", $QueueObj->Name);
-    $subtabs->{"C"} = {
-        title => loc("Scrip #[_1]",$id),
-        path  => "Admin/Queues/Scrip.html?id=$id&Queue=".$QueueObj->id
-    };
 } else {
-    $current_subtab = "Admin/Queues/Scrip.html?create=1&Queue=".$QueueObj->id;
     $title = loc("Create a scrip for queue [_1]", $QueueObj->Name);
 }
 
diff --git a/share/html/Admin/Queues/Scrips.html b/share/html/Admin/Queues/Scrips.html
index b3cd9d0..5b5858b 100755
--- a/share/html/Admin/Queues/Scrips.html
+++ b/share/html/Admin/Queues/Scrips.html
@@ -46,12 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/QueueTabs, id => $QueueObj->id, 
-    QueueObj => $QueueObj,                                                      
-    current_tab => 'Admin/Queues/Scrips.html?id='.$id, 
-    current_subtab => 'Admin/Queues/Scrips.html?id='.$id, 
-    subtabs => $subtabs, 
-    Title => $title &>
+<& /Elements/Tabs &>
 
 % unless ( $QueueObj->Disabled ) { # Global scrips does not apply to disabled queues
 <h2><&|/l&>Scrips which apply to all queues</&></h2>
@@ -70,16 +65,6 @@ if ($QueueObj->id) {
 } else {
     Abort(loc("Queue [_1] not found",$id));
 }
-
-my $subtabs = {
-	 A => { title => loc('Select'),
-	     	path => "Admin/Queues/Scrips.html?id=".$id,
-			   },
-	 B => { title => loc('Create'),
-	     	path => "Admin/Queues/Scrip.html?create=1&Queue=".$id,
-            separator => 1,
-			   }
-	      };
 </%init>
 
 <%ARGS>
diff --git a/share/html/Admin/Queues/Template.html b/share/html/Admin/Queues/Template.html
index 092a230..5e4c9dd 100755
--- a/share/html/Admin/Queues/Template.html
+++ b/share/html/Admin/Queues/Template.html
@@ -46,12 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/QueueTabs, id => $Queue, 
-    QueueObj => $QueueObj,
-     current_tab => 'Admin/Queues/Templates.html?id='.$Queue,
-     current_subtab => $current_subtab, 
-     subtabs => $subtabs, 
-     Title => $title &>
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>
 
 <form method="post" name="ModifyTemplate" id="ModifyTemplate" action="Template.html">
@@ -75,59 +70,49 @@
 
 <%INIT>
 
-my $TemplateObj = RT::Template->new($session{'CurrentUser'});
-my  ($title, @results, $current_subtab, $SubmitLabel);
+my $TemplateObj = RT::Template->new( $session{'CurrentUser'} );
+my $QueueObj;
+my $SubmitLabel;
+my $title;
+my @results;
 
-my $subtabs = {
-		 A => { title => loc('Select template'),
-  		     	path => "Admin/Queues/Templates.html?id=$Queue"
-			   },
-		 B => { title => loc('New template'),
-  		     	path => "Admin/Queues/Template.html?Create=1&Queue=$Queue",
-			separator => 1,
-			   }
-	      };
+if ( !$Create ) {
+    if ( $Template eq 'new' ) {
+        my ( $val, $msg )
+            = $TemplateObj->Create( Queue => $Queue, Name => $Name );
+        Abort( loc( "Could not create template: [_1]", $msg ) ) unless ($val);
+        push @results, $msg;
+    } else {
+        $TemplateObj->Load($Template) || Abort( loc('No Template') );
+    }
 
-if ($Create) {
-  $title = loc("Create a template");
-  $current_subtab = "Admin/Queues/Template.html?Create=1&Queue=".$Queue;
-  $SubmitLabel = loc('Create');
 }
 
-else {
-  if ($Template eq 'new') {
-      my ($val, $msg) =  $TemplateObj->Create(Queue => $Queue, Name => $Name);
-      Abort(loc("Could not create template: [_1]", $msg)) unless ($val);
-     push @results, $msg;
-    }
-    else {
-       $TemplateObj->Load($Template) || Abort(loc('No Template'));
-    }
-     $title = loc('Modify template [_1]', loc($TemplateObj->Name())); 
-     $SubmitLabel = loc('Save Changes');
-  
-    
-}
-my $QueueObj;
-if ($TemplateObj->Id()) {
-  $Queue = $TemplateObj->Queue;
-  $QueueObj = $TemplateObj->QueueObj;
+if ( $TemplateObj->Id() ) {
+    $Queue    = $TemplateObj->Queue;
+    $QueueObj = $TemplateObj->QueueObj;
+
+    my @attribs = qw( Description Content Queue Name Type );
+    my @aresults = UpdateRecordObject( AttributesRef => \@attribs,
+                                       Object        => $TemplateObj,
+                                       ARGSRef       => \%ARGS
+                                     );
+    push @results, @aresults;
 
-  my @attribs = qw( Description Content Queue Name Type );
-  my @aresults = UpdateRecordObject( AttributesRef => \@attribs, 
-				     Object => $TemplateObj, 
-				     ARGSRef => \%ARGS);
-  $current_subtab = "Admin/Queues/Template.html?Queue=$Queue&Template=".$TemplateObj->Id();
-  $subtabs->{"C"} = { title => loc('Template #[_1]', $TemplateObj->Id()),
-  		     	path => "Admin/Queues/Template.html?Queue=$Queue&Template=".$TemplateObj->Id(),
-			};
-  push @results, @aresults;
+    my ( $ok, $msg ) = $TemplateObj->CompileCheck;
+    push @results, $msg if !$ok;
+} else {
+    $QueueObj = RT::Queue->new( $session{'CurrentUser'} );
+    $QueueObj->Load($Queue);
+}
 
-  my ($ok, $msg) = $TemplateObj->CompileCheck;
-  push @results, $msg if !$ok;
+if ($Create) {
+    $title = loc( 'Create a new template for queue [_1]', $QueueObj->Name );
+    $SubmitLabel = loc('Create');
 } else {
-  $QueueObj = RT::Queue->new($session{'CurrentUser'});
-  $QueueObj->Load($Queue);
+
+    $title = loc( 'Modify template [_1] for queue [_2]', loc( $TemplateObj->Name()), $QueueObj->Name  );
+    $SubmitLabel = loc('Save Changes');
 }
 
 </%INIT>
diff --git a/share/html/Admin/Queues/Templates.html b/share/html/Admin/Queues/Templates.html
index 86091e8..4637afb 100755
--- a/share/html/Admin/Queues/Templates.html
+++ b/share/html/Admin/Queues/Templates.html
@@ -46,12 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/QueueTabs, id => $QueueObj->id, 
-    current_tab => 'Admin/Queues/Templates.html?id='.$id, 
-    current_subtab => 'Admin/Queues/Templates.html?id='.$id, 
-        QueueObj => $QueueObj,
-    subtabs => $subtabs, 
-    Title => $title &>
+<& /Elements/Tabs &>
 
 <& /Admin/Elements/EditTemplates, title => $title, %ARGS &>
 
@@ -59,21 +54,10 @@
 my $QueueObj = RT::Queue->new($session{'CurrentUser'});
 $QueueObj->Load($id);
 
-my ($title, $current_subtab);
-
-if ($QueueObj->id) {
-    $title = loc("Edit Templates for queue [_1]", $QueueObj->Name);
-} else {
+if (!$QueueObj->id) {
     Abort(loc("Queue [_1] not found",$id));
 }
-my $subtabs = {
-	 A => { title => loc('Select'),
-	     	path => "Admin/Queues/Templates.html?id=".$id,
-		   },
-	 B => { title => loc('Create'),
-	     	path => "Admin/Queues/Template.html?Create=1&Queue=".$id,
-		   }
-	      };
+my $title = loc("Templates for queue [_1]", $QueueObj->Name);
 
 </%INIT>
 <%ARGS>
diff --git a/share/html/Admin/Queues/UserRights.html b/share/html/Admin/Queues/UserRights.html
index a27b103..8f8f8ae 100755
--- a/share/html/Admin/Queues/UserRights.html
+++ b/share/html/Admin/Queues/UserRights.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => loc('Modify user rights for queue [_1]', $QueueObj->Name) &>
-<& /Admin/Elements/QueueTabs, id => $id,
-    QueueObj => $QueueObj,
-    current_tab => $current_tab, 
-    Title => loc('Modify user rights for queue [_1]', $QueueObj->Name) &>
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>
 
 <form method="post" action="UserRights.html" name="ModifyUserRights" id="ModifyUserRights">
@@ -76,8 +73,6 @@ my $QueueObj = RT::Queue->new($session{'CurrentUser'});
 $QueueObj->Load($id) || Abort(loc("Couldn't load queue [_1]",$id));
 
 my @principals = GetPrincipalsMap($QueueObj, 'Users');
-
-my $current_tab = 'Admin/Queues/UserRights.html?id='.$QueueObj->id;
 </%INIT>
 
 <%ARGS>
diff --git a/share/html/Admin/Queues/index.html b/share/html/Admin/Queues/index.html
index afb3753..986bf0e 100755
--- a/share/html/Admin/Queues/index.html
+++ b/share/html/Admin/Queues/index.html
@@ -46,9 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => loc("Admin queues") &>
-<& /Admin/Elements/QueueTabs, current_tab => 'Admin/Queues/', 
-    current_subtab => 'Admin/Queues/', 
-    Title => loc("Admin queues") &>
+<& /Elements/Tabs &>
 
 
 
diff --git a/share/html/Admin/Tools/Configuration.html b/share/html/Admin/Tools/Configuration.html
index a8b4b3e..14e1fcf 100644
--- a/share/html/Admin/Tools/Configuration.html
+++ b/share/html/Admin/Tools/Configuration.html
@@ -53,10 +53,7 @@ unless ($session{'CurrentUser'}->HasRight( Object=> $RT::System, Right => 'Super
 }
 </%init>
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/ToolTabs, 
-    current_tab => 'Admin/Tools/Configuration.html',
-    current_subtab => 'Admin/Tools/Configuration.html', 
-    Title => $title &>
+<& /Elements/Tabs &>
 
 <&|/Widgets/TitleBox, title => loc("RT Configuration") &>
 <table border="0" cellspacing="0" cellpadding="5" width="100%" class="collection">
diff --git a/share/html/Admin/Tools/Queries.html b/share/html/Admin/Tools/Queries.html
index ab9a4a4..0fc60ff 100644
--- a/share/html/Admin/Tools/Queries.html
+++ b/share/html/Admin/Tools/Queries.html
@@ -52,10 +52,7 @@ unless ($session{'CurrentUser'}->HasRight( Object=> $RT::System, Right => 'Super
 }
 </%init>
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/ToolTabs, 
-    current_tab => 'Admin/Tools/Queries.html',
-    current_subtab => 'Admin/Tools/Queries.html', 
-    Title => $title &>
+<& /Elements/Tabs &>
 
 <&|/Widgets/TitleBox, title => loc('SQL Queries') &>
 % my $history = $RT::Handle->QueryHistory;
diff --git a/share/html/Admin/Tools/Shredder/Elements/Error/NoRights b/share/html/Admin/Tools/Shredder/Elements/Error/NoRights
index 7834a3b..5b74bf0 100644
--- a/share/html/Admin/Tools/Shredder/Elements/Error/NoRights
+++ b/share/html/Admin/Tools/Shredder/Elements/Error/NoRights
@@ -46,10 +46,6 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => 'Error' &>
-<& /Admin/Elements/ToolTabs,
-	current_tab => 'Admin/Tools/Shredder',
-	current_subtab => 'Admin/Tools/Shredder',
-	Title => 'Error',
-&>
+<& /Elements/Tabs &>
 <div class="error"><% loc("You don't have <b>SuperUser</b> right.") |n%></div>
 
diff --git a/share/html/Admin/Tools/Shredder/Elements/Error/NoStorage b/share/html/Admin/Tools/Shredder/Elements/Error/NoStorage
index 35704df..7d5bcd5 100644
--- a/share/html/Admin/Tools/Shredder/Elements/Error/NoStorage
+++ b/share/html/Admin/Tools/Shredder/Elements/Error/NoStorage
@@ -49,11 +49,7 @@
 $Path => ''
 </%ARGS>
 <& /Admin/Elements/Header, Title => 'Error' &>
-<& /Admin/Elements/ToolTabs,
-	current_tab => 'Admin/Tools/Shredder',
-	current_subtab => 'Admin/Tools/Shredder',
-	Title => 'Error',
-&>
+<& /Elements/Tabs &>
 <div class="error">
 <% loc('Shredder needs a directory to write dumps to. Please check that you have <span class="file-path">[_1]</span> and it is writable by your web server.',  $m->interp->apply_escapes( $Path ) ) |n%>
 </div>
diff --git a/share/html/Admin/Tools/Shredder/index.html b/share/html/Admin/Tools/Shredder/index.html
index 6b19636..62dfc49 100644
--- a/share/html/Admin/Tools/Shredder/index.html
+++ b/share/html/Admin/Tools/Shredder/index.html
@@ -52,11 +52,7 @@ $Wipeout => ''
 @WipeoutObject => ()
 </%ARGS>
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/ToolTabs,
-    current_tab => 'Admin/Tools/Shredder',
-    current_subtab => 'Admin/Tools/Shredder',
-    Title => $title,
-&>
+<& /Elements/Tabs &>
 <form id="shredder-search-form" action="<% RT->Config->Get('WebPath') %>/Admin/Tools/Shredder/" method="GET">
 <div id="shredder-select-plugin">
 <& /Elements/ListActions, actions => $messages{'Errors'} &>
diff --git a/share/html/Admin/Tools/index.html b/share/html/Admin/Tools/index.html
index 4789ea7..8b696b6 100644
--- a/share/html/Admin/Tools/index.html
+++ b/share/html/Admin/Tools/index.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/ToolTabs, 
-    current_tab => 'Admin/Tools/index.html',
-    current_subtab => 'Admin/Tools/Configuration.html', 
-    Title => $title &>
+<& /Elements/Tabs &>
 <& /Elements/ListMenu, items => $tabs &>
 <%init>
 my $title = loc('System Tools');
diff --git a/share/html/Admin/Users/CustomFields.html b/share/html/Admin/Users/CustomFields.html
index d1b825a..3ebe36b 100644
--- a/share/html/Admin/Users/CustomFields.html
+++ b/share/html/Admin/Users/CustomFields.html
@@ -46,12 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<&    /Admin/Elements/UserTabs,
-    id => $Object->id, 
-    current_tab => "Admin/Users/CustomFields.html?$id=".$id, 
-    current_subtab => "Admin/Users/CustomFields.html?id=".$id, 
-    UserObj => $Object,
-    Title => $title
+<&    /Elements/Tabs
     &>
 
     <& /Admin/Elements/EditCustomFields, %ARGS, title => $title, Object => $Object, ObjectType => 'RT::User' &>
diff --git a/share/html/Admin/Users/GnuPG.html b/share/html/Admin/Users/GnuPG.html
index ab96114..c8b37c3 100644
--- a/share/html/Admin/Users/GnuPG.html
+++ b/share/html/Admin/Users/GnuPG.html
@@ -46,12 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title  &>
-<& /Admin/Elements/UserTabs, 
-    id          => $id, 
-    UserObj     => $UserObj,
-    current_tab => 'Admin/Users/GnuPG.html?id='. $id,
-    Title       => $title,
-&>
+<& /Elements/Tabs &>
 
 <& /Elements/ListActions, actions => \@results &>
 
diff --git a/share/html/Admin/Users/History.html b/share/html/Admin/Users/History.html
index 8c99da7..32309c9 100644
--- a/share/html/Admin/Users/History.html
+++ b/share/html/Admin/Users/History.html
@@ -46,11 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title  &>
-<& /Admin/Elements/UserTabs, 
-    id => $id, 
-    UserObj => $UserObj,
-    current_tab => $current_tab, 
-    Title => $title &>
+<& /Elements/Tabs &>
 
 <& /Ticket/Elements/ShowHistory,
     Ticket => $UserObj,
@@ -58,7 +54,6 @@
 &>
 
 <%INIT>
-my $current_tab = 'Admin/Users/History.html?id='.$id;
 my $UserObj = RT::User->new($session{'CurrentUser'});
 $UserObj->Load($id) || Abort("Couldn't load user '$id'");
 my $title = loc("History of the user [_1]", $UserObj->Name);
diff --git a/share/html/Admin/Users/Memberships.html b/share/html/Admin/Users/Memberships.html
index 3801c96..3bb3eb1 100644
--- a/share/html/Admin/Users/Memberships.html
+++ b/share/html/Admin/Users/Memberships.html
@@ -46,11 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title  &>
-<& /Admin/Elements/UserTabs, 
-    id => $id, 
-    UserObj => $UserObj,
-    current_tab => $current_tab, 
-    Title => $title &>
+<& /Elements/Tabs &>
 
 <& /Elements/ListActions, actions => \@results &>
 
@@ -94,7 +90,6 @@ my $UserObj = RT::User->new($session{'CurrentUser'});
 $UserObj->Load( $id ) || Abort("Couldn't load user '$id'");
 
 my $title = loc("Memberships of the user [_1]", $UserObj->Name);
-my $current_tab = 'Admin/Users/Memberships.html?id='. $id;
 
 my @results;
 if ( $Update ) {
diff --git a/share/html/Admin/Users/Modify.html b/share/html/Admin/Users/Modify.html
index c90b3db..143c4dc 100755
--- a/share/html/Admin/Users/Modify.html
+++ b/share/html/Admin/Users/Modify.html
@@ -46,11 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title  &>
-<& /Admin/Elements/UserTabs, 
-    id => $id, 
-    UserObj => $UserObj,
-    current_tab => $current_tab, 
-    Title => $title &>
+<& /Elements/Tabs &>
 
 <& /Elements/ListActions, actions => \@results &>
 
@@ -234,20 +230,16 @@
 
 <%INIT>
 
-my $current_tab;
 my $UserObj = RT::User->new($session{'CurrentUser'});
 my ($title, $PrivilegedChecked, $EnabledChecked, $Disabled, $result, @results);
 
 my ($val, $msg);
 
 if ($Create) {
-    $current_tab = 'Admin/Users/Modify.html?Create=1';
     $title = loc("Create a new user");
 } 
 else {
 
-    $current_tab = 'Admin/Users/Modify.html?id='.$id if $id;
-
     if ( defined $id && $id eq 'new') {
 	( $val, $msg ) = $UserObj->Create(
 	    Name                  => $Name,
diff --git a/share/html/Admin/Users/MyRT.html b/share/html/Admin/Users/MyRT.html
index cdd607d..097e70b 100644
--- a/share/html/Admin/Users/MyRT.html
+++ b/share/html/Admin/Users/MyRT.html
@@ -46,11 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title  &>
-<& /Admin/Elements/UserTabs, 
-    id => $id, 
-    UserObj => $UserObj,
-    current_tab => $current_tab, 
-    Title => $title &>
+<& /Elements/Tabs &>
 
 <& /Widgets/SelectionBox:header, nojs => 1 &>
 
@@ -72,8 +68,6 @@
 
 <%init>
 my @actions;
-my $current_tab;
-$current_tab = 'Admin/Users/MyRT.html?id='.$id if $id;
 my $UserObj = RT::User->new($session{'CurrentUser'});
 $UserObj->Load($id) || Abort("Couldn't load user '" . ($id || '') . "'");
 my $title = loc("RT at a glance for the user [_1]", $UserObj->Name);
diff --git a/share/html/Admin/Users/index.html b/share/html/Admin/Users/index.html
index 6c0fddf..e5ce42d 100755
--- a/share/html/Admin/Users/index.html
+++ b/share/html/Admin/Users/index.html
@@ -46,9 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => loc('Select a user') &>
-<& /Admin/Elements/UserTabs, current_tab => 'Admin/Users/', 
-    current_subtab => 'Admin/Users/',
-    Title => loc('Select a user') &>
+<& /Elements/Tabs &>
     
 <h1><% $caption %></h1>
 
diff --git a/share/html/Admin/index.html b/share/html/Admin/index.html
index 0cab578..9973439 100755
--- a/share/html/Admin/index.html
+++ b/share/html/Admin/index.html
@@ -46,7 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& //Admin/Elements/Header, Title => loc('RT Administration') &>
-<& //Admin/Elements/Tabs, Title => loc('RT Administration') &>
+<& //Elements/Tabs &>
 
 <& /Elements/ListMenu, items => $tabs &>
 <%init>
diff --git a/share/html/Approvals/Display.html b/share/html/Approvals/Display.html
index 3765852..ba2ed6d 100755
--- a/share/html/Approvals/Display.html
+++ b/share/html/Approvals/Display.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title =>  $title &>
-
-<& Elements/Tabs, 
-    current_tab => "Approvals/Display.html", 
-    Title =>  $title &>
+<& /Elements/Tabs &>
 <form method="post" action="<%RT->Config->Get('WebPath')%>/Approvals/index.html">
 
 <&| /Widgets/TitleBox, title => $title &>
diff --git a/share/html/Approvals/Elements/Tabs b/share/html/Approvals/Elements/Tabs
deleted file mode 100755
index 8355e59..0000000
--- a/share/html/Approvals/Elements/Tabs
+++ /dev/null
@@ -1,58 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-<& /Elements/Tabs,
-    tabs => $tabs, 
-    current_toptab => 'Approvals/', 
-    current_tab => $current_tab, 
-    Title => $Title &>
-
-<%ARGS>
-$tabs => undef
-$current_tab => undef
-$Title => undef
-</%ARGS>
diff --git a/share/html/Approvals/index.html b/share/html/Approvals/index.html
index a6b81c2..36c7a3b 100755
--- a/share/html/Approvals/index.html
+++ b/share/html/Approvals/index.html
@@ -46,7 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => loc("My approvals") &>
-<& /Approvals/Elements/Tabs, Title => loc("My approvals") &>
+<& /Elements/Tabs &>
 
 <& /Elements/ListActions, actions => \@actions &>
 <form method="post" name="Approvals" id="Approvals">
diff --git a/share/html/Dashboards/Elements/Tabs b/share/html/Dashboards/Elements/Tabs
deleted file mode 100755
index 884f290..0000000
--- a/share/html/Dashboards/Elements/Tabs
+++ /dev/null
@@ -1,99 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-<& /Tools/Elements/Tabs,
-    subtabs => $subtabs,
-    current_tab => 'Dashboards/index.html',
-    current_subtab => $current_subtab,
-    actions => $actions,
-    Title => $Title &>
-
-<%INIT>
-my $subtabs;
-my $actions;
-
-if ( $DashboardObj and $DashboardObj->Id ) {
-    my $id   = $DashboardObj->Id;
-    my $name = $DashboardObj->Name;
-
-    my $modify    = "Dashboards/Modify.html?id=$id";
-    my $queries   = "Dashboards/Queries.html?id=$id";
-    my $render    = "Dashboards/$id/$name";
-    my $subscribe = "Dashboards/Subscription.html?DashboardId=$id";
-
-    $subtabs = $m->comp('/Elements/DashboardTabs', CurrentDashboard => $DashboardObj);
-    $current_subtab = $render;
-
-    $actions = {
-        a_Show => { title => loc('Show'), path  => $render, },
-        b_Basics => { title => loc('Basics'), path  => $modify, },
-        c_Queries => { title => loc('Queries'), path  => $queries, },
-        d_Subscription => { title => loc('Subscription'), path  => $subscribe, },
-    };
-
-    delete $actions->{"d_Subscription"} unless $DashboardObj->CurrentUserCanSubscribe;
-}
-else {
-    $subtabs->{"a_Select"} = { title => loc('Select'), path  => "Dashboards/index.html", };
-
-    my $dashboard = RT::Dashboard->new($session{'CurrentUser'});
-    my @objects = $dashboard->ObjectsForCreating;
-
-    if (@objects) {
-        $subtabs->{"b_Create"} = {
-            title     => loc('New'),
-            path      => "Dashboards/Modify.html?Create=1",
-            separator => 1,
-        };
-    }
-}
-</%INIT>
-<%ARGS>
-$DashboardObj => undef
-$current_subtab => undef
-$Title => undef
-</%ARGS>
diff --git a/share/html/Dashboards/Modify.html b/share/html/Dashboards/Modify.html
index 34bee87..1a21a42 100755
--- a/share/html/Dashboards/Modify.html
+++ b/share/html/Dashboards/Modify.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => $title &>
-<& /Dashboards/Elements/Tabs,
-    Title => $title,
-    $Create ? () : (DashboardObj => $Dashboard),
-&>
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>
 
 <form action="<%RT->Config->Get('WebPath')%>/Dashboards/Modify.html" method="post" enctype="multipart/form-data" name="ModifyDashboard" id="ModifyDashboard">
@@ -80,7 +77,6 @@
 </form>
 <%INIT>
 
-my $current_subtab;
 my ($title, @results);
 my $tried_create = 0;
 
@@ -99,7 +95,6 @@ my @privacies = $Dashboard->$method;
 Abort(loc("Permission denied")) if @privacies == 0;
 
 if ($Create) {
-    $current_subtab = 'Dashboards/Modify.html?Create=1';
     $title = loc("Create a new dashboard");
 }
 else {
@@ -129,12 +124,10 @@ else {
 
     if ($id) {
         $title = loc("Modify the dashboard [_1]", $Dashboard->Name);
-        $current_subtab = 'Dashboards/Modify.html?id=' . $id;
     }	
     # If the create failed
     else {
         $Create = 1;
-        $current_subtab = 'Dashboards/Modify.html?Create=1';
         $title = loc("Create a new dashboard");
     }
 }
diff --git a/share/html/Dashboards/Queries.html b/share/html/Dashboards/Queries.html
index f0ecdcb..191b3e7 100644
--- a/share/html/Dashboards/Queries.html
+++ b/share/html/Dashboards/Queries.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => $title &>
-<& /Dashboards/Elements/Tabs,
-    current_subtab => $current_subtab,
-    Title => $title,
-    DashboardObj => $Dashboard &>
+<& /Elements/Tabs &>
 
 <& /Widgets/SelectionBox:header, nojs => 1 &>
 
@@ -78,7 +75,6 @@
 
 <%INIT>
 
-my $current_subtab = 'Dashboards/Queries.html?id=' . $id;
 my @results;
 
 use RT::Dashboard;
diff --git a/share/html/Dashboards/Render.html b/share/html/Dashboards/Render.html
index dfd4454..74bcaca 100644
--- a/share/html/Dashboards/Render.html
+++ b/share/html/Dashboards/Render.html
@@ -53,10 +53,7 @@
 &>
 
 % if ($Preview) {
-<& /Dashboards/Elements/Tabs,
-    current_subtab => $current_subtab,
-    Title => $title,
-    DashboardObj => $DashboardObj &>
+<& /Elements/Tabs &>
 % }
 
 % $m->callback(CallbackName => 'BeforeTable', Dashboard => $DashboardObj, show_cb => $show_cb);
@@ -90,7 +87,6 @@
 
 <%INIT>
 
-my $current_subtab = 'Dashboards/Render.html?id=' . $id;
 
 use RT::Dashboard;
 my $DashboardObj = RT::Dashboard->new($session{'CurrentUser'});
diff --git a/share/html/Dashboards/Subscription.html b/share/html/Dashboards/Subscription.html
index 3bc3140..cc90ac7 100644
--- a/share/html/Dashboards/Subscription.html
+++ b/share/html/Dashboards/Subscription.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => $title &>
-<& /Dashboards/Elements/Tabs,
-    current_subtab => $current_subtab,
-    Title => $title,
-    DashboardObj => $DashboardObj &>
+<& /Elements/Tabs &>
 
 <& /Elements/ListActions, actions => \@results &>
 
@@ -183,8 +180,6 @@
 
 <%INIT>
 
-my $current_subtab = 'Dashboards/Subscription.html?DashboardId=' . $DashboardId;
-
 my ($title, @results);
 my ($val, $msg);
 my $Loaded = 0;
diff --git a/share/html/Dashboards/index.html b/share/html/Dashboards/index.html
index 505cc95..74c3342 100644
--- a/share/html/Dashboards/index.html
+++ b/share/html/Dashboards/index.html
@@ -46,9 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => $title &>
-<& /Dashboards/Elements/Tabs,
-    current_subtab => 'Dashboards/index.html',
-    Title => $title &>
+<& /Elements/Tabs &>
 
 <& /Elements/ListActions, actions => \@actions &>
 
diff --git a/share/html/Elements/Error b/share/html/Elements/Error
index 4c2c0ac..c11b01a 100755
--- a/share/html/Elements/Error
+++ b/share/html/Elements/Error
@@ -49,7 +49,7 @@
 
 % unless ($SuppressHeader) {
 <& /Elements/Header, Code => $Code, Why => $Why, Title => $Title &>
-<& /Elements/Tabs, Title => $Title &>
+<& /Elements/Tabs &>
 % }
 
 <div class="error">
diff --git a/share/html/Elements/PageLayout b/share/html/Elements/PageLayout
index 1380940..ac1eaf8 100755
--- a/share/html/Elements/PageLayout
+++ b/share/html/Elements/PageLayout
@@ -45,12 +45,6 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-<div id="topactions">
-% foreach my $action (reverse sort keys %{$topactions}) {
-<span class="topaction" id="topaction-<%$action%>"><% $topactions->{"$action"}->{'html'} |n %></span>
-% }
-</div>
-
 % if ( $show_menu ) {
 <div id="main-navigation"><& /Elements/Menu, menu => Menu(), id => 'app-nav' &></div>
 
@@ -75,80 +69,7 @@ jQuery(document).ready(function(){ jQuery("#actions-menu").superfish(); });
 <div id="body">
 % $m->callback( %ARGS, CallbackName => 'BeforeBody' );
 % $m->flush_buffer(); # we've got the page laid out, let's flush the buffer;
-
-<%INIT>
-if ( defined $current_toptab ) {
-    foreach my $tab ( values %{$toptabs} ) {
-        next unless $tab->{'path'} eq $current_toptab;
-        @{ $tab }{ qw(subtabs current_subtab) } = ($tabs, $current_tab);
-    }
-}
-
-my ($menu_depth, $almost_last, $page_tabs);
-
-# don't pull out the last submenu for 3.5-compat theme
-# see #14853 for details.
-if (RT->Config->Get( 'WebDefaultStylesheet', $session{'CurrentUser'} ) ne '3.4-compat') {
-    ($menu_depth, $almost_last) = @{ $m->comp('.menu_recurse', data => $toptabs, current => $current_toptab ) };
-
-    if (defined $almost_last->{subtabs} and %{$almost_last->{subtabs}}) {
-        $page_tabs = {
-            current_toptab => $almost_last->{current_subtab},
-            %{$almost_last->{subtabs}},
-        };
-
-        delete $almost_last->{subtabs};
-        delete $almost_last->{current_subtab};
-    }
-}
-</%INIT>
-
-%# There's probably a better way to do this that involves three times as
-%# much work and redoing the whole menu/tab system... which would seem a
-%# bit out of scope.
-%#
-%# This function recurses through the menu and returns the second to
-%# last menu, that is, the menu holding the last reference to
-%# and submenu.  It also returns the number of menu levels minus
-%# the last submenu.
-<%def .menu_recurse>
-  <%args>
-      $data    => { }
-      $current => ''
-      $pdata   => { }
-      $ppdata  => { }
-      $level   => 0
-  </%args>
-  <%init>
-    if ($current) {
-      for my $key (keys %$data) {
-          next if !defined $data->{$key}->{'path'} 
-                    || $data->{$key}->{'path'} ne $current;
-          next unless    ref( $data->{$key} ) eq 'HASH'
-                      && ref( $data->{$key}->{'subtabs'} ) eq 'HASH'
-                      && keys %{ $data->{$key}->{'subtabs'} };
-          return $m->comp('.menu_recurse',
-              data    => $data->{$key}->{'subtabs'},
-              current => $data->{$key}->{'current_subtab'} || '',
-              pdata   => $data->{$key},
-              ppdata  => $pdata,
-              level   => $level + 1,
-          );
-      }
-    }
-    $ppdata->{last_system_menu_level}++;
-    return [$level, $pdata];
-  </%init>
-</%def>
-
 <%ARGS>
-$current_toptab => undef
-$current_tab => undef
-$toptabs => undef
-$topactions => undef
-$tabs => undef
-$actions => undef
-$subactions => undef
 $title => $m->callers(-1)->path
 $show_menu => 1
 </%ARGS>
diff --git a/share/html/Install/Elements/Wrapper b/share/html/Install/Elements/Wrapper
index c5007ec..3226193 100644
--- a/share/html/Install/Elements/Wrapper
+++ b/share/html/Install/Elements/Wrapper
@@ -48,13 +48,6 @@
 <&/Elements/Header, title => $Title &>
 <& /Elements/PageLayout,
     title => $Title,
-    toptabs => { a => { title => loc('Install RT'),
-                        path => 'Install/'
-                        },
-                b => { title => loc('Buy Support'),
-                        path => 'mailto:sales at bestpractical.com'}
-                },
-                        
     show_menu => 1
 &>
 <a name="skipnav" id="skipnav" accesskey="8"></a>
diff --git a/share/html/Prefs/Elements/Tabs b/share/html/Prefs/Elements/Tabs
deleted file mode 100644
index 09aa48a..0000000
--- a/share/html/Prefs/Elements/Tabs
+++ /dev/null
@@ -1,76 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-<& /User/Elements/Tabs,
-    subtabs => $tabs,
-    current_tab => 'Prefs/Other.html',
-    current_subtab => $current_subtab,
-    Title => $Title &>
-
-<%INIT>
-my $tabs;
-$Searches ||= [$m->comp("/Search/Elements/SearchesForObject", Object => RT::System->new($session{'CurrentUser'}))];
-
-$tabs->{a} = {
-    title => loc('Quick search'),
-	path => 'Prefs/Quicksearch.html',
-};
-
-for my $search (@$Searches) {
-    $tabs->{ $search->[0] } = {
-        title => $search->[0],
-        path  => "Prefs/Search.html?"
-                 .$m->comp('/Elements/QueryString', name => ref($search->[1]).'-'.$search->[1]->Id),
-    };
-}
-</%INIT>
-<%ARGS>
-$GroupObj => undef
-$current_subtab => undef
-$Title => undef
-$Searches => undef
-</%ARGS>
diff --git a/share/html/Prefs/MyRT.html b/share/html/Prefs/MyRT.html
index a870cdf..9639c5e 100644
--- a/share/html/Prefs/MyRT.html
+++ b/share/html/Prefs/MyRT.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => $title &>
-<& /Prefs/Elements/Tabs,
-    current_tab => 'Prefs/MyRT.html',
-    Title => $title,
-    Searches => \@sys_searches
+<& /Elements/Tabs
 &>
 <& /Elements/ListActions, actions => \@results &>
 
diff --git a/share/html/Prefs/Other.html b/share/html/Prefs/Other.html
index d342e4d..3045f70 100644
--- a/share/html/Prefs/Other.html
+++ b/share/html/Prefs/Other.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => $title &>
-<& /User/Elements/Tabs, 
-    current_tab => 'Prefs/Other.html',
-    Title => $title,
-&>
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>
 
 <form method="post" action="Other.html" name="ModifyPreferences" id="ModifyPreferences">
diff --git a/share/html/Prefs/Quicksearch.html b/share/html/Prefs/Quicksearch.html
index 74931c9..497a82a 100644
--- a/share/html/Prefs/Quicksearch.html
+++ b/share/html/Prefs/Quicksearch.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => $title &>
-<& /Prefs/Elements/Tabs,
-    current_tab => 'Prefs/MyRT.html',
-    current_subtab => 'Prefs/Quicksearch.html',
-    Title => $title
+<& /Elements/Tabs
 &>
 <& /Elements/ListActions, actions => \@actions &>
 <h1><&|/l&>Select queues to be displayed on the "RT at a glance" page</&></h1>
diff --git a/share/html/Prefs/Search.html b/share/html/Prefs/Search.html
index d749096..7ff9d29 100644
--- a/share/html/Prefs/Search.html
+++ b/share/html/Prefs/Search.html
@@ -46,11 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => $title &>
-<& /Prefs/Elements/Tabs,
-    current_tab => 'Prefs/MyRT.html',
-#    current_subtab => 'Prefs/Search.html?name='.$m->comp('/Elements/QueryString', name => $ARGS{name}),
-    current_subtab => 'Prefs/Search.html?name='.$ARGS{name},
-    Title => $title
+<& /Elements/Tabs
 &>
 <& /Elements/ListActions, actions => \@actions &>
 % if ($session{'CurrentUser'}->HasRight( Object=> $RT::System, Right => 'SuperUser')) {
diff --git a/share/html/Prefs/SearchOptions.html b/share/html/Prefs/SearchOptions.html
index dd76c3d..1b1ba34 100644
--- a/share/html/Prefs/SearchOptions.html
+++ b/share/html/Prefs/SearchOptions.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => loc("Search Preferences") &>
-<& /User/Elements/Tabs, 
-    current_tab => "Prefs/SearchOptions.html",
-    Title => loc("Search Preferences")
-&>
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@actions &>
 
 <form method="post" action="SearchOptions.html">
diff --git a/share/html/Search/Build.html b/share/html/Search/Build.html
index a6031cc..5a47b74 100644
--- a/share/html/Search/Build.html
+++ b/share/html/Search/Build.html
@@ -66,13 +66,7 @@
 %#   action does quote it (this breaks SQLite).
 %#
 <& /Elements/Header, Title => $title &>
-<& /Ticket/Elements/Tabs, 
-    current_tab => "Search/Build.html?".$QueryString, 
-    Title => $title,
-    %query,
-    SavedSearchId => $saved_search{'Id'},
-    SavedChartSearchId => $ARGS{SavedChartSearchId},
-&>
+<& /Elements/Tabs &>
 
 <form method="post" action="Build.html" name="BuildQuery" id="BuildQuery">
 <input type="hidden" class="hidden" name="SavedSearchId" value="<% $saved_search{'Id'} %>" />
diff --git a/share/html/Search/Bulk.html b/share/html/Search/Bulk.html
index d726dcc..a7e722b 100755
--- a/share/html/Search/Bulk.html
+++ b/share/html/Search/Bulk.html
@@ -46,17 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => $title &>
-<& /Ticket/Elements/Tabs, 
-    current_tab => "Search/Bulk.html",
-    Title => $title,
-    Format => $ARGS{'Format'}, # we don't want the locally modified one
-    Query => $Query,
-    Rows => $Rows,
-    OrderBy => $OrderBy,
-    Order => $Order,
-    SavedSearchId => $SavedSearchId,
-    SavedChartSearchId => $SavedChartSearchId,
-    &>
+<& /Elements/Tabs &>
 
 <& /Elements/ListActions, actions => \@results &>
 <form method="post" action="<% RT->Config->Get('WebPath') %>/Search/Bulk.html" enctype="multipart/form-data" name="BulkUpdate" id="BulkUpdate">
diff --git a/share/html/Search/Chart.html b/share/html/Search/Chart.html
index 31e5b24..478bef7 100644
--- a/share/html/Search/Chart.html
+++ b/share/html/Search/Chart.html
@@ -80,8 +80,7 @@ my @actions = $m->comp( '/Widgets/SavedSearch:process', args => \%ARGS, self =>
 
 </%init>
 <& /Elements/Header, Title => $title &>
-<& /Ticket/Elements/Tabs, Title => $title, Query => $ARGS{Query},
-    SavedChartSearchId => $saved_search->{SearchId} &>
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@actions &>
 <& /Search/Elements/Chart, %ARGS &>
 
diff --git a/share/html/Search/Edit.html b/share/html/Search/Edit.html
index fb6a1cb..a799347 100755
--- a/share/html/Search/Edit.html
+++ b/share/html/Search/Edit.html
@@ -46,17 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => $title&>
-<& /Ticket/Elements/Tabs, 
-    current_tab => "Search/Edit.html?".$QueryString, 
-    Title   => $title,
-    Format  => $Format,
-    Query   => $Query,
-    Rows    => $Rows,
-    OrderBy => $OrderBy,
-    Order   => $Order,
-    SavedSearchId => $SavedSearchId,
-    SavedChartSearchId => $SavedChartSearchId,
-&>
+<& /Elements/Tabs &>
 
 <& Elements/NewListActions, actions => \@actions &>
 
diff --git a/share/html/Search/Results.html b/share/html/Search/Results.html
index d9290cb..41325a7 100755
--- a/share/html/Search/Results.html
+++ b/share/html/Search/Results.html
@@ -49,17 +49,7 @@
     Refresh => $session{'tickets_refresh_interval'} || RT->Config->Get('SearchResultsRefreshInterval', $session{'CurrentUser'} ),
     RSSAutoDiscovery => $RSSFeedURL,
     LinkRel => \%link_rel &>
-<& /Ticket/Elements/Tabs, 
-    current_tab => "Search/Results.html".$QueryString, 
-    Title => $title,
-    Format => $Format,
-    Query => $Query,
-    Rows => $Rows,
-    OrderBy => $OrderBy,
-    Order => $Order,
-    SavedSearchId => $SavedSearchId,
-    SavedChartSearchId => $SavedChartSearchId,
-    &>
+<& /Elements/Tabs &>
 <& /Elements/CollectionList, 
     Query => $Query,
     AllowSorting => 1,
diff --git a/share/html/Search/Simple.html b/share/html/Search/Simple.html
index 974b556..f3c92b2 100644
--- a/share/html/Search/Simple.html
+++ b/share/html/Search/Simple.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => $title &>
-<& /Ticket/Elements/Tabs, 
-    current_toptab => "Search/Simple.html",
-    current_tab => "Search/Simple.html",
-    Title => $title
+<& /Elements/Tabs
 &>
 
 % $m->callback( %ARGS, CallbackName => 'PreForm' );
diff --git a/share/html/SelfService/Elements/Header b/share/html/SelfService/Elements/Header
index 04276c0..a2f8845 100755
--- a/share/html/SelfService/Elements/Header
+++ b/share/html/SelfService/Elements/Header
@@ -45,5 +45,5 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-<& /Elements/Header, %ARGS, Prefs => '/SelfService/Prefs.html' &>
-<& /SelfService/Elements/Tabs, %ARGS &>
+<& /Elements/Header &>
+<& /Elements/Tabs &>
diff --git a/share/html/SelfService/Elements/Tabs b/share/html/SelfService/Elements/Tabs
deleted file mode 100755
index 839ec3c..0000000
--- a/share/html/SelfService/Elements/Tabs
+++ /dev/null
@@ -1,115 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-% $m->callback( %ARGS, tabs => $tabs, actions => $actions );
-<& /Elements/PageLayout,
-    current_toptab => $current_toptab,
-    current_tab => $current_tab,
-    toptabs => $tabs,
-    topactions => $actions,
-    title => $Title
-&>
-<a name="skipnav" id="skipnav" accesskey="8"></a>
-% $m->callback( %ARGS, tabs => $tabs, actions => $actions, CallbackName => "AfterNav");
-<%INIT>
-my $queues = RT::Queues->new($session{'CurrentUser'});
-$queues->UnLimit;
-
-my $queue_count = 0;
-my $queue_id;
-
-while (my $queue = $queues->Next) {
-  next unless $queue->CurrentUserHasRight('CreateTicket');
-  $queue_id = $queue->id;
-  $queue_count++;
-  last if ($queue_count > 1);
-}
-
-if ($Title) {
-$Title = loc("RT Self Service") . " / " . $Title;
-} else {
-$Title = loc("RT Self Service");
-
-}
-my ($tab);
-my $tabs = { A  => { title => loc('Open tickets'),
-                        path => 'SelfService/',
-                      },
-             B => { title => loc('Closed tickets'),
-                         path => 'SelfService/Closed.html',
-                       },
-           };
-
-if ($queue_count > 1) {
-        $tabs->{C} = { title => loc('New ticket'),
-                       path => 'SelfService/CreateTicketInQueue.html'
-                       };
-}
-elsif ($queue_id) {
-        $tabs->{C} = { title => loc('New ticket'),
-                       path => 'SelfService/Create.html?Queue=' . $queue_id
-                       };
-}
-
-if ($session{'CurrentUser'}->HasRight( Right => 'ModifySelf',
-				       Object => $RT::System )) {
-	$tabs->{Z} = { title => loc('Preferences'),
-		       path => 'SelfService/Prefs.html'
-		       };
-}
-
-my $actions = {
-	B => { html => $m->scomp('GotoTicket') 
-		}
-	};
-</%INIT>
-<%ARGS>
-$Title => undef
-$current_toptab => undef
-$current_tab => undef
-</%ARGS>
-
diff --git a/share/html/Ticket/Create.html b/share/html/Ticket/Create.html
index d624e74..c136839 100755
--- a/share/html/Ticket/Create.html
+++ b/share/html/Ticket/Create.html
@@ -48,10 +48,7 @@
 <& /Elements/Header,
     Title => $title,
     onload => "function () { hide('Ticket-Create-details') }" &>
-<& /Elements/Tabs, 
-    current_toptab => "Ticket/Create.html", 
-    Title => $title,
-    actions => $actions &>
+<& /Elements/Tabs &>
     
 <& /Elements/ListActions, actions => \@results &>
 
diff --git a/share/html/Ticket/Display.html b/share/html/Ticket/Display.html
index 155d300..06e2272 100755
--- a/share/html/Ticket/Display.html
+++ b/share/html/Ticket/Display.html
@@ -48,10 +48,7 @@
 <& /Elements/Header, 
     Title => $title,
     LinkRel => \%link_rel &>
-<& /Ticket/Elements/Tabs, 
-    Ticket => $TicketObj, 
-    current_tab => 'Ticket/Display.html?id='.$TicketObj->id,
-    Title => $title &>
+<& /Elements/Tabs &>
 
 % $m->callback(CallbackName => 'BeforeActionList', %ARGS, Actions => \@Actions, ARGSRef => \%ARGS, Ticket => $TicketObj);
 
@@ -86,7 +83,6 @@
 
 % $m->callback( %ARGS,
 %     Ticket       => $TicketObj,
-%     current_tab  => 'Ticket/Display.html?id=' . $TicketObj->id,
 %     CallbackName => 'AfterShowHistory',
 % );
 
diff --git a/share/html/Ticket/Elements/Tabs b/share/html/Ticket/Elements/Tabs
deleted file mode 100755
index 979ab78..0000000
--- a/share/html/Ticket/Elements/Tabs
+++ /dev/null
@@ -1 +0,0 @@
-<&/Elements/Tabs &>
diff --git a/share/html/Ticket/Forward.html b/share/html/Ticket/Forward.html
index 6554026..2fed21d 100644
--- a/share/html/Ticket/Forward.html
+++ b/share/html/Ticket/Forward.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => $Title &>
-<& /Ticket/Elements/Tabs, 
-    Ticket => $TicketObj, 
-    Title  => $Title,
-&>
+<& /Elements/Tabs &>
 
 % $m->callback(CallbackName => 'BeforeActionList', Actions => \@results, ARGSRef => \%ARGS, Ticket => $TicketObj);
 <& /Elements/ListActions, actions => \@results &>
diff --git a/share/html/Ticket/GnuPG.html b/share/html/Ticket/GnuPG.html
index ad13c3c..9d5f8e9 100644
--- a/share/html/Ticket/GnuPG.html
+++ b/share/html/Ticket/GnuPG.html
@@ -46,11 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => $title &>
-<& /Ticket/Elements/Tabs,
-    Ticket => $txn->TicketObj,
-    current_tab => 'Ticket/Encrypt.html?id='. $id,
-    Title => $title,
-&>
+<& /Elements/Tabs &>
 
 % $m->callback( CallbackName => 'BeforeActionList', %ARGS, Actions => \@results, ARGSRef => \%ARGS );
 <& /Elements/ListActions, actions => \@results &>
diff --git a/share/html/Ticket/Graphs/index.html b/share/html/Ticket/Graphs/index.html
index f7178d5..41a8a38 100644
--- a/share/html/Ticket/Graphs/index.html
+++ b/share/html/Ticket/Graphs/index.html
@@ -46,11 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => $title &>
-<& /Ticket/Elements/Tabs,
-    Ticket => $ticket,
-    Title => $title,
-    current_tab => "Ticket/ModifyLinks.html?id=$id",
-&>
+<& /Elements/Tabs &>
 
 <& /Elements/ListActions, actions => \@results &>
 
diff --git a/share/html/Ticket/History.html b/share/html/Ticket/History.html
index cc4cacf..f4bc0ed 100755
--- a/share/html/Ticket/History.html
+++ b/share/html/Ticket/History.html
@@ -46,9 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => loc("Ticket History # [_1] [_2]", $Ticket->Id, $Ticket->Subject) &>
-<& /Ticket/Elements/Tabs, 
-    Ticket => $Ticket, current_tab => 'Ticket/History.html?id='.$Ticket->id, 
-    Title => loc("Ticket History # [_1] [_2]", $Ticket->Id, $Ticket->Subject) &>
+<& /Elements/Tabs &>
 
 % $m->callback( %ARGS, Ticket => $Ticket, CallbackName => 'BeforeActionList' );
 
@@ -63,7 +61,7 @@
     AttachmentContent => $attachment_content
     &> 
 
-% $m->callback( %ARGS, CallbackName => 'AfterShowHistory', Ticket => $Ticket, current_tab => 'Ticket/History.html?id=' . $Ticket->id );
+% $m->callback( %ARGS, CallbackName => 'AfterShowHistory', Ticket => $Ticket );
 
 <%ARGS>
 $id => undef
diff --git a/share/html/Ticket/Modify.html b/share/html/Ticket/Modify.html
index 7f84c1b..0b26038 100755
--- a/share/html/Ticket/Modify.html
+++ b/share/html/Ticket/Modify.html
@@ -46,9 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => loc('Modify ticket #[_1]', $TicketObj->Id) &>
-<& /Ticket/Elements/Tabs, 
-    Ticket => $TicketObj, current_subtab => "Ticket/Modify.html?id=".$TicketObj->Id, 
-    Title => loc('Modify ticket #[_1]', $TicketObj->Id) &>
+<& /Elements/Tabs &>
 
 % $m->callback(CallbackName => 'BeforeActionList', Actions => \@results, ARGSRef => \%ARGS, Ticket => $TicketObj);
 
diff --git a/share/html/Ticket/ModifyAll.html b/share/html/Ticket/ModifyAll.html
index 63061fb..5697d69 100755
--- a/share/html/Ticket/ModifyAll.html
+++ b/share/html/Ticket/ModifyAll.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => loc("Ticket #[_1] Jumbo update: [_2]", $Ticket->Id, $Ticket->Subject) &>
-<& /Ticket/Elements/Tabs, 
-    Ticket => $Ticket, 
-    current_tab => "Ticket/ModifyAll.html?id=".$Ticket->Id, 
-    Title => loc("Ticket #[_1] Jumbo update: [_2]", $Ticket->Id, $Ticket->Subject) &>
+<& /Elements/Tabs &>
 
 % $m->callback(CallbackName => 'BeforeActionList', Actions => \@results, ARGSRef => \%ARGS, Ticket => $Ticket);
 <& /Elements/ListActions, actions => \@results &>
diff --git a/share/html/Ticket/ModifyDates.html b/share/html/Ticket/ModifyDates.html
index 28286c9..7e30cf8 100755
--- a/share/html/Ticket/ModifyDates.html
+++ b/share/html/Ticket/ModifyDates.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => loc('Modify dates for #[_1]', $TicketObj->Id) &>
-<& /Ticket/Elements/Tabs, 
-    Ticket => $TicketObj, 
-    current_tab => "Ticket/ModifyDates.html?id=".$TicketObj->Id, 
-    Title => loc('Modify dates for #[_1]', $TicketObj->Id) &> 
+<& /Elements/Tabs &>
 
 % $m->callback(CallbackName => 'BeforeActionList', Actions => \@results, ARGSRef => \%ARGS, Ticket => $TicketObj);
 <& /Elements/ListActions, actions => \@results &>
diff --git a/share/html/Ticket/ModifyLinks.html b/share/html/Ticket/ModifyLinks.html
index 8043d1e..f410356 100755
--- a/share/html/Ticket/ModifyLinks.html
+++ b/share/html/Ticket/ModifyLinks.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => loc("Link ticket #[_1]", $Ticket->Id) &>
-<& /Ticket/Elements/Tabs, 
-    Ticket => $Ticket, 
-    current_tab => "Ticket/ModifyLinks.html?id=".$Ticket->Id, 
-    Title => loc("Link ticket #[_1]", $Ticket->Id) &>
+<& /Elements/Tabs &>
 
 % $m->callback(CallbackName => 'BeforeActionList', Actions => \@results, ARGSRef => \%ARGS, Ticket => $Ticket);
 <& /Elements/ListActions, actions => \@results &>
diff --git a/share/html/Ticket/ModifyPeople.html b/share/html/Ticket/ModifyPeople.html
index 9982cc2..5c6844e 100755
--- a/share/html/Ticket/ModifyPeople.html
+++ b/share/html/Ticket/ModifyPeople.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => loc('Modify people related to ticket #[_1]', $Ticket->id) &>
-<& /Ticket/Elements/Tabs, 
-    Ticket => $Ticket, 
-    current_tab => "Ticket/ModifyPeople.html?id=".$Ticket->Id, 
-    Title => loc('Modify people related to ticket #[_1]', $Ticket->id) &>
+<& /Elements/Tabs &>
 
 % $m->callback(CallbackName => 'BeforeActionList', Actions => \@results, ARGSRef => \%ARGS, Ticket => $Ticket);
 <& /Elements/ListActions, actions => \@results &>
diff --git a/share/html/Ticket/Reminders.html b/share/html/Ticket/Reminders.html
index 958b7ea..64fef40 100755
--- a/share/html/Ticket/Reminders.html
+++ b/share/html/Ticket/Reminders.html
@@ -46,10 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => loc("Reminder ticket #[_1]", $Ticket->Id) &>
-<& /Ticket/Elements/Tabs, 
-    Ticket => $Ticket, 
-    current_tab => "Ticket/Reminders.html?id=".$Ticket->Id, 
-    Title => loc("Reminders for ticket #[_1]", $Ticket->Id) &>
+<& /Elements/Tabs &>
     
 % $m->callback(CallbackName => 'BeforeActionList', ARGSRef => \%ARGS, Ticket => $Ticket);
     
diff --git a/share/html/Ticket/Update.html b/share/html/Ticket/Update.html
index dd76dd7..7063ac2 100755
--- a/share/html/Ticket/Update.html
+++ b/share/html/Ticket/Update.html
@@ -46,9 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title  => $title &>
-<& /Ticket/Elements/Tabs,
-    Ticket => $TicketObj,
-    Title => $title &>
+<& /Elements/Tabs &>
 
 % $m->callback(CallbackName => 'BeforeActionList', ARGSRef => \%ARGS, Ticket => $TicketObj);
 <& /Elements/ListActions, actions => \@results &>
diff --git a/share/html/Tools/Elements/Tabs b/share/html/Tools/Elements/Tabs
deleted file mode 100644
index f0d9fd7..0000000
--- a/share/html/Tools/Elements/Tabs
+++ /dev/null
@@ -1,102 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-<& /Elements/Tabs, 
-    tabs => $tabs, 
-    current_toptab => 'Tools/index.html', 
-    current_tab => $current_tab, 
-    actions => $actions,
-    Title => $Title &>
-
-<%INIT>
-my $tabs = {
-    b => {
-        title => loc('Offline'),
-        path  => 'Tools/Offline.html',
-    },
-    c => {
-        title => loc('Reports'),
-        path  => 'Tools/Reports/index.html',
-    },
-    d => {
-        title => loc('My Day'),
-        path  => 'Tools/MyDay.html',
-    },
-    e => {
-        title => loc('Watching Queues'),
-        path  => 'Tools/Watching.html',
-    },
-};
-
-my $can_see_dashboards = $session{CurrentUser}->HasRight(Right => 'SubscribeDashboard', Object => $RT::System)
-                       || RT::Dashboard->new($session{CurrentUser})->ObjectsForLoading
-                       || RT::Dashboard->new($session{CurrentUser})->ObjectsForCreating
-                       || RT::Dashboard->new($session{CurrentUser})->ObjectsForModifying;
-
-if ($can_see_dashboards) {
-    $tabs->{a} = {
-        title => loc('Dashboards'),
-        path  => 'Dashboards/index.html',
-    };
-}
-
-$m->callback( %ARGS, tabs => $tabs );
-
-foreach my $tab ( sort keys %{$tabs} ) {
-    if ( $tabs->{$tab}->{'path'} eq $current_tab ) {
-        $tabs->{$tab}->{"subtabs"}        = $subtabs;
-        $tabs->{$tab}->{"current_subtab"} = $current_subtab;
-    }
-}
-</%INIT>
-<%ARGS>
-$subtabs => undef
-$current_tab => undef
-$current_subtab => undef
-$actions => undef
-$Title => undef
-</%ARGS>
diff --git a/share/html/Tools/MyDay.html b/share/html/Tools/MyDay.html
index 96eb8a3..87e840e 100644
--- a/share/html/Tools/MyDay.html
+++ b/share/html/Tools/MyDay.html
@@ -46,7 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => $title &>
-<& /Tools/Elements/Tabs, current_tab => "Tools/MyDay.html", Title => $title &>
+<& /Elements/Tabs &>
 
 <& /Elements/ListActions, actions => \@results &>
 
diff --git a/share/html/Tools/Offline.html b/share/html/Tools/Offline.html
index 1515eac..d723a4b 100644
--- a/share/html/Tools/Offline.html
+++ b/share/html/Tools/Offline.html
@@ -46,9 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => loc("Offline upload") &>
-<& Elements/Tabs, 
-    current_tab => "Tools/Offline.html", 
-    Title => loc("Offline edits") &>
+<& /Elements/Tabs &>
 
 <& /Elements/ListActions, actions => \@results &>
 
diff --git a/share/html/Tools/Reports/CreatedByDates.html b/share/html/Tools/Reports/CreatedByDates.html
index a6966fe..3b446a2 100644
--- a/share/html/Tools/Reports/CreatedByDates.html
+++ b/share/html/Tools/Reports/CreatedByDates.html
@@ -71,7 +71,7 @@ if ($CreatedBefore) {
 $q->LoadByCols(Name => $Queue);
 </%init>
 <& /Elements/Header, Title => $title &>
-<& /Tools/Reports/Elements/Tabs, current_tab => 'Tools/Reports/CreatedByDates.html', Title => $title &>
+<& /Elements/Tabs &>
 <form method="post" action="CreatedByDates.html">
 % if ($Queue|| $CreatedBefore ||$CreatedAfter) {
 % # if we have a queue, do the search
diff --git a/share/html/Tools/Reports/Elements/Tabs b/share/html/Tools/Reports/Elements/Tabs
deleted file mode 100644
index b22a916..0000000
--- a/share/html/Tools/Reports/Elements/Tabs
+++ /dev/null
@@ -1,89 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-<& /Tools/Elements/Tabs, 
-    subtabs => $tabs, 
-    current_tab => 'Tools/Reports/index.html', 
-    current_subtab => $current_tab, 
-    Title => $Title &>
-
-<%INIT>
-my $tabs = {
-    a => {
-        title => loc('Resolved by owner'),
-        path  => 'Tools/Reports/ResolvedByOwner.html',
-    },
-    b => {
-        title => loc('Resolved in date range'),
-        path  => 'Tools/Reports/ResolvedByDates.html',
-    },
-    c => {
-        title => loc('Created in a date range'),
-        path  => 'Tools/Reports/CreatedByDates.html',
-    },
-};
-
-
-
-
-$m->callback( %ARGS, tabs => $tabs );
-
-foreach my $tab ( sort keys %{$tabs} ) {
-    if ( $tabs->{$tab}->{'path'} eq $current_tab ) {
-        $tabs->{$tab}->{"subtabs"}        = $subtabs;
-        $tabs->{$tab}->{"current_subtab"} = $current_subtab;
-    }
-}
-</%INIT>
-
-
-<%ARGS>
-$subtabs => undef
-$current_tab => ''
-$current_subtab => undef
-$Title => undef
-</%ARGS>
diff --git a/share/html/Tools/Reports/ResolvedByDates.html b/share/html/Tools/Reports/ResolvedByDates.html
index cb134ce..2c9e992 100644
--- a/share/html/Tools/Reports/ResolvedByDates.html
+++ b/share/html/Tools/Reports/ResolvedByDates.html
@@ -71,7 +71,7 @@ if ($ResolvedBefore) {
 $q->LoadByCols(Name => $Queue);
 </%init>
 <& /Elements/Header, Title => $title &>
-<& /Tools/Reports/Elements/Tabs, current_tab => 'Tools/Reports/ResolvedByDates.html', Title => $title &>
+<& /Elements/Tabs &>
 <form method="post" action="ResolvedByDates.html">
 % if ($Queue|| $ResolvedBefore ||$ResolvedAfter) {
 % # if we have a queue, do the search
diff --git a/share/html/Tools/Reports/ResolvedByOwner.html b/share/html/Tools/Reports/ResolvedByOwner.html
index e64e0d9..77447ab 100644
--- a/share/html/Tools/Reports/ResolvedByOwner.html
+++ b/share/html/Tools/Reports/ResolvedByOwner.html
@@ -54,7 +54,7 @@ my $q = RT::Queue->new($session{'CurrentUser'});
 $q->LoadByCols(Name => $Queue);
 </%init>
 <& /Elements/Header, Title => $title &>
-<& /Tools/Reports/Elements/Tabs, current_tab => '/Tools/Reports/ResolvedByOwner.html', Title => $title &>
+<& /Elements/Tabs &>
 <form method="post" action="ResolvedByOwner.html">
 % if ($Queue) {
 % # if we have a queue, do the search
diff --git a/share/html/Tools/Reports/index.html b/share/html/Tools/Reports/index.html
index 2ab90ea..c219a6f 100644
--- a/share/html/Tools/Reports/index.html
+++ b/share/html/Tools/Reports/index.html
@@ -46,7 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => loc('Reports') &>
-<& /Tools/Reports/Elements/Tabs, Title => loc('Reports') &>
+<& /Elements/Tabs &>
 <& /Elements/ListMenu, items => $tabs &>
 
 % $m->callback;
diff --git a/share/html/Tools/Watching.html b/share/html/Tools/Watching.html
index 4676afd..e2507e9 100644
--- a/share/html/Tools/Watching.html
+++ b/share/html/Tools/Watching.html
@@ -46,9 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => loc("Watching Queues") &>
-<& Elements/Tabs, 
-    current_tab => "Tools/Watching.html", 
-    Title => loc("Watching Queues") &>
+<& /Elements/Tabs &>
 
 <%perl>
 my $count = 0;
diff --git a/share/html/Tools/index.html b/share/html/Tools/index.html
index 4003c82..4d8c480 100644
--- a/share/html/Tools/index.html
+++ b/share/html/Tools/index.html
@@ -46,9 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => loc("Tools") &>
-<& Elements/Tabs, 
-    current_tab => "Tools/index.html", 
-    Title => loc("Tools") &>
+<& /Elements/Tabs &>
 <& /Elements/ListMenu, items => $tabs &>
 
 <%init>
diff --git a/share/html/User/Elements/Tabs b/share/html/User/Elements/Tabs
deleted file mode 100755
index 2b9e0e9..0000000
--- a/share/html/User/Elements/Tabs
+++ /dev/null
@@ -1,89 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-<& /Elements/Tabs, 
-    tabs => $tabs, 
-    current_toptab => 'Prefs/Other.html', 
-    current_tab => $current_tab, 
-    Title => $Title &>
-
-<%INIT>
-my $tabs = {
-    a => {
-        title => loc('Settings'),
-        path => 'Prefs/Other.html',
-    },
-    b => {
-        title => loc('About me'),
-        path => 'User/Prefs.html',
-    },
-    f => {
-        title => loc('Search options'),
-        path => 'Prefs/SearchOptions.html',
-    },
-    r => {
-        title => loc('RT at a glance'),
-        path => 'Prefs/MyRT.html',
-    },
-};
-
-# Now let callbacks add their extra tabs
-$m->callback( %ARGS, tabs => $tabs );
-
-foreach my $tab (values %$tabs) {
-    next unless $tab->{'path'} eq $current_tab;
-
-    $tab->{"subtabs"} = $subtabs;
-    $tab->{"current_subtab"} = $current_subtab;
-}
-</%INIT>
-<%ARGS>
-$subtabs => undef
-$current_tab => undef
-$current_subtab => undef
-$Title => undef
-</%ARGS>
diff --git a/share/html/User/Prefs.html b/share/html/User/Prefs.html
index 168f69d..d1c5a43 100755
--- a/share/html/User/Prefs.html
+++ b/share/html/User/Prefs.html
@@ -46,9 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title=>loc("Preferences") &>
-<& /User/Elements/Tabs, 
-    current_tab => 'User/Prefs.html', 
-    Title => loc("Preferences") &>
+<& /Elements/Tabs &>
 
 <& /Elements/ListActions, actions => \@results &>
 
diff --git a/share/html/dhandler b/share/html/dhandler
index eb4fd1a..40504e9 100644
--- a/share/html/dhandler
+++ b/share/html/dhandler
@@ -46,7 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title=>loc("Page not found")&>
-<& /Elements/Tabs, Title=>loc("Page not found"), &>
+<& /Elements/Tabs &>
 <h1><&|/l&>The page you requested could not be found</&></h1>
 <&|/l&>Please check the URL and try again.</&>
 <%init>
diff --git a/share/html/index.html b/share/html/index.html
index 4b10619..f0bd103 100755
--- a/share/html/index.html
+++ b/share/html/index.html
@@ -75,13 +75,7 @@ If you need commercial support, please contact us at sales at bestpractical.com.
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-<& /Elements/Tabs, 
-    Title          => loc("RT at a glance"),
-    current_tab    => 'index.html',
-    current_toptab => 'index.html',
-    tabs           => $tabs,
-    actions        => $actions,
-    &>
+<& /Elements/Tabs &>
 <& /Elements/ListActions, actions => \@results &>    
 <& /Elements/MyRT &>
 <%init>
@@ -133,16 +127,6 @@ if ( $ARGS{'q'} ) {
     RT::Interface::Web::Redirect(RT->Config->Get('WebURL')."Search/Simple.html?q=".$m->interp->apply_escapes($ARGS{q}));
 }
 
-my $actions;
-if ($session{'CurrentUser'}->HasRight(Right => 'ModifySelf', Object => $RT::System)) {
-    $actions = {
-        A => { title => loc('Edit'),
-               path  => 'Prefs/MyRT.html',
-             },
-    };
-}
-
-my $tabs = $m->comp("/Elements/DashboardTabs");
 </%init>
 
 %# --></body></html>
diff --git a/t/web/walk.t b/t/web/walk.t
index a062bcc..3837191 100644
--- a/t/web/walk.t
+++ b/t/web/walk.t
@@ -52,7 +52,7 @@ diag 'walk into /Admin' if $ENV{TEST_VERBOSE};
         $m->back;
 
         $m->follow_link_ok( { text => 'root' }, '-> root' );
-        for my $id ( 'rt-at-a-glance', 'memberships', 'history', 'basics' ) {
+        for my $id ( 'my-rt', 'memberships', 'history', 'basics' ) {
             $m->follow_link_ok( { id => 'page-current-' . $id }, "-> $id" );
         }
     }
@@ -137,7 +137,7 @@ diag 'walk into /Admin' if $ENV{TEST_VERBOSE};
         $m->follow_link_ok( { text => 'Configuration' }, '-> Configuration' );
         $m->follow_link_ok( { text => 'Global' },        '-> Global' );
 
-        for my $id ( 'group-rights', 'user-rights', 'rt-at-a-glance', 'theme' )
+        for my $id ( 'group-rights', 'user-rights', 'my-rt', 'theme' )
         {
             $m->follow_link_ok( { id => 'tools-config-global-' . $id }, "-> $id" );
         }

commit ea9bdcc806f835cb8c2c348de07c0c16d87ff391
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Fri Nov 5 05:22:15 2010 -0400

    Move user and custom field editing into the admin menu, from the page menu

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 37e80ab..0373923 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -158,11 +158,12 @@ if ( $request_path =~ qr{.*} ) {
     {
         my $admin = $tools->child( config => title => loc('Configuration'),
                                  path   => '/Admin/' );
-        my $users = $admin->child( users => title => loc('Users'), path => '/Admin/Users/', );
-        $users->child( select => title => loc('Select'), path => "/Admin/Users/" );
-        $users->child( create => title => loc('Create'),
-                       path => "/Admin/Users/Modify.html?Create=1" );
-
+        if ( $session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminUsers' ) ) {
+            my $users = $admin->child( users => title => loc('Users'), path => '/Admin/Users/', );
+            $users->child( select => title => loc('Select'), path => "/Admin/Users/" );
+            $users->child( create => title => loc('Create'),
+                           path => "/Admin/Users/Modify.html?Create=1" );
+        }
         my $groups
             = $admin->child( loc('Groups'), path => '/Admin/Groups/', );
 
@@ -175,14 +176,15 @@ if ( $request_path =~ qr{.*} ) {
         $queues->child( loc('Select'), path => "/Admin/Queues/" );
         $queues->child( loc('Create'),
                         path => "/Admin/Queues/Modify.html?Create=1" );
-        my $cfs = $admin->child(
-                             'custom-fields' => title => loc('Custom Fields'),
-                             path => '/Admin/CustomFields/', );
-        $cfs->child( select => title => loc('Select'),
-                     path   => "/Admin/CustomFields/" );
-        $cfs->child( create => title => loc('Create'),
-                     path => "/Admin/CustomFields/Modify.html?Create=1" );
-
+        if ( $session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminCustomField' ) ) {
+            my $cfs = $admin->child(
+                                 'custom-fields' => title => loc('Custom Fields'),
+                                 path => '/Admin/CustomFields/', );
+            $cfs->child( select => title => loc('Select'),
+                         path   => "/Admin/CustomFields/" );
+            $cfs->child( create => title => loc('Create'),
+                         path => "/Admin/CustomFields/Modify.html?Create=1" );
+        }
         my $admin_global =
             $admin->child( global => title => loc('Global'),
                            path   => '/Admin/Global/', );
@@ -421,14 +423,6 @@ if ( $request_path =~ qr'Admin/Queues' ) {
 }
 
 if ( $request_path =~ qr'/Admin/Users' ) {
-    if ( $session{'CurrentUser'}
-         ->HasRight( Object => $RT::System, Right => 'AdminUsers' ) )
-    {
-        PageMenu->child( select => title => loc('Select'),
-                         path   => "/Admin/Users/" );
-        PageMenu->child( create => title => loc('Create'),
-                         path => "/Admin/Users/Modify.html?Create=1" );
-    }
     if ( my $id = $m->request_args->{'id'} ) {
         my $obj = RT::User->new( $session{'CurrentUser'} );
         $obj->Load($id);
@@ -453,11 +447,6 @@ if ( $request_path =~ qr'/Admin/Users' ) {
 }
 
 if ( $request_path =~ qr'Admin/Groups' ) {
-
-    PageMenu->child( loc('Select') => path => "/Admin/Groups/" );
-    PageMenu->child(
-                loc('Create') => path => "/Admin/Groups/Modify.html?Create=1",
-                separator     => 1 );
     if ( my $id = $m->request_args->{'id'} ) {
         my $obj = RT::Group->new( $session{'CurrentUser'} );
         $obj->Load($id);
@@ -481,14 +470,7 @@ if ( $request_path =~ qr'Admin/Groups' ) {
 }
 
 if ( $request_path =~ qr'Admin/CustomFields/' ) {
-    if ( $session{'CurrentUser'}
-         ->HasRight( Object => $RT::System, Right => 'AdminCustomField' ) )
-    {
-        PageMenu->child( loc('Select'), path => "/Admin/CustomFields/" );
-        PageMenu->child( loc('Create') => path =>
-                         "/Admin/CustomFields/Modify.html?Create=1", );
 
-    }
     if ( my $id = $m->request_args->{'id'} ) {
         my $obj = RT::CustomField->new( $session{'CurrentUser'} );
         $obj->Load($id);

commit e57082035dbd180b340f786208c50da38f7d54c7
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Fri Nov 5 05:22:45 2010 -0400

    Add menu keys for several menus

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 0373923..1192f3a 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -317,14 +317,14 @@ if ( $request_path =~ qr'Dashboards/(\d+)?' ) {
         $obj->LoadById($id);
         if ( $obj and $obj->id ) {
             my $tabs = PageMenu;
-            $tabs->child( loc('Basics'),
+            $tabs->child( basics => title => loc('Basics'),
                           path => "/Dashboards/Modify.html?id=" . $obj->id );
-            $tabs->child( loc('Content'),
+            $tabs->child( content => title => loc('Content'),
                           path => "/Dashboards/Queries.html?id=" . $obj->id );
-            $tabs->child( loc('Subscription'),
+            $tabs->child( subscription => title => loc('Subscription'),
                       path => "/Dashboards/Subscription.html?id=" . $obj->id )
                 if $obj->CurrentUserCanSubscribe;
-            $tabs->child( loc('Show'),
+            $tabs->child( show => title =>loc('Show'),
                         path => "/Dashboards/" . $obj->id . "/" . $obj->Name )
 
         }
@@ -348,24 +348,24 @@ if ( $request_path =~ qr'/SelfService' ) {
 
     my $TOP = Menu();
 
-    $TOP->child( loc('Open tickets'),   path => '/SelfService/', );
-    $TOP->child( loc('Closed tickets'), path => '/SelfService/Closed.html', );
+    $TOP->child( open => title => loc('Open tickets'),   path => '/SelfService/', );
+    $TOP->child( closed => title => loc('Closed tickets'), path => '/SelfService/Closed.html', );
     if ( $queue_count > 1 ) {
-        $TOP->child( loc('New ticket'),
+        $TOP->child( new => title => loc('New ticket'),
                      path => '/SelfService/CreateTicketInQueue.html' );
     } else {
-        $TOP->child( loc('New ticket'),
+        $TOP->child( new => title => loc('New ticket'),
                      path => '/SelfService/Create.html?queue=' . $queue_id );
     }
 
     if ( $session{'CurrentUser'}
          ->HasRight( Right => 'ModifySelf', Object => $RT::System ) )
     {
-        $TOP->child( loc('Preferences'), path => '/SelfService/Prefs.html' );
+        $TOP->child( prefs => title => loc('Preferences'), path => '/SelfService/Prefs.html' );
     }
 
     # XXX TODO RENDER GOTO TICKET WIDGET
-    #Menu->child( B =>  html => $m->scomp('GotoTicket'))
+    Menu->child( goto =>  title => $m->scomp('GotoTicket'), escape_title => 0)
 }
 
 if ( $request_path =~ qr'Admin/Queues' ) {
@@ -430,16 +430,16 @@ if ( $request_path =~ qr'/Admin/Users' ) {
                                  'current' => title => $obj->Name,
                                  path => "/Admin/Users/Modify.html?id=" . $id,
         );
-        $tabs->child( loc('Basics'),
+        $tabs->child( basics => title => loc('Basics'),
                       path => "/Admin/Users/Modify.html?id=" . $id );
-        $tabs->child( loc('Memberships'),
+        $tabs->child( memberships => title => loc('Memberships'),
                       path => "/Admin/Users/Memberships.html?id=" . $id );
-        $tabs->child( loc('History'),
+        $tabs->child( history => title => loc('History'),
                       path => "/Admin/Users/History.html?id=" . $id );
-        $tabs->child( loc('RT at a glance'),
+        $tabs->child( 'my-rt' => title => loc('RT at a glance'),
                       path => "/Admin/Users/MyRT.html?id=" . $id );
         if ( RT->Config->Get('GnuPG')->{'enable'} ) {
-            $tabs->child( loc('GnuPG'),
+            $tabs->child( pgp => title => loc('GnuPG'),
                           path => "/Admin/Users/GnuPG.html?id=" . $id );
         }
     }
@@ -452,17 +452,17 @@ if ( $request_path =~ qr'Admin/Groups' ) {
         $obj->Load($id);
         my $tabs = PageMenu->child( $obj->Name,
                     path => "/Admin/Groups/Modify.html?id=" . $id );
-        $tabs->child(
+        $tabs->child( basics => title =>
                   loc('Basics') => path => "/Admin/Groups/Modify.html?id="
                       . $obj->id );
-        $tabs->child(
+        $tabs->child( members => title =>
                 loc('Members') => path => "/Admin/Groups/Members.html?id="
                     . $obj->id );
-        $tabs->child( loc('Group Rights') => path =>
+        $tabs->child( 'group-rights' => title =>loc('Group Rights') => path =>
                       "/Admin/Groups/GroupRights.html?id=" . $obj->id );
-        $tabs->child( loc('User Rights') => path =>
+        $tabs->child( 'user-rights' => title => loc('User Rights') => path =>
                       "/Admin/Groups/UserRights.html?id=" . $obj->id );
-        $tabs->child(
+        $tabs->child( history => title =>
                 loc('History') => path => "/Admin/Groups/History.html?id="
                     . $obj->id );
     }

commit b255489eb9e482edc65a1060ff382d9327e74e81
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Fri Nov 5 05:22:53 2010 -0400

    Remove rules menu

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 1192f3a..bacf90c 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -494,12 +494,6 @@ if ( $request_path =~ qr'Admin/CustomFields/' ) {
 
 }
 
-if ( $request_path =~ qr'Admin/Rules' ) {
-    PageMenu->child( loc('Select'), path => "/Admin/Rules/" );
-    PageMenu->child( loc('Create'),
-                     path => "/Admin/Rules/Modify.html?Create=1" );
-}
-
 if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
     my $search  = Menu()->child('search');
     my $actions = PageMenu()

commit 661f76500573a81536cee4c6a136678418135887
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Tue Nov 2 22:23:03 2010 -0400

    update to Elements/Tabs, format and titles

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index bacf90c..6a991f4 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -82,124 +82,83 @@ if ( $request_path =~ qr{.*} ) {
     my $position = 0;
 
     if (@dashboards) {
-    my $dashes = Menu()->child('home');
-    for my $dash (@dashboards) {
-        $home->child('dashboard-' . $dash->id,
-                        title => $dash->Name,
-                        path => '/Dashboards/' . $dash->id . '/' . $dash->Name,
-                       );
-    }
-
+        my $dashes = Menu()->child('home');
+        for my $dash (@dashboards) {
+            $home->child( 'dashboard-' . $dash->id, title => $dash->Name,
+                       path => '/Dashboards/' . $dash->id . '/' . $dash->Name,);
+        }
 
-    if ($more) {
-        $dashes->child( title => loc('More...'),
-                              path  => 'Dashboards/index.html',
-                            );
-    }
+        $dashes->child( more => title => loc('More...'), path  => 'Dashboards/index.html' ) if ($more);
     }
 
-
-
-    my $tickets = Menu->child( search => title => loc('Tickets'),
-                               path => '/Search/Build.html' );
-    $tickets->child( simple => title => loc('Simple Search') => path =>
-                     "/Search/Simple.html" );
-    $tickets->child( new => title => loc('New Search') => path =>
-                     "/Search/Build.html?NewQuery=1" );
-    my $new = $tickets->child( create => title => loc('New ticket'),
-                               path => '/Ticket/Create.html' );
+    my $tickets = Menu->child( search => title => loc('Tickets'), path => '/Search/Build.html' );
+    $tickets->child( simple => title => loc('Simple Search') => path => "/Search/Simple.html" );
+    $tickets->child( new => title => loc('New Search') => path => "/Search/Build.html?NewQuery=1" );
+    my $new = $tickets->child( create => title => loc('New ticket'), path => '/Ticket/Create.html' );
 
     my $q = RT::Queues->new( $session{'CurrentUser'} );
     $q->FindAllRows;
+
     while ( my $queue = $q->Next ) {
         next unless $queue->CurrentUserHasRight('CreateTicket');
-        $new->child( $queue->id => title => $queue->Name,
-                     path => '/Ticket/Create.html?Queue=' . $queue->id );
+        $new->child( $queue->id => title => $queue->Name, path => '/Ticket/Create.html?Queue=' . $queue->id );
     }
 
-    my $tools = Menu->child( loc('Tools'), path => '/Tools/index.html' );
-    my $dashes = $tools->child( loc('Dashboards'),
-                                path => '/Dashboards/index.html' );
+    my $tools = Menu->child(  tools => title => loc('Tools'), path => '/Tools/index.html' );
+    my $dashes = $tools->child( dashboards => title => loc('Dashboards'), path => '/Dashboards/index.html' );
 
-    $dashes->child( loc('Select'), path => "/Dashboards/index.html" );
+    $dashes->child( select => title => loc('Select'), path => "/Dashboards/index.html" );
     my $dashboard = RT::Dashboard->new( $session{CurrentUser} );
     if ( $dashboard->_PrivacyObjects( create => 1 ) ) {
-        $dashes->child(
-                loc('Create') => path => "/Dashboards/Modify.html?Create=1" );
+        $dashes->child( loc('Create') => path => "/Dashboards/Modify.html?Create=1" );
     }
 
+    my $reports = $tools->child( reports => title => loc('Reports'), path => '/Tools/Reports/index.html' );
+    $reports->child( loc('Resolved by owner'), path => '/Tools/Reports/ResolvedByOwner.html', );
+    $reports->child( loc('Resolved in date range'), path => '/Tools/Reports/ResolvedByDates.html', );
+    $reports->child( loc('Created in a date range'), path => '/Tools/Reports/CreatedByDates.html', );
 
+    $tools->child( my_day => title => loc('My Day'), path   => '/Tools/MyDay.html' );
 
+    $tools->child( offline => title => loc('Offline'), path    => '/Tools/Offline.html' );
+    $tools->child( watching => title => loc('Watching Queues'), path => '/Tools/Watching.html' );
 
-
-
-    my $reports = $tools->child( loc('Reports'),
-                                 path => '/Tools/Reports/index.html' );
-    $reports->child( loc('Resolved by owner'),
-                     path => '/Tools/Reports/ResolvedByOwner.html', );
-    $reports->child( loc('Resolved in date range'),
-                     path => '/Tools/Reports/ResolvedByDates.html', );
-    $reports->child( loc('Created in a date range'),
-                     path => '/Tools/Reports/CreatedByDates.html', );
-
-    $tools->child( my_day => title => loc('My Day'), path => '/Tools/MyDay.html' );
-
-    $tools->child( offline => title => loc('Offline'), path => '/Tools/Offline.html');
-    $tools->child( watching => title => loc('Watching Queues'), path => '/Tools/Watching.html');
-
-    if ( $session{'CurrentUser'}
-         ->HasRight( Right => 'ShowApprovalsTab', Object => $RT::System ) )
+    if ( $session{'CurrentUser'}->HasRight( Right => 'ShowApprovalsTab', Object => $RT::System ) )
     {
-        $tools->child( approval => title => loc('Approval'), path => '/Approvals/' );
+        $tools->child( approval => title => loc('Approval'), path     => '/Approvals/' );
     }
 
-    if ( $session{'CurrentUser'}
-         ->HasRight( Right => 'ShowConfigTab', Object => $RT::System ) )
+    if ( $session{'CurrentUser'}->HasRight( Right => 'ShowConfigTab', Object => $RT::System ) )
     {
-        my $admin = $tools->child( config => title => loc('Configuration'),
-                                 path   => '/Admin/' );
+        my $admin = $tools->child( config => title => loc('Configuration'), path   => '/Admin/' );
         if ( $session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminUsers' ) ) {
             my $users = $admin->child( users => title => loc('Users'), path => '/Admin/Users/', );
-            $users->child( select => title => loc('Select'), path => "/Admin/Users/" );
-            $users->child( create => title => loc('Create'),
-                           path => "/Admin/Users/Modify.html?Create=1" );
+            $users->child( select => title => loc('Select'), path   => "/Admin/Users/" );
+            $users->child( create => title => loc('Create'), path => "/Admin/Users/Modify.html?Create=1" );
         }
-        my $groups
-            = $admin->child( loc('Groups'), path => '/Admin/Groups/', );
-
-        $groups->child( loc('Select'), path => "/Admin/Groups/" );
-        $groups->child( loc('Create'),
-                        path => "/Admin/Groups/Modify.html?Create=1" );
-
-        my $queues = $admin->child( queues => title => loc('Queues'),
-                                    path => '/Admin/Queues/', );
-        $queues->child( loc('Select'), path => "/Admin/Queues/" );
-        $queues->child( loc('Create'),
-                        path => "/Admin/Queues/Modify.html?Create=1" );
+        my $groups = $admin->child( loc('Groups'), path => '/Admin/Groups/', );
+
+        $groups->child( select => title => loc('Select'), path => "/Admin/Groups/" );
+        $groups->child( create => title => loc('Create'), path => "/Admin/Groups/Modify.html?Create=1" );
+
+        my $queues = $admin->child( queues => title => loc('Queues'), path => '/Admin/Queues/', );
+        $queues->child( select => title => loc('Select'), path => "/Admin/Queues/" );
+        $queues->child( create => title => loc('Create'), path => "/Admin/Queues/Modify.html?Create=1" );
+
         if ( $session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminCustomField' ) ) {
-            my $cfs = $admin->child(
-                                 'custom-fields' => title => loc('Custom Fields'),
-                                 path => '/Admin/CustomFields/', );
-            $cfs->child( select => title => loc('Select'),
-                         path   => "/Admin/CustomFields/" );
-            $cfs->child( create => title => loc('Create'),
-                         path => "/Admin/CustomFields/Modify.html?Create=1" );
+            my $cfs = $admin->child( 'custom-fields' => title => loc('Custom Fields'), path => '/Admin/CustomFields/', );
+            $cfs->child( select => title => loc('Select'), path   => "/Admin/CustomFields/" );
+            $cfs->child( create => title => loc('Create'), path => "/Admin/CustomFields/Modify.html?Create=1" );
         }
-        my $admin_global =
-            $admin->child( global => title => loc('Global'),
-                           path   => '/Admin/Global/', );
-
-        my $scrips = $admin_global->child( loc('Scrips'),
-                                        path => '/Admin/Global/Scrips.html', );
-        $scrips->child( loc('Select'), path => "/Admin/Global/Scrips.html" );
-        $scrips->child( loc('Create'),
-                        path => "/Admin/Global/Scrip.html?Create=1" );
-        my $templates = $admin_global->child( loc('Templates'),
-                                    path => '/Admin/Global/Templates.html', );
-        $templates->child( loc('Select'),
-                           path => "/Admin/Global/Templates.html" );
-        $templates->child( loc('Create'),
-                           path => "/Admin/Global/Template.html?Create=1" );
+
+        my $admin_global = $admin->child( global => title => loc('Global'), path   => '/Admin/Global/', );
+
+        my $scrips = $admin_global->child( scrips => title => loc('Scrips'), path => '/Admin/Global/Scrips.html', );
+        $scrips->child( select => title => loc('Select'), path => "/Admin/Global/Scrips.html" );
+        $scrips->child( create => title => loc('Create'), path => "/Admin/Global/Scrip.html?Create=1" );
+        my $templates = $admin_global->child( loc('Templates'), path => '/Admin/Global/Templates.html', );
+        $templates->child( select => title => loc('Select'), path => "/Admin/Global/Templates.html" );
+        $templates->child( create => title => loc('Create'), path => "/Admin/Global/Template.html?Create=1" );
 
 #        my $workflows = $admin_global->child( loc('Workflows'), path => '/Admin/Global/Workflows/index.html', );
 #        {
@@ -208,107 +167,64 @@ if ( $request_path =~ qr{.*} ) {
 #            $workflows->child( loc('Mappings')     => path => "/Admin/Global/Workflows/Mappings.html" );
 #        }
 
-        my $cfadmin = $admin_global->child( loc('Custom Fields'),
-                           path => '/Admin/Global/CustomFields/index.html', );
+        my $cfadmin = $admin_global->child( loc('Custom Fields'), path => '/Admin/Global/CustomFields/index.html', );
         {
-            $cfadmin->child( loc('Users') => text =>
-                                 loc('Select custom fields for all users'),
-                             path => '/Admin/Global/CustomFields/Users.html'
-                           );
-
-            $cfadmin->child(
-                          loc('Groups') => text =>
-                              loc('Select custom fields for all user groups'),
-                          path => '/Admin/Global/CustomFields/Groups.html'
-            );
-
-            $cfadmin->child( loc('Queues') => text =>
-                                 loc('Select custom fields for all queues'),
-                             path => '/Admin/Global/CustomFields/Queues.html'
-                           );
-
-            $cfadmin->child(
-                    loc('Tickets') => text =>
-                        loc('Select custom fields for tickets in all queues'),
-                    path => '/Admin/Global/CustomFields/Queue-Tickets.html'
-            );
-
-            $cfadmin->child(
-                loc('Ticket Transactions') => text =>
-                    loc(
-                    'Select custom fields for transactions on tickets in all queues'
-                    ),
-                path => 'Admin/Global/CustomFields/Queue-Transactions.html'
-            );
+            $cfadmin->child( users => title => loc('Users') => text => loc('Select custom fields for all users'),
+                             path => '/Admin/Global/CustomFields/Users.html');
+
+            $cfadmin->child( groups => title => loc('Groups') => text => loc('Select custom fields for all user groups'),
+                          path => '/Admin/Global/CustomFields/Groups.html');
+
+            $cfadmin->child( queues => title => loc('Queues') => text => loc('Select custom fields for all queues'),
+                             path => '/Admin/Global/CustomFields/Queues.html');
+
+            $cfadmin->child( tickets => title => loc('Tickets') => text => loc('Select custom fields for tickets in all queues'),
+                    path => '/Admin/Global/CustomFields/Queue-Tickets.html');
+
+            $cfadmin->child( transactions => title => loc('Ticket Transactions') => text =>
+                    loc( 'Select custom fields for transactions on tickets in all queues'),
+                path => 'Admin/Global/CustomFields/Queue-Transactions.html');
 
         }
 
-        $admin_global->child( loc('Group Rights'),
-                              path => '/Admin/Global/GroupRights.html', );
-        $admin_global->child( loc('User Rights'),
-                              path => '/Admin/Global/UserRights.html', );
-        $admin_global->child( loc('RT at a glance'),
-                              path => '/Admin/Global/MyRT.html', );
-        $admin_global->child( loc('Theme'),
-                              path => '/Admin/Global/Theme.html', );
-
-        my $admin_tools
-            = $admin->child( loc('Tools'), path => '/Admin/Tools/', );
-        $admin_tools->child( loc('System Configuration'),
-                             path => '/Admin/Tools/Configuration.html', );
-        $admin_tools->child( loc('SQL Queries'),
-                             path => '/Admin/Tools/Queries.html', );
-        $admin_tools->child( loc('Shredder'),
-                             path => '/Admin/Tools/Shredder', );
+        $admin_global->child( 'group-rights' => title => loc('Group Rights'), path => '/Admin/Global/GroupRights.html', );
+        $admin_global->child( 'user-rights' => title => loc('User Rights'), path => '/Admin/Global/UserRights.html', );
+        $admin_global->child( 'my-rt' => title => loc('RT at a glance'), path => '/Admin/Global/MyRT.html', );
+        $admin_global->child( theme => title => loc('Theme'), path => '/Admin/Global/Theme.html', );
+
+        my $admin_tools = $admin->child( tools => title => loc('Tools'), path => '/Admin/Tools/', );
+        $admin_tools->child( configuration => title => loc('System Configuration'), path => '/Admin/Tools/Configuration.html', );
+        $admin_tools->child( 'sql-queries' => title => loc('SQL Queries'), path => '/Admin/Tools/Queries.html', );
+        $admin_tools->child( shredder => title => loc('Shredder'), path => '/Admin/Tools/Shredder', );
     }
-    my $about_me = Menu->child(
-                    'preferences' => title =>
-                        loc(
-                        'Logged in as <span class="current-user">[_1]</span>',
-                        $session{'CurrentUser'}->Name
-                        ),
+    my $about_me = Menu->child( 'preferences' => title =>
+                        loc( 'Logged in as <span class="current-user">[_1]</span>', $session{'CurrentUser'}->Name),
                     escape_title => 0,
                     sort_order   => 99
     );
     if ( $session{'CurrentUser'}->UserObj
-         && $session{'CurrentUser'}->HasRight( Right  => 'ModifySelf',
-                                               Object => $RT::System )
-       )
-    {
-        my $settings = $about_me->child( settings => title => loc('Settings'),
-                          path     => '/Prefs/Other.html', );
-        $settings->child( about_me => title => loc('About me'),
-                          path     => '/User/Prefs.html', );
-        $settings->child( search_options => title => loc('Search options'),
-                          path => '/Prefs/SearchOptions.html', );
-        $settings->child( myrt => title => loc('RT at a glance'),
-                          path => '/Prefs/MyRT.html', );
-        $settings->child( quicksearch => title => 'Quick search' => title =>
-                              loc('Quick search'),
-                          path => '/Prefs/Quicksearch.html'
-                        );
-
-        my $search_menu = $settings->child( 'saved-searches' => title => 'Saved Searches');
-        my $searches = [ $m->comp(
-                          "/Search/Elements/SearchesForObject",
+         && $session{'CurrentUser'}->HasRight( Right  => 'ModifySelf', Object => $RT::System )) {
+        my $settings = $about_me->child( settings => title => loc('Settings'), path => '/Prefs/Other.html', );
+        $settings->child( about_me => title => loc('About me'), path     => '/User/Prefs.html', );
+        $settings->child( search_options => title => loc('Search options'), path => '/Prefs/SearchOptions.html', );
+        $settings->child( myrt => title => loc('RT at a glance'), path => '/Prefs/MyRT.html', );
+        $settings->child( quicksearch => title => 'Quick search' => title => loc('Quick search'), path => '/Prefs/Quicksearch.html');
+
+        my $search_menu = $settings->child( 'saved-searches' => title => 'Saved Searches' );
+        my $searches = [ $m->comp( "/Search/Elements/SearchesForObject",
                           Object => RT::System->new( $session{'CurrentUser'} )) ];
         my $i = 0;
+
         for my $search (@$searches) {
-            $search_menu->child( "search-" . $i++,
-                      title => $search->[0],
-                      path  => "/Prefs/Search.html?" . $query_string->(
-                          name => ref( $search->[1] ) . '-' . $search->[1]->Id),
-            );
+            $search_menu->child( "search-" . $i++, title => $search->[0], path  => "/Prefs/Search.html?"
+                          . $query_string->( name => ref( $search->[1] ) . '-' . $search->[1]->Id),);
 
         }
     }
     if ( $session{'CurrentUser'}->Name
          && (   !RT->Config->Get('WebExternalAuth')
-              || RT->Config->Get('WebFallbackToInternalAuth') )
-       )
-    {
-        $about_me->child( logout => title => loc('Logout'),
-                          path   => '/NoAuth/Logout.html' );
+              || RT->Config->Get('WebFallbackToInternalAuth') )) {
+        $about_me->child( logout => title => loc('Logout'), path   => '/NoAuth/Logout.html' );
     }
 }
 if ( $request_path =~ qr'Dashboards/(\d+)?' ) {
@@ -317,130 +233,58 @@ if ( $request_path =~ qr'Dashboards/(\d+)?' ) {
         $obj->LoadById($id);
         if ( $obj and $obj->id ) {
             my $tabs = PageMenu;
-            $tabs->child( basics => title => loc('Basics'),
-                          path => "/Dashboards/Modify.html?id=" . $obj->id );
-            $tabs->child( content => title => loc('Content'),
-                          path => "/Dashboards/Queries.html?id=" . $obj->id );
+            $tabs->child( basics => title => loc('Basics'), path => "/Dashboards/Modify.html?id=" . $obj->id);
+            $tabs->child(content => title => loc('Content'), path => "/Dashboards/Queries.html?id=" . $obj->id);
             $tabs->child( subscription => title => loc('Subscription'),
-                      path => "/Dashboards/Subscription.html?id=" . $obj->id )
-                if $obj->CurrentUserCanSubscribe;
-            $tabs->child( show => title =>loc('Show'),
-                        path => "/Dashboards/" . $obj->id . "/" . $obj->Name )
-
+                    path => "/Dashboards/Subscription.html?id=" . $obj->id
+            ) if $obj->CurrentUserCanSubscribe;
+            $tabs->child( show => title => loc('Show'), path => "/Dashboards/" . $obj->id . "/" . $obj->Name)
         }
     }
 }
 
-if ( $request_path =~ qr'/SelfService' ) {
-
-    my $queues = RT::Queues->new( $session{'CurrentUser'} );
-    $queues->FindAllRows;
-
-    my $queue_count = 0;
-    my $queue_id    = 1;
-
-    while ( my $queue = $queues->Next ) {
-        next unless $queue->CurrentUserHasRight('CreateTicket');
-        $queue_id = $queue->id;
-        $queue_count++;
-        last if ( $queue_count > 1 );
-    }
-
-    my $TOP = Menu();
-
-    $TOP->child( open => title => loc('Open tickets'),   path => '/SelfService/', );
-    $TOP->child( closed => title => loc('Closed tickets'), path => '/SelfService/Closed.html', );
-    if ( $queue_count > 1 ) {
-        $TOP->child( new => title => loc('New ticket'),
-                     path => '/SelfService/CreateTicketInQueue.html' );
-    } else {
-        $TOP->child( new => title => loc('New ticket'),
-                     path => '/SelfService/Create.html?queue=' . $queue_id );
-    }
-
-    if ( $session{'CurrentUser'}
-         ->HasRight( Right => 'ModifySelf', Object => $RT::System ) )
-    {
-        $TOP->child( prefs => title => loc('Preferences'), path => '/SelfService/Prefs.html' );
-    }
-
-    # XXX TODO RENDER GOTO TICKET WIDGET
-    Menu->child( goto =>  title => $m->scomp('GotoTicket'), escape_title => 0)
-}
-
 if ( $request_path =~ qr'Admin/Queues' ) {
-    if ( $session{'CurrentUser'}
-         ->HasRight( Object => $RT::System, Right => 'AdminQueue' ) )
-    {
+    if ( $session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminQueue' ) ) {
     }
     if ( my $id = $m->request_args->{'id'} || $m->request_args->{'Queue'} ) {
         my $queue_obj = RT::Queue->new( $session{'CurrentUser'} );
         $queue_obj->Load($id);
 
         my $queue = PageMenu();
-        $queue->child( basics => title => loc('Basics'),
-                       path => "/Admin/Queues/Modify.html?id=" . $id );
-        $queue->child( people => title => loc('Watchers'),
-                       path => "/Admin/Queues/People.html?id=" . $id );
-        my $templates = $queue->child(
-                              templates => title => loc('Templates'),
-                              path => "/Admin/Queues/Templates.html?id=" . $id
-        );
+        $queue->child( basics => title => loc('Basics'), path => "/Admin/Queues/Modify.html?id=" . $id );
+        $queue->child( people => title => loc('Watchers'), path => "/Admin/Queues/People.html?id=" . $id );
+        my $templates = $queue->child(templates => title => loc('Templates'),
+                          path => "/Admin/Queues/Templates.html?id=" . $id);
 
-        $templates->child( select => title => loc('Select'),
-                           path => "/Admin/Queues/Templates.html?id=" . $id );
-        $templates->child(
-                   create => title => loc('Create'),
-                   path => "/Admin/Queues/Template.html?Create=1;Queue=" . $id
-        );
+        $templates->child(select => title => loc('Select'), path => "/Admin/Queues/Templates.html?id=".$id);
+        $templates->child( create => title => loc('Create'), path => "/Admin/Queues/Template.html?Create=1;Queue=".$id);
 
-        my $scrips = $queue->child(
-                                 scrips => title => loc('Scrips'),
-                                 path => "/Admin/Queues/Scrips.html?id=" . $id
-        );
+        my $scrips = $queue->child( scrips => title => loc('Scrips'), path => "/Admin/Queues/Scrips.html?id=" . $id);
 
-        $scrips->child( select => title => loc('Select'),
-                        path => "/Admin/Queues/Scrips.html?id=" . $id );
-        $scrips->child(
-                      create => title => loc('Create'),
-                      path => "/Admin/Queues/Scrip.html?Create=1;Queue=" . $id
-        );
+        $scrips->child( select => title => loc('Select'), path => "/Admin/Queues/Scrips.html?id=" . $id );
+        $scrips->child( create => title => loc('Create'), path => "/Admin/Queues/Scrip.html?Create=1;Queue=" . $id);
 
-        my $ticket_cfs = $queue->child( loc('Ticket Custom Fields'),
-              path => '/Admin/Queues/CustomFields.html?SubType=RT::Ticket&id='
-                  . $id );
+        my $ticket_cfs = $queue->child( 'ticket-custom-fields' => title => loc('Ticket Custom Fields'),
+              path => '/Admin/Queues/CustomFields.html?SubType=RT::Ticket&id=' . $id );
 
-        my $txn_cfs = $queue->child( loc('Transaction Custom Fields'),
-            path =>
-                '/Admin/Queues/CustomFields.html?SubType=RT::Ticket-RT::Transaction&id='
-                . $id );
+        my $txn_cfs = $queue->child( 'transaction-custom-fields' => title => loc('Transaction Custom Fields'),
+            path => '/Admin/Queues/CustomFields.html?SubType=RT::Ticket-RT::Transaction&id='.$id );
 
-        $queue->child( loc('Group Rights'),
-                       path => "/Admin/Queues/GroupRights.html?id=" . $id );
-        $queue->child( loc('User Rights'),
-                       path => "/Admin/Queues/UserRights.html?id=" . $id );
+        $queue->child( 'group-rights' => title => loc('Group Rights'), path => "/Admin/Queues/GroupRights.html?id=".$id );
+        $queue->child( 'user-rights' => title => loc('User Rights'), path => "/Admin/Queues/UserRights.html?id=" . $id );
     }
 }
-
 if ( $request_path =~ qr'/Admin/Users' ) {
     if ( my $id = $m->request_args->{'id'} ) {
         my $obj = RT::User->new( $session{'CurrentUser'} );
         $obj->Load($id);
-        my $tabs = PageMenu->child(
-                                 'current' => title => $obj->Name,
-                                 path => "/Admin/Users/Modify.html?id=" . $id,
-        );
-        $tabs->child( basics => title => loc('Basics'),
-                      path => "/Admin/Users/Modify.html?id=" . $id );
-        $tabs->child( memberships => title => loc('Memberships'),
-                      path => "/Admin/Users/Memberships.html?id=" . $id );
-        $tabs->child( history => title => loc('History'),
-                      path => "/Admin/Users/History.html?id=" . $id );
-        $tabs->child( 'my-rt' => title => loc('RT at a glance'),
-                      path => "/Admin/Users/MyRT.html?id=" . $id );
+        my $tabs = PageMenu->child( 'current' => title => $obj->Name, path => "/Admin/Users/Modify.html?id=" . $id,);
+        $tabs->child( basics => title => loc('Basics'), path => "/Admin/Users/Modify.html?id=" . $id );
+        $tabs->child( memberships => title => loc('Memberships'), path => "/Admin/Users/Memberships.html?id=" . $id );
+        $tabs->child( history => title => loc('History'), path => "/Admin/Users/History.html?id=" . $id );
+        $tabs->child( 'my-rt' => title => loc('RT at a glance'), path => "/Admin/Users/MyRT.html?id=" . $id );
         if ( RT->Config->Get('GnuPG')->{'enable'} ) {
-            $tabs->child( pgp => title => loc('GnuPG'),
-                          path => "/Admin/Users/GnuPG.html?id=" . $id );
+            $tabs->child( pgp => title => loc('GnuPG'), path => "/Admin/Users/GnuPG.html?id=" . $id );
         }
     }
 
@@ -450,44 +294,27 @@ if ( $request_path =~ qr'Admin/Groups' ) {
     if ( my $id = $m->request_args->{'id'} ) {
         my $obj = RT::Group->new( $session{'CurrentUser'} );
         $obj->Load($id);
-        my $tabs = PageMenu->child( $obj->Name,
-                    path => "/Admin/Groups/Modify.html?id=" . $id );
-        $tabs->child( basics => title =>
-                  loc('Basics') => path => "/Admin/Groups/Modify.html?id="
-                      . $obj->id );
-        $tabs->child( members => title =>
-                loc('Members') => path => "/Admin/Groups/Members.html?id="
-                    . $obj->id );
-        $tabs->child( 'group-rights' => title =>loc('Group Rights') => path =>
-                      "/Admin/Groups/GroupRights.html?id=" . $obj->id );
-        $tabs->child( 'user-rights' => title => loc('User Rights') => path =>
-                      "/Admin/Groups/UserRights.html?id=" . $obj->id );
-        $tabs->child( history => title =>
-                loc('History') => path => "/Admin/Groups/History.html?id="
-                    . $obj->id );
+        my $tabs = PageMenu->child( $obj->Name, path => "/Admin/Groups/Modify.html?id=" . $id );
+        $tabs->child( basics => title => loc('Basics') => path => "/Admin/Groups/Modify.html?id=" . $obj->id );
+        $tabs->child( members => title => loc('Members') => path => "/Admin/Groups/Members.html?id=" . $obj->id );
+        $tabs->child( 'group-rights' => title => loc('Group Rights') => path => "/Admin/Groups/GroupRights.html?id=" . $obj->id );
+        $tabs->child( 'user-rights' => title => loc('User Rights') => path => "/Admin/Groups/UserRights.html?id=" . $obj->id );
+        $tabs->child( history => title => loc('History') => path => "/Admin/Groups/History.html?id=" . $obj->id );
     }
-
 }
 
 if ( $request_path =~ qr'Admin/CustomFields/' ) {
-
     if ( my $id = $m->request_args->{'id'} ) {
         my $obj = RT::CustomField->new( $session{'CurrentUser'} );
         $obj->Load($id);
-        my $tabs = PageMenu->child( $obj->Name,
-                        path => "/Admin/CustomFields/Modify.html?id=" . $id );
+        my $tabs = PageMenu->child( $obj->Name => path => "/Admin/CustomFields/Modify.html?id=" . $id );
 
-        $tabs->child(
-                loc('Basics') => path => "/Admin/CustomFields/Modify.html?id="
-                    . $id );
-        $tabs->child( loc('Group Rights') => path =>
-                      "/Admin/CustomFields/GroupRights.html?id=" . $id );
-        $tabs->child( loc('User Rights') => path =>
-                      "/Admin/CustomFields/UserRights.html?id=" . $id );
+        $tabs->child( basics => title => loc('Basics') => path => "/Admin/CustomFields/Modify.html?id=".$id );
+        $tabs->child( 'group-rights' => title => loc('Group Rights') => path => "/Admin/CustomFields/GroupRights.html?id=" . $id );
+        $tabs->child( 'user-rights' => title => loc('User Rights') => path => "/Admin/CustomFields/UserRights.html?id=" . $id );
 
         if ( $obj->LookupType =~ /^RT::Queue-/io ) {
-            $tabs->child( loc('Applies to'),
-                       path => "/Admin/CustomFields/Objects.html?id=" . $id );
+            $tabs->child( 'applies-to' => title => loc('Applies to'), path => "/Admin/CustomFields/Objects.html?id=" . $id );
         }
 
     }
@@ -495,52 +322,48 @@ if ( $request_path =~ qr'Admin/CustomFields/' ) {
 }
 
 if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
-    my $search  = Menu()->child('search');
-    my $actions = PageMenu()
-        ->child( transitions => title => loc('Actions'), sort_order => 99 );
+    my $search = Menu()->child('search');
+    my $actions = PageMenu()->child( transitions => title => loc('Actions'), sort_order  => 99 );
     if ( ( $m->request_args->{'id'} || '' ) =~ /^(\d+)$/ ) {
         my $id  = $1;
         my $obj = RT::Ticket->new( $session{'CurrentUser'} );
         $obj->Load($id);
 
-        my $tabs = PageMenu()
-            ; #->child( "#" . $id => class => "currentnav",path => "/Ticket/Display.html?id=" . $id);
-        $tabs->child( bookmark => title =>
-                          $m->scomp( '/Ticket/Elements/Bookmark', id => $id ),
-                      escape_title => 0,
-                      link_item    => 0
-                    );
+        my $tabs = PageMenu();
+        $tabs->child( bookmark => title => $m->scomp( '/Ticket/Elements/Bookmark', id => $id ),
+                  escape_title => 0,
+                  link_item    => 0
+        );
 
-        $tabs->child(
-                 loc('Display') => path => "/Ticket/Display.html?id=" . $id );
+        $tabs->child( display => title => loc('Display') => path => "/Ticket/Display.html?id=" . $id );
 
-        $tabs->child(
-                 loc('History') => path => "/Ticket/History.html?id=" . $id );
+        $tabs->child( history => title => loc('History') => path => "/Ticket/History.html?id=" . $id );
 
         my %can = (
-              ModifyTicket    => $obj->CurrentUserHasRight('ModifyTicket'),
-              Watch    => $obj->CurrentUserHasRight('Watch'),
-              WatchAsAdminCc    => $obj->CurrentUserHasRight('WatchAsAdminCc'),
-              OwnTicket       => $obj->CurrentUserHasRight('OwnTicket'),
-              StealTicket     => $obj->CurrentUserHasRight('StealTicket'),
-              TakeTicket      => $obj->CurrentUserHasRight('TakeTicket'),
-              ReplyToTicket   => $obj->CurrentUserHasRight('ReplyToTicket'),
-              CommentOnTicket => $obj->CurrentUserHasRight('CommentOnTicket'),
-              ModifyCustomField => $obj->CurrentUserHasRight('ModifyCustomField'),
-              _ModifyOwner => (       $obj->CurrentUserHasRight('OwnTicket')
-                                   || $obj->CurrentUserHasRight('TakeTicket')
-                                   || $obj->CurrentUserHasRight('StealTicket')
-                              )
+            ModifyTicket   => $obj->CurrentUserHasRight('ModifyTicket'),
+            Watch          => $obj->CurrentUserHasRight('Watch'),
+            WatchAsAdminCc => $obj->CurrentUserHasRight('WatchAsAdminCc'),
+            OwnTicket      => $obj->CurrentUserHasRight('OwnTicket'),
+            StealTicket    => $obj->CurrentUserHasRight('StealTicket'),
+            TakeTicket     => $obj->CurrentUserHasRight('TakeTicket'),
+            ReplyToTicket  => $obj->CurrentUserHasRight('ReplyToTicket'),
+            CommentOnTicket => $obj->CurrentUserHasRight('CommentOnTicket'),
+            ModifyCustomField => $obj->CurrentUserHasRight('ModifyCustomField'),
+            _ModifyOwner => (
+                                  $obj->CurrentUserHasRight('OwnTicket')
+                               || $obj->CurrentUserHasRight('TakeTicket')
+                               || $obj->CurrentUserHasRight('StealTicket')
+                            )
                   );
+
         # comment out until we can do it for an individual custom field
         #if ( $can{ModifyTicket} || $can{ModifyCustomField} ) {
-            $tabs->child( basics => title => loc('Basics'),
-                          path => "/Ticket/Modify.html?id=" . $id, );
+        $tabs->child( basics => title => loc('Basics'), path => "/Ticket/Modify.html?id=" . $id, );
+
         #}
 
-        if ( $can{ModifyTicket} || $can{_ModifyOwner} ||$can{Watch} ||$can{WatchAsAdminCc}) {
-            $tabs->child( people => title => loc('People'),
-                          path => "/Ticket/ModifyPeople.html?id=" . $id, );
+        if ( $can{ModifyTicket} || $can{_ModifyOwner} || $can{Watch} || $can{WatchAsAdminCc} ) {
+            $tabs->child( people => title => loc('People'), path => "/Ticket/ModifyPeople.html?id=" . $id,);
         }
 
         if ( $can{ModifyTicket} ) {
@@ -548,8 +371,8 @@ if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
             $tabs->child( links => title => loc('Links'), path => "/Ticket/ModifyLinks.html?id=" . $id, );
         }
 
-        #if (    $can{ModifyTicket} || $can{ModifyCustomField} || $can{_ModifyOwner} ) {
-            $tabs->child( jumbo => title => loc('Jumbo'), path => "/Ticket/ModifyAll.html?id=" . $id, );
+        #if ( $can{ModifyTicket} || $can{ModifyCustomField} || $can{_ModifyOwner} ) {
+        $tabs->child( jumbo => title => loc('Jumbo'), path => "/Ticket/ModifyAll.html?id=" . $id, );
         #}
 
         if ( RT->Config->Get('EnableReminders') ) {
@@ -557,9 +380,7 @@ if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
         }
 
         if ( $can{'ModifyTicket'} or $can{'ReplyToTicket'} ) {
-            $actions->child(
-                        reply => title => loc('Reply'), path => "/Ticket/Update.html?Action=Respond;id=" . $id,
-            );
+            $actions->child( reply => title => loc('Reply'), path => "/Ticket/Update.html?Action=Respond;id=" . $id,);
         }
 
         if ( $obj->CurrentUserHasRight('ForwardMessage') ) {
@@ -567,71 +388,49 @@ if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
         }
 
         if ( $can{'ModifyTicket'} ) {
-            my $current = $obj->Status;
-            my $lifecycle  = $obj->QueueObj->lifecycle;
-            my $i       = 1;
+            my $current   = $obj->Status;
+            my $lifecycle = $obj->QueueObj->lifecycle;
+            my $i         = 1;
             foreach my $next ( $lifecycle->transitions($current) ) {
                 my $action = $lifecycle->transition_action( $current => $next );
                 next if $action eq 'hide';
-            my $check = $lifecycle->check_right( $current => $next );
-            $can{$check} = $obj->CurrentUserHasRight($check) unless exists $can{$check};
-            next unless $can{$check};
+                my $check = $lifecycle->check_right( $current => $next );
+                $can{$check} = $obj->CurrentUserHasRight($check) unless exists $can{$check};
+                next unless $can{$check};
 
                 my $url = '/Ticket/';
                 if ($action) {
 
-                    $url .= "Update.html?"
-                        . $query_string->( Action        => $action,
+                    $url .= "Update.html?" . $query_string->(Action => $action,
                                            DefaultStatus => $next,
-                                           id            => $id
-                                         );
+                                           id            => $id);
                 } else {
-
-                    $url .= "Display.html?"
-                        . $query_string->( Status => $next, id => $id );
+                    $url .= "Display.html?" . $query_string->( Status => $next, id => $id );
                 }
-                $actions->child(
-                      loc( $lifecycle->transition_label( $current => $next ) ) =>
-                          path => $url );
+                $actions->child( loc($lifecycle->transition_label( $current => $next )) => path => $url);
             }
 
         }
         if ( $can{OwnTicket} ) {
             if ( $obj->OwnerObj->Id == RT->Nobody->id
-                 && ( $can{'ModifyTicket'} or $can{'TakeTicket'} ) )
-            {
-                $actions->child(
-                        take => path => "/Ticket/Display.html?Action=Take;id="
-                            . $id,
-                        title => loc('Take')
-                    ),
-                    ;
+                 && ( $can{'ModifyTicket'} or $can{'TakeTicket'} ) ) {
+                $actions->child( take => path => "/Ticket/Display.html?Action=Take;id=" . $id, title => loc('Take'));
             }
 
             elsif (    $obj->OwnerObj->id != RT->Nobody->id
                     && $obj->OwnerObj->id != $session{CurrentUser}->id
-                    && ( $can{'ModifyTicket'} or $can{'StealTicket'} ) )
-            {
-
-                $actions->child(
-                        steal => title => loc('Steal'),
-                        path => "/Ticket/Display.html?Action=Steal;id=" . $id,
-                );
+                    && ( $can{'ModifyTicket'} or $can{'StealTicket'} ) ) {
+                $actions->child( steal => title => loc('Steal'), path => "/Ticket/Display.html?Action=Steal;id=" . $id,);
             }
         }
 
         if ( $can{'ModifyTicket'} || $can{'CommentOnTicket'} ) {
-            $actions->child(
-                        comment => title => loc('Comment'),
-                        path => "/Ticket/Update.html?Action=Comment;id=" . $id,
-            );
+            $actions->child( comment => title => loc('Comment'), path => "/Ticket/Update.html?Action=Comment;id=" . $id);
         }
 
         if ( defined $session{"tickets"} ) {
-
             # we have to update session data if we get new ItemMap
-            my $updatesession = 1
-                unless ( $session{"tickets"}->{'item_map'} );
+            my $updatesession = 1 unless ( $session{"tickets"}->{'item_map'} );
 
             my $item_map = $session{"tickets"}->ItemMap;
 
@@ -641,115 +440,107 @@ if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
 
             # Don't display prev links if we're on the first ticket
             if ( $item_map->{$id}->{prev} ) {
-                $search->child(
-                       'first',
-                       title => '<< ' . loc('First') => class => "nav",
-                       path => "/Ticket/Display.html?id=" . $item_map->{first}
-                );
-                $search->child(
-                        prev => title => '< ' . loc('Prev') => class => "nav",
-                        path => "/Ticket/Display.html?id="
-                            . $item_map->{$id}->{prev}
-                );
+                $search->child( 'first', title => '<< ' . loc('First') => class => "nav",
+                          path => "/Ticket/Display.html?id=" . $item_map->{first});
+                $search->child( prev => title => '< ' . loc('Prev') => class => "nav",
+                    path => "/Ticket/Display.html?id=" . $item_map->{$id}->{prev});
 
                 # Don't display next links if we're on the last ticket
                 if ( $item_map->{$id}->{next} ) {
-                    $search->child(
-                        next => title => loc('next') . ' >' => class => "nav",
-                        path => "/Ticket/Display.html?id="
-                            . $item_map->{$id}->{next}
-                    );
-                    $search->child(
-                        last        => title => loc('Last')
-                            . ' >>' => class => "nav",
-                        path => "/Ticket/Display.html?id=" . $item_map->{last}
-                    );
+                    $search->child( next       => title => loc('next') . ' >' => class => "nav",
+                                    path => "/Ticket/Display.html?id=" . $item_map->{$id}->{next});
+                    $search->child( last        => title => loc('Last') . ' >>' => class => "nav",
+                                    path => "/Ticket/Display.html?id=" . $item_map->{last});
                 }
             }
         }
     }
     my $args      = '';
     my $has_query = '';
-
     my $current_search = $session{"CurrentSearchHash"} || {};
-    my $search_id
-        = $m->request_args->{'SavedSearchId'}
-        || $search->{'SearchId'}
-        || '';
+    my $search_id = $m->request_args->{'SavedSearchId'} || $search->{'SearchId'} || '';
 
-    $has_query = 1
-        if ( $m->request_args->{'Query'} or $current_search->{'Query'} );
+    $has_query = 1 if ( $m->request_args->{'Query'} or $current_search->{'Query'} );
 
     my %query_args = (
-
         SavedSearchId => ( $search_id eq 'new' ) ? undef : $search_id,
-    SavedChartSearchId => $m->request_args->{'SavedChartSearchId'} || $current_search->{SavedChartSearchId},
-        Query  => $m->request_args->{'Query'}  || $current_search->{'Query'},
+        SavedChartSearchId => $m->request_args->{'SavedChartSearchId'} || $current_search->{SavedChartSearchId},
+        Query => $m->request_args->{'Query'} || $current_search->{'Query'},
         Format => $m->request_args->{'Format'} || $current_search->{'Format'},
-        OrderBy => $m->request_args->{'OrderBy'}
-            || $current_search->{'OrderBy'},
+        OrderBy => $m->request_args->{'OrderBy'} || $current_search->{'OrderBy'},
         Order => $m->request_args->{'Order'} || $current_search->{'Order'},
-        Page  => $m->request_args->{'Page'}  || $current_search->{'Page'},
+        Page => $m->request_args->{'Page'} || $current_search->{'Page'},
         RowsPerPage => ( defined $m->request_args->{'RowsPerPage'}
                          ? $m->request_args->{'RowsPerPage'}
-                         : $current_search->{'RowsPerPage'}
-                       )
+                         : $current_search->{'RowsPerPage'})
                      );
     for my $field (qw(Order OrderBy)) {
-        if (ref($query_args{$field}) eq 'ARRAY') {
-        $query_args{$field} = join("|",@{$query_args{$field}});
+        if ( ref( $query_args{$field} ) eq 'ARRAY' ) {
+            $query_args{$field} = join( "|", @{ $query_args{$field} } );
         }
     }
 
-
     $args = "?" . $query_string->(%query_args);
 
-    my $current_search_menu
-        = $search->child( current_search => title => loc('Current Search') );
-    $current_search_menu->child(
-                   edit_search => title => loc('Edit Search') => path =>
-                       "/Search/Build.html" . ( ($has_query) ? $args : '' ) );
-    $current_search_menu->child(
-                        loc('Advanced') => path => "/Search/Edit.html$args" );
+    my $current_search_menu = $search->child( current_search => title => loc('Current Search') );
+    $current_search_menu->child( edit_search => title => loc('Edit Search') =>
+                                 path => "/Search/Build.html" . ( ($has_query) ? $args : '' ) );
+    $current_search_menu->child( loc('Advanced') => path => "/Search/Edit.html$args" );
     if ($has_query) {
         if ($request_path =~ qr|^Search/Results.html|
             &&                        #XXX TODO better abstraction
-            $session{'CurrentUser'}
-            ->HasRight( Right => 'SuperUser', Object => $RT::System )
-           )
-        {
-            my $shred_args =
-                URI->new->query_param(
-                                 search          => 1,
-                                 plugin          => 'Tickets',
-                                 'Tickets:query' => $query_args{'Query'},
-                                 'Tickets:limit' => $query_args{'Rows'}
-                );
-
-            $current_search_menu->child(
-                                'shredder' => title => loc('Shredder'),
-                                path => 'Admin/Tools/Shredder/?' . $shred_args
-            );
+            $session{'CurrentUser'}->HasRight( Right => 'SuperUser', Object => $RT::System )) {
+            my $shred_args = URI->new->query_param(
+                                  search          => 1,
+                                  plugin          => 'Tickets',
+                                  'Tickets:query' => $query_args{'Query'},
+                                  'Tickets:limit' => $query_args{'Rows'});
+            $current_search_menu->child( 'shredder' => title => loc('Shredder'),
+                            path => 'Admin/Tools/Shredder/?' . $shred_args);
         }
 
-        $current_search_menu->child(
-                            results => title => loc('Show Results') => path =>
-                                "/Search/Results.html$args" );
+        $current_search_menu->child( results => title => loc('Show Results') => path => "/Search/Results.html$args" );
+        $current_search_menu->child( bulk => title => loc('Bulk Update') => path => "/Search/Bulk.html$args" );
+        $current_search_menu->child( chart => title => loc('Graph'), path => "Search/Chart.html$args");
+    }
+}
+
+if ( $request_path =~ /^\/(?:index.html|$)/ ) {
+    PageMenu()->child( edit => title => loc('Edit'), path => '/Prefs/MyRT.html' );
+}
 
-        $current_search_menu->child(
-                                bulk => title => loc('Bulk Update') => path =>
-                                    "/Search/Bulk.html$args" );
-    $current_search_menu->child( chart => path  => "Search/Chart.html$args", title => loc('Graph'),);
+if ( $request_path =~ qr'/SelfService' ) {
 
+    my $queues = RT::Queues->new( $session{'CurrentUser'} );
+    $queues->FindAllRows;
+
+    my $queue_count = 0;
+    my $queue_id    = 1;
+
+    while ( my $queue = $queues->Next ) {
+        next unless $queue->CurrentUserHasRight('CreateTicket');
+        $queue_id = $queue->id;
+        $queue_count++;
+        last if ( $queue_count > 1 );
     }
 
-}
+    my $TOP = Menu();
 
-if ( $request_path =~ /^\/(?:index.html|$)/ ) {
+    $TOP->child( open => title => loc('Open tickets'), path => '/SelfService/', );
+    $TOP->child( closed => title => loc('Closed tickets'), path => '/SelfService/Closed.html', );
+    if ( $queue_count > 1 ) {
+        $TOP->child( new => title => loc('New ticket'), path => '/SelfService/CreateTicketInQueue.html' );
+    } else {
+        $TOP->child( new => title => loc('New ticket'), path => '/SelfService/Create.html?queue=' . $queue_id );
+    }
 
-    PageMenu()->child(edit => title => loc('Edit'), path => '/Prefs/MyRT.html');
-}
+    if ( $session{'CurrentUser'}->HasRight( Right => 'ModifySelf', Object => $RT::System ) ) {
+        $TOP->child( prefs => title => loc('Preferences'), path  => '/SelfService/Prefs.html' );
+    }
 
+    # XXX TODO RENDER GOTO TICKET WIDGET
+    Menu->child( goto         => title => $m->scomp('GotoTicket'), escape_title => 0 );
+}
 
 </%INIT>
 <%ARGS>

commit c01a1cadc3f9e87bbb0e507b352dfa153d15b8e5
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Tue Nov 2 23:36:59 2010 -0400

    reworking how widgets work

diff --git a/lib/RT/Interface/Web.pm b/lib/RT/Interface/Web.pm
index 1c8d276..d2c4d86 100755
--- a/lib/RT/Interface/Web.pm
+++ b/lib/RT/Interface/Web.pm
@@ -288,6 +288,7 @@ sub MaybeShowNoAuthPage {
 sub InitializeMenu {
     $HTML::Mason::Commands::m->notes('menu', RT::Interface::Web::Menu->new());
     $HTML::Mason::Commands::m->notes('page-menu', RT::Interface::Web::Menu->new());
+    $HTML::Mason::Commands::m->notes('page-widgets', RT::Interface::Web::Menu->new());
 
 }
 
@@ -828,6 +829,12 @@ sub PageMenu {
     return $HTML::Mason::Commands::m->notes('page-menu');
 }
 
+sub PageWidgets {
+    return $HTML::Mason::Commands::m->notes('page-widgets');
+}
+
+
+
 =head2 loc ARRAY
 
 loc is a nice clean global routine which calls $session{'CurrentUser'}->loc()
diff --git a/share/html/Elements/Menu b/share/html/Elements/Menu
index 08fa385..3975119 100755
--- a/share/html/Elements/Menu
+++ b/share/html/Elements/Menu
@@ -70,9 +70,6 @@
 % }
 % }
 <%" " x $depth%></ul>\
-<%INIT>
-
-</%INIT>
 <%ARGS>
 $menu
 $id => undef
diff --git a/share/html/Elements/PageLayout b/share/html/Elements/PageLayout
index ac1eaf8..c1851aa 100755
--- a/share/html/Elements/PageLayout
+++ b/share/html/Elements/PageLayout
@@ -50,22 +50,14 @@
 
 <div id="page-navigation"><& /Elements/Menu, menu => PageMenu(), id => 'page-menu', 'parent_id' => 'page' &></div>
 % }
-<div id="widgets"><& /Elements/Widgets &></div>
+% # toplevel 0 disables the superfish js stuff
+<div id="topactions"><& /Elements/WidgetBar, menu => PageWidgets() &></div>
 <script type="text/javascript">
 jQuery(document).ready(function(){ jQuery("#app-nav").superfish(); });
 jQuery(document).ready(function(){ jQuery("#page-menu").superfish(); });
 jQuery(document).ready(function(){ jQuery("#actions-menu").superfish(); });
 </script>
-
-<div id="header">
-<h1><% $title %></h1>
-% my $sep       = 0;
-% my $postsep   = 0;
-% my $count     = 0;
-% my $class     = { };
-% 
-
-</div>
+<div id="header"><h1><% $title %></h1></div>
 <div id="body">
 % $m->callback( %ARGS, CallbackName => 'BeforeBody' );
 % $m->flush_buffer(); # we've got the page laid out, let's flush the buffer;
diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 6a991f4..af2a3f0 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -509,6 +509,9 @@ if ( $request_path =~ /^\/(?:index.html|$)/ ) {
     PageMenu()->child( edit => title => loc('Edit'), path => '/Prefs/MyRT.html' );
 }
 
+PageWidgets()->child( simple_search => title => $m->scomp('SimpleSearch'), escape_title => 0 );
+PageWidgets()->child( create_ticket => title => $m->scomp('CreateTicket'), escape_title => 0 );
+
 if ( $request_path =~ qr'/SelfService' ) {
 
     my $queues = RT::Queues->new( $session{'CurrentUser'} );
diff --git a/share/html/Elements/Menu b/share/html/Elements/WidgetBar
old mode 100755
new mode 100644
similarity index 75%
copy from share/html/Elements/Menu
copy to share/html/Elements/WidgetBar
index 08fa385..22c7f7c
--- a/share/html/Elements/Menu
+++ b/share/html/Elements/WidgetBar
@@ -45,38 +45,13 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-
-<%" " x $depth%><ul<%$id ? ' id="'.$id.'"' : '' |n%><% $toplevel? ' class="sf-menu sf-js-enabled sf-shadow"' : '' |n %>>
 % for my $child ($menu->children) {
-%   my $item_id = lc(($parent_id? $parent_id."-" : "") .$child->key);
-%   $item_id =~ s/\s/-/g;
-<%" " x ($depth+1)%><li>\
-% if ($child->link_item) {
-<a id="<%$item_id%>" <% $child->path ? ' href="'.RT->Config->Get('WebPath').$child->path.'"' : '' |n%>>\
-% }
 % if ($child->escape_title) {
 <%$child->title%>\
 % } else {
 <%$child->title |n%>\
 % }
-% if ($child->link_item) {
-</a>\
-% }
-% if ($child->has_children) {
-<& Menu, menu => $child, toplevel => 0, parent_id => ($parent_id? $parent_id."-": '').$child->key, depth=> ($depth+1) &>
-<%" " x ($depth+1)%></li>
-% } else {
-</li>
-% }
 % }
-<%" " x $depth%></ul>\
-<%INIT>
-
-</%INIT>
 <%ARGS>
 $menu
-$id => undef
-$toplevel => 1
-$parent_id => ''
-$depth => 0
 </%ARGS>
diff --git a/share/html/Elements/Widgets b/share/html/Elements/Widgets
deleted file mode 100644
index 778a846..0000000
--- a/share/html/Elements/Widgets
+++ /dev/null
@@ -1,4 +0,0 @@
-<div id="topactions">
-<& /Elements/SimpleSearch &>
-<& /Elements/CreateTicket &>
-</div>

commit 559387c1d16d51d8b14e9f926729469cc7952a0a
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Tue Nov 2 21:24:45 2010 -0400

    Special-case the self-service menu

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index af2a3f0..360c5bf 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -68,8 +68,8 @@ my $query_string = sub {
     return $u->query;
 };
 
-if ( $request_path =~ qr{.*} ) {
-    my $home = Menu->child( home => title => loc('HomePage'), path => '/' );
+if ( $request_path !~ qr{^/SelfService/} ) {
+    my $home = Menu->child( home => title => loc('Home Page'), path => '/' );
     my @dashboards = $m->comp("/Dashboards/Elements/ListOfDashboards");
     my $limit      = 7;
 
@@ -226,292 +226,292 @@ if ( $request_path =~ qr{.*} ) {
               || RT->Config->Get('WebFallbackToInternalAuth') )) {
         $about_me->child( logout => title => loc('Logout'), path   => '/NoAuth/Logout.html' );
     }
-}
-if ( $request_path =~ qr'Dashboards/(\d+)?' ) {
-    if ( my $id = ( $1 || $m->request_args->{'id'} ) ) {
-        my $obj = RT::Dashboard->new( $session{'CurrentUser'} );
-        $obj->LoadById($id);
-        if ( $obj and $obj->id ) {
-            my $tabs = PageMenu;
-            $tabs->child( basics => title => loc('Basics'), path => "/Dashboards/Modify.html?id=" . $obj->id);
-            $tabs->child(content => title => loc('Content'), path => "/Dashboards/Queries.html?id=" . $obj->id);
-            $tabs->child( subscription => title => loc('Subscription'),
-                    path => "/Dashboards/Subscription.html?id=" . $obj->id
-            ) if $obj->CurrentUserCanSubscribe;
-            $tabs->child( show => title => loc('Show'), path => "/Dashboards/" . $obj->id . "/" . $obj->Name)
+    if ( $request_path =~ qr'Dashboards/(\d+)?' ) {
+        if ( my $id = ( $1 || $m->request_args->{'id'} ) ) {
+            my $obj = RT::Dashboard->new( $session{'CurrentUser'} );
+            $obj->LoadById($id);
+            if ( $obj and $obj->id ) {
+                my $tabs = PageMenu;
+                $tabs->child( basics => title => loc('Basics'), path => "/Dashboards/Modify.html?id=" . $obj->id);
+                $tabs->child(content => title => loc('Content'), path => "/Dashboards/Queries.html?id=" . $obj->id);
+                $tabs->child( subscription => title => loc('Subscription'),
+                        path => "/Dashboards/Subscription.html?id=" . $obj->id
+                ) if $obj->CurrentUserCanSubscribe;
+                $tabs->child( show => title => loc('Show'), path => "/Dashboards/" . $obj->id . "/" . $obj->Name)
+            }
         }
     }
-}
 
-if ( $request_path =~ qr'Admin/Queues' ) {
-    if ( $session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminQueue' ) ) {
-    }
-    if ( my $id = $m->request_args->{'id'} || $m->request_args->{'Queue'} ) {
-        my $queue_obj = RT::Queue->new( $session{'CurrentUser'} );
-        $queue_obj->Load($id);
+    if ( $request_path =~ qr'Admin/Queues' ) {
+        if ( $session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminQueue' ) ) {
+        }
+        if ( my $id = $m->request_args->{'id'} || $m->request_args->{'Queue'} ) {
+            my $queue_obj = RT::Queue->new( $session{'CurrentUser'} );
+            $queue_obj->Load($id);
 
-        my $queue = PageMenu();
-        $queue->child( basics => title => loc('Basics'), path => "/Admin/Queues/Modify.html?id=" . $id );
-        $queue->child( people => title => loc('Watchers'), path => "/Admin/Queues/People.html?id=" . $id );
-        my $templates = $queue->child(templates => title => loc('Templates'),
-                          path => "/Admin/Queues/Templates.html?id=" . $id);
+            my $queue = PageMenu();
+            $queue->child( basics => title => loc('Basics'), path => "/Admin/Queues/Modify.html?id=" . $id );
+            $queue->child( people => title => loc('Watchers'), path => "/Admin/Queues/People.html?id=" . $id );
+            my $templates = $queue->child(templates => title => loc('Templates'),
+                              path => "/Admin/Queues/Templates.html?id=" . $id);
 
-        $templates->child(select => title => loc('Select'), path => "/Admin/Queues/Templates.html?id=".$id);
-        $templates->child( create => title => loc('Create'), path => "/Admin/Queues/Template.html?Create=1;Queue=".$id);
+            $templates->child(select => title => loc('Select'), path => "/Admin/Queues/Templates.html?id=".$id);
+            $templates->child( create => title => loc('Create'), path => "/Admin/Queues/Template.html?Create=1;Queue=".$id);
 
-        my $scrips = $queue->child( scrips => title => loc('Scrips'), path => "/Admin/Queues/Scrips.html?id=" . $id);
+            my $scrips = $queue->child( scrips => title => loc('Scrips'), path => "/Admin/Queues/Scrips.html?id=" . $id);
 
-        $scrips->child( select => title => loc('Select'), path => "/Admin/Queues/Scrips.html?id=" . $id );
-        $scrips->child( create => title => loc('Create'), path => "/Admin/Queues/Scrip.html?Create=1;Queue=" . $id);
+            $scrips->child( select => title => loc('Select'), path => "/Admin/Queues/Scrips.html?id=" . $id );
+            $scrips->child( create => title => loc('Create'), path => "/Admin/Queues/Scrip.html?Create=1;Queue=" . $id);
 
-        my $ticket_cfs = $queue->child( 'ticket-custom-fields' => title => loc('Ticket Custom Fields'),
-              path => '/Admin/Queues/CustomFields.html?SubType=RT::Ticket&id=' . $id );
+            my $ticket_cfs = $queue->child( 'ticket-custom-fields' => title => loc('Ticket Custom Fields'),
+                  path => '/Admin/Queues/CustomFields.html?SubType=RT::Ticket&id=' . $id );
 
-        my $txn_cfs = $queue->child( 'transaction-custom-fields' => title => loc('Transaction Custom Fields'),
-            path => '/Admin/Queues/CustomFields.html?SubType=RT::Ticket-RT::Transaction&id='.$id );
+            my $txn_cfs = $queue->child( 'transaction-custom-fields' => title => loc('Transaction Custom Fields'),
+                path => '/Admin/Queues/CustomFields.html?SubType=RT::Ticket-RT::Transaction&id='.$id );
 
-        $queue->child( 'group-rights' => title => loc('Group Rights'), path => "/Admin/Queues/GroupRights.html?id=".$id );
-        $queue->child( 'user-rights' => title => loc('User Rights'), path => "/Admin/Queues/UserRights.html?id=" . $id );
-    }
-}
-if ( $request_path =~ qr'/Admin/Users' ) {
-    if ( my $id = $m->request_args->{'id'} ) {
-        my $obj = RT::User->new( $session{'CurrentUser'} );
-        $obj->Load($id);
-        my $tabs = PageMenu->child( 'current' => title => $obj->Name, path => "/Admin/Users/Modify.html?id=" . $id,);
-        $tabs->child( basics => title => loc('Basics'), path => "/Admin/Users/Modify.html?id=" . $id );
-        $tabs->child( memberships => title => loc('Memberships'), path => "/Admin/Users/Memberships.html?id=" . $id );
-        $tabs->child( history => title => loc('History'), path => "/Admin/Users/History.html?id=" . $id );
-        $tabs->child( 'my-rt' => title => loc('RT at a glance'), path => "/Admin/Users/MyRT.html?id=" . $id );
-        if ( RT->Config->Get('GnuPG')->{'enable'} ) {
-            $tabs->child( pgp => title => loc('GnuPG'), path => "/Admin/Users/GnuPG.html?id=" . $id );
+            $queue->child( 'group-rights' => title => loc('Group Rights'), path => "/Admin/Queues/GroupRights.html?id=".$id );
+            $queue->child( 'user-rights' => title => loc('User Rights'), path => "/Admin/Queues/UserRights.html?id=" . $id );
         }
     }
+    if ( $request_path =~ qr'/Admin/Users' ) {
+        if ( my $id = $m->request_args->{'id'} ) {
+            my $obj = RT::User->new( $session{'CurrentUser'} );
+            $obj->Load($id);
+            my $tabs = PageMenu->child( 'current' => title => $obj->Name, path => "/Admin/Users/Modify.html?id=" . $id,);
+            $tabs->child( basics => title => loc('Basics'), path => "/Admin/Users/Modify.html?id=" . $id );
+            $tabs->child( memberships => title => loc('Memberships'), path => "/Admin/Users/Memberships.html?id=" . $id );
+            $tabs->child( history => title => loc('History'), path => "/Admin/Users/History.html?id=" . $id );
+            $tabs->child( 'my-rt' => title => loc('RT at a glance'), path => "/Admin/Users/MyRT.html?id=" . $id );
+            if ( RT->Config->Get('GnuPG')->{'enable'} ) {
+                $tabs->child( pgp => title => loc('GnuPG'), path => "/Admin/Users/GnuPG.html?id=" . $id );
+            }
+        }
 
-}
+    }
 
-if ( $request_path =~ qr'Admin/Groups' ) {
-    if ( my $id = $m->request_args->{'id'} ) {
-        my $obj = RT::Group->new( $session{'CurrentUser'} );
-        $obj->Load($id);
-        my $tabs = PageMenu->child( $obj->Name, path => "/Admin/Groups/Modify.html?id=" . $id );
-        $tabs->child( basics => title => loc('Basics') => path => "/Admin/Groups/Modify.html?id=" . $obj->id );
-        $tabs->child( members => title => loc('Members') => path => "/Admin/Groups/Members.html?id=" . $obj->id );
-        $tabs->child( 'group-rights' => title => loc('Group Rights') => path => "/Admin/Groups/GroupRights.html?id=" . $obj->id );
-        $tabs->child( 'user-rights' => title => loc('User Rights') => path => "/Admin/Groups/UserRights.html?id=" . $obj->id );
-        $tabs->child( history => title => loc('History') => path => "/Admin/Groups/History.html?id=" . $obj->id );
+    if ( $request_path =~ qr'Admin/Groups' ) {
+        if ( my $id = $m->request_args->{'id'} ) {
+            my $obj = RT::Group->new( $session{'CurrentUser'} );
+            $obj->Load($id);
+            my $tabs = PageMenu->child( $obj->Name, path => "/Admin/Groups/Modify.html?id=" . $id );
+            $tabs->child( basics => title => loc('Basics') => path => "/Admin/Groups/Modify.html?id=" . $obj->id );
+            $tabs->child( members => title => loc('Members') => path => "/Admin/Groups/Members.html?id=" . $obj->id );
+            $tabs->child( 'group-rights' => title => loc('Group Rights') => path => "/Admin/Groups/GroupRights.html?id=" . $obj->id );
+            $tabs->child( 'user-rights' => title => loc('User Rights') => path => "/Admin/Groups/UserRights.html?id=" . $obj->id );
+            $tabs->child( history => title => loc('History') => path => "/Admin/Groups/History.html?id=" . $obj->id );
+        }
     }
-}
 
-if ( $request_path =~ qr'Admin/CustomFields/' ) {
-    if ( my $id = $m->request_args->{'id'} ) {
-        my $obj = RT::CustomField->new( $session{'CurrentUser'} );
-        $obj->Load($id);
-        my $tabs = PageMenu->child( $obj->Name => path => "/Admin/CustomFields/Modify.html?id=" . $id );
+    if ( $request_path =~ qr'Admin/CustomFields/' ) {
+        if ( my $id = $m->request_args->{'id'} ) {
+            my $obj = RT::CustomField->new( $session{'CurrentUser'} );
+            $obj->Load($id);
+            my $tabs = PageMenu->child( $obj->Name => path => "/Admin/CustomFields/Modify.html?id=" . $id );
+
+            $tabs->child( basics => title => loc('Basics') => path => "/Admin/CustomFields/Modify.html?id=".$id );
+            $tabs->child( 'group-rights' => title => loc('Group Rights') => path => "/Admin/CustomFields/GroupRights.html?id=" . $id );
+            $tabs->child( 'user-rights' => title => loc('User Rights') => path => "/Admin/CustomFields/UserRights.html?id=" . $id );
 
-        $tabs->child( basics => title => loc('Basics') => path => "/Admin/CustomFields/Modify.html?id=".$id );
-        $tabs->child( 'group-rights' => title => loc('Group Rights') => path => "/Admin/CustomFields/GroupRights.html?id=" . $id );
-        $tabs->child( 'user-rights' => title => loc('User Rights') => path => "/Admin/CustomFields/UserRights.html?id=" . $id );
+            if ( $obj->LookupType =~ /^RT::Queue-/io ) {
+                $tabs->child( 'applies-to' => title => loc('Applies to'), path => "/Admin/CustomFields/Objects.html?id=" . $id );
+            }
 
-        if ( $obj->LookupType =~ /^RT::Queue-/io ) {
-            $tabs->child( 'applies-to' => title => loc('Applies to'), path => "/Admin/CustomFields/Objects.html?id=" . $id );
         }
 
     }
 
-}
-
-if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
-    my $search = Menu()->child('search');
-    my $actions = PageMenu()->child( transitions => title => loc('Actions'), sort_order  => 99 );
-    if ( ( $m->request_args->{'id'} || '' ) =~ /^(\d+)$/ ) {
-        my $id  = $1;
-        my $obj = RT::Ticket->new( $session{'CurrentUser'} );
-        $obj->Load($id);
-
-        my $tabs = PageMenu();
-        $tabs->child( bookmark => title => $m->scomp( '/Ticket/Elements/Bookmark', id => $id ),
-                  escape_title => 0,
-                  link_item    => 0
-        );
-
-        $tabs->child( display => title => loc('Display') => path => "/Ticket/Display.html?id=" . $id );
-
-        $tabs->child( history => title => loc('History') => path => "/Ticket/History.html?id=" . $id );
-
-        my %can = (
-            ModifyTicket   => $obj->CurrentUserHasRight('ModifyTicket'),
-            Watch          => $obj->CurrentUserHasRight('Watch'),
-            WatchAsAdminCc => $obj->CurrentUserHasRight('WatchAsAdminCc'),
-            OwnTicket      => $obj->CurrentUserHasRight('OwnTicket'),
-            StealTicket    => $obj->CurrentUserHasRight('StealTicket'),
-            TakeTicket     => $obj->CurrentUserHasRight('TakeTicket'),
-            ReplyToTicket  => $obj->CurrentUserHasRight('ReplyToTicket'),
-            CommentOnTicket => $obj->CurrentUserHasRight('CommentOnTicket'),
-            ModifyCustomField => $obj->CurrentUserHasRight('ModifyCustomField'),
-            _ModifyOwner => (
-                                  $obj->CurrentUserHasRight('OwnTicket')
-                               || $obj->CurrentUserHasRight('TakeTicket')
-                               || $obj->CurrentUserHasRight('StealTicket')
-                            )
-                  );
-
-        # comment out until we can do it for an individual custom field
-        #if ( $can{ModifyTicket} || $can{ModifyCustomField} ) {
-        $tabs->child( basics => title => loc('Basics'), path => "/Ticket/Modify.html?id=" . $id, );
-
-        #}
-
-        if ( $can{ModifyTicket} || $can{_ModifyOwner} || $can{Watch} || $can{WatchAsAdminCc} ) {
-            $tabs->child( people => title => loc('People'), path => "/Ticket/ModifyPeople.html?id=" . $id,);
-        }
+    if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
+        my $search = Menu()->child('search');
+        my $actions = PageMenu()->child( transitions => title => loc('Actions'), sort_order  => 99 );
+        if ( ( $m->request_args->{'id'} || '' ) =~ /^(\d+)$/ ) {
+            my $id  = $1;
+            my $obj = RT::Ticket->new( $session{'CurrentUser'} );
+            $obj->Load($id);
+
+            my $tabs = PageMenu();
+            $tabs->child( bookmark => title => $m->scomp( '/Ticket/Elements/Bookmark', id => $id ),
+                      escape_title => 0,
+                      link_item    => 0
+            );
+
+            $tabs->child( display => title => loc('Display') => path => "/Ticket/Display.html?id=" . $id );
+
+            $tabs->child( history => title => loc('History') => path => "/Ticket/History.html?id=" . $id );
+
+            my %can = (
+                ModifyTicket   => $obj->CurrentUserHasRight('ModifyTicket'),
+                Watch          => $obj->CurrentUserHasRight('Watch'),
+                WatchAsAdminCc => $obj->CurrentUserHasRight('WatchAsAdminCc'),
+                OwnTicket      => $obj->CurrentUserHasRight('OwnTicket'),
+                StealTicket    => $obj->CurrentUserHasRight('StealTicket'),
+                TakeTicket     => $obj->CurrentUserHasRight('TakeTicket'),
+                ReplyToTicket  => $obj->CurrentUserHasRight('ReplyToTicket'),
+                CommentOnTicket => $obj->CurrentUserHasRight('CommentOnTicket'),
+                ModifyCustomField => $obj->CurrentUserHasRight('ModifyCustomField'),
+                _ModifyOwner => (
+                                      $obj->CurrentUserHasRight('OwnTicket')
+                                   || $obj->CurrentUserHasRight('TakeTicket')
+                                   || $obj->CurrentUserHasRight('StealTicket')
+                                )
+                      );
+
+            # comment out until we can do it for an individual custom field
+            #if ( $can{ModifyTicket} || $can{ModifyCustomField} ) {
+            $tabs->child( basics => title => loc('Basics'), path => "/Ticket/Modify.html?id=" . $id, );
+
+            #}
+
+            if ( $can{ModifyTicket} || $can{_ModifyOwner} || $can{Watch} || $can{WatchAsAdminCc} ) {
+                $tabs->child( people => title => loc('People'), path => "/Ticket/ModifyPeople.html?id=" . $id,);
+            }
 
-        if ( $can{ModifyTicket} ) {
-            $tabs->child( dates => title => loc('Dates'), path => "/Ticket/ModifyDates.html?id=" . $id, );
-            $tabs->child( links => title => loc('Links'), path => "/Ticket/ModifyLinks.html?id=" . $id, );
-        }
+            if ( $can{ModifyTicket} ) {
+                $tabs->child( dates => title => loc('Dates'), path => "/Ticket/ModifyDates.html?id=" . $id, );
+                $tabs->child( links => title => loc('Links'), path => "/Ticket/ModifyLinks.html?id=" . $id, );
+            }
 
-        #if ( $can{ModifyTicket} || $can{ModifyCustomField} || $can{_ModifyOwner} ) {
-        $tabs->child( jumbo => title => loc('Jumbo'), path => "/Ticket/ModifyAll.html?id=" . $id, );
-        #}
+            #if ( $can{ModifyTicket} || $can{ModifyCustomField} || $can{_ModifyOwner} ) {
+            $tabs->child( jumbo => title => loc('Jumbo'), path => "/Ticket/ModifyAll.html?id=" . $id, );
+            #}
 
-        if ( RT->Config->Get('EnableReminders') ) {
-            $tabs->child( reminders => title => loc('Reminders'), path => "/Ticket/Reminders.html?id=" . $id, );
-        }
+            if ( RT->Config->Get('EnableReminders') ) {
+                $tabs->child( reminders => title => loc('Reminders'), path => "/Ticket/Reminders.html?id=" . $id, );
+            }
 
-        if ( $can{'ModifyTicket'} or $can{'ReplyToTicket'} ) {
-            $actions->child( reply => title => loc('Reply'), path => "/Ticket/Update.html?Action=Respond;id=" . $id,);
-        }
+            if ( $can{'ModifyTicket'} or $can{'ReplyToTicket'} ) {
+                $actions->child( reply => title => loc('Reply'), path => "/Ticket/Update.html?Action=Respond;id=" . $id,);
+            }
 
-        if ( $obj->CurrentUserHasRight('ForwardMessage') ) {
-            $actions->child( forward => title => loc('Forward'), path => "/Ticket/Forward.html?id=" . $id, );
-        }
+            if ( $obj->CurrentUserHasRight('ForwardMessage') ) {
+                $actions->child( forward => title => loc('Forward'), path => "/Ticket/Forward.html?id=" . $id, );
+            }
 
-        if ( $can{'ModifyTicket'} ) {
-            my $current   = $obj->Status;
-            my $lifecycle = $obj->QueueObj->lifecycle;
-            my $i         = 1;
-            foreach my $next ( $lifecycle->transitions($current) ) {
-                my $action = $lifecycle->transition_action( $current => $next );
-                next if $action eq 'hide';
-                my $check = $lifecycle->check_right( $current => $next );
-                $can{$check} = $obj->CurrentUserHasRight($check) unless exists $can{$check};
-                next unless $can{$check};
-
-                my $url = '/Ticket/';
-                if ($action) {
-
-                    $url .= "Update.html?" . $query_string->(Action => $action,
-                                           DefaultStatus => $next,
-                                           id            => $id);
-                } else {
-                    $url .= "Display.html?" . $query_string->( Status => $next, id => $id );
+            if ( $can{'ModifyTicket'} ) {
+                my $current   = $obj->Status;
+                my $lifecycle = $obj->QueueObj->lifecycle;
+                my $i         = 1;
+                foreach my $next ( $lifecycle->transitions($current) ) {
+                    my $action = $lifecycle->transition_action( $current => $next );
+                    next if $action eq 'hide';
+                    my $check = $lifecycle->check_right( $current => $next );
+                    $can{$check} = $obj->CurrentUserHasRight($check) unless exists $can{$check};
+                    next unless $can{$check};
+
+                    my $url = '/Ticket/';
+                    if ($action) {
+
+                        $url .= "Update.html?" . $query_string->(Action => $action,
+                                               DefaultStatus => $next,
+                                               id            => $id);
+                    } else {
+                        $url .= "Display.html?" . $query_string->( Status => $next, id => $id );
+                    }
+                    $actions->child( loc($lifecycle->transition_label( $current => $next )) => path => $url);
                 }
-                $actions->child( loc($lifecycle->transition_label( $current => $next )) => path => $url);
-            }
 
-        }
-        if ( $can{OwnTicket} ) {
-            if ( $obj->OwnerObj->Id == RT->Nobody->id
-                 && ( $can{'ModifyTicket'} or $can{'TakeTicket'} ) ) {
-                $actions->child( take => path => "/Ticket/Display.html?Action=Take;id=" . $id, title => loc('Take'));
             }
+            if ( $can{OwnTicket} ) {
+                if ( $obj->OwnerObj->Id == RT->Nobody->id
+                     && ( $can{'ModifyTicket'} or $can{'TakeTicket'} ) ) {
+                    $actions->child( take => path => "/Ticket/Display.html?Action=Take;id=" . $id, title => loc('Take'));
+                }
 
-            elsif (    $obj->OwnerObj->id != RT->Nobody->id
-                    && $obj->OwnerObj->id != $session{CurrentUser}->id
-                    && ( $can{'ModifyTicket'} or $can{'StealTicket'} ) ) {
-                $actions->child( steal => title => loc('Steal'), path => "/Ticket/Display.html?Action=Steal;id=" . $id,);
+                elsif (    $obj->OwnerObj->id != RT->Nobody->id
+                        && $obj->OwnerObj->id != $session{CurrentUser}->id
+                        && ( $can{'ModifyTicket'} or $can{'StealTicket'} ) ) {
+                    $actions->child( steal => title => loc('Steal'), path => "/Ticket/Display.html?Action=Steal;id=" . $id,);
+                }
             }
-        }
 
-        if ( $can{'ModifyTicket'} || $can{'CommentOnTicket'} ) {
-            $actions->child( comment => title => loc('Comment'), path => "/Ticket/Update.html?Action=Comment;id=" . $id);
-        }
+            if ( $can{'ModifyTicket'} || $can{'CommentOnTicket'} ) {
+                $actions->child( comment => title => loc('Comment'), path => "/Ticket/Update.html?Action=Comment;id=" . $id);
+            }
 
-        if ( defined $session{"tickets"} ) {
-            # we have to update session data if we get new ItemMap
-            my $updatesession = 1 unless ( $session{"tickets"}->{'item_map'} );
+            if ( defined $session{"tickets"} ) {
+                # we have to update session data if we get new ItemMap
+                my $updatesession = 1 unless ( $session{"tickets"}->{'item_map'} );
 
-            my $item_map = $session{"tickets"}->ItemMap;
+                my $item_map = $session{"tickets"}->ItemMap;
 
-            if ($updatesession) {
-                $session{"tickets"}->PrepForSerialization();
-            }
+                if ($updatesession) {
+                    $session{"tickets"}->PrepForSerialization();
+                }
 
-            # Don't display prev links if we're on the first ticket
-            if ( $item_map->{$id}->{prev} ) {
-                $search->child( 'first', title => '<< ' . loc('First') => class => "nav",
-                          path => "/Ticket/Display.html?id=" . $item_map->{first});
-                $search->child( prev => title => '< ' . loc('Prev') => class => "nav",
-                    path => "/Ticket/Display.html?id=" . $item_map->{$id}->{prev});
-
-                # Don't display next links if we're on the last ticket
-                if ( $item_map->{$id}->{next} ) {
-                    $search->child( next       => title => loc('next') . ' >' => class => "nav",
-                                    path => "/Ticket/Display.html?id=" . $item_map->{$id}->{next});
-                    $search->child( last        => title => loc('Last') . ' >>' => class => "nav",
-                                    path => "/Ticket/Display.html?id=" . $item_map->{last});
+                # Don't display prev links if we're on the first ticket
+                if ( $item_map->{$id}->{prev} ) {
+                    $search->child( 'first', title => '<< ' . loc('First') => class => "nav",
+                              path => "/Ticket/Display.html?id=" . $item_map->{first});
+                    $search->child( prev => title => '< ' . loc('Prev') => class => "nav",
+                        path => "/Ticket/Display.html?id=" . $item_map->{$id}->{prev});
+
+                    # Don't display next links if we're on the last ticket
+                    if ( $item_map->{$id}->{next} ) {
+                        $search->child( next       => title => loc('next') . ' >' => class => "nav",
+                                        path => "/Ticket/Display.html?id=" . $item_map->{$id}->{next});
+                        $search->child( last        => title => loc('Last') . ' >>' => class => "nav",
+                                        path => "/Ticket/Display.html?id=" . $item_map->{last});
+                    }
                 }
             }
         }
-    }
-    my $args      = '';
-    my $has_query = '';
-    my $current_search = $session{"CurrentSearchHash"} || {};
-    my $search_id = $m->request_args->{'SavedSearchId'} || $search->{'SearchId'} || '';
-
-    $has_query = 1 if ( $m->request_args->{'Query'} or $current_search->{'Query'} );
-
-    my %query_args = (
-        SavedSearchId => ( $search_id eq 'new' ) ? undef : $search_id,
-        SavedChartSearchId => $m->request_args->{'SavedChartSearchId'} || $current_search->{SavedChartSearchId},
-        Query => $m->request_args->{'Query'} || $current_search->{'Query'},
-        Format => $m->request_args->{'Format'} || $current_search->{'Format'},
-        OrderBy => $m->request_args->{'OrderBy'} || $current_search->{'OrderBy'},
-        Order => $m->request_args->{'Order'} || $current_search->{'Order'},
-        Page => $m->request_args->{'Page'} || $current_search->{'Page'},
-        RowsPerPage => ( defined $m->request_args->{'RowsPerPage'}
-                         ? $m->request_args->{'RowsPerPage'}
-                         : $current_search->{'RowsPerPage'})
-                     );
-    for my $field (qw(Order OrderBy)) {
-        if ( ref( $query_args{$field} ) eq 'ARRAY' ) {
-            $query_args{$field} = join( "|", @{ $query_args{$field} } );
+        my $args      = '';
+        my $has_query = '';
+        my $current_search = $session{"CurrentSearchHash"} || {};
+        my $search_id = $m->request_args->{'SavedSearchId'} || $search->{'SearchId'} || '';
+
+        $has_query = 1 if ( $m->request_args->{'Query'} or $current_search->{'Query'} );
+
+        my %query_args = (
+            SavedSearchId => ( $search_id eq 'new' ) ? undef : $search_id,
+            SavedChartSearchId => $m->request_args->{'SavedChartSearchId'} || $current_search->{SavedChartSearchId},
+            Query => $m->request_args->{'Query'} || $current_search->{'Query'},
+            Format => $m->request_args->{'Format'} || $current_search->{'Format'},
+            OrderBy => $m->request_args->{'OrderBy'} || $current_search->{'OrderBy'},
+            Order => $m->request_args->{'Order'} || $current_search->{'Order'},
+            Page => $m->request_args->{'Page'} || $current_search->{'Page'},
+            RowsPerPage => ( defined $m->request_args->{'RowsPerPage'}
+                             ? $m->request_args->{'RowsPerPage'}
+                             : $current_search->{'RowsPerPage'})
+                         );
+        for my $field (qw(Order OrderBy)) {
+            if ( ref( $query_args{$field} ) eq 'ARRAY' ) {
+                $query_args{$field} = join( "|", @{ $query_args{$field} } );
+            }
         }
-    }
 
-    $args = "?" . $query_string->(%query_args);
-
-    my $current_search_menu = $search->child( current_search => title => loc('Current Search') );
-    $current_search_menu->child( edit_search => title => loc('Edit Search') =>
-                                 path => "/Search/Build.html" . ( ($has_query) ? $args : '' ) );
-    $current_search_menu->child( loc('Advanced') => path => "/Search/Edit.html$args" );
-    if ($has_query) {
-        if ($request_path =~ qr|^Search/Results.html|
-            &&                        #XXX TODO better abstraction
-            $session{'CurrentUser'}->HasRight( Right => 'SuperUser', Object => $RT::System )) {
-            my $shred_args = URI->new->query_param(
-                                  search          => 1,
-                                  plugin          => 'Tickets',
-                                  'Tickets:query' => $query_args{'Query'},
-                                  'Tickets:limit' => $query_args{'Rows'});
-            $current_search_menu->child( 'shredder' => title => loc('Shredder'),
-                            path => 'Admin/Tools/Shredder/?' . $shred_args);
+        $args = "?" . $query_string->(%query_args);
+
+        my $current_search_menu = $search->child( current_search => title => loc('Current Search') );
+        $current_search_menu->child( edit_search => title => loc('Edit Search') =>
+                                     path => "/Search/Build.html" . ( ($has_query) ? $args : '' ) );
+        $current_search_menu->child( loc('Advanced') => path => "/Search/Edit.html$args" );
+        if ($has_query) {
+            if ($request_path =~ qr|^Search/Results.html|
+                &&                        #XXX TODO better abstraction
+                $session{'CurrentUser'}->HasRight( Right => 'SuperUser', Object => $RT::System )) {
+                my $shred_args = URI->new->query_param(
+                                      search          => 1,
+                                      plugin          => 'Tickets',
+                                      'Tickets:query' => $query_args{'Query'},
+                                      'Tickets:limit' => $query_args{'Rows'});
+                $current_search_menu->child( 'shredder' => title => loc('Shredder'),
+                                path => 'Admin/Tools/Shredder/?' . $shred_args);
+            }
+
+            $current_search_menu->child( results => title => loc('Show Results') => path => "/Search/Results.html$args" );
+            $current_search_menu->child( bulk => title => loc('Bulk Update') => path => "/Search/Bulk.html$args" );
+            $current_search_menu->child( chart => title => loc('Graph'), path => "Search/Chart.html$args");
         }
+    }
 
-        $current_search_menu->child( results => title => loc('Show Results') => path => "/Search/Results.html$args" );
-        $current_search_menu->child( bulk => title => loc('Bulk Update') => path => "/Search/Bulk.html$args" );
-        $current_search_menu->child( chart => title => loc('Graph'), path => "Search/Chart.html$args");
+    if ( $request_path =~ /^\/(?:index.html|$)/ ) {
+        PageMenu()->child( edit => title => loc('Edit'), path => '/Prefs/MyRT.html' );
     }
-}
 
-if ( $request_path =~ /^\/(?:index.html|$)/ ) {
-    PageMenu()->child( edit => title => loc('Edit'), path => '/Prefs/MyRT.html' );
+    PageWidgets()->child( simple_search => title => $m->scomp('SimpleSearch'), escape_title => 0 );
+    PageWidgets()->child( create_ticket => title => $m->scomp('CreateTicket'), escape_title => 0 );
 }
 
-PageWidgets()->child( simple_search => title => $m->scomp('SimpleSearch'), escape_title => 0 );
-PageWidgets()->child( create_ticket => title => $m->scomp('CreateTicket'), escape_title => 0 );
-
 if ( $request_path =~ qr'/SelfService' ) {
 
     my $queues = RT::Queues->new( $session{'CurrentUser'} );

commit 2d96d138facc69e98134b0e9c918d66010a94c65
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Tue Nov 2 23:53:57 2010 -0400

    Menuing for SelfService

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 360c5bf..5fc819d 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -197,11 +197,14 @@ if ( $request_path !~ qr{^/SelfService/} ) {
         $admin_tools->child( 'sql-queries' => title => loc('SQL Queries'), path => '/Admin/Tools/Queries.html', );
         $admin_tools->child( shredder => title => loc('Shredder'), path => '/Admin/Tools/Shredder', );
     }
+
     my $about_me = Menu->child( 'preferences' => title =>
                         loc( 'Logged in as <span class="current-user">[_1]</span>', $session{'CurrentUser'}->Name),
                     escape_title => 0,
                     sort_order   => 99
     );
+
+
     if ( $session{'CurrentUser'}->UserObj
          && $session{'CurrentUser'}->HasRight( Right  => 'ModifySelf', Object => $RT::System )) {
         my $settings = $about_me->child( settings => title => loc('Settings'), path => '/Prefs/Other.html', );
@@ -527,22 +530,34 @@ if ( $request_path =~ qr'/SelfService' ) {
         last if ( $queue_count > 1 );
     }
 
-    my $TOP = Menu();
 
-    $TOP->child( open => title => loc('Open tickets'), path => '/SelfService/', );
-    $TOP->child( closed => title => loc('Closed tickets'), path => '/SelfService/Closed.html', );
+    my $tickets = Menu->child(tickets => title =>loc('Tickets'));
+    $tickets->child( open => title => loc('Open tickets'), path => '/SelfService/', );
+    $tickets->child( closed => title => loc('Closed tickets'), path => '/SelfService/Closed.html', );
     if ( $queue_count > 1 ) {
-        $TOP->child( new => title => loc('New ticket'), path => '/SelfService/CreateTicketInQueue.html' );
+        $tickets->child( new => title => loc('New ticket'), path => '/SelfService/CreateTicketInQueue.html' );
     } else {
-        $TOP->child( new => title => loc('New ticket'), path => '/SelfService/Create.html?queue=' . $queue_id );
+        $tickets->child( new => title => loc('New ticket'), path => '/SelfService/Create.html?queue=' . $queue_id );
     }
 
+
+    my $about_me = Menu->child( 'preferences' => title =>
+                        loc( 'Logged in as <span class="current-user">[_1]</span>', $session{'CurrentUser'}->Name),
+                    escape_title => 0,
+                    sort_order   => 99
+    );
+
     if ( $session{'CurrentUser'}->HasRight( Right => 'ModifySelf', Object => $RT::System ) ) {
-        $TOP->child( prefs => title => loc('Preferences'), path  => '/SelfService/Prefs.html' );
+        $about_me->child( prefs => title => loc('Preferences'), path  => '/SelfService/Prefs.html' );
+    }
+
+    if ( $session{'CurrentUser'}->Name
+         && (   !RT->Config->Get('WebExternalAuth')
+              || RT->Config->Get('WebFallbackToInternalAuth') )) {
+        $about_me->child( logout => title => loc('Logout'), path   => '/NoAuth/Logout.html' );
     }
 
-    # XXX TODO RENDER GOTO TICKET WIDGET
-    Menu->child( goto         => title => $m->scomp('GotoTicket'), escape_title => 0 );
+    PageWidgets->child( goto         => title => $m->scomp('/SelfService/Elements/GotoTicket'), escape_title => 0 );
 }
 
 </%INIT>
diff --git a/share/html/NoAuth/css/web2/layout.css b/share/html/NoAuth/css/web2/layout.css
index af99a8b..b7e52ac 100644
--- a/share/html/NoAuth/css/web2/layout.css
+++ b/share/html/NoAuth/css/web2/layout.css
@@ -108,7 +108,7 @@ div#body {
 
 }
 
-#topactions #CreateTicketInQueue {
+#topactions #GotoTicket, #topactions #CreateTicketInQueue {
  text-align: right; 
 
 }
diff --git a/share/html/SelfService/Elements/GotoTicket b/share/html/SelfService/Elements/GotoTicket
index 83dfc86..84f631a 100755
--- a/share/html/SelfService/Elements/GotoTicket
+++ b/share/html/SelfService/Elements/GotoTicket
@@ -45,6 +45,6 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-<form action="<% RT->Config->Get('WebPath') %>/SelfService/Display.html" method="get" id="GotoTicket">
+<form action="<% RT->Config->Get('WebPath') %>/SelfService/Display.html" method="get" id="GotoTicket" name="GotoTicket">
 <input type="submit" class="button" value="<&|/l&>Goto ticket</&>" />&nbsp;<input size="4" name="id" />
 </form>

commit 801e7d1f3fc292a724521371c93a44a587146dda
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 12:51:34 2010 -0400

    Move display of Title to Header

diff --git a/share/html/Elements/Header b/share/html/Elements/Header
index a6f6e39..71e936c 100755
--- a/share/html/Elements/Header
+++ b/share/html/Elements/Header
@@ -89,7 +89,7 @@
   <& /Elements/PersonalQuickbar, %ARGS &>
 </div>
 % }
-
+<div id="header"><h1><% $Title %></h1></div>
 <%INIT>
 $r->headers_out->{'Pragma'} = 'no-cache';
 $r->headers_out->{'Cache-control'} = 'no-cache';
diff --git a/share/html/Elements/PageLayout b/share/html/Elements/PageLayout
index c1851aa..b85ecb5 100755
--- a/share/html/Elements/PageLayout
+++ b/share/html/Elements/PageLayout
@@ -47,17 +47,14 @@
 %# END BPS TAGGED BLOCK }}}
 % if ( $show_menu ) {
 <div id="main-navigation"><& /Elements/Menu, menu => Menu(), id => 'app-nav' &></div>
-
 <div id="page-navigation"><& /Elements/Menu, menu => PageMenu(), id => 'page-menu', 'parent_id' => 'page' &></div>
 % }
-% # toplevel 0 disables the superfish js stuff
 <div id="topactions"><& /Elements/WidgetBar, menu => PageWidgets() &></div>
 <script type="text/javascript">
 jQuery(document).ready(function(){ jQuery("#app-nav").superfish(); });
 jQuery(document).ready(function(){ jQuery("#page-menu").superfish(); });
 jQuery(document).ready(function(){ jQuery("#actions-menu").superfish(); });
 </script>
-<div id="header"><h1><% $title %></h1></div>
 <div id="body">
 % $m->callback( %ARGS, CallbackName => 'BeforeBody' );
 % $m->flush_buffer(); # we've got the page laid out, let's flush the buffer;
diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 5fc819d..d9115c0 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -45,17 +45,7 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-<& /Elements/PageLayout,
-    current_toptab => $current_toptab,
-    current_tab => $current_tab,
-    toptabs => $toptabs,
-    topactions => $topactions,
-    tabs => $tabs,
-    actions => $actions,
-    subactions => $subactions,
-    title => $Title,
-    show_menu => $show_menu,
-&>
+<& /Elements/PageLayout, show_menu => $show_menu &>
 <a name="skipnav" id="skipnav" accesskey="8"></a>
 <%INIT>
 
@@ -562,13 +552,5 @@ if ( $request_path =~ qr'/SelfService' ) {
 
 </%INIT>
 <%ARGS>
-$current_toptab => undef
-$current_tab => undef
-$toptabs => undef
-$topactions => undef
-$tabs => undef
-$actions => undef
-$subactions => undef
-$Title => undef
 $show_menu => 1
 </%ARGS>

commit a0254f47325b99b4fe2946eacf8b1f99372af1f6
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 14:38:28 2010 -0400

    move superfishification into the css theme

diff --git a/share/html/Elements/PageLayout b/share/html/Elements/PageLayout
index b85ecb5..d64f467 100755
--- a/share/html/Elements/PageLayout
+++ b/share/html/Elements/PageLayout
@@ -50,11 +50,6 @@
 <div id="page-navigation"><& /Elements/Menu, menu => PageMenu(), id => 'page-menu', 'parent_id' => 'page' &></div>
 % }
 <div id="topactions"><& /Elements/WidgetBar, menu => PageWidgets() &></div>
-<script type="text/javascript">
-jQuery(document).ready(function(){ jQuery("#app-nav").superfish(); });
-jQuery(document).ready(function(){ jQuery("#page-menu").superfish(); });
-jQuery(document).ready(function(){ jQuery("#actions-menu").superfish(); });
-</script>
 <div id="body">
 % $m->callback( %ARGS, CallbackName => 'BeforeBody' );
 % $m->flush_buffer(); # we've got the page laid out, let's flush the buffer;
diff --git a/share/html/NoAuth/css/web2/InHeader b/share/html/NoAuth/css/web2/InHeader
index a305c62..9127892 100644
--- a/share/html/NoAuth/css/web2/InHeader
+++ b/share/html/NoAuth/css/web2/InHeader
@@ -52,3 +52,8 @@
 <!--[if lt IE 7]>
 <link rel="stylesheet" href="<%RT->Config->Get('WebPath')%>/NoAuth/css/web2/msie6.css" type="text/css" media="all" />
 <![endif]-->
+<script type="text/javascript">
+jQuery(document).ready(function(){ jQuery("#app-nav").superfish(); });
+jQuery(document).ready(function(){ jQuery("#page-menu").superfish(); });
+jQuery(document).ready(function(){ jQuery("#actions-menu").superfish(); });
+</script>

commit 1df129d794eb9093750d7c9a818df7f6ff4304f8
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 12:58:08 2010 -0400

    Fix case errors that prevented Open and Home from being correctly localized

diff --git a/etc/RT_Config.pm.in b/etc/RT_Config.pm.in
index 647db67..814a70a 100755
--- a/etc/RT_Config.pm.in
+++ b/etc/RT_Config.pm.in
@@ -1985,7 +1985,7 @@ Use the following format to define labels and actions of transitions:
     default => {
         ...
         actions => {
-            'new -> open'     => ['Open It', 'Respond'],
+            'new -> open'     => ['Open it', 'Respond'],
             'new -> resolved' => ['Resolve', 'Comment'],
             'new -> rejected' => ['Reject',  'Respond'],
             'new -> deleted'  => ['Delete',  ''],
@@ -1995,7 +1995,7 @@ Use the following format to define labels and actions of transitions:
             'open -> rejected' => ['Reject',  'Respond'],
             'open -> deleted'  => ['Delete',  'hide'],
 
-            'stalled -> open'  => ['Open It',  ''],
+            'stalled -> open'  => ['Open it',  ''],
             'resolved -> open' => ['Re-open',  'Comment'],
             'rejected -> open' => ['Re-open',  'Comment'],
             'deleted -> open'  => ['Undelete', ''],
@@ -2046,7 +2046,7 @@ Set(%Lifecycles,
         actions => {
 
             # 'from -> to'    => [action text, Respond/Comment/hide/''],
-            'new -> open'     => [ 'Open It', 'Respond' ],
+            'new -> open'     => [ 'Open it', 'Respond' ],
             'new -> resolved' => [ 'Resolve', 'Comment' ],
             'new -> rejected' => [ 'Reject',  'Respond' ],
             'new -> deleted'  => [ 'Delete',  '' ],
@@ -2056,7 +2056,7 @@ Set(%Lifecycles,
             'open -> rejected' => [ 'Reject',  'Respond' ],
             'open -> deleted'  => [ 'Delete',  'hide' ],
 
-            'stalled -> open'  => [ 'Open It',  '' ],
+            'stalled -> open'  => [ 'Open it',  '' ],
             'resolved -> open' => [ 'Re-open',  'Comment' ],
             'rejected -> open' => [ 'Re-open',  'Comment' ],
             'deleted -> open'  => [ 'Undelete', '' ],
diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index d9115c0..b109fab 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -59,7 +59,7 @@ my $query_string = sub {
 };
 
 if ( $request_path !~ qr{^/SelfService/} ) {
-    my $home = Menu->child( home => title => loc('Home Page'), path => '/' );
+    my $home = Menu->child( home => title => loc('Homepage'), path => '/' );
     my @dashboards = $m->comp("/Dashboards/Elements/ListOfDashboards");
     my $limit      = 7;
 

commit 48ee6569baf524df34487ff58a095cce40bcad9c
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 13:03:11 2010 -0400

    tweaks to page nav

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index b109fab..c2082f1 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -324,7 +324,8 @@ if ( $request_path !~ qr{^/SelfService/} ) {
             my $tabs = PageMenu();
             $tabs->child( bookmark => title => $m->scomp( '/Ticket/Elements/Bookmark', id => $id ),
                       escape_title => 0,
-                      link_item    => 0
+                      link_item    => 0,
+                sort_order => 99
             );
 
             $tabs->child( display => title => loc('Display') => path => "/Ticket/Display.html?id=" . $id );
diff --git a/share/html/NoAuth/css/web2/nav.css b/share/html/NoAuth/css/web2/nav.css
index ed1103a..b927ae7 100644
--- a/share/html/NoAuth/css/web2/nav.css
+++ b/share/html/NoAuth/css/web2/nav.css
@@ -55,10 +55,11 @@
 
 #page-navigation {
     position: absolute;
-    top: 5.4em;
+    top: 6.6em;
     right: 0em;
     left: auto;
     z-index: 9995;
+    font-size: 0.8em;
 }
 .sf-menu {
     width: 100%;

commit 198da6fc83cf9eb5d6857c934da8fee9fe917d27
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 13:17:58 2010 -0400

    Overhaul search navigation

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index c2082f1..477685b 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -84,15 +84,6 @@ if ( $request_path !~ qr{^/SelfService/} ) {
     my $tickets = Menu->child( search => title => loc('Tickets'), path => '/Search/Build.html' );
     $tickets->child( simple => title => loc('Simple Search') => path => "/Search/Simple.html" );
     $tickets->child( new => title => loc('New Search') => path => "/Search/Build.html?NewQuery=1" );
-    my $new = $tickets->child( create => title => loc('New ticket'), path => '/Ticket/Create.html' );
-
-    my $q = RT::Queues->new( $session{'CurrentUser'} );
-    $q->FindAllRows;
-
-    while ( my $queue = $q->Next ) {
-        next unless $queue->CurrentUserHasRight('CreateTicket');
-        $new->child( $queue->id => title => $queue->Name, path => '/Ticket/Create.html?Queue=' . $queue->id );
-    }
 
     my $tools = Menu->child(  tools => title => loc('Tools'), path => '/Tools/index.html' );
     my $dashes = $tools->child( dashboards => title => loc('Dashboards'), path => '/Dashboards/index.html' );
@@ -313,14 +304,13 @@ if ( $request_path !~ qr{^/SelfService/} ) {
 
     }
 
-    if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
-        my $search = Menu()->child('search');
-        my $actions = PageMenu()->child( transitions => title => loc('Actions'), sort_order  => 99 );
+    if ( $request_path =~ qr'Ticket/' ) {
         if ( ( $m->request_args->{'id'} || '' ) =~ /^(\d+)$/ ) {
             my $id  = $1;
             my $obj = RT::Ticket->new( $session{'CurrentUser'} );
             $obj->Load($id);
 
+            my $actions = PageMenu()->child( transitions => title => loc('Actions'), sort_order  => 99 );
             my $tabs = PageMenu();
             $tabs->child( bookmark => title => $m->scomp( '/Ticket/Elements/Bookmark', id => $id ),
                       escape_title => 0,
@@ -431,23 +421,26 @@ if ( $request_path !~ qr{^/SelfService/} ) {
                     $session{"tickets"}->PrepForSerialization();
                 }
 
+                my $search = Menu()->child('search');
                 # Don't display prev links if we're on the first ticket
                 if ( $item_map->{$id}->{prev} ) {
                     $search->child( 'first', title => '<< ' . loc('First') => class => "nav",
                               path => "/Ticket/Display.html?id=" . $item_map->{first});
                     $search->child( prev => title => '< ' . loc('Prev') => class => "nav",
                         path => "/Ticket/Display.html?id=" . $item_map->{$id}->{prev});
-
+                }
                     # Don't display next links if we're on the last ticket
                     if ( $item_map->{$id}->{next} ) {
-                        $search->child( next       => title => loc('next') . ' >' => class => "nav",
+                        $search->child( next       => title => loc('Next') . ' >' => class => "nav",
                                         path => "/Ticket/Display.html?id=" . $item_map->{$id}->{next});
                         $search->child( last        => title => loc('Last') . ' >>' => class => "nav",
                                         path => "/Ticket/Display.html?id=" . $item_map->{last});
-                    }
                 }
             }
         }
+    }
+    if ( $request_path =~ qr'(?:Ticket|Search)/' ) {
+        my $search = Menu()->child('search');
         my $args      = '';
         my $has_query = '';
         my $current_search = $session{"CurrentSearchHash"} || {};
@@ -460,8 +453,8 @@ if ( $request_path !~ qr{^/SelfService/} ) {
             SavedChartSearchId => $m->request_args->{'SavedChartSearchId'} || $current_search->{SavedChartSearchId},
             Query => $m->request_args->{'Query'} || $current_search->{'Query'},
             Format => $m->request_args->{'Format'} || $current_search->{'Format'},
-            OrderBy => $m->request_args->{'OrderBy'} || $current_search->{'OrderBy'},
-            Order => $m->request_args->{'Order'} || $current_search->{'Order'},
+            OrderBy => $m->request_args->{'OrderBy'} || $current_search->{'OrderBy'} ||'',
+            Order => $m->request_args->{'Order'} || $current_search->{'Order'} ||'',
             Page => $m->request_args->{'Page'} || $current_search->{'Page'},
             RowsPerPage => ( defined $m->request_args->{'RowsPerPage'}
                              ? $m->request_args->{'RowsPerPage'}
@@ -475,7 +468,13 @@ if ( $request_path !~ qr{^/SelfService/} ) {
 
         $args = "?" . $query_string->(%query_args);
 
-        my $current_search_menu = $search->child( current_search => title => loc('Current Search') );
+
+        my $current_search_menu;
+        if ( $request_path =~ qr'^/Ticket' ) {
+            $current_search_menu = $search->child( current_search => title => loc('Current Search'), link_item => 1 );
+        } else {
+            $current_search_menu = PageMenu();
+        }
         $current_search_menu->child( edit_search => title => loc('Edit Search') =>
                                      path => "/Search/Build.html" . ( ($has_query) ? $args : '' ) );
         $current_search_menu->child( loc('Advanced') => path => "/Search/Edit.html$args" );
@@ -494,8 +493,31 @@ if ( $request_path !~ qr{^/SelfService/} ) {
 
             $current_search_menu->child( results => title => loc('Show Results') => path => "/Search/Results.html$args" );
             $current_search_menu->child( bulk => title => loc('Bulk Update') => path => "/Search/Bulk.html$args" );
-            $current_search_menu->child( chart => title => loc('Graph'), path => "Search/Chart.html$args");
-        }
+            $current_search_menu->child( chart => title => loc('Graph'),
+                                         path => "/Search/Chart.html$args" );
+            $current_search_menu->child(
+                                   spreadsheet => title => loc('Spreadsheet'),
+                                   path => "/Search/Results.tsv$args" );
+
+            my $RSSQueryString = "?"
+                . $query_string->( Query   => $query_args{Query},
+                                   Order   => $query_args{Order},
+                                   OrderBy => $query_args{OrderBy}
+                                 );
+            my $RSSPath = join '/', map $m->interp->apply_escapes( $_, 'u' ),
+                $session{'CurrentUser'}->UserObj->Name,
+                $session{'CurrentUser'}
+                ->UserObj->GenerateAuthString(   $query_args{Query}
+                                               . $query_args{Order}
+                                               . $query_args{OrderBy} );
+
+            $current_search_menu->child( rss => title => loc('RSS') => path => "/NoAuth/rss/$RSSPath/$RSSQueryString");
+            my $ical_path = join '/', map $m->interp->apply_escapes($_, 'u'),
+                $session{'CurrentUser'}->UserObj->Name,
+                $session{'CurrentUser'}->UserObj->GenerateAuthString( $query_args{Query} ),
+                $query_args{Query};
+            $current_search_menu->child( ical => title => loc('iCal') => path => '/NoAuth/iCal/'.$ical_path);
+}
     }
 
     if ( $request_path =~ /^\/(?:index.html|$)/ ) {
diff --git a/share/html/Search/Elements/ResultViews b/share/html/Search/Elements/ResultViews
deleted file mode 100644
index 98f987e..0000000
--- a/share/html/Search/Elements/ResultViews
+++ /dev/null
@@ -1,80 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-<%args>
-$QueryString => undef
-$Query => undef
-$Format => undef
-$Rows => undef
-$OrderBy => undef
-$Order => undef
-$RSSFeedURL => undef
-$ShortQueryString => undef
-
-</%args>
-<ul class="search-result-views">
-<li><a href="<%RT->Config->Get('WebPath')%>/Search/Results.tsv<%$QueryString%>"><&|/l&>Spreadsheet</&></a></li>
-<li><a href="<%$RSSFeedURL%>"><&|/l&>RSS</&></a></li>
-<li><a href="<%RT->Config->Get('WebURL')%>/NoAuth/iCal/<% $ical_path %>"><% loc('iCal') %></a></li>
-<li><a href="<%RT->Config->Get('WebPath')%>/Tools/Offline.html<%$ShortQueryString%>"><&|/l&>Editable text</&></a></li>
-% # Now let callbacks add their extra tools
-% $m->callback( %ARGS, CallbackName => 'AfterTools' );
-</ul>
-<form method="get" action="<%RT->Config->Get('WebPath')%>/Search/Chart.html">
-% my %hiddens = (Query => $Query, Format => $Format, Rows => $Rows, OrderBy => $OrderBy, Order => $Order);
-% foreach my $key (keys(%hiddens)) {
-<input type="hidden" class="hidden" name="<%$key%>" value="<%defined($hiddens{$key})?$hiddens{$key}:''%>" />
-% }
-<&|/l, $m->scomp('SelectChartType', Name => 'ChartStyle'), $m->scomp('SelectGroupBy', Name => 'PrimaryGroupBy', Query => $Query) 
-&>[_1] chart by [_2]</&><input type="submit" class="button" value="<%loc('Go')%>" />
-</form>
-<%init>
-my $ical_path = join '/', map $m->interp->apply_escapes($_, 'u'),
-    $session{'CurrentUser'}->UserObj->Name,
-    $session{'CurrentUser'}->UserObj->GenerateAuthString( $Query ),
-    $Query;
-</%init>
diff --git a/share/html/Search/Results.html b/share/html/Search/Results.html
index 41325a7..5baf58a 100755
--- a/share/html/Search/Results.html
+++ b/share/html/Search/Results.html
@@ -47,7 +47,6 @@
 %# END BPS TAGGED BLOCK }}}
 <& /Elements/Header, Title => $title,
     Refresh => $session{'tickets_refresh_interval'} || RT->Config->Get('SearchResultsRefreshInterval', $session{'CurrentUser'} ),
-    RSSAutoDiscovery => $RSSFeedURL,
     LinkRel => \%link_rel &>
 <& /Elements/Tabs &>
 <& /Elements/CollectionList, 
@@ -72,21 +71,6 @@
 <input type="submit" class="button" value="<&|/l&>Change</&>" />
 </form>
 </div>
-<div align="right" class="search-result-actions">
-<& Elements/ResultViews,
-    Collection => $session{'tickets'},
-    QueryString => $QueryString,
-    Query => $Query,
-    Format => $Format,
-    Rows => $Rows,
-    OrderBy => $OrderBy,
-    Order => $Order,
-    RSSFeedURL => $RSSFeedURL,
-    ShortQueryString => $ShortQueryString,
-&>
-
-% $m->callback( QueryString => $QueryString, CallbackName => 'SearchActions' );
-</div>
 <%INIT>
 # Read from user preferences
 my $prefs = $session{'CurrentUser'}->UserObj->Preferences("SearchDisplay") || {};
@@ -154,11 +138,6 @@ my $QueryString = "?".$m->comp('/Elements/QueryString',
                                Order => $Order,
                                Page => $Page);
 my $ShortQueryString = "?".$m->comp('/Elements/QueryString', Query => $Query);
-my $RSSQueryString = "?".$m->comp('/Elements/QueryString', Query => $Query, Order => $Order, OrderBy => $OrderBy);
-my $RSSPath  = join '/', map $m->interp->apply_escapes($_, 'u'),
-    $session{'CurrentUser'}->UserObj->Name,
-    $session{'CurrentUser'}->UserObj->GenerateAuthString( $Query.$Order.$OrderBy );
-my $RSSFeedURL = RT->Config->Get('WebPath')."/NoAuth/rss/$RSSPath/$RSSQueryString";
 
 if ($ARGS{'TicketsRefreshInterval'}) {
 	$session{'tickets_refresh_interval'} = $ARGS{'TicketsRefreshInterval'};
diff --git a/t/web/search_rss.t b/t/web/search_rss.t
index d273e36..67cae1f 100644
--- a/t/web/search_rss.t
+++ b/t/web/search_rss.t
@@ -22,7 +22,7 @@ $agent->form_name('BuildQuery');
 $agent->field('idOp', '>');
 $agent->field('ValueOfid', '0');
 $agent->submit('DoSearch');
-$agent->follow_link_ok({id => 'search-current_search-results'});
+$agent->follow_link_ok({id => 'page-results'});
 
 for ( 1 .. 5 ) {
     $agent->content_contains('Ticket ' . $_);

commit b10bcd163848d65d7f4e2baa8dff7020bca0d239
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 20:51:40 2010 -0400

    move the star to after the actions menu

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 477685b..453076a 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -310,7 +310,7 @@ if ( $request_path !~ qr{^/SelfService/} ) {
             my $obj = RT::Ticket->new( $session{'CurrentUser'} );
             $obj->Load($id);
 
-            my $actions = PageMenu()->child( transitions => title => loc('Actions'), sort_order  => 99 );
+            my $actions = PageMenu()->child( transitions => title => loc('Actions'), sort_order  => 95 );
             my $tabs = PageMenu();
             $tabs->child( bookmark => title => $m->scomp( '/Ticket/Elements/Bookmark', id => $id ),
                       escape_title => 0,

commit 8030b6b31bf3031d087dddeb254f1de582dd1595
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 14:11:37 2010 -0400

    flop nav, as a cheap hack around superfish running over the edge of the page

diff --git a/share/html/NoAuth/css/web2/layout.css b/share/html/NoAuth/css/web2/layout.css
index b7e52ac..0b25c43 100644
--- a/share/html/NoAuth/css/web2/layout.css
+++ b/share/html/NoAuth/css/web2/layout.css
@@ -171,7 +171,7 @@ div#footer #bpscredits {
 
 div#logo {
     position: absolute;
-    left: 2px;
+    right: 2px;
     top: 0;
     height: 2.3em;
 }
@@ -180,14 +180,16 @@ div#logo a img {
     border: 0;
     height: 100% !important;
     width: auto !important;
+    float: right;
 }
 
 div#logo .rtname {
     position: relative;
     font-weight: bold;
     text-align: center;
-    top: -0.8em;
-    left: 0.5em;
+    top: 0.7em;
+    padding-right: 1em;
+    float:left;
 }
 
 
@@ -209,8 +211,8 @@ div#quickbar {
 
 }
 div#quick-personal {
-    float: right;
-    margin-right: 1em;
+    float: left;
+    margin-left: 1em;
 }
 
 
diff --git a/share/html/NoAuth/css/web2/nav.css b/share/html/NoAuth/css/web2/nav.css
index b927ae7..8ae2393 100644
--- a/share/html/NoAuth/css/web2/nav.css
+++ b/share/html/NoAuth/css/web2/nav.css
@@ -48,7 +48,7 @@
 #main-navigation {
     position: absolute;
     top: 0;
-    right: 0;
+    left: 0;
     left: auto;
     z-index: 9999;
 }

commit 0264bde6324954c8b102e3e20114eca089cb4714
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 14:17:54 2010 -0400

    restore custom page nav on ticket create

diff --git a/share/html/Ticket/Create.html b/share/html/Ticket/Create.html
index c136839..128fcb6 100755
--- a/share/html/Ticket/Create.html
+++ b/share/html/Ticket/Create.html
@@ -446,15 +446,8 @@ if ((!exists $ARGS{'AddMoreAttach'}) and (defined($ARGS{'id'}) and $ARGS{'id'} e
         }
     }
 }
-
-my $actions = {
-    A => {
-        html => q[<a href="#basics" onclick="return switchVisibility('Ticket-Create-basics','Ticket-Create-details');">] . loc('Basics') . q[</a>],
-    },
-    B => {
-        html => q[<a href="#details" onclick="return switchVisibility('Ticket-Create-details','Ticket-Create-basics');">] . loc('Details') . q[</a>],
-    },
-};
+PageMenu->child( basics => title =>  q[<a href="#basics" onclick="return switchVisibility('Ticket-Create-basics','Ticket-Create-details');">] . loc('Basics') . q[</a>], escape_title => 0, link_item => 0);
+PageMenu->child( details => title =>  q[<a href="#details" onclick="return switchVisibility('Ticket-Create-details','Ticket-Create-basics');">] . loc('Details') . q[</a>], escape_title => 0, link_item => 0);
 </%INIT>
 
 <%ARGS>

commit ddc0d469d1c53b8d32f47798fe893cbc8f3cae06
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 14:18:05 2010 -0400

    tweak page nav location

diff --git a/share/html/NoAuth/css/web2/nav.css b/share/html/NoAuth/css/web2/nav.css
index 8ae2393..0aa9611 100644
--- a/share/html/NoAuth/css/web2/nav.css
+++ b/share/html/NoAuth/css/web2/nav.css
@@ -55,7 +55,7 @@
 
 #page-navigation {
     position: absolute;
-    top: 6.6em;
+    top: 6.8em;
     right: 0em;
     left: auto;
     z-index: 9995;

commit d920c5e1fbaa779257d5c4fb922a6c0dfa6a3bd6
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 14:42:13 2010 -0400

    move base form styles into base css for easier styling; reorder base css
    to use included libaries before custom ones

diff --git a/share/html/NoAuth/css/web2/forms.css b/share/html/NoAuth/css/base/forms.css
similarity index 99%
rename from share/html/NoAuth/css/web2/forms.css
rename to share/html/NoAuth/css/base/forms.css
index 5b28403..40f48ee 100755
--- a/share/html/NoAuth/css/web2/forms.css
+++ b/share/html/NoAuth/css/base/forms.css
@@ -140,7 +140,7 @@ div.results .titlebox-content {
  font-size: 0.8em;
  padding-right: .5em;
 
-} 
+}
 
 .cflabel {
  text-align: right;
@@ -175,7 +175,7 @@ div.widget {
     padding-bottom: 0.5em;
 }
 
-div.widget .label { 
+div.widget .label {
  text-align: right;
  display: block;
  width: 15em;
@@ -211,7 +211,7 @@ div.widget .hints {
 }
 
 /* this style replaces the default down-triangle with one that looks more like
- *  native widget sets. It does not work in IE as it's an :after pseudo element 
+ *  native widget sets. It does not work in IE as it's an :after pseudo element
  *  with a "content" value. but that's ok because IE can't display unicode 25be
  *  anyway */
 
@@ -244,4 +244,3 @@ div.widget .hints {
     font-style: italic;
     color: red;
 }
-
diff --git a/share/html/NoAuth/css/base/main.css b/share/html/NoAuth/css/base/main.css
index 9c63d85..595a740 100644
--- a/share/html/NoAuth/css/base/main.css
+++ b/share/html/NoAuth/css/base/main.css
@@ -48,15 +48,16 @@
 % $m->callback(CallbackName => 'Begin');
 
 @import "jquery-ui.css";
+ at import "superfish.css";
+ at import "superfish-navbar.css";
+ at import "superfish-vertical.css";
+ at import "tablesorter.css";
+ at import "forms.css";
 @import "misc.css";
 @import "ticket-form.css";
 @import "rights-editor.css";
 @import "theme-editor.css";
 @import "ticket.css";
- at import "tablesorter.css";
- at import "superfish.css";
- at import "superfish-navbar.css";
- at import "superfish-vertical.css";
 
 % $m->callback(CallbackName => 'End');
 

commit c3f301b5a09c56028ec7bc68a367ad492d7b1ff1
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 14:50:06 2010 -0400

    Lift a number of non-"style" CSS files to the base/ CSS directory

diff --git a/share/html/NoAuth/css/web2/admin.css b/share/html/NoAuth/css/base/admin.css
similarity index 100%
rename from share/html/NoAuth/css/web2/admin.css
rename to share/html/NoAuth/css/base/admin.css
diff --git a/share/html/NoAuth/css/web2/collection.css b/share/html/NoAuth/css/base/collection.css
similarity index 99%
rename from share/html/NoAuth/css/web2/collection.css
rename to share/html/NoAuth/css/base/collection.css
index 3d91105..01ee877 100644
--- a/share/html/NoAuth/css/web2/collection.css
+++ b/share/html/NoAuth/css/base/collection.css
@@ -48,4 +48,3 @@
 table.collection td:first-child, table.collection th:first-child {
     padding-left: 1em;
 }
-
diff --git a/share/html/NoAuth/css/web2/login.css b/share/html/NoAuth/css/base/login.css
similarity index 99%
rename from share/html/NoAuth/css/web2/login.css
rename to share/html/NoAuth/css/base/login.css
index 7b9dee1..3b6fa95 100644
--- a/share/html/NoAuth/css/web2/login.css
+++ b/share/html/NoAuth/css/base/login.css
@@ -52,7 +52,7 @@
 #login-box {
 
  width: 30em;
- 
+
 margin-right:auto;margin-left:auto;
  padding-top: 2em;
  padding-bottom: 2em;
diff --git a/share/html/NoAuth/css/base/main.css b/share/html/NoAuth/css/base/main.css
index 595a740..7bd5ac8 100644
--- a/share/html/NoAuth/css/base/main.css
+++ b/share/html/NoAuth/css/base/main.css
@@ -47,17 +47,23 @@
 %# END BPS TAGGED BLOCK }}}
 % $m->callback(CallbackName => 'Begin');
 
+ at import "yui-fonts.css";
 @import "jquery-ui.css";
 @import "superfish.css";
 @import "superfish-navbar.css";
 @import "superfish-vertical.css";
 @import "tablesorter.css";
+ at import "collection.css";
 @import "forms.css";
 @import "misc.css";
 @import "ticket-form.css";
 @import "rights-editor.css";
 @import "theme-editor.css";
 @import "ticket.css";
+ at import "admin.css";
+ at import "portlets.css";
+ at import "tools.css";
+ at import "login.css";
 
 % $m->callback(CallbackName => 'End');
 
diff --git a/share/html/NoAuth/css/web2/portlets.css b/share/html/NoAuth/css/base/portlets.css
similarity index 100%
rename from share/html/NoAuth/css/web2/portlets.css
rename to share/html/NoAuth/css/base/portlets.css
diff --git a/share/html/NoAuth/css/web2/tools.css b/share/html/NoAuth/css/base/tools.css
similarity index 99%
rename from share/html/NoAuth/css/web2/tools.css
rename to share/html/NoAuth/css/base/tools.css
index 4882abb..6d8cfd0 100644
--- a/share/html/NoAuth/css/web2/tools.css
+++ b/share/html/NoAuth/css/base/tools.css
@@ -45,12 +45,10 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-table.myday td { 
+table.myday td {
  padding: 1em;
 }
 
 ol.dashboard-queries {
     padding-left: 1.5em;
 }
-
-
diff --git a/share/html/NoAuth/css/web2/yui-fonts.css b/share/html/NoAuth/css/base/yui-fonts.css
similarity index 100%
rename from share/html/NoAuth/css/web2/yui-fonts.css
rename to share/html/NoAuth/css/base/yui-fonts.css
diff --git a/share/html/NoAuth/css/web2/layout.css b/share/html/NoAuth/css/web2/layout.css
index 0b25c43..c589bd9 100644
--- a/share/html/NoAuth/css/web2/layout.css
+++ b/share/html/NoAuth/css/web2/layout.css
@@ -48,14 +48,10 @@
 /* body */
 
 body {
-
-
     padding:0;
     margin:0;
-
     background: #547CCC url(<%RT->Config->Get('WebPath')%>/NoAuth/css/web2/images/background-gradient.png) top left repeat-x ;
     font-family: arial, helvetica, sans-serif;
-
     color: #000000;
 }
 
@@ -81,75 +77,18 @@ div#body {
 
 }
 
-#topactions {
- position: absolute;
- background: transparent;
- top: 3.2em;
- right: 0.7em;
- width: auto;
- min-width: 42em;
- font-size: 0.9em;
- z-index: 99;
-}
-
-#topactions form * {
-    vertical-align: top;
-}
-
-#topactions button, #topactions select, #topactions input{
- padding-top: 0em;
- padding-bottom: 0em;
- width: 8em;
-
-}
-
-#topactions form {
- display: block;
-
-}
-
-#topactions #GotoTicket, #topactions #CreateTicketInQueue {
- text-align: right; 
-
-}
-#topactions #simple-search {
-    float: right;
-}
-
-#topactions #simple-search .field{
- margin-left: 1em;
- color: #787;
- }
-
-#topactions #simple-search .field:focus {
- color: #000;
- }
-
-#topactions #GotoTicket {
- text-align: right; 
-
-}
-
 div#footer {
  position: absolute;
  right: 0;
-  text-align: right;
+ text-align: right;
  font-size: 0.9em;
  margin-top: 2em;
  background: #fff;
  margin-bottom: 0;
  padding-left: 3em;
  padding-right: 1em;
-
-
-
-
-
  border-top: 2px solid #aaa;
  border-left: 2px solid #aaa;
-
-
-
  -moz-border-radius-topleft: 0.5em;
  -webkit-border-top-left-radius: 0.5em;
  -moz-border-radius-bottomleft: 0.5em;
@@ -157,7 +96,7 @@ div#footer {
 }
 
 div#footer #time {
-display: none ;
+    display: none ;
 }
 
 div#footer #bpscredits {
diff --git a/share/html/NoAuth/css/web2/main.css b/share/html/NoAuth/css/web2/main.css
index 16fce4c..79b5e50 100644
--- a/share/html/NoAuth/css/web2/main.css
+++ b/share/html/NoAuth/css/web2/main.css
@@ -49,22 +49,13 @@
 
 @import "../base/main.css";
 
- at import "yui-fonts.css";
 @import "base.css";
-
 @import "layout.css";
 @import "nav.css";
- at import "forms.css";
 @import "boxes.css";
-
- at import "login.css";
 @import "ticket-lists.css";
 @import "ticket-search.css";
- at import "portlets.css";
 @import "ticket.css";
- at import "tools.css";
- at import "admin.css";
- at import "collection.css";
 @import "misc.css";
 
 % $m->callback(CallbackName => 'End');
diff --git a/share/html/NoAuth/css/web2/nav.css b/share/html/NoAuth/css/web2/nav.css
index 0aa9611..d4f0bc4 100644
--- a/share/html/NoAuth/css/web2/nav.css
+++ b/share/html/NoAuth/css/web2/nav.css
@@ -45,6 +45,22 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
+.sf-menu {
+    width: 100%;
+}
+
+.sf-menu a {
+    padding-top: 0.5em;
+    padding-bottom: 0.5em;
+}
+.sf-menu li:hover {
+    background-color: #fff;
+}
+
+.sf-menu li, .sf-menu li li, .sf-menu li li li {
+    background-color: #eee;
+}
+
 #main-navigation {
     position: absolute;
     top: 0;
@@ -61,26 +77,61 @@
     z-index: 9995;
     font-size: 0.8em;
 }
-.sf-menu {
-    width: 100%;
+
+#page-navigation .sf-menu li, #page-navigation .sf-menu li li, #page-navigation .sf-menu li li li {
+    background-color: #fff;
 }
 
-.sf-menu a {
-    padding-top: 0.5em;
-    padding-bottom: 0.5em;
+#page-navigation .sf-menu a:visited, #page-navigation .sf-menu a {
+    border: none;
 }
-.sf-menu li:hover {
-    background-color: #fff;
+
+
+#topactions {
+ position: absolute;
+ background: transparent;
+ top: 3.2em;
+ right: 0.7em;
+ width: auto;
+ min-width: 42em;
+ font-size: 0.9em;
+ z-index: 99;
 }
 
-.sf-menu li, .sf-menu li li, .sf-menu li li li {
-    background-color: #eee;
+#topactions form * {
+    vertical-align: top;
 }
 
-#page-navigation .sf-menu li, #page-navigation .sf-menu li li, #page-navigation .sf-menu li li li {
-    background-color: #fff;
+#topactions button, #topactions select, #topactions input{
+ padding-top: 0em;
+ padding-bottom: 0em;
+ width: 8em;
+
 }
 
-#page-navigation .sf-menu a:visited, #page-navigation .sf-menu a {
-    border: none;
+#topactions form {
+ display: block;
+
+}
+
+#topactions #GotoTicket, #topactions #CreateTicketInQueue {
+ text-align: right;
+
+}
+#topactions #simple-search {
+ float: right;
+}
+
+#topactions #simple-search .field{
+ margin-left: 1em;
+ color: #787;
+ }
+
+#topactions #simple-search .field:focus {
+ color: #000;
+ }
+
+#topactions #GotoTicket {
+ text-align: right;
+
 }

commit cf9fe3894b3d775a63675d6bd6517b0585e2d2dd
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 15:27:24 2010 -0400

    nuke the 3.5 and 3.4 themes. they're no longer compatible

diff --git a/share/html/NoAuth/css/3.4-compat/body.css b/share/html/NoAuth/css/3.4-compat/body.css
deleted file mode 100644
index 33e0558..0000000
--- a/share/html/NoAuth/css/3.4-compat/body.css
+++ /dev/null
@@ -1,75 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-#body {
-    margin: 0.5em 0.5em 0 0.5em;
-    float: left;
-    width: 80%;
-}
-
-#body h1 { font-size: 1.5em; }
-#body h2 { font-size: 1.3em; }
-#body h3 { font-size: 1.1em; }
-#body h4 { font-size: 1em; }
-#body h5 { font-size: 0.9em; }
-#body h6 { font-size: 0.8em; }
-
-#body h1, #body h2, #body h3, #body h4, #body h5, #body h6 {
-    font-weight: bold;
-}
-
-#body :link { color: black; }
-
-#body :link, #body :visited {
-    font-weight: bold;
-    text-decoration: none;
-}
-
-#body :link:hover, #body :visited:hover {
-    text-decoration: underline;
-}
-
diff --git a/share/html/NoAuth/css/3.4-compat/footer.css b/share/html/NoAuth/css/3.4-compat/footer.css
deleted file mode 100644
index 13f2a88..0000000
--- a/share/html/NoAuth/css/3.4-compat/footer.css
+++ /dev/null
@@ -1,61 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-#footer {
-    clear: both;
-    font-size: 0.8em;
-    margin-top: 5em;
-    padding-bottom: 2em;
-    color: #888;
-}
-
-#footer p {
-    text-align: right;
-    padding: 0 0.5em 0 0;
-    margin: 0;
-}
-
diff --git a/share/html/NoAuth/css/3.4-compat/forms.css b/share/html/NoAuth/css/3.4-compat/forms.css
deleted file mode 100644
index b203b26..0000000
--- a/share/html/NoAuth/css/3.4-compat/forms.css
+++ /dev/null
@@ -1,110 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-form .label, form label {
-    font-weight: bold;
-}
-
-.submit {
-    background: #069;
-%# These borders are needed so the container actually surrounds the floats inside it
-    border-top: 1px solid white;
-    border-bottom: 1px solid white;
-    color: #ffdb00;
-    font-weight: bold;
-}
-
-.submit .buttons { float: right; }
-.submit .extra-buttons { float: left; }
-.submit .button { font-size: 0.9em; }
-
-.submit .submit-clear { clear: right; }
-
-.input-row {
-    clear: both;
-    padding: 0.25em;
-}
-
-%# ComboBox styles... some properties like height and width must be dynamically
-%# set in the JS (at least for now).
-.combobox {
-    position: relative;
-    border: 2px inset ButtonHighlight;
-    padding-left: 0.5em;
-    padding-bottom: 0.1em;
-}
-
-.combobox .combo-button {
-    padding: 0 2px 0 2px;
-    margin: 0;
-    background: ButtonFace;
-    color: ButtonText;
-    border: 2px outset ButtonHighlight;
-    cursor: default;
-    font-size: 8pt;
-}
-
-.combobox .combo-text {
-    border: none;
-    margin: 0;
-    padding: 0;
-}
-
-.combobox .combo-list {
-    z-index: 200;
-}
-
-#quickbar #topactions form {
-    display: inline;
-    margin-left: 2em;
-}
-
-.cfinvalidfield {
-    font-style: italic;
-    color: red;
-}
-
diff --git a/share/html/NoAuth/css/3.4-compat/header.css b/share/html/NoAuth/css/3.4-compat/header.css
deleted file mode 100644
index 612f6bb..0000000
--- a/share/html/NoAuth/css/3.4-compat/header.css
+++ /dev/null
@@ -1,88 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-#header #page-menu {
-    display: none;
-}
-
-#header {
-    background: #4282b5;
-    margin-top: 0;
-    padding-bottom: 0.2em;
-    float: left;
-    width: 82%;
-}
-
-#header h1 {
-    background: #4282b5;
-    color: white;
-    font-size: 1.7em;
-    margin: 0;
-    padding: 0;
-}
-
-#header #actions-menu {
-    display: block;
-    margin: 0 1em 0 0;
-    padding: 0;
-    color: white;
-    text-align: right;
-    font-size: 1.2em;
-}
-
-#header #actions-menu li {
-    display: inline;
-}
-
-#header #actions-menu :link, #header #actions-menu :visited {
-    color: white;
-    text-decoration: none;
-}
-
-#header #actions-menu :link:hover, #header #actions-menu :visited:hover {
-    text-decoration: underline;
-}
diff --git a/share/html/NoAuth/css/3.4-compat/login.css b/share/html/NoAuth/css/3.4-compat/login.css
deleted file mode 100644
index 1005241..0000000
--- a/share/html/NoAuth/css/3.4-compat/login.css
+++ /dev/null
@@ -1,54 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-#body.login-body {
-    width: 98%;
-}
-
-#login-box {
-    width: 30em;
-}
diff --git a/share/html/NoAuth/css/3.4-compat/main.css b/share/html/NoAuth/css/3.4-compat/main.css
deleted file mode 100644
index 788f856..0000000
--- a/share/html/NoAuth/css/3.4-compat/main.css
+++ /dev/null
@@ -1,77 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-% $m->callback(CallbackName => 'Begin');
-
- at import "../base/main.css";
-
-%# Import the 3.5 styles we want to build off of...
- at import "../3.5-default/logo.css";
- at import "../3.5-default/misc.css";
- at import "../3.5-default/transactions.css";
- at import "../3.5-default/approvals.css";
- at import "../3.5-default/login.css";
- at import "../3.5-default/quickbar.css";
- at import "../3.5-default/ticket.css";
-
-% $m->callback(CallbackName => 'Post3.5');
-
-%# ...and then import the 3.4 compat styles afterwards so they can cascade
- at import "nav.css";
- at import "footer.css";
- at import "body.css";
- at import "titlebox.css";
- at import "header.css";
- at import "forms.css";
- at import "transactions.css";
- at import "ticket.css";
- at import "login.css";
- at import "quickbar.css";
- at import "misc.css";
-
-% $m->callback(CallbackName => 'End');
-
diff --git a/share/html/NoAuth/css/3.4-compat/misc.css b/share/html/NoAuth/css/3.4-compat/misc.css
deleted file mode 100644
index 8d25286..0000000
--- a/share/html/NoAuth/css/3.4-compat/misc.css
+++ /dev/null
@@ -1,78 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-.oddline { background: white; }
-.evenline { background: #cecfef; }
-
-
-#comp-Search-Build .titlebox-content {
-    padding-left: 0.7em;
-    padding-right: 0.3em;
-}
-
-#editsearches {
-    width: 55%;
-    float:right;
-    text-align: left;
-    padding-right: 1em;
-}
-
-#editsearches .titlebox-content {
-    padding: 1em;
-}
-
-
-#editquery {
-    width: 40%;
-    float: left;
-    padding-left: 1em;
-}
-
-#pick-criteria {
-    clear: both;
-}
-
diff --git a/share/html/NoAuth/css/3.4-compat/nav.css b/share/html/NoAuth/css/3.4-compat/nav.css
deleted file mode 100644
index 1631101..0000000
--- a/share/html/NoAuth/css/3.4-compat/nav.css
+++ /dev/null
@@ -1,106 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-#nav {
-    clear: left;
-    float: left;
-    width: 18%;
-    font-size: 1.4em;
-    color: #eee;
-    margin: 0;
-    background: #4282b5 url(<%RT->Config->Get('WebImagesURL')%>/css/cbr.gif) no-repeat bottom right;
-}
-
-#nav #system-menu {
-    padding: 0 0.2em 0.2em 0.2em;
-    margin-top: 0;
-/*    background: transparent url(<%RT->Config->Get('WebImagesURL')%>/css/ctr.gif) no-repeat top right; */
-}
-
-#nav ul {
-    list-style: none;
-    padding-left: 0.5em;
-    margin-left: 0;
-}
-
-#nav ul .bullet, #nav ul .separator {
-    display: none;
-}
-
-#nav ul li {
-    padding: 0.4em 0 0.4em 0.2em;
-    border-bottom: 1px solid white;
-}
-
-#nav li ul {
-    font-size: 0.9em;
-}
-
-#nav li ul li {
-    border-bottom: none;
-    padding: 0.2em 0 0 0;
-}
-
-#nav :link, #nav :visited {
-    text-decoration: none;
-    color: #eee;
-}
-
-#nav :link:hover,
-#nav :visited:hover,
-#nav :link.selected,
-#nav :visited.selected
-{
-    color: #ff6;
-}
-
-#nav :link.selected,
-#nav :visited.selected
-{
-    text-decoration: underline;
-    font-weight: bold;
-}
diff --git a/share/html/NoAuth/css/3.4-compat/quickbar.css b/share/html/NoAuth/css/3.4-compat/quickbar.css
deleted file mode 100644
index 311e800..0000000
--- a/share/html/NoAuth/css/3.4-compat/quickbar.css
+++ /dev/null
@@ -1,82 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-#quickbar {
-    border: 1px solid transparent;
-}
-
-#quickbar #quick-personal {
-    display: inline;
-    color: #888;
-    padding: 0.5em 1em 0 0;
-    float: right;
-}
-
-#quickbar #quick-personal span {
-    font-weight: bold;
-}
-
-#quickbar #quick-personal :link,
-#quickbar #quick-personal :visited
-{
-    color: #888;
-    font-weight: bold;
-}
-
-#quickbar #quick-personal :link:hover,
-#quickbar #quick-personal :visited:hover
-{
-    color: black;
-}
-
-#quickbar #topactions {
-    color: white;
-    font-size: 0.9em;
-    position: relative;
-    right: 1em;
-    float: right;
-}
diff --git a/share/html/NoAuth/css/3.4-compat/ticket.css b/share/html/NoAuth/css/3.4-compat/ticket.css
deleted file mode 100644
index b7ea01c..0000000
--- a/share/html/NoAuth/css/3.4-compat/ticket.css
+++ /dev/null
@@ -1,50 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-.value {
-    font-weight: bold;
-}
diff --git a/share/html/NoAuth/css/3.4-compat/titlebox.css b/share/html/NoAuth/css/3.4-compat/titlebox.css
deleted file mode 100644
index 2ed8e57..0000000
--- a/share/html/NoAuth/css/3.4-compat/titlebox.css
+++ /dev/null
@@ -1,99 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-.titlebox {
-    margin: 0.5em 0;
-}
-
-.titlebox .titlebox-content {
-    padding: 0.05em;
-}
-
-.titlebox .titlebox-title {
-    background: #069;
-    padding: 0.2em 0.5em;
-    color: white;
-    border-top: 1px solid black;
-    border-bottom: 1px solid black;
-    font-weight: bold;
-    position: relative;
-}
-
-.titlebox .titlebox-title .right {
-    position: absolute;
-    right: 1.5em;
-    font-size: 0.9em;
-}
-
-#body .titlebox .titlebox-title :link, #body .titlebox .titlebox-title :visited {
-    color: white;
-}
-
-#body .titlebox .titlebox-title .widget :link, #body .titlebox .titlebox-title .widget :visited {
-    color: black;
-}
-
-%# TRS: I wish there was a more elegant way to do this... I essentially need to
-%# select all elements X that do NOT have element Y as a descendant... which I can
-%# fake with the child selector of CSS2, but IE is stupid and does not support that.
-
-% for (qw(index
-%         Search-Build
-%         User-Prefs
-%         Approvals
-%         Admin-Users-Modify
-%         SelfService
-%         SelfService-Closed
-%         Ticket-ModifyAll
-%                           ))
-% {
-#comp-<%$_%> .titlebox .titlebox-content,
-% }
-.titlebox .titlebox .titlebox-content
-{
-    background: #cecfce;
-}
diff --git a/share/html/NoAuth/css/3.4-compat/transactions.css b/share/html/NoAuth/css/3.4-compat/transactions.css
deleted file mode 100644
index 29f8a42..0000000
--- a/share/html/NoAuth/css/3.4-compat/transactions.css
+++ /dev/null
@@ -1,83 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-.ticket-transaction {
-    margin: 0;
-    border: none;
-}
-
-.ticket-transaction .type {
-    width: 1em;
-}
-
-.ticket-transaction.even {
-    background: #cecfef;
-}
-
-.ticket-transaction.basics { border-color: #9c3031; }
-.ticket-transaction.basics .type { background: #9c3031; }
-.ticket-summary .ticket-info-basics .titlebox-content { border-left: none; }
-.ticket-summary .ticket-info-basics .titlebox-title { background: #9c3031; }
-
-.ticket-transaction.people { border-color: #31309c; }
-.ticket-transaction.people .type { background: #31309c; }
-.ticket-summary .ticket-info-people .titlebox-content { border-left: none; }
-.ticket-summary .ticket-info-people .titlebox-title { background: #31309c; }
-
-.ticket-transaction.links { border-color: #316531; }
-.ticket-transaction.links .type { background: #316531; }
-.ticket-summary .ticket-info-links .titlebox-content  { border-left: none; }
-.ticket-summary .ticket-info-links .titlebox-title  { background: #316531; }
-
-.ticket-transaction.dates { border-color: #633063; }
-.ticket-transaction.dates .type { background: #633063; }
-.ticket-summary .ticket-info-dates .titlebox-content  { border-left: none; }
-.ticket-summary .ticket-info-dates .titlebox-title  { background: #633063; }
-
-.ticket-transaction.message { border-color: #069; }
-.ticket-transaction.message .type { background: #069; }
-
diff --git a/share/html/NoAuth/css/3.5-default/approvals.css b/share/html/NoAuth/css/3.5-default/approvals.css
deleted file mode 100644
index 37602f3..0000000
--- a/share/html/NoAuth/css/3.5-default/approvals.css
+++ /dev/null
@@ -1,97 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-.approval {
-    margin-bottom: 3em;
-    padding: 0 0 1em 0;
-    border: 1px solid #069;
-}
-
-.approval .name {
-    background: #069;
-    color: white;
-    font-size: 1.1em;
-    padding: 0.2em 0 0.4em 0.2em;
-}
-
-#body .approval .name :link, #body .approval .name :visited {
-    color: white;
-}
-
-.approval .originating-ticket {
-    margin: 0.5em;
-    border: 1px solid #aaa;
-}
-
-.approval .originating-ticket .link {
-    display: block;
-    background: #aaa;
-    padding: 0.2em 0 0.4em 0.2em;
-}
-
-.approval .originating-ticket .info {
-    padding: 0.5em;
-}
-
-#body .approval .originating-ticket .link :link,
-#body .approval .originating-ticket .link :visited {
-    color: black;
-}
-
-.approval .form {
-    margin: 1em 0.5em 0.5em 0.5em;
-}
-
-.approval .form .action, .approval .form .notes {
-    float: left;
-    margin-left: 1em;
-}
-
-.approval .form .action { padding-top: 1em; }
-
-.approval .form .action label { font-weight: normal; }
-.approval .form .notes label  { display: block; }
diff --git a/share/html/NoAuth/css/3.5-default/body.css b/share/html/NoAuth/css/3.5-default/body.css
deleted file mode 100755
index 98603ef..0000000
--- a/share/html/NoAuth/css/3.5-default/body.css
+++ /dev/null
@@ -1,81 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-#body {
-    clear: both;
-    margin: 0 0.75em 0 2em;
-    padding-top: 0.5em;
-}
-
-#body h1 {
-    border-bottom: 1px dotted #069;
-    padding-left: 0.5em;
-}
-
-#body h1 { font-size: 1.5em; }
-#body h2 { font-size: 1.3em; }
-#body h3 { font-size: 1.1em; }
-#body h4 { font-size: 1em; }
-#body h5 { font-size: 0.9em; }
-#body h6 { font-size: 0.8em; }
-
-#body h1, #body h2, #body h3, #body h4, #body h5, #body h6 {
-    color: #930;
-    font-weight: bold;
-}
-
-#body :link { color: #069; }
-
-#body :link, #body :visited {
-    font-weight: bold;
-    text-decoration: none;
-}
-
-#body :link:hover, #body :visited:hover {
-    text-decoration: underline;
-}
-
diff --git a/share/html/NoAuth/css/3.5-default/footer.css b/share/html/NoAuth/css/3.5-default/footer.css
deleted file mode 100644
index d03e4cc..0000000
--- a/share/html/NoAuth/css/3.5-default/footer.css
+++ /dev/null
@@ -1,91 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-#footer {
-    clear: both;
-    font-size: 0.8em;
-    margin-top: 5em;
-    padding-bottom: 3em;
-}
-
-#footer p { float: left; }
-
-#footer #time {
-    color: white;
-    background: #069 url(<%RT->Config->Get('WebImagesURL')%>/css/ctr-b2g.gif) no-repeat top right;
-    padding: 0.2em 0 0.3em 0;
-    margin: 0;
-    position: relative;
-    z-index: 2;
-}
-
-#footer #time span {
-    padding: 0.2em 2em 0.3em 3em;
-    background: url(<%RT->Config->Get('WebImagesURL')%>/css/cbr-b2g.gif) no-repeat bottom right;
-}
-
-#footer #bpscredits {
-    background: #ccc url(<%RT->Config->Get('WebImagesURL')%>/css/ctr-gray.gif) no-repeat top right;
-    padding: 0.2em 0 0.3em 0;
-    margin: 0;
-    position: relative;
-    left: -10px;
-    z-index: 1;
-}
-
-#footer #bpscredits span {
-    padding: 0.2em 2em 0.3em 3em;
-    background: url(<%RT->Config->Get('WebImagesURL')%>/css/cbr-gray.gif) no-repeat bottom right;
-}
-
-#footer #legal {
-    float: none;
-    color: #888;
-    padding: 1em 0 0 2em;
-    clear: both;
-}
-
diff --git a/share/html/NoAuth/css/3.5-default/forms.css b/share/html/NoAuth/css/3.5-default/forms.css
deleted file mode 100755
index d2f0a85..0000000
--- a/share/html/NoAuth/css/3.5-default/forms.css
+++ /dev/null
@@ -1,148 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-form input.button {
-    border: 3px double #069;
-    border-top-color: #08c;
-    border-left-color: #08c;
-    padding: 0.25em;
-    background: white;
-    font-weight: bold;
-    font-size: 1em;
-    margin: 0.5em 0.5em 0 0.5em;
-}
-
-form input.button:active {
-    border: 3px double #08c;
-    border-top-color: #069;
-    border-left-color: #069;
-}
-
-form select {
-    border: 1px solid #069;
-    padding: 1px;
-}
-
-form input.field, form input, form textarea {
-    border: 1px solid #069;
-    padding: 3px;
-}
-
-form input.checkbox, form input.radio {
-    border: none;
-    padding: 0;
-}
-
-/* form .entry input, form .value input */
-
-.label, form label, .labeltop {
-    font-weight: bold;
-}
-
-.label-comment {
-    font-weight: normal;
-    font-size: 0.9em;
-}
-
-.labeltop {
-    vertical-align: top;
-}
-
-.submit {
-    font-weight: bold;
-    color: #a00;
-    font-size: 1.1em;
-    padding: 0.3em 1.5em 0 1.5em;
-    border-top: 1px solid #930;
-    margin: 1.5em 0 2.5em 0;
-}
-
-.submit .buttons { float: right; }
-.submit .extra-buttons { float: left; }
-.submit .button { font-size: 0.9em; }
-.submit .submit-clear { display: none; }
-
-.input-row {
-    clear: both;
-    padding: 0.25em;
-}
-
-%# ComboBox styles... some properties like height and width must be dynamically
-%# set in the JS (at least for now).
-.combobox {
-    position: relative;
-    z-index: 100;
-}
-
-.combobox .combo-button {
-    margin: 0;
-    margin-top: -0.2em;
-    margin-left: -0.3em;
-    background: ButtonFace;
-    color: ButtonText;
-    border: 2px outset ButtonHighlight;
-    cursor: default;
-    font-size: 1em;
-    z-index: 200;
-}
-
-.combobox .combo-text {
-    margin: 0;
-    padding: 1px;
-    z-index: 110;
-}
-
-.combobox .combo-list {
-    border: 1px outset;
-    
-}
-
-.cfinvalidfield {
-    font-style: italic;
-    color: red;
-}
-
diff --git a/share/html/NoAuth/css/3.5-default/header.css b/share/html/NoAuth/css/3.5-default/header.css
deleted file mode 100644
index 5d0fa8f..0000000
--- a/share/html/NoAuth/css/3.5-default/header.css
+++ /dev/null
@@ -1,152 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-#header {
-    clear: both;
-    margin: 0 0.75em 0 0.75em;
-    padding-top: 1em;
-}
-
-#header h1 {
-    margin: 0;
-    padding: 0;
-    color: #930;
-    position: relative;
-    font-size: 2em;
-    font-weight: bold;
-    left: 1.3em;
-    top: 0.15em;
-    z-index: 3;
-    width: 95%;
-}
-
-#header ul {
-    margin: 0;
-    padding: 0;
-    color: #eee;
-    float: left;
-}
-
-#header #page-menu {
-    position: relative;
-    z-index: 2;
-    background: #069 url(<%RT->Config->Get('WebImagesURL')%>/css/ct.gif) no-repeat top left;
-    min-width: 65%;
-}
-
-%# This is an interesting bit of CSS.  expression() is an IE-only extension to
-%# it's CSS implementation.  Just in case other browsers might choke on it,
-%# the rule is enclosed in a selector only IE will (wrongly) match to an element.
-%# 
-%# The expression() function takes Javascript, and basically what it's doing here
-%# is checking to see if the width of the menu would be greater than 65% of the body
-%# width.  If it is, great, leave it alone to automatically resize.  If it is not, set
-%# it to 65% of the body width.  This amounts to emulating the min-width rule that
-%# compliant browsers understand above.
-* html #header ul#page-menu {
-    width: expression(document.body.clientWidth*0.65 < document.getElementById('page-menu').clientWidth ? "auto" : "65%");
-    overflow: visible;
-}
-
-#page-menu div {
-    position: relative;
-    z-index: 3;
-}
-
-#page-menu div { background: url(<%RT->Config->Get('WebImagesURL')%>/css/cb.gif) no-repeat bottom left; }
-#page-menu div div { background: url(<%RT->Config->Get('WebImagesURL')%>/css/cbr.gif) no-repeat bottom right; }
-#page-menu div div div {
-    background: url(<%RT->Config->Get('WebImagesURL')%>/css/ctr.gif) no-repeat top right;
-    padding: 0.2em 1em 0.4em 1em;
-}
-
-#page-menu.actions-present div div { background: url(<%RT->Config->Get('WebImagesURL')%>/css/cbr-b2lb.gif) no-repeat bottom right; }
-#page-menu.actions-present div div div { background: url(<%RT->Config->Get('WebImagesURL')%>/css/ctr-b2lb.gif) no-repeat top right; }
-
-#header ul li {
-    display: inline;
-}
-
-#header #actions-menu {
-    position: relative;
-    background: #08c;
-}
-
-#actions-menu div {
-    position: relative;
-    z-index: 2;
-}
-
-/*#actions-menu div { background: url(<%RT->Config->Get('WebImagesURL')%>/css/cb.gif) no-repeat bottom left; }*/
-#actions-menu div div { background: url(<%RT->Config->Get('WebImagesURL')%>/css/cbr.gif) no-repeat bottom right; }
-#actions-menu div div div {
-    background: url(<%RT->Config->Get('WebImagesURL')%>/css/ctr.gif) no-repeat top right;
-    padding: 0.2em 1em 0.4em 1em;
-}
-
-#header :link,
-#header :visited
-{
-    color: white;
-    text-decoration: none;
-}
-
-#header :link.selected,
-#header :visited.selected,
-#header :link:hover,
-#header :visited:hover
-{
-    color: #fc6; /*#ff6;*/
-}
-
-#header :link.selected,
-#header :visited.selected
-{
-    font-weight: bold;
-    text-decoration: underline;
-}
-
diff --git a/share/html/NoAuth/css/3.5-default/local.css b/share/html/NoAuth/css/3.5-default/local.css
deleted file mode 100644
index 95c3571..0000000
--- a/share/html/NoAuth/css/3.5-default/local.css
+++ /dev/null
@@ -1,50 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-%# This is the file you want to override in local/html for adding
-%# custom css.
-
diff --git a/share/html/NoAuth/css/3.5-default/login.css b/share/html/NoAuth/css/3.5-default/login.css
deleted file mode 100644
index 0d55ab6..0000000
--- a/share/html/NoAuth/css/3.5-default/login.css
+++ /dev/null
@@ -1,85 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-#login-box {
-    width: 50%;
-    margin: 0 auto 4em auto;
-}
-
-%# More rules only IE will recognize (but are still valid!) to correct for
-%# IE's incorrect handling of auto margins and the W3C defined behavior.
-%# text-align will affect a block element in IE, therefore centering it, like
-%# left and right auto margins *should*
-* html #login-box {
-    text-align: center;
-}
-
-%# ... and align the text back the way it should be
-* html #login-box .titlebox {
-    text-align: left;
-}
-
-#login-box .input-row {
-    padding: 0.5em;
-}
-
-#login-box .input-row .label {
-    width: 8em;
-    float: left;
-    text-align: right;
-    padding: 0.2em 1em 0 0;
-}
-
-#login-box .input-row .input {
-    float: left;
-}
-
-#login-box .button-row {
-    clear: both;
-    padding: 0.5em;
-    float: right;
-}
diff --git a/share/html/NoAuth/css/3.5-default/logo.css b/share/html/NoAuth/css/3.5-default/logo.css
deleted file mode 100644
index cab2971..0000000
--- a/share/html/NoAuth/css/3.5-default/logo.css
+++ /dev/null
@@ -1,61 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-#logo {
-    float: left;
-    clear: left;
-
-    margin: 0.5em 0 0.5em 10px;
-}
-
-#logo img { border: none; }
-#logo .rtname {
-    text-align: center;
-    font-weight: bold;
-    display: block;
-}
-
diff --git a/share/html/NoAuth/css/3.5-default/main.css b/share/html/NoAuth/css/3.5-default/main.css
deleted file mode 100644
index c5cab0a..0000000
--- a/share/html/NoAuth/css/3.5-default/main.css
+++ /dev/null
@@ -1,69 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-% $m->callback(CallbackName => 'Begin');
-
- at import "../base/main.css";
-
- at import "misc.css";
- at import "login.css";
- at import "logo.css";
- at import "quickbar.css";
- at import "body.css";
- at import "approvals.css";
- at import "titlebox.css";
- at import "forms.css";
- at import "ticket.css";
- at import "transactions.css";
- at import "nav.css";
- at import "header.css";
- at import "footer.css";
- at import "ticket-search.css";
- at import "local.css";
-
-% $m->callback(CallbackName => 'End');
-
diff --git a/share/html/NoAuth/css/3.5-default/misc.css b/share/html/NoAuth/css/3.5-default/misc.css
deleted file mode 100755
index d76dae7..0000000
--- a/share/html/NoAuth/css/3.5-default/misc.css
+++ /dev/null
@@ -1,81 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-body {
-    font-family: Verdana, sans-serif;
-    font-size: 76%;
-    margin: 0;
-    background-color: white;
-}
-
-.evenline { background-color: white; }
-.oddline { background-color: #ddd; }
-
-td {
-    padding: 0.1em 0.5em 0.1em 0.5em;
-}
-
-ul.action-results {
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-.shredder-form { line-height: 3em }
-.shredder-form span { margin-left: 1em; margin-right: 1em }
-.shredder-help {
-    background-color: #ffe99d;
-    margin: 1em 2em;
-    padding: 1em;
-    border-style: solid;
-    border-color: black;
-    border-width: 1px;
-}
-#shredder-select-plugin { border-style: solid; border-color: black; border-width: 1px }
-#shredder-plugin-results { border-style: solid; border-color: black; border-width: 1px; margin-top: 1em; }
-#shredder-plugin-results input { margin-left: 1em; }
-
-.pod-sequence-C { background-color: #eee }
diff --git a/share/html/NoAuth/css/3.5-default/nav-left.css b/share/html/NoAuth/css/3.5-default/nav-left.css
deleted file mode 100644
index 732a24b..0000000
--- a/share/html/NoAuth/css/3.5-default/nav-left.css
+++ /dev/null
@@ -1,86 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-#logo {
-    float: right;
-    clear: right;
-}
-#nav ul { float: left; }
-#nav ul div { text-align: left; }
-
-#nav li ul {
-    right: 2em;
-    left: 0;
-}
-
-%# Hide from IE... it can't handle relative positioning with both a
-%# left and right set
-html>body #nav li ul {
-    left: 0;
-    right: 2em;
-}
-
-#nav ul,
-#nav ul.odd,
-#nav ul .first,
-#nav ul.odd .first
-{
-    background-image: none;
-}
-
-#nav ul { background: #069 url(<%RT->Config->Get('WebImagesURL')%>/css/ctr.gif) no-repeat top right; }
-#nav ul div { background: transparent url(<%RT->Config->Get('WebImagesURL')%>/css/cbr.gif) no-repeat bottom right; }
-#nav ul.odd { background: #08c url(<%RT->Config->Get('WebImagesURL')%>/css/ctr.gif) no-repeat top right; }
-#nav ul.odd div { background: transparent url(<%RT->Config->Get('WebImagesURL')%>/css/cbr.gif) no-repeat bottom right; }
-
-#nav ul div {
-    display: block;
-    padding: 0.2em 1em 0.4em 0;
-}
-
-#nav ul { padding: 0; }
-
diff --git a/share/html/NoAuth/css/3.5-default/nav.css b/share/html/NoAuth/css/3.5-default/nav.css
deleted file mode 100644
index c72bcac..0000000
--- a/share/html/NoAuth/css/3.5-default/nav.css
+++ /dev/null
@@ -1,163 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-#nav {
-    clear: both;
-    font-size: 1.1em;
-}
-
-#nav #system-menu,
-#nav ul
-{
-    min-width: 85%;
-}
-
-%# This is an interesting bit of CSS.  expression() is an IE-only extension to
-%# it's CSS implementation.  Just in case other browsers might choke on it,
-%# the rule is enclosed in a selector only IE will (wrongly) match to an element.
-%# 
-%# The expression() function takes Javascript, and basically what it's doing here
-%# is checking to see if the width of the menu would be greater than 85% of the body
-%# width.  If it is, great, leave it alone to automatically resize.  If it is not, set
-%# it to 85% of the body width.  This amounts to emulating the min-width rule that
-%# compliant browsers understand above.
-* html #nav #system-menu {
-    width: expression(document.body.clientWidth*0.85 < document.getElementById('page-menu').clientWidth ? "auto" : "85%");
-    overflow: visible;
-}
-
-#nav ul {
-    float: left;
-    clear: left;
-    
-    color: #eee;
-    font-weight: bold;
-    
-    margin: 0;
-    padding: 0;
-    
-    list-style: none;
-}
-
-#nav li ul {
-    margin-top: 0.75em;
-}
-
-/*
-%# We need the extra padding above for browsers where we display the arrows
-%# but those don't work in IE so we don't want as much spacing
-%# 
-%# IE wrongly matches the selector below even though there isn't an element
-%# above <html> in the doc tree
-*/
-* html #nav li ul {
-    margin-top: 0.25em;
-}
-
-#nav li {
-    display: inline;
-    margin-bottom: 1em;
-    padding: 0.2em 0 0.4em 0;
-}
-
-#nav li.first { padding-left: 1em; }
-
-#nav ul div div.wrapper {
-    text-align: left;
-    padding: 0.2em 1em 0.4em 0;
-}
-
-/****/
-
-#nav :link,
-#nav :visited
-{
-    color: #ececec;
-    text-decoration: none;
-}
-
-#nav :link.selected,
-#nav :visited.selected,
-#nav :link:hover,
-#nav :visited:hover
-{
-    color: #fc6; /*#ff6;*/
-}
-
-#nav :link.selected,
-#nav :visited.selected
-{
-    text-decoration: underline;
-}
-
-html>body #nav :link.selected,
-html>body #nav :visited.selected
-{
-    padding-bottom: 0.8em;
-    background: transparent url(<%RT->Config->Get('WebImagesURL')%>/css/dark-arrow.png) no-repeat bottom center;
-}
-
-html>body #nav :link.selected.odd,
-html>body #nav :visited.selected.odd
-{
-    padding-bottom: 0.8em;
-    background: transparent url(<%RT->Config->Get('WebImagesURL')%>/css/light-arrow.png) no-repeat bottom center;
-}
-
-/*
-#nav ul { background: #069 url(<%RT->Config->Get('WebImagesURL')%>/css/ctr.gif) no-repeat top right; }
-#nav ul div { background: transparent url(<%RT->Config->Get('WebImagesURL')%>/css/cbr.gif) no-repeat bottom right; }
-#nav ul.odd { background: #08c url(<%RT->Config->Get('WebImagesURL')%>/css/ctr.gif) no-repeat top right; }
-#nav ul.odd div { background: transparent url(<%RT->Config->Get('WebImagesURL')%>/css/cbr.gif) no-repeat bottom right; }
-*/
-
-
-#nav ul div.wrapper { background: transparent url(<%RT->Config->Get('WebImagesURL')%>/css/ctr.gif) no-repeat top right; }
-#nav ul div { background: #069 url(<%RT->Config->Get('WebImagesURL')%>/css/cbr.gif) no-repeat bottom right; }
-#nav ul.odd div.wrapper { background: transparent url(<%RT->Config->Get('WebImagesURL')%>/css/ctr.gif) no-repeat top right; }
-#nav ul div.odd { background: #08c url(<%RT->Config->Get('WebImagesURL')%>/css/cbr.gif) no-repeat bottom right; }
-
diff --git a/share/html/NoAuth/css/3.5-default/quickbar.css b/share/html/NoAuth/css/3.5-default/quickbar.css
deleted file mode 100644
index 01bee03..0000000
--- a/share/html/NoAuth/css/3.5-default/quickbar.css
+++ /dev/null
@@ -1,98 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-#quickbar #quick-personal {
-    display: inline;
-    color: #888;
-    padding: 0.5em 1em 0 0;
-    float: right;
-}
-
-#quickbar #quick-personal span {
-    font-weight: bold;
-}
-
-#quickbar #quick-personal :link,
-#quickbar #quick-personal :visited
-{
-    color: #888;
-    font-weight: bold;
-}
-
-#quickbar #quick-personal :link:hover,
-#quickbar #quick-personal :visited:hover
-{
-    color: black;
-}
-
-#quickbar #topactions {
-    float: right;
-    clear: right;
-
-    font-size: 0.9em;
-    padding: 1em;
-}
-
-#quickbar #topactions form {
-    display: inline;
-    margin-left: 1em;
-}
-
-#quickbar #topactions form .button {
-    padding: 0 2px 0 2px;
-    font-size: 1em;
-    margin: 0;
-}
-
-#quickbar #topactions form .field {
-    padding: 1px;
-    font-size: 0.9em;
-}
-
-#quickbar #topactions form input.field {
-    padding: 3px;
-}
diff --git a/share/html/NoAuth/css/3.5-default/ticket-search.css b/share/html/NoAuth/css/3.5-default/ticket-search.css
deleted file mode 100644
index 4a48662..0000000
--- a/share/html/NoAuth/css/3.5-default/ticket-search.css
+++ /dev/null
@@ -1,86 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-#comp-Search-Build #body {
-  position: relative;
-}
-
-#editquery, #editsearches{
-  position: absolute;
-  right: 1em;
-  width: 40%;
-}
-
-#editsearches {
-  top: 24em;
-}
-
-
-#pick-criteria {
-  width: 58%;
-}
-
-#comp-Search-Build .submit {
-  width: 58%;
-  border: none;
-  margin: 0;
-  padding: 0;
-}
-
-
-#sorting.titlebox {
-  width: 58%;
-  margin-top: 4em;
-}
-
-#formatbuttons .submit {
-  width: 100%;
-}
-
-.refresh {
-  float: left;
-}
diff --git a/share/html/NoAuth/css/3.5-default/ticket.css b/share/html/NoAuth/css/3.5-default/ticket.css
deleted file mode 100644
index 1b80a1e..0000000
--- a/share/html/NoAuth/css/3.5-default/ticket.css
+++ /dev/null
@@ -1,57 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-.ticket-info-cfs .label {
-    vertical-align: top;
-}
-
-.ticket-info-cfs ul {
-    margin: 0;
-    padding: 0;
-    margin-left: 0.5em;
-    list-style: none;
-}
diff --git a/share/html/NoAuth/css/3.5-default/titlebox.css b/share/html/NoAuth/css/3.5-default/titlebox.css
deleted file mode 100644
index ef228e4..0000000
--- a/share/html/NoAuth/css/3.5-default/titlebox.css
+++ /dev/null
@@ -1,158 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-.titlebox {
-    margin-bottom: 1em;
-}
-
-.titlebox .titlebox-content {
-    margin-top: -1px;
-    padding: 1em 2em 0.5em 2em;
-    margin: 0;
-    /*margin: 1em 2em 0.5em 2em;*/
-}
-
-.titlebox th { font-size: 0.8em; }
-
-%# TRS: I wish there was a more elegant way to do this... I essentially need to
-%# select all elements X that do NOT have element Y as a descendant... which I can
-%# fake with the child selector of CSS2, but IE is stupid and does not support that.
-
-% my @pages = qw(index Search-Build User-Prefs Approvals Admin-Users-Modify SelfService SelfService-Closed);
-% $m->callback(pages => \@pages, %ARGS);
-
-% for (@pages)
-% {
-#comp-<%$_%> .titlebox .titlebox-content,
-% }
-.titlebox .titlebox .titlebox-content
-{
-    background: #eee;
-    border-bottom: 1px solid #ccc;
-    border-right: 1px solid #ccc;
-    border-left: 0.5em solid #069;
-}
-
-#login-box .titlebox .titlebox-content
-{
-    background: none;
-    border: none;
-}
-
-.titlebox .titlebox-title {
-    position: relative;
-    font-weight: bold;
-    color: #930;
-    font-size: 1.2em;
-    padding: 0.2em 0 0.2em 4em;
-    border-bottom: 1px solid #069;
-}
-
-.titlebox .titlebox-title .right {
-    position: absolute;
-    top: 0.5em;
-    right: 1.5em;
-    font-size: 0.9em;
-    color: #888;
-}
-
-.titlebox .titlebox-title .right .selected { color: #930; }
-
-#body .titlebox .titlebox-title .right :link,
-#body .titlebox .titlebox-title .right :visited {
-    color: #888;
-}
-
-#body .titlebox .titlebox-title .right :link:hover,
-#body .titlebox .titlebox-title .right :visited:hover {
-    color: #930;
-}
-
-.titlebox .titlebox-title .widget a {
-  display: block;
-  margin: 0;
-  margin-top: 0.5em;
-  width: 20px;
-
-  background: url(<%RT->Config->Get('WebPath')%>/NoAuth/images/css/rollup-arrow.gif) no-repeat center center;
-
-  position: absolute;
-  top: -0.75em;
-  left: 0.15em;
-  float: left;
-
-  padding: 11px 0 0 0;
-}
-
-
-* html .titlebox .titlebox-title .widget a {
-    background-position: center 0.3em;
-    top: 0em;
-    left: -1.5em; 
-}
-
-.titlebox.rolled-up .titlebox-title .widget a {
-    background-image: url(<%RT->Config->Get('WebImagesURL')%>/css/rolldown-arrow.gif);
-}
-
-#body .titlebox .titlebox-title :link,
-#body .titlebox .titlebox-title :visited
-{
-    color: #930;
-    text-decoration: none;
-}
-
-#body .titlebox .titlebox-title :link:hover,
-#body .titlebox .titlebox-title :visited:hover
-{
-    text-decoration: underline;
-}
-
-.titlebox .titlebox-title .left {
-    position: relative;
-}
-
diff --git a/share/html/NoAuth/css/3.5-default/transactions.css b/share/html/NoAuth/css/3.5-default/transactions.css
deleted file mode 100755
index eeb840e..0000000
--- a/share/html/NoAuth/css/3.5-default/transactions.css
+++ /dev/null
@@ -1,146 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
-%#                                          <jesse at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-.ticket-transaction {
-    border-bottom: 1px solid #ddd;
-    border-right: 3px solid #069;
-}
-
-#ticket-history .ticket-transaction {
-    border-bottom-color: #ccc;
-}
-
-.ticket-transaction.even {
-    background: #eee;
-}
-
-.ticket-transaction .date {
-    font-size: 0.9em;
-    width: 10em;
-}
-
-.ticket-transaction .description {
-    font-weight: bold;
-    font-size: 0.9em;
-    text-align: left;
-}
-
-.ticket-transaction .actions {
-    text-align: right;
-    font-weight: bold;
-}
-
-.ticket-transaction .type {
-    background: #888;
-    width: 1.2em;
-    color: white;
-    text-align: center;
-    font-size: 1em;
-}
-
-#body .ticket-transaction .type :link,
-#body .ticket-transaction .type :visited
-{
-    color: white;
-    font-weight: normal;
-}
-
-.ticket-transaction.basics { border-color: #b32; }
-.ticket-transaction.basics .type { background: #b32; }
-.ticket-summary .ticket-info-basics .titlebox-content { border-left: 0.5em solid #b32; }
-
-.ticket-transaction.people { border-color: #48c; }
-.ticket-transaction.people .type { background: #48c; }
-.ticket-summary .ticket-info-people .titlebox-content { border-left: 0.5em solid #48c; }
-
-%# light green - #ad8
-.ticket-transaction.links { border-color: #316531; }
-.ticket-transaction.links .type { background: #316531; }
-.ticket-summary .ticket-info-links .titlebox-content  { border-left: 0.5em solid #316531; }
-
-%# orange - #d71
-.ticket-transaction.dates { border-color: #633063; }
-.ticket-transaction.dates .type { background: #633063; }
-.ticket-summary .ticket-info-dates .titlebox-content  { border-left: 0.5em solid #633063; }
-
-.ticket-transaction.message { border-color: #069; }
-.ticket-transaction.message .type { background: #069; }
-
-.ticket-transaction.other { border-color: #888; }
-
-.ticket-transaction td .message-header-value {
-    padding: 0;
-}
-
-.ticket-transaction td .message-header-key {
-    padding: 0 1em 0 1.5em;
-    font-weight: bold;
-}
-
-.ticket-transaction .downloadattachment {
-    float: right;
-    font-size: 0.9em;
-    text-align: right;
-}
-
-.ticket-transaction .messagebody {
-    clear: both;
-    padding-left: 3em;
-    padding-bottom: 1em;
-}
-
-%# Message stanza colors
-.message-stanza-depth-0 { color: #000; }
-.message-stanza-depth-1 { color: #600; }
-.message-stanza-depth-2 { color: #060; }
-.message-stanza-depth-3 { color: #006; }
-.message-stanza-depth-4 { color: #c00; }
-.message-stanza-depth-5 { color: #0c0; }
-.message-stanza-depth-6 { color: #00c; }
-.message-stanza-depth-7 { color: #f00; }
-.message-stanza-depth-8 { color: #0f0; }
-.message-stanza-depth-9 { color: #00f; }

commit cea02dd79c8e7f2711225ec92417c13831e9d895
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 15:28:12 2010 -0400

    import the new aileron theme (currently a clone of web2)

diff --git a/etc/RT_Config.pm.in b/etc/RT_Config.pm.in
index 814a70a..f83ad71 100755
--- a/etc/RT_Config.pm.in
+++ b/etc/RT_Config.pm.in
@@ -836,10 +836,7 @@ Set($StatementLog, undef);
 This determines the default stylesheet the RT web interface will use.
 RT ships with several themes by default:
 
-  web2            The totally new, default layout for RT 3.8
-  3.5-default     RT 3.5 and 3.6 original layout
-  3.4-compat      A 3.4 compatibility stylesheet to make RT look
-                  (mostly) like 3.4
+  web2            The default layout for RT 3.8
 
 This value actually specifies a directory in F<share/html/NoAuth/css/>
 from which RT will try to load the file main.css (which should
diff --git a/lib/RT/Config.pm b/lib/RT/Config.pm
index 1a3932f..b1c1562 100644
--- a/lib/RT/Config.pm
+++ b/lib/RT/Config.pm
@@ -195,7 +195,7 @@ our %META = (
         WidgetArguments => {
             Description => 'Theme',                  #loc
             # XXX: we need support for 'get values callback'
-            Values => [qw(3.5-default 3.4-compat web2)],
+            Values => [qw(web2 aileron)],
         },
     },
     UseSideBySideLayout => {
diff --git a/share/html/NoAuth/css/aileron/InHeader b/share/html/NoAuth/css/aileron/InHeader
new file mode 100644
index 0000000..9dd7cad
--- /dev/null
+++ b/share/html/NoAuth/css/aileron/InHeader
@@ -0,0 +1,55 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+<!--[if lt IE 8]>
+<link rel="stylesheet" href="<%RT->Config->Get('WebPath')%>/NoAuth/css/aileron/msie.css" type="text/css" media="all" />
+<![endif]-->
+<script type="text/javascript">
+jQuery(document).ready(function(){ jQuery("#app-nav.toplevel").addClass('sf-menu sf-js-enabled sf-shadow').superfish(); });
+jQuery(document).ready(function(){ jQuery("#page-menu.toplevel").addClass('sf-menu sf-js-enabled sf-shadow').superfish(); });
+jQuery(document).ready(function(){ jQuery("#actions-menu.toplevel").addClass('sf-menu sf-js-enabled sf-shadow').superfish(); });
+</script>
diff --git a/share/html/NoAuth/css/aileron/base.css b/share/html/NoAuth/css/aileron/base.css
new file mode 100644
index 0000000..87ec64d
--- /dev/null
+++ b/share/html/NoAuth/css/aileron/base.css
@@ -0,0 +1,62 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+a {
+  color: #000;
+  text-decoration: none;
+}
+
+
+a:visited {
+    color: #666;
+}
+
+a:hover  {
+  text-decoration: underline;
+}
+
+textarea:focus, input:focus {   background-color: #ffd; }
diff --git a/share/html/NoAuth/css/aileron/boxes.css b/share/html/NoAuth/css/aileron/boxes.css
new file mode 100644
index 0000000..6445828
--- /dev/null
+++ b/share/html/NoAuth/css/aileron/boxes.css
@@ -0,0 +1,185 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+.titlebox {
+ border-left: 1px solid #ccc;
+ border-top: 1px solid #ccc;
+ background-color: #efefef;
+ padding-top: 1em;
+ margin-top: 1em;
+ margin-left: 1em;
+ -moz-border-radius: 0.5em;
+ -webkit-border-radius: 0.5em;
+ margin-bottom: 2em;
+ border-bottom: 2px solid #aaa;
+ border-right: 2px solid #aaa;
+ padding-right: 1em;
+}
+
+* html .titlebox {
+ border-top: none;
+ border-left: none;
+}
+
+.titlebox .titlebox {
+
+ background-color: #ffffff;
+ margin-top: 1em;
+ -moz-border-radius: 0.5em;
+ -webkit-border-radius: 0.5em;
+ margin-right: 0.25em;
+
+}
+
+
+.titlebox {
+ margin-left: 0em;
+ margin-right: 0em;
+ min-height: 1.25em;
+
+}
+
+
+
+.titlebox .titlebox-title {
+ position: relative;
+ margin-top: -1.5em;
+ padding-bottom: 0.25em;
+ padding-left: 1em;
+ margin-right: -1em;
+
+}
+
+.titlebox .titlebox-title a {
+ text-decoration: none;
+ color: black;
+
+}
+
+.titlebox .titlebox-title a:hover {
+ text-decoration: underline;
+
+}
+
+.titlebox .titlebox-title .left {
+    font-weight: bold;
+    background: #ccc;
+    margin-left: 0.75em;
+    padding:0.5em;
+    padding-left: 0.75em;
+    padding-right: 0.75em;
+    -moz-border-radius: 0.5em;
+    -webkit-border-radius: 0.5em;
+    border-bottom: 2px solid #aaa;
+    border-right: 2px solid #aaa;
+
+
+}
+
+.titlebox .titlebox-title .right-empty {
+ display:none;
+}
+
+.titlebox .titlebox-title .right {
+  position: absolute;
+   right: 0;
+   top: 0.5em;
+  font-size: 0.9em;
+  background: #dedede;
+  border-left: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+ padding-right: 0.4em;
+ padding-left: 0.4em;
+ padding-bottom: 0.2em;
+ padding-top: 0.5em;
+ -moz-border-radius-bottomleft: 0.25em;
+ -webkit-border-bottom-left-radius: 0.25em;
+
+
+ -moz-border-radius-topright: 0.25em;
+ -webkit-border-top-right-radius: 0.25em;
+
+}
+
+.titlebox .titlebox-title .right a,
+.titlebox .titlebox-title .right a:visited {
+ color: #000;
+}
+
+.titlebox .titlebox-content {
+ padding-top: 0.5em;
+ padding-left: 1em;
+ padding-bottom: 1em;
+
+}
+
+.titlebox .titlebox-title .widget a {
+  display: block;
+  margin: 0;
+  margin-top: 0.5em;
+  width: 20px;
+
+  background: url(<%RT->Config->Get('WebPath')%>/NoAuth/images/css/rollup-arrow.gif) no-repeat center center;
+
+  position: absolute;
+  top: -1em;
+  left: 0.15em;
+  float: left;
+
+  padding: 11px 0 0 0;
+  overflow: hidden;
+}
+
+* html .titlebox .titlebox-title .widget a {
+    background-position: center 0.3em;
+    top: 0em;
+    left: -1.5em;
+}
+
+.titlebox.rolled-up .titlebox-title .widget a {
+    background-image: url(<%RT->Config->Get('WebPath')%>/NoAuth/images/css/rolldown-arrow.gif);
+}
diff --git a/share/html/NoAuth/css/aileron/images/dhandler b/share/html/NoAuth/css/aileron/images/dhandler
new file mode 100644
index 0000000..6ec9dea
--- /dev/null
+++ b/share/html/NoAuth/css/aileron/images/dhandler
@@ -0,0 +1,8 @@
+<%INIT>
+use File::Basename;
+my $arg = $m->dhandler_arg;
+my $file = dirname($m->current_comp->source_file) . '/source/'. $arg;
+RT::Interface::Web->SendStaticFile( File => $file );
+
+$m->abort;
+</%INIT>
diff --git a/share/html/NoAuth/css/aileron/images/source/background-gradient.png b/share/html/NoAuth/css/aileron/images/source/background-gradient.png
new file mode 100644
index 0000000..9c126c7
Binary files /dev/null and b/share/html/NoAuth/css/aileron/images/source/background-gradient.png differ
diff --git a/share/html/NoAuth/css/aileron/layout.css b/share/html/NoAuth/css/aileron/layout.css
new file mode 100644
index 0000000..3b5aea3
--- /dev/null
+++ b/share/html/NoAuth/css/aileron/layout.css
@@ -0,0 +1,179 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+/* body */
+
+body {
+    padding:0;
+    margin:0;
+    background: #547CCC url(<%RT->Config->Get('WebPath')%>/NoAuth/css/web2/images/background-gradient.png) top left repeat-x ;
+    font-family: arial, helvetica, sans-serif;
+    color: #000000;
+}
+
+div#body {
+    position: relative;
+    padding: 1em;
+    padding-right: 0.5em;
+    padding-top: 1.8em;
+    -moz-border-radius-topleft: 0.5em;
+    -webkit-border-top-left-radius: 0.5em;
+    -moz-border-radius-bottomleft: 0.5em;
+    -webkit-border-bottom-left-radius: 0.5em;
+    margin-left: 1em;
+    margin-top: 3em;
+    margin-right: 0;
+    margin-bottom: 0em;
+    min-height: 10%;
+    background: #fff;
+    border-top: 2px solid #ccc;
+    border-left: 2px solid #ccc;
+    z-index:1;
+
+
+}
+
+div#footer {
+ position: absolute;
+ right: 0;
+ text-align: right;
+ font-size: 0.9em;
+ margin-top: 2em;
+ background: #fff;
+ margin-bottom: 0;
+ padding-left: 3em;
+ padding-right: 1em;
+ border-top: 2px solid #aaa;
+ border-left: 2px solid #aaa;
+ -moz-border-radius-topleft: 0.5em;
+ -webkit-border-top-left-radius: 0.5em;
+ -moz-border-radius-bottomleft: 0.5em;
+ -webkit-border-bottom-left-radius: 0.5em;
+}
+
+div#footer #time {
+    display: none ;
+}
+
+div#footer #bpscredits {
+ text-align: right;
+ background: url(<%RT->Config->Get('WebPath')%>/NoAuth/images/bpslogo.png) no-repeat top right;
+ padding-top: 4em;
+}
+
+
+/* logo stuff */
+
+div#logo {
+    position: absolute;
+    right: 2px;
+    top: 0;
+    height: 2.3em;
+}
+
+div#logo a img {
+    border: 0;
+    height: 100% !important;
+    width: auto !important;
+    float: right;
+}
+
+div#logo .rtname {
+    position: relative;
+    font-weight: bold;
+    text-align: center;
+    top: 0.7em;
+    padding-right: 1em;
+    float:left;
+}
+
+
+div#quickbar, div#logo {
+    font-size: 0.9em;
+}
+div#quickbar a, div#logo a {
+    color: #000;
+}
+
+
+div#quickbar {
+ background: #eaeaea;
+ padding-top: 1em;
+ padding-left: 1em;
+ padding-bottom: 0.5em;
+ height: 1em;
+ border-bottom: 1px solid #ccc;
+
+}
+div#quick-personal {
+    float: left;
+    margin-left: 1em;
+}
+
+
+div#header h1 {
+ position: absolute;
+ left: 0.5em;
+ right: 20em;
+ top: 1.6em;
+ overflow: hidden;
+ height: 1em;
+ font-size: 1.4em;
+ margin-top: 0.4em;
+ padding: 0.25em;
+ color: #fff;
+}
+
+/* in multi-column layouts, make sure we have an internal gutter */
+
+tr .boxcontainer {
+      padding-right: 1em;
+}
+
+tr .boxcontainer:last-child {
+      padding-right: 0;
+}
diff --git a/share/html/NoAuth/css/aileron/main.css b/share/html/NoAuth/css/aileron/main.css
new file mode 100644
index 0000000..995db8b
--- /dev/null
+++ b/share/html/NoAuth/css/aileron/main.css
@@ -0,0 +1,61 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+% $m->callback(CallbackName => 'Begin');
+
+ at import "../base/main.css";
+
+ at import "base.css";
+ at import "layout.css";
+ at import "nav.css";
+ at import "boxes.css";
+ at import "ticket-lists.css";
+ at import "ticket-search.css";
+ at import "ticket.css";
+ at import "misc.css";
+
+% $m->callback(CallbackName => 'End');
diff --git a/share/html/NoAuth/css/aileron/misc.css b/share/html/NoAuth/css/aileron/misc.css
new file mode 100644
index 0000000..fe3bf6f
--- /dev/null
+++ b/share/html/NoAuth/css/aileron/misc.css
@@ -0,0 +1,60 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+ at import "../base/misc.css";
+
+.comment {
+ padding-left: 0.5em;
+ color: #999;
+
+}
+
+#comp-Ticket-ShowEmailRecord #body {
+    margin-left: 1em;
+    margin-top: 1em;
+    overflow: auto;
+}
diff --git a/share/html/NoAuth/css/aileron/msie.css b/share/html/NoAuth/css/aileron/msie.css
new file mode 100644
index 0000000..8d5b5f2
--- /dev/null
+++ b/share/html/NoAuth/css/aileron/msie.css
@@ -0,0 +1,245 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+div#body {
+    left: 0.25em;
+    height: 100%;
+    top: 1em;
+
+}
+
+
+#footer {
+    padding: 1em;
+}
+
+
+div#header h1 {
+ position: absolute;
+ left: 7.25em;
+ overflow: hidden;
+ height: 1em;
+ font-size: 1.4em;
+ margin-top: 0.4em;
+ right: 23.5em;
+ padding: 0.25em;
+}
+
+
+#topactions {
+    top: 4.1em;
+    width: auto;
+}
+.topaction form * {
+    vertical-align: top;
+}
+
+.topaction form button, .topaction form input {
+   height: 2em;
+}
+
+.topaction form input.field {
+   height: 1.6em;
+}
+
+.topaction .select-queue {
+    margin-top: 0.2em;
+}
+
+div#page-navigation ul#actions-menu {
+    margin-top: -2.9em;
+    margin-right: -0.2em;
+    border-top: 1px solid #ccc;
+    border-right: none;
+}
+
+
+div#page-navigation {
+    position: absolute;
+    top: 6.2em;
+    height: 1.8em;
+    background: #fff;
+    border-top: 2px solid #ccc;
+}
+
+
+
+div#page-navigation ul#page-menu {
+    margin-top: -2.5em;
+    margin-left: 4em;
+    background: none;
+    border: none;
+}
+
+
+div#quickbar { height: 1.2em;
+
+
+}
+
+#pick-criteria td.label select {
+    width: 10em;
+}
+
+
+#editquery {
+  margin-top: 0.2em;
+  width: 39%;
+  left: 60%;
+}
+
+div#nav li.first {
+    margin-top: 0.75em;
+    border-top: none;
+}
+div#nav ul ul li.first {
+    border-top: 1px solid #cccccc;
+    margin-top: 0.25em;
+}
+
+div#nav li.last {
+    border-bottom: none;
+    padding-bottom: 0;
+    margin-bottom: 0;
+}
+
+
+.ticket-transaction .type a { font-weight: normal; text-decoration: none; color: #fff; }
+
+
+.titlebox {
+ border-top: none;
+ border-left: none;
+}
+
+.titlebox .titlebox-title .left {
+    padding: 0.25em;
+    padding-left: 0.5em;
+}
+
+.titlebox {
+}
+
+.titlebox .titlebox-title .right {
+    border-right: 2px solid #aaa;
+
+}
+
+
+.titlebox .titlebox-content {
+    padding-top: 2.2em;
+}
+
+.titlebox table.collection-as-table, .titlebox table.queue-summary {
+    width: 95%;
+    padding: 0.5em;
+    margin-left: auto;
+    margin-right: auto;
+}
+
+th.collection-as-table {
+    padding: 0.25em;
+}
+
+table.queue-summary td, td.collection-as-table {
+    padding: 0.25em;
+}
+
+ .titlebox-title {
+    position: relative;
+}
+
+.titlebox-title .widget {
+    position: absolute;
+    top: -0.25em;
+    left: -0.25em;
+
+}
+.titlebox-title .left {
+    position: absolute;
+    top: -0.75em;
+    left: 0.5em;
+}
+
+
+.titlebox .titlebox-title .right{
+    top: 0.2em;
+    right: -0.2em;
+}
+
+/* nested things. like the ticket dates tab */
+.titlebox .titlebox .titlebox-title .right{
+    top: 0.25em;
+}
+
+.combobox {
+    float: left;
+}
+
+.combobox .combo-button {
+    color: ButtonText;
+    padding: 0;
+}
+
+.combobox .combo-list {
+    margin-top:0.5em;
+    margin-left: -0.2em;
+}
+
+#pick-criteria td.label {
+     width: auto;
+}
+
+#pick-criteria td.operator {
+  width: 7.5em;
+}
+
+.plain-text-white-space {
+  word-wrap: break-word;       /* Internet Explorer 5.5+ */
+  white-space: pre;   /* IE only hack to re-specify in addition to
+  word-wrap  */
+}
diff --git a/share/html/NoAuth/css/aileron/msie6.css b/share/html/NoAuth/css/aileron/msie6.css
new file mode 100644
index 0000000..8236820
--- /dev/null
+++ b/share/html/NoAuth/css/aileron/msie6.css
@@ -0,0 +1,87 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+.topaction .select-queue {
+    margin-top: 0;
+}
+
+div#page-navigation ul#page-menu {
+    margin-top: -3.2em;
+}
+
+.titlebox-title .widget {
+    top: -1em;
+    left: 0.5em;
+
+}
+.titlebox .titlebox-title .right{
+    position: absolute;
+    top: 0.25em;
+    right: 1em;
+}
+
+/* nested things. like the ticket dates tab */
+.titlebox .titlebox .titlebox-title .right{
+    right: 1.3em;
+}
+
+#login-box .titlebox .titlebox-title .right {
+    margin-top: -0.1em;
+    right: 0em;
+}
+
+.titlebox
+{
+    height: auto !important;
+    height: 1.25em;
+}
+
+
+.ticket-transaction .messagebody img {
+    /* ie6 does not support max-width */
+    width: expression(this.width > 401 ? 400 : true);
+}
diff --git a/share/html/NoAuth/css/aileron/nav.css b/share/html/NoAuth/css/aileron/nav.css
new file mode 100644
index 0000000..d4f0bc4
--- /dev/null
+++ b/share/html/NoAuth/css/aileron/nav.css
@@ -0,0 +1,137 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+.sf-menu {
+    width: 100%;
+}
+
+.sf-menu a {
+    padding-top: 0.5em;
+    padding-bottom: 0.5em;
+}
+.sf-menu li:hover {
+    background-color: #fff;
+}
+
+.sf-menu li, .sf-menu li li, .sf-menu li li li {
+    background-color: #eee;
+}
+
+#main-navigation {
+    position: absolute;
+    top: 0;
+    left: 0;
+    left: auto;
+    z-index: 9999;
+}
+
+#page-navigation {
+    position: absolute;
+    top: 6.8em;
+    right: 0em;
+    left: auto;
+    z-index: 9995;
+    font-size: 0.8em;
+}
+
+#page-navigation .sf-menu li, #page-navigation .sf-menu li li, #page-navigation .sf-menu li li li {
+    background-color: #fff;
+}
+
+#page-navigation .sf-menu a:visited, #page-navigation .sf-menu a {
+    border: none;
+}
+
+
+#topactions {
+ position: absolute;
+ background: transparent;
+ top: 3.2em;
+ right: 0.7em;
+ width: auto;
+ min-width: 42em;
+ font-size: 0.9em;
+ z-index: 99;
+}
+
+#topactions form * {
+    vertical-align: top;
+}
+
+#topactions button, #topactions select, #topactions input{
+ padding-top: 0em;
+ padding-bottom: 0em;
+ width: 8em;
+
+}
+
+#topactions form {
+ display: block;
+
+}
+
+#topactions #GotoTicket, #topactions #CreateTicketInQueue {
+ text-align: right;
+
+}
+#topactions #simple-search {
+ float: right;
+}
+
+#topactions #simple-search .field{
+ margin-left: 1em;
+ color: #787;
+ }
+
+#topactions #simple-search .field:focus {
+ color: #000;
+ }
+
+#topactions #GotoTicket {
+ text-align: right;
+
+}
diff --git a/share/html/NoAuth/css/aileron/ticket-lists.css b/share/html/NoAuth/css/aileron/ticket-lists.css
new file mode 100644
index 0000000..bbc6be4
--- /dev/null
+++ b/share/html/NoAuth/css/aileron/ticket-lists.css
@@ -0,0 +1,236 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+table.queue-summary, table.collection-as-table {
+  margin-top: 0.75em;
+  font-size: 0.9em;
+  border: 1px solid #aaa;
+  border-bottom: 2px solid #999;
+  border-right: 2px solid #999;
+  border-spacing: 0;
+  width: 100%;
+
+}
+
+table.queue-summary tr>*:first-child {
+ padding-left: 1em;
+
+}
+
+
+table.queue-summary tr>*:last-child {
+ padding-right: 1em;
+
+}
+
+table.queue-summary a, table.collection-as-table a  {
+  font-weight: bold;
+}
+
+
+table.collection-as-table th.collection-as-table {
+  background: #ddd;
+ font-size: 0.9em;
+  margin-bottom: 0.5em;
+  text-align: left;
+
+}
+
+
+table.queue-summary th.collection-as-table {
+ font-size: 0.9em;
+  margin-bottom: 0.5em;
+  text-align: right;
+
+}
+
+table.queue-summary th.collection-as-table:first-child {
+  text-align: left;
+
+}
+
+
+tr.collection-as-table+tr.collection-as-table th {
+ border-bottom: 2px solid grey;
+
+}
+
+
+
+
+table.queue-summary td {
+  background: #efefef;
+  border-bottom: 1px solid #ccc;
+}
+
+
+
+tr.evenline td {
+  background: #eee;
+}
+
+tr.oddline td {
+  background: #fff;
+
+}
+
+tr.evenline td, tr.oddline td {
+ padding-top: 0.5em;
+}
+
+
+
+tr.evenline+tr.evenline td, tr.oddline+tr.oddline td{
+ padding-top: 0;
+ border: none;
+}
+
+
+
+table.collection-as-table td:first-child,
+table.collection-as-table th:first-child {
+  padding-left: 1em;
+}
+
+table.collection-as-table td:last-child, table.collection-as-table th:last-child {
+  padding-right: 1em;
+}
+
+th.collection-as-table , td.collection-as-table {
+ padding-right: 0.5em;
+}
+
+.pagenum.a:hover, .paging a.nav:hover{
+text-decoration: underline;
+}
+
+
+.pagenum *, .paging a.nav{
+padding: .5em;
+}
+
+.currentpage{
+text-decoration: none;
+font-weight: bold;
+background: #eee;
+}
+
+div.paging{
+text-align: center;
+padding-bottom: 1em;
+}
+
+
+/* full-page ticket lists */
+#body>table.collection-as-table {
+    margin-bottom: 2em;
+
+}
+
+.chart.image {
+    margin-top: -1em;
+    padding-right: 2em;
+    float: left;
+    clear: both;
+}
+
+.chart-wrapper {
+    display: block;
+    width: auto;
+}
+
+.chart-wrapper .collection-as-table {
+    width: auto;
+    font-size: 1em;
+}
+
+.chart-wrapper .collection-as-table th.collection-as-table {
+    text-align: center;
+    padding: 0.5em;
+    padding-right: 1em;
+    padding-left:  1em;
+}
+
+.chart-wrapper .collection-as-table tr.total td {
+    border-top: 1px solid #ccc;
+}
+
+.chart-wrapper .collection-as-table td.value {
+    padding-left: 0.5em;
+}
+
+.chart-wrapper .query {
+    clear: both;
+    text-align: center;
+    font-size: 1.2em;
+    padding: 1em;
+}
+
+.chart-wrapper .collection-as-table .label {
+    font-weight: bold;
+}
+
+
+.chart-wrapper .query .label {
+    font-weight: bold;
+}
+
+.chart-meta {
+    padding-top: 2em;
+    border-top: 1px solid #ccc;
+}
+
+.chart-meta .chart-type {
+    display: inline-block;
+    float: left;
+    padding-right: 2em;
+    clear: both;
+}
+
+.chart-meta .saved-search {
+    display: inline-block;
+}
diff --git a/share/html/NoAuth/css/aileron/ticket-search.css b/share/html/NoAuth/css/aileron/ticket-search.css
new file mode 100644
index 0000000..a2c0461
--- /dev/null
+++ b/share/html/NoAuth/css/aileron/ticket-search.css
@@ -0,0 +1,245 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+#comp-Search-Build #body {
+    position: relative;
+}
+
+#pick-criteria select {
+    width: 8em;
+}
+
+#pick-criteria tr {
+    height: 1.5em;
+}
+
+#pick-criteria td.label {
+    font: message-box;
+    padding-right: 0.5em;
+    width: 11em;
+}
+
+#pick-criteria td.label * {
+ width: 8.5em;
+}
+
+#pick-criteria td.label select {
+  text-align: right;
+}
+
+#pick-criteria td.operator {
+ padding-right: 0.5em;
+ text-align: left;
+ vertical-align: bottom;
+ width: 7em;
+}
+
+#pick-criteria td.operator select {
+ text-align: right;
+}
+
+#pick-criteria td.value input,
+#pick-criteria td.value select {
+ width: 11em;
+}
+
+#pick-criteria td.value #ValueOfDate {
+ width: 11em;
+}
+
+
+#pick-criteria td.value #ValueOfTime {
+ width: 4em;
+
+}
+
+#pick-criteria td.value #ValueOfTime-TimeUnits{
+ width: 5.5em;
+}
+
+#pick-criteria td.value {
+ padding-right: 0.5em;
+ text-align: left;
+ font: message-box;
+}
+
+#editquery, #editsearches{
+  position: absolute;
+  margin-top: 0.2em;
+  right: 1em;
+  left: 60%;
+  top: 1em;
+/*  margin-top: -1em; */
+}
+
+#editquery {
+   top: 1.3em;
+}
+
+
+#editsearches {
+  top: 24em;
+}
+
+
+#pick-criteria {
+ width: 58%;
+ padding-top: 0em;
+ margin-top: 0em;
+}
+
+#pick-criteria .titlebox-content {
+ overflow-x: auto;
+}
+
+#BuildQuery .submit {
+ width: 58%;
+}
+
+
+#sorting.titlebox {
+ width: 55%;
+ padding-right: 1em;
+}
+
+#display-options .submit {
+ width: 100%;
+}
+
+
+
+.search-result-views {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin-top: -2px;
+ margin-right: 0em;
+ padding: 0.25em;
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+ background-color: #ccc;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+ -moz-border-radius-bottomleft: 0.5em;
+ -webkit-border-bottom-left-radius: 0.5em;
+}
+
+
+
+.search-result-views li {
+
+ display: inline;
+}
+
+.search-result-views li:after  {
+ content: " \00b7 ";
+}
+
+.search-result-views li:last-child:after  {
+ content: "";
+
+}
+
+.edit-saved-searches .label {
+    display: inline-block;
+    width: 10em;
+    font-weight: bold;
+}
+
+span#display-options {
+    display: block;
+    padding-top: 2em;
+    margin-top: 2em;
+    border-top: 1px solid #ccc;
+    clear: both;
+}
+
+span#display-options .titlebox#sorting {
+    float: left;
+    width: auto;
+    margin-right: 2em;
+    min-width: 35%;
+}
+
+span#display-options .titlebox#columns {
+    float: left;
+}
+
+span#display-options .titlebox#columns table.edit-columns td {
+    padding: 0.5em;
+}
+
+span#display-options .titlebox#columns table.edit-columns div.row {
+    width: 9em;
+}
+span#display-options .titlebox#columns table.edit-columns span.label {
+    width: 2em;
+}
+
+span#display-options .titlebox#columns table.edit-columns span.value input,
+span#display-options .titlebox#columns table.edit-columns span.value select {
+    width: 7em;
+    padding: 0;
+}
+
+span#display-options .titlebox#columns table.edit-columns span.value {
+    display: inline-block;
+    width:7em;
+}
+
+#BuildQuery #formatbuttons.submit{
+    width: 85%;
+}
+
+.refresh {
+    float: left;
+}
+
+/* Force some widget to fit at max parent box */
+#HomeRefreshInterval, #SavedSearchLoad, #SavedSearchOwner {
+    max-width: 100%;
+}
diff --git a/share/html/NoAuth/css/aileron/ticket.css b/share/html/NoAuth/css/aileron/ticket.css
new file mode 100644
index 0000000..fae607e
--- /dev/null
+++ b/share/html/NoAuth/css/aileron/ticket.css
@@ -0,0 +1,286 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+div#ticket-history div.ticket-transaction {
+ border-top: 1px solid #ccc;
+ padding-bottom: 0.25em;
+
+}
+
+div#ticket-history div.odd {
+ background-color: #fff;
+}
+
+div#ticket-history {
+
+ margin-top: 0.75em;
+ border-left: 1px solid #ccc;
+
+ border-right: 2px solid #999;
+  border-bottom: 2px solid #999;
+
+}
+
+.ticket-transaction div.metadata span.actions {
+ position: absolute;
+ right: 2.3em;
+ padding: 0em;
+ background: #ccc;
+ text-align: right;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+ color: #ccc;
+ -moz-border-radius-bottomleft: 0.5em;
+ -webkit-border-bottom-left-radius: 0.5em;
+ white-space: nowrap;
+}
+
+.ticket-transaction div.metadata  span.type {
+ text-align: center;
+ float: left;
+ margin: 0.25em 0.70em 0.25em 0.25em;
+ width: 1em;
+ height: 1.25em;
+ padding: 0.75em 0 0 0;
+ border-right: 1px solid #999;
+ border-bottom: 1px solid #999;
+ -moz-border-radius: 0.25em;
+ -webkit-border-bottom-right-radius: 0.25em;
+}
+
+div#ticket-history span.type a {
+ color: #fff;
+}
+
+
+div#ticket-history span.date {
+ width: 10em;
+}
+
+
+div#ticket-history span.description {
+ margin-left: 1em;
+ font-weight: bold;
+}
+
+div#ticket-history span.time-taken {
+ margin-left: 1em;
+}
+
+div#ticket-history div.content {
+ padding-right: 1em;
+ padding-bottom: 0.7em;
+ font-size: 1.1em;
+ margin-left: 1.5em;
+}
+
+.plain-text-white-space {
+ white-space: pre-wrap;
+ font-family: monospace;
+}
+
+.ticket-transaction .messagebody {
+ font-size: 1em;
+ padding-left: 1em;
+ margin-top: 0.5em;
+ padding-top: 0.5em;
+ border-top: 1px solid #ccc;
+ /*overflow: auto; */
+ min-height: 2.5em;
+ /* To avoid overlapping of "downloadattachment" by messagebody */
+ clear: left;
+ word-wrap: break-word;
+}
+
+.ticket-transaction .messagebody img {
+ max-width: 100%;
+}
+
+div#ticket-history div.downloadattachment {
+float: right;
+clear: both;
+font-size: 0.9em;
+text-align: right;
+background: #ddd;
+padding: 0.5em;
+margin-left: 1em;
+
+border: 1px solid #ccc;
+border-right: 2px solid #aaa;
+border-bottom: 2px solid #aaa;
+margin-top: 0.5em;
+-moz-border-radius: 0.5em;
+-webkit-border-radius: 0.5em;
+
+}
+
+div#ticket-history div.downloadattachment .downloadcontenttype{
+color: #666;
+padding-right:0.25em;
+}
+
+
+div#ticket-history .message-header-key {
+  width: 7em;
+  font-weight: bold;
+  color: #666;
+}
+
+
+div#ticket-history .messagebody .messagebody{
+ font-size: 1em;
+ padding: 0;
+ border: 0;
+ margin: 0;
+}
+
+
+
+.ticket-transaction.basics .type { background: #b32; }
+.ticket-transaction.cfs .type { background: #b32; }
+.ticket-transaction.people .type { background: #48c; }
+.ticket-transaction.links .type { background: #316531; }
+.ticket-transaction.dates .type { background: #633063; }
+.ticket-transaction.message .type { background: #069; }
+.ticket-transaction.reminders .type { background: #369; }
+.ticket-transaction.other .type { background: #abc; }
+
+
+
+
+.ticket-info-cfs .titlebox-title .left { background-color: #b32; color: #fff;}
+.ticket-info-basics .titlebox-title .left { background-color: #b32;  color: #fff;}
+.ticket-info-people .titlebox-title .left { background-color: #48c;  color: #fff;}
+.ticket-info-requestor .titlebox-title .left { white-space: nowrap; background-color: #48c;  color: #fff;}
+.ticket-info-links .titlebox-title .left { background-color: #316531;  color: #fff;}
+.ticket-info-reminders .titlebox-title .left { background-color: #369;  color: #fff;}
+.ticket-info-dates .titlebox-title .left { background-color: #633063;  color: #fff;}
+.ticket-info-attachments .titlebox-title .left { background-color: #993366;  color: #fff;}
+
+
+.ticket-summary .titlebox-title .left a, .ticket-summary .titlebox-title .left a:visited { color: #fff;}
+
+.unread-messages .titlebox , .unread-messages .titlebox-title .left {
+  border: 1px solid #99a;
+  border-right: 2px solid #aab;
+  border-bottom: 2px solid #aab;
+
+}
+
+
+.unread-messages .titlebox {
+  background-color: #dde;
+}
+
+.unread-messages .titlebox-title .left {
+  background-color: #cce;
+}
+
+.ticket-inactive {
+  text-decoration: line-through;
+  color: #666
+}
+
+table.ticket-summary td.boxcontainer:first-child {
+  width: 50%;
+}
+
+/* Message quoting */
+
+.message-stanza-depth-1 {
+    color: #1a1aa6;
+}
+
+div.requestor-ticket-links {
+    text-align: left;
+    font-size: 0.8em;
+    padding-top: 0.25em;
+}
+
+.more-about-requestor-extra-field .label {
+    display: inline-block;
+    width: 8em;
+    font-weight: bold;
+    text-align: right;
+}
+
+.more-about-requestor-extra-field .value {
+    display: inline-block;
+}
+
+.ticket-info-requestor .more-about-requestor-extra,
+.ticket-info-requestor .comments-about-user,
+.ticket-info-requestor .more-about-requestor-tickets,
+.ticket-info-requestor .more-about-user-groups
+{
+    margin: 1em 0;
+}
+
+.ticket-info-requestor .comments-about-user .label,
+.ticket-info-requestor .more-about-user-groups .label,
+.ticket-info-requestor .more-about-requestor-tickets .label
+{
+    display: block;
+    font-weight: bold;
+    text-align: left;
+}
+
+.ticket-info-requestor .more-about-user-groups .value ul,
+.ticket-info-requestor .more-about-requestor-tickets ul
+{
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+
+/* textareas get to be bigger */
+.edit-custom-field.cftype-Text textarea,
+.edit-custom-field.cftype-Freeform input,
+.edit-custom-field.cftype-Wikitext textarea
+{
+    width: 100%;
+}

commit a71fba8602e8cbae9773db2e7d2876b05f0abcf5
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 15:28:30 2010 -0400

    remove superfish style info from core RT.
    
    It should be added by the theme

diff --git a/share/html/Elements/Menu b/share/html/Elements/Menu
index 3975119..ebc749c 100755
--- a/share/html/Elements/Menu
+++ b/share/html/Elements/Menu
@@ -46,7 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 
-<%" " x $depth%><ul<%$id ? ' id="'.$id.'"' : '' |n%><% $toplevel? ' class="sf-menu sf-js-enabled sf-shadow"' : '' |n %>>
+<%" " x $depth%><ul<%$id ? ' id="'.$id.'"' : '' |n%><% $toplevel? ' class="toplevel"' : '' |n %>>
 % for my $child ($menu->children) {
 %   my $item_id = lc(($parent_id? $parent_id."-" : "") .$child->key);
 %   $item_id =~ s/\s/-/g;

commit 131d3ee0560e95189ce127b6f816ce0a9f49148f
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 15:32:34 2010 -0400

    Removed some obsolete css

diff --git a/share/html/NoAuth/css/aileron/InHeader b/share/html/NoAuth/css/aileron/InHeader
index 9dd7cad..f9ed0ee 100644
--- a/share/html/NoAuth/css/aileron/InHeader
+++ b/share/html/NoAuth/css/aileron/InHeader
@@ -51,5 +51,4 @@
 <script type="text/javascript">
 jQuery(document).ready(function(){ jQuery("#app-nav.toplevel").addClass('sf-menu sf-js-enabled sf-shadow').superfish(); });
 jQuery(document).ready(function(){ jQuery("#page-menu.toplevel").addClass('sf-menu sf-js-enabled sf-shadow').superfish(); });
-jQuery(document).ready(function(){ jQuery("#actions-menu.toplevel").addClass('sf-menu sf-js-enabled sf-shadow').superfish(); });
 </script>
diff --git a/share/html/NoAuth/css/aileron/msie.css b/share/html/NoAuth/css/aileron/msie.css
index 8d5b5f2..d076ed1 100644
--- a/share/html/NoAuth/css/aileron/msie.css
+++ b/share/html/NoAuth/css/aileron/msie.css
@@ -90,14 +90,6 @@ div#header h1 {
     margin-top: 0.2em;
 }
 
-div#page-navigation ul#actions-menu {
-    margin-top: -2.9em;
-    margin-right: -0.2em;
-    border-top: 1px solid #ccc;
-    border-right: none;
-}
-
-
 div#page-navigation {
     position: absolute;
     top: 6.2em;
diff --git a/share/html/NoAuth/css/base/portlets.css b/share/html/NoAuth/css/base/portlets.css
index d88d74d..25e4796 100644
--- a/share/html/NoAuth/css/base/portlets.css
+++ b/share/html/NoAuth/css/base/portlets.css
@@ -61,11 +61,4 @@ table.dashboard {
 .quick-create input[type="text"], .quick-create textarea {
     width: 100%;
 
-} 
-    
-.reminders blockquote {
-    margin-top: 0.5em;
-    margin-bottom: 0.5em;
-    margin-left: 1em;
-    margin-right: 1em;
 }
diff --git a/share/html/NoAuth/css/print.css b/share/html/NoAuth/css/print.css
index e3babdf..b386157 100644
--- a/share/html/NoAuth/css/print.css
+++ b/share/html/NoAuth/css/print.css
@@ -78,7 +78,6 @@ div#header h1 {
 #quickbar,
 #nav,
 #header #page-menu,
-#header #actions-menu,
 #header #page-navigation,
 .titlebox .titlebox-title .widget,
 .ticket-info-links .titlebox-title .right,
diff --git a/share/html/NoAuth/css/web2/msie.css b/share/html/NoAuth/css/web2/msie.css
index ca768ad..21d8f11 100644
--- a/share/html/NoAuth/css/web2/msie.css
+++ b/share/html/NoAuth/css/web2/msie.css
@@ -90,14 +90,6 @@ div#header h1 {
     margin-top: 0.2em;
 }
 
-div#page-navigation ul#actions-menu {
-    margin-top: -2.9em;
-    margin-right: -0.2em;
-    border-top: 1px solid #ccc;
-    border-right: none;
-}
-
-
 div#page-navigation {
     position: absolute;
     top: 6.2em;

commit 8466fa781581cd68deaea3a8cb805b413a974e84
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 15:32:52 2010 -0400

    style the page menus in the web2-style theme

diff --git a/share/html/NoAuth/css/web2/InHeader b/share/html/NoAuth/css/web2/InHeader
index 9127892..7196a34 100644
--- a/share/html/NoAuth/css/web2/InHeader
+++ b/share/html/NoAuth/css/web2/InHeader
@@ -53,7 +53,5 @@
 <link rel="stylesheet" href="<%RT->Config->Get('WebPath')%>/NoAuth/css/web2/msie6.css" type="text/css" media="all" />
 <![endif]-->
 <script type="text/javascript">
-jQuery(document).ready(function(){ jQuery("#app-nav").superfish(); });
-jQuery(document).ready(function(){ jQuery("#page-menu").superfish(); });
-jQuery(document).ready(function(){ jQuery("#actions-menu").superfish(); });
+jQuery(document).ready(function(){ jQuery("#page-menu.toplevel").addClass('sf-menu sf-js-enabled sf-shadow').superfish(); });
 </script>

commit 5127f5eab3feb1a7d72cda75409d8c7f9ad69975
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 17:23:27 2010 -0400

    Move our unique id per list item to the list item

diff --git a/share/html/Elements/Menu b/share/html/Elements/Menu
index ebc749c..265840a 100755
--- a/share/html/Elements/Menu
+++ b/share/html/Elements/Menu
@@ -50,9 +50,9 @@
 % for my $child ($menu->children) {
 %   my $item_id = lc(($parent_id? $parent_id."-" : "") .$child->key);
 %   $item_id =~ s/\s/-/g;
-<%" " x ($depth+1)%><li>\
+<%" " x ($depth+1)%><li id="<%$item_id%>" >\
 % if ($child->link_item) {
-<a id="<%$item_id%>" <% $child->path ? ' href="'.RT->Config->Get('WebPath').$child->path.'"' : '' |n%>>\
+<a <% $child->path ? ' href="'.RT->Config->Get('WebPath').$child->path.'"' : '' |n%>>\
 % }
 % if ($child->escape_title) {
 <%$child->title%>\

commit 2b8afc33e07f8486370f36cedb6fd85ec215abfa
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 17:23:43 2010 -0400

    yank the preferences/logout menu up out to its own dom node for the web2 style

diff --git a/share/html/NoAuth/css/web2/InHeader b/share/html/NoAuth/css/web2/InHeader
index 7196a34..78134f7 100644
--- a/share/html/NoAuth/css/web2/InHeader
+++ b/share/html/NoAuth/css/web2/InHeader
@@ -53,5 +53,12 @@
 <link rel="stylesheet" href="<%RT->Config->Get('WebPath')%>/NoAuth/css/web2/msie6.css" type="text/css" media="all" />
 <![endif]-->
 <script type="text/javascript">
-jQuery(document).ready(function(){ jQuery("#page-menu.toplevel").addClass('sf-menu sf-js-enabled sf-shadow').superfish(); });
+jQuery(document).ready(function(){
+    jQuery("#page-menu.toplevel").addClass('sf-menu sf-js-enabled sf-shadow').superfish();
+    jQuery("#app-nav.toplevel").addClass('sf-menu sf-vertical sf-js-enabled sf-shadow').superfish();
+    jQuery("#quick-personal").append('<ul id="prefs-menu"></ul>');
+    jQuery("#preferences").detach().appendTo(jQuery("#prefs-menu"));
+    jQuery("#prefs-menu").addClass('sf-menu sf-js-enabled sf-shadow').superfish();
+
+});
 </script>

commit f4754e866a48d9705ed3c9e934f6c56a7322a3a9
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 17:24:10 2010 -0400

    First pass of a restored web2 styling

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 453076a..1c8d04b 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -86,7 +86,7 @@ if ( $request_path !~ qr{^/SelfService/} ) {
     $tickets->child( new => title => loc('New Search') => path => "/Search/Build.html?NewQuery=1" );
 
     my $tools = Menu->child(  tools => title => loc('Tools'), path => '/Tools/index.html' );
-    my $dashes = $tools->child( dashboards => title => loc('Dashboards'), path => '/Dashboards/index.html' );
+    my $dashes = $tools->child( dashboards => title => loc('Dashboards'), path => '/Dashboards/index.html', sort_order => 2 );
 
     $dashes->child( select => title => loc('Select'), path => "/Dashboards/index.html" );
     my $dashboard = RT::Dashboard->new( $session{CurrentUser} );
@@ -94,24 +94,24 @@ if ( $request_path !~ qr{^/SelfService/} ) {
         $dashes->child( loc('Create') => path => "/Dashboards/Modify.html?Create=1" );
     }
 
-    my $reports = $tools->child( reports => title => loc('Reports'), path => '/Tools/Reports/index.html' );
+    my $reports = $tools->child( reports => title => loc('Reports'), path => '/Tools/Reports/index.html', sort_order => 4 );
     $reports->child( loc('Resolved by owner'), path => '/Tools/Reports/ResolvedByOwner.html', );
     $reports->child( loc('Resolved in date range'), path => '/Tools/Reports/ResolvedByDates.html', );
     $reports->child( loc('Created in a date range'), path => '/Tools/Reports/CreatedByDates.html', );
 
-    $tools->child( my_day => title => loc('My Day'), path   => '/Tools/MyDay.html' );
+    $tools->child( my_day => title => loc('My Day'), path   => '/Tools/MyDay.html', sort_order => 5 );
 
-    $tools->child( offline => title => loc('Offline'), path    => '/Tools/Offline.html' );
-    $tools->child( watching => title => loc('Watching Queues'), path => '/Tools/Watching.html' );
+    $tools->child( offline => title => loc('Offline'), path    => '/Tools/Offline.html', sort_order => 10 );
+    $tools->child( watching => title => loc('Watching Queues'), path => '/Tools/Watching.html', sort_order => 15 );
 
     if ( $session{'CurrentUser'}->HasRight( Right => 'ShowApprovalsTab', Object => $RT::System ) )
     {
-        $tools->child( approval => title => loc('Approval'), path     => '/Approvals/' );
+        $tools->child( approval => title => loc('Approval'), path     => '/Approvals/', sort_order=>3 );
     }
 
     if ( $session{'CurrentUser'}->HasRight( Right => 'ShowConfigTab', Object => $RT::System ) )
     {
-        my $admin = $tools->child( config => title => loc('Configuration'), path   => '/Admin/' );
+        my $admin = $tools->child( config => title => loc('Configuration'), path   => '/Admin/', sort_order => 1 );
         if ( $session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'AdminUsers' ) ) {
             my $users = $admin->child( users => title => loc('Users'), path => '/Admin/Users/', );
             $users->child( select => title => loc('Select'), path   => "/Admin/Users/" );
@@ -189,6 +189,7 @@ if ( $request_path !~ qr{^/SelfService/} ) {
     if ( $session{'CurrentUser'}->UserObj
          && $session{'CurrentUser'}->HasRight( Right  => 'ModifySelf', Object => $RT::System )) {
         my $settings = $about_me->child( settings => title => loc('Settings'), path => '/Prefs/Other.html', );
+        $settings->child( options => title => loc('Options'), path     => '/Prefs/Other.html', );
         $settings->child( about_me => title => loc('About me'), path     => '/User/Prefs.html', );
         $settings->child( search_options => title => loc('Search options'), path => '/Prefs/SearchOptions.html', );
         $settings->child( myrt => title => loc('RT at a glance'), path => '/Prefs/MyRT.html', );
diff --git a/share/html/NoAuth/css/aileron/nav.css b/share/html/NoAuth/css/aileron/nav.css
index d4f0bc4..8f6e127 100644
--- a/share/html/NoAuth/css/aileron/nav.css
+++ b/share/html/NoAuth/css/aileron/nav.css
@@ -71,7 +71,7 @@
 
 #page-navigation {
     position: absolute;
-    top: 6.8em;
+    top: 7.2em;
     right: 0em;
     left: auto;
     z-index: 9995;
diff --git a/share/html/NoAuth/css/web2/InHeader b/share/html/NoAuth/css/web2/InHeader
index 78134f7..17ca680 100644
--- a/share/html/NoAuth/css/web2/InHeader
+++ b/share/html/NoAuth/css/web2/InHeader
@@ -54,11 +54,14 @@
 <![endif]-->
 <script type="text/javascript">
 jQuery(document).ready(function(){
-    jQuery("#page-menu.toplevel").addClass('sf-menu sf-js-enabled sf-shadow').superfish();
-    jQuery("#app-nav.toplevel").addClass('sf-menu sf-vertical sf-js-enabled sf-shadow').superfish();
+    jQuery("#page-menu.toplevel").addClass('sf-menu sf-js-enabled ').superfish();
+    jQuery("#app-nav.toplevel").addClass('sf-menu sf-vertical sf-js-enabled ').superfish();
     jQuery("#quick-personal").append('<ul id="prefs-menu"></ul>');
     jQuery("#preferences").detach().appendTo(jQuery("#prefs-menu"));
-    jQuery("#prefs-menu").addClass('sf-menu sf-js-enabled sf-shadow').superfish();
+    jQuery("#tools-config").detach().appendTo(jQuery("#app-nav"));
+    jQuery("#search-simple").detach().insertBefore(jQuery("#search"));
+    jQuery("#tools-approval").detach().appendTo(jQuery("#app-nav"));
+    jQuery("#prefs-menu").addClass('sf-menu sf-js-enabled ').superfish();
 
 });
 </script>
diff --git a/share/html/NoAuth/css/web2/layout.css b/share/html/NoAuth/css/web2/layout.css
index c589bd9..4a7af71 100644
--- a/share/html/NoAuth/css/web2/layout.css
+++ b/share/html/NoAuth/css/web2/layout.css
@@ -64,7 +64,7 @@ div#body {
     -webkit-border-top-left-radius: 0.5em;
     -moz-border-radius-bottomleft: 0.5em;
     -webkit-border-bottom-left-radius: 0.5em;
-    margin-left: 1em;
+    margin-left: 10em;
     margin-top: 3em;
     margin-right: 0;
     margin-bottom: 0em;
@@ -149,11 +149,36 @@ div#quickbar {
  border-bottom: 1px solid #ccc;
 
 }
-div#quick-personal {
-    float: left;
-    margin-left: 1em;
+
+#quick-personal {
+    position: absolute;
+    top: 0;
+    left: 0;
+    z-index: 9999
+}
+
+#prefs-menu.sf-menu li li {
+    background: #eaeaea;
+}
+
+#prefs-menu.sf-menu li#preferences {
+    background: none;
 }
 
+#prefs-menu.sf-menu li:hover, #prefs-menu.sf-menu li.sfHover, #prefs-menu.sf-menu a:focus, #prefs-menu.sf-menu a:hover, #prefs-menu.sf-menu a:active {
+    background-color: #CFDEFF;
+    text-color: #000;
+    color: #000;
+    border: none;
+}
+
+#prefs-menu .sfHover a,
+#prefs-menu .sfHover a:visited {
+    color: #000;
+    border: none;
+}
+
+
 
 div#header h1 {
  position: absolute;
diff --git a/share/html/NoAuth/css/web2/nav.css b/share/html/NoAuth/css/web2/nav.css
index d4f0bc4..83e95bd 100644
--- a/share/html/NoAuth/css/web2/nav.css
+++ b/share/html/NoAuth/css/web2/nav.css
@@ -45,45 +45,121 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-.sf-menu {
-    width: 100%;
+
+#main-navigation {
+    background-color: #fff;
+    -moz-border-radius-bottomright: 0.5em;
+    -webkit-border-bottom-right-radius: 0.5em;
+    -moz-border-radius-topright: 0.5em;
+    -webkit-border-top-right-radius: 0.5em;
+    width: 10em;
+    font-size: 0.85em;
+    position: absolute;
+    top: 6.2em;
+    left: 0em;
+    z-index: 9997;
+    background-color: none;
+    padding-top: 1em;
+    padding-right: 0.5em;
+    padding-left: 0.5em;
+}
+
+#main-navigation ul li {
 }
 
-.sf-menu a {
+
+#main-navigation .sf-menu {
+    text-color: #000;
+}
+
+#main-navigation .sf-menu li {
+    background: none;
+}
+
+#main-navigation .sf-menu li:first-child {
+    border-top: 1px solid #ccc;
+}
+
+#main-navigation .sf-menu a,
+#main-navigation .sf-menu a:visited {
     padding-top: 0.5em;
     padding-bottom: 0.5em;
+    color: #000;
+    border: none;
+}
+
+#main-navigation .sf-menu li {
+    border-bottom: 1px solid #ccc;
+
+}
+
+
+#main-navigation .sf-menu ul a,
+#main-navigation .sf-menu ul a:visited {
+    color: #000;
 }
-.sf-menu li:hover {
+
+
+#main-navigation .sf-menu li li, #main-navigation .sf-menu li li li {
+    border-left: none;
     background-color: #fff;
+    text-color: #547CCC;
 }
 
-.sf-menu li, .sf-menu li li, .sf-menu li li li {
-    background-color: #eee;
+#main-navigation .sf-menu li:hover, #main-navigation .sf-menu li.sfHover, #main-navigation .sf-menu a:focus, #main-navigation .sf-menu a:hover, #main-navigation .sf-menu a:active {
+    background-color: #CFDEFF;
+    text-color: #000;
+    color: #000;
 }
 
-#main-navigation {
-    position: absolute;
-    top: 0;
-    left: 0;
-    left: auto;
-    z-index: 9999;
+#main-navigation .sfHover a,
+#main-navigation .sfHover a:visited {
+    color: #000;
 }
 
+
 #page-navigation {
     position: absolute;
-    top: 6.8em;
+    top: 6em;
     right: 0em;
     left: auto;
     z-index: 9995;
-    font-size: 0.8em;
+    font-size: 0.9em;
+    background-color: #eee;
+    border: 1px solid #ccc;
+    -moz-border-radius-bottomleft: 0.5em;
+    -webkit-border-bottom-left-radius: 0.5em;
+}
+
+#page-navigation .sf-menu {
+    margin: 0;
 }
 
 #page-navigation .sf-menu li, #page-navigation .sf-menu li li, #page-navigation .sf-menu li li li {
-    background-color: #fff;
+    background: none;
+    height: 2em;
+    padding-top: 0.25em;
+    padding-bottom: 0;
+    padding-left: 0.5em;
+    padding-right: 0.5em;
+    display: inline-block;
+}
+
+
+#page-navigation .sf-menu ul {
+    background: #eee;
+}
+
+
+#page-navigation .sf-menu li:hover, #page-navigation .sf-menu li.sfHover, #page-navigation .sf-menu a:focus, #page-navigation .sf-menu a:hover, #page-navigation .sf-menu a:active {
+    background: none;
+
 }
 
 #page-navigation .sf-menu a:visited, #page-navigation .sf-menu a {
     border: none;
+    padding: 0.25em;
+    color: #000;
 }
 
 

commit 823372b4314f6a853191bfe7204f08615b7084d7
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 20:52:16 2010 -0400

    Styling of aileron page menus

diff --git a/share/html/NoAuth/css/aileron/InHeader b/share/html/NoAuth/css/aileron/InHeader
index f9ed0ee..01cbb81 100644
--- a/share/html/NoAuth/css/aileron/InHeader
+++ b/share/html/NoAuth/css/aileron/InHeader
@@ -49,6 +49,8 @@
 <link rel="stylesheet" href="<%RT->Config->Get('WebPath')%>/NoAuth/css/aileron/msie.css" type="text/css" media="all" />
 <![endif]-->
 <script type="text/javascript">
-jQuery(document).ready(function(){ jQuery("#app-nav.toplevel").addClass('sf-menu sf-js-enabled sf-shadow').superfish(); });
-jQuery(document).ready(function(){ jQuery("#page-menu.toplevel").addClass('sf-menu sf-js-enabled sf-shadow').superfish(); });
+jQuery(document).ready(function(){
+    jQuery("#app-nav.toplevel").addClass('sf-menu sf-js-enabled sf-shadow').superfish();
+    jQuery("#page-menu.toplevel").addClass('sf-menu sf-js-enabled sf-shadow').superfish( { autoArrows:  false, dropShadows: false } );
+});
 </script>
diff --git a/share/html/NoAuth/css/aileron/nav.css b/share/html/NoAuth/css/aileron/nav.css
index 8f6e127..59930cf 100644
--- a/share/html/NoAuth/css/aileron/nav.css
+++ b/share/html/NoAuth/css/aileron/nav.css
@@ -49,16 +49,13 @@
     width: 100%;
 }
 
-.sf-menu a {
-    padding-top: 0.5em;
-    padding-bottom: 0.5em;
-}
+
 .sf-menu li:hover {
     background-color: #fff;
 }
 
 .sf-menu li, .sf-menu li li, .sf-menu li li li {
-    background-color: #eee;
+    background-color: #eaeaea;
 }
 
 #main-navigation {
@@ -67,8 +64,25 @@
     left: 0;
     left: auto;
     z-index: 9999;
+    text-color: #000;
 }
 
+#main-navigation .sf-menu a, #main-navigation .sf-menu a:hover {
+    padding-top: 0.5em;
+    padding-bottom: 0.5em;
+    border-color: #fff;
+    color: #000;
+}
+
+#main-navigation a {
+    border-top: none;
+}
+
+#main-navigation li li a {
+    border-top: 1px solid white;
+}
+
+
 #page-navigation {
     position: absolute;
     top: 7.2em;
@@ -84,6 +98,7 @@
 
 #page-navigation .sf-menu a:visited, #page-navigation .sf-menu a {
     border: none;
+    color: #000;
 }
 
 

commit 5dd5d626c3b64c25004bc14ce8455e7d07898f2e
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 21:49:21 2010 -0400

    improved handling of menu init on IE

diff --git a/share/html/NoAuth/css/aileron/nav.css b/share/html/NoAuth/css/aileron/nav.css
index 59930cf..1bd5aaa 100644
--- a/share/html/NoAuth/css/aileron/nav.css
+++ b/share/html/NoAuth/css/aileron/nav.css
@@ -101,6 +101,11 @@
     color: #000;
 }
 
+/* to stop a "flash" of an unstyled menu on an older browser,  hide the menu until superfish has initialized it */
+#app-nav.toplevel { display: none; }
+#app-nav.toplevel.sf-menu { display:block; }
+#page-menu.toplevel { display: none; }
+#page-menu.toplevel.sf-menu { display:block; }
 
 #topactions {
  position: absolute;
diff --git a/share/html/NoAuth/css/web2/InHeader b/share/html/NoAuth/css/web2/InHeader
index 17ca680..bc6c39a 100644
--- a/share/html/NoAuth/css/web2/InHeader
+++ b/share/html/NoAuth/css/web2/InHeader
@@ -54,14 +54,14 @@
 <![endif]-->
 <script type="text/javascript">
 jQuery(document).ready(function(){
-    jQuery("#page-menu.toplevel").addClass('sf-menu sf-js-enabled ').superfish();
-    jQuery("#app-nav.toplevel").addClass('sf-menu sf-vertical sf-js-enabled ').superfish();
     jQuery("#quick-personal").append('<ul id="prefs-menu"></ul>');
     jQuery("#preferences").detach().appendTo(jQuery("#prefs-menu"));
     jQuery("#tools-config").detach().appendTo(jQuery("#app-nav"));
     jQuery("#search-simple").detach().insertBefore(jQuery("#search"));
     jQuery("#tools-approval").detach().appendTo(jQuery("#app-nav"));
-    jQuery("#prefs-menu").addClass('sf-menu sf-js-enabled ').superfish();
 
+    jQuery("#page-menu.toplevel").addClass('sf-menu sf-js-enabled ').superfish();
+    jQuery("#app-nav.toplevel").addClass('sf-menu sf-vertical sf-js-enabled ').superfish();
+    jQuery("#prefs-menu").addClass('sf-menu sf-js-enabled ').superfish();
 });
 </script>
diff --git a/share/html/NoAuth/css/web2/nav.css b/share/html/NoAuth/css/web2/nav.css
index 83e95bd..a4cb7cf 100644
--- a/share/html/NoAuth/css/web2/nav.css
+++ b/share/html/NoAuth/css/web2/nav.css
@@ -117,6 +117,13 @@
     color: #000;
 }
 
+/* to stop a "flash" of an unstyled menu on an older browser,  hide the menu until superfish has initialized it */
+#app-nav.toplevel { display: none; }
+#app-nav.toplevel.sf-menu { display:block; }
+#page-menu.toplevel { display: none; }
+#page-menu.toplevel.sf-menu { display:block; }
+
+
 
 #page-navigation {
     position: absolute;

commit 30d09996c880f4db951387a0175792e0d69e00fa
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Thu Nov 4 00:28:58 2010 -0400

    Turns out that we need ids on the menu hrefs for testing and on the
    menu lis for styling

diff --git a/share/html/Elements/Menu b/share/html/Elements/Menu
index 265840a..d6ee085 100755
--- a/share/html/Elements/Menu
+++ b/share/html/Elements/Menu
@@ -50,9 +50,9 @@
 % for my $child ($menu->children) {
 %   my $item_id = lc(($parent_id? $parent_id."-" : "") .$child->key);
 %   $item_id =~ s/\s/-/g;
-<%" " x ($depth+1)%><li id="<%$item_id%>" >\
+<%" " x ($depth+1)%><li id="li-<%$item_id%>">\
 % if ($child->link_item) {
-<a <% $child->path ? ' href="'.RT->Config->Get('WebPath').$child->path.'"' : '' |n%>>\
+<a id="<%$item_id%>" <% $child->path ? ' href="'.RT->Config->Get('WebPath').$child->path.'"' : '' |n%>>\
 % }
 % if ($child->escape_title) {
 <%$child->title%>\
diff --git a/share/html/NoAuth/css/web2/InHeader b/share/html/NoAuth/css/web2/InHeader
index bc6c39a..f968210 100644
--- a/share/html/NoAuth/css/web2/InHeader
+++ b/share/html/NoAuth/css/web2/InHeader
@@ -55,10 +55,10 @@
 <script type="text/javascript">
 jQuery(document).ready(function(){
     jQuery("#quick-personal").append('<ul id="prefs-menu"></ul>');
-    jQuery("#preferences").detach().appendTo(jQuery("#prefs-menu"));
-    jQuery("#tools-config").detach().appendTo(jQuery("#app-nav"));
-    jQuery("#search-simple").detach().insertBefore(jQuery("#search"));
-    jQuery("#tools-approval").detach().appendTo(jQuery("#app-nav"));
+    jQuery("#li-preferences").detach().appendTo(jQuery("#prefs-menu"));
+    jQuery("#li-tools-config").detach().appendTo(jQuery("#app-nav"));
+    jQuery("#li-search-simple").detach().insertBefore(jQuery("#li-search"));
+    jQuery("#li-tools-approval").detach().appendTo(jQuery("#app-nav"));
 
     jQuery("#page-menu.toplevel").addClass('sf-menu sf-js-enabled ').superfish();
     jQuery("#app-nav.toplevel").addClass('sf-menu sf-vertical sf-js-enabled ').superfish();
diff --git a/share/html/NoAuth/css/web2/layout.css b/share/html/NoAuth/css/web2/layout.css
index 4a7af71..d760fba 100644
--- a/share/html/NoAuth/css/web2/layout.css
+++ b/share/html/NoAuth/css/web2/layout.css
@@ -161,7 +161,7 @@ div#quickbar {
     background: #eaeaea;
 }
 
-#prefs-menu.sf-menu li#preferences {
+#prefs-menu.sf-menu li#li-preferences {
     background: none;
 }
 

commit 3a41e301c7d1a47bed745a639debf164cdeb01b2
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Wed Nov 3 22:51:09 2010 -0400

    Added a "HasChildren" method to our Menu class

diff --git a/lib/RT/Interface/Web/Menu.pm b/lib/RT/Interface/Web/Menu.pm
index 0c1f90c..763d4be 100644
--- a/lib/RT/Interface/Web/Menu.pm
+++ b/lib/RT/Interface/Web/Menu.pm
@@ -283,6 +283,23 @@ sub delete {
     delete $self->{children}{$key};
 }
 
+
+=head2 has_children
+
+Returns true if there are any children on this menu
+
+=cut
+
+sub has_children {
+    my $self = shift;
+    if (@{ $self->children}) {
+        return 1
+    } else {
+        return 0;
+    }
+}
+
+
 =head2 children
 
 Returns the children of this menu item in sorted order; as an array in

commit 1dbc9edb6a99ca7b102e83c3ab3ff426b5669aa2
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Thu Nov 4 11:43:57 2010 -0400

    add a hint that a menu item has children to the <li>

diff --git a/share/html/Elements/Menu b/share/html/Elements/Menu
index d6ee085..5e9c1c7 100755
--- a/share/html/Elements/Menu
+++ b/share/html/Elements/Menu
@@ -50,7 +50,11 @@
 % for my $child ($menu->children) {
 %   my $item_id = lc(($parent_id? $parent_id."-" : "") .$child->key);
 %   $item_id =~ s/\s/-/g;
-<%" " x ($depth+1)%><li id="li-<%$item_id%>">\
+<%" " x ($depth+1)%><li id="li-<%$item_id%>"\
+% if ($child->has_children) {
+class="has-children" \
+% }
+>\
 % if ($child->link_item) {
 <a id="<%$item_id%>" <% $child->path ? ' href="'.RT->Config->Get('WebPath').$child->path.'"' : '' |n%>>\
 % }

commit 741a0c8fed19fa75cf8087d08549b5f4e9dad5e9
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Thu Nov 4 11:44:18 2010 -0400

    Add a very first pass at a theme that doesn't want js for its menuing.
    It's ugly.

diff --git a/lib/RT/Config.pm b/lib/RT/Config.pm
index b1c1562..19ebcf2 100644
--- a/lib/RT/Config.pm
+++ b/lib/RT/Config.pm
@@ -195,7 +195,7 @@ our %META = (
         WidgetArguments => {
             Description => 'Theme',                  #loc
             # XXX: we need support for 'get values callback'
-            Values => [qw(web2 aileron)],
+            Values => [qw(web2 aileron ballard)],
         },
     },
     UseSideBySideLayout => {
diff --git a/share/html/NoAuth/css/ballard/InHeader b/share/html/NoAuth/css/ballard/InHeader
new file mode 100644
index 0000000..a305c62
--- /dev/null
+++ b/share/html/NoAuth/css/ballard/InHeader
@@ -0,0 +1,54 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+<!--[if lt IE 8]>
+<link rel="stylesheet" href="<%RT->Config->Get('WebPath')%>/NoAuth/css/web2/msie.css" type="text/css" media="all" />
+
+<![endif]-->
+<!--[if lt IE 7]>
+<link rel="stylesheet" href="<%RT->Config->Get('WebPath')%>/NoAuth/css/web2/msie6.css" type="text/css" media="all" />
+<![endif]-->
diff --git a/share/html/NoAuth/css/ballard/base.css b/share/html/NoAuth/css/ballard/base.css
new file mode 100644
index 0000000..87ec64d
--- /dev/null
+++ b/share/html/NoAuth/css/ballard/base.css
@@ -0,0 +1,62 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+a {
+  color: #000;
+  text-decoration: none;
+}
+
+
+a:visited {
+    color: #666;
+}
+
+a:hover  {
+  text-decoration: underline;
+}
+
+textarea:focus, input:focus {   background-color: #ffd; }
diff --git a/share/html/NoAuth/css/ballard/boxes.css b/share/html/NoAuth/css/ballard/boxes.css
new file mode 100644
index 0000000..87066b2
--- /dev/null
+++ b/share/html/NoAuth/css/ballard/boxes.css
@@ -0,0 +1,185 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+.titlebox { 
+ border-left: 1px solid #ccc;
+ border-top: 1px solid #ccc;
+ background-color: #efefef;
+ padding-top: 1em;
+ margin-top: 1em;
+ margin-left: 1em;
+ -moz-border-radius: 0.5em;
+ -webkit-border-radius: 0.5em;
+ margin-bottom: 2em;
+ border-bottom: 2px solid #aaa;
+ border-right: 2px solid #aaa;
+ padding-right: 1em;
+}
+
+* html .titlebox {
+ border-top: none;
+ border-left: none;
+}
+
+.titlebox .titlebox { 
+
+ background-color: #ffffff;
+ margin-top: 1em;
+ -moz-border-radius: 0.5em;
+ -webkit-border-radius: 0.5em;
+ margin-right: 0.25em;
+ 
+}
+
+
+.titlebox {
+ margin-left: 0em;
+ margin-right: 0em;
+ min-height: 1.25em;
+
+}
+
+
+
+.titlebox .titlebox-title {
+ position: relative;
+ margin-top: -1.5em;
+ padding-bottom: 0.25em;
+ padding-left: 1em;
+ margin-right: -1em;
+
+}
+
+.titlebox .titlebox-title a {
+ text-decoration: none;
+ color: black;
+
+}
+
+.titlebox .titlebox-title a:hover {
+ text-decoration: underline;
+
+}
+
+.titlebox .titlebox-title .left {
+    font-weight: bold;
+    background: #ccc;
+    margin-left: 0.75em;
+    padding:0.5em;
+    padding-left: 0.75em;
+    padding-right: 0.75em;
+    -moz-border-radius: 0.5em;
+    -webkit-border-radius: 0.5em;
+    border-bottom: 2px solid #aaa;
+    border-right: 2px solid #aaa;
+
+
+}
+
+.titlebox .titlebox-title .right-empty {
+ display:none;
+}
+
+.titlebox .titlebox-title .right {
+  position: absolute;
+   right: 0;
+   top: 0.5em;
+  font-size: 0.9em;
+  background: #dedede;
+  border-left: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+ padding-right: 0.4em;
+ padding-left: 0.4em;
+ padding-bottom: 0.2em;
+ padding-top: 0.5em;
+ -moz-border-radius-bottomleft: 0.25em;
+ -webkit-border-bottom-left-radius: 0.25em;
+ 
+ 
+ -moz-border-radius-topright: 0.25em;
+ -webkit-border-top-right-radius: 0.25em;
+
+}
+
+.titlebox .titlebox-title .right a,
+.titlebox .titlebox-title .right a:visited {
+ color: #000;
+}
+
+.titlebox .titlebox-content {
+ padding-top: 0.5em;
+ padding-left: 1em;
+ padding-bottom: 1em;
+
+}
+
+.titlebox .titlebox-title .widget a {
+  display: block;
+  margin: 0;
+  margin-top: 0.5em;
+  width: 20px;
+
+  background: url(<%RT->Config->Get('WebPath')%>/NoAuth/images/css/rollup-arrow.gif) no-repeat center center;
+
+  position: absolute;
+  top: -1em;
+  left: 0.15em;
+  float: left;
+
+  padding: 11px 0 0 0;
+  overflow: hidden;
+}
+
+* html .titlebox .titlebox-title .widget a {
+    background-position: center 0.3em;
+    top: 0em;
+    left: -1.5em; 
+}
+
+.titlebox.rolled-up .titlebox-title .widget a {
+    background-image: url(<%RT->Config->Get('WebPath')%>/NoAuth/images/css/rolldown-arrow.gif);
+}
diff --git a/share/html/NoAuth/css/ballard/images/dhandler b/share/html/NoAuth/css/ballard/images/dhandler
new file mode 100644
index 0000000..6ec9dea
--- /dev/null
+++ b/share/html/NoAuth/css/ballard/images/dhandler
@@ -0,0 +1,8 @@
+<%INIT>
+use File::Basename;
+my $arg = $m->dhandler_arg;
+my $file = dirname($m->current_comp->source_file) . '/source/'. $arg;
+RT::Interface::Web->SendStaticFile( File => $file );
+
+$m->abort;
+</%INIT>
diff --git a/share/html/NoAuth/css/ballard/images/source/background-gradient.png b/share/html/NoAuth/css/ballard/images/source/background-gradient.png
new file mode 100644
index 0000000..9c126c7
Binary files /dev/null and b/share/html/NoAuth/css/ballard/images/source/background-gradient.png differ
diff --git a/share/html/NoAuth/css/ballard/layout.css b/share/html/NoAuth/css/ballard/layout.css
new file mode 100644
index 0000000..9418fa2
--- /dev/null
+++ b/share/html/NoAuth/css/ballard/layout.css
@@ -0,0 +1,182 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+/* body */
+
+body {
+    padding:0;
+    margin:0;
+    background: #547CCC url(<%RT->Config->Get('WebPath')%>/NoAuth/css/web2/images/background-gradient.png) top left repeat-x ;
+    font-family: arial, helvetica, sans-serif;
+    color: #000000;
+}
+
+div#body {
+    position: relative;
+    padding: 1em;
+    padding-right: 0.5em;
+    padding-top: 3em;
+    -moz-border-radius-topleft: 0.5em;
+    -webkit-border-top-left-radius: 0.5em;
+    -moz-border-radius-bottomleft: 0.5em;
+    -webkit-border-bottom-left-radius: 0.5em;
+    margin-left: 10em;
+    margin-top: 3em;
+    margin-right: 0;
+    margin-bottom: 0em;
+    min-height: 10%;
+    background: #fff;
+    border-top: 2px solid #ccc;
+    border-left: 2px solid #ccc;
+    z-index:1;
+
+
+}
+
+div#footer {
+ position: absolute;
+ right: 0;
+ text-align: right;
+ font-size: 0.9em;
+ margin-top: 2em;
+ background: #fff;
+ margin-bottom: 0;
+ padding-left: 3em;
+ padding-right: 1em;
+ border-top: 2px solid #aaa;
+ border-left: 2px solid #aaa;
+ -moz-border-radius-topleft: 0.5em;
+ -webkit-border-top-left-radius: 0.5em;
+ -moz-border-radius-bottomleft: 0.5em;
+ -webkit-border-bottom-left-radius: 0.5em;
+}
+
+div#footer #time {
+    display: none ;
+}
+
+div#footer #bpscredits {
+ text-align: right;
+ background: url(<%RT->Config->Get('WebPath')%>/NoAuth/images/bpslogo.png) no-repeat top right;
+ padding-top: 4em;
+}
+
+
+/* logo stuff */
+
+div#logo {
+    position: absolute;
+    right: 2px;
+    top: 0;
+    height: 2.3em;
+}
+
+div#logo a img {
+    border: 0;
+    height: 100% !important;
+    width: auto !important;
+    float: right;
+}
+
+div#logo .rtname {
+    position: relative;
+    font-weight: bold;
+    text-align: center;
+    top: 0.7em;
+    padding-right: 1em;
+    float:left;
+}
+
+
+div#quickbar, div#logo {
+    font-size: 0.9em;
+}
+div#quickbar a, div#logo a { 
+    color: #000;
+}
+
+
+div#quickbar {
+ background: #eaeaea;
+ padding-top: 1em;
+ padding-left: 1em;
+ padding-bottom: 0.5em;
+ height: 1em;
+ border-bottom: 1px solid #ccc;
+
+}
+
+#quick-personal {
+    position: absolute;
+    top: 0;
+    left: 0;
+    z-index: 9999
+}
+
+div#header h1 {
+ position: absolute;
+ left: 0.5em;
+ right: 20em;
+ top: 1.6em;
+ overflow: hidden;
+ height: 1em;
+ font-size: 1.4em;
+ margin-top: 0.4em;
+ padding: 0.25em;
+ color: #fff;
+}
+
+/* in multi-column layouts, make sure we have an internal gutter */
+
+tr .boxcontainer {
+      padding-right: 1em;
+}
+
+tr .boxcontainer:last-child {
+      padding-right: 0;
+}
+
diff --git a/share/html/NoAuth/css/ballard/main.css b/share/html/NoAuth/css/ballard/main.css
new file mode 100644
index 0000000..79b5e50
--- /dev/null
+++ b/share/html/NoAuth/css/ballard/main.css
@@ -0,0 +1,62 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+% $m->callback(CallbackName => 'Begin');
+
+ at import "../base/main.css";
+
+ at import "base.css";
+ at import "layout.css";
+ at import "nav.css";
+ at import "boxes.css";
+ at import "ticket-lists.css";
+ at import "ticket-search.css";
+ at import "ticket.css";
+ at import "misc.css";
+
+% $m->callback(CallbackName => 'End');
+
diff --git a/share/html/NoAuth/css/ballard/misc.css b/share/html/NoAuth/css/ballard/misc.css
new file mode 100644
index 0000000..52f2023
--- /dev/null
+++ b/share/html/NoAuth/css/ballard/misc.css
@@ -0,0 +1,60 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+ at import "../base/misc.css";
+
+.comment { 
+ padding-left: 0.5em;
+ color: #999;
+
+}
+
+#comp-Ticket-ShowEmailRecord #body {
+    margin-left: 1em;
+    margin-top: 1em;
+    overflow: auto;
+} 
diff --git a/share/html/NoAuth/css/ballard/msie.css b/share/html/NoAuth/css/ballard/msie.css
new file mode 100644
index 0000000..21d8f11
--- /dev/null
+++ b/share/html/NoAuth/css/ballard/msie.css
@@ -0,0 +1,238 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+div#body {
+    left: 0.25em;
+    height: 100%;
+    top: 1em;
+
+}
+
+
+#footer {
+    padding: 1em;
+}
+
+
+div#header h1 {
+ position: absolute;
+ left: 7.25em;
+ overflow: hidden;
+ height: 1em;
+ font-size: 1.4em;
+ margin-top: 0.4em;
+ right: 23.5em;
+ padding: 0.25em;
+}
+
+
+#topactions {
+    top: 4.1em;
+    width: auto;
+}
+.topaction form * { 
+    vertical-align: top;
+}
+
+.topaction form button, .topaction form input { 
+   height: 2em; 
+}
+
+.topaction form input.field {
+   height: 1.6em; 
+}
+
+.topaction .select-queue {
+    margin-top: 0.2em;
+}
+
+div#page-navigation {
+    position: absolute;
+    top: 6.2em;
+    height: 1.8em;
+    background: #fff;
+    border-top: 2px solid #ccc;
+}
+
+
+
+div#page-navigation ul#page-menu {
+    margin-top: -2.5em;
+    margin-left: 4em;
+    background: none;
+    border: none;
+}
+
+
+div#quickbar { height: 1.2em;
+
+
+}
+
+#pick-criteria td.label select {
+    width: 10em;    
+}
+
+
+#editquery {
+  margin-top: 0.2em;
+  width: 39%;
+  left: 60%;
+}
+
+div#nav li.first {
+    margin-top: 0.75em;
+    border-top: none;
+}
+div#nav ul ul li.first {
+    border-top: 1px solid #cccccc;
+    margin-top: 0.25em;
+}
+
+div#nav li.last {
+    border-bottom: none;
+    padding-bottom: 0;
+    margin-bottom: 0;
+}
+
+
+.ticket-transaction .type a { font-weight: normal; text-decoration: none; color: #fff; }
+
+
+.titlebox {
+ border-top: none;
+ border-left: none;
+}
+
+.titlebox .titlebox-title .left {
+    padding: 0.25em;
+    padding-left: 0.5em;
+}
+
+.titlebox {
+}
+
+.titlebox .titlebox-title .right {
+    border-right: 2px solid #aaa;
+
+}
+
+
+.titlebox .titlebox-content {
+    padding-top: 2.2em;
+}
+
+.titlebox table.collection-as-table, .titlebox table.queue-summary {
+    width: 95%;
+    padding: 0.5em;
+    margin-left: auto;
+    margin-right: auto;
+}
+
+th.collection-as-table {
+    padding: 0.25em;
+}
+
+table.queue-summary td, td.collection-as-table {
+    padding: 0.25em;
+}
+
+ .titlebox-title {
+    position: relative;
+}
+
+.titlebox-title .widget {
+    position: absolute;
+    top: -0.25em;
+    left: -0.25em;
+
+}
+.titlebox-title .left {
+    position: absolute;
+    top: -0.75em;
+    left: 0.5em;
+}
+
+
+.titlebox .titlebox-title .right{
+    top: 0.2em;
+    right: -0.2em;
+}
+
+/* nested things. like the ticket dates tab */
+.titlebox .titlebox .titlebox-title .right{
+    top: 0.25em;
+}
+
+.combobox {
+    float: left;
+}
+
+.combobox .combo-button {
+    color: ButtonText;
+    padding: 0;
+}
+
+.combobox .combo-list {
+    margin-top:0.5em;
+    margin-left: -0.2em;
+}
+
+#pick-criteria td.label {
+     width: auto;
+}
+
+#pick-criteria td.operator {
+  width: 7.5em;
+}
+
+.plain-text-white-space {
+  word-wrap: break-word;       /* Internet Explorer 5.5+ */
+  white-space: pre;   /* IE only hack to re-specify in addition to
+  word-wrap  */
+}
+
diff --git a/share/html/NoAuth/css/ballard/msie6.css b/share/html/NoAuth/css/ballard/msie6.css
new file mode 100644
index 0000000..16208bb
--- /dev/null
+++ b/share/html/NoAuth/css/ballard/msie6.css
@@ -0,0 +1,88 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+.topaction .select-queue {
+    margin-top: 0;
+}
+
+div#page-navigation ul#page-menu {
+    margin-top: -3.2em;
+}
+
+.titlebox-title .widget {
+    top: -1em;
+    left: 0.5em;
+
+}
+.titlebox .titlebox-title .right{
+    position: absolute;
+    top: 0.25em;
+    right: 1em;
+}
+
+/* nested things. like the ticket dates tab */
+.titlebox .titlebox .titlebox-title .right{
+    right: 1.3em;
+}
+
+#login-box .titlebox .titlebox-title .right {
+    margin-top: -0.1em;
+    right: 0em;
+}
+
+.titlebox
+{
+    height: auto !important;
+    height: 1.25em;
+}
+
+
+.ticket-transaction .messagebody img {
+    /* ie6 does not support max-width */
+    width: expression(this.width > 401 ? 400 : true);
+}
+
diff --git a/share/html/NoAuth/css/ballard/nav.css b/share/html/NoAuth/css/ballard/nav.css
new file mode 100644
index 0000000..fd3fcd7
--- /dev/null
+++ b/share/html/NoAuth/css/ballard/nav.css
@@ -0,0 +1,207 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+
+#main-navigation {
+    background-color: #fff;
+    -moz-border-radius-bottomright: 0.5em;
+    -webkit-border-bottom-right-radius: 0.5em;
+    -moz-border-radius-topright: 0.5em;
+    -webkit-border-top-right-radius: 0.5em;
+    width: 10em;
+    font-size: 0.85em;
+    position: absolute;
+    top: 6.2em;
+    left: 0em;
+    z-index: 9997;
+    background-color: none;
+    padding-top: 1em;
+    padding-right: 0.5em;
+    padding-left: 0.5em;
+}
+
+#main-navigation ul  {
+    list-style-type: none;
+    padding: 0;
+    margin: 0;
+    padding-left: 8px; /* not em, since our font size reduces */
+    border-left: 1px solid #ccc;
+    margin-top: 0.2em;
+    padding-top: 0.2em;
+
+    margin-bottom: 0.2em;
+    padding-bottom: 0.2em;
+}
+
+#main-navigation {
+    text-color: #000;
+}
+
+#main-navigation li ul {
+    font-size: 0.9em;
+}
+
+#main-navigation li ul ul {
+    font-size: 1em;
+}
+
+#main-navigation li:first-child {
+}
+
+#main-navigation li:last-child {
+    border-bottom: none;
+}
+
+
+#main-navigation a,
+#main-navigation a:visited {
+    padding-top: 0.5em;
+    padding-bottom: 0.5em;
+    color: #000;
+    border: none;
+}
+
+#main-navigation li {
+}
+
+
+#main-navigation ul a,
+#main-navigation ul a:visited {
+    color: #000;
+}
+
+
+#main-navigation li li, #main-navigation li li li {
+    border-left: none;
+    background-color: #fff;
+    text-color: #547CCC;
+}
+
+#page-navigation {
+    position: absolute;
+    top: 6em;
+    right: 0em;
+    z-index: 9995;
+    font-size: 0.9em;
+    background-color: #eee;
+    border: 1px solid #ccc;
+    -moz-border-radius-bottomleft: 0.5em;
+    -webkit-border-bottom-left-radius: 0.5em;
+    padding: 0;
+    padding-top: 0.5em;
+    padding-right: 0.5em;
+    width: 60%;
+    text-align: right;
+}
+
+#page-navigation ul {
+    list-style-type: none;
+    padding: 0;
+    padding-left: 0.3em;
+    display: inline;
+}
+
+#page-navigation li {
+    display: inline;
+    padding: 0.3em;
+}
+#page-navigation li.has-children>a {
+    display: none;
+}
+
+#page-navigation {
+    margin: 0;
+}
+
+#topactions {
+ position: absolute;
+ background: transparent;
+ top: 3.2em;
+ right: 0.7em;
+ width: auto;
+ min-width: 42em;
+ font-size: 0.9em;
+ z-index: 99;
+}
+
+#topactions form * {
+    vertical-align: top;
+}
+
+#topactions button, #topactions select, #topactions input{
+ padding-top: 0em;
+ padding-bottom: 0em;
+ width: 8em;
+
+}
+
+#topactions form {
+ display: block;
+
+}
+
+#topactions #GotoTicket, #topactions #CreateTicketInQueue {
+ text-align: right;
+
+}
+#topactions #simple-search {
+ float: right;
+}
+
+#topactions #simple-search .field{
+ margin-left: 1em;
+ color: #787;
+ }
+
+#topactions #simple-search .field:focus {
+ color: #000;
+ }
+
+#topactions #GotoTicket {
+ text-align: right;
+
+}
diff --git a/share/html/NoAuth/css/ballard/ticket-lists.css b/share/html/NoAuth/css/ballard/ticket-lists.css
new file mode 100644
index 0000000..055d8e9
--- /dev/null
+++ b/share/html/NoAuth/css/ballard/ticket-lists.css
@@ -0,0 +1,236 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+table.queue-summary, table.collection-as-table {
+  margin-top: 0.75em;
+  font-size: 0.9em;
+  border: 1px solid #aaa;
+  border-bottom: 2px solid #999;
+  border-right: 2px solid #999;
+  border-spacing: 0;
+  width: 100%;
+
+}
+
+table.queue-summary tr>*:first-child {
+ padding-left: 1em;
+
+}
+
+
+table.queue-summary tr>*:last-child {
+ padding-right: 1em;
+
+}
+
+table.queue-summary a, table.collection-as-table a  {
+  font-weight: bold;
+}
+
+
+table.collection-as-table th.collection-as-table {
+  background: #ddd;
+ font-size: 0.9em;
+  margin-bottom: 0.5em;
+  text-align: left;
+
+}
+
+
+table.queue-summary th.collection-as-table {
+ font-size: 0.9em;
+  margin-bottom: 0.5em;
+  text-align: right;
+
+}
+
+table.queue-summary th.collection-as-table:first-child {
+  text-align: left;
+
+}
+
+
+tr.collection-as-table+tr.collection-as-table th {
+ border-bottom: 2px solid grey;
+
+}
+
+
+
+
+table.queue-summary td {
+  background: #efefef;
+  border-bottom: 1px solid #ccc;
+}
+
+
+
+tr.evenline td {
+  background: #eee;
+}
+
+tr.oddline td {
+  background: #fff;
+
+}
+
+tr.evenline td, tr.oddline td {
+ padding-top: 0.5em;
+} 
+
+
+
+tr.evenline+tr.evenline td, tr.oddline+tr.oddline td{
+ padding-top: 0;
+ border: none;
+}
+
+
+
+table.collection-as-table td:first-child,
+table.collection-as-table th:first-child {
+  padding-left: 1em;
+}
+
+table.collection-as-table td:last-child, table.collection-as-table th:last-child {
+  padding-right: 1em;
+}
+
+th.collection-as-table , td.collection-as-table {
+ padding-right: 0.5em;
+}
+
+.pagenum.a:hover, .paging a.nav:hover{
+text-decoration: underline;
+}
+
+
+.pagenum *, .paging a.nav{
+padding: .5em;
+}
+
+.currentpage{
+text-decoration: none;
+font-weight: bold;
+background: #eee;
+}
+
+div.paging{
+text-align: center;
+padding-bottom: 1em;
+}
+
+ 
+/* full-page ticket lists */
+#body>table.collection-as-table {
+    margin-bottom: 2em;
+
+}
+
+.chart.image {
+    margin-top: -1em;
+    padding-right: 2em;
+    float: left;
+    clear: both;
+}
+
+.chart-wrapper {
+    display: block;
+    width: auto;
+}
+
+.chart-wrapper .collection-as-table {
+    width: auto;
+    font-size: 1em;
+}
+
+.chart-wrapper .collection-as-table th.collection-as-table {
+    text-align: center;
+    padding: 0.5em;
+    padding-right: 1em;
+    padding-left:  1em;
+}
+
+.chart-wrapper .collection-as-table tr.total td {
+    border-top: 1px solid #ccc;
+}
+
+.chart-wrapper .collection-as-table td.value {
+    padding-left: 0.5em;
+}
+
+.chart-wrapper .query {
+    clear: both;
+    text-align: center;
+    font-size: 1.2em;
+    padding: 1em;
+}
+
+.chart-wrapper .collection-as-table .label {
+    font-weight: bold;
+}
+
+
+.chart-wrapper .query .label {
+    font-weight: bold;
+}
+
+.chart-meta {
+    padding-top: 2em;
+    border-top: 1px solid #ccc;
+}
+
+.chart-meta .chart-type {
+    display: inline-block;
+    float: left;
+    padding-right: 2em;
+    clear: both;
+}
+
+.chart-meta .saved-search {
+    display: inline-block;
+}
diff --git a/share/html/NoAuth/css/ballard/ticket-search.css b/share/html/NoAuth/css/ballard/ticket-search.css
new file mode 100644
index 0000000..fe25af1
--- /dev/null
+++ b/share/html/NoAuth/css/ballard/ticket-search.css
@@ -0,0 +1,246 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+#comp-Search-Build #body {
+    position: relative;
+}
+
+#pick-criteria select {
+    width: 8em;
+}
+
+#pick-criteria tr {
+    height: 1.5em;
+}
+
+#pick-criteria td.label {
+    font: message-box;    
+    padding-right: 0.5em;
+    width: 11em;
+}
+
+#pick-criteria td.label * {
+ width: 8.5em;
+}
+
+#pick-criteria td.label select {
+  text-align: right;
+}
+
+#pick-criteria td.operator {
+ padding-right: 0.5em;
+ text-align: left;
+ vertical-align: bottom;
+ width: 7em;
+}
+
+#pick-criteria td.operator select {
+ text-align: right;
+}
+
+#pick-criteria td.value input,
+#pick-criteria td.value select {
+ width: 11em;
+}
+
+#pick-criteria td.value #ValueOfDate {
+ width: 11em;
+}
+
+
+#pick-criteria td.value #ValueOfTime {
+ width: 4em;
+
+}
+
+#pick-criteria td.value #ValueOfTime-TimeUnits{
+ width: 5.5em;
+}
+
+#pick-criteria td.value {
+ padding-right: 0.5em;
+ text-align: left;
+ font: message-box;
+}
+
+#editquery, #editsearches{
+  position: absolute;
+  margin-top: 0.2em;
+  right: 1em;
+  left: 60%;
+  top: 1em;
+/*  margin-top: -1em; */
+}
+
+#editquery {
+   top: 1.3em;
+}
+
+
+#editsearches {
+  top: 24em;
+}
+
+
+#pick-criteria {
+ width: 58%;
+ padding-top: 0em;
+ margin-top: 0em;
+}
+
+#pick-criteria .titlebox-content {
+ overflow-x: auto;
+}
+
+#BuildQuery .submit {
+ width: 58%;
+}
+
+
+#sorting.titlebox {
+ width: 55%;
+ padding-right: 1em;
+}
+
+#display-options .submit {
+ width: 100%;
+}
+
+
+
+.search-result-views {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin-top: -2px;
+ margin-right: 0em;
+ padding: 0.25em;
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+ background-color: #ccc;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+ -moz-border-radius-bottomleft: 0.5em;
+ -webkit-border-bottom-left-radius: 0.5em;
+}
+
+
+
+.search-result-views li {
+
+ display: inline;
+}
+
+.search-result-views li:after  {
+ content: " \00b7 ";
+}
+
+.search-result-views li:last-child:after  {
+ content: "";
+
+}
+
+.edit-saved-searches .label {
+    display: inline-block;
+    width: 10em;
+    font-weight: bold;
+}
+
+span#display-options {
+    display: block;
+    padding-top: 2em;
+    margin-top: 2em;
+    border-top: 1px solid #ccc;
+    clear: both;
+}
+
+span#display-options .titlebox#sorting {
+    float: left;
+    width: auto;
+    margin-right: 2em;
+    min-width: 35%;
+}
+
+span#display-options .titlebox#columns {
+    float: left;
+}
+
+span#display-options .titlebox#columns table.edit-columns td {
+    padding: 0.5em;
+}
+
+span#display-options .titlebox#columns table.edit-columns div.row {
+    width: 9em; 
+}
+span#display-options .titlebox#columns table.edit-columns span.label {
+    width: 2em;
+}
+
+span#display-options .titlebox#columns table.edit-columns span.value input,
+span#display-options .titlebox#columns table.edit-columns span.value select {
+    width: 7em;
+    padding: 0;
+}
+
+span#display-options .titlebox#columns table.edit-columns span.value {
+    display: inline-block;
+    width:7em;
+}
+
+#BuildQuery #formatbuttons.submit{
+    width: 85%;
+}
+
+.refresh {
+    float: left;
+}
+
+/* Force some widget to fit at max parent box */
+#HomeRefreshInterval, #SavedSearchLoad, #SavedSearchOwner {
+    max-width: 100%;
+}
+
diff --git a/share/html/NoAuth/css/ballard/ticket.css b/share/html/NoAuth/css/ballard/ticket.css
new file mode 100644
index 0000000..f97c541
--- /dev/null
+++ b/share/html/NoAuth/css/ballard/ticket.css
@@ -0,0 +1,286 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%#                                          <jesse at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+div#ticket-history div.ticket-transaction {
+ border-top: 1px solid #ccc;
+ padding-bottom: 0.25em;
+
+}
+
+div#ticket-history div.odd {
+ background-color: #fff;
+}
+
+div#ticket-history {
+
+ margin-top: 0.75em;
+ border-left: 1px solid #ccc;
+
+ border-right: 2px solid #999; 
+  border-bottom: 2px solid #999;
+
+}
+
+.ticket-transaction div.metadata span.actions {
+ position: absolute;
+ right: 2.3em;
+ padding: 0em;
+ background: #ccc;
+ text-align: right;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+ color: #ccc;
+ -moz-border-radius-bottomleft: 0.5em;
+ -webkit-border-bottom-left-radius: 0.5em;
+ white-space: nowrap;
+}
+
+.ticket-transaction div.metadata  span.type {
+ text-align: center;
+ float: left;
+ margin: 0.25em 0.70em 0.25em 0.25em;
+ width: 1em;
+ height: 1.25em;
+ padding: 0.75em 0 0 0;
+ border-right: 1px solid #999;
+ border-bottom: 1px solid #999;
+ -moz-border-radius: 0.25em;
+ -webkit-border-bottom-right-radius: 0.25em;
+}
+
+div#ticket-history span.type a {
+ color: #fff;
+}
+
+
+div#ticket-history span.date {
+ width: 10em;
+}
+
+
+div#ticket-history span.description {
+ margin-left: 1em;
+ font-weight: bold;
+}
+
+div#ticket-history span.time-taken {
+ margin-left: 1em;
+}
+
+div#ticket-history div.content {
+ padding-right: 1em;
+ padding-bottom: 0.7em;
+ font-size: 1.1em;
+ margin-left: 1.5em;
+}
+
+.plain-text-white-space {
+ white-space: pre-wrap;
+ font-family: monospace;
+}
+
+.ticket-transaction .messagebody {
+ font-size: 1em;
+ padding-left: 1em;
+ margin-top: 0.5em;
+ padding-top: 0.5em;
+ border-top: 1px solid #ccc;
+ /*overflow: auto; */
+ min-height: 2.5em;
+ /* To avoid overlapping of "downloadattachment" by messagebody */
+ clear: left;
+ word-wrap: break-word;
+}
+
+.ticket-transaction .messagebody img {
+ max-width: 100%;
+}
+
+div#ticket-history div.downloadattachment {
+float: right;
+clear: both;
+font-size: 0.9em;
+text-align: right;
+background: #ddd;
+padding: 0.5em;
+margin-left: 1em;
+
+border: 1px solid #ccc;
+border-right: 2px solid #aaa;
+border-bottom: 2px solid #aaa;
+margin-top: 0.5em;
+-moz-border-radius: 0.5em;
+-webkit-border-radius: 0.5em;
+
+}
+
+div#ticket-history div.downloadattachment .downloadcontenttype{
+color: #666;
+padding-right:0.25em;
+}
+
+
+div#ticket-history .message-header-key {
+  width: 7em;
+  font-weight: bold;
+  color: #666;
+}
+
+
+div#ticket-history .messagebody .messagebody{
+ font-size: 1em;
+ padding: 0; 
+ border: 0;
+ margin: 0;
+}
+
+
+
+.ticket-transaction.basics .type { background: #b32; }
+.ticket-transaction.cfs .type { background: #b32; }
+.ticket-transaction.people .type { background: #48c; }
+.ticket-transaction.links .type { background: #316531; }
+.ticket-transaction.dates .type { background: #633063; }
+.ticket-transaction.message .type { background: #069; }
+.ticket-transaction.reminders .type { background: #369; }
+.ticket-transaction.other .type { background: #abc; }
+
+
+
+
+.ticket-info-cfs .titlebox-title .left { background-color: #b32; color: #fff;}
+.ticket-info-basics .titlebox-title .left { background-color: #b32;  color: #fff;}
+.ticket-info-people .titlebox-title .left { background-color: #48c;  color: #fff;}
+.ticket-info-requestor .titlebox-title .left { white-space: nowrap; background-color: #48c;  color: #fff;}
+.ticket-info-links .titlebox-title .left { background-color: #316531;  color: #fff;}
+.ticket-info-reminders .titlebox-title .left { background-color: #369;  color: #fff;}
+.ticket-info-dates .titlebox-title .left { background-color: #633063;  color: #fff;}
+.ticket-info-attachments .titlebox-title .left { background-color: #993366;  color: #fff;}
+
+
+.ticket-summary .titlebox-title .left a, .ticket-summary .titlebox-title .left a:visited { color: #fff;}
+
+.unread-messages .titlebox , .unread-messages .titlebox-title .left { 
+  border: 1px solid #99a;
+  border-right: 2px solid #aab;
+  border-bottom: 2px solid #aab;
+
+}
+
+
+.unread-messages .titlebox { 
+  background-color: #dde;
+}
+
+.unread-messages .titlebox-title .left { 
+  background-color: #cce;
+}
+
+.ticket-inactive {
+  text-decoration: line-through;
+  color: #666
+}
+
+table.ticket-summary td.boxcontainer:first-child {
+  width: 50%;
+}
+
+/* Message quoting */
+
+.message-stanza-depth-1 {
+    color: #1a1aa6;
+}
+
+div.requestor-ticket-links {
+    text-align: left;
+    font-size: 0.8em;
+    padding-top: 0.25em;
+}
+
+.more-about-requestor-extra-field .label {
+    display: inline-block;
+    width: 8em;
+    font-weight: bold;
+    text-align: right;
+}
+
+.more-about-requestor-extra-field .value {
+    display: inline-block;
+}
+
+.ticket-info-requestor .more-about-requestor-extra,
+.ticket-info-requestor .comments-about-user,
+.ticket-info-requestor .more-about-requestor-tickets,
+.ticket-info-requestor .more-about-user-groups
+{
+    margin: 1em 0;
+}
+
+.ticket-info-requestor .comments-about-user .label,
+.ticket-info-requestor .more-about-user-groups .label,
+.ticket-info-requestor .more-about-requestor-tickets .label
+{
+    display: block;
+    font-weight: bold;
+    text-align: left;
+}
+
+.ticket-info-requestor .more-about-user-groups .value ul,
+.ticket-info-requestor .more-about-requestor-tickets ul
+{
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+
+/* textareas get to be bigger */
+.edit-custom-field.cftype-Text textarea,
+.edit-custom-field.cftype-Freeform input,
+.edit-custom-field.cftype-Wikitext textarea
+{
+    width: 100%;
+}

commit 3422b6e9a4d34cbba0c4e9f129fccbeeabe10562
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Thu Nov 4 17:50:37 2010 -0400

    Use a more correct default path for our matching

diff --git a/share/html/Elements/Tabs b/share/html/Elements/Tabs
index 1c8d04b..645151e 100755
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@ -49,7 +49,7 @@
 <a name="skipnav" id="skipnav" accesskey="8"></a>
 <%INIT>
 
-my $request_path = $HTML::Mason::Commands::r->uri;
+my $request_path = $HTML::Mason::Commands::r->path_info;
 
 my $query_string = sub {
     my %args = @_;

-----------------------------------------------------------------------


More information about the Rt-commit mailing list