From f762b160efd5cafd919a6fd7f9587f578eceb454 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Sun, 02 Oct 2011 16:59:44 -0400
Subject: [PATCH] Merge branch 'master' into rpc

---
 docs/gitblit_logo_white.xcf                                     |    0 
 src/com/gitblit/wicket/panels/TagsPanel.html                    |    2 
 src/com/gitblit/wicket/panels/FederationTokensPanel.html        |    2 
 src/com/gitblit/wicket/panels/RepositoriesPanel.java            |   16 
 src/com/gitblit/wicket/pages/RepositoryPage.java                |   38 
 src/com/gitblit/wicket/pages/ReviewProposalPage.java            |   13 
 src/com/gitblit/wicket/pages/SendProposalPage.java              |    8 
 src/com/gitblit/wicket/pages/RootPage.html                      |   38 
 docs/doc_footer.html                                            |   12 
 src/com/gitblit/wicket/pages/EditUserPage.html                  |    9 
 src/com/gitblit/wicket/GitBlitWebApp.properties                 |    6 
 src/com/gitblit/wicket/WicketUtils.java                         |   10 
 resources/bootstrap.130.css                                     |  330 ++++++++
 resources/gitblt2_white.png                                     |    0 
 docs/site_footer.html                                           |   12 
 src/com/gitblit/wicket/pages/RootPage.java                      |  156 ++++
 src/com/gitblit/wicket/panels/UsersPanel.html                   |    4 
 src/com/gitblit/wicket/pages/RepositoryPage.html                |   46 
 src/com/gitblit/wicket/pages/ReviewProposalPage.html            |    7 
 src/com/gitblit/wicket/panels/RepositoriesPanel.html            |    8 
 docs/04_design.mkd                                              |    1 
 resources/bootstrap.gb.css                                      |  758 +++++++++++++++++++
 src/com/gitblit/wicket/pages/EditRepositoryPage.html            |   24 
 resources/markdown.css                                          |    9 
 src/com/gitblit/wicket/pages/EditRepositoryPage.java            |    9 
 src/com/gitblit/wicket/pages/FederationPage.html                |   17 
 src/com/gitblit/wicket/panels/LogPanel.html                     |    2 
 src/com/gitblit/wicket/pages/TicketPage.java                    |    2 
 src/com/gitblit/wicket/pages/FederationPage.java                |   52 +
 src/com/gitblit/wicket/pages/BasePage.java                      |   20 
 src/com/gitblit/models/FederationModel.java                     |   17 
 src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.html         |    8 
 src/com/gitblit/wicket/pages/BasePage.html                      |   22 
 src/com/gitblit/wicket/pages/TicketPage.html                    |    2 
 src/com/gitblit/utils/StringUtils.java                          |   42 +
 src/com/gitblit/wicket/pages/ChangePasswordPage.html            |   19 
 NOTICE                                                          |    8 
 src/com/gitblit/wicket/pages/RepositoriesPage.java              |  114 +-
 docs/site_header.html                                           |   33 
 src/com/gitblit/wicket/pages/RootSubPage.html                   |   18 
 docs/04_releases.mkd                                            |    2 
 src/com/gitblit/wicket/pages/ChangePasswordPage.java            |   12 
 resources/gitblt_25_white.png                                   |    0 
 src/com/gitblit/wicket/pages/RepositoriesPage.html              |   16 
 src/com/gitblit/wicket/panels/FederationProposalsPanel.html     |    2 
 docs/00_index.mkd                                               |    2 
 src/com/gitblit/wicket/pages/RootSubPage.java                   |   48 +
 src/com/gitblit/utils/JGitUtils.java                            |    2 
 src/com/gitblit/wicket/pages/FederationRegistrationPage.html    |    5 
 resources/login.mkd                                             |    3 
 src/com/gitblit/wicket/pages/BlamePage.html                     |    4 
 src/com/gitblit/wicket/AuthorizationStrategy.java               |   14 
 src/com/gitblit/wicket/pages/UsersPage.html                     |   11 
 src/com/gitblit/build/BuildSite.java                            |    2 
 src/com/gitblit/wicket/pages/EditUserPage.java                  |   13 
 src/com/gitblit/wicket/pages/FederationRegistrationPage.java    |   17 
 distrib/gitblit.properties                                      |    9 
 src/com/gitblit/wicket/pages/MetricsPage.java                   |    4 
 /dev/null                                                       |  118 ---
 src/com/gitblit/wicket/panels/FederationRegistrationsPanel.html |    2 
 docs/02_federation.mkd                                          |    2 
 src/com/gitblit/models/RepositoryModel.java                     |    3 
 src/com/gitblit/wicket/pages/SendProposalPage.html              |   16 
 build.xml                                                       |   12 
 docs/doc_header.html                                            |   26 
 src/com/gitblit/wicket/GitBlitWebApp.java                       |   10 
 src/com/gitblit/wicket/pages/UsersPage.java                     |   30 
 src/com/gitblit/wicket/panels/BranchesPanel.html                |    2 
 68 files changed, 1,820 insertions(+), 461 deletions(-)

diff --git a/NOTICE b/NOTICE
index 41b61f1..5e49803 100644
--- a/NOTICE
+++ b/NOTICE
@@ -8,6 +8,14 @@
 in this distribution or linked to by this distribution.
 
 ---------------------------------------------------------------------------
+Bootstrap
+---------------------------------------------------------------------------
+   Bootstrap, released under the
+   Apache Software License, Version 2.0.
+
+   http://twitter.github.com/bootstrap
+
+---------------------------------------------------------------------------
 google-code-prettify
 ---------------------------------------------------------------------------
    google-code-prettify, released under the
diff --git a/build.xml b/build.xml
index e803d11..9a58971 100644
--- a/build.xml
+++ b/build.xml
@@ -196,10 +196,10 @@
 			<copy todir="${docs.output.dir}">
 				<!-- Copy selected Gitblit resources -->
 				<fileset dir="${project.resources.dir}">
-					<include name="background.png" />
-					<include name="gitblit.css" />
+					<include name="bootstrap.130.css" />
+					<include name="bootstrap.gb.css" />
 					<include name="markdown.css" />
-					<include name="gitblt_25.png" />
+					<include name="gitblt_25_white.png" />
 					<include name="gitblt-favicon.png" />
 					<include name="lock_go_16x16.png" />
 					<include name="lock_pull_16x16.png" />
@@ -425,10 +425,10 @@
 		<copy todir="${project.site.dir}">
 			<!-- Copy selected Gitblit resources -->
 			<fileset dir="${project.resources.dir}">
-				<include name="background.png" />
-				<include name="gitblit.css" />
+				<include name="bootstrap.130.css" />
+				<include name="bootstrap.gb.css" />
 				<include name="markdown.css" />
-				<include name="gitblt_25.png" />
+				<include name="gitblt_25_white.png" />
 				<include name="gitblt-favicon.png" />
 				<include name="lock_go_16x16.png" />
 				<include name="lock_pull_16x16.png" />
diff --git a/distrib/gitblit.properties b/distrib/gitblit.properties
index 2876382..3de1475 100644
--- a/distrib/gitblit.properties
+++ b/distrib/gitblit.properties
@@ -116,7 +116,14 @@
 # SINCE 0.6.0
 web.showFederationRegistrations = false
 
-# This is the message display above the repositories table.
+# This is the message displayed when *web.authenticateViewPages=true*.
+# This can point to a file with Markdown content.
+# Specifying "gitblit" uses the internal login message.
+#
+# SINCE 0.6.1
+web.loginMessage = gitblit
+
+# This is the message displayed above the repositories table.
 # This can point to a file with Markdown content.
 # Specifying "gitblit" uses the internal welcome message.
 #
diff --git a/docs/00_index.mkd b/docs/00_index.mkd
index 2c40e1e..fde2d34 100644
--- a/docs/00_index.mkd
+++ b/docs/00_index.mkd
@@ -28,6 +28,8 @@
 
 **%VERSION%** ([go](http://code.google.com/p/gitblit/downloads/detail?name=%GO%)|[war](http://code.google.com/p/gitblit/downloads/detail?name=%WAR%)|[fedclient](http://code.google.com/p/gitblit/downloads/detail?name=%FEDCLIENT%)) based on [%JGIT%][jgit] &nbsp; *released %BUILDDATE%*
 
+- improved: updated ui with Twitter's Bootstrap CSS toolkit
+<br/>**New:** *web.loginMessage = gitblit*
 - fixed: Null pointer exception if did not set federation strategy (issue 20)
 - fixed: Gitblit GO allows SSL renegotiation if running on Java 1.6.0_22 or later
 - added: IUserService.setup(IStoredSettings) for custom user service implementations
diff --git a/docs/02_federation.mkd b/docs/02_federation.mkd
index f77d703..abf171e 100644
--- a/docs/02_federation.mkd
+++ b/docs/02_federation.mkd
@@ -175,7 +175,7 @@
 
 ## Federation Pull Registration Keys
 
-<table class="text">
+<table>
 <tr><th>federation.N.url</th>
 <td>string</td>
 <td>the url of the origin Gitblit instance *(required)*</td>
diff --git a/docs/04_design.mkd b/docs/04_design.mkd
index 523d31b..fe22674 100644
--- a/docs/04_design.mkd
+++ b/docs/04_design.mkd
@@ -10,6 +10,7 @@
 ### Bundled Dependencies
 The following dependencies are bundled with Gitblit.
 
+- [Bootstrap](http://twitter.github.com/bootstrap) (Apache 2.0)
 - [google-code-prettify](http://code.google.com/p/google-code-prettify) (Apache 2.0)
 - [Commons Daemon](http://commons.apache.org/daemon) (Apache 2.0)
 - magnifying glass search icon courtesy of [Gnome](http://gnome.org) (Creative Commons CC-BY)
diff --git a/docs/04_releases.mkd b/docs/04_releases.mkd
index 667e5f2..cb1f898 100644
--- a/docs/04_releases.mkd
+++ b/docs/04_releases.mkd
@@ -3,6 +3,8 @@
 ### Current Release
 **%VERSION%** ([go](http://code.google.com/p/gitblit/downloads/detail?name=%GO%)|[war](http://code.google.com/p/gitblit/downloads/detail?name=%WAR%)|[fedclient](http://code.google.com/p/gitblit/downloads/detail?name=%FEDCLIENT%)) based on [%JGIT%][jgit] &nbsp; *released %BUILDDATE%*
 
+- improved: updated ui with Twitter's Bootstrap CSS toolkit
+<br/>**New:** *web.loginMessage = gitblit*
 - fixed: Null pointer exception if did not set federation strategy (issue 20)
 - fixed: Gitblit GO allows SSL renegotiation if running on Java 1.6.0_22 or later
 - added: IUserService.setup(IStoredSettings) for custom user service implementations
diff --git a/docs/doc_footer.html b/docs/doc_footer.html
index e1a5738..ab2d7ee 100644
--- a/docs/doc_footer.html
+++ b/docs/doc_footer.html
@@ -1,7 +1,9 @@
-	</div>
-	<div style="margin-top:10px" class="page_footer">
-		<div style="float:right;">{0}</div>
-	The content of this page is licensed under the <a href="http://creativecommons.org/licenses/by/3.0">Creative Commons Attribution 3.0 License</a>.
-	</div>
+			</div> <!-- markdown -->
+			<div style="margin-top:10px" class="page_footer">
+				<div style="float:right;">{0}</div>
+			The content of this page is licensed under the <a href="http://creativecommons.org/licenses/by/3.0">Creative Commons Attribution 3.0 License</a>.
+			</div>			
+		</div> <!-- content -->
+	</div> <!-- container -->	
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/doc_header.html b/docs/doc_header.html
index 71ba841..802f950 100644
--- a/docs/doc_header.html
+++ b/docs/doc_header.html
@@ -2,7 +2,8 @@
 <html>
 	<head>
 		<title>Gitblit</title>
-		<link rel="stylesheet" type="text/css" href="./gitblit.css"/>
+		<link rel="stylesheet" type="text/css" href="./bootstrap.130.css"/>
+		<link rel="stylesheet" type="text/css" href="./bootstrap.gb.css"/>
 		<link rel="stylesheet" type="text/css" href="./markdown.css"/>
 		<link rel="shortcut icon" type="image/png" href="./gitblt-favicon.png" />
 		<meta name="ROBOTS" content="INDEX, NOFOLLOW">
@@ -28,12 +29,19 @@
 		<script type="text/javascript" src="prettify/prettify.js"></script>
 		<link href="prettify/prettify.css" type="text/css" rel="stylesheet" />		
 	</head>
-	<body style="width:900px"  onload="prettyPrint()">
-		<div class="page_header">
-			<a title="gitblit homepage" href="http://gitblit.com/">
-				<img src="./gitblt_25.png" width="79" height="25" alt="gitblit" class="logo"/>
-			</a>
-			<span style="color:black;">{0}</span>
+	<body style="padding-top:40px;"  onload="prettyPrint()">
+		<div class="topbar">
+			<div class="fill">
+				<div class="container">
+					<a class="brand" href="http://gitblit.com" title="gitblit homepage">
+						<img src="gitblt_25_white.png" width="79" height="25" alt="gitblit" class="logo"/>
+					</a>
+					<ul class="nav">
+						{1}		
+					</ul>
+				</div>
+			</div>
 		</div>
-		<div class="page_nav">{1}</div>
-		<div class="markdown">
\ No newline at end of file
+		<div class="container">
+			<div class="content">
+				<div class="markdown">
\ No newline at end of file
diff --git a/docs/gitblit_logo_white.xcf b/docs/gitblit_logo_white.xcf
new file mode 100644
index 0000000..d0d397c
--- /dev/null
+++ b/docs/gitblit_logo_white.xcf
Binary files differ
diff --git a/docs/site_footer.html b/docs/site_footer.html
index e1a5738..ab2d7ee 100644
--- a/docs/site_footer.html
+++ b/docs/site_footer.html
@@ -1,7 +1,9 @@
-	</div>
-	<div style="margin-top:10px" class="page_footer">
-		<div style="float:right;">{0}</div>
-	The content of this page is licensed under the <a href="http://creativecommons.org/licenses/by/3.0">Creative Commons Attribution 3.0 License</a>.
-	</div>
+			</div> <!-- markdown -->
+			<div style="margin-top:10px" class="page_footer">
+				<div style="float:right;">{0}</div>
+			The content of this page is licensed under the <a href="http://creativecommons.org/licenses/by/3.0">Creative Commons Attribution 3.0 License</a>.
+			</div>			
+		</div> <!-- content -->
+	</div> <!-- container -->	
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/site_header.html b/docs/site_header.html
index 6365117..86aae41 100644
--- a/docs/site_header.html
+++ b/docs/site_header.html
@@ -2,7 +2,8 @@
 <html>
 	<head>
 		<title>Gitblit</title>
-		<link rel="stylesheet" type="text/css" href="./gitblit.css"/>
+		<link rel="stylesheet" type="text/css" href="./bootstrap.130.css"/>
+		<link rel="stylesheet" type="text/css" href="./bootstrap.gb.css"/>
 		<link rel="stylesheet" type="text/css" href="./markdown.css"/>
 		<link rel="shortcut icon" type="image/png" href="./gitblt-favicon.png" />
 		<meta name="ROBOTS" content="INDEX">
@@ -33,15 +34,23 @@
 		
 		<!-- ANALYTICS -->
 	</head>
-	<body style="width:900px"  onload="prettyPrint()">
-		<a href="http://github.com/gitblit"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://d3nwyuy0nl342s.cloudfront.net/img/30f550e0d38ceb6ef5b81500c64d970b7fb0f028/687474703a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6f72616e67655f6666373630302e706e67" alt="Fork me on GitHub"></a>
-		<div class="page_header">
-			<a title="gitblit homepage" href="http://gitblit.com/">
-				<img src="./gitblt_25.png" width="79" height="25" alt="gitblit" class="logo"/>
-			</a>
-			<span style="color:black;">{0}</span>
-			<!-- Google Plus One -->
-			<g:plusone></g:plusone>
+	<body style="padding-top:40px;"  onload="prettyPrint()">
+		<div class="topbar">
+			<div class="fill">
+				<div class="container">
+					<a class="brand" href="http://gitblit.com" title="gitblit homepage">
+						<img src="gitblt_25_white.png" width="79" height="25" alt="gitblit" class="logo"/>
+					</a>
+		
+					<!-- Google Plus One -->
+					<g:plusone></g:plusone>
+		
+					<ul class="nav">
+						{1}		
+					</ul>
+				</div>
+			</div>
 		</div>
-		<div class="page_nav">{1}</div>
-		<div class="markdown">
\ No newline at end of file
+		<div class="container">
+			<div class="content">
+				<div class="markdown">
\ No newline at end of file
diff --git a/resources/bootstrap.130.css b/resources/bootstrap.130.css
new file mode 100644
index 0000000..613ed75
--- /dev/null
+++ b/resources/bootstrap.130.css
@@ -0,0 +1,330 @@
+html,body{margin:0;padding:0;}
+h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,cite,code,del,dfn,em,img,q,s,samp,small,strike,strong,sub,sup,tt,var,dd,dl,dt,li,ol,ul,fieldset,form,label,legend,button,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;font-weight:normal;font-style:normal;font-size:100%;line-height:1;font-family:inherit;}
+table{border-collapse:collapse;border-spacing:0;}
+ol,ul{list-style:none;}
+q:before,q:after,blockquote:before,blockquote:after{content:"";}
+html{overflow-y:scroll;font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
+a:focus{outline:thin dotted;}
+a:hover,a:active{outline:0;}
+article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
+audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
+audio:not([controls]){display:none;}
+sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}
+sup{top:-0.5em;}
+sub{bottom:-0.25em;}
+img{border:0;-ms-interpolation-mode:bicubic;}
+button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;}
+button,input{line-height:normal;*overflow:visible;}
+button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0;}
+button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;}
+input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;}
+input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}
+textarea{overflow:auto;vertical-align:top;}
+html,body{background-color:#ffffff;}
+body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;color:#404040;}
+.container{width:940px;margin-left:auto;margin-right:auto;zoom:1;}.container:before,.container:after{display:table;content:"";zoom:1;*display:inline;}
+.container:after{clear:both;}
+.container-fluid{position:relative;min-width:940px;padding-left:20px;padding-right:20px;zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";zoom:1;*display:inline;}
+.container-fluid:after{clear:both;}
+.container-fluid>.sidebar{float:left;width:220px;}
+.container-fluid>.content{margin-left:240px;}
+a{color:#0069d6;text-decoration:none;line-height:inherit;font-weight:inherit;}a:hover{color:#00438a;text-decoration:underline;}
+.pull-right{float:right;}
+.pull-left{float:left;}
+.hide{display:none;}
+.show{display:block;}
+.row{zoom:1;margin-left:-20px;}.row:before,.row:after{display:table;content:"";zoom:1;*display:inline;}
+.row:after{clear:both;}
+[class*="span"]{display:inline;float:left;margin-left:20px;}
+.span1{width:40px;}
+.span2{width:100px;}
+.span3{width:160px;}
+.span4{width:220px;}
+.span5{width:280px;}
+.span6{width:340px;}
+.span7{width:400px;}
+.span8{width:460px;}
+.span9{width:520px;}
+.span10{width:580px;}
+.span11{width:640px;}
+.span12{width:700px;}
+.span13{width:760px;}
+.span14{width:820px;}
+.span15{width:880px;}
+.span16{width:940px;}
+.span17{width:1000px;}
+.span18{width:1060px;}
+.span19{width:1120px;}
+.span20{width:1180px;}
+.span21{width:1240px;}
+.span22{width:1300px;}
+.span23{width:1360px;}
+.span24{width:1420px;}
+.offset1{margin-left:80px;}
+.offset2{margin-left:140px;}
+.offset3{margin-left:200px;}
+.offset4{margin-left:260px;}
+.offset5{margin-left:320px;}
+.offset6{margin-left:380px;}
+.offset7{margin-left:440px;}
+.offset8{margin-left:500px;}
+.offset9{margin-left:560px;}
+.offset10{margin-left:620px;}
+.offset11{margin-left:680px;}
+.offset12{margin-left:740px;}
+.span-one-third{width:300px;}
+.span-two-thirds{width:620px;}
+.offset-one-third{margin-left:340px;}
+.offset-two-thirds{margin-left:660px;}
+p{font-size:13px;font-weight:normal;line-height:18px;margin-bottom:9px;}p small{font-size:11px;color:#bfbfbf;}
+h1,h2,h3,h4,h5,h6{font-weight:bold;color:#404040;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#bfbfbf;}
+h1{margin-bottom:18px;font-size:30px;line-height:36px;}h1 small{font-size:18px;}
+h2{font-size:24px;line-height:36px;}h2 small{font-size:14px;}
+h3,h4,h5,h6{line-height:36px;}
+h3{font-size:18px;}h3 small{font-size:14px;}
+h4{font-size:16px;}h4 small{font-size:12px;}
+h5{font-size:14px;}
+h6{font-size:13px;color:#bfbfbf;text-transform:uppercase;}
+ul,ol{margin:0 0 18px 25px;}
+ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
+ul{list-style:disc;}
+ol{list-style:decimal;}
+li{line-height:18px;color:#808080;}
+ul.unstyled{list-style:none;margin-left:0;}
+dl{margin-bottom:18px;}dl dt,dl dd{line-height:18px;}
+dl dt{font-weight:bold;}
+dl dd{margin-left:9px;}
+hr{margin:20px 0 19px;border:0;border-bottom:1px solid #eee;}
+strong{font-style:inherit;font-weight:bold;}
+em{font-style:italic;font-weight:inherit;line-height:inherit;}
+.muted{color:#bfbfbf;}
+blockquote{margin-bottom:18px;border-left:5px solid #eee;padding-left:15px;}blockquote p{font-size:14px;font-weight:300;line-height:18px;margin-bottom:0;}
+blockquote small{display:block;font-size:12px;font-weight:300;line-height:18px;color:#bfbfbf;}blockquote small:before{content:'\2014 \00A0';}
+address{display:block;line-height:18px;margin-bottom:18px;}
+code,pre{padding:0 3px 2px;font-family:Monaco, Andale Mono, Courier New, monospace;font-size:12px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+code{background-color:#fee9cc;color:rgba(0, 0, 0, 0.75);padding:1px 3px;}
+pre{background-color:#f5f5f5;display:block;padding:8.5px;margin:0 0 18px;line-height:18px;font-size:12px;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;white-space:pre;white-space:pre-wrap;word-wrap:break-word;}
+form{margin-bottom:18px;}
+fieldset{margin-bottom:18px;padding-top:18px;}fieldset legend{display:block;padding-left:150px;font-size:19.5px;line-height:1;color:#404040;*padding:0 0 5px 145px;*line-height:1.5;}
+form .clearfix{margin-bottom:18px;zoom:1;}form .clearfix:before,form .clearfix:after{display:table;content:"";zoom:1;*display:inline;}
+form .clearfix:after{clear:both;}
+label,input,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:normal;}
+label{padding-top:6px;font-size:13px;line-height:18px;float:left;width:130px;text-align:right;color:#404040;}
+form .input{margin-left:150px;}
+input[type=checkbox],input[type=radio]{cursor:pointer;}
+input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;font-size:13px;line-height:18px;color:#808080;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+input[type=checkbox],input[type=radio]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:none;}
+input[type=file]{background-color:#ffffff;padding:initial;border:initial;line-height:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+input[type=button],input[type=reset],input[type=submit]{width:auto;height:auto;}
+select,input[type=file]{height:27px;line-height:27px;*margin-top:4px;}
+select[multiple]{height:inherit;}
+textarea{height:auto;}
+.uneditable-input{background-color:#ffffff;display:block;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
+:-moz-placeholder{color:#bfbfbf;}
+::-webkit-input-placeholder{color:#bfbfbf;}
+input,textarea{-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;-webkit-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);}
+input:focus,textarea:focus{outline:0;border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);}
+input[type=file]:focus,input[type=checkbox]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:1px dotted #666;}
+form div.clearfix.error{background:#fae5e3;padding:10px 0;margin:-10px 0 10px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}form div.clearfix.error>label,form div.clearfix.error span.help-inline,form div.clearfix.error span.help-block{color:#9d261d;}
+form div.clearfix.error input,form div.clearfix.error textarea{border-color:#c87872;-webkit-box-shadow:0 0 3px rgba(171, 41, 32, 0.25);-moz-box-shadow:0 0 3px rgba(171, 41, 32, 0.25);box-shadow:0 0 3px rgba(171, 41, 32, 0.25);}form div.clearfix.error input:focus,form div.clearfix.error textarea:focus{border-color:#b9554d;-webkit-box-shadow:0 0 6px rgba(171, 41, 32, 0.5);-moz-box-shadow:0 0 6px rgba(171, 41, 32, 0.5);box-shadow:0 0 6px rgba(171, 41, 32, 0.5);}
+form div.clearfix.error .input-prepend span.add-on,form div.clearfix.error .input-append span.add-on{background:#f4c8c5;border-color:#c87872;color:#b9554d;}
+.input-mini,input.mini,textarea.mini,select.mini{width:60px;}
+.input-small,input.small,textarea.small,select.small{width:90px;}
+.input-medium,input.medium,textarea.medium,select.medium{width:150px;}
+.input-large,input.large,textarea.large,select.large{width:210px;}
+.input-xlarge,input.xlarge,textarea.xlarge,select.xlarge{width:270px;}
+.input-xxlarge,input.xxlarge,textarea.xxlarge,select.xxlarge{width:530px;}
+textarea.xxlarge{overflow-y:auto;}
+input.span1,textarea.span1,select.span1{display:inline-block;float:none;width:30px;margin-left:0;}
+input.span2,textarea.span2,select.span2{display:inline-block;float:none;width:90px;margin-left:0;}
+input.span3,textarea.span3,select.span3{display:inline-block;float:none;width:150px;margin-left:0;}
+input.span4,textarea.span4,select.span4{display:inline-block;float:none;width:210px;margin-left:0;}
+input.span5,textarea.span5,select.span5{display:inline-block;float:none;width:270px;margin-left:0;}
+input.span6,textarea.span6,select.span6{display:inline-block;float:none;width:330px;margin-left:0;}
+input.span7,textarea.span7,select.span7{display:inline-block;float:none;width:390px;margin-left:0;}
+input.span8,textarea.span8,select.span8{display:inline-block;float:none;width:450px;margin-left:0;}
+input.span9,textarea.span9,select.span9{display:inline-block;float:none;width:510px;margin-left:0;}
+input.span10,textarea.span10,select.span10{display:inline-block;float:none;width:570px;margin-left:0;}
+input.span11,textarea.span11,select.span11{display:inline-block;float:none;width:630px;margin-left:0;}
+input.span12,textarea.span12,select.span12{display:inline-block;float:none;width:690px;margin-left:0;}
+input.span13,textarea.span13,select.span13{display:inline-block;float:none;width:750px;margin-left:0;}
+input.span14,textarea.span14,select.span14{display:inline-block;float:none;width:810px;margin-left:0;}
+input.span15,textarea.span15,select.span15{display:inline-block;float:none;width:870px;margin-left:0;}
+input.span16,textarea.span16,select.span16{display:inline-block;float:none;width:930px;margin-left:0;}
+input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;}
+.actions{background:#f5f5f5;margin-top:18px;margin-bottom:18px;padding:17px 20px 18px 150px;border-top:1px solid #ddd;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;}.actions .secondary-action{float:right;}.actions .secondary-action a{line-height:30px;}.actions .secondary-action a:hover{text-decoration:underline;}
+.help-inline,.help-block{font-size:11px;line-height:18px;color:#bfbfbf;}
+.help-inline{padding-left:5px;*position:relative;*top:-5px;}
+.help-block{display:block;max-width:600px;}
+.inline-inputs{color:#808080;}.inline-inputs span,.inline-inputs input{display:inline-block;}
+.inline-inputs input.mini{width:60px;}
+.inline-inputs input.small{width:90px;}
+.inline-inputs span{padding:0 2px 0 1px;}
+.input-prepend input,.input-append input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
+.input-prepend .add-on,.input-append .add-on{position:relative;background:#f5f5f5;border:1px solid #ccc;z-index:2;float:left;display:block;width:auto;min-width:16px;height:18px;padding:4px 4px 4px 5px;margin-right:-1px;font-weight:normal;line-height:18px;color:#bfbfbf;text-align:center;text-shadow:0 1px 0 #ffffff;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.input-prepend .active,.input-append .active{background:#a9dba9;border-color:#46a546;}
+.input-prepend .add-on{*margin-top:1px;}
+.input-append input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.input-append .add-on{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;margin-right:0;margin-left:-1px;}
+.inputs-list{margin:0 0 5px;width:100%;}.inputs-list li{display:block;padding:0;width:100%;}
+.inputs-list label{display:block;float:none;width:auto;padding:0;line-height:18px;text-align:left;white-space:normal;}.inputs-list label strong{color:#808080;}
+.inputs-list label small{font-size:11px;font-weight:normal;}
+.inputs-list .inputs-list{margin-left:25px;margin-bottom:10px;padding-top:0;}
+.inputs-list:first-child{padding-top:6px;}
+.inputs-list li+li{padding-top:2px;}
+.inputs-list input[type=radio],.inputs-list input[type=checkbox]{margin-bottom:0;}
+.form-stacked{padding-left:20px;}.form-stacked fieldset{padding-top:9px;}
+.form-stacked legend{padding-left:0;}
+.form-stacked label{display:block;float:none;width:auto;font-weight:bold;text-align:left;line-height:20px;padding-top:0;}
+.form-stacked .clearfix{margin-bottom:9px;}.form-stacked .clearfix div.input{margin-left:0;}
+.form-stacked .inputs-list{margin-bottom:0;}.form-stacked .inputs-list li{padding-top:0;}.form-stacked .inputs-list li label{font-weight:normal;padding-top:0;}
+.form-stacked div.clearfix.error{padding-top:10px;padding-bottom:10px;padding-left:10px;margin-top:0;margin-left:-10px;}
+.form-stacked .actions{margin-left:-20px;padding-left:20px;}
+table{width:100%;margin-bottom:18px;padding:0;border-collapse:separate;*border-collapse:collapse;font-size:13px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}table th,table td{padding:10px 10px 9px;line-height:18px;text-align:left;}
+table th{padding-top:9px;font-weight:bold;vertical-align:middle;border-bottom:1px solid #ddd;}
+table td{vertical-align:top;}
+table th+th,table td+td{border-left:1px solid #ddd;}
+table tr+tr td{border-top:1px solid #ddd;}
+table tbody tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;}
+table tbody tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;}
+table tbody tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;}
+table tbody tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;}
+.zebra-striped tbody tr:nth-child(odd) td{background-color:#f9f9f9;}
+.zebra-striped tbody tr:hover td{background-color:#f5f5f5;}
+table .header{cursor:pointer;}table .header:after{content:"";float:right;margin-top:7px;border-width:0 4px 4px;border-style:solid;border-color:#000 transparent;visibility:hidden;}
+table .headerSortUp,table .headerSortDown{background-color:rgba(141, 192, 219, 0.25);text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);}
+table .header:hover:after{visibility:visible;}
+table .headerSortDown:after,table .headerSortDown:hover:after{visibility:visible;filter:alpha(opacity=60);-khtml-opacity:0.6;-moz-opacity:0.6;opacity:0.6;}
+table .headerSortUp:after{border-bottom:none;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000;visibility:visible;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;filter:alpha(opacity=60);-khtml-opacity:0.6;-moz-opacity:0.6;opacity:0.6;}
+table .blue{color:#049cdb;border-bottom-color:#049cdb;}
+table .headerSortUp.blue,table .headerSortDown.blue{background-color:#ade6fe;}
+table .green{color:#46a546;border-bottom-color:#46a546;}
+table .headerSortUp.green,table .headerSortDown.green{background-color:#cdeacd;}
+table .red{color:#9d261d;border-bottom-color:#9d261d;}
+table .headerSortUp.red,table .headerSortDown.red{background-color:#f4c8c5;}
+table .yellow{color:#ffc40d;border-bottom-color:#ffc40d;}
+table .headerSortUp.yellow,table .headerSortDown.yellow{background-color:#fff6d9;}
+table .orange{color:#f89406;border-bottom-color:#f89406;}
+table .headerSortUp.orange,table .headerSortDown.orange{background-color:#fee9cc;}
+table .purple{color:#7a43b6;border-bottom-color:#7a43b6;}
+table .headerSortUp.purple,table .headerSortDown.purple{background-color:#e2d5f0;}
+.topbar{height:40px;position:fixed;top:0;left:0;right:0;z-index:10000;overflow:visible;}.topbar a{color:#bfbfbf;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}
+.topbar h3 a:hover,.topbar .brand a:hover,.topbar ul .active>a{background-color:#333;background-color:rgba(255, 255, 255, 0.05);color:#ffffff;text-decoration:none;}
+.topbar h3{position:relative;}
+.topbar h3 a,.topbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;color:#ffffff;font-size:20px;font-weight:200;line-height:1;}
+.topbar p{margin:0;line-height:40px;}.topbar p a:hover{background-color:transparent;color:#ffffff;}
+.topbar form{float:left;margin:5px 0 0 0;position:relative;filter:alpha(opacity=100);-khtml-opacity:1;-moz-opacity:1;opacity:1;}
+.topbar form.pull-right{float:right;}
+.topbar input{background-color:#444;background-color:rgba(255, 255, 255, 0.3);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:normal;font-weight:13px;line-height:1;padding:4px 9px;color:#ffffff;color:rgba(255, 255, 255, 0.75);border:1px solid #111;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.topbar input:-moz-placeholder{color:#e6e6e6;}
+.topbar input::-webkit-input-placeholder{color:#e6e6e6;}
+.topbar input:hover{background-color:#bfbfbf;background-color:rgba(255, 255, 255, 0.5);color:#ffffff;}
+.topbar input:focus,.topbar input.focused{outline:0;background-color:#ffffff;color:#404040;text-shadow:0 1px 0 #ffffff;border:0;padding:5px 10px;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);}
+.topbar-inner,.topbar .fill{background-color:#222;background-color:#222222;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222));background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);}
+.topbar div>ul,.nav{display:block;float:left;margin:0 10px 0 0;position:relative;left:0;}.topbar div>ul>li,.nav>li{display:block;float:left;}
+.topbar div>ul a,.nav a{display:block;float:none;padding:10px 10px 11px;line-height:19px;text-decoration:none;}.topbar div>ul a:hover,.nav a:hover{color:#ffffff;text-decoration:none;}
+.topbar div>ul .active>a,.nav .active>a{background-color:#222;background-color:rgba(0, 0, 0, 0.5);}
+.topbar div>ul.secondary-nav,.nav.secondary-nav{float:right;margin-left:10px;margin-right:0;}.topbar div>ul.secondary-nav .menu-dropdown,.nav.secondary-nav .menu-dropdown,.topbar div>ul.secondary-nav .dropdown-menu,.nav.secondary-nav .dropdown-menu{right:0;border:0;}
+.topbar div>ul a.menu:hover,.nav a.menu:hover,.topbar div>ul li.open .menu,.nav li.open .menu,.topbar div>ul .dropdown-toggle:hover,.nav .dropdown-toggle:hover,.topbar div>ul .dropdown.open .dropdown-toggle,.nav .dropdown.open .dropdown-toggle{background:#444;background:rgba(255, 255, 255, 0.05);}
+.topbar div>ul .menu-dropdown,.nav .menu-dropdown,.topbar div>ul .dropdown-menu,.nav .dropdown-menu{background-color:#333;}.topbar div>ul .menu-dropdown a.menu,.nav .menu-dropdown a.menu,.topbar div>ul .dropdown-menu a.menu,.nav .dropdown-menu a.menu,.topbar div>ul .menu-dropdown .dropdown-toggle,.nav .menu-dropdown .dropdown-toggle,.topbar div>ul .dropdown-menu .dropdown-toggle,.nav .dropdown-menu .dropdown-toggle{color:#ffffff;}.topbar div>ul .menu-dropdown a.menu.open,.nav .menu-dropdown a.menu.open,.topbar div>ul .dropdown-menu a.menu.open,.nav .dropdown-menu a.menu.open,.topbar div>ul .menu-dropdown .dropdown-toggle.open,.nav .menu-dropdown .dropdown-toggle.open,.topbar div>ul .dropdown-menu .dropdown-toggle.open,.nav .dropdown-menu .dropdown-toggle.open{background:#444;background:rgba(255, 255, 255, 0.05);}
+.topbar div>ul .menu-dropdown li a,.nav .menu-dropdown li a,.topbar div>ul .dropdown-menu li a,.nav .dropdown-menu li a{color:#999;text-shadow:0 1px 0 rgba(0, 0, 0, 0.5);}.topbar div>ul .menu-dropdown li a:hover,.nav .menu-dropdown li a:hover,.topbar div>ul .dropdown-menu li a:hover,.nav .dropdown-menu li a:hover{background-color:#191919;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#292929), to(#191919));background-image:-moz-linear-gradient(top, #292929, #191919);background-image:-ms-linear-gradient(top, #292929, #191919);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #292929), color-stop(100%, #191919));background-image:-webkit-linear-gradient(top, #292929, #191919);background-image:-o-linear-gradient(top, #292929, #191919);background-image:linear-gradient(top, #292929, #191919);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#292929', endColorstr='#191919', GradientType=0);color:#ffffff;}
+.topbar div>ul .menu-dropdown .active a,.nav .menu-dropdown .active a,.topbar div>ul .dropdown-menu .active a,.nav .dropdown-menu .active a{color:#ffffff;}
+.topbar div>ul .menu-dropdown .divider,.nav .menu-dropdown .divider,.topbar div>ul .dropdown-menu .divider,.nav .dropdown-menu .divider{background-color:#222;border-color:#444;}
+.topbar ul .menu-dropdown li a,.topbar ul .dropdown-menu li a{padding:4px 15px;}
+li.menu,.dropdown{position:relative;}
+a.menu:after,.dropdown-toggle:after{width:0;height:0;display:inline-block;content:"&darr;";text-indent:-99999px;vertical-align:top;margin-top:8px;margin-left:4px;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #ffffff;filter:alpha(opacity=50);-khtml-opacity:0.5;-moz-opacity:0.5;opacity:0.5;}
+.menu-dropdown,.dropdown-menu{background-color:#ffffff;float:left;display:none;position:absolute;top:40px;z-index:900;min-width:160px;max-width:220px;_width:160px;margin-left:0;margin-right:0;padding:6px 0;zoom:1;border-color:#999;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:0 1px 1px;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.menu-dropdown li,.dropdown-menu li{float:none;display:block;background-color:none;}
+.menu-dropdown .divider,.dropdown-menu .divider{height:1px;margin:5px 0;overflow:hidden;background-color:#eee;border-bottom:1px solid #ffffff;}
+.topbar .dropdown-menu a,.dropdown-menu a{display:block;padding:4px 15px;clear:both;font-weight:normal;line-height:18px;color:#808080;text-shadow:0 1px 0 #ffffff;}.topbar .dropdown-menu a:hover,.dropdown-menu a:hover{background-color:#dddddd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#eeeeee), to(#dddddd));background-image:-moz-linear-gradient(top, #eeeeee, #dddddd);background-image:-ms-linear-gradient(top, #eeeeee, #dddddd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, #dddddd));background-image:-webkit-linear-gradient(top, #eeeeee, #dddddd);background-image:-o-linear-gradient(top, #eeeeee, #dddddd);background-image:linear-gradient(top, #eeeeee, #dddddd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#dddddd', GradientType=0);color:#404040;text-decoration:none;-webkit-box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);}
+.open .menu,.dropdown.open .menu,.open .dropdown-toggle,.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);}
+.open .menu-dropdown,.dropdown.open .menu-dropdown,.open .dropdown-menu,.dropdown.open .dropdown-menu{display:block;}
+.tabs,.pills{margin:0 0 20px;padding:0;list-style:none;zoom:1;}.tabs:before,.pills:before,.tabs:after,.pills:after{display:table;content:"";zoom:1;*display:inline;}
+.tabs:after,.pills:after{clear:both;}
+.tabs>li,.pills>li{float:left;}.tabs>li>a,.pills>li>a{display:block;}
+.tabs{float:left;width:100%;border-bottom:1px solid #ddd;}.tabs>li{position:relative;top:1px;}.tabs>li>a{padding:0 15px;margin-right:2px;line-height:36px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.tabs>li>a:hover{text-decoration:none;background-color:#eee;border-color:#eee #eee #ddd;}
+.tabs>li.active>a{color:#808080;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;}
+.tabs .menu-dropdown,.tabs .dropdown-menu{top:35px;border-width:1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;}
+.tabs a.menu:after,.tabs .dropdown-toggle:after{border-top-color:#999;margin-top:15px;margin-left:5px;}
+.tabs li.open.menu .menu,.tabs .open.dropdown .dropdown-toggle{border-color:#999;}
+.tabs li.open a.menu:after,.tabs .dropdown.open .dropdown-toggle:after{border-top-color:#555;}
+.tab-content{clear:both;}
+.pills a{margin:5px 3px 5px 0;padding:0 15px;text-shadow:0 1px 1px #ffffff;line-height:30px;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}.pills a:hover{background:#00438a;color:#ffffff;text-decoration:none;text-shadow:0 1px 1px rgba(0, 0, 0, 0.25);}
+.pills .active a{background:#0069d6;color:#ffffff;text-shadow:0 1px 1px rgba(0, 0, 0, 0.25);}
+.tab-content>*,.pill-content>*{display:none;}
+.tab-content>.active,.pill-content>.active{display:block;}
+.breadcrumb{margin:0 0 18px;padding:7px 14px;background-color:#f5f5f5;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#f5f5f5));background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;}
+.breadcrumb .divider{padding:0 5px;color:#bfbfbf;}
+.breadcrumb .active a{color:#404040;}
+.hero-unit{background-color:#f5f5f5;margin-bottom:30px;padding:60px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;}
+.hero-unit p{font-size:18px;font-weight:200;line-height:27px;}
+footer{margin-top:17px;padding-top:17px;border-top:1px solid #eee;}
+.page-header{margin-bottom:17px;border-bottom:1px solid #ddd;-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}.page-header h1{margin-bottom:8px;}
+.btn.danger,.alert-message.danger,.btn.danger:hover,.alert-message.danger:hover,.btn.error,.alert-message.error,.btn.error:hover,.alert-message.error:hover,.btn.success,.alert-message.success,.btn.success:hover,.alert-message.success:hover,.btn.info,.alert-message.info,.btn.info:hover,.alert-message.info:hover{color:#ffffff;}
+.btn.danger,.alert-message.danger,.btn.error,.alert-message.error{background-color:#c43c35;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#c43c35 #c43c35 #882a25;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
+.btn.success,.alert-message.success{background-color:#57a957;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#57a957 #57a957 #3d773d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
+.btn.info,.alert-message.info{background-color:#339bb9;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#339bb9 #339bb9 #22697d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
+.btn{cursor:pointer;display:inline-block;background-color:#e6e6e6;background-repeat:no-repeat;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);padding:5px 14px 6px;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);color:#333;font-size:13px;line-height:normal;border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-webkit-transition:0.1s linear all;-moz-transition:0.1s linear all;-ms-transition:0.1s linear all;-o-transition:0.1s linear all;transition:0.1s linear all;}.btn:hover{background-position:0 -15px;color:#333;text-decoration:none;}
+.btn:focus{outline:1px dotted #666;}
+.btn.primary{color:#ffffff;background-color:#0064cd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));background-image:-moz-linear-gradient(top, #049cdb, #0064cd);background-image:-ms-linear-gradient(top, #049cdb, #0064cd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));background-image:-webkit-linear-gradient(top, #049cdb, #0064cd);background-image:-o-linear-gradient(top, #049cdb, #0064cd);background-image:linear-gradient(top, #049cdb, #0064cd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#0064cd #0064cd #003f81;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
+.btn:active{-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);}
+.btn.disabled{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+.btn[disabled]{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+.btn.large{font-size:15px;line-height:normal;padding:9px 14px 9px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
+.btn.small{padding:7px 9px 7px;font-size:11px;}
+:root .alert-message,:root .btn{border-radius:0 \0;}
+button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;border:0;}
+.close{float:right;color:#000000;font-size:20px;font-weight:bold;line-height:13.5px;text-shadow:0 1px 0 #ffffff;filter:alpha(opacity=20);-khtml-opacity:0.2;-moz-opacity:0.2;opacity:0.2;}.close:hover{color:#000000;text-decoration:none;filter:alpha(opacity=40);-khtml-opacity:0.4;-moz-opacity:0.4;opacity:0.4;}
+.alert-message{position:relative;padding:7px 15px;margin-bottom:18px;color:#404040;background-color:#eedc94;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94));background-image:-moz-linear-gradient(top, #fceec1, #eedc94);background-image:-ms-linear-gradient(top, #fceec1, #eedc94);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94));background-image:-webkit-linear-gradient(top, #fceec1, #eedc94);background-image:-o-linear-gradient(top, #fceec1, #eedc94);background-image:linear-gradient(top, #fceec1, #eedc94);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#eedc94 #eedc94 #e4c652;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);border-width:1px;border-style:solid;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);}.alert-message .close{*margin-top:3px;}
+.alert-message h5{line-height:18px;}
+.alert-message p{margin-bottom:0;}
+.alert-message div{margin-top:5px;margin-bottom:2px;line-height:28px;}
+.alert-message .btn{-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);}
+.alert-message.block-message{background-image:none;background-color:#fdf5d9;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);padding:14px;border-color:#fceec1;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}.alert-message.block-message ul,.alert-message.block-message p{margin-right:30px;}
+.alert-message.block-message ul{margin-bottom:0;}
+.alert-message.block-message li{color:#404040;}
+.alert-message.block-message .alert-actions{margin-top:5px;}
+.alert-message.block-message.error,.alert-message.block-message.success,.alert-message.block-message.info{color:#404040;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}
+.alert-message.block-message.error{background-color:#fddfde;border-color:#fbc7c6;}
+.alert-message.block-message.success{background-color:#d1eed1;border-color:#bfe7bf;}
+.alert-message.block-message.info{background-color:#ddf4fb;border-color:#c6edf9;}
+.pagination{height:36px;margin:18px 0;}.pagination ul{float:left;margin:0;border:1px solid #ddd;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}
+.pagination li{display:inline;}
+.pagination a{float:left;padding:0 14px;line-height:34px;border-right:1px solid;border-right-color:#ddd;border-right-color:rgba(0, 0, 0, 0.15);*border-right-color:#ddd;text-decoration:none;}
+.pagination a:hover,.pagination .active a{background-color:#c7eefe;}
+.pagination .disabled a,.pagination .disabled a:hover{background-color:transparent;color:#bfbfbf;}
+.pagination .next a{border:0;}
+.well{background-color:#f5f5f5;margin-bottom:20px;padding:19px;min-height:20px;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
+.modal-backdrop{background-color:#000000;position:fixed;top:0;left:0;right:0;bottom:0;z-index:10000;}.modal-backdrop.fade{opacity:0;}
+.modal-backdrop,.modal-backdrop.fade.in{filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;}
+.modal{position:fixed;top:50%;left:50%;z-index:11000;width:560px;margin:-250px 0 0 -250px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal .close{margin-top:7px;}
+.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;}
+.modal.fade.in{top:50%;}
+.modal-header{border-bottom:1px solid #eee;padding:5px 15px;}
+.modal-body{padding:15px;}
+.modal-footer{background-color:#f5f5f5;padding:14px 15px 15px;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;zoom:1;margin-bottom:0;}.modal-footer:before,.modal-footer:after{display:table;content:"";zoom:1;*display:inline;}
+.modal-footer:after{clear:both;}
+.modal-footer .btn{float:right;margin-left:5px;}
+.twipsy{display:block;position:absolute;visibility:visible;padding:5px;font-size:11px;z-index:1000;filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;}.twipsy.fade.in{filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;}
+.twipsy.above .twipsy-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
+.twipsy.left .twipsy-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
+.twipsy.below .twipsy-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
+.twipsy.right .twipsy-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
+.twipsy-inner{padding:3px 8px;background-color:#000000;color:white;text-align:center;max-width:200px;text-decoration:none;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.twipsy-arrow{position:absolute;width:0;height:0;}
+.popover{position:absolute;top:0;left:0;z-index:1000;padding:5px;display:none;}.popover.above .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
+.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
+.popover.below .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
+.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
+.popover .arrow{position:absolute;width:0;height:0;}
+.popover .inner{background-color:#000000;background-color:rgba(0, 0, 0, 0.8);padding:3px;overflow:hidden;width:280px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);}
+.popover .title{background-color:#f5f5f5;padding:9px 15px;line-height:1;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;border-bottom:1px solid #eee;}
+.popover .content{background-color:#ffffff;padding:14px;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover .content p,.popover .content ul,.popover .content ol{margin-bottom:0;}
+.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;}
+.label{padding:1px 3px 2px;background-color:#bfbfbf;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}.label.important{background-color:#c43c35;}
+.label.warning{background-color:#f89406;}
+.label.success{background-color:#46a546;}
+.label.notice{background-color:#62cffc;}
+.media-grid{margin-left:-20px;margin-bottom:0;zoom:1;}.media-grid:before,.media-grid:after{display:table;content:"";zoom:1;*display:inline;}
+.media-grid:after{clear:both;}
+.media-grid li{display:inline;}
+.media-grid a{float:left;padding:4px;margin:0 0 20px 20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);}.media-grid a img{display:block;}
+.media-grid a:hover{border-color:#0069d6;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);}
diff --git a/resources/bootstrap.gb.css b/resources/bootstrap.gb.css
new file mode 100644
index 0000000..cf82c87
--- /dev/null
+++ b/resources/bootstrap.gb.css
@@ -0,0 +1,758 @@
+body, input, select {
+	color: #202020;
+}
+
+ul, ol {
+	margin-bottom: 10px !important;
+}
+
+hr {
+	margin-top: 10px;
+	margin-bottom: 10px;
+}
+
+.page-header h1, .page-header h2 {
+	color: #0069D6;
+}
+
+.topbar {
+	height:40px !important;
+}
+
+.topbar a {
+  	color: white; 
+	text-shadow: none;
+}
+
+.nav a:hover {
+	color: #abd4ff !important;
+}
+
+.topbar-inner,.topbar .fill{
+	height:40px !important;
+	background-color:#000050;
+	background-repeat:repeat-x;
+	background-image:-khtml-gradient(linear, left top, left bottom, from(#000060), to(#000040));
+	background-image:-moz-linear-gradient(top, #000060, #000040);
+	background-image:-ms-linear-gradient(top, #000060, #000040);
+	background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #000060), color-stop(100%, #000040));
+	background-image:-webkit-linear-gradient(top, #000060, #000040);
+	background-image:-o-linear-gradient(top, #000060, #000040);
+	background-image:linear-gradient(top, #000060, #000040);
+	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#000060', endColorstr='#000040', GradientType=0);
+	-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);
+	-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);
+	box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);
+	border-bottom: 2px solid #ff9900 !important;
+}
+
+.breadcrumb {
+	margin-top: 5px !important;
+	margin-bottom: 5px !important;
+}
+
+.page-header {	
+	margin-bottom: 5px;	
+}
+
+.page-header h2 small {
+	font-size: 80%;
+	font-weight: bold;
+}
+
+div.page_footer {
+	clear: both;
+	height: 17px;
+	color: black;
+	background-color: #ffffff;
+	padding: 5px;
+	border-top: 1px solid #bbb;
+	font-style: italic;
+}
+
+pre, code, pre.prettyprint, pre.plainprint {
+	background-color: #ffffff;
+	color: black;
+	font-family: monospace;
+	font-size:12px;
+	border:0px;
+	padding: 0;
+	line-height: 1.35em;
+}
+
+table {
+	margin-bottom:5px !important;
+}
+
+pre.prettyprint ol {
+	padding-left:25px;
+}
+
+.age0, .age1, .age2 {
+	font-size: 12px;
+}
+
+/* age0: age < 60*60*2 */
+.age0 {
+	color: #008000;
+	font-style: italic;
+	font-weight: bold;
+}
+
+/* age1: 60*60*2 <= age < 60*60*24*2 */
+.age1 {
+	color: #008000;
+	font-style: italic;
+}
+
+/* age2: 60*60*24*2 <= age */
+.age2 {
+	font-style: italic;
+}
+
+a.list {
+	text-decoration: none;
+	color: inherit;
+}
+
+a.list.subject {
+	font-weight: bold;
+}
+
+a.list.name {
+	font-weight: bold;	
+}
+
+a.list:hover {
+	text-decoration: underline;
+	color: #880000;
+}
+
+span.empty {
+	font-size: 0.9em;
+	font-style: italic;
+	padding-left:10px;
+	color: #008000;
+}
+
+span.link {
+	color: #888;
+}
+
+span.link, span.link a {
+	font-family: sans-serif;
+	font-size: 11px;
+}
+
+span.link em, div.link span em {
+	font-style: normal;
+	font-family: sans-serif;
+	font-size: 11px;	
+}
+
+img.inlineIcon {
+	padding-left: 1px;
+	padding-right: 1px;
+}
+
+img.overview {
+	float:right;
+	border:1px solid #CCCCCC;
+}
+
+div.header, div.commitHeader, table.repositories th {
+	background-color:#e0e0e0;
+	background-repeat:repeat-x;
+	background-image:-khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#e0e0e0));
+	background-image:-moz-linear-gradient(top, #ffffff, #e0e0e0);
+	background-image:-ms-linear-gradient(top, #ffffff, #e0e0e0);
+	background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #e0e0e0));
+	background-image:-webkit-linear-gradient(top, #ffffff, #e0e0e0);
+	background-image:-o-linear-gradient(top, #ffffff, #e0e0e0);
+	background-image:linear-gradient(top, #ffffff, #e0e0e0);
+	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e0e0e0', GradientType=0);
+	-webkit-box-shadow:inset 0 1px 0 #ffffff;
+	-moz-box-shadow:inset 0 1px 0 #ffffff;
+	box-shadow:inset 0 1px 0 #ffffff;	
+}
+
+div.header {
+	padding: 3px;
+	border: 1px solid #ddd;
+	border-bottom: 0;
+	border-radius: 3px 3px 0 0;
+}
+
+div.commitHeader {
+	margin:0 0 2px;
+	padding:7px 14px;	
+	border:1px solid #ddd;
+	border-radius: 3px;
+	-webkit-border-radius:3px;
+	-moz-border-radius:3px;border-radius:3px;
+}
+
+div.header a, div.commitHeader a {
+	color: black;
+	text-decoration: none;
+	font-weight: bold;
+}
+
+div.header a:hover, div.commitHeader a:hover {
+	text-decoration: underline;
+}
+
+div.page_nav2 {
+	padding: 2px 5px 7px 5px;	
+}
+
+div.admin_nav {
+	border-bottom: 0px;
+	text-align: right;
+	padding: 5px 5px 5px 2px;	
+}
+
+div.admin_nav a {
+	text-decoration: none;
+}
+
+div.admin_nav a:hover {	
+	text-decoration: underline;
+}
+
+div.search {
+	height: 40px;
+	padding-top:2px;
+}
+
+div.search input {
+	-webkit-border-radius:0;-moz-border-radius:0x;border-radius:0;
+	vertical-align: top;
+	background: url(search-icon.png) no-repeat 4px center;
+	background-color: transparent;
+	border: 1px solid transparent;
+	outline: none;
+	padding: 2px 2px 2px 22px;
+	text-shadow: none;
+	margin: 0px;
+	
+	color: #ddd;
+}
+
+div.search input:hover, div.search input:focus {
+	background-color: transparent;
+	border: 1px solid transparent;
+	padding: 2px 2px 2px 22px;
+	text-shadow: none;
+	
+	color: #ddd;
+	border-bottom: 1px solid #ff9900;	
+}
+
+div.search input:focus {
+	color: white;
+}
+
+/* div.search input:focused { */
+/* 	background-color: transparent; */
+/* 	border: 1px solid transparent; */
+/* 	padding: 2px 2px 2px 22px; */
+/* 	text-shadow: none; */
+/* } */
+
+div.login input:focus {
+	background-color: rgba(255, 255, 255, 0.6);	
+	text-shadow: none;
+	color: white;
+}
+
+div.commit_message {
+	font-family: monospace;
+	padding: 8px;
+	border: solid #ccc;
+	border-width: 1px 0px 0px;
+}
+
+div.commit_message a {
+	font-family: monospace;
+}
+
+div.bug_open, span.bug_open {
+	padding: 2px;
+	background-color: #803333;
+	color: white;	
+	text-align: center;
+}
+
+div.bug_resolved, span.bug_resolved {
+	padding: 2px;
+	background-color: #408040;
+	color: white;
+	text-align: center;
+}
+
+div.bug_invalid, span.bug_invalid {
+	padding: 2px;
+	background-color: gray;
+	text-align: center;
+}
+
+div.bug_hold, span.bug_hold {
+	padding: 2px;
+	background-color: orange;
+	text-align: center;
+}
+
+div.diff {
+	font-family: monospace;
+	overflow: auto;
+}
+
+div.diff.header {
+	-moz-border-bottom-colors: none;
+    -moz-border-image: none;
+    -moz-border-left-colors: none;
+    -moz-border-right-colors: none;
+    -moz-border-top-colors: none;
+    background-color: #EDECE6;
+    border-color: #D9D8D1;
+    border-style: solid;
+    border-width: 1px;
+    font-weight: bold;
+    margin-top: 10px;
+    padding: 4px 0 2px;
+}
+
+div.diff.extended_header {
+	background-color: #F6F5EE;
+    padding: 2px 0;
+    font-family: inherit;
+}
+
+span.diff.add {
+	color: #008800;
+	font-family: inherit;
+}
+
+span.diff.remove {
+	color: #FFDDDD;
+	font-family: inherit;
+}
+
+span.diff.unchanged {
+	color: inherit;
+	font-family: inherit;
+}
+
+div.diff.hunk_header {
+	-moz-border-bottom-colors: none;
+    -moz-border-image: none;
+    -moz-border-left-colors: none;
+    -moz-border-right-colors: none;
+    -moz-border-top-colors: none;
+    border-color: #FFE0FF;
+    border-style: dotted;
+    border-width: 1px 0 0;
+    margin-top: 2px;
+    font-family: inherit;
+}
+
+span.diff.hunk_info {
+	background-color: #FFEEFF;	
+	color: #990099;
+	font-family: inherit;
+}
+
+span.diff.hunk_section {	
+	color: #AA22AA;
+	font-family: inherit;
+}
+
+div.diff.add2 {
+	background-color: #DDFFDD;
+    font-family: inherit;
+}
+
+div.diff.remove2 {
+	background-color: #FFDDDD;
+    font-family: inherit;
+}
+
+div.diff table {
+	border-radius: 0;
+	border-right: 1px solid #bbb;
+	border-bottom: 1px solid #bbb;
+	width: 100%;
+}
+
+div.diff table th, div.diff table td {
+	margin: 0px;
+	padding: 0px;
+	font-family: monospace;
+	border: 0;
+}
+
+div.diff table th {
+	background-color: #f0f0f0;
+	text-align: center;
+	color: #999;
+	padding-left: 5px;
+	padding-right: 5px;
+	width: 30px;
+}
+
+div.diff table th.header {
+	background-color: #D2C3AF;
+	border-right: 0px;
+	border-bottom: 1px solid #808080;
+	font-family: inherit;
+	font-size:0.9em;
+	color: black;
+	padding: 2px;
+	text-align: left;
+}
+
+div.diff table td.hunk_header {
+	background-color: #dAe2e5 !important;
+	border-top: 1px solid #bac2c5;	
+	border-bottom: 1px solid #bac2c5;
+	color: #555;
+}
+
+div.diff table td {
+	border-left: 1px solid #bbb;
+	background-color: #f5f5f5;
+}
+
+td.changeType {
+	width: 15px;
+}
+
+span.addition, span.modification, span.deletion, span.rename {
+	border: 1px solid #888;
+	float: left;
+	height: 0.8em;
+	margin: 0.2em 0.5em 0 0;
+	overflow: hidden;
+	width: 0.8em;
+}
+
+span.addition {
+	background-color: #ccffcc;
+}
+
+span.modification {
+	background-color: #ffdd88;
+}
+
+span.deletion {
+	background-color: #f8bbbb;
+}
+
+span.rename {
+	background-color: #cAc2f5;
+}
+
+div.commitLegend {
+	float: right;
+	padding: 0.4em 0.4em 0.2em 0.4em;
+	vertical-align:top;
+	margin: 0px;
+}
+
+div.commitLegend span {
+	font-size: 0.9em;
+	vertical-align: top;
+}
+
+div.references {
+	float: right;
+	text-align: right;
+}
+
+table.plain {
+	width: 0 !important;
+	border: 0;
+}
+
+table.plain th, table.plain td {
+	white-space: nowrap;
+	padding: 1px 6px;
+	border: 0;
+}
+
+table.pretty {
+	border-radius: 0 0 3px 3px;	
+}
+
+table.pretty td.icon {
+	padding: 0px 0px 0px 2px;	
+	width: 18px;
+	vertical-align: middle;
+}
+
+table.pretty td.icon img {
+	vertical-align: top;
+}
+
+table.pretty td {
+	padding: 2px 4px;
+	border-left: 0;
+}
+
+table.comments td {
+	padding: 4px;
+	line-height: 17px;
+}
+
+table.repositories {	
+	border-spacing: 0px;
+}
+
+table.repositories th {
+	padding: 4px;
+	border:0;
+}
+
+table.repositories td {
+	padding: 2px;
+	border-left: 0;
+}
+
+table.repositories td.rightAlign {	
+	text-align: right;	
+}	
+
+table.repositories td.icon img {
+	vertical-align: top;
+}
+
+table.repositories tr.group {
+	background-color: #ccc;
+}
+
+table.repositories tr.group td {
+	font-weight: bold;		
+	color: black;
+	background-color: #ddd;
+	padding-left: 5px;
+	border-top: 1px solid #aaa; 	
+ 	border-bottom: 1px solid #aaa; 
+}
+
+table.palette { border:0; width: 0 !important; }
+table.palette td.header { 
+	font-weight: bold; 
+	background-color: #ffffff !important;
+	padding-top: 0px !important;
+	margin-bottom: 0 !imporant;	
+	border: 0 !important;
+	border-radius: 0 !important;
+	line-height: 1em;
+}
+table.palette td.pane {
+	padding: 0px;
+}
+
+table.gitnotes {		
+	border: 0;	
+}
+table.gitnotes td {
+	border-top: 1px solid #ccc;
+	padding-top: 3px;
+	vertical-align:top;
+}
+
+table.gitnotes table {
+	border: none;
+}
+
+table.gitnotes td table td {
+	border: none;
+	padding: 0px;
+}
+
+table.gitnotes td.info {
+}
+
+table.gitnotes td.message {
+	width: 65%;
+	border-left: 1px solid #ccc;
+}
+
+table.annotated {
+}
+
+table.annotated tr.even {
+	background-color: white;
+}
+
+table.annotated tr.odd {
+	background-color: #f5f5f5;
+}
+
+table.annotated td {
+	padding: 0px;
+	border: 0;
+}
+
+tr th a { background-position: right; padding-right: 15px; background-repeat:no-repeat; }
+tr th.wicket_orderDown a {background-image: url(arrow_down.png); }
+tr th.wicket_orderUp a { background-image: url(arrow_up.png); }
+tr th.wicket_orderNone a { background-image: url(arrow_off.png); }
+
+tr.light {
+	background-color: #ffffff;
+}
+
+tr.dark {
+	background-color: #f5f5f5;
+}
+
+/* currently both use the same, but it can change */
+tr.light:hover,
+tr.dark:hover {
+	background-color: #000070;
+	color: white;
+}
+
+tr.light:hover a,
+tr.dark:hover a {
+	color: white;	
+}
+
+td.author {
+	font-style: italic !important;
+}
+
+td.date {
+	font-style: italic !important;	
+}
+
+span.sha1, span.sha1 a, span.sha1 a span {
+	font-family: monospace;
+	font-size: 13px;
+}
+
+td.mode {
+	text-align: right;
+	font-family: monospace;
+	width: 8em;
+	padding-right:15px;
+}
+
+td.size {
+	text-align: right;
+	width: 8em;	
+	padding-right:15px;
+}
+
+td.rightAlign {
+	text-align: right;
+}
+
+td.treeLinks {
+	text-align: right;
+	width: 13em;
+}
+
+span.metricsTitle {
+	font-size: 2em;
+}
+
+span .tagRef, span .headRef, span .localBranch, span .remoteBranch, span .otherRef {	
+	padding: 0px 3px;
+	margin-right:2px;
+	font-family: sans-serif;
+	font-size: 9px;
+	font-weight: normal;
+	border: 1px solid;
+	color: black;	
+}
+
+span .tagRef a span, span .headRef a span, span .localBranch a span, span .remoteBranch a span, span .otherRef a span {
+	font-size: 9px;
+}
+
+span .tagRef a, span .headRef a, span .localBranch a, span .remoteBranch a, span .otherRef a {
+	text-decoration: none;
+	color: black !important;
+}
+
+span .tagRef a:hover, span .headRef a:hover, span .localBranch a:hover, span .remoteBranch a:hover, span .otherRef a:hover {
+	color: black !important;
+	text-decoration: underline;
+}
+
+span .otherRef {
+	background-color: #b0e0f0;
+	border-color: #80aaaa;	
+}
+
+span .remoteBranch {
+	background-color: #cAc2f5;
+	border-color: #6c6cbf;
+}
+
+span .tagRef {
+	background-color: #ffffaa;
+	border-color: #ffcc00;
+}
+
+span .headRef {
+	background-color: #ffaaff;
+	border-color: #ff00ee;
+}
+
+span .localBranch {
+	background-color: #ccffcc;
+	border-color: #00cc33;
+}
+
+table .palette td.buttons button {
+	-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;	
+	border: 1px solid #ccc !important;
+	padding: 10px;
+	margin-bottom: 10px;
+}
+
+table .palette td.buttons button:hover {
+	border: 1px solid #0069D6 !important;
+}
+
+table .palette td.buttons button:active {
+	border: 1px solid orange !important;
+}
+
+.feedbackPanelERROR, .feedbackPanelINFO {	
+	list-style: none;
+	line-height: 35px;
+}
+
+.feedbackPanelINFO span, .feedbackPanelERROR span {
+	position:relative;padding:7px 15px;margin-top:5px;margin-bottom:5px;color:#404040;background-color:#eedc94;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94));background-image:-moz-linear-gradient(top, #fceec1, #eedc94);background-image:-ms-linear-gradient(top, #fceec1, #eedc94);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94));background-image:-webkit-linear-gradient(top, #fceec1, #eedc94);background-image:-o-linear-gradient(top, #fceec1, #eedc94);background-image:linear-gradient(top, #fceec1, #eedc94);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#eedc94 #eedc94 #e4c652;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);border-width:1px;border-style:solid;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);
+}
+
+.feedbackPanelERROR span {
+	color: #ffffff;
+	background-color:#c43c35;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#c43c35 #c43c35 #882a25;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+}
+
+/* google-code-prettify line numbers */
+li.L0,
+li.L1,
+li.L2,
+li.L3,
+li.L4,
+li.L5,
+li.L6,
+li.L7,
+li.L8,
+li.L9 { color: #888; border-left: 1px solid #ccc; padding-left:5px; list-style-type: decimal !important; }
+
+/* Alternate shading for lines */
+li.L1,
+li.L3,
+li.L5,
+li.L7,
+li.L9 { background: #fafafa !important; }
diff --git a/resources/gitblt2_white.png b/resources/gitblt2_white.png
new file mode 100644
index 0000000..f4c5463
--- /dev/null
+++ b/resources/gitblt2_white.png
Binary files differ
diff --git a/resources/gitblt_25_white.png b/resources/gitblt_25_white.png
new file mode 100644
index 0000000..eeea021
--- /dev/null
+++ b/resources/gitblt_25_white.png
Binary files differ
diff --git a/resources/login.mkd b/resources/login.mkd
new file mode 100644
index 0000000..5b8e89d
--- /dev/null
+++ b/resources/login.mkd
@@ -0,0 +1,3 @@
+## Please Login
+
+Pleaes enter your credentials to access this Gitblit site.
diff --git a/resources/markdown.css b/resources/markdown.css
index 075971c..e0bfe38 100644
--- a/resources/markdown.css
+++ b/resources/markdown.css
@@ -4,6 +4,11 @@
 
 div.markdown {
 	line-height: 1.4em;
+	color: black;
+}
+
+div.markdown li {
+	color: black;
 }
 
 div.markdown h1,
@@ -16,16 +21,14 @@
 }
 
 div.markdown h1 {    
-    margin-top: 1em;
+    margin-top: 0.5em;
     margin-bottom: 0.5em;
-    padding-bottom: 0.5em;
     border-bottom: 2px solid #000080 !important;
 }
 
 div.markdown h2 {
     margin-top: 1em;
     margin-bottom: 0.5em;    
-    padding-bottom: 0.5em;
 	border-bottom: 2px solid #000080 !important;    
 }
 
diff --git a/src/com/gitblit/build/BuildSite.java b/src/com/gitblit/build/BuildSite.java
index de4f071..0746a6b 100644
--- a/src/com/gitblit/build/BuildSite.java
+++ b/src/com/gitblit/build/BuildSite.java
@@ -91,7 +91,7 @@
 
 		System.out.println(MessageFormat.format("Generating site from {0} Markdown Docs in {1} ",
 				markdownFiles.length, sourceFolder.getAbsolutePath()));
-		String linkPattern = "<a href=''{0}''>{1}</a>";
+		String linkPattern = "<li><a href=''{0}''>{1}</a></li>";
 		StringBuilder sb = new StringBuilder();
 		for (File file : markdownFiles) {
 			String documentName = getDocumentName(file);
diff --git a/src/com/gitblit/models/FederationModel.java b/src/com/gitblit/models/FederationModel.java
index d67ae56..61c8576 100644
--- a/src/com/gitblit/models/FederationModel.java
+++ b/src/com/gitblit/models/FederationModel.java
@@ -198,22 +198,7 @@
 		@Override
 		public int compareTo(RepositoryStatus o) {
 			if (status.equals(o.status)) {
-				// sort root repositories first, alphabetically
-				// then sort grouped repositories, alphabetically
-				int s1 = name.indexOf('/');
-				int s2 = o.name.indexOf('/');
-				if (s1 == -1 && s2 == -1) {
-					// neither grouped
-					return name.compareTo(o.name);
-				} else if (s1 > -1 && s2 > -1) {
-					// both grouped
-					return name.compareTo(o.name);
-				} else if (s1 == -1) {
-					return -1;
-				} else if (s2 == -1) {
-					return 1;
-				}
-				return 0;
+				return StringUtils.compareRepositoryNames(name, o.name);
 			}
 			return status.compareTo(o.status);
 		}
diff --git a/src/com/gitblit/models/RepositoryModel.java b/src/com/gitblit/models/RepositoryModel.java
index e85fd6a..d70866f 100644
--- a/src/com/gitblit/models/RepositoryModel.java
+++ b/src/com/gitblit/models/RepositoryModel.java
@@ -22,6 +22,7 @@
 
 import com.gitblit.Constants.AccessRestrictionType;
 import com.gitblit.Constants.FederationStrategy;
+import com.gitblit.utils.StringUtils;
 
 /**
  * RepositoryModel is a serializable model class that represents a Gitblit
@@ -74,6 +75,6 @@
 
 	@Override
 	public int compareTo(RepositoryModel o) {
-		return name.compareTo(o.name);
+		return StringUtils.compareRepositoryNames(name, o.name);
 	}
 }
\ No newline at end of file
diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java
index bfbc624..80147d4 100644
--- a/src/com/gitblit/utils/JGitUtils.java
+++ b/src/com/gitblit/utils/JGitUtils.java
@@ -299,7 +299,7 @@
 		}
 		list.addAll(getRepositoryList(repositoriesFolder.getAbsolutePath(), repositoriesFolder,
 				exportAll, searchSubfolders));
-		Collections.sort(list);
+		StringUtils.sortRepositorynames(list);
 		return list;
 	}
 
diff --git a/src/com/gitblit/utils/StringUtils.java b/src/com/gitblit/utils/StringUtils.java
index 77d3cbb..f4e9256 100644
--- a/src/com/gitblit/utils/StringUtils.java
+++ b/src/com/gitblit/utils/StringUtils.java
@@ -19,6 +19,8 @@
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 import java.util.regex.PatternSyntaxException;
 
@@ -395,4 +397,44 @@
 		}
 		return false;
 	}
+
+	/**
+	 * Compare two repository names for proper group sorting.
+	 * 
+	 * @param r1
+	 * @param r2
+	 * @return
+	 */
+	public static int compareRepositoryNames(String r1, String r2) {
+		// sort root repositories first, alphabetically
+		// then sort grouped repositories, alphabetically
+		int s1 = r1.indexOf('/');
+		int s2 = r2.indexOf('/');
+		if (s1 == -1 && s2 == -1) {
+			// neither grouped
+			return r1.compareTo(r2);
+		} else if (s1 > -1 && s2 > -1) {
+			// both grouped
+			return r1.compareTo(r2);
+		} else if (s1 == -1) {
+			return -1;
+		} else if (s2 == -1) {
+			return 1;
+		}
+		return 0;
+	}
+
+	/**
+	 * Sort grouped repository names.
+	 * 
+	 * @param list
+	 */
+	public static void sortRepositorynames(List<String> list) {
+		Collections.sort(list, new Comparator<String>() {
+			@Override
+			public int compare(String o1, String o2) {
+				return compareRepositoryNames(o1, o2);
+			}
+		});
+	}
 }
diff --git a/src/com/gitblit/wicket/AuthorizationStrategy.java b/src/com/gitblit/wicket/AuthorizationStrategy.java
index b6b745b..452215a 100644
--- a/src/com/gitblit/wicket/AuthorizationStrategy.java
+++ b/src/com/gitblit/wicket/AuthorizationStrategy.java
@@ -24,7 +24,6 @@
 import com.gitblit.Keys;
 import com.gitblit.models.UserModel;
 import com.gitblit.wicket.pages.BasePage;
-import com.gitblit.wicket.pages.LoginPage;
 import com.gitblit.wicket.pages.RepositoriesPage;
 
 public class AuthorizationStrategy extends AbstractPageAuthorizationStrategy implements
@@ -36,6 +35,12 @@
 	@SuppressWarnings({ "unchecked", "rawtypes" })
 	@Override
 	protected boolean isPageAuthorized(Class pageClass) {
+		if (RepositoriesPage.class.equals(pageClass)) {
+			// allow all requests to get to the RepositoriesPage with its inline
+			// authentication form
+			return true;
+		}
+
 		if (BasePage.class.isAssignableFrom(pageClass)) {
 			boolean authenticateView = GitBlit.getBoolean(Keys.web.authenticateViewPages, true);
 			boolean authenticateAdmin = GitBlit.getBoolean(Keys.web.authenticateAdminPages, true);
@@ -73,12 +78,7 @@
 	@Override
 	public void onUnauthorizedInstantiation(Component component) {
 		if (component instanceof BasePage) {
-			GitBlitWebSession session = GitBlitWebSession.get();
-			if (!session.isLoggedIn()) {
-				throw new RestartResponseAtInterceptPageException(LoginPage.class);
-			} else {
-				throw new RestartResponseAtInterceptPageException(RepositoriesPage.class);
-			}
+			throw new RestartResponseAtInterceptPageException(RepositoriesPage.class);
 		}
 	}
 }
diff --git a/src/com/gitblit/wicket/GitBlitWebApp.java b/src/com/gitblit/wicket/GitBlitWebApp.java
index 8c41df0..3edcf6a 100644
--- a/src/com/gitblit/wicket/GitBlitWebApp.java
+++ b/src/com/gitblit/wicket/GitBlitWebApp.java
@@ -32,17 +32,15 @@
 import com.gitblit.wicket.pages.CommitDiffPage;
 import com.gitblit.wicket.pages.CommitPage;
 import com.gitblit.wicket.pages.DocsPage;
-import com.gitblit.wicket.pages.ReviewProposalPage;
 import com.gitblit.wicket.pages.FederationRegistrationPage;
 import com.gitblit.wicket.pages.HistoryPage;
 import com.gitblit.wicket.pages.LogPage;
-import com.gitblit.wicket.pages.LoginPage;
-import com.gitblit.wicket.pages.LogoutPage;
 import com.gitblit.wicket.pages.MarkdownPage;
 import com.gitblit.wicket.pages.MetricsPage;
 import com.gitblit.wicket.pages.PatchPage;
 import com.gitblit.wicket.pages.RawPage;
 import com.gitblit.wicket.pages.RepositoriesPage;
+import com.gitblit.wicket.pages.ReviewProposalPage;
 import com.gitblit.wicket.pages.SearchPage;
 import com.gitblit.wicket.pages.SummaryPage;
 import com.gitblit.wicket.pages.TagPage;
@@ -100,12 +98,6 @@
 		// federation urls
 		mount("/proposal", ReviewProposalPage.class, "t");
 		mount("/registration", FederationRegistrationPage.class, "u", "n");
-
-		// setup login/logout urls, if we are using authentication
-		if (useAuthentication) {
-			mount("/login", LoginPage.class);
-			mount("/logout", LogoutPage.class);
-		}
 	}
 
 	private void mount(String location, Class<? extends WebPage> clazz, String... parameters) {
diff --git a/src/com/gitblit/wicket/GitBlitWebApp.properties b/src/com/gitblit/wicket/GitBlitWebApp.properties
index f279612..2aa5107 100644
--- a/src/com/gitblit/wicket/GitBlitWebApp.properties
+++ b/src/com/gitblit/wicket/GitBlitWebApp.properties
@@ -66,7 +66,7 @@
 gb.missingUsername = Missing Username
 gb.edit = edit
 gb.searchTypeTooltip = Select Search Type
-gb.searchTooltip = Search Gitblit
+gb.searchTooltip = Search {0}
 gb.delete = delete
 gb.docs = docs
 gb.accessRestriction = access restriction
@@ -138,4 +138,6 @@
 gb.message = message
 gb.myUrlDescription = the publicly accessible url for your Gitblit instance
 gb.destinationUrl = send to
-gb.destinationUrlDescription = the url of the Gitblit instance to send your proposal
\ No newline at end of file
+gb.destinationUrlDescription = the url of the Gitblit instance to send your proposal
+gb.users = users
+gb.federation = federation
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/WicketUtils.java b/src/com/gitblit/wicket/WicketUtils.java
index 36f74a1..e5b7f69 100644
--- a/src/com/gitblit/wicket/WicketUtils.java
+++ b/src/com/gitblit/wicket/WicketUtils.java
@@ -88,13 +88,13 @@
 	public static void setTicketCssClass(Component container, String state) {
 		String css = null;
 		if (state.equals("open")) {
-			css = "bug_open";
+			css = "label important";
 		} else if (state.equals("hold")) {
-			css = "bug_hold";
+			css = "label warning";
 		} else if (state.equals("resolved")) {
-			css = "bug_resolved";
+			css = "label success";
 		} else if (state.equals("invalid")) {
-			css = "bug_invalid";
+			css = "label";
 		}
 		if (css != null) {
 			setCssClass(container, css);
@@ -102,7 +102,7 @@
 	}
 
 	public static void setAlternatingBackground(Component c, int i) {
-		String clazz = i % 2 == 0 ? "dark" : "light";
+		String clazz = i % 2 == 0 ? "light" : "dark";
 		setCssClass(c, clazz);
 	}
 
diff --git a/src/com/gitblit/wicket/pages/BasePage.html b/src/com/gitblit/wicket/pages/BasePage.html
index aaf3a35..a089e2a 100644
--- a/src/com/gitblit/wicket/pages/BasePage.html
+++ b/src/com/gitblit/wicket/pages/BasePage.html
@@ -7,20 +7,14 @@
 	<!-- Head -->
 	<wicket:head>
    		<title wicket:id="title">[page title]</title>
-		<link rel="stylesheet" type="text/css" href="gitblit.css"/>
+		<link rel="stylesheet" href="bootstrap.130.css"/>
+		<link rel="stylesheet" type="text/css" href="bootstrap.gb.css"/>
 		<link rel="icon" href="gitblt-favicon.png" type="image/png" />
 	</wicket:head>
 
-	<body>
-		<!-- page header -->
-		<div class="page_header">
-			<a title="gitblit homepage" href="http://gitblit.com/">
-				<img src="gitblt_25.png" width="79" height="25" alt="gitblit" class="logo"/>
-			</a>
-			<span>
-				<span wicket:id="siteName">[site name]</span> / <span wicket:id="repositoryName">[repository name]</span> <span wicket:id="pageName">[page name]</span>
-			</span>	
-		</div>
+	<body style="padding-top: 40px;">
+		<div class="container">
+		<div class="content">
 
 		<!-- page content -->
 		<wicket:child />
@@ -28,10 +22,14 @@
 		<!-- page footer -->
 		<div class="page_footer">
 			<div style="float:right">
-				<span wicket:id="gbVersion"></span> 
+				<a title="gitblit homepage" href="http://gitblit.com/">
+					<span wicket:id="gbVersion"></span>
+				</a> 
 			</div>
 			<div wicket:id="userPanel">[user panel]</div>
 		</div>
+		</div>
+		</div>
 	</body>
 	
 	<!-- user fragment -->
diff --git a/src/com/gitblit/wicket/pages/BasePage.java b/src/com/gitblit/wicket/pages/BasePage.java
index 0169c8e..d31979d 100644
--- a/src/com/gitblit/wicket/pages/BasePage.java
+++ b/src/com/gitblit/wicket/pages/BasePage.java
@@ -29,6 +29,7 @@
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.markup.html.link.ExternalLink;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.markup.html.panel.Fragment;
 import org.apache.wicket.protocol.http.WebRequest;
@@ -87,21 +88,15 @@
 	}
 
 	protected void setupPage(String repositoryName, String pageName) {
-
 		if (repositoryName != null && repositoryName.trim().length() > 0) {
 			add(new Label("title", getServerName() + " - " + repositoryName));
 		} else {
 			add(new Label("title", getServerName()));
 		}
-		// header
-		String siteName = GitBlit.getString(Keys.web.siteName, Constants.NAME);
-		if (siteName == null || siteName.trim().length() == 0) {
-			siteName = Constants.NAME;
-		}
-		add(new LinkPanel("siteName", null, siteName, RepositoriesPage.class, null));
-		add(new LinkPanel("repositoryName", null, repositoryName, SummaryPage.class,
-				WicketUtils.newRepositoryParameter(repositoryName)));
-		add(new Label("pageName", pageName));
+
+		ExternalLink rootLink = new ExternalLink("rootLink", urlFor(RepositoriesPage.class, null).toString());
+		WicketUtils.setHtmlTooltip(rootLink, GitBlit.getString(Keys.web.siteName, Constants.NAME));
+		add(rootLink);
 
 		// Feedback panel for info, warning, and non-fatal error messages
 		add(new FeedbackPanel("feedback"));
@@ -200,7 +195,7 @@
 		if (GitBlitWebSession.get().isLoggedIn()) {
 			error(message, true);
 		} else {
-			throw new RestartResponseAtInterceptPageException(LoginPage.class);
+			throw new RestartResponseAtInterceptPageException(RepositoriesPage.class);
 		}
 	}
 
@@ -226,8 +221,7 @@
 			} else {
 				// login
 				add(new Label("username").setVisible(false));
-				add(new LinkPanel("loginLink", null, markupProvider.getString("gb.login"),
-						LoginPage.class));
+				add(new Label("loginLink").setVisible(false));
 				add(new Label("separator").setVisible(false));
 				add(new Label("changePasswordLink").setVisible(false));
 			}
diff --git a/src/com/gitblit/wicket/pages/BlamePage.html b/src/com/gitblit/wicket/pages/BlamePage.html
index 2e20c18..ccbfcec 100644
--- a/src/com/gitblit/wicket/pages/BlamePage.html
+++ b/src/com/gitblit/wicket/pages/BlamePage.html
@@ -19,12 +19,12 @@
 	<div wicket:id="breadcrumbs">[breadcrumbs]</div>
 		
 	<!--  blame content -->
-	<table class="annotated" style="border-top: 0px; margin-bottom:5px;">
+	<table class="annotated" style="margin-bottom:5px;">
 		<tbody>
 			<tr>
 				<th>Commit</th>
 				<th>Line</th>
-				<th>Data</th>
+				<th>Content</th>
 			</tr>
 			<tr wicket:id="annotation">
 				<td><span class="sha1" wicket:id="commit"></span></td>
diff --git a/src/com/gitblit/wicket/pages/ChangePasswordPage.html b/src/com/gitblit/wicket/pages/ChangePasswordPage.html
index 031352e..938e0ec 100644
--- a/src/com/gitblit/wicket/pages/ChangePasswordPage.html
+++ b/src/com/gitblit/wicket/pages/ChangePasswordPage.html
@@ -4,20 +4,9 @@
       xml:lang="en"  
       lang="en"> 
       
-	<!-- Head with Wicket-controlled resources in this package -->
-	<wicket:head>
-   		<title wicket:id="title">[page title]</title>
-		<link rel="stylesheet" type="text/css" href="gitblit.css"/>
-		<link rel="shortcut icon" href="gitblt-favicon.png" type="image/png" />
-	</wicket:head>
-	
+	<wicket:extend>
 	<body onload="document.getElementById('password').focus();">
 		<div>
-			<div style="padding-top: 10px;text-align:center;">
-				<img src="gitblt_25.png" alt="Gitblit"/><br/>
-				<div style="padding-top:30px;font-weight:bold;" wicket:id="name"></div>
-			</div>
-			<p/>
 			<form style="text-align:center;" wicket:id="passwordForm">
 				<center>
 					<table class="plain">
@@ -30,11 +19,11 @@
 						<td class="edit"><input type="password" wicket:id="confirmPassword" size="30" tabindex="2" /></td>
 					</tr>
 					</table>
-					<input type="submit" wicket:message="value:gb.save" wicket:id="save" tabindex="3" />
-					<input type="submit" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="4" />
-					<div style="padding-top:10px;" wicket:id="feedback"></div>
+					<input class="btn" type="submit" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="3" />
+					<input class="btn primary" type="submit" wicket:message="value:gb.save" wicket:id="save" tabindex="4" />
 				</center>
 			</form>			
 		</div>
 	</body>
+	</wicket:extend>
 </html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/pages/ChangePasswordPage.java b/src/com/gitblit/wicket/pages/ChangePasswordPage.java
index 054b343..fec2414 100644
--- a/src/com/gitblit/wicket/pages/ChangePasswordPage.java
+++ b/src/com/gitblit/wicket/pages/ChangePasswordPage.java
@@ -18,17 +18,13 @@
 import java.text.MessageFormat;
 
 import org.apache.wicket.RestartResponseException;
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Button;
 import org.apache.wicket.markup.html.form.PasswordTextField;
 import org.apache.wicket.markup.html.form.StatelessForm;
-import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.protocol.http.WebResponse;
 
-import com.gitblit.Constants;
 import com.gitblit.GitBlit;
 import com.gitblit.GitBlitException;
 import com.gitblit.Keys;
@@ -36,7 +32,7 @@
 import com.gitblit.utils.StringUtils;
 import com.gitblit.wicket.GitBlitWebSession;
 
-public class ChangePasswordPage extends WebPage {
+public class ChangePasswordPage extends RootSubPage {
 
 	IModel<String> password = new Model<String>("");
 	IModel<String> confirmPassword = new Model<String>("");
@@ -54,10 +50,7 @@
 			// no authentication enabled
 			throw new RestartResponseException(getApplication().getHomePage());
 		}
-
-		add(new Label("title", GitBlit.getString(Keys.web.siteName, Constants.NAME)));
-		add(new Label("name", getString("gb.changePassword") + ": "
-				+ GitBlitWebSession.get().getUser().username));
+		setupPage(getString("gb.changePassword"), GitBlitWebSession.get().getUser().username);
 
 		StatelessForm<Void> form = new StatelessForm<Void>("passwordForm") {
 
@@ -115,7 +108,6 @@
 				confirmPassword);
 		confirmPasswordField.setResetPassword(false);
 		form.add(confirmPasswordField);
-		form.add(new FeedbackPanel("feedback"));
 
 		form.add(new Button("save"));
 		Button cancel = new Button("cancel") {
diff --git a/src/com/gitblit/wicket/pages/EditRepositoryPage.html b/src/com/gitblit/wicket/pages/EditRepositoryPage.html
index c33184d..7f09f75 100644
--- a/src/com/gitblit/wicket/pages/EditRepositoryPage.html
+++ b/src/com/gitblit/wicket/pages/EditRepositoryPage.html
@@ -6,35 +6,29 @@
 
 <wicket:extend>
 <body onload="document.getElementById('name').focus();">
-	<!-- Push content down to preserve header image -->
-	<div style="padding-top:20px"></div>
-
-	<div style="text-align:center;" wicket:id="feedback">[Feedback Panel]</div>	
-
 	<!-- Repository Table -->
 	<form wicket:id="editForm">
 		<table class="plain">
 			<tbody>
-				<tr><th><wicket:message key="gb.name"></wicket:message></th><td class="edit"><input type="text" wicket:id="name" id="name" size="40" tabindex="1" /> &nbsp;<i><wicket:message key="gb.nameDescription"></wicket:message></i></td></tr>
-				<tr><th><wicket:message key="gb.description"></wicket:message></th><td class="edit"><input type="text" wicket:id="description" size="40" tabindex="2" /></td></tr>
-				<tr><th><wicket:message key="gb.origin"></wicket:message></th><td class="edit"><input type="text" wicket:id="origin" size="80" tabindex="3" /></td></tr>
+				<tr><th><wicket:message key="gb.name"></wicket:message></th><td class="edit"><input class="span6" type="text" wicket:id="name" id="name" size="40" tabindex="1" /> &nbsp;<i><wicket:message key="gb.nameDescription"></wicket:message></i></td></tr>
+				<tr><th><wicket:message key="gb.description"></wicket:message></th><td class="edit"><input class="span6" type="text" wicket:id="description" size="40" tabindex="2" /></td></tr>
+				<tr><th><wicket:message key="gb.origin"></wicket:message></th><td class="edit"><input class="span7" type="text" wicket:id="origin" size="80" tabindex="3" /></td></tr>
 				<tr><th><wicket:message key="gb.owner"></wicket:message></th><td class="edit"><select wicket:id="owner" tabindex="4" /> &nbsp;<i><wicket:message key="gb.ownerDescription"></wicket:message></i></td></tr>
 				<tr><th><wicket:message key="gb.enableTickets"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="useTickets" tabindex="5" /> &nbsp;<i><wicket:message key="gb.useTicketsDescription"></wicket:message></i></td></tr>
 				<tr><th><wicket:message key="gb.enableDocs"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="useDocs" tabindex="6" /> &nbsp;<i><wicket:message key="gb.useDocsDescription"></wicket:message></i></td></tr>
 				<tr><th><wicket:message key="gb.showRemoteBranches"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="showRemoteBranches" tabindex="7" /> &nbsp;<i><wicket:message key="gb.showRemoteBranchesDescription"></wicket:message></i></td></tr>
 				<tr><th><wicket:message key="gb.showReadme"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="showReadme" tabindex="8" /> &nbsp;<i><wicket:message key="gb.showReadmeDescription"></wicket:message></i></td></tr>
 				<tr><th><wicket:message key="gb.isFrozen"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="isFrozen" tabindex="9" /> &nbsp;<i><wicket:message key="gb.isFrozenDescription"></wicket:message></i></td></tr>
-				<tr><td style="padding-top:10px;" colspan="2"><hr></hr></td></tr>
-				<tr><th><wicket:message key="gb.accessRestriction"></wicket:message></th><td class="edit"><select wicket:id="accessRestriction" tabindex="10" /></td></tr>				
+				<tr><td colspan="2"><hr></hr></td></tr>
+				<tr><th><wicket:message key="gb.accessRestriction"></wicket:message></th><td class="edit"><select class="span6" wicket:id="accessRestriction" tabindex="10" /></td></tr>				
 				<tr><th style="vertical-align: top;"><wicket:message key="gb.permittedUsers"></wicket:message></th><td style="padding:2px;"><span wicket:id="users"></span></td></tr>
-				<tr><td style="padding-top:10px;" colspan="2"><hr></hr></td></tr>				
-				<tr><th><wicket:message key="gb.federationStrategy"></wicket:message></th><td class="edit"><select wicket:id="federationStrategy" tabindex="11" /></td></tr>
-				<tr><th style="vertical-align: top;"><wicket:message key="gb.federationSets"></wicket:message></th><td style="padding:2px;"><span wicket:id="federationSets"></span></td></tr>				
-				<tr><th></th><td class="editButton"><input type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="12" /> <input type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="13" /></td></tr>
+				<tr><td colspan="2"><hr></hr></td></tr>		
+				<tr><th><wicket:message key="gb.federationStrategy"></wicket:message></th><td class="edit"><select class="span6" wicket:id="federationStrategy" tabindex="11" /></td></tr>
+				<tr><th style="vertical-align: top;"><wicket:message key="gb.federationSets"></wicket:message></th><td style="padding:2px;"><span wicket:id="federationSets"></span></td></tr>
+				<tr><th></th><td class="editButton"><input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="12" /> &nbsp; <input class="btn primary" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="13" /> </td></tr>
 			</tbody>
 		</table>
 	</form>	
-
 </body>
 </wicket:extend>
 </html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/pages/EditRepositoryPage.java b/src/com/gitblit/wicket/pages/EditRepositoryPage.java
index 7349ca5..2afe014 100644
--- a/src/com/gitblit/wicket/pages/EditRepositoryPage.java
+++ b/src/com/gitblit/wicket/pages/EditRepositoryPage.java
@@ -47,7 +47,7 @@
 import com.gitblit.wicket.GitBlitWebSession;
 import com.gitblit.wicket.WicketUtils;
 
-public class EditRepositoryPage extends BasePage {
+public class EditRepositoryPage extends RootSubPage {
 
 	private final boolean isCreate;
 
@@ -76,15 +76,16 @@
 		List<String> federationSets = new ArrayList<String>();
 		List<String> repositoryUsers = new ArrayList<String>();
 		if (isCreate) {
-			super.setupPage("", getString("gb.newRepository"));
+			super.setupPage(getString("gb.newRepository"), "");
 		} else {
-			super.setupPage("", getString("gb.edit"));
+			super.setupPage(getString("gb.edit"), repositoryModel.name);
 			if (repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE)) {
 				repositoryUsers.addAll(GitBlit.self().getRepositoryUsers(repositoryModel));
 				Collections.sort(repositoryUsers);
 			}
 			federationSets.addAll(repositoryModel.federationSets);
-		}
+		}		
+		
 
 		final String oldName = repositoryModel.name;
 		// users palette
diff --git a/src/com/gitblit/wicket/pages/EditUserPage.html b/src/com/gitblit/wicket/pages/EditUserPage.html
index d36bf5a..ceda3cb 100644
--- a/src/com/gitblit/wicket/pages/EditUserPage.html
+++ b/src/com/gitblit/wicket/pages/EditUserPage.html
@@ -6,12 +6,7 @@
 
 <wicket:extend>
 <body onload="document.getElementById('username').focus();">
-	<!-- Push content down to preserve header image -->
-	<div style="padding-top:20px"></div>
-
-	<div style="text-align:center;" wicket:id="feedback">[Feedback Panel]</div>	
-
-	<!-- Repository Table -->
+	<!-- User Table -->
 	<form wicket:id="editForm">
 		<table class="plain">
 			<tbody>
@@ -21,7 +16,7 @@
 				<tr><th><wicket:message key="gb.canAdmin"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="canAdmin" tabindex="6" /> &nbsp;<i><wicket:message key="gb.canAdminDescription"></wicket:message></i></td></tr>				
 				<tr><th><wicket:message key="gb.excludeFromFederation"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="excludeFromFederation" tabindex="7" /> &nbsp;<i><wicket:message key="gb.excludeFromFederationDescription"></wicket:message></i></td></tr>				
 				<tr><th style="vertical-align: top;"><wicket:message key="gb.restrictedRepositories"></wicket:message></th><td style="padding:2px;"><span wicket:id="repositories"></span></td></tr>
-				<tr><th></th><td class="editButton"><input type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="8" /> <input type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="9" /></td></tr>
+				<tr><th></th><td class="editButton"><input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="8" /> &nbsp; <input class="btn primary" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="9" /></td></tr>
 			</tbody>
 		</table>
 	</form>	
diff --git a/src/com/gitblit/wicket/pages/EditUserPage.java b/src/com/gitblit/wicket/pages/EditUserPage.java
index a358911..78e9461 100644
--- a/src/com/gitblit/wicket/pages/EditUserPage.java
+++ b/src/com/gitblit/wicket/pages/EditUserPage.java
@@ -44,7 +44,7 @@
 import com.gitblit.wicket.WicketUtils;
 
 @RequiresAdminRole
-public class EditUserPage extends BasePage {
+public class EditUserPage extends RootSubPage {
 
 	private final boolean isCreate;
 
@@ -66,10 +66,11 @@
 
 	protected void setupPage(final UserModel userModel) {
 		if (isCreate) {
-			super.setupPage("", getString("gb.newUser"));
+			super.setupPage(getString("gb.newUser"), "");
 		} else {
-			super.setupPage("", getString("gb.edit"));
+			super.setupPage(getString("gb.edit"), userModel.username);
 		}
+		
 		final Model<String> confirmPassword = new Model<String>(
 				StringUtils.isEmpty(userModel.password) ? "" : userModel.password);
 		CompoundPropertyModel<UserModel> model = new CompoundPropertyModel<UserModel>(userModel);
@@ -156,8 +157,8 @@
 							userModel.username));
 					setResponsePage(EditUserPage.class);
 				} else {
-					// back to home
-					setResponsePage(RepositoriesPage.class);
+					// back to users page
+					setResponsePage(UsersPage.class);
 				}
 			}
 		};
@@ -181,7 +182,7 @@
 
 			@Override
 			public void onSubmit() {
-				setResponsePage(RepositoriesPage.class);
+				setResponsePage(UsersPage.class);
 			}
 		};
 		cancel.setDefaultFormProcessing(false);
diff --git a/src/com/gitblit/wicket/pages/FederationPage.html b/src/com/gitblit/wicket/pages/FederationPage.html
new file mode 100644
index 0000000..bb39d34
--- /dev/null
+++ b/src/com/gitblit/wicket/pages/FederationPage.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"  
+      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"  
+      xml:lang="en"  
+      lang="en"> 
+<body>
+<wicket:extend>
+
+	<div wicket:id="federationTokensPanel">[federation tokens panel]</div>
+		
+	<div style="padding-top: 10px;" wicket:id="federationProposalsPanel">[federation proposals panel]</div>
+
+	<div style="padding-top: 10px;" wicket:id="federationRegistrationsPanel">[federation registrations panel]</div>
+
+</wicket:extend>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/pages/FederationPage.java b/src/com/gitblit/wicket/pages/FederationPage.java
new file mode 100644
index 0000000..1f98c17
--- /dev/null
+++ b/src/com/gitblit/wicket/pages/FederationPage.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2011 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.gitblit.wicket.pages;
+
+import com.gitblit.GitBlit;
+import com.gitblit.Keys;
+import com.gitblit.wicket.panels.FederationProposalsPanel;
+import com.gitblit.wicket.panels.FederationRegistrationsPanel;
+import com.gitblit.wicket.panels.FederationTokensPanel;
+
+public class FederationPage extends RootPage {
+
+	public FederationPage() {
+		super();
+		setupPage("", "");
+
+		boolean showFederation = showAdmin && GitBlit.canFederate();
+		add(new FederationTokensPanel("federationTokensPanel", showFederation)
+				.setVisible(showFederation));
+		FederationProposalsPanel proposalsPanel = new FederationProposalsPanel(
+				"federationProposalsPanel");
+		if (showFederation) {
+			proposalsPanel.hideIfEmpty();
+		} else {
+			proposalsPanel.setVisible(false);
+		}
+
+		boolean showRegistrations = GitBlit.getBoolean(Keys.web.showFederationRegistrations, false);
+		FederationRegistrationsPanel registrationsPanel = new FederationRegistrationsPanel(
+				"federationRegistrationsPanel");
+		if (showAdmin || showRegistrations) {
+			registrationsPanel.hideIfEmpty();
+		} else {
+			registrationsPanel.setVisible(false);
+		}
+		add(proposalsPanel);
+		add(registrationsPanel);
+	}
+}
diff --git a/src/com/gitblit/wicket/pages/FederationRegistrationPage.html b/src/com/gitblit/wicket/pages/FederationRegistrationPage.html
index c7c5bde..de30cf3 100644
--- a/src/com/gitblit/wicket/pages/FederationRegistrationPage.html
+++ b/src/com/gitblit/wicket/pages/FederationRegistrationPage.html
@@ -6,11 +6,6 @@
 
 <body>
 <wicket:extend>
-
-	<div style="padding-top:20px"></div>
-
-	<div style="text-align:center;" wicket:id="feedback">[Feedback Panel]</div>	
-
 	<!-- registration info -->
 	<table class="plain">
 		<tr><th><wicket:message key="gb.url">url</wicket:message></th><td><img style="border:0px;vertical-align:middle;" wicket:id="typeIcon" /> <span wicket:id="url">[url]</span></td></tr>
diff --git a/src/com/gitblit/wicket/pages/FederationRegistrationPage.java b/src/com/gitblit/wicket/pages/FederationRegistrationPage.java
index 00cc2eb..e480eb7 100644
--- a/src/com/gitblit/wicket/pages/FederationRegistrationPage.java
+++ b/src/com/gitblit/wicket/pages/FederationRegistrationPage.java
@@ -25,24 +25,15 @@
 import org.apache.wicket.markup.repeater.data.ListDataProvider;
 
 import com.gitblit.GitBlit;
-import com.gitblit.Keys;
 import com.gitblit.models.FederationModel;
 import com.gitblit.models.FederationModel.RepositoryStatus;
-import com.gitblit.wicket.GitBlitWebSession;
 import com.gitblit.wicket.WicketUtils;
 
-public class FederationRegistrationPage extends BasePage {
+public class FederationRegistrationPage extends RootSubPage {
 
 	public FederationRegistrationPage(PageParameters params) {
 		super(params);
-
-		final boolean showAdmin;
-		if (GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {
-			boolean allowAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
-			showAdmin = allowAdmin && GitBlitWebSession.get().canAdmin();
-		} else {
-			showAdmin = false;
-		}
+		
 		setStatelessHint(true);
 
 		String url = WicketUtils.getUrlParameter(params);
@@ -53,8 +44,8 @@
 			error("Could not find federation registration!", true);
 		}
 
-		setupPage("", registration.isResultData() ? getString("gb.federationResults")
-				: getString("gb.federationRegistration"));
+		setupPage(registration.isResultData() ? getString("gb.federationResults")
+				: getString("gb.federationRegistration"), registration.url);
 
 		add(new Label("url", registration.url));
 		add(WicketUtils.getRegistrationImage("typeIcon", registration, this));
diff --git a/src/com/gitblit/wicket/pages/LoginPage.html b/src/com/gitblit/wicket/pages/LoginPage.html
deleted file mode 100644
index 5f9b779..0000000
--- a/src/com/gitblit/wicket/pages/LoginPage.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"  
-      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"  
-      xml:lang="en"  
-      lang="en"> 
-      
-	<!-- Head with Wicket-controlled resources in this package -->
-	<wicket:head>
-   		<title wicket:id="title">[page title]</title>
-		<link rel="stylesheet" type="text/css" href="gitblit.css"/>
-		<link rel="shortcut icon" href="gitblt-favicon.png" type="image/png" />
-	</wicket:head>
-	
-	<body onload="document.getElementById('username').focus();">
-		<div>
-			<div style="padding-top: 10px;text-align:center;">
-				<img src="gitblt_25.png" alt="Gitblit"/><br/>
-				<div style="padding-top:30px;font-weight:bold;" wicket:id="name">[name]</div>
-			</div>
-
-			<form style="text-align:center;" wicket:id="loginForm">
-				<div>
-					<p/>
-					<wicket:message key="gb.username"></wicket:message> &nbsp;
-					<input type="text" id="username" wicket:id="username" value=""/>
-					<p/>
-					<wicket:message key="gb.password"></wicket:message> &nbsp;
-					<input type="password"  wicket:id="password" value=""/>
-					<p/>
-					<input type="submit" value="Login" wicket:message="value:gb.login" />
-					<div style="padding-top:10px;" wicket:id="feedback"></div>
-				</div>
-			</form>					
-		</div>
-	</body>
-</html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/pages/LoginPage.java b/src/com/gitblit/wicket/pages/LoginPage.java
deleted file mode 100644
index 45e1e2d..0000000
--- a/src/com/gitblit/wicket/pages/LoginPage.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright 2011 gitblit.com.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.gitblit.wicket.pages;
-
-import javax.servlet.http.Cookie;
-
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.RestartResponseException;
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.PasswordTextField;
-import org.apache.wicket.markup.html.form.StatelessForm;
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.markup.html.panel.FeedbackPanel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.protocol.http.WebRequest;
-import org.apache.wicket.protocol.http.WebResponse;
-
-import com.gitblit.Constants;
-import com.gitblit.GitBlit;
-import com.gitblit.Keys;
-import com.gitblit.models.UserModel;
-import com.gitblit.wicket.GitBlitWebSession;
-
-public class LoginPage extends WebPage {
-
-	IModel<String> username = new Model<String>("");
-	IModel<String> password = new Model<String>("");
-
-	public LoginPage(PageParameters params) {
-		super(params);
-
-		// If we are already logged in because user directly accessed
-		// the login url, redirect to the home page
-		if (GitBlitWebSession.get().isLoggedIn()) {
-			throw new RestartResponseException(getApplication().getHomePage());
-		}
-
-		if (GitBlit.getBoolean(Keys.web.allowCookieAuthentication, false)) {
-			loginByCookie();
-		}
-
-		add(new Label("title", GitBlit.getString(Keys.web.siteName, Constants.NAME)));
-		add(new Label("name", GitBlit.getString(Keys.web.siteName, Constants.NAME)));
-
-		StatelessForm<Void> loginForm = new StatelessForm<Void>("loginForm") {
-
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onSubmit() {
-				String username = LoginPage.this.username.getObject();
-				char[] password = LoginPage.this.password.getObject().toCharArray();
-
-				UserModel user = GitBlit.self().authenticate(username, password);
-				if (user == null) {
-					error("Invalid username or password!");
-				} else if (user.username.equals(Constants.FEDERATION_USER)) {
-					// disallow the federation user from logging in via the
-					// web ui
-					error("Invalid username or password!");
-					user = null;
-				} else {
-					loginUser(user);
-				}
-			}
-		};
-		loginForm.add(new TextField<String>("username", username));
-		loginForm.add(new PasswordTextField("password", password));
-		loginForm.add(new FeedbackPanel("feedback"));
-		add(loginForm);
-	}
-
-	private void loginByCookie() {
-		UserModel user = null;
-
-		// Grab cookie from Browser Session
-		Cookie[] cookies = ((WebRequest) getRequestCycle().getRequest()).getCookies();
-		if (cookies != null && cookies.length > 0) {
-			user = GitBlit.self().authenticate(cookies);
-		}
-
-		// Login the user
-		loginUser(user);
-	}
-
-	private void loginUser(UserModel user) {
-		if (user != null) {
-			// Set the user into the session
-			GitBlitWebSession.get().setUser(user);
-
-			// Set Cookie
-			if (GitBlit.getBoolean(Keys.web.allowCookieAuthentication, false)) {
-				WebResponse response = (WebResponse) getRequestCycle().getResponse();
-				GitBlit.self().setCookie(response, user);
-			}
-
-			if (!continueToOriginalDestination()) {
-				// Redirect to home page
-				setResponsePage(getApplication().getHomePage());
-			}
-		}
-	}
-}
diff --git a/src/com/gitblit/wicket/pages/MetricsPage.java b/src/com/gitblit/wicket/pages/MetricsPage.java
index 23dcd8a..41c605c 100644
--- a/src/com/gitblit/wicket/pages/MetricsPage.java
+++ b/src/com/gitblit/wicket/pages/MetricsPage.java
@@ -68,7 +68,7 @@
 		if ((metrics != null) && (metrics.size() > 0)) {
 			IChartData data = WicketUtils.getChartData(metrics);
 
-			ChartProvider provider = new ChartProvider(new Dimension(500, 100), ChartType.LINE,
+			ChartProvider provider = new ChartProvider(new Dimension(400, 100), ChartType.LINE,
 					data);
 			ChartAxis dateAxis = new ChartAxis(ChartAxisType.BOTTOM);
 			dateAxis.setLabels(new String[] { metrics.get(0).name,
@@ -93,7 +93,7 @@
 		if ((metrics != null) && (metrics.size() > 0)) {
 			IChartData data = WicketUtils.getChartData(metrics);
 
-			ChartProvider provider = new ChartProvider(new Dimension(500, 100),
+			ChartProvider provider = new ChartProvider(new Dimension(400, 100),
 					ChartType.BAR_VERTICAL_SET, data);
 			ChartAxis dateAxis = new ChartAxis(ChartAxisType.BOTTOM);
 			List<String> labels = new ArrayList<String>();
diff --git a/src/com/gitblit/wicket/pages/RepositoriesPage.html b/src/com/gitblit/wicket/pages/RepositoriesPage.html
index a0c58c9..c883099 100644
--- a/src/com/gitblit/wicket/pages/RepositoriesPage.html
+++ b/src/com/gitblit/wicket/pages/RepositoriesPage.html
@@ -9,23 +9,9 @@
 
 <body>
 <wicket:extend>
-	<!-- Filler div -->
-	<div style="padding-top:18px;"></div>
-		
-	<div style="text-align:center;padding-bottom:5px;" wicket:id="feedback">[Feedback Panel]</div>
-	
-	<div class="markdown" style="margin-top:-0.5em;padding-bottom:5px;" wicket:id="repositoriesMessage">[repositories message]</div>
+	<div class="markdown" style="margin-top:-1em;padding-bottom:5px;" wicket:id="repositoriesMessage">[repositories message]</div>
 	
 	<div wicket:id="repositoriesPanel">[repositories panel]</div>
-
-	<div style="padding-top: 10px;"wicket:id="usersPanel">[users panel]</div>
-	
-	<div style="padding-top: 10px;"wicket:id="federationTokensPanel">[federation tokens panel]</div>
-
-	<div style="padding-top: 10px;"wicket:id="federationProposalsPanel">[federation proposals panel]</div>
-
-	<div style="padding-top: 10px;"wicket:id="federationRegistrationsPanel">[federation registrations panel]</div>
-		
 </wicket:extend>
 </body>
 </html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/pages/RepositoriesPage.java b/src/com/gitblit/wicket/pages/RepositoriesPage.java
index 619d42e..d5a21a7 100644
--- a/src/com/gitblit/wicket/pages/RepositoriesPage.java
+++ b/src/com/gitblit/wicket/pages/RepositoriesPage.java
@@ -31,66 +31,48 @@
 import com.gitblit.utils.StringUtils;
 import com.gitblit.wicket.GitBlitWebSession;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.panels.FederationProposalsPanel;
-import com.gitblit.wicket.panels.FederationRegistrationsPanel;
-import com.gitblit.wicket.panels.FederationTokensPanel;
 import com.gitblit.wicket.panels.RepositoriesPanel;
-import com.gitblit.wicket.panels.UsersPanel;
 
-public class RepositoriesPage extends BasePage {
+public class RepositoriesPage extends RootPage {
 
 	public RepositoriesPage() {
 		super();
 		setupPage("", "");
 
-		final boolean showAdmin;
-		if (GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {
-			boolean allowAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
-			showAdmin = allowAdmin && GitBlitWebSession.get().canAdmin();
-			// authentication requires state and session
-			setStatelessHint(false);
-		} else {
-			showAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
-			if (GitBlit.getBoolean(Keys.web.authenticateViewPages, false)) {
-				// authentication requires state and session
-				setStatelessHint(false);
-			} else {
-				// no authentication required, no state and no session required
-				setStatelessHint(true);
-			}
-		}
-
-		// display an error message cached from a redirect
-		String cachedMessage = GitBlitWebSession.get().clearErrorMessage();
-		if (!StringUtils.isEmpty(cachedMessage)) {
-			error(cachedMessage);
-		} else if (showAdmin) {
-			int pendingProposals = GitBlit.self().getPendingFederationProposals().size();
-			if (pendingProposals == 1) {
-				info("There is 1 federation proposal awaiting review.");
-			} else if (pendingProposals > 1) {
-				info(MessageFormat.format("There are {0} federation proposals awaiting review.",
-						pendingProposals));
-			}
+		// check to see if we should display a login message
+		boolean authenticateView = GitBlit.getBoolean(Keys.web.authenticateViewPages, true);
+		if (authenticateView && !GitBlitWebSession.get().isLoggedIn()) {
+			String messageSource = GitBlit.getString(Keys.web.loginMessage, "gitblit");
+			String message = readMarkdown(messageSource, "login.mkd");
+			Component repositoriesMessage = new Label("repositoriesMessage", message);
+			add(repositoriesMessage.setEscapeModelStrings(false));
+			add(new Label("repositoriesPanel"));
+			return;
 		}
 
 		// Load the markdown welcome message
 		String messageSource = GitBlit.getString(Keys.web.repositoriesMessage, "gitblit");
-		String message = "<br/>";
+		String message = readMarkdown(messageSource, "welcome.mkd");
+		Component repositoriesMessage = new Label("repositoriesMessage", message)
+				.setEscapeModelStrings(false).setVisible(message.length() > 0);
+		add(repositoriesMessage);
+		RepositoriesPanel repositories = new RepositoriesPanel("repositoriesPanel", showAdmin,
+				null, getAccessRestrictions());
+		// push the panel down if we are hiding the admin controls and the
+		// welcome message
+		if (!showAdmin && !repositoriesMessage.isVisible()) {
+			WicketUtils.setCssStyle(repositories, "padding-top:5px;");
+		}
+		add(repositories);
+	}
+
+	private String readMarkdown(String messageSource, String resource) {
+		String message = "";
 		if (messageSource.equalsIgnoreCase("gitblit")) {
-			// Read default welcome message
-			try {
-				ContextRelativeResource res = WicketUtils.getResource("welcome.mkd");
-				InputStream is = res.getResourceStream().getInputStream();
-				InputStreamReader reader = new InputStreamReader(is);
-				message = MarkdownUtils.transformMarkdown(reader);
-				reader.close();
-			} catch (Throwable t) {
-				message = "Failed to read default welcome message!";
-				error(message, t, false);
-			}
+			// Read default message
+			message = readDefaultMarkdown(resource);
 		} else {
-			// Read user-supplied welcome message
+			// Read user-supplied message
 			if (!StringUtils.isEmpty(messageSource)) {
 				File file = new File(messageSource);
 				if (file.exists()) {
@@ -106,31 +88,21 @@
 				}
 			}
 		}
-		Component repositoriesMessage = new Label("repositoriesMessage", message)
-				.setEscapeModelStrings(false);
-		add(repositoriesMessage);
-		add(new RepositoriesPanel("repositoriesPanel", showAdmin, null, getAccessRestrictions()));
-		add(new UsersPanel("usersPanel", showAdmin).setVisible(showAdmin));
-		boolean showFederation = showAdmin && GitBlit.canFederate();
-		add(new FederationTokensPanel("federationTokensPanel", showFederation)
-				.setVisible(showFederation));
-		FederationProposalsPanel proposalsPanel = new FederationProposalsPanel(
-				"federationProposalsPanel");
-		if (showFederation) {
-			proposalsPanel.hideIfEmpty();
-		} else {
-			proposalsPanel.setVisible(false);
-		}
+		return message;
+	}
 
-		boolean showRegistrations = GitBlit.getBoolean(Keys.web.showFederationRegistrations, false);
-		FederationRegistrationsPanel registrationsPanel = new FederationRegistrationsPanel(
-				"federationRegistrationsPanel");
-		if (showAdmin || showRegistrations) {
-			registrationsPanel.hideIfEmpty();
-		} else {
-			registrationsPanel.setVisible(false);
+	private String readDefaultMarkdown(String file) {
+		String message;
+		try {
+			ContextRelativeResource res = WicketUtils.getResource(file);
+			InputStream is = res.getResourceStream().getInputStream();
+			InputStreamReader reader = new InputStreamReader(is);
+			message = MarkdownUtils.transformMarkdown(reader);
+			reader.close();
+		} catch (Throwable t) {
+			message = MessageFormat.format("Failed to read default message from {0}!", file);
+			error(message, t, false);
 		}
-		add(proposalsPanel);
-		add(registrationsPanel);
+		return message;
 	}
 }
diff --git a/src/com/gitblit/wicket/pages/RepositoryPage.html b/src/com/gitblit/wicket/pages/RepositoryPage.html
index e793a1e..100016f 100644
--- a/src/com/gitblit/wicket/pages/RepositoryPage.html
+++ b/src/com/gitblit/wicket/pages/RepositoryPage.html
@@ -8,24 +8,42 @@
 	<wicket:extend>
 		<!-- page header bar -->	
 		<div>
-			<!-- floating search form on right -->
-			<div class="search">
-				<form wicket:id="searchForm">
-					<select wicket:id="searchType"/>			
-					<input type="text" id="searchBox" wicket:id="searchBox" size="25" value=""/>
-				</form>
-			</div>
-		
 			<!-- page nav links -->
-			<div class="page_nav">
-				<a style="text-decoration: none;" wicket:id="syndication">
-					<img style="border:0px;vertical-align:middle;" src="feed_16x16.png"></img>
-				</a>				
-				<a wicket:id="summary"><wicket:message key="gb.summary"></wicket:message></a> | <a wicket:id="log"><wicket:message key="gb.log"></wicket:message></a> | <a wicket:id="branches"><wicket:message key="gb.branches"></wicket:message></a> | <a wicket:id="tags"><wicket:message key="gb.tags"></wicket:message></a> | <a wicket:id="tree"><wicket:message key="gb.tree"></wicket:message></a> <span wicket:id="extra"><span wicket:id="extraSeparator"></span><span wicket:id="extraLink"></span></span>
+			<div class="topbar">
+			<div class="fill">
+			<div class="container">
+				<a class="brand" wicket:id="rootLink">
+					<img src="gitblt_25_white.png" width="79" height="25" alt="gitblit" class="logo"/>
+				</a>
+				<ul class="nav">				
+					<li><a wicket:id="repositories"><wicket:message key="gb.repositories"></wicket:message></a></li>
+					<li><a wicket:id="summary"><wicket:message key="gb.summary"></wicket:message></a></li>
+					<li><a wicket:id="log"><wicket:message key="gb.log"></wicket:message></a></li>
+					<li><a wicket:id="branches"><wicket:message key="gb.branches"></wicket:message></a></li>
+					<li><a wicket:id="tags"><wicket:message key="gb.tags"></wicket:message></a></li>
+					<li><a wicket:id="tree"><wicket:message key="gb.tree"></wicket:message></a></li>
+					<li wicket:id="extra"><span wicket:id="extraLink"></span></li>
+					<li><a style="text-decoration: none;" wicket:id="syndication">
+						<img style="border:0px;vertical-align:middle;" src="feed_16x16.png"></img></a>
+					</li>									
+				</ul>
+				<form class="pull-right" wicket:id="searchForm">
+					<div class="search">
+						<select class="small" wicket:id="searchType"/>			
+						<input type="text" id="searchBox" wicket:id="searchBox" value=""/>
+					</div>
+				</form>
+				</div>
+			</div>
 			</div>
 		</div>
 		
-		<div style="text-align:center;" wicket:id="feedback">[Feedback Panel]</div>
+		<div style="text-align:center;padding-top:5px;" wicket:id="feedback">[Feedback Panel]</div>
+	
+		<!-- page header -->
+		<div class="page-header">
+			<h2><span wicket:id="repositoryName">[repository name]</span> <small><span wicket:id="pageName">[page name]</span></small></h2>
+		</div>
 	
 		<!-- page content -->
 		<wicket:child />
diff --git a/src/com/gitblit/wicket/pages/RepositoryPage.java b/src/com/gitblit/wicket/pages/RepositoryPage.java
index 7062e3b..1b6ae08 100644
--- a/src/com/gitblit/wicket/pages/RepositoryPage.java
+++ b/src/com/gitblit/wicket/pages/RepositoryPage.java
@@ -69,6 +69,7 @@
 		private static final long serialVersionUID = 1L;
 
 		{
+			put("repositories", new PageRegistration("gb.repositories", RepositoriesPage.class, false));
 			put("summary", new PageRegistration("gb.summary", SummaryPage.class));
 			put("log", new PageRegistration("gb.log", LogPage.class));
 			put("branches", new PageRegistration("gb.branches", BranchesPage.class));
@@ -93,6 +94,7 @@
 		RepositoryModel model = getRepositoryModel();
 
 		// standard page links
+		addRegisteredPageLink("repositories");
 		addRegisteredPageLink("summary");
 		addRegisteredPageLink("log");
 		addRegisteredPageLink("branches");
@@ -133,10 +135,8 @@
 			public void populateItem(final Item<String> item) {
 				String extra = item.getModelObject();
 				PageRegistration pageReg = registeredPages.get(extra);
-				item.add(new Label("extraSeparator", " | "));
 				item.add(new LinkPanel("extraLink", null, getString(pageReg.translationKey),
-						pageReg.pageClass, WicketUtils.newRepositoryParameter(repositoryName))
-						.setEnabled(!extra.equals(pageWicketId)));
+						pageReg.pageClass, WicketUtils.newRepositoryParameter(repositoryName)));
 			}
 		};
 		add(extrasView);
@@ -155,6 +155,15 @@
 		// set stateless page preference
 		setStatelessHint(true);
 	}
+	
+	@Override
+	protected void setupPage(String repositoryName, String pageName) {
+		add(new LinkPanel("repositoryName", null, repositoryName, SummaryPage.class,
+				WicketUtils.newRepositoryParameter(repositoryName)));
+		add(new Label("pageName", pageName));
+
+		super.setupPage(repositoryName, pageName);
+	}
 
 	public String getLinkWicketId(String pageName) {
 		for (String wicketId : registeredPages.keySet()) {
@@ -172,15 +181,20 @@
 		if (!StringUtils.isEmpty(wicketId)) {
 			Component c = get(wicketId);
 			if (c != null) {
-				c.setEnabled(false);
+//				c.setEnabled(false);
+//				WicketUtils.setCssClass(c, "selected");
 			}
 		}
 	}
 
 	private void addRegisteredPageLink(String key) {
 		PageRegistration pageReg = registeredPages.get(key);
-		add(new BookmarkablePageLink<Void>(key, pageReg.pageClass,
-				WicketUtils.newRepositoryParameter(repositoryName)));
+		if (pageReg.repositoryLink) {
+			add(new BookmarkablePageLink<Void>(key, pageReg.pageClass,
+					WicketUtils.newRepositoryParameter(repositoryName)));
+		} else {
+			add(new BookmarkablePageLink<Void>(key, pageReg.pageClass));
+		}
 	}
 
 	protected void addSyndicationDiscoveryLink() {
@@ -335,10 +349,16 @@
 
 		final String translationKey;
 		final Class<? extends BasePage> pageClass;
+		final boolean repositoryLink;
 
 		PageRegistration(String translationKey, Class<? extends BasePage> pageClass) {
+			this(translationKey, pageClass, true);
+		}
+		
+		PageRegistration(String translationKey, Class<? extends BasePage> pageClass, boolean repositoryLink) {
 			this.translationKey = translationKey;
 			this.pageClass = pageClass;
+			this.repositoryLink = repositoryLink;
 		}
 	}
 
@@ -364,7 +384,7 @@
 
 		void setTranslatedAttributes() {
 			WicketUtils.setHtmlTooltip(get("searchType"), getString("gb.searchTypeTooltip"));
-			WicketUtils.setHtmlTooltip(get("searchBox"), getString("gb.searchTooltip"));
+			WicketUtils.setHtmlTooltip(get("searchBox"), MessageFormat.format(getString("gb.searchTooltip"), repositoryName));
 			WicketUtils.setInputPlaceholder(get("searchBox"), getString("gb.search"));
 		}
 
@@ -372,6 +392,10 @@
 		public void onSubmit() {
 			SearchType searchType = searchTypeModel.getObject();
 			String searchString = searchBoxModel.getObject();
+			if (searchString == null) {
+				// FIXME IE intermittently has no searchString. Wicket bug?
+				return;
+			}
 			for (SearchType type : SearchType.values()) {
 				if (searchString.toLowerCase().startsWith(type.name().toLowerCase() + ":")) {
 					searchType = type;
diff --git a/src/com/gitblit/wicket/pages/ReviewProposalPage.html b/src/com/gitblit/wicket/pages/ReviewProposalPage.html
index d4244ea..6487a0a 100644
--- a/src/com/gitblit/wicket/pages/ReviewProposalPage.html
+++ b/src/com/gitblit/wicket/pages/ReviewProposalPage.html
@@ -6,11 +6,6 @@
 
 <body>
 <wicket:extend>
-
-	<div style="padding-top:20px"></div>
-
-	<div style="text-align:center;" wicket:id="feedback">[Feedback Panel]</div>	
-
 	<!-- proposal info -->
 	<table class="plain">
 		<tr><th><wicket:message key="gb.received">received</wicket:message></th><td><span wicket:id="received">[received]</span></td></tr>
@@ -21,7 +16,7 @@
 		<tr><th valign="top"><wicket:message key="gb.proposal">proposal</wicket:message></th><td><span class="sha1" wicket:id="definition">[definition]</span></td></tr>
 	</table>
 		
-	<div wicket:id="repositories"></div>
+	<div wicket:id="repositoriesPanel"></div>
 	
 </wicket:extend>    
 </body>
diff --git a/src/com/gitblit/wicket/pages/ReviewProposalPage.java b/src/com/gitblit/wicket/pages/ReviewProposalPage.java
index b006d80..1d9092a 100644
--- a/src/com/gitblit/wicket/pages/ReviewProposalPage.java
+++ b/src/com/gitblit/wicket/pages/ReviewProposalPage.java
@@ -33,7 +33,7 @@
 import com.gitblit.wicket.panels.RepositoriesPanel;
 
 @RequiresAdminRole
-public class ReviewProposalPage extends BasePage {
+public class ReviewProposalPage extends RootSubPage {
 
 	private final String PROPS_PATTERN = "{0} = {1}\n";
 
@@ -42,9 +42,6 @@
 	public ReviewProposalPage(PageParameters params) {
 		super(params);
 
-		setupPage("", getString("gb.proposals"));
-		setStatelessHint(true);
-
 		final String token = WicketUtils.getToken(params);
 
 		FederationProposal proposal = GitBlit.self().getPendingFederationProposal(token);
@@ -52,13 +49,15 @@
 			error("Could not find federation proposal!", true);
 		}
 
+		setupPage(getString("gb.proposals"), proposal.url);
+		
+
 		add(new Label("url", proposal.url));
 		add(new Label("message", proposal.message));
 		add(WicketUtils.createTimestampLabel("received", proposal.received, getTimeZone()));
 		add(new Label("token", proposal.token));
 		add(new Label("tokenType", proposal.tokenType.name()));
-
-		boolean go = true;
+		
 		String p;
 		if (GitBlit.isGO()) {
 			// gitblit.properties definition
@@ -92,7 +91,7 @@
 
 		List<RepositoryModel> repositories = new ArrayList<RepositoryModel>(
 				proposal.repositories.values());
-		RepositoriesPanel repositoriesPanel = new RepositoriesPanel("repositories", false,
+		RepositoriesPanel repositoriesPanel = new RepositoriesPanel("repositoriesPanel", false,
 				repositories, getAccessRestrictions());
 		add(repositoriesPanel);
 	}
diff --git a/src/com/gitblit/wicket/pages/RootPage.html b/src/com/gitblit/wicket/pages/RootPage.html
new file mode 100644
index 0000000..c947092
--- /dev/null
+++ b/src/com/gitblit/wicket/pages/RootPage.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"  
+      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"  
+      xml:lang="en"  
+      lang="en"> 
+<body>
+<wicket:extend>
+	<div class="topbar">
+		<div class="fill">
+			<div class="container">
+				<a class="brand" wicket:id="rootLink">
+					<img src="gitblt_25_white.png" width="79" height="25" alt="gitblit" class="logo"/>
+				</a>
+				
+				<ul class="nav">				
+					<li><a wicket:id="repositories"><wicket:message key="gb.repositories"></wicket:message></a></li>
+					<li><a wicket:id="users"><wicket:message key="gb.users"></wicket:message></a></li>
+					<li><a wicket:id="federation"><wicket:message key="gb.federation"></wicket:message></a></li>
+				</ul>
+				
+				<form class="pull-right" wicket:id="loginForm">
+					<div class="login">
+						<input wicket:id="username" class="input-small" type="text" />
+						<input wicket:id="password" class="input-small" type="password" />
+						<button class="btn primary" type="submit"><wicket:message key="gb.login"></wicket:message></button>
+					</div>
+				</form>
+			</div>
+		</div>
+	</div>
+	
+	<div style="text-align:center;padding-top:5px;" wicket:id="feedback">[Feedback Panel]</div>
+	
+	<!-- subclass content -->
+	<wicket:child/>		
+</wicket:extend>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/pages/RootPage.java b/src/com/gitblit/wicket/pages/RootPage.java
new file mode 100644
index 0000000..69ac25d
--- /dev/null
+++ b/src/com/gitblit/wicket/pages/RootPage.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright 2011 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.gitblit.wicket.pages;
+
+import java.text.MessageFormat;
+
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.form.PasswordTextField;
+import org.apache.wicket.markup.html.form.StatelessForm;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.protocol.http.WebResponse;
+
+import com.gitblit.Constants;
+import com.gitblit.GitBlit;
+import com.gitblit.Keys;
+import com.gitblit.models.UserModel;
+import com.gitblit.utils.StringUtils;
+import com.gitblit.wicket.GitBlitWebSession;
+import com.gitblit.wicket.WicketUtils;
+
+/**
+ * Root page is a topbar, navigable page like Repositories, Users, or
+ * Federation.
+ * 
+ * @author James Moger
+ * 
+ */
+public abstract class RootPage extends BasePage {
+
+	boolean showAdmin;
+
+	IModel<String> username = new Model<String>("");
+	IModel<String> password = new Model<String>("");
+
+	public RootPage() {
+		super();
+	}
+
+	public RootPage(PageParameters params) {
+		super(params);
+	}
+
+	@Override
+	protected void setupPage(String repositoryName, String pageName) {
+		if (GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {
+			boolean allowAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
+			showAdmin = allowAdmin && GitBlitWebSession.get().canAdmin();
+			// authentication requires state and session
+			setStatelessHint(false);
+		} else {
+			showAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
+			if (GitBlit.getBoolean(Keys.web.authenticateViewPages, false)) {
+				// authentication requires state and session
+				setStatelessHint(false);
+			} else {
+				// no authentication required, no state and no session required
+				setStatelessHint(true);
+			}
+		}
+		boolean showRegistrations = GitBlit.canFederate()
+				&& GitBlit.getBoolean(Keys.web.showFederationRegistrations, false);
+
+		// navigation links
+		add(new BookmarkablePageLink<Void>("repositories", RepositoriesPage.class));
+		add(new BookmarkablePageLink<Void>("users", UsersPage.class).setVisible(showAdmin));
+		add(new BookmarkablePageLink<Void>("federation", FederationPage.class).setVisible(showAdmin
+				|| showRegistrations));
+
+		// login form
+		StatelessForm<Void> loginForm = new StatelessForm<Void>("loginForm") {
+
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onSubmit() {
+				String username = RootPage.this.username.getObject();
+				char[] password = RootPage.this.password.getObject().toCharArray();
+
+				UserModel user = GitBlit.self().authenticate(username, password);
+				if (user == null) {
+					error("Invalid username or password!");
+				} else if (user.username.equals(Constants.FEDERATION_USER)) {
+					// disallow the federation user from logging in via the
+					// web ui
+					error("Invalid username or password!");
+					user = null;
+				} else {
+					loginUser(user);
+				}
+			}
+		};
+		TextField<String> unameField = new TextField<String>("username", username);
+		WicketUtils.setInputPlaceholder(unameField, getString("gb.username"));
+		loginForm.add(unameField);
+		PasswordTextField pwField = new PasswordTextField("password", password);
+		WicketUtils.setInputPlaceholder(pwField, getString("gb.password"));
+		loginForm.add(pwField);
+		add(loginForm);
+		if (GitBlit.getBoolean(Keys.web.authenticateViewPages, true)
+				|| GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {
+			loginForm.setVisible(!GitBlitWebSession.get().isLoggedIn());
+		} else {
+			loginForm.setVisible(false);
+		}
+
+		// display an error message cached from a redirect
+		String cachedMessage = GitBlitWebSession.get().clearErrorMessage();
+		if (!StringUtils.isEmpty(cachedMessage)) {
+			error(cachedMessage);
+		} else if (showAdmin) {
+			int pendingProposals = GitBlit.self().getPendingFederationProposals().size();
+			if (pendingProposals == 1) {
+				info("There is 1 federation proposal awaiting review.");
+			} else if (pendingProposals > 1) {
+				info(MessageFormat.format("There are {0} federation proposals awaiting review.",
+						pendingProposals));
+			}
+		}
+
+		super.setupPage(repositoryName, pageName);
+	}
+
+	private void loginUser(UserModel user) {
+		if (user != null) {
+			// Set the user into the session
+			GitBlitWebSession.get().setUser(user);
+
+			// Set Cookie
+			if (GitBlit.getBoolean(Keys.web.allowCookieAuthentication, false)) {
+				WebResponse response = (WebResponse) getRequestCycle().getResponse();
+				GitBlit.self().setCookie(response, user);
+			}
+
+			if (!continueToOriginalDestination()) {
+				// Redirect to home page
+				setResponsePage(getApplication().getHomePage());
+			}
+		}
+	}
+}
diff --git a/src/com/gitblit/wicket/pages/RootSubPage.html b/src/com/gitblit/wicket/pages/RootSubPage.html
new file mode 100644
index 0000000..554da11
--- /dev/null
+++ b/src/com/gitblit/wicket/pages/RootSubPage.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"  
+      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"  
+      xml:lang="en"  
+      lang="en"> 
+
+<body>
+<wicket:extend>
+	<!-- page header -->
+	<div class="page-header">
+		<h2><span wicket:id="pageName">[page name]</span> <small><span wicket:id="pageSubName">[sub name]</span></small></h2>
+	</div>
+	
+	<!-- Subclass Content -->
+	<wicket:child/>
+</wicket:extend>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/pages/RootSubPage.java b/src/com/gitblit/wicket/pages/RootSubPage.java
new file mode 100644
index 0000000..f7572b1
--- /dev/null
+++ b/src/com/gitblit/wicket/pages/RootSubPage.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2011 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.gitblit.wicket.pages;
+
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.basic.Label;
+
+import com.gitblit.utils.StringUtils;
+
+/**
+ * RootSubPage is a non-topbar navigable RootPage. It also has a page header.
+ * 
+ * @author James Moger
+ * 
+ */
+public abstract class RootSubPage extends RootPage {
+
+	public RootSubPage() {
+		super();
+	}
+
+	public RootSubPage(PageParameters params) {
+		super(params);
+	}
+
+	@Override
+	protected void setupPage(String pageName, String subName) {
+		add(new Label("pageName", pageName));
+		if (!StringUtils.isEmpty(subName)) {
+			subName = "/ " + subName;
+		}
+		add(new Label("pageSubName", subName));
+		super.setupPage("", pageName);
+	}
+}
diff --git a/src/com/gitblit/wicket/pages/SendProposalPage.html b/src/com/gitblit/wicket/pages/SendProposalPage.html
index 90fe0a2..8a28906 100644
--- a/src/com/gitblit/wicket/pages/SendProposalPage.html
+++ b/src/com/gitblit/wicket/pages/SendProposalPage.html
@@ -6,25 +6,19 @@
 
 <wicket:extend>
 <body onload="document.getElementById('myUrl').focus();">
-
-
-	<div style="padding-top:20px"></div>
-
-	<div style="text-align:center;" wicket:id="feedback">[Feedback Panel]</div>	
-
 	<!-- proposal info -->
 	<form wicket:id="editForm">
 	<table class="plain">
-		<tr><th><wicket:message key="gb.url">url</wicket:message></th><td class="edit"><input type="text" wicket:id="myUrl" id="myUrl" size="60" />  &nbsp;<i><wicket:message key="gb.myUrlDescription"></wicket:message></i></td></tr>
-		<tr><th><wicket:message key="gb.destinationUrl">destination url</wicket:message></th><td class="edit"><input type="text" wicket:id="destinationUrl" size="60" /> &nbsp;<i><wicket:message key="gb.destinationUrlDescription"></wicket:message></i></td></tr>
-		<tr><th valign="top"><wicket:message key="gb.message">message</wicket:message></th><td class="edit"><input type="text" wicket:id="message" size="80" /></td></tr>
+		<tr><th><wicket:message key="gb.url">url</wicket:message></th><td class="edit"><input class="span6" type="text" wicket:id="myUrl" id="myUrl" size="60" />  &nbsp;<i><wicket:message key="gb.myUrlDescription"></wicket:message></i></td></tr>
+		<tr><th><wicket:message key="gb.destinationUrl">destination url</wicket:message></th><td class="edit"><input class="span6" type="text" wicket:id="destinationUrl" size="60" /> &nbsp;<i><wicket:message key="gb.destinationUrlDescription"></wicket:message></i></td></tr>
+		<tr><th valign="top"><wicket:message key="gb.message">message</wicket:message></th><td class="edit"><input class="span8" type="text" wicket:id="message" size="80" /></td></tr>
 		<tr><th><wicket:message key="gb.type">type</wicket:message></th><td><span wicket:id="tokenType">[token type]</span></td></tr>
 		<tr><th><wicket:message key="gb.token">token</wicket:message></th><td><span class="sha1" wicket:id="token">[token]</span></td></tr>
-		<tr><th></th><td class="editButton"><input type="submit" value="propose" wicket:message="value:gb.sendProposal" wicket:id="save" /> <input type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" /></td></tr>
+		<tr><th></th><td class="editButton"><input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" /> <input class="btn primary" type="submit" value="propose" wicket:message="value:gb.sendProposal" wicket:id="save" /> </td></tr>
 	</table>
 	</form>
 	
-	<div style="padding-top:10px;" wicket:id="repositories"></div>
+	<div style="padding-top:10px;" wicket:id="repositoriesPanel"></div>
 </body>
 </wicket:extend>    
 </html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/pages/SendProposalPage.java b/src/com/gitblit/wicket/pages/SendProposalPage.java
index 635b432..ed20049 100644
--- a/src/com/gitblit/wicket/pages/SendProposalPage.java
+++ b/src/com/gitblit/wicket/pages/SendProposalPage.java
@@ -37,7 +37,7 @@
 import com.gitblit.wicket.panels.RepositoriesPanel;
 
 @RequiresAdminRole
-public class SendProposalPage extends BasePage {
+public class SendProposalPage extends RootSubPage {
 
 	public String myUrl;
 
@@ -48,7 +48,7 @@
 	public SendProposalPage(PageParameters params) {
 		super(params);
 
-		setupPage("", getString("gb.sendProposal"));
+		setupPage(getString("gb.sendProposal"), "");
 		setStatelessHint(true);
 
 		final String token = WicketUtils.getToken(params);
@@ -139,7 +139,7 @@
 
 			@Override
 			public void onSubmit() {
-				setResponsePage(RepositoriesPage.class);
+				setResponsePage(FederationPage.class);
 			}
 		};
 		cancel.setDefaultFormProcessing(false);
@@ -148,7 +148,7 @@
 
 		List<RepositoryModel> repositories = new ArrayList<RepositoryModel>(
 				proposal.repositories.values());
-		RepositoriesPanel repositoriesPanel = new RepositoriesPanel("repositories", false,
+		RepositoriesPanel repositoriesPanel = new RepositoriesPanel("repositoriesPanel", false,
 				repositories, getAccessRestrictions());
 		add(repositoriesPanel);
 	}
diff --git a/src/com/gitblit/wicket/pages/TicketPage.html b/src/com/gitblit/wicket/pages/TicketPage.html
index 160bc0c..ed3eb22 100644
--- a/src/com/gitblit/wicket/pages/TicketPage.html
+++ b/src/com/gitblit/wicket/pages/TicketPage.html
@@ -8,7 +8,7 @@
 <wicket:extend>
 
 	<!-- ticket title -->
-	<div style="font-size:150%;padding-top:5px;" wicket:id="ticketTitle">[ticket title]</div>
+	<div style="font-size:150%;padding-top:5px;padding-bottom:5px;" wicket:id="ticketTitle">[ticket title]</div>
 		
 	<!-- ticket info -->
 	<table class="plain">
diff --git a/src/com/gitblit/wicket/pages/TicketPage.java b/src/com/gitblit/wicket/pages/TicketPage.java
index 48db1ce..d250a45 100644
--- a/src/com/gitblit/wicket/pages/TicketPage.java
+++ b/src/com/gitblit/wicket/pages/TicketPage.java
@@ -34,7 +34,7 @@
 	public TicketPage(PageParameters params) {
 		super(params);
 
-		final String ticketFolder = WicketUtils.getPath(params);
+		final String ticketFolder = WicketUtils.getObject(params);
 
 		Repository r = getRepository();
 		TicketModel t = TicgitUtils.getTicket(r, ticketFolder);
diff --git a/src/com/gitblit/wicket/pages/UsersPage.html b/src/com/gitblit/wicket/pages/UsersPage.html
new file mode 100644
index 0000000..4d14496
--- /dev/null
+++ b/src/com/gitblit/wicket/pages/UsersPage.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"  
+      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"  
+      xml:lang="en"  
+      lang="en"> 
+<body>
+<wicket:extend>
+	<div wicket:id="usersPanel">[users panel]</div>
+</wicket:extend>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/pages/UsersPage.java b/src/com/gitblit/wicket/pages/UsersPage.java
new file mode 100644
index 0000000..b54b968
--- /dev/null
+++ b/src/com/gitblit/wicket/pages/UsersPage.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2011 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.gitblit.wicket.pages;
+
+import com.gitblit.wicket.RequiresAdminRole;
+import com.gitblit.wicket.panels.UsersPanel;
+
+@RequiresAdminRole
+public class UsersPage extends RootPage {
+
+	public UsersPage() {
+		super();		
+		setupPage("", "");
+
+		add(new UsersPanel("usersPanel", showAdmin).setVisible(showAdmin));
+	}
+}
diff --git a/src/com/gitblit/wicket/panels/BranchesPanel.html b/src/com/gitblit/wicket/panels/BranchesPanel.html
index c58f42e..01fb8ba 100644
--- a/src/com/gitblit/wicket/panels/BranchesPanel.html
+++ b/src/com/gitblit/wicket/panels/BranchesPanel.html
@@ -8,7 +8,7 @@
 <wicket:panel>
 
 	<!-- header -->
-	<div class="header"><img style="vertical-align: top;" src="commit_branch_16x16.png"></img><span wicket:id="branches">[branches header]</span></div>	
+	<div class="header"><img style="vertical-align: middle;" src="commit_branch_16x16.png"></img><span wicket:id="branches">[branches header]</span></div>	
 	
 	<table class="pretty">
 		<tbody>
diff --git a/src/com/gitblit/wicket/panels/FederationProposalsPanel.html b/src/com/gitblit/wicket/panels/FederationProposalsPanel.html
index e451b7c..89324d5 100644
--- a/src/com/gitblit/wicket/panels/FederationProposalsPanel.html
+++ b/src/com/gitblit/wicket/panels/FederationProposalsPanel.html
@@ -10,7 +10,7 @@
 		<table class="repositories">
 		<tr>
 			<th class="left">
-				<img style="vertical-align: top; border: 1px solid #888; background-color: white;" src="federated_16x16.png"/>
+				<img style="vertical-align: middle; border: 1px solid #888; background-color: white;" src="federated_16x16.png"/>
 				<wicket:message key="gb.proposals">[proposals]</wicket:message>
 			</th>
 			<th><wicket:message key="gb.received">[received]</wicket:message></th>
diff --git a/src/com/gitblit/wicket/panels/FederationRegistrationsPanel.html b/src/com/gitblit/wicket/panels/FederationRegistrationsPanel.html
index 6fab778..fbc6f6c 100644
--- a/src/com/gitblit/wicket/panels/FederationRegistrationsPanel.html
+++ b/src/com/gitblit/wicket/panels/FederationRegistrationsPanel.html
@@ -10,7 +10,7 @@
 	<table class="repositories">
 		<tr>
 			<th class="left">
-				<img style="vertical-align: top; border: 1px solid #888; background-color: white;" src="federated_16x16.png"/>
+				<img style="vertical-align: middle; border: 1px solid #888; background-color: white;" src="federated_16x16.png"/>
 				<wicket:message key="gb.registrations">[registrations]</wicket:message>
 			</th>
 			<th><wicket:message key="gb.name">[name]</wicket:message></th>
diff --git a/src/com/gitblit/wicket/panels/FederationTokensPanel.html b/src/com/gitblit/wicket/panels/FederationTokensPanel.html
index 06c1869..dc5307b 100644
--- a/src/com/gitblit/wicket/panels/FederationTokensPanel.html
+++ b/src/com/gitblit/wicket/panels/FederationTokensPanel.html
@@ -15,7 +15,7 @@
 		<table class="repositories">
 		<tr>
 			<th class="left">
-				<img style="vertical-align: top; border: 1px solid #888; background-color: white;" src="federated_16x16.png"/>
+				<img style="vertical-align: middle; border: 1px solid #888; background-color: white;" src="federated_16x16.png"/>
 				<wicket:message key="gb.tokens">[tokens]</wicket:message>
 			</th>
 			<th></th>
diff --git a/src/com/gitblit/wicket/panels/LogPanel.html b/src/com/gitblit/wicket/panels/LogPanel.html
index 712a662..700f66a 100644
--- a/src/com/gitblit/wicket/panels/LogPanel.html
+++ b/src/com/gitblit/wicket/panels/LogPanel.html
@@ -8,7 +8,7 @@
 <wicket:panel>
 
 	<!-- header -->	
-	<div class="header"><img style="vertical-align: top;" src="commit_changes_16x16.png"></img><span wicket:id="header">[log header]</span></div>
+	<div class="header"><img style="vertical-align: middle;" src="commit_changes_16x16.png"></img><span wicket:id="header">[log header]</span></div>
 	<table class="pretty">
 		<tbody>
        		<tr wicket:id="commit">
diff --git a/src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.html b/src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.html
index bd4b792..c51ceac 100644
--- a/src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.html
+++ b/src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.html
@@ -7,9 +7,11 @@
 <wicket:panel>
 	<!-- page path links -->
 	<div class="page_path">	
-		<span wicket:id="path">
-			<span wicket:id="pathLink"></span> <span wicket:id="pathSeparator"></span>
-		</span>
+		<ul class="breadcrumb">
+			<li wicket:id="path">
+				<span wicket:id="pathLink"></span> <span class="divider" wicket:id="pathSeparator"></span>
+			</li>
+		</ul>
 	</div>
 </wicket:panel>
 </html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/RepositoriesPanel.html b/src/com/gitblit/wicket/panels/RepositoriesPanel.html
index 8d64f54..41741e8 100644
--- a/src/com/gitblit/wicket/panels/RepositoriesPanel.html
+++ b/src/com/gitblit/wicket/panels/RepositoriesPanel.html
@@ -21,7 +21,7 @@
 	<wicket:fragment wicket:id="adminLinks">
 		<!-- page nav links -->	
 		<div class="admin_nav">
-			<img style="vertical-align: top;" src="add_16x16.png"/>
+			<img style="vertical-align: middle;" src="add_16x16.png"/>
 			<a wicket:id="newRepository">
 				<wicket:message key="gb.newRepository"></wicket:message>
 			</a>
@@ -39,7 +39,7 @@
 	<wicket:fragment wicket:id="flatRepositoryHeader">
 		<tr>
 			<th class="left" wicket:id="orderByRepository">
-				<img style="vertical-align: top; border: 1px solid #888;" src="gitweb-favicon.png"/>
+				<img style="vertical-align: middle; border: 1px solid #888;" src="gitweb-favicon.png"/>
 				<wicket:message key="gb.repository">Repository</wicket:message>
 			</th>
 			<th wicket:id="orderByDescription"><wicket:message key="gb.description">Description</wicket:message></th>
@@ -54,7 +54,7 @@
 	<wicket:fragment wicket:id="groupRepositoryHeader">
 		<tr>
 			<th class="left">
-				<img style="vertical-align: top; border: 1px solid #888;" src="gitweb-favicon.png"/>
+				<img style="vertical-align: middle; border: 1px solid #888;" src="gitweb-favicon.png"/>
 				<wicket:message key="gb.repository">Repository</wicket:message>
 			</th>
 			<th><wicket:message key="gb.description">Description</wicket:message></th>
@@ -71,7 +71,7 @@
 	</wicket:fragment>
 		
 	<wicket:fragment wicket:id="repositoryRow">
-        <td class="left"><div class="list" wicket:id="repositoryName">[repository name]</div></td>
+        <td class="left" style="padding-left:10px;" ><div class="list" wicket:id="repositoryName">[repository name]</div></td>
         <td><div class="list" wicket:id="repositoryDescription">[repository description]</div></td>
         <td class="author"><span wicket:id="repositoryOwner">[repository owner]</span></td>
         <td style="text-align: right;padding-right:10px;"><img class="inlineIcon" wicket:id="ticketsIcon" /><img class="inlineIcon" wicket:id="docsIcon" /><img class="inlineIcon" wicket:id="frozenIcon" /><img class="inlineIcon" wicket:id="federatedIcon" /><img class="inlineIcon" wicket:id="accessRestrictionIcon" /></td>
diff --git a/src/com/gitblit/wicket/panels/RepositoriesPanel.java b/src/com/gitblit/wicket/panels/RepositoriesPanel.java
index 709ad82..d18d5bb 100644
--- a/src/com/gitblit/wicket/panels/RepositoriesPanel.java
+++ b/src/com/gitblit/wicket/panels/RepositoriesPanel.java
@@ -124,6 +124,7 @@
 		DataView<RepositoryModel> dataView = new DataView<RepositoryModel>("row", dp) {
 			private static final long serialVersionUID = 1L;
 			int counter;
+			String currGroupName;
 
 			@Override
 			protected void onBeforeRender() {
@@ -134,23 +135,32 @@
 			public void populateItem(final Item<RepositoryModel> item) {
 				final RepositoryModel entry = item.getModelObject();
 				if (entry instanceof GroupRepositoryModel) {
+					currGroupName = entry.name;
 					Fragment row = new Fragment("rowContent", "groupRepositoryRow", this);
 					item.add(row);
 					row.add(new Label("groupName", entry.toString()));
 					WicketUtils.setCssClass(item, "group");
+					// reset counter so that first row is light background
+					counter = 0;
 					return;
 				}
 				Fragment row = new Fragment("rowContent", "repositoryRow", this);
 				item.add(row);
+				
+				// try to strip group name for less cluttered list
+				String repoName = entry.name;
+				if (!StringUtils.isEmpty(currGroupName) && (repoName.indexOf('/') > -1)) {
+					repoName = repoName.substring(currGroupName.length() + 1);
+				}
+				
 				if (entry.hasCommits && linksActive) {
 					PageParameters pp = WicketUtils.newRepositoryParameter(entry.name);
-					row.add(new LinkPanel("repositoryName", "list", entry.name, SummaryPage.class,
-							pp));
+					row.add(new LinkPanel("repositoryName", "list", repoName, SummaryPage.class, pp));
 					row.add(new LinkPanel("repositoryDescription", "list", entry.description,
 							SummaryPage.class, pp));
 				} else {
 					// new/empty repository OR proposed repository
-					row.add(new Label("repositoryName", entry.name));
+					row.add(new Label("repositoryName", repoName));
 					row.add(new Label("repositoryDescription", entry.description));
 				}
 
diff --git a/src/com/gitblit/wicket/panels/TagsPanel.html b/src/com/gitblit/wicket/panels/TagsPanel.html
index 86eedd6..c9c19a3 100644
--- a/src/com/gitblit/wicket/panels/TagsPanel.html
+++ b/src/com/gitblit/wicket/panels/TagsPanel.html
@@ -8,7 +8,7 @@
 <wicket:panel>
 
 	<!-- tags -->
-	<div class="header"><img style="vertical-align: top;" src="tag_16x16.png"></img><span wicket:id="header">[tags header]</span></div>	
+	<div class="header"><img style="vertical-align: middle;" src="tag_16x16.png"></img><span wicket:id="header">[tags header]</span></div>	
 	<table class="pretty">
 		<tbody>
     		<tr wicket:id="tag">
diff --git a/src/com/gitblit/wicket/panels/UsersPanel.html b/src/com/gitblit/wicket/panels/UsersPanel.html
index eed2a88..c81a3fd 100644
--- a/src/com/gitblit/wicket/panels/UsersPanel.html
+++ b/src/com/gitblit/wicket/panels/UsersPanel.html
@@ -12,7 +12,7 @@
 		<table class="repositories">
 		<tr>
 			<th class="left">
-				<img style="vertical-align: top; border: 1px solid #888; background-color: white;" src="user_16x16.png"/>
+				<img style="vertical-align: middle; border: 1px solid #888; background-color: white;" src="user_16x16.png"/>
 				<wicket:message key="gb.username">[username]</wicket:message>
 			</th>
 			<th class="right"></th>
@@ -28,7 +28,7 @@
 	<wicket:fragment wicket:id="adminLinks">
 		<!-- page nav links -->	
 		<div class="admin_nav">
-			<img style="vertical-align: top;" src="add_16x16.png"/>
+			<img style="vertical-align: middle;" src="add_16x16.png"/>
 			<a wicket:id="newUser">
 				<wicket:message key="gb.newUser"></wicket:message>
 			</a>

--
Gitblit v1.9.1