From 1f9daef870a8c7a984955166a542628d69012ed5 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 27 May 2011 23:37:24 -0400
Subject: [PATCH] Codepro analyze dependencies. Documentation.

---
 src/com/gitblit/ILoginService.java                      |    2 
 src/com/gitblit/wicket/pages/LoginPage.java             |   59 +--
 src/com/gitblit/Build.java                              |    9 
 src/com/gitblit/BuildSite.java                          |   22 +
 docs/02_properties.mkd                                  |    4 
 src/com/gitblit/wicket/panels/RepositoriesPanel.java    |    5 
 docs/00_setup.mkd                                       |   23 +
 src/com/gitblit/models/UserModel.java                   |    2 
 src/com/gitblit/wicket/pages/RepositoryPage.java        |   16 
 src/com/gitblit/wicket/pages/TicketsPage.java           |    5 
 docs/01_faq.mkd                                         |   43 ++
 src/com/gitblit/wicket/panels/TagsPanel.java            |    3 
 src/com/gitblit/GitBlit.java                            |   13 
 src/com/gitblit/GitBlitServer.java                      |   39 +-
 src/com/gitblit/wicket/pages/SearchPage.java            |    1 
 src/com/gitblit/wicket/pages/LoginPage.html             |    6 
 src/com/gitblit/wicket/pages/RepositoryPage.html        |    0 
 src/com/gitblit/wicket/pages/CommitDiffPage.java        |    8 
 src/com/gitblit/wicket/pages/BlobPage.java              |    1 
 src/com/gitblit/wicket/panels/UsersPanel.java           |    1 
 docs/page_header.html                                   |    6 
 src/com/gitblit/wicket/pages/EditRepositoryPage.java    |    7 
 src/com/gitblit/DownloadZipServlet.java                 |    2 
 src/com/gitblit/wicket/GitBlitWebSession.java           |    2 
 src/com/gitblit/wicket/panels/CommitLegendPanel.java    |    2 
 src/com/gitblit/models/TicketModel.java                 |    8 
 src/com/gitblit/wicket/pages/MarkdownPage.java          |    1 
 src/com/gitblit/wicket/pages/TicketPage.java            |    5 
 src/com/gitblit/utils/DiffUtils.java                    |  149 ++++++++++
 README.MKD                                              |   23 -
 src/com/gitblit/wicket/pages/BasePage.java              |    6 
 src/com/gitblit/wicket/panels/SearchPanel.java          |    1 
 src/com/gitblit/wicket/panels/LogPanel.java             |    1 
 src/com/gitblit/wicket/pages/HistoryPage.java           |    1 
 src/com/gitblit/wicket/pages/BasePage.html              |    6 
 src/com/gitblit/models/Metric.java                      |    2 
 src/com/gitblit/wicket/pages/TagsPage.java              |    1 
 src/com/gitblit/wicket/pages/RepositoriesPage.java      |    1 
 src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.java |   15 
 src/com/gitblit/wicket/panels/LinkPanel.html            |    0 
 src/com/gitblit/wicket/panels/RefsPanel.java            |    1 
 tests/com/gitblit/tests/GitBlitSuite.java               |    2 
 src/com/gitblit/wicket/pages/PatchPage.java             |    3 
 src/com/gitblit/wicket/pages/BlobDiffPage.java          |    6 
 src/com/gitblit/wicket/panels/LinkPanel.java            |    2 
 src/com/gitblit/GitBlitServlet.java                     |    2 
 src/com/gitblit/wicket/pages/CommitPage.java            |    5 
 src/com/gitblit/MakeCertificate.java                    |    6 
 src/com/gitblit/wicket/pages/BranchesPage.java          |    1 
 tests/com/gitblit/tests/JGitUtilsTest.java              |    9 
 docs/00_index.mkd                                       |   11 
 src/com/gitblit/Constants.java                          |    2 
 src/com/gitblit/utils/JGitUtils.java                    |  147 +---------
 src/com/gitblit/wicket/AuthorizationStrategy.java       |    6 
 src/com/gitblit/models/RefModel.java                    |    6 
 src/com/gitblit/wicket/pages/TreePage.java              |    5 
 src/com/gitblit/wicket/pages/EditUserPage.java          |    9 
 distrib/gitblit.properties                              |   52 ++
 src/com/gitblit/wicket/RequiresAdminRole.java           |    2 
 src/com/gitblit/wicket/pages/LogoutPage.java            |    2 
 src/com/gitblit/wicket/pages/LogPage.java               |    1 
 /dev/null                                               |    0 
 src/com/gitblit/wicket/panels/HistoryPanel.java         |    5 
 src/com/gitblit/models/PathModel.java                   |    7 
 src/com/gitblit/wicket/panels/BranchesPanel.java        |    5 
 src/com/gitblit/JettyLoginService.java                  |    2 
 src/com/gitblit/models/RepositoryModel.java             |    4 
 src/com/gitblit/wicket/panels/CommitHeaderPanel.java    |    1 
 build.xml                                               |   19 +
 src/com/gitblit/wicket/pages/DocsPage.java              |    5 
 src/com/gitblit/wicket/GitBlitWebApp.java               |    2 
 src/com/gitblit/wicket/pages/SummaryPage.java           |    3 
 src/com/gitblit/wicket/pages/TagPage.java               |    5 
 73 files changed, 467 insertions(+), 372 deletions(-)

diff --git a/README.MKD b/README.MKD
index 719f40d..2a94730 100644
--- a/README.MKD
+++ b/README.MKD
@@ -1,18 +1,9 @@
 Gitblit
 =================
 
-Gitblit is an open source, pure Java Git solution.
+Gitblit is an open source, pure Java Git solution for creating, viewing, and serving [Git](http://git-scm.com) repositories.<br/>
+More information about Gitblit can be found [here](http://gitblit.com).
 
-Gitblit can be found at: http://gitblit.com and is licensed under
-the Apache Software Foundation license, version 2.0.
-
-Contents
---------
- - License
- - Java/Application server requirements
- - Getting help
- - Building Gitblit
- 
 License
 -------
 
@@ -28,8 +19,7 @@
 Getting help
 ------------
 
- - Read the online documentation available on the Gitblit website
-   (http://gitblit.com)
+Read the online documentation available at the [Gitblit website](http://gitblit.com)
 
 Building Gitblit
 ----------------
@@ -40,7 +30,6 @@
 2. Using Ant, execute the `build.xml` script in the project root.<br/>
 *This will download all necessary build dependencies and will also generate the Keys class for accessing settings.*
 3. Select your gitblit project root and **Refresh** the project, this should correct all build problems.
-4. Review the settings in `gitblit.properties` in your project root.<br/>
-Make sure you set an appropriate value for *git.repositoriesFolder*. 
-5. Execute the *com.gitblit.Launcher* class to start Gitblit.   
-   
\ No newline at end of file
+4. Using JUnit, execute the `com.gitblit.tests.GitBlitSuite` test suite.<br/>
+*This will clone some repositories from the web and run through the unit tests.*
+5. Execute the *com.gitblit.Launcher* class to start Gitblit.   
\ No newline at end of file
diff --git a/build.xml b/build.xml
index 2c8a24a..4b27910 100644
--- a/build.xml
+++ b/build.xml
@@ -25,7 +25,7 @@
 					<replacestring from="&quot;;" to="" />
 					<trim />
 				</tokenfilter>
-			</filterchain>			
+			</filterchain>
 		</loadfile>
 
 		<!-- extract JGit version number from source code -->
@@ -154,6 +154,14 @@
 			</fileset>
 		</copy>
 
+		<!-- Copy google-code-prettify -->
+		<mkdir dir="${basedir}/src/com/gitblit/wicket/pages/prettify" />
+		<copy todir="${basedir}/site/prettify">
+			<fileset dir="${basedir}/src/com/gitblit/wicket/pages/prettify">
+				<exclude name="thumbs.db" />
+			</fileset>
+		</copy>
+
 		<!-- Copy screenshot thumbnails -->
 		<mkdir dir="${basedir}/site/thumbs" />
 		<copy todir="${basedir}/site/thumbs">
@@ -187,6 +195,9 @@
 
 			<arg value="--alias" />
 			<arg value="index=overview" />
+			
+			<arg value="--alias" />
+			<arg value="properties=gitblit.properties" />
 
 			<arg value="--substitute" />
 			<arg value="%VERSION%=${gb.version}" />
@@ -199,9 +210,13 @@
 
 			<arg value="--substitute" />
 			<arg value="%JGIT%=${jgit.version}" />
+
+			<arg value="--load" />
+			<arg value="%PROPERTIES%=${basedir}/distrib/gitblit.properties" />
+
 		</java>
 
-		<!-- Cleanup --> 
+		<!-- Cleanup -->
 		<delete dir="${project.build.dir}" />
 	</target>
 </project>
diff --git a/distrib/gitblit.properties b/distrib/gitblit.properties
index 4e2965f..c17674a 100644
--- a/distrib/gitblit.properties
+++ b/distrib/gitblit.properties
@@ -3,18 +3,22 @@
 #
 
 # Allow push/pull over http/https with JGit servlet
+# Changing this value requires a server restart.
 git.enableGitServlet = true
 
 # Base folder for repositories
+# Changing this value requires a server restart.
 # Use forward slashes even on Windows!!
+# e.g. c:/gitrepos
 git.repositoriesFolder = git
 
 # Export all repositories
+# Changing this value requires a server restart.
 # if false, each exported repository must have a .git/git-daemon-export-ok file
 git.exportAll = true
 
 # Search repositories folder for nested repositories
-# e.g. /libraries/mylibrary.git
+# e.g. c:/gitrepos/libraries/mylibrary.git
 git.nestedRepositories = true
 
 #
@@ -22,12 +26,15 @@
 #
 
 # Require authentication to see everything but the admin pages
+# Changing this value requires a server restart.
 web.authenticateViewPages = false
 
 # Require admin authentication for the admin functions and pages
+# Changing this value requires a server restart.
 web.authenticateAdminPages = true
 
 # Simple user realm file to authenticate users
+# Changing this value requires a server restart.
 realm.realmFile = users.properties
 
 # How to store passwords.
@@ -44,10 +51,11 @@
 # If blank Gitblit is displayed.
 web.siteName =
 
-# If web.authenticate=true, users with "admin" role can create repositories,
-# create users, and edit repository metadata (owner, description, etc)
+# If web.authenticateAdminPages=true, users with "admin" role can create
+# repositories, create users, and edit repository metadata.
 #
-# If web.authenticate=false, any user can execute the aforementioned functions.  
+# If web.authenticateAdminPages=false, any user can execute the aforementioned
+# functions.  
 web.allowAdministration = true
 
 # Allow dyanamic zip downloads.   
@@ -60,20 +68,23 @@
 
 # Use the client timezone when formatting dates.
 # This uses AJAX to determine the browser's timezone.
+# Changing this value requires a server restart.
 web.useClientTimezone = false
 
 # Date and Time formats
+# http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html
 web.datestampShortFormat = yyyy-MM-dd
 web.datetimestampLongFormat = EEEE, MMMM d, yyyy h:mm a z
 
 # Show other URLs on the summary page for accessing your git repositories
 # Use spaces to separate urls. {0} is the token for the repository name.
+# e.g.
 # web.otherUrls = ssh://localhost/git/{0} git://localhost/git/{0}
 web.otherUrls = 
 
 # Choose how to present the repositories list.
-# grouped = group nested/subfolder repositories together (no sorting)
-# flat = flat list of repositories (sorting allowed)
+#   grouped = group nested/subfolder repositories together (no sorting)
+#   flat = flat list of repositories (sorting allowed)
 web.repositoryListType = grouped
 
 # If using a grouped repository list and there are repositories at the
@@ -92,7 +103,7 @@
 web.showSearchTypeSelection = false
 
 # Generates a line graph of repository activity over time on the Summary page.
-# This is a real-time graph so generation may be expensive. 
+# This uses the Google Charts API. 
 web.generateActivityGraph = true
 
 # The number of commits to display on the summary page
@@ -108,22 +119,27 @@
 web.itemsPerPage = 50
 
 # Registered extensions for google-code-prettify
+# (case-insensitive)
 web.prettyPrintExtensions = c cpp cs css htm html java js php pl prefs properties py rb sh sql xml vb
 
 # Registered extensions for markdown transformation
-web.markdownExtensions = md mkd markdown
+# (CASE-SENSITIVE)
+web.markdownExtensions = md mkd markdown MD MKD
 
 # Image extensions
+# (case-insensitive)
 web.imageExtensions = bmp jpg gif png 
 
 # Registered extensions for binary blobs
+# (case-insensitive)
 web.binaryExtensions = jar pdf tar.gz zip
 
 # Aggressive heap management will run the garbage collector on every generated
-# page.  This slows down page generation but improves heap consumption. 
+# page.  This slows down page generation a little but improves heap consumption. 
 web.aggressiveHeapManagement = true
 
 # Run the webapp in debug mode
+# Changing this value requires a server restart.
 web.debugMode = false
 
 # Enable/disable global regex substitutions (i.e. shared across repositories)
@@ -141,9 +157,21 @@
 #
 # Server Settings
 #
+# Changing any of these values requires a server restart.
+
+# The temporary folder to decompress the gitblit webapp. 
 server.tempFolder = temp
+
+# The common log4j logging pattern
+# http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html
 server.log4jPattern = %-5p %d{MM-dd HH:mm:ss.SSS}  %-20.20c{1}  %m%n
+
+# Alternatively, you may specify a logging pattern for your OS.
+# If the os pattern is blank, the common pattern is used.
+
+# This windows pattern fits (mostly) within the fixed bounds of a command prompt.
 server.log4jPattern.windows = %-5p %m%n
+
 server.log4jPattern.linux =
 
 
@@ -162,13 +190,13 @@
 
 # Specify the interface for Jetty to bind the standard connector.
 # You may specify an ip or an empty value to bind to all interfaces.
-# Specifying localhost will result in Git:Blit ONLY listening to requests to
+# Specifying localhost will result in Gitblit ONLY listening to requests to
 # localhost.
 server.httpBindInterface = localhost
 
 # Specify the interface for Jetty to bind the secure connector.
 # You may specify an ip or an empty value to bind to all interfaces.
-# Specifying localhost will result in Git:Blit ONLY listening to requests to
+# Specifying localhost will result in Gitblit ONLY listening to requests to
 # localhost.
 server.httpsBindInterface = localhost
 
@@ -176,7 +204,7 @@
 # Keystore password and certificate password must match.
 # This is provided for convenience, its probably more secure to set this value
 # using the --storePassword command line parameter.
-server.storePassword = dosomegit
+server.storePassword = gitblit
 
 # Port for shutdown monitor to listen on.
 server.shutdownPort = 8081
diff --git a/docs/00_index.mkd b/docs/00_index.mkd
index e21a158..9ad1c4e 100644
--- a/docs/00_index.mkd
+++ b/docs/00_index.mkd
@@ -107,10 +107,10 @@
 - [JSch - Java Secure Channel](http://www.jcraft.com/jsch) (BSD)
 - [JUnit](http://junit.org) (Common Public License)
 
-## Building
+## Building from Source
 [Eclipse](http://eclipse.org) is recommended for development as the project settings are preconfigured.
 
-Additionally, [Google CodePro AnalytiX](http://code.google.com/javadevtools), [eclipse-cs](http://eclipse-cs.sourceforge.net), and [FindBugs](http://findbugs.sourceforge.net) are recommended development tools.
+Additionally, [Google CodePro AnalytiX](http://code.google.com/javadevtools), [eclipse-cs](http://eclipse-cs.sourceforge.net), [FindBugs](http://findbugs.sourceforge.net), and [EclEmma](http://www.eclemma.org) are recommended development tools.
 
 1. Clone the git repository from [Github][gitbltsrc].
 2. Import the gitblit project into your Eclipse workspace.<br/>
@@ -118,8 +118,11 @@
 3. Using Ant, execute the `build.xml` script in the project root.<br/>
 *This will download all necessary build dependencies and will also generate the Keys class for accessing settings.*
 4. Select your gitblit project root and **Refresh** the project, this should correct all build problems.
-5. Review the settings in `gitblit.properties` in your project root.<br/>
-Make sure you set an appropriate value for *git.repositoriesFolder*. 
+5. Using JUnit, execute the `com.gitblit.tests.GitBlitSuite` test suite.<br/>
+*This will clone some repositories from the web and run through the unit tests.*
+5. Review the settings in `gitblit.properties` in your project root.
+    - By default, the *git.repositoriesFolder* points to the repositories cloned by the test suite.<br/>
+    - If running on Linux you may have to change the served port(s) to > 1024 unless you are developing as the root user. 
 6. Execute the *com.gitblit.Launcher* class to start Gitblit.
 
 [jgit]: http://eclipse.org/jgit "Eclipse JGit Site"
diff --git a/docs/00_setup.mkd b/docs/00_setup.mkd
index 447f151..99fd05f 100644
--- a/docs/00_setup.mkd
+++ b/docs/00_setup.mkd
@@ -1,4 +1,4 @@
-## Setup and Configuration
+## Server Setup and Configuration
 
 1. Download and unzip [Gitblit %VERSION%](http://gitblit.com/%DISTRIBUTION%).<br/>
 *Its best to eliminate spaces in the path name as that can cause troubleshooting headaches.* 
@@ -74,4 +74,23 @@
     
 **Example**
 
-    java -jar gitblit.jar --realmFile c:\myrealm.txt --storePassword something
\ No newline at end of file
+    java -jar gitblit.jar --realmFile c:\myrealm.txt --storePassword something
+    
+## Client Setup and Configuration
+### Https with Self-Signed Certificates
+You must tell Git not to verify the self-signed certificate in order to perform any remote Git operations.
+
+- Eclipse/EGit
+    1. Window->Preferences->Team->Git->Configuration
+    2. Click the *New Entry* button
+    3. <pre>Key = *http.sslVerify*       
+       Value = *false*</pre>
+- Command-line Git ([Git-Config Manual Page](http://www.kernel.org/pub/software/scm/git/docs/git-config.html))
+    <pre>git-config --global --bool --add http.sslVerify false</pre>
+
+### Cloning an Access Restricted Repository 
+- Eclipse/Egit<br/>Nothing special to configure, EGit figures out everything.
+    <pre>https://yourserver/git/your/repository</pre>
+- Command-line Git<br/>*My testing indicates that your username must be embedded in the url.  YMMV.*
+    <pre>https://username@yourserver/git/your/repository</pre>
+           
\ No newline at end of file
diff --git a/docs/01_eclipse.mkd b/docs/01_eclipse.mkd
deleted file mode 100644
index e768b73..0000000
--- a/docs/01_eclipse.mkd
+++ /dev/null
@@ -1,18 +0,0 @@
-## Eclipse Tips
-
-### Do Not Verify Self-Signed Certificates
-If you are using a self-signed certificate, like the one that is automatically generated by Gitblit, you have to tell Eclipse/EGit to ignore certificate verification errors.
-
-![sslverify](sslverify.png "http.sslVerify setting")
-
-![sslverify2](sslverify2.png "Adding http.sslVerify setting")    
-
-### Pushing a New Project to a New Gitblit Repository
-1. Project Root->Team->Share->Git
-Create a Git repository inside the project
-
-### Pushing a Git-Controlled Project to another Gitblit Repository
-1. Project Root->Team->Remote->Push
-2. Enter the URL information of the repository
-3. In the Refspec dialog click the buttons named  "All all branches spec" and "All all tags spec"
-
diff --git a/docs/01_faq.mkd b/docs/01_faq.mkd
index 86aa9ad..5068e79 100644
--- a/docs/01_faq.mkd
+++ b/docs/01_faq.mkd
@@ -1,10 +1,31 @@
-## Frequently Asked Questions
+## Troubleshooting
+
+### Eclipse/Egit/Git complains that it "can't open upload pack"?
+There are a few ways this can occur:
+
+1. You are using https with a self-signed certificate and you **did not** configure *http.sslVerify=false*
+    1. Window->Preferences->Team->Git->Configuration
+    2. Click the *New Entry* button
+    3. <pre>Key = *http.sslVerify*       
+       Value = *false*</pre>
+2. The repository is clone-restricted and you don't have access.
+3. The repository is clone-restricted and your password changed.
+4. A regression in Gitblit.  :(
+
+### Why can't I access Gitblit from another machine?
+Please check *server.httpBindInterface* and *server.httpsBindInterface* in `gitblit.properties`.
+
+### How do I run Gitblit on port 80 or 443 in Linux?
+Linux requires root permissions to serve on ports < 1024.<br/>
+Run the server as *root* (security concern) or change the ports you are serving to 8080 (http) and/or 8443 (https). 
+
+## General Interest Questions
 
 ### Gitblit?  What kind of name is that?
-Its a phonetic play on [bitblt][bitblt] which is an image processing operation meaning *bit-block transfer*.
+It's a phonetic play on [bitblt][bitblt] which is an image processing operation meaning *bit-block transfer*.
 
 ### Why use Gitblit?
-Its small.  Its portable.  Its easy to manage.
+It's a small tool that allows you to easily manage shared repositories and doesn't require alot of setup or git kung-foo.
 
 ### Do I need real Git?
 No.  Gitblit is based on [JGit][jgit] which is a pure Java implementation of the [Git version control system][git].<br/>
@@ -13,11 +34,16 @@
 ### Do I need a JDK or can I use a JRE?
 Gitblit will run just fine with a JRE.  Gitblit can optionally use `keytool` from the JDK to generate self-signed certificates, but normally Gitblit uses [BouncyCastle][bouncycastle] for that need.
 
+### I want to deploy Gitblit into my own servlet container.  Where is the WAR?
+At this time there is no WAR build available.
+
 ### Does Gitblit use a database to store its data?
 No.  Gitblit stores its repository configuration information within the `.git/config` file and its user information in `users.properties` or whatever filename is configured in `gitblit.properties`.
 
-### I want to deploy Gitblit into my own servlet container.  Where is the WAR?
-At this time there is no WAR build available.
+### Can I manually edit users.properties, gitblit.properties, or .git/config?
+Yes.  You can manually manipulate all of them and (most) changes will be immediately available to Gitblit.<br/>Exceptions to this are noted in `gitblit.properties`.
+
+*NOTE:* Care must be taken to preserve the relationship between user roles and repository names.<br/>Please see the [setup](/setup.html) page for details.
 
 ### Can I restrict access to paths within a repository?
 No.  Access restrictions apply to the repository as a whole.
@@ -26,7 +52,7 @@
 
 ### Why doesn't Gitblit support SSH?
 Gitblit could integrate [Apache Mina][mina] to provide SSH access.  However, doing so violates Gitblit's first design principle: [KISS](http://en.wikipedia.org/wiki/KISS_principle).<br/>
-SSH support requires creating, exchanging, and managing SSH keys.  While this is possible, JGit's SmartHTTP implementation is a simpler and cleaner transport mechanism.
+SSH support requires creating, exchanging, and managing SSH keys.  While this is possible, JGit's SmartHTTP implementation is a simpler and universal transport mechanism.
 
 You might consider running [Gerrit](http://gerrit.googlecode.org) which does integrate [Apache Mina][mina] and supports SSH or you might consider serving [Git][git] on Linux which would offer real SSH support and also allow use of [many other compelling Git solutions](https://git.wiki.kernel.org/index.php/InterfacesFrontendsAndTools).
 
@@ -40,9 +66,8 @@
     
 Alternatively, you could enable the search type dropdown list in your `gitblit.properties` file.
 
-### How do I run Gitblit on port 80 or 443 in Linux?
-Linux requires root permissions to serve on ports < 1024.<br/>
-Run the server as *root* (security concern) or change the ports you are serving to 8080 (http) and/or 8443 (https). 
+### I see a disabled "blame" link. How do I enable it? 
+Currently blame is not implemented.  Those links are placeholders to remind me where Gitweb offers blame.
 
 [bitblt]: http://en.wikipedia.org/wiki/Bit_blit "Wikipedia Bitblt"
 [jgit]: http://eclipse.org/jgit "Eclipse JGit Site"
diff --git a/docs/02_properties.mkd b/docs/02_properties.mkd
new file mode 100644
index 0000000..3a1dec1
--- /dev/null
+++ b/docs/02_properties.mkd
@@ -0,0 +1,4 @@
+## gitblit.properties
+<pre class='prettyprint'>
+%PROPERTIES%
+</pre>
\ No newline at end of file
diff --git a/docs/page_header.html b/docs/page_header.html
index fd40c5a..4a2128e 100644
--- a/docs/page_header.html
+++ b/docs/page_header.html
@@ -8,6 +8,7 @@
 		<meta name="ROBOTS" content="INDEX, NOFOLLOW">
 		<meta http-equiv="imagetoolbar" content="no" />
 		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+		<meta name="keywords" content="java git server" />
 		
 		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
 		<script>
@@ -23,8 +24,11 @@
 				list-style: none;
 			'}'
 		</style>
+		
+		<script type="text/javascript" src="prettify/prettify.js"></script>
+		<link href="prettify/prettify.css" type="text/css" rel="stylesheet" />		
 	</head>
-	<body>
+	<body 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"/>
diff --git a/docs/sslverify.png b/docs/sslverify.png
deleted file mode 100644
index e987b9f..0000000
--- a/docs/sslverify.png
+++ /dev/null
Binary files differ
diff --git a/docs/sslverify2.png b/docs/sslverify2.png
deleted file mode 100644
index 94db977..0000000
--- a/docs/sslverify2.png
+++ /dev/null
Binary files differ
diff --git a/src/com/gitblit/Build.java b/src/com/gitblit/Build.java
index da0c3e0..a6d5bb0 100644
--- a/src/com/gitblit/Build.java
+++ b/src/com/gitblit/Build.java
@@ -80,7 +80,7 @@
 		downloadFromApache(MavenObject.MARKDOWNPAPERS, BuildType.COMPILETIME);
 		downloadFromApache(MavenObject.BOUNCYCASTLE, BuildType.COMPILETIME);
 		downloadFromApache(MavenObject.BOUNCYCASTLE_MAIL, BuildType.COMPILETIME);
-		
+
 		downloadFromApache(MavenObject.JSCH, BuildType.RUNTIME);
 		downloadFromApache(MavenObject.JSCH, BuildType.COMPILETIME);
 
@@ -389,10 +389,9 @@
 				"384058ca906dffb8b8708c2db8849c9754359b28",
 				"7b026658ed8de2eccc2d11d647d43d7c84a56911",
 				"6c19e37b3caafd70c1b7b024ae1858c725181688");
-		
-		public static final MavenObject JSCH = new MavenObject("JSch", "com/jcraft",
-				"jsch", "0.1.44-1", 214000, 211000, 413000,
-				"2e9ae08de5a71bd0e0d3ba2558598181bfa71d4e",
+
+		public static final MavenObject JSCH = new MavenObject("JSch", "com/jcraft", "jsch",
+				"0.1.44-1", 214000, 211000, 413000, "2e9ae08de5a71bd0e0d3ba2558598181bfa71d4e",
 				"e528f593b19b04d500992606f58b87fcfded8883",
 				"d0ffadd0a4ab909d94a577b5aad43c13b617ddcb");
 
diff --git a/src/com/gitblit/BuildSite.java b/src/com/gitblit/BuildSite.java
index f3a1a9f..890cec1 100644
--- a/src/com/gitblit/BuildSite.java
+++ b/src/com/gitblit/BuildSite.java
@@ -37,6 +37,7 @@
 import com.beust.jcommander.ParameterException;
 import com.beust.jcommander.Parameters;
 import com.gitblit.utils.MarkdownUtils;
+import com.gitblit.utils.StringUtils;
 
 public class BuildSite {
 
@@ -83,8 +84,8 @@
 		sb.setLength(sb.length() - 3);
 		sb.trimToSize();
 
-		String htmlHeader = readContent(new File(params.pageHeader));
-		String htmlFooter = readContent(new File(params.pageFooter));
+		String htmlHeader = readContent(new File(params.pageHeader), "\n");
+		String htmlFooter = readContent(new File(params.pageFooter), "\n");
 		final String links = sb.toString();
 		final String header = MessageFormat.format(htmlHeader, Constants.FULL_NAME, links);
 		final String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
@@ -101,6 +102,13 @@
 					String[] kv = token.split("=");
 					content = content.replace(kv[0], kv[1]);
 				}
+				for (String alias : params.loads) {
+					String[] kv = alias.split("=");
+					String loadedContent = readContent(new File(kv[1]), "\n");
+					loadedContent = StringUtils.escapeForHtml(loadedContent, false);
+					loadedContent = StringUtils.breakLinesForHtml(loadedContent);
+					content = content.replace(kv[0], loadedContent);
+				}
 				OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(new File(
 						destinationFolder, fileName)), Charset.forName("UTF-8"));
 				writer.write(header);
@@ -115,7 +123,7 @@
 		}
 	}
 
-	private static String readContent(File file) {
+	private static String readContent(File file, String lineEnding) {
 		StringBuilder sb = new StringBuilder();
 		try {
 			InputStreamReader is = new InputStreamReader(new FileInputStream(file),
@@ -124,6 +132,9 @@
 			String line = null;
 			while ((line = reader.readLine()) != null) {
 				sb.append(line);
+				if (lineEnding != null) {
+					sb.append(lineEnding);
+				}
 			}
 			reader.close();
 		} catch (Throwable t) {
@@ -171,8 +182,11 @@
 		@Parameter(names = { "--alias" }, description = "Filename=Linkname aliases", required = false)
 		public List<String> aliases = new ArrayList<String>();
 
-		@Parameter(names = { "--substitute" }, description = "@TOKEN@=value", required = false)
+		@Parameter(names = { "--substitute" }, description = "%TOKEN%=value", required = false)
 		public List<String> substitutions = new ArrayList<String>();
 
+		@Parameter(names = { "--load" }, description = "%TOKEN%=filename", required = false)
+		public List<String> loads = new ArrayList<String>();
+
 	}
 }
diff --git a/src/com/gitblit/Constants.java b/src/com/gitblit/Constants.java
index b674182..3589f49 100644
--- a/src/com/gitblit/Constants.java
+++ b/src/com/gitblit/Constants.java
@@ -37,6 +37,8 @@
 
 	public static final String ZIP_SERVLET_PATH = "/zip/";
 
+	public static final String BORDER = "***********************************************************";
+	
 	public static enum AccessRestrictionType {
 		NONE, PUSH, CLONE, VIEW;
 
diff --git a/src/com/gitblit/DownloadZipServlet.java b/src/com/gitblit/DownloadZipServlet.java
index 3bbf225..86ca4e7 100644
--- a/src/com/gitblit/DownloadZipServlet.java
+++ b/src/com/gitblit/DownloadZipServlet.java
@@ -26,9 +26,9 @@
 import org.slf4j.LoggerFactory;
 
 import com.gitblit.Constants.AccessRestrictionType;
+import com.gitblit.models.RepositoryModel;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.StringUtils;
-import com.gitblit.wicket.models.RepositoryModel;
 
 public class DownloadZipServlet extends HttpServlet {
 
diff --git a/src/com/gitblit/GitBlit.java b/src/com/gitblit/GitBlit.java
index 9dd3a9e..52dd9db 100644
--- a/src/com/gitblit/GitBlit.java
+++ b/src/com/gitblit/GitBlit.java
@@ -35,10 +35,10 @@
 import org.slf4j.LoggerFactory;
 
 import com.gitblit.Constants.AccessRestrictionType;
+import com.gitblit.models.RepositoryModel;
+import com.gitblit.models.UserModel;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.StringUtils;
-import com.gitblit.wicket.models.RepositoryModel;
-import com.gitblit.wicket.models.UserModel;
 
 public class GitBlit implements ServletContextListener {
 
@@ -151,8 +151,8 @@
 			r = repositoryResolver.open(null, repositoryName);
 		} catch (RepositoryNotFoundException e) {
 			r = null;
-			logger.error("GitBlit.getRepository(String) failed to find repository "
-					+ repositoryName);
+			logger.error("GitBlit.getRepository(String) failed to find "
+					+ new File(repositoriesFolder, repositoryName).getAbsolutePath());
 		} catch (ServiceNotEnabledException e) {
 			r = null;
 			e.printStackTrace();
@@ -186,6 +186,9 @@
 
 	public RepositoryModel getRepositoryModel(String repositoryName) {
 		Repository r = getRepository(repositoryName);
+		if (r == null) {
+			return null;
+		}
 		RepositoryModel model = new RepositoryModel();
 		model.name = repositoryName;
 		model.hasCommits = JGitUtils.hasCommits(r);
@@ -315,7 +318,7 @@
 	}
 
 	public void configureContext(IStoredSettings settings) {
-		logger.info("Using configuration from " + settings.toString());
+		logger.info("Reading configuration from " + settings.toString());
 		this.storedSettings = settings;
 		repositoriesFolder = new File(settings.getString(Keys.git.repositoriesFolder, "repos"));
 		exportAll = settings.getBoolean(Keys.git.exportAll, true);
diff --git a/src/com/gitblit/GitBlitServer.java b/src/com/gitblit/GitBlitServer.java
index c873157..416c47a 100644
--- a/src/com/gitblit/GitBlitServer.java
+++ b/src/com/gitblit/GitBlitServer.java
@@ -65,11 +65,7 @@
 
 public class GitBlitServer {
 
-	private static final String BORDER = "***********************************************************";
-
 	private static Logger logger;
-
-	private static final FileSettings FILESETTINGS = new FileSettings();
 
 	public static void main(String[] args) {
 		Params params = new Params();
@@ -91,9 +87,9 @@
 	}
 
 	private static void usage(JCommander jc, ParameterException t) {
-		System.out.println(BORDER);
+		System.out.println(Constants.BORDER);
 		System.out.println(Constants.getGitBlitVersion());
-		System.out.println(BORDER);
+		System.out.println(Constants.BORDER);
 		System.out.println();
 		if (t != null) {
 			System.out.println(t.getMessage());
@@ -129,18 +125,19 @@
 	 * Start Server.
 	 */
 	private static void start(Params params) {
-		String pattern = FILESETTINGS.getString(Keys.server.log4jPattern,
+		FileSettings settings = params.FILESETTINGS;
+		String pattern = settings.getString(Keys.server.log4jPattern,
 				"%-5p %d{MM-dd HH:mm:ss.SSS}  %-20.20c{1}  %m%n");
 
 		// allow os override of logging pattern
 		String os = System.getProperty("os.name").toLowerCase();
 		if (os.indexOf("windows") > -1) {
-			String winPattern = FILESETTINGS.getString(Keys.server.log4jPattern_windows, pattern);
+			String winPattern = settings.getString(Keys.server.log4jPattern_windows, pattern);
 			if (!StringUtils.isEmpty(winPattern)) {
 				pattern = winPattern;
 			}
 		} else if (os.indexOf("linux") > -1) {
-			String linuxPattern = FILESETTINGS.getString(Keys.server.log4jPattern_linux, pattern);
+			String linuxPattern = settings.getString(Keys.server.log4jPattern_linux, pattern);
 			if (!StringUtils.isEmpty(linuxPattern)) {
 				pattern = linuxPattern;
 			}
@@ -151,9 +148,9 @@
 		rootLogger.addAppender(new ConsoleAppender(layout));
 
 		logger = LoggerFactory.getLogger(GitBlitServer.class);
-		logger.info(BORDER);
+		logger.info(Constants.BORDER);
 		logger.info(Constants.getGitBlitVersion());
-		logger.info(BORDER);
+		logger.info(Constants.BORDER);
 
 		String osname = System.getProperty("os.name");
 		String osversion = System.getProperty("os.version");
@@ -163,7 +160,7 @@
 		List<Connector> connectors = new ArrayList<Connector>();
 		if (params.port > 0) {
 			Connector httpConnector = createConnector(params.useNIO, params.port);
-			String bindInterface = FILESETTINGS.getString(Keys.server.httpBindInterface, null);
+			String bindInterface = settings.getString(Keys.server.httpBindInterface, null);
 			if (!StringUtils.isEmpty(bindInterface)) {
 				logger.warn(MessageFormat.format("Binding connector on port {0} to {1}",
 						params.port, bindInterface));
@@ -182,7 +179,7 @@
 			if (keystore.exists()) {
 				Connector secureConnector = createSSLConnector(keystore, params.storePassword,
 						params.useNIO, params.securePort);
-				String bindInterface = FILESETTINGS.getString(Keys.server.httpsBindInterface, null);
+				String bindInterface = settings.getString(Keys.server.httpsBindInterface, null);
 				if (!StringUtils.isEmpty(bindInterface)) {
 					logger.warn(MessageFormat.format("Binding ssl connector on port {0} to {1}",
 							params.securePort, bindInterface));
@@ -246,11 +243,11 @@
 		// Git Servlet
 		ServletHolder gitServlet = null;
 		String gitServletPathSpec = Constants.GIT_SERVLET_PATH + "*";
-		if (FILESETTINGS.getBoolean(Keys.git.enableGitServlet, true)) {
+		if (settings.getBoolean(Keys.git.enableGitServlet, true)) {
 			gitServlet = rootContext.addServlet(GitBlitServlet.class, gitServletPathSpec);
 			gitServlet.setInitParameter("base-path", params.repositoriesFolder);
 			gitServlet.setInitParameter("export-all",
-					FILESETTINGS.getBoolean(Keys.git.exportAll, true) ? "1" : "0");
+					settings.getBoolean(Keys.git.exportAll, true) ? "1" : "0");
 		}
 
 		// Login Service
@@ -300,12 +297,14 @@
 			handler = rootContext;
 		}
 
+		logger.info("Git repositories folder " + new File(params.repositoriesFolder).getAbsolutePath());
+		
 		// Set the server's contexts
 		server.setHandler(handler);
 
 		// Setup the GitBlit context
 		GitBlit gitblit = GitBlit.self();
-		gitblit.configureContext(FILESETTINGS);
+		gitblit.configureContext(settings);
 		rootContext.addEventListener(gitblit);
 
 		// Start the Server
@@ -385,6 +384,8 @@
 		private final ServerSocket socket;
 
 		private final Server server;
+		
+		private final Logger logger = LoggerFactory.getLogger(ShutdownMonitorThread.class);
 
 		public ShutdownMonitorThread(Server server, Params params) {
 			this.server = server;
@@ -408,9 +409,9 @@
 				BufferedReader reader = new BufferedReader(new InputStreamReader(
 						accept.getInputStream()));
 				reader.readLine();
-				logger.info(BORDER);
+				logger.info(Constants.BORDER);
 				logger.info("Stopping " + Constants.NAME);
-				logger.info(BORDER);
+				logger.info(Constants.BORDER);
 				server.stop();
 				server.setStopAtShutdown(false);
 				accept.close();
@@ -423,6 +424,8 @@
 
 	@Parameters(separators = " ")
 	private static class Params {
+		
+		private static final FileSettings FILESETTINGS = new FileSettings();
 
 		/*
 		 * Server parameters
diff --git a/src/com/gitblit/GitBlitServlet.java b/src/com/gitblit/GitBlitServlet.java
index 91bd7b2..4686884 100644
--- a/src/com/gitblit/GitBlitServlet.java
+++ b/src/com/gitblit/GitBlitServlet.java
@@ -27,7 +27,7 @@
 import org.slf4j.LoggerFactory;
 
 import com.gitblit.Constants.AccessRestrictionType;
-import com.gitblit.wicket.models.RepositoryModel;
+import com.gitblit.models.RepositoryModel;
 
 public class GitBlitServlet extends GitServlet {
 
diff --git a/src/com/gitblit/ILoginService.java b/src/com/gitblit/ILoginService.java
index 155595b..d7bfd01 100644
--- a/src/com/gitblit/ILoginService.java
+++ b/src/com/gitblit/ILoginService.java
@@ -17,7 +17,7 @@
 
 import java.util.List;
 
-import com.gitblit.wicket.models.UserModel;
+import com.gitblit.models.UserModel;
 
 public interface ILoginService {
 
diff --git a/src/com/gitblit/JettyLoginService.java b/src/com/gitblit/JettyLoginService.java
index ac7dd79..63a9861 100644
--- a/src/com/gitblit/JettyLoginService.java
+++ b/src/com/gitblit/JettyLoginService.java
@@ -38,7 +38,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.gitblit.wicket.models.UserModel;
+import com.gitblit.models.UserModel;
 
 public class JettyLoginService extends MappedLoginService implements ILoginService {
 
diff --git a/src/com/gitblit/MakeCertificate.java b/src/com/gitblit/MakeCertificate.java
index eafb98a..67b2fd9 100644
--- a/src/com/gitblit/MakeCertificate.java
+++ b/src/com/gitblit/MakeCertificate.java
@@ -44,9 +44,7 @@
 import com.gitblit.utils.TimeUtils;
 
 public class MakeCertificate {
-
-	private static final FileSettings FILESETTINGS = new FileSettings();
-
+	
 	private static final String BC = org.bouncycastle.jce.provider.BouncyCastleProvider.PROVIDER_NAME;
 
 	public static void main(String... args) {
@@ -158,6 +156,8 @@
 	@Parameters(separators = " ")
 	private static class Params {
 
+		private static final FileSettings FILESETTINGS = new FileSettings();
+		
 		@Parameter(names = { "--alias" }, description = "Server alias", required = true)
 		public String alias;
 
diff --git a/src/com/gitblit/wicket/models/Metric.java b/src/com/gitblit/models/Metric.java
similarity index 95%
rename from src/com/gitblit/wicket/models/Metric.java
rename to src/com/gitblit/models/Metric.java
index 3014cd0..9ff270a 100644
--- a/src/com/gitblit/wicket/models/Metric.java
+++ b/src/com/gitblit/models/Metric.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.gitblit.wicket.models;
+package com.gitblit.models;
 
 import java.io.Serializable;
 
diff --git a/src/com/gitblit/wicket/models/PathModel.java b/src/com/gitblit/models/PathModel.java
similarity index 95%
rename from src/com/gitblit/wicket/models/PathModel.java
rename to src/com/gitblit/models/PathModel.java
index 2edc96c..17a7971 100644
--- a/src/com/gitblit/wicket/models/PathModel.java
+++ b/src/com/gitblit/models/PathModel.java
@@ -13,13 +13,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.gitblit.wicket.models;
+package com.gitblit.models;
 
 import java.io.Serializable;
 
 import org.eclipse.jgit.diff.DiffEntry.ChangeType;
-
-import com.gitblit.utils.JGitUtils;
+import org.eclipse.jgit.lib.FileMode;
 
 public class PathModel implements Serializable, Comparable<PathModel> {
 
@@ -41,7 +40,7 @@
 	}
 
 	public boolean isTree() {
-		return JGitUtils.isTreeFromMode(mode);
+		return FileMode.TREE.equals(mode);
 	}
 
 	public static PathModel getParentPath(String basePath, String commitId) {
diff --git a/src/com/gitblit/wicket/models/RefModel.java b/src/com/gitblit/models/RefModel.java
similarity index 94%
rename from src/com/gitblit/wicket/models/RefModel.java
rename to src/com/gitblit/models/RefModel.java
index e0831f5..b33c8ba 100644
--- a/src/com/gitblit/wicket/models/RefModel.java
+++ b/src/com/gitblit/models/RefModel.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.gitblit.wicket.models;
+package com.gitblit.models;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -21,8 +21,6 @@
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.revwalk.RevCommit;
-
-import com.gitblit.utils.JGitUtils;
 
 public class RefModel implements Serializable, Comparable<RefModel> {
 
@@ -38,7 +36,7 @@
 	}
 
 	public Date getDate() {
-		return JGitUtils.getCommitDate(commit);
+		return new Date(commit.getCommitTime() * 1000L);
 	}
 
 	public String getName() {
diff --git a/src/com/gitblit/wicket/models/RepositoryModel.java b/src/com/gitblit/models/RepositoryModel.java
similarity index 97%
rename from src/com/gitblit/wicket/models/RepositoryModel.java
rename to src/com/gitblit/models/RepositoryModel.java
index 575e64a..7241d76 100644
--- a/src/com/gitblit/wicket/models/RepositoryModel.java
+++ b/src/com/gitblit/models/RepositoryModel.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.gitblit.wicket.models;
+package com.gitblit.models;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -23,7 +23,7 @@
 public class RepositoryModel implements Serializable {
 
 	private static final long serialVersionUID = 1L;
-	
+
 	// field names are reflectively mapped in EditRepository page
 	public String name;
 	public String description;
diff --git a/src/com/gitblit/wicket/models/TicketModel.java b/src/com/gitblit/models/TicketModel.java
similarity index 94%
rename from src/com/gitblit/wicket/models/TicketModel.java
rename to src/com/gitblit/models/TicketModel.java
index b661c19..b284340 100644
--- a/src/com/gitblit/wicket/models/TicketModel.java
+++ b/src/com/gitblit/models/TicketModel.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.gitblit.wicket.models;
+package com.gitblit.models;
 
 import java.io.Serializable;
 import java.text.ParseException;
@@ -36,12 +36,6 @@
 	public String author;
 	public List<Comment> comments;
 	public List<String> tags;
-
-	public TicketModel() {
-		state = "open";
-		comments = new ArrayList<Comment>();
-		tags = new ArrayList<String>();
-	}
 
 	public TicketModel(String ticketName) throws ParseException {
 		state = "";
diff --git a/src/com/gitblit/wicket/models/UserModel.java b/src/com/gitblit/models/UserModel.java
similarity index 97%
rename from src/com/gitblit/wicket/models/UserModel.java
rename to src/com/gitblit/models/UserModel.java
index 1181ee1..797c14e 100644
--- a/src/com/gitblit/wicket/models/UserModel.java
+++ b/src/com/gitblit/models/UserModel.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.gitblit.wicket.models;
+package com.gitblit.models;
 
 import java.io.Serializable;
 import java.util.ArrayList;
diff --git a/src/com/gitblit/utils/DiffUtils.java b/src/com/gitblit/utils/DiffUtils.java
new file mode 100644
index 0000000..d7a4a63
--- /dev/null
+++ b/src/com/gitblit/utils/DiffUtils.java
@@ -0,0 +1,149 @@
+package com.gitblit.utils;
+
+import java.io.ByteArrayOutputStream;
+import java.util.List;
+
+import org.eclipse.jgit.diff.DiffEntry;
+import org.eclipse.jgit.diff.DiffFormatter;
+import org.eclipse.jgit.diff.RawTextComparator;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevTree;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.treewalk.TreeWalk;
+import org.eclipse.jgit.treewalk.filter.TreeFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.gitblit.utils.JGitUtils.DiffOutputType;
+
+public class DiffUtils {
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(DiffUtils.class);
+	
+	public static String getCommitDiff(Repository r, RevCommit commit, DiffOutputType outputType) {
+		return getCommitDiff(r, null, commit, null, outputType);
+	}
+
+	public static String getCommitDiff(Repository r, RevCommit commit, String path,
+			DiffOutputType outputType) {
+		return getCommitDiff(r, null, commit, path, outputType);
+	}
+
+	public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit,
+			DiffOutputType outputType) {
+		return getCommitDiff(r, baseCommit, commit, null, outputType);
+	}
+
+	public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit,
+			String path, DiffOutputType outputType) {
+		try {
+			RevTree baseTree;
+			if (baseCommit == null) {
+				final RevWalk rw = new RevWalk(r);
+				RevCommit parent = rw.parseCommit(commit.getParent(0).getId());
+				rw.dispose();
+				baseTree = parent.getTree();
+			} else {
+				baseTree = baseCommit.getTree();
+			}
+
+			RevTree commitTree = commit.getTree();
+
+			final TreeWalk walk = new TreeWalk(r);
+			walk.reset();
+			walk.setRecursive(true);
+			walk.addTree(baseTree);
+			walk.addTree(commitTree);
+			walk.setFilter(TreeFilter.ANY_DIFF);
+
+			final ByteArrayOutputStream os = new ByteArrayOutputStream();
+			RawTextComparator cmp = RawTextComparator.DEFAULT;
+			DiffFormatter df;
+			switch (outputType) {
+			case GITWEB:
+				df = new GitWebDiffFormatter(os);
+				break;
+			case GITBLIT:
+				df = new GitBlitDiffFormatter(os);
+				break;
+			case PLAIN:
+			default:
+				df = new DiffFormatter(os);
+				break;
+			}
+			df.setRepository(r);
+			df.setDiffComparator(cmp);
+			df.setDetectRenames(true);
+			List<DiffEntry> diffs = df.scan(baseTree, commitTree);
+			if (path != null && path.length() > 0) {
+				for (DiffEntry diff : diffs) {
+					if (diff.getNewPath().equalsIgnoreCase(path)) {
+						df.format(diff);
+						break;
+					}
+				}
+			} else {
+				df.format(diffs);
+			}
+			String diff;
+			if (df instanceof GitWebDiffFormatter) {
+				// workaround for complex private methods in DiffFormatter
+				diff = ((GitWebDiffFormatter) df).getHtml();
+			} else {
+				diff = os.toString();
+			}
+			df.flush();
+			return diff;
+		} catch (Throwable t) {
+			LOGGER.error("failed to generate commit diff!", t);
+		}
+		return null;
+	}
+
+	public static String getCommitPatch(Repository r, RevCommit baseCommit, RevCommit commit,
+			String path) {
+		try {
+			RevTree baseTree;
+			if (baseCommit == null) {
+				final RevWalk rw = new RevWalk(r);
+				RevCommit parent = rw.parseCommit(commit.getParent(0).getId());
+				baseTree = parent.getTree();
+			} else {
+				baseTree = baseCommit.getTree();
+			}
+			RevTree commitTree = commit.getTree();
+
+			final TreeWalk walk = new TreeWalk(r);
+			walk.reset();
+			walk.setRecursive(true);
+			walk.addTree(baseTree);
+			walk.addTree(commitTree);
+			walk.setFilter(TreeFilter.ANY_DIFF);
+
+			final ByteArrayOutputStream os = new ByteArrayOutputStream();
+			RawTextComparator cmp = RawTextComparator.DEFAULT;
+			PatchFormatter df = new PatchFormatter(os);
+			df.setRepository(r);
+			df.setDiffComparator(cmp);
+			df.setDetectRenames(true);
+			List<DiffEntry> diffs = df.scan(baseTree, commitTree);
+			if (path != null && path.length() > 0) {
+				for (DiffEntry diff : diffs) {
+					if (diff.getNewPath().equalsIgnoreCase(path)) {
+						df.format(diff);
+						break;
+					}
+				}
+			} else {
+				df.format(diffs);
+			}
+			String diff = df.getPatch(commit);
+			df.flush();
+			return diff;
+		} catch (Throwable t) {
+			LOGGER.error("failed to generate commit diff!", t);
+		}
+		return null;
+	}
+}
diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java
index 088cd00..f99fbfd 100644
--- a/src/com/gitblit/utils/JGitUtils.java
+++ b/src/com/gitblit/utils/JGitUtils.java
@@ -73,12 +73,12 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.gitblit.wicket.models.Metric;
-import com.gitblit.wicket.models.PathModel;
-import com.gitblit.wicket.models.PathModel.PathChangeModel;
-import com.gitblit.wicket.models.RefModel;
-import com.gitblit.wicket.models.TicketModel;
-import com.gitblit.wicket.models.TicketModel.Comment;
+import com.gitblit.models.Metric;
+import com.gitblit.models.PathModel;
+import com.gitblit.models.RefModel;
+import com.gitblit.models.TicketModel;
+import com.gitblit.models.PathModel.PathChangeModel;
+import com.gitblit.models.TicketModel.Comment;
 
 public class JGitUtils {
 
@@ -183,11 +183,18 @@
 	}
 
 	public static boolean hasCommits(Repository r) {
-		return new File(r.getDirectory(), Constants.R_HEADS).list().length > 0;
+		if (r != null && r.getDirectory().exists()) {
+			return new File(r.getDirectory(), Constants.R_HEADS).list().length > 0;
+		}
+		return false;		
 	}
 
 	public static Date getLastChange(Repository r) {
 		if (!hasCommits(r)) {
+			// null repository
+			if (r == null) {
+				return new Date(0);
+			}
 			// fresh repository
 			return new Date(r.getDirectory().lastModified());
 		}
@@ -458,132 +465,6 @@
 			}
 			return null;
 		}
-	}
-
-	public static String getCommitDiff(Repository r, RevCommit commit, DiffOutputType outputType) {
-		return getCommitDiff(r, null, commit, null, outputType);
-	}
-
-	public static String getCommitDiff(Repository r, RevCommit commit, String path,
-			DiffOutputType outputType) {
-		return getCommitDiff(r, null, commit, path, outputType);
-	}
-
-	public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit,
-			DiffOutputType outputType) {
-		return getCommitDiff(r, baseCommit, commit, null, outputType);
-	}
-
-	public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit,
-			String path, DiffOutputType outputType) {
-		try {
-			RevTree baseTree;
-			if (baseCommit == null) {
-				final RevWalk rw = new RevWalk(r);
-				RevCommit parent = rw.parseCommit(commit.getParent(0).getId());
-				rw.dispose();
-				baseTree = parent.getTree();
-			} else {
-				baseTree = baseCommit.getTree();
-			}
-
-			RevTree commitTree = commit.getTree();
-
-			final TreeWalk walk = new TreeWalk(r);
-			walk.reset();
-			walk.setRecursive(true);
-			walk.addTree(baseTree);
-			walk.addTree(commitTree);
-			walk.setFilter(TreeFilter.ANY_DIFF);
-
-			final ByteArrayOutputStream os = new ByteArrayOutputStream();
-			RawTextComparator cmp = RawTextComparator.DEFAULT;
-			DiffFormatter df;
-			switch (outputType) {
-			case GITWEB:
-				df = new GitWebDiffFormatter(os);
-				break;
-			case GITBLIT:
-				df = new GitBlitDiffFormatter(os);
-				break;
-			case PLAIN:
-			default:
-				df = new DiffFormatter(os);
-				break;
-			}
-			df.setRepository(r);
-			df.setDiffComparator(cmp);
-			df.setDetectRenames(true);
-			List<DiffEntry> diffs = df.scan(baseTree, commitTree);
-			if (path != null && path.length() > 0) {
-				for (DiffEntry diff : diffs) {
-					if (diff.getNewPath().equalsIgnoreCase(path)) {
-						df.format(diff);
-						break;
-					}
-				}
-			} else {
-				df.format(diffs);
-			}
-			String diff;
-			if (df instanceof GitWebDiffFormatter) {
-				// workaround for complex private methods in DiffFormatter
-				diff = ((GitWebDiffFormatter) df).getHtml();
-			} else {
-				diff = os.toString();
-			}
-			df.flush();
-			return diff;
-		} catch (Throwable t) {
-			LOGGER.error("failed to generate commit diff!", t);
-		}
-		return null;
-	}
-
-	public static String getCommitPatch(Repository r, RevCommit baseCommit, RevCommit commit,
-			String path) {
-		try {
-			RevTree baseTree;
-			if (baseCommit == null) {
-				final RevWalk rw = new RevWalk(r);
-				RevCommit parent = rw.parseCommit(commit.getParent(0).getId());
-				baseTree = parent.getTree();
-			} else {
-				baseTree = baseCommit.getTree();
-			}
-			RevTree commitTree = commit.getTree();
-
-			final TreeWalk walk = new TreeWalk(r);
-			walk.reset();
-			walk.setRecursive(true);
-			walk.addTree(baseTree);
-			walk.addTree(commitTree);
-			walk.setFilter(TreeFilter.ANY_DIFF);
-
-			final ByteArrayOutputStream os = new ByteArrayOutputStream();
-			RawTextComparator cmp = RawTextComparator.DEFAULT;
-			PatchFormatter df = new PatchFormatter(os);
-			df.setRepository(r);
-			df.setDiffComparator(cmp);
-			df.setDetectRenames(true);
-			List<DiffEntry> diffs = df.scan(baseTree, commitTree);
-			if (path != null && path.length() > 0) {
-				for (DiffEntry diff : diffs) {
-					if (diff.getNewPath().equalsIgnoreCase(path)) {
-						df.format(diff);
-						break;
-					}
-				}
-			} else {
-				df.format(diffs);
-			}
-			String diff = df.getPatch(commit);
-			df.flush();
-			return diff;
-		} catch (Throwable t) {
-			LOGGER.error("failed to generate commit diff!", t);
-		}
-		return null;
 	}
 
 	private static PathModel getPathModel(TreeWalk walk, String basePath, RevCommit commit) {
diff --git a/src/com/gitblit/wicket/AuthorizationStrategy.java b/src/com/gitblit/wicket/AuthorizationStrategy.java
index 42d2522..b6b745b 100644
--- a/src/com/gitblit/wicket/AuthorizationStrategy.java
+++ b/src/com/gitblit/wicket/AuthorizationStrategy.java
@@ -22,7 +22,9 @@
 
 import com.gitblit.GitBlit;
 import com.gitblit.Keys;
-import com.gitblit.wicket.models.UserModel;
+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
@@ -46,7 +48,7 @@
 			}
 
 			UserModel user = session.getUser();
-			if (pageClass.isAnnotationPresent(AdminPage.class)) {
+			if (pageClass.isAnnotationPresent(RequiresAdminRole.class)) {
 				// admin page
 				if (allowAdmin) {
 					if (authenticateAdmin) {
diff --git a/src/com/gitblit/wicket/GitBlitWebApp.java b/src/com/gitblit/wicket/GitBlitWebApp.java
index f78bb0d..1d251d9 100644
--- a/src/com/gitblit/wicket/GitBlitWebApp.java
+++ b/src/com/gitblit/wicket/GitBlitWebApp.java
@@ -34,6 +34,8 @@
 import com.gitblit.wicket.pages.DocsPage;
 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.PatchPage;
 import com.gitblit.wicket.pages.RawPage;
diff --git a/src/com/gitblit/wicket/GitBlitWebSession.java b/src/com/gitblit/wicket/GitBlitWebSession.java
index 6488695..2238660 100644
--- a/src/com/gitblit/wicket/GitBlitWebSession.java
+++ b/src/com/gitblit/wicket/GitBlitWebSession.java
@@ -22,7 +22,7 @@
 import org.apache.wicket.protocol.http.WebSession;
 import org.apache.wicket.protocol.http.request.WebClientInfo;
 
-import com.gitblit.wicket.models.UserModel;
+import com.gitblit.models.UserModel;
 
 public final class GitBlitWebSession extends WebSession {
 
diff --git a/src/com/gitblit/wicket/AdminPage.java b/src/com/gitblit/wicket/RequiresAdminRole.java
similarity index 95%
rename from src/com/gitblit/wicket/AdminPage.java
rename to src/com/gitblit/wicket/RequiresAdminRole.java
index 1c9e0ef..ce2dcfc 100644
--- a/src/com/gitblit/wicket/AdminPage.java
+++ b/src/com/gitblit/wicket/RequiresAdminRole.java
@@ -22,5 +22,5 @@
 
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.TYPE)
-public @interface AdminPage {
+public @interface RequiresAdminRole {
 }
diff --git a/src/com/gitblit/wicket/BasePage.html b/src/com/gitblit/wicket/pages/BasePage.html
similarity index 77%
rename from src/com/gitblit/wicket/BasePage.html
rename to src/com/gitblit/wicket/pages/BasePage.html
index 0e8705c..0da37d4 100644
--- a/src/com/gitblit/wicket/BasePage.html
+++ b/src/com/gitblit/wicket/pages/BasePage.html
@@ -8,8 +8,8 @@
 	<wicket:head>
    		<title wicket:id="title">[page title]</title>
    		<wicket:link>
-   			<link rel="stylesheet" type="text/css" href="resources/gitblit.css"/>
-   			<link rel="shortcut icon" href="resources/gitblt-favicon.png" type="image/png" />
+   			<link rel="stylesheet" type="text/css" href="/com/gitblit/wicket/resources/gitblit.css"/>
+   			<link rel="shortcut icon" href="/com/gitblit/wicket/resources/gitblt-favicon.png" type="image/png" />
    		</wicket:link>
 	</wicket:head>
 
@@ -18,7 +18,7 @@
 		<div class="page_header">
 			<a title="gitblit homepage" href="http://gitblit.com/">
 				<wicket:link>
-					<img src="resources/gitblt_25.png" width="79" height="25" alt="gitblit" class="logo"/>
+					<img src="/com/gitblit/wicket/resources/gitblt_25.png" width="79" height="25" alt="gitblit" class="logo"/>
 				</wicket:link>
 			</a>
 			<span>
diff --git a/src/com/gitblit/wicket/BasePage.java b/src/com/gitblit/wicket/pages/BasePage.java
similarity index 96%
rename from src/com/gitblit/wicket/BasePage.java
rename to src/com/gitblit/wicket/pages/BasePage.java
index 2e4adfe..9031bef 100644
--- a/src/com/gitblit/wicket/BasePage.java
+++ b/src/com/gitblit/wicket/pages/BasePage.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.gitblit.wicket;
+package com.gitblit.wicket.pages;
 
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -34,7 +34,9 @@
 import com.gitblit.Constants.AccessRestrictionType;
 import com.gitblit.GitBlit;
 import com.gitblit.Keys;
-import com.gitblit.wicket.pages.SummaryPage;
+import com.gitblit.wicket.GitBlitWebSession;
+import com.gitblit.wicket.WicketUtils;
+import com.gitblit.wicket.panels.LinkPanel;
 
 public abstract class BasePage extends WebPage {
 
diff --git a/src/com/gitblit/wicket/pages/BlobDiffPage.java b/src/com/gitblit/wicket/pages/BlobDiffPage.java
index aae41ba..4bd61d5 100644
--- a/src/com/gitblit/wicket/pages/BlobDiffPage.java
+++ b/src/com/gitblit/wicket/pages/BlobDiffPage.java
@@ -23,10 +23,10 @@
 
 import com.gitblit.GitBlit;
 import com.gitblit.Keys;
+import com.gitblit.utils.DiffUtils;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.JGitUtils.DiffOutputType;
 import com.gitblit.utils.StringUtils;
-import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.panels.CommitHeaderPanel;
 import com.gitblit.wicket.panels.PathBreadcrumbsPanel;
@@ -48,13 +48,13 @@
 		String diff;
 		if (StringUtils.isEmpty(baseObjectId)) {
 			// use first parent
-			diff = JGitUtils.getCommitDiff(r, commit, blobPath, diffType);
+			diff = DiffUtils.getCommitDiff(r, commit, blobPath, diffType);
 			add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class,
 					WicketUtils.newPathParameter(repositoryName, objectId, blobPath)));
 		} else {
 			// base commit specified
 			RevCommit baseCommit = JGitUtils.getCommit(r, baseObjectId);
-			diff = JGitUtils.getCommitDiff(r, baseCommit, commit, blobPath, diffType);
+			diff = DiffUtils.getCommitDiff(r, baseCommit, commit, blobPath, diffType);
 			add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class,
 					WicketUtils.newBlobDiffParameter(repositoryName, baseObjectId, objectId,
 							blobPath)));
diff --git a/src/com/gitblit/wicket/pages/BlobPage.java b/src/com/gitblit/wicket/pages/BlobPage.java
index 23244c0..4601ac7 100644
--- a/src/com/gitblit/wicket/pages/BlobPage.java
+++ b/src/com/gitblit/wicket/pages/BlobPage.java
@@ -29,7 +29,6 @@
 import com.gitblit.GitBlit;
 import com.gitblit.Keys;
 import com.gitblit.utils.JGitUtils;
-import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.panels.CommitHeaderPanel;
 import com.gitblit.wicket.panels.PathBreadcrumbsPanel;
diff --git a/src/com/gitblit/wicket/pages/BranchesPage.java b/src/com/gitblit/wicket/pages/BranchesPage.java
index f348fd4..2b7d518 100644
--- a/src/com/gitblit/wicket/pages/BranchesPage.java
+++ b/src/com/gitblit/wicket/pages/BranchesPage.java
@@ -17,7 +17,6 @@
 
 import org.apache.wicket.PageParameters;
 
-import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.panels.BranchesPanel;
 
 public class BranchesPage extends RepositoryPage {
diff --git a/src/com/gitblit/wicket/pages/CommitDiffPage.java b/src/com/gitblit/wicket/pages/CommitDiffPage.java
index 81ee520..1f492ac 100644
--- a/src/com/gitblit/wicket/pages/CommitDiffPage.java
+++ b/src/com/gitblit/wicket/pages/CommitDiffPage.java
@@ -29,14 +29,14 @@
 
 import com.gitblit.GitBlit;
 import com.gitblit.Keys;
+import com.gitblit.models.PathModel.PathChangeModel;
+import com.gitblit.utils.DiffUtils;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.JGitUtils.DiffOutputType;
-import com.gitblit.wicket.LinkPanel;
-import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.models.PathModel.PathChangeModel;
 import com.gitblit.wicket.panels.CommitHeaderPanel;
 import com.gitblit.wicket.panels.CommitLegendPanel;
+import com.gitblit.wicket.panels.LinkPanel;
 
 public class CommitDiffPage extends RepositoryPage {
 
@@ -47,7 +47,7 @@
 		RevCommit commit = getCommit();
 		DiffOutputType diffType = DiffOutputType.forName(GitBlit.getString(Keys.web.diffStyle,
 				DiffOutputType.GITBLIT.name()));
-		String diff = JGitUtils.getCommitDiff(r, commit, diffType);
+		String diff = DiffUtils.getCommitDiff(r, commit, diffType);
 
 		List<String> parents = new ArrayList<String>();
 		if (commit.getParentCount() > 0) {
diff --git a/src/com/gitblit/wicket/pages/CommitPage.java b/src/com/gitblit/wicket/pages/CommitPage.java
index 1a8f7c3..dc674a2 100644
--- a/src/com/gitblit/wicket/pages/CommitPage.java
+++ b/src/com/gitblit/wicket/pages/CommitPage.java
@@ -32,14 +32,13 @@
 import com.gitblit.DownloadZipServlet;
 import com.gitblit.GitBlit;
 import com.gitblit.Keys;
+import com.gitblit.models.PathModel.PathChangeModel;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.JGitUtils.SearchType;
-import com.gitblit.wicket.LinkPanel;
-import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.models.PathModel.PathChangeModel;
 import com.gitblit.wicket.panels.CommitHeaderPanel;
 import com.gitblit.wicket.panels.CommitLegendPanel;
+import com.gitblit.wicket.panels.LinkPanel;
 
 public class CommitPage extends RepositoryPage {
 
diff --git a/src/com/gitblit/wicket/pages/DocsPage.java b/src/com/gitblit/wicket/pages/DocsPage.java
index 32b208a..7f41b71 100644
--- a/src/com/gitblit/wicket/pages/DocsPage.java
+++ b/src/com/gitblit/wicket/pages/DocsPage.java
@@ -27,12 +27,11 @@
 
 import com.gitblit.GitBlit;
 import com.gitblit.Keys;
+import com.gitblit.models.PathModel;
 import com.gitblit.utils.ByteFormat;
 import com.gitblit.utils.JGitUtils;
-import com.gitblit.wicket.LinkPanel;
-import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.models.PathModel;
+import com.gitblit.wicket.panels.LinkPanel;
 
 public class DocsPage extends RepositoryPage {
 
diff --git a/src/com/gitblit/wicket/pages/EditRepositoryPage.java b/src/com/gitblit/wicket/pages/EditRepositoryPage.java
index 2b5cb99..a1a42d0 100644
--- a/src/com/gitblit/wicket/pages/EditRepositoryPage.java
+++ b/src/com/gitblit/wicket/pages/EditRepositoryPage.java
@@ -40,12 +40,11 @@
 import com.gitblit.GitBlit;
 import com.gitblit.GitBlitException;
 import com.gitblit.Keys;
+import com.gitblit.models.RepositoryModel;
+import com.gitblit.models.UserModel;
 import com.gitblit.utils.StringUtils;
-import com.gitblit.wicket.BasePage;
 import com.gitblit.wicket.GitBlitWebSession;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.models.RepositoryModel;
-import com.gitblit.wicket.models.UserModel;
 
 public class EditRepositoryPage extends BasePage {
 
@@ -57,7 +56,7 @@
 		// create constructor
 		super();
 		isCreate = true;
-		setupPage(new RepositoryModel("", "", "", new Date()));
+		setupPage(new RepositoryModel());
 	}
 
 	public EditRepositoryPage(PageParameters params) {
diff --git a/src/com/gitblit/wicket/pages/EditUserPage.java b/src/com/gitblit/wicket/pages/EditUserPage.java
index 1127ffb..fb647f7 100644
--- a/src/com/gitblit/wicket/pages/EditUserPage.java
+++ b/src/com/gitblit/wicket/pages/EditUserPage.java
@@ -38,14 +38,13 @@
 import com.gitblit.GitBlit;
 import com.gitblit.GitBlitException;
 import com.gitblit.Keys;
+import com.gitblit.models.RepositoryModel;
+import com.gitblit.models.UserModel;
 import com.gitblit.utils.StringUtils;
-import com.gitblit.wicket.AdminPage;
-import com.gitblit.wicket.BasePage;
+import com.gitblit.wicket.RequiresAdminRole;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.models.RepositoryModel;
-import com.gitblit.wicket.models.UserModel;
 
-@AdminPage
+@RequiresAdminRole
 public class EditUserPage extends BasePage {
 
 	private final boolean isCreate;
diff --git a/src/com/gitblit/wicket/pages/HistoryPage.java b/src/com/gitblit/wicket/pages/HistoryPage.java
index e4f8f8d..122eeb8 100644
--- a/src/com/gitblit/wicket/pages/HistoryPage.java
+++ b/src/com/gitblit/wicket/pages/HistoryPage.java
@@ -18,7 +18,6 @@
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 
-import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.panels.HistoryPanel;
 
diff --git a/src/com/gitblit/wicket/pages/LogPage.java b/src/com/gitblit/wicket/pages/LogPage.java
index 2554f7d..35f8a73 100644
--- a/src/com/gitblit/wicket/pages/LogPage.java
+++ b/src/com/gitblit/wicket/pages/LogPage.java
@@ -18,7 +18,6 @@
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 
-import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.panels.LogPanel;
 
diff --git a/src/com/gitblit/wicket/LoginPage.html b/src/com/gitblit/wicket/pages/LoginPage.html
similarity index 81%
rename from src/com/gitblit/wicket/LoginPage.html
rename to src/com/gitblit/wicket/pages/LoginPage.html
index 037063c..280453d 100644
--- a/src/com/gitblit/wicket/LoginPage.html
+++ b/src/com/gitblit/wicket/pages/LoginPage.html
@@ -8,8 +8,8 @@
 	<wicket:head>
    		<title wicket:id="title">[page title]</title>
    		<wicket:link>
-   			<link rel="stylesheet" type="text/css" href="resources/gitblit.css"/>
-   			<link rel="shortcut icon" href="resources/gitblt-favicon.png" type="image/png" />
+   			<link rel="stylesheet" type="text/css" href="/com/gitblit/wicket/resources/gitblit.css"/>
+   			<link rel="shortcut icon" href="/com/gitblit/wicket/resources/gitblt-favicon.png" type="image/png" />
    		</wicket:link>
 	</wicket:head>
 	
@@ -17,7 +17,7 @@
 		<div>
 			<div style="padding-top: 10px;text-align:center;">
 				<wicket:link>
-					<img src="resources/gitblt_25.png" alt="Git:Blit"/><br/>
+					<img src="/com/gitblit/wicket/resources/gitblt_25.png" alt="Git:Blit"/><br/>
 				</wicket:link>
 				<div style="padding-top:30px;font-weight:bold;" wicket:id="name">[name]</div>
 			</div>
diff --git a/src/com/gitblit/wicket/LoginPage.java b/src/com/gitblit/wicket/pages/LoginPage.java
similarity index 68%
rename from src/com/gitblit/wicket/LoginPage.java
rename to src/com/gitblit/wicket/pages/LoginPage.java
index 8710878..56e979c 100644
--- a/src/com/gitblit/wicket/LoginPage.java
+++ b/src/com/gitblit/wicket/pages/LoginPage.java
@@ -13,12 +13,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.gitblit.wicket;
+package com.gitblit.wicket.pages;
 
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.PasswordTextField;
 import org.apache.wicket.markup.html.form.StatelessForm;
 import org.apache.wicket.markup.html.form.TextField;
@@ -29,7 +28,8 @@
 import com.gitblit.Constants;
 import com.gitblit.GitBlit;
 import com.gitblit.Keys;
-import com.gitblit.wicket.models.UserModel;
+import com.gitblit.models.UserModel;
+import com.gitblit.wicket.GitBlitWebSession;
 
 public class LoginPage extends WebPage {
 
@@ -39,42 +39,37 @@
 	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()) {
+			setRedirect(true);
+			setResponsePage(getApplication().getHomePage());
+		}
+		
 		add(new Label("title", GitBlit.getString(Keys.web.siteName, Constants.NAME)));
 		add(new Label("name", Constants.NAME));
 
-		Form<Void> loginForm = new LoginForm("loginForm");
+		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 {
+					loginUser(user);
+				}
+			}
+		};
 		loginForm.add(new TextField<String>("username", username));
 		loginForm.add(new PasswordTextField("password", password));
 		loginForm.add(new FeedbackPanel("feedback"));
 		add(loginForm);
-	}
-
-	class LoginForm extends StatelessForm<Void> {
-		private static final long serialVersionUID = 1L;
-
-		public LoginForm(String id) {
-			super(id);
-
-			// If we are already logged in because user directly accessed
-			// the login url, redirect to the home page
-			if (GitBlitWebSession.get().isLoggedIn()) {
-				setRedirect(true);
-				setResponsePage(getApplication().getHomePage());
-			}
-		}
-
-		@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 {
-				loginUser(user);
-			}
-		}
 	}
 
 	private void loginUser(UserModel user) {
diff --git a/src/com/gitblit/wicket/LogoutPage.java b/src/com/gitblit/wicket/pages/LogoutPage.java
similarity index 95%
rename from src/com/gitblit/wicket/LogoutPage.java
rename to src/com/gitblit/wicket/pages/LogoutPage.java
index 47f80f0..05beab3 100644
--- a/src/com/gitblit/wicket/LogoutPage.java
+++ b/src/com/gitblit/wicket/pages/LogoutPage.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.gitblit.wicket;
+package com.gitblit.wicket.pages;
 
 import org.apache.wicket.markup.html.WebPage;
 
diff --git a/src/com/gitblit/wicket/pages/MarkdownPage.java b/src/com/gitblit/wicket/pages/MarkdownPage.java
index d62c433..fc8b7cb 100644
--- a/src/com/gitblit/wicket/pages/MarkdownPage.java
+++ b/src/com/gitblit/wicket/pages/MarkdownPage.java
@@ -26,7 +26,6 @@
 
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.MarkdownUtils;
-import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.WicketUtils;
 
 public class MarkdownPage extends RepositoryPage {
diff --git a/src/com/gitblit/wicket/pages/PatchPage.java b/src/com/gitblit/wicket/pages/PatchPage.java
index 02e4d38..0493473 100644
--- a/src/com/gitblit/wicket/pages/PatchPage.java
+++ b/src/com/gitblit/wicket/pages/PatchPage.java
@@ -22,6 +22,7 @@
 import org.eclipse.jgit.revwalk.RevCommit;
 
 import com.gitblit.GitBlit;
+import com.gitblit.utils.DiffUtils;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.StringUtils;
 import com.gitblit.wicket.GitBlitWebSession;
@@ -61,7 +62,7 @@
 		if (!StringUtils.isEmpty(baseObjectId)) {
 			baseCommit = JGitUtils.getCommit(r, baseObjectId);
 		}
-		String patch = JGitUtils.getCommitPatch(r, baseCommit, commit, blobPath);
+		String patch = DiffUtils.getCommitPatch(r, baseCommit, commit, blobPath);
 		add(new Label("patchText", patch));
 		r.close();
 	}
diff --git a/src/com/gitblit/wicket/pages/RepositoriesPage.java b/src/com/gitblit/wicket/pages/RepositoriesPage.java
index 2bb818d..b0e5e57 100644
--- a/src/com/gitblit/wicket/pages/RepositoriesPage.java
+++ b/src/com/gitblit/wicket/pages/RepositoriesPage.java
@@ -28,7 +28,6 @@
 import com.gitblit.Keys;
 import com.gitblit.utils.MarkdownUtils;
 import com.gitblit.utils.StringUtils;
-import com.gitblit.wicket.BasePage;
 import com.gitblit.wicket.GitBlitWebSession;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.panels.RepositoriesPanel;
diff --git a/src/com/gitblit/wicket/RepositoryPage.html b/src/com/gitblit/wicket/pages/RepositoryPage.html
similarity index 100%
rename from src/com/gitblit/wicket/RepositoryPage.html
rename to src/com/gitblit/wicket/pages/RepositoryPage.html
diff --git a/src/com/gitblit/wicket/RepositoryPage.java b/src/com/gitblit/wicket/pages/RepositoryPage.java
similarity index 96%
rename from src/com/gitblit/wicket/RepositoryPage.java
rename to src/com/gitblit/wicket/pages/RepositoryPage.java
index 9d5253f..109c51a 100644
--- a/src/com/gitblit/wicket/RepositoryPage.java
+++ b/src/com/gitblit/wicket/pages/RepositoryPage.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.gitblit.wicket;
+package com.gitblit.wicket.pages;
 
 import java.text.MessageFormat;
 import java.util.ArrayList;
@@ -45,19 +45,13 @@
 
 import com.gitblit.GitBlit;
 import com.gitblit.Keys;
+import com.gitblit.models.RepositoryModel;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.JGitUtils.SearchType;
 import com.gitblit.utils.StringUtils;
-import com.gitblit.wicket.models.RepositoryModel;
-import com.gitblit.wicket.pages.BranchesPage;
-import com.gitblit.wicket.pages.DocsPage;
-import com.gitblit.wicket.pages.EditRepositoryPage;
-import com.gitblit.wicket.pages.LogPage;
-import com.gitblit.wicket.pages.SearchPage;
-import com.gitblit.wicket.pages.SummaryPage;
-import com.gitblit.wicket.pages.TagsPage;
-import com.gitblit.wicket.pages.TicketsPage;
-import com.gitblit.wicket.pages.TreePage;
+import com.gitblit.wicket.GitBlitWebSession;
+import com.gitblit.wicket.WicketUtils;
+import com.gitblit.wicket.panels.LinkPanel;
 import com.gitblit.wicket.panels.RefsPanel;
 
 public abstract class RepositoryPage extends BasePage {
diff --git a/src/com/gitblit/wicket/pages/SearchPage.java b/src/com/gitblit/wicket/pages/SearchPage.java
index b12beee..335c40d 100644
--- a/src/com/gitblit/wicket/pages/SearchPage.java
+++ b/src/com/gitblit/wicket/pages/SearchPage.java
@@ -19,7 +19,6 @@
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 
 import com.gitblit.utils.JGitUtils.SearchType;
-import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.panels.SearchPanel;
 
diff --git a/src/com/gitblit/wicket/pages/SummaryPage.java b/src/com/gitblit/wicket/pages/SummaryPage.java
index 835b344..181de0d 100644
--- a/src/com/gitblit/wicket/pages/SummaryPage.java
+++ b/src/com/gitblit/wicket/pages/SummaryPage.java
@@ -42,12 +42,11 @@
 import com.gitblit.Constants.AccessRestrictionType;
 import com.gitblit.GitBlit;
 import com.gitblit.Keys;
+import com.gitblit.models.Metric;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.StringUtils;
 import com.gitblit.utils.TimeUtils;
-import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.models.Metric;
 import com.gitblit.wicket.panels.BranchesPanel;
 import com.gitblit.wicket.panels.LogPanel;
 import com.gitblit.wicket.panels.TagsPanel;
diff --git a/src/com/gitblit/wicket/pages/TagPage.java b/src/com/gitblit/wicket/pages/TagPage.java
index ff02b7b..7945231 100644
--- a/src/com/gitblit/wicket/pages/TagPage.java
+++ b/src/com/gitblit/wicket/pages/TagPage.java
@@ -21,12 +21,11 @@
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
 
+import com.gitblit.models.RefModel;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.JGitUtils.SearchType;
-import com.gitblit.wicket.LinkPanel;
-import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.models.RefModel;
+import com.gitblit.wicket.panels.LinkPanel;
 
 public class TagPage extends RepositoryPage {
 
diff --git a/src/com/gitblit/wicket/pages/TagsPage.java b/src/com/gitblit/wicket/pages/TagsPage.java
index 0f42942..3ddbde9 100644
--- a/src/com/gitblit/wicket/pages/TagsPage.java
+++ b/src/com/gitblit/wicket/pages/TagsPage.java
@@ -17,7 +17,6 @@
 
 import org.apache.wicket.PageParameters;
 
-import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.panels.TagsPanel;
 
 public class TagsPage extends RepositoryPage {
diff --git a/src/com/gitblit/wicket/pages/TicketPage.java b/src/com/gitblit/wicket/pages/TicketPage.java
index 9c8c392..353c543 100644
--- a/src/com/gitblit/wicket/pages/TicketPage.java
+++ b/src/com/gitblit/wicket/pages/TicketPage.java
@@ -22,13 +22,12 @@
 import org.apache.wicket.markup.repeater.data.ListDataProvider;
 import org.eclipse.jgit.lib.Repository;
 
+import com.gitblit.models.TicketModel;
+import com.gitblit.models.TicketModel.Comment;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.StringUtils;
 import com.gitblit.wicket.GitBlitWebSession;
-import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.models.TicketModel;
-import com.gitblit.wicket.models.TicketModel.Comment;
 
 public class TicketPage extends RepositoryPage {
 
diff --git a/src/com/gitblit/wicket/pages/TicketsPage.java b/src/com/gitblit/wicket/pages/TicketsPage.java
index 2832385..8da4e94 100644
--- a/src/com/gitblit/wicket/pages/TicketsPage.java
+++ b/src/com/gitblit/wicket/pages/TicketsPage.java
@@ -23,13 +23,12 @@
 import org.apache.wicket.markup.repeater.data.DataView;
 import org.apache.wicket.markup.repeater.data.ListDataProvider;
 
+import com.gitblit.models.TicketModel;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.StringUtils;
 import com.gitblit.wicket.GitBlitWebSession;
-import com.gitblit.wicket.LinkPanel;
-import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.models.TicketModel;
+import com.gitblit.wicket.panels.LinkPanel;
 
 public class TicketsPage extends RepositoryPage {
 
diff --git a/src/com/gitblit/wicket/pages/TreePage.java b/src/com/gitblit/wicket/pages/TreePage.java
index 761b82e..4fc7119 100644
--- a/src/com/gitblit/wicket/pages/TreePage.java
+++ b/src/com/gitblit/wicket/pages/TreePage.java
@@ -32,13 +32,12 @@
 import com.gitblit.DownloadZipServlet;
 import com.gitblit.GitBlit;
 import com.gitblit.Keys;
+import com.gitblit.models.PathModel;
 import com.gitblit.utils.ByteFormat;
 import com.gitblit.utils.JGitUtils;
-import com.gitblit.wicket.LinkPanel;
-import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.models.PathModel;
 import com.gitblit.wicket.panels.CommitHeaderPanel;
+import com.gitblit.wicket.panels.LinkPanel;
 import com.gitblit.wicket.panels.PathBreadcrumbsPanel;
 
 public class TreePage extends RepositoryPage {
diff --git a/src/com/gitblit/wicket/panels/BranchesPanel.java b/src/com/gitblit/wicket/panels/BranchesPanel.java
index 357c7c2..d50db88 100644
--- a/src/com/gitblit/wicket/panels/BranchesPanel.java
+++ b/src/com/gitblit/wicket/panels/BranchesPanel.java
@@ -28,12 +28,11 @@
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.Repository;
 
+import com.gitblit.models.RefModel;
+import com.gitblit.models.RepositoryModel;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.StringUtils;
-import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.models.RefModel;
-import com.gitblit.wicket.models.RepositoryModel;
 import com.gitblit.wicket.pages.BranchesPage;
 import com.gitblit.wicket.pages.LogPage;
 import com.gitblit.wicket.pages.SummaryPage;
diff --git a/src/com/gitblit/wicket/panels/CommitHeaderPanel.java b/src/com/gitblit/wicket/panels/CommitHeaderPanel.java
index cb80321..1a6580d 100644
--- a/src/com/gitblit/wicket/panels/CommitHeaderPanel.java
+++ b/src/com/gitblit/wicket/panels/CommitHeaderPanel.java
@@ -18,7 +18,6 @@
 import org.apache.wicket.markup.html.basic.Label;
 import org.eclipse.jgit.revwalk.RevCommit;
 
-import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.pages.CommitPage;
 
diff --git a/src/com/gitblit/wicket/panels/CommitLegendPanel.java b/src/com/gitblit/wicket/panels/CommitLegendPanel.java
index ee81c69..bbfa185 100644
--- a/src/com/gitblit/wicket/panels/CommitLegendPanel.java
+++ b/src/com/gitblit/wicket/panels/CommitLegendPanel.java
@@ -28,9 +28,9 @@
 import org.apache.wicket.markup.repeater.data.ListDataProvider;
 import org.eclipse.jgit.diff.DiffEntry.ChangeType;
 
+import com.gitblit.models.PathModel.PathChangeModel;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.models.PathModel.PathChangeModel;
 
 public class CommitLegendPanel extends Panel {
 
diff --git a/src/com/gitblit/wicket/panels/HistoryPanel.java b/src/com/gitblit/wicket/panels/HistoryPanel.java
index d65b02c..180a248 100644
--- a/src/com/gitblit/wicket/panels/HistoryPanel.java
+++ b/src/com/gitblit/wicket/panels/HistoryPanel.java
@@ -32,13 +32,12 @@
 
 import com.gitblit.GitBlit;
 import com.gitblit.Keys;
+import com.gitblit.models.PathModel;
+import com.gitblit.models.PathModel.PathChangeModel;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.JGitUtils.SearchType;
 import com.gitblit.utils.StringUtils;
-import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.models.PathModel;
-import com.gitblit.wicket.models.PathModel.PathChangeModel;
 import com.gitblit.wicket.pages.BlobDiffPage;
 import com.gitblit.wicket.pages.BlobPage;
 import com.gitblit.wicket.pages.CommitDiffPage;
diff --git a/src/com/gitblit/wicket/LinkPanel.html b/src/com/gitblit/wicket/panels/LinkPanel.html
similarity index 100%
rename from src/com/gitblit/wicket/LinkPanel.html
rename to src/com/gitblit/wicket/panels/LinkPanel.html
diff --git a/src/com/gitblit/wicket/LinkPanel.java b/src/com/gitblit/wicket/panels/LinkPanel.java
similarity index 98%
rename from src/com/gitblit/wicket/LinkPanel.java
rename to src/com/gitblit/wicket/panels/LinkPanel.java
index 2700cf8..475a71e 100644
--- a/src/com/gitblit/wicket/LinkPanel.java
+++ b/src/com/gitblit/wicket/panels/LinkPanel.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.gitblit.wicket;
+package com.gitblit.wicket.panels;
 
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.behavior.SimpleAttributeModifier;
diff --git a/src/com/gitblit/wicket/panels/LogPanel.java b/src/com/gitblit/wicket/panels/LogPanel.java
index b321917..c5ccac4 100644
--- a/src/com/gitblit/wicket/panels/LogPanel.java
+++ b/src/com/gitblit/wicket/panels/LogPanel.java
@@ -34,7 +34,6 @@
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.JGitUtils.SearchType;
 import com.gitblit.utils.StringUtils;
-import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.pages.CommitDiffPage;
 import com.gitblit.wicket.pages.CommitPage;
diff --git a/src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.java b/src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.java
index 2693cc2..bc98e25 100644
--- a/src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.java
+++ b/src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.java
@@ -25,7 +25,6 @@
 import org.apache.wicket.markup.repeater.data.DataView;
 import org.apache.wicket.markup.repeater.data.ListDataProvider;
 
-import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.pages.TreePage;
 
@@ -59,7 +58,10 @@
 
 			public void populateItem(final Item<BreadCrumb> item) {
 				final BreadCrumb entry = item.getModelObject();
-				String path = entry.getPath();
+				String path = entry.path;
+				if (path.equals(ROOT)) {
+					path = null;
+				}
 				if (entry.isLeaf) {
 					item.add(new Label("pathLink", entry.name));
 					item.add(new Label("pathSeparator", "").setVisible(false));
@@ -85,13 +87,6 @@
 			this.name = name;
 			this.path = path;
 			this.isLeaf = isLeaf;
-		}
-
-		String getPath() {
-			if (path.equals(ROOT)) {
-				return null;
-			}
-			return path;
-		}
+		}		
 	}
 }
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/RefsPanel.java b/src/com/gitblit/wicket/panels/RefsPanel.java
index b6e4b0b..33b1884 100644
--- a/src/com/gitblit/wicket/panels/RefsPanel.java
+++ b/src/com/gitblit/wicket/panels/RefsPanel.java
@@ -29,7 +29,6 @@
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.revwalk.RevCommit;
 
-import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.pages.CommitPage;
 import com.gitblit.wicket.pages.LogPage;
diff --git a/src/com/gitblit/wicket/panels/RepositoriesPanel.java b/src/com/gitblit/wicket/panels/RepositoriesPanel.java
index a566b59..a0c9e13 100644
--- a/src/com/gitblit/wicket/panels/RepositoriesPanel.java
+++ b/src/com/gitblit/wicket/panels/RepositoriesPanel.java
@@ -43,13 +43,12 @@
 import com.gitblit.Constants.AccessRestrictionType;
 import com.gitblit.GitBlit;
 import com.gitblit.Keys;
+import com.gitblit.models.RepositoryModel;
+import com.gitblit.models.UserModel;
 import com.gitblit.utils.StringUtils;
 import com.gitblit.utils.TimeUtils;
 import com.gitblit.wicket.GitBlitWebSession;
-import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.models.RepositoryModel;
-import com.gitblit.wicket.models.UserModel;
 import com.gitblit.wicket.pages.EditRepositoryPage;
 import com.gitblit.wicket.pages.SummaryPage;
 
diff --git a/src/com/gitblit/wicket/panels/SearchPanel.java b/src/com/gitblit/wicket/panels/SearchPanel.java
index 8c63c42..f91e0e8 100644
--- a/src/com/gitblit/wicket/panels/SearchPanel.java
+++ b/src/com/gitblit/wicket/panels/SearchPanel.java
@@ -32,7 +32,6 @@
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.JGitUtils.SearchType;
 import com.gitblit.utils.StringUtils;
-import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.pages.CommitDiffPage;
 import com.gitblit.wicket.pages.CommitPage;
diff --git a/src/com/gitblit/wicket/panels/TagsPanel.java b/src/com/gitblit/wicket/panels/TagsPanel.java
index 1d8eec7..de8112a 100644
--- a/src/com/gitblit/wicket/panels/TagsPanel.java
+++ b/src/com/gitblit/wicket/panels/TagsPanel.java
@@ -26,11 +26,10 @@
 import org.apache.wicket.model.StringResourceModel;
 import org.eclipse.jgit.lib.Repository;
 
+import com.gitblit.models.RefModel;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.StringUtils;
-import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.models.RefModel;
 import com.gitblit.wicket.pages.CommitPage;
 import com.gitblit.wicket.pages.LogPage;
 import com.gitblit.wicket.pages.SummaryPage;
diff --git a/src/com/gitblit/wicket/panels/UsersPanel.java b/src/com/gitblit/wicket/panels/UsersPanel.java
index 27bc334..4cf92a4 100644
--- a/src/com/gitblit/wicket/panels/UsersPanel.java
+++ b/src/com/gitblit/wicket/panels/UsersPanel.java
@@ -26,7 +26,6 @@
 import org.apache.wicket.markup.repeater.data.ListDataProvider;
 
 import com.gitblit.GitBlit;
-import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.pages.EditUserPage;
 
diff --git a/tests/com/gitblit/tests/GitBlitSuite.java b/tests/com/gitblit/tests/GitBlitSuite.java
index eaa028d..a31b013 100644
--- a/tests/com/gitblit/tests/GitBlitSuite.java
+++ b/tests/com/gitblit/tests/GitBlitSuite.java
@@ -23,7 +23,7 @@
 		suite.addTestSuite(JGitUtilsTest.class);
 		return new GitBlitSuite(suite);
 	}
-	
+
 	public static Repository getHelloworldRepository() throws Exception {
 		return new FileRepository(new File(REPOSITORIES, "helloworld.git"));
 	}
diff --git a/tests/com/gitblit/tests/JGitUtilsTest.java b/tests/com/gitblit/tests/JGitUtilsTest.java
index 0432d39..7fcf48d 100644
--- a/tests/com/gitblit/tests/JGitUtilsTest.java
+++ b/tests/com/gitblit/tests/JGitUtilsTest.java
@@ -29,11 +29,12 @@
 import org.eclipse.jgit.revwalk.RevObject;
 import org.eclipse.jgit.revwalk.RevTree;
 
+import com.gitblit.models.PathModel.PathChangeModel;
+import com.gitblit.models.RefModel;
+import com.gitblit.models.TicketModel;
+import com.gitblit.utils.DiffUtils;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.JGitUtils.DiffOutputType;
-import com.gitblit.wicket.models.PathModel.PathChangeModel;
-import com.gitblit.wicket.models.RefModel;
-import com.gitblit.wicket.models.TicketModel;
 
 public class JGitUtilsTest extends TestCase {
 
@@ -100,7 +101,7 @@
 		Repository repository = GitBlitSuite.getHelloworldRepository();
 		RevCommit commit = JGitUtils.getCommit(repository,
 				"1d0c2933a4ae69c362f76797d42d6bd182d05176");
-		String diff = JGitUtils.getCommitDiff(repository, commit, DiffOutputType.PLAIN);
+		String diff = DiffUtils.getCommitDiff(repository, commit, DiffOutputType.PLAIN);
 		repository.close();
 		assertTrue("Failed to generate diff!", diff != null && diff.length() > 0);
 		String expected = "-		system.out.println(\"Hello World\");\n+		System.out.println(\"Hello World\"";

--
Gitblit v1.9.1