diff --git a/src/main/java/WEB-INF/beans.xml b/src/main/java/WEB-INF/beans.xml
new file mode 100644
index 0000000..0165c2c
--- /dev/null
+++ b/src/main/java/WEB-INF/beans.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://java.sun.com/xml/ns/javaee"
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="
+      http://java.sun.com/xml/ns/javaee 
+      http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
+      
+      <!-- This file is necessary for CDI to work on JEE6 containers -->
+      
+</beans>
\ No newline at end of file
diff --git a/src/main/java/WEB-INF/web.xml b/src/main/java/WEB-INF/web.xml
index 13f612e..2a570e3 100644
--- a/src/main/java/WEB-INF/web.xml
+++ b/src/main/java/WEB-INF/web.xml
@@ -1,361 +1,35 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<web-app version="2.4"
-	xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
-
-	<!-- The base folder is used to specify the root location of your Gitblit data.
-	
-			${baseFolder}/gitblit.properties
-			${baseFolder}/users.conf
-			${baseFolder}/projects.conf
-			${baseFolder}/robots.txt
-			${baseFolder}/git
-			${baseFolder}/groovy
-			${baseFolder}/groovy/grape
-			${baseFolder}/proposals
-
-		By default, this location is WEB-INF/data.  It is recommended to set this
-		path to a location outside your webapps folder that is writable by your
-		servlet container.  Gitblit will copy the WEB-INF/data files to that
-		location for you when it restarts.  This approach makes upgrading simpler.
-		All you have to do is set this parameter for the new release and then
-		review the defaults for any new settings.  Settings are always versioned
-		with a SINCE x.y.z attribute and also noted in the release changelog.
-		-->
-	<env-entry>
-		<description>The base folder is used to specify the root location of your Gitblit data.</description>
-		<env-entry-name>baseFolder</env-entry-name>
-		<env-entry-type>java.lang.String</env-entry-type>
-		<env-entry-value>${contextFolder}/WEB-INF/data</env-entry-value>
-	</env-entry>
-	
-	<!-- Gitblit Displayname -->
-	<display-name>Gitblit - @gb.version@</display-name>
-
-	 
-<!-- Gitblit Context Listener --><!-- STRIP	 
-	<listener>
- 		<listener-class>com.gitblit.servlet.GitblitContext</listener-class>
- 	</listener>STRIP --> 	
-	
-	
-	<!-- Git Servlet
-		 <url-pattern> MUST match: 
-			* GitFilter
-			* com.gitblit.Constants.GIT_PATH
-			* Wicket Filter ignorePaths parameter -->
-	<servlet>
-		<servlet-name>GitServlet</servlet-name>
-		<servlet-class>com.gitblit.servlet.GitServlet</servlet-class>
-	</servlet>
-	<servlet-mapping>
-		<servlet-name>GitServlet</servlet-name>		
-		<url-pattern>/git/*</url-pattern>
-	</servlet-mapping>
-	<servlet-mapping>
-		<servlet-name>GitServlet</servlet-name>		
-		<url-pattern>/r/*</url-pattern>
-	</servlet-mapping>
-
-	
-	<!-- SparkleShare Invite Servlet
-		 <url-pattern> MUST match: 
-			* com.gitblit.Constants.SPARKLESHARE_INVITE_PATH
-			* Wicket Filter ignorePaths parameter -->
-	<servlet>
-		<servlet-name>SparkleShareInviteServlet</servlet-name>
-		<servlet-class>com.gitblit.servlet.SparkleShareInviteServlet</servlet-class>
-	</servlet>
-	<servlet-mapping>
-		<servlet-name>SparkleShareInviteServlet</servlet-name>		
-		<url-pattern>/sparkleshare/*</url-pattern>
-	</servlet-mapping>
-
-	
-	<!-- Syndication Servlet
-		 <url-pattern> MUST match: 
-			* SyndicationFilter
-			* com.gitblit.Constants.SYNDICATION_PATH
-			* Wicket Filter ignorePaths parameter -->
-	<servlet>
-		<servlet-name>SyndicationServlet</servlet-name>
-		<servlet-class>com.gitblit.servlet.SyndicationServlet</servlet-class>		
-	</servlet>
-	<servlet-mapping>
-		<servlet-name>SyndicationServlet</servlet-name>
-		<url-pattern>/feed/*</url-pattern>
-	</servlet-mapping>
-	
-	
-	<!-- Zip Servlet
-		 <url-pattern> MUST match: 
-			* ZipServlet
-			* com.gitblit.Constants.ZIP_PATH
-			* Wicket Filter ignorePaths parameter -->
-	<servlet>
-		<servlet-name>ZipServlet</servlet-name>
-		<servlet-class>com.gitblit.servlet.DownloadZipServlet</servlet-class>		
-	</servlet>
-	<servlet-mapping>
-		<servlet-name>ZipServlet</servlet-name>
-		<url-pattern>/zip/*</url-pattern>
-	</servlet-mapping>
-	
-	
-	<!-- Federation Servlet
-		 <url-pattern> MUST match: 
-		 	* com.gitblit.Constants.FEDERATION_PATH		 
-			* Wicket Filter ignorePaths parameter -->
-	<servlet>
-		<servlet-name>FederationServlet</servlet-name>
-		<servlet-class>com.gitblit.servlet.FederationServlet</servlet-class>		
-	</servlet>
-	<servlet-mapping>
-		<servlet-name>FederationServlet</servlet-name>
-		<url-pattern>/federation/*</url-pattern>
-	</servlet-mapping>	
-	
-	
-	<!-- Rpc Servlet
-		 <url-pattern> MUST match: 
-		 	* com.gitblit.Constants.RPC_PATH		 
-			* Wicket Filter ignorePaths parameter -->
-	<servlet>
-		<servlet-name>RpcServlet</servlet-name>
-		<servlet-class>com.gitblit.servlet.RpcServlet</servlet-class>		
-	</servlet>
-	<servlet-mapping>
-		<servlet-name>RpcServlet</servlet-name>
-		<url-pattern>/rpc/*</url-pattern>
-	</servlet-mapping>	
-
-
-	<!-- Raw Servlet
-		 <url-pattern> MUST match: 
-			* RawFilter
-			* com.gitblit.Constants.RAW_PATH
-			* Wicket Filter ignorePaths parameter -->
-	<servlet>
-		<servlet-name>RawServlet</servlet-name>
-		<servlet-class>com.gitblit.servlet.RawServlet</servlet-class>
-	</servlet>
-	<servlet-mapping>
-		<servlet-name>RawServlet</servlet-name>		
-		<url-pattern>/raw/*</url-pattern>
-	</servlet-mapping>	
-
-
-	<!-- Pages Servlet
-		 <url-pattern> MUST match: 
-			* PagesFilter
-			* com.gitblit.Constants.PAGES_PATH
-			* Wicket Filter ignorePaths parameter -->
-	<servlet>
-		<servlet-name>PagesServlet</servlet-name>
-		<servlet-class>com.gitblit.servlet.PagesServlet</servlet-class>
-	</servlet>
-	<servlet-mapping>
-		<servlet-name>PagesServlet</servlet-name>		
-		<url-pattern>/pages/*</url-pattern>
-	</servlet-mapping>	
-
-	
-	<!-- Logo Servlet
-		 <url-pattern> MUST match: 
-			* Wicket Filter ignorePaths parameter -->
-	<servlet>
-		<servlet-name>LogoServlet</servlet-name>
-		<servlet-class>com.gitblit.servlet.LogoServlet</servlet-class>
-	</servlet>
-	<servlet-mapping>
-		<servlet-name>LogoServlet</servlet-name>		
-		<url-pattern>/logo.png</url-pattern>
-	</servlet-mapping>
-
-
-	<!-- PT Servlet
-		 <url-pattern> MUST match: 
-			* Wicket Filter ignorePaths parameter -->
-	<servlet>
-		<servlet-name>PtServlet</servlet-name>
-		<servlet-class>com.gitblit.servlet.PtServlet</servlet-class>
-	</servlet>
-	<servlet-mapping>
-		<servlet-name>PtServlet</servlet-name>		
-		<url-pattern>/pt</url-pattern>
-	</servlet-mapping>
-
-
-	<!-- Branch Graph Servlet
-		 <url-pattern> MUST match: 
-			* Wicket Filter ignorePaths parameter -->
-	<servlet>
-		<servlet-name>BranchGraphServlet</servlet-name>
-		<servlet-class>com.gitblit.servlet.BranchGraphServlet</servlet-class>
-	</servlet>
-	<servlet-mapping>
-		<servlet-name>BranchGraphServlet</servlet-name>		
-		<url-pattern>/graph/*</url-pattern>
-	</servlet-mapping>
-
-	<!-- Robots.txt Servlet
-		 <url-pattern> MUST match: 
-			* Wicket Filter ignorePaths parameter -->
-	<servlet>
-		<servlet-name>RobotsTxtServlet</servlet-name>
-		<servlet-class>com.gitblit.servlet.RobotsTxtServlet</servlet-class>
-	</servlet>
-	<servlet-mapping>
-		<servlet-name>RobotsTxtServlet</servlet-name>		
-		<url-pattern>/robots.txt</url-pattern>
-	</servlet-mapping>
-
-    <filter>
-		<filter-name>ProxyFilter</filter-name>
-		<filter-class>com.gitblit.servlet.ProxyFilter</filter-class>
-	</filter>
-	<filter-mapping>
-		<filter-name>ProxyFilter</filter-name>
-		<url-pattern>/*</url-pattern>
-	</filter-mapping>
-	
-	<!-- Git Access Restriction Filter
-		 <url-pattern> MUST match: 
-			* GitServlet
-			* com.gitblit.Constants.GIT_PATH
-			* Wicket Filter ignorePaths parameter -->
-	<filter>
-		<filter-name>GitFilter</filter-name>
-		<filter-class>com.gitblit.servlet.GitFilter</filter-class>
-	</filter>
-	<filter-mapping>
-		<filter-name>GitFilter</filter-name>
-		<url-pattern>/git/*</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>GitFilter</filter-name>
-		<url-pattern>/r/*</url-pattern>
-	</filter-mapping>
-	
-	
-	<!-- Syndication Restriction Filter
-		 <url-pattern> MUST match: 
-			* SyndicationServlet
-			* com.gitblit.Constants.SYNDICATION_PATH
-			* Wicket Filter ignorePaths parameter -->
-	<filter>
-		<filter-name>SyndicationFilter</filter-name>
-		<filter-class>com.gitblit.servlet.SyndicationFilter</filter-class>
-	</filter>
-	<filter-mapping>
-		<filter-name>SyndicationFilter</filter-name>
-		<url-pattern>/feed/*</url-pattern>
-	</filter-mapping>
-	
-	
-	<!-- Download Zip Restriction Filter
-		 <url-pattern> MUST match: 
-			* DownloadZipServlet
-			* com.gitblit.Constants.ZIP_PATH
-			* Wicket Filter ignorePaths parameter -->
-	<filter>
-		<filter-name>ZipFilter</filter-name>
-		<filter-class>com.gitblit.servlet.DownloadZipFilter</filter-class>
-	</filter>
-	<filter-mapping>
-		<filter-name>ZipFilter</filter-name>
-		<url-pattern>/zip/*</url-pattern>
-	</filter-mapping>
-
-		
-	<!-- Rpc Restriction Filter
-		 <url-pattern> MUST match: 
-			* RpcServlet
-			* com.gitblit.Constants.RPC_PATH
-			* Wicket Filter ignorePaths parameter -->
-	<filter>
-		<filter-name>RpcFilter</filter-name>
-		<filter-class>com.gitblit.servlet.RpcFilter</filter-class>
-	</filter>
-	<filter-mapping>
-		<filter-name>RpcFilter</filter-name>
-		<url-pattern>/rpc/*</url-pattern>
-	</filter-mapping>
-
-
-	<!-- Branch Restriction Filter
-		 <url-pattern> MUST match: 
-			* RawServlet
-			* com.gitblit.Constants.BRANCH_PATH
-			* Wicket Filter ignorePaths parameter -->
-	<filter>
-		<filter-name>RawFilter</filter-name>
-		<filter-class>com.gitblit.servlet.RawFilter</filter-class>
-	</filter>
-	<filter-mapping>
-		<filter-name>RawFilter</filter-name>
-		<url-pattern>/raw/*</url-pattern>
-	</filter-mapping>
-	
-
-	<!-- Pages Restriction Filter
-		 <url-pattern> MUST match: 
-			* PagesServlet
-			* com.gitblit.Constants.PAGES_PATH
-			* Wicket Filter ignorePaths parameter -->
-	<filter>
-		<filter-name>PagesFilter</filter-name>
-		<filter-class>com.gitblit.servlet.PagesFilter</filter-class>
-	</filter>
-	<filter-mapping>
-		<filter-name>PagesFilter</filter-name>
-		<url-pattern>/pages/*</url-pattern>
-	</filter-mapping>
-	
-	<filter>
-		<filter-name>EnforceAuthenticationFilter</filter-name>
-		<filter-class>com.gitblit.servlet.EnforceAuthenticationFilter</filter-class>
-	</filter>
-	<filter-mapping>
-        <filter-name>EnforceAuthenticationFilter</filter-name>
-        <url-pattern>/*</url-pattern>
-    </filter-mapping>
-
-
-	<!-- Wicket Filter -->
-    <filter>
-        <filter-name>wicketFilter</filter-name>
-        <filter-class>
-            com.gitblit.wicket.GitblitWicketFilter
-        </filter-class>        
-        <init-param>
-            <param-name>ignorePaths</param-name>
-            <!-- Paths should match 
-             	* SyndicationFilter <url-pattern>
-             	* SyndicationServlet <url-pattern>
-             	* com.gitblit.Constants.SYNDICATION_PATH
-             	* GitFilter <url-pattern>
-             	* GitServlet <url-pattern>
-             	* com.gitblit.Constants.GIT_PATH
-             	* SparkleshareInviteServlet <url-pattern>
-             	* com.gitblit.Constants.SPARKLESHARE_INVITE_PATH
-             	* Zipfilter <url-pattern>
-             	* ZipServlet <url-pattern>
-             	* com.gitblit.Constants.ZIP_PATH
-             	* FederationServlet <url-pattern>
-             	* RpcFilter <url-pattern>
-             	* RpcServlet <url-pattern>
-             	* RawFilter <url-pattern>
-             	* RawServlet <url-pattern>
-             	* PagesFilter <url-pattern>
-             	* PagesServlet <url-pattern>
-             	* com.gitblit.Constants.PAGES_PATH -->
-            <param-value>r/,git/,pt,feed/,zip/,federation/,rpc/,raw/,pages/,robots.txt,logo.png,graph/,sparkleshare/</param-value>
-        </init-param>
-    </filter>
-    <filter-mapping>
-        <filter-name>wicketFilter</filter-name>
-        <url-pattern>/*</url-pattern>
-    </filter-mapping>
-    
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app version="3.0"
+	xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3_0.xsd">
+
+	<!-- The base folder is used to specify the root location of your Gitblit data.
+	
+			${baseFolder}/gitblit.properties
+			${baseFolder}/users.conf
+			${baseFolder}/projects.conf
+			${baseFolder}/robots.txt
+			${baseFolder}/git
+			${baseFolder}/groovy
+			${baseFolder}/groovy/grape
+			${baseFolder}/proposals
+
+		By default, this location is WEB-INF/data.  It is recommended to set this
+		path to a location outside your webapps folder that is writable by your
+		servlet container.  Gitblit will copy the WEB-INF/data files to that
+		location for you when it restarts.  This approach makes upgrading simpler.
+		All you have to do is set this parameter for the new release and then
+		review the defaults for any new settings.  Settings are always versioned
+		with a SINCE x.y.z attribute and also noted in the release changelog.
+		-->
+	<env-entry>
+		<description>The base folder is used to specify the root location of your Gitblit data.</description>
+		<env-entry-name>baseFolder</env-entry-name>
+		<env-entry-type>java.lang.String</env-entry-type>
+		<env-entry-value>${contextFolder}/WEB-INF/data</env-entry-value>
+	</env-entry>
+	
+	<!-- Gitblit Displayname -->
+	<display-name>Gitblit - @gb.version@</display-name>
+
 </web-app>
\ No newline at end of file
diff --git a/src/main/java/com/gitblit/Constants.java b/src/main/java/com/gitblit/Constants.java
index 8d6e249..279d3c9 100644
--- a/src/main/java/com/gitblit/Constants.java
+++ b/src/main/java/com/gitblit/Constants.java
@@ -70,6 +70,8 @@
 
 	public static final String RAW_PATH = "/raw/";
 
+	public static final String PT_PATH = "/pt";
+
 	public static final String BRANCH_GRAPH_PATH = "/graph/";
 
 	public static final String BORDER = "*****************************************************************";
diff --git a/src/main/java/com/gitblit/DaggerModule.java b/src/main/java/com/gitblit/DaggerModule.java
index 6ad3fe6..aa10198 100644
--- a/src/main/java/com/gitblit/DaggerModule.java
+++ b/src/main/java/com/gitblit/DaggerModule.java
@@ -34,12 +34,33 @@
 import com.gitblit.manager.RepositoryManager;
 import com.gitblit.manager.RuntimeManager;
 import com.gitblit.manager.UserManager;
+import com.gitblit.servlet.BranchGraphServlet;
+import com.gitblit.servlet.DownloadZipFilter;
+import com.gitblit.servlet.DownloadZipServlet;
+import com.gitblit.servlet.EnforceAuthenticationFilter;
+import com.gitblit.servlet.FederationServlet;
+import com.gitblit.servlet.GitFilter;
+import com.gitblit.servlet.GitServlet;
+import com.gitblit.servlet.LogoServlet;
+import com.gitblit.servlet.PagesFilter;
+import com.gitblit.servlet.PagesServlet;
+import com.gitblit.servlet.ProxyFilter;
+import com.gitblit.servlet.PtServlet;
+import com.gitblit.servlet.RawFilter;
+import com.gitblit.servlet.RawServlet;
+import com.gitblit.servlet.RobotsTxtServlet;
+import com.gitblit.servlet.RpcFilter;
+import com.gitblit.servlet.RpcServlet;
+import com.gitblit.servlet.SparkleShareInviteServlet;
+import com.gitblit.servlet.SyndicationFilter;
+import com.gitblit.servlet.SyndicationServlet;
 import com.gitblit.transport.ssh.FileKeyManager;
 import com.gitblit.transport.ssh.IPublicKeyManager;
 import com.gitblit.transport.ssh.MemoryKeyManager;
 import com.gitblit.transport.ssh.NullKeyManager;
 import com.gitblit.utils.StringUtils;
 import com.gitblit.wicket.GitBlitWebApp;
+import com.gitblit.wicket.GitblitWicketFilter;
 
 import dagger.Module;
 import dagger.Provides;
@@ -70,7 +91,30 @@
 			IGitblit.class,
 
 			// the Gitblit Wicket app
-			GitBlitWebApp.class
+			GitBlitWebApp.class,
+
+			// filters & servlets
+			GitServlet.class,
+			GitFilter.class,
+			RawServlet.class,
+			RawFilter.class,
+			PagesServlet.class,
+			PagesFilter.class,
+			RpcServlet.class,
+			RpcFilter.class,
+			DownloadZipServlet.class,
+			DownloadZipFilter.class,
+			SyndicationServlet.class,
+			SyndicationFilter.class,
+			FederationServlet.class,
+			SparkleShareInviteServlet.class,
+			BranchGraphServlet.class,
+			RobotsTxtServlet.class,
+			LogoServlet.class,
+			PtServlet.class,
+			ProxyFilter.class,
+			EnforceAuthenticationFilter.class,
+			GitblitWicketFilter.class
 		}
 )
 public class DaggerModule {
@@ -212,4 +256,289 @@
 				federationManager,
 				gitblit);
 	}
+//
+//	@Provides @Singleton GitblitWicketFilter provideGitblitWicketFilter(GitBlitWebApp webapp) {
+//		return new GitblitWicketFilter(webapp);
+//	}
+//
+//	@Provides GitServlet provideGitServlet(IGitblit gitblit) {
+//		return new GitServlet(gitblit);
+//	}
+//
+//	@Provides GitFilter provideGitFilter(
+//			IRuntimeManager runtimeManager,
+//			IUserManager userManager,
+//			IAuthenticationManager authenticationManager,
+//			IRepositoryManager repositoryManager,
+//			IFederationManager federationManager) {
+//
+//		return new GitFilter(
+//				runtimeManager,
+//				userManager,
+//				authenticationManager,
+//				repositoryManager,
+//				federationManager);
+//	}
+//
+//	@Provides @Singleton PagesServlet providePagesServlet(
+//			IRuntimeManager runtimeManager,
+//			IRepositoryManager repositoryManager) {
+//
+//		return new PagesServlet(runtimeManager, repositoryManager);
+//	}
+//
+//	@Provides @Singleton PagesFilter providePagesFilter(
+//			IRuntimeManager runtimeManager,
+//			IAuthenticationManager authenticationManager,
+//			IRepositoryManager repositoryManager) {
+//
+//		return new PagesFilter(
+//				runtimeManager,
+//				authenticationManager,
+//				repositoryManager);
+//	}
+//
+//	@Provides @Singleton RpcServlet provideRpcServlet(IGitblit gitblit) {
+//		return new RpcServlet(gitblit);
+//	}
+//
+//	@Provides @Singleton RpcFilter provideRpcFilter(
+//			IRuntimeManager runtimeManager,
+//			IAuthenticationManager authenticationManager) {
+//
+//		return new RpcFilter(runtimeManager, authenticationManager);
+//	}
+//
+//	@Provides @Singleton DownloadZipServlet provideDownloadZipServlet(
+//			IRuntimeManager runtimeManager,
+//			IRepositoryManager repositoryManager) {
+//
+//		return new DownloadZipServlet(runtimeManager, repositoryManager);
+//	}
+//
+//	@Provides @Singleton DownloadZipFilter provideDownloadZipFilter(
+//			IRuntimeManager runtimeManager,
+//			IAuthenticationManager authenticationManager,
+//			IRepositoryManager repositoryManager) {
+//
+//		return new DownloadZipFilter(
+//				runtimeManager,
+//				authenticationManager,
+//				repositoryManager);
+//	}
+//
+//	@Provides @Singleton SyndicationServlet provideSyndicationServlet(
+//			IRuntimeManager runtimeManager,
+//			IRepositoryManager repositoryManager,
+//			IProjectManager projectManager) {
+//
+//		return new SyndicationServlet(
+//				runtimeManager,
+//				repositoryManager,
+//				projectManager);
+//	}
+//
+//	@Provides @Singleton SyndicationFilter provideSyndicationFilter(
+//			IRuntimeManager runtimeManager,
+//			IAuthenticationManager authenticationManager,
+//			IRepositoryManager repositoryManager,
+//			IProjectManager projectManager) {
+//
+//		return new SyndicationFilter(
+//				runtimeManager,
+//				authenticationManager,
+//				repositoryManager,
+//				projectManager);
+//	}
+//
+//	@Provides @Singleton FederationServlet provideFederationServlet(
+//			IRuntimeManager runtimeManager,
+//			IUserManager userManager,
+//			IRepositoryManager repositoryManager,
+//			IFederationManager federationManager) {
+//
+//		return new FederationServlet(
+//				runtimeManager,
+//				userManager,
+//				repositoryManager,
+//				federationManager);
+//	}
+//
+//	@Provides @Singleton SparkleShareInviteServlet provideSparkleshareInviteServlet(
+//			IRuntimeManager runtimeManager,
+//			IUserManager userManager,
+//			IAuthenticationManager authenticationManager,
+//			IRepositoryManager repositoryManager) {
+//
+//		return new SparkleShareInviteServlet(
+//				runtimeManager,
+//				userManager,
+//				authenticationManager,
+//				repositoryManager);
+//	}
+//
+//	@Provides @Singleton BranchGraphServlet provideBranchGraphServlet(
+//			IRuntimeManager runtimeManager,
+//			IRepositoryManager repositoryManager) {
+//
+//		return new BranchGraphServlet(runtimeManager, repositoryManager);
+//	}
+//
+//	@Provides @Singleton RobotsTxtServlet provideRobotsTxtServlet(IRuntimeManager runtimeManager) {
+//		return new RobotsTxtServlet(runtimeManager);
+//	}
+//
+//	@Provides @Singleton LogoServlet provideLogoServlet(IRuntimeManager runtimeManager) {
+//		return new LogoServlet(runtimeManager);
+//	}
+//
+//	@Provides @Singleton EnforceAuthenticationFilter provideEnforceAuthenticationFilter(
+//			IRuntimeManager runtimeManager,
+//			IAuthenticationManager authenticationManager) {
+//
+//		return new EnforceAuthenticationFilter(runtimeManager, authenticationManager);
+//	}
+
+
+	@Provides @Singleton GitblitWicketFilter provideGitblitWicketFilter(GitBlitWebApp webapp) {
+		return new GitblitWicketFilter();
+	}
+
+	@Provides GitServlet provideGitServlet(IGitblit gitblit) {
+		return new GitServlet();
+	}
+
+	@Provides GitFilter provideGitFilter(
+			IRuntimeManager runtimeManager,
+			IUserManager userManager,
+			IAuthenticationManager authenticationManager,
+			IRepositoryManager repositoryManager,
+			IFederationManager federationManager) {
+
+		return new GitFilter();
+	}
+
+	@Provides @Singleton RawServlet provideRawServlet(
+			IRuntimeManager runtimeManager,
+			IRepositoryManager repositoryManager) {
+
+		return new RawServlet();
+	}
+
+	@Provides @Singleton RawFilter provideRawFilter(
+			IRuntimeManager runtimeManager,
+			IAuthenticationManager authenticationManager,
+			IRepositoryManager repositoryManager) {
+
+		return new RawFilter();
+	}
+
+	@Provides @Singleton PagesServlet providePagesServlet(
+			IRuntimeManager runtimeManager,
+			IRepositoryManager repositoryManager) {
+
+		return new PagesServlet();
+	}
+
+	@Provides @Singleton PagesFilter providePagesFilter(
+			IRuntimeManager runtimeManager,
+			IAuthenticationManager authenticationManager,
+			IRepositoryManager repositoryManager) {
+
+		return new PagesFilter();
+	}
+
+	@Provides @Singleton RpcServlet provideRpcServlet(IGitblit gitblit) {
+		return new RpcServlet();
+	}
+
+	@Provides @Singleton RpcFilter provideRpcFilter(
+			IRuntimeManager runtimeManager,
+			IAuthenticationManager authenticationManager) {
+
+		return new RpcFilter();
+	}
+
+	@Provides @Singleton DownloadZipServlet provideDownloadZipServlet(
+			IRuntimeManager runtimeManager,
+			IRepositoryManager repositoryManager) {
+
+		return new DownloadZipServlet();
+	}
+
+	@Provides @Singleton DownloadZipFilter provideDownloadZipFilter(
+			IRuntimeManager runtimeManager,
+			IAuthenticationManager authenticationManager,
+			IRepositoryManager repositoryManager) {
+
+		return new DownloadZipFilter();
+	}
+
+	@Provides @Singleton SyndicationServlet provideSyndicationServlet(
+			IRuntimeManager runtimeManager,
+			IRepositoryManager repositoryManager,
+			IProjectManager projectManager) {
+
+		return new SyndicationServlet();
+	}
+
+	@Provides @Singleton SyndicationFilter provideSyndicationFilter(
+			IRuntimeManager runtimeManager,
+			IAuthenticationManager authenticationManager,
+			IRepositoryManager repositoryManager,
+			IProjectManager projectManager) {
+
+		return new SyndicationFilter();
+	}
+
+	@Provides @Singleton FederationServlet provideFederationServlet(
+			IRuntimeManager runtimeManager,
+			IUserManager userManager,
+			IRepositoryManager repositoryManager,
+			IFederationManager federationManager) {
+
+		return new FederationServlet();
+	}
+
+	@Provides @Singleton SparkleShareInviteServlet provideSparkleshareInviteServlet(
+			IRuntimeManager runtimeManager,
+			IUserManager userManager,
+			IAuthenticationManager authenticationManager,
+			IRepositoryManager repositoryManager) {
+
+		return new SparkleShareInviteServlet();
+	}
+
+	@Provides @Singleton BranchGraphServlet provideBranchGraphServlet(
+			IRuntimeManager runtimeManager,
+			IRepositoryManager repositoryManager) {
+
+		return new BranchGraphServlet();
+	}
+
+	@Provides @Singleton RobotsTxtServlet provideRobotsTxtServlet(IRuntimeManager runtimeManager) {
+		return new RobotsTxtServlet();
+	}
+
+	@Provides @Singleton LogoServlet provideLogoServlet(IRuntimeManager runtimeManager) {
+		return new LogoServlet();
+	}
+
+	@Provides @Singleton PtServlet providePtServlet(IRuntimeManager runtimeManager) {
+		return new PtServlet();
+	}
+
+	@Provides @Singleton ProxyFilter provideProxyFilter(
+			IRuntimeManager runtimeManager,
+			IAuthenticationManager authenticationManager) {
+
+		return new ProxyFilter();
+	}
+
+	@Provides @Singleton EnforceAuthenticationFilter provideEnforceAuthenticationFilter(
+			IRuntimeManager runtimeManager,
+			IAuthenticationManager authenticationManager) {
+
+		return new EnforceAuthenticationFilter();
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/com/gitblit/dagger/DaggerContext.java b/src/main/java/com/gitblit/dagger/DaggerContext.java
index 0e6a3fc..ef57080 100644
--- a/src/main/java/com/gitblit/dagger/DaggerContext.java
+++ b/src/main/java/com/gitblit/dagger/DaggerContext.java
@@ -17,11 +17,12 @@
 
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.gitblit.servlet.InjectionContextListener;
+
 import dagger.ObjectGraph;
 
 /**
@@ -31,7 +32,7 @@
  * @author James Moger
  *
  */
-public abstract class DaggerContext implements ServletContextListener {
+public abstract class DaggerContext extends InjectionContextListener {
 
 	public static final String INJECTOR_NAME = ObjectGraph.class.getName();
 
@@ -58,6 +59,23 @@
 		return (ObjectGraph) o;
 	}
 
+	/**
+	 * Instantiates an object.
+	 *
+	 * @param clazz
+	 * @return the object
+	 */
+	@Override
+	protected <X> X instantiate(ServletContext context, Class<X> clazz) {
+		try {
+			ObjectGraph injector = getInjector(context);
+			return injector.get(clazz);
+		} catch (Throwable t) {
+			logger.error(null, t);
+		}
+		return null;
+	}
+
 	@Override
 	public final void contextDestroyed(ServletContextEvent contextEvent) {
 		ServletContext context = contextEvent.getServletContext();
diff --git a/src/main/java/com/gitblit/servlet/GitblitContext.java b/src/main/java/com/gitblit/servlet/GitblitContext.java
index d5b4092..ac54791 100644
--- a/src/main/java/com/gitblit/servlet/GitblitContext.java
+++ b/src/main/java/com/gitblit/servlet/GitblitContext.java
@@ -23,13 +23,15 @@
 import java.io.OutputStream;
 import java.text.MessageFormat;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
 import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
+import javax.servlet.annotation.WebListener;
 
 import com.gitblit.Constants;
 import com.gitblit.DaggerModule;
@@ -52,20 +54,22 @@
 import com.gitblit.transport.ssh.IPublicKeyManager;
 import com.gitblit.utils.ContainerUtils;
 import com.gitblit.utils.StringUtils;
+import com.gitblit.wicket.GitblitWicketFilter;
 
 import dagger.ObjectGraph;
 
 /**
  * This class is the main entry point for the entire webapp.  It is a singleton
  * created manually by Gitblit GO or dynamically by the WAR/Express servlet
- * container.  This class instantiates and starts all managers.  Servlets and
- * filters are instantiated defined in web.xml and instantiated by the servlet
- * container, but those servlets and filters use Dagger to manually inject their
- * dependencies.
+ * container.  This class instantiates and starts all managers.
+ *
+ * Servlets and filters are injected which allows Gitblit to be completely
+ * code-driven.
  *
  * @author James Moger
  *
  */
+@WebListener
 public class GitblitContext extends DaggerContext {
 
 	private static GitblitContext gitblit;
@@ -120,21 +124,10 @@
 	}
 
 	/**
-	 * Configure Gitblit from the web.xml, if no configuration has already been
-	 * specified.
-	 *
-	 * @see ServletContextListener.contextInitialize(ServletContextEvent)
-	 */
-	@Override
-	public final void contextInitialized(ServletContextEvent contextEvent) {
-		ServletContext context = contextEvent.getServletContext();
-		configureContext(context);
-	}
-
-	/**
 	 * Prepare runtime settings and start all manager instances.
 	 */
-	protected void configureContext(ServletContext context) {
+	@Override
+	protected void beforeServletInjection(ServletContext context) {
 		ObjectGraph injector = getInjector(context);
 
 		// create the runtime settings object
@@ -237,6 +230,41 @@
 	}
 
 	/**
+	 * Instantiate and inject all filters and servlets into the container using
+	 * the servlet 3 specification.
+	 */
+	@Override
+	protected void injectServlets(ServletContext context) {
+		// access restricted servlets
+		serve(context, Constants.R_PATH, GitServlet.class, GitFilter.class);
+		serve(context, Constants.GIT_PATH, GitServlet.class, GitFilter.class);
+		serve(context, Constants.RAW_PATH, RawServlet.class, RawFilter.class);
+		serve(context, Constants.PAGES, PagesServlet.class, PagesFilter.class);
+		serve(context, Constants.RPC_PATH, RpcServlet.class, RpcFilter.class);
+		serve(context, Constants.ZIP_PATH, DownloadZipServlet.class, DownloadZipFilter.class);
+		serve(context, Constants.SYNDICATION_PATH, SyndicationServlet.class, SyndicationFilter.class);
+
+		// servlets
+		serve(context, Constants.FEDERATION_PATH, FederationServlet.class);
+		serve(context, Constants.SPARKLESHARE_INVITE_PATH, SparkleShareInviteServlet.class);
+		serve(context, Constants.BRANCH_GRAPH_PATH, BranchGraphServlet.class);
+		serve(context, Constants.PT_PATH, PtServlet.class);
+		file(context, "/robots.txt", RobotsTxtServlet.class);
+		file(context, "/logo.png", LogoServlet.class);
+
+		// global filters
+		filter(context, "/*", ProxyFilter.class, null);
+		filter(context, "/*", EnforceAuthenticationFilter.class, null);
+
+		// Wicket
+		String toIgnore = StringUtils.flattenStrings(getRegisteredPaths(), ",");
+		Map<String, String> params = new HashMap<String, String>();
+		params.put(GitblitWicketFilter.FILTER_MAPPING_PARAM, "/*");
+		params.put(GitblitWicketFilter.IGNORE_PATHS_PARAM, toIgnore);
+		filter(context, "/*", GitblitWicketFilter.class, params);
+	}
+
+	/**
 	 * Gitblit is being shutdown either because the servlet container is
 	 * shutting down or because the servlet container is re-deploying Gitblit.
 	 */
diff --git a/src/main/java/com/gitblit/servlet/InjectionContextListener.java b/src/main/java/com/gitblit/servlet/InjectionContextListener.java
new file mode 100644
index 0000000..17de6da
--- /dev/null
+++ b/src/main/java/com/gitblit/servlet/InjectionContextListener.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright 2014 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.servlet;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.DispatcherType;
+import javax.servlet.Filter;
+import javax.servlet.FilterRegistration;
+import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.ServletRegistration;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Injection context listener instantiates and injects servlets, filters, and
+ * anything else you might want into a servlet context.  This class provides
+ * convenience methods for servlet & filter registration and also tracks
+ * registered paths.
+ *
+ * @author James Moger
+ *
+ */
+public abstract class InjectionContextListener implements ServletContextListener {
+
+	protected final Logger logger = LoggerFactory.getLogger(getClass());
+
+	private final List<String> registeredPaths = new ArrayList<String>();
+
+	protected final List<String> getRegisteredPaths() {
+		return registeredPaths;
+	}
+
+	/**
+	 * Hook for subclasses to manipulate context initialization before
+	 * standard initialization procedure.
+	 *
+	 * @param context
+	 */
+	protected void beforeServletInjection(ServletContext context) {
+		// NOOP
+	}
+
+	/**
+	 * Hook for subclasses to instantiate and inject servlets and filters
+	 * into the servlet context.
+	 *
+	 * @param context
+	 */
+	protected abstract void injectServlets(ServletContext context);
+
+	/**
+	 * Hook for subclasses to manipulate context initialization after
+	 * servlet registration.
+	 *
+	 * @param context
+	 */
+	protected void afterServletInjection(ServletContext context) {
+		// NOOP
+	}
+
+	/**
+	 * Configure Gitblit from the web.xml, if no configuration has already been
+	 * specified.
+	 *
+	 * @see ServletContextListener.contextInitialize(ServletContextEvent)
+	 */
+	@Override
+	public final void contextInitialized(ServletContextEvent contextEvent) {
+		ServletContext context = contextEvent.getServletContext();
+		beforeServletInjection(context);
+		injectServlets(context);
+		afterServletInjection(context);
+	}
+
+
+	/**
+	 * Registers a file path.
+	 *
+	 * @param context
+	 * @param file
+	 * @param servletClass
+	 */
+	protected void file(ServletContext context, String file, Class<? extends Servlet> servletClass) {
+		file(context, file, servletClass, null);
+	}
+
+	/**
+	 * Registers a file path with init parameters.
+	 *
+	 * @param context
+	 * @param file
+	 * @param servletClass
+	 * @param initParams
+	 */
+	protected void file(ServletContext context, String file, Class<? extends Servlet> servletClass, Map<String, String> initParams) {
+		Servlet servlet = instantiate(context, servletClass);
+		ServletRegistration.Dynamic d = context.addServlet(sanitize(servletClass.getSimpleName() + file), servlet);
+		d.addMapping(file);
+		if (initParams != null) {
+			d.setInitParameters(initParams);
+		}
+		registeredPaths.add(file);
+	}
+
+	/**
+	 * Serves a path (trailing wildcard will be appended).
+	 *
+	 * @param context
+	 * @param route
+	 * @param servletClass
+	 */
+	protected void serve(ServletContext context, String route, Class<? extends Servlet> servletClass) {
+		serve(context, route, servletClass, (Class<Filter>) null);
+	}
+
+	/**
+	 * Serves a path (trailing wildcard will be appended) with init parameters.
+	 *
+	 * @param context
+	 * @param route
+	 * @param servletClass
+	 * @param initParams
+	 */
+	protected void serve(ServletContext context, String route, Class<? extends Servlet> servletClass, Map<String, String> initParams) {
+		Servlet servlet = instantiate(context, servletClass);
+		ServletRegistration.Dynamic d = context.addServlet(sanitize(servletClass.getSimpleName() + route), servlet);
+		d.addMapping(route + "*");
+		if (initParams != null) {
+			d.setInitParameters(initParams);
+		}
+		registeredPaths.add(route);
+	}
+
+	/**
+	 * Serves a path (trailing wildcard will be appended) and also maps a filter
+	 * to that path.
+	 *
+	 * @param context
+	 * @param route
+	 * @param servletClass
+	 * @param filterClass
+	 */
+	protected void serve(ServletContext context, String route, Class<? extends Servlet> servletClass, Class<? extends Filter> filterClass) {
+		Servlet servlet = instantiate(context, servletClass);
+		ServletRegistration.Dynamic d = context.addServlet(sanitize(servletClass.getSimpleName() + route), servlet);
+		d.addMapping(route + "*");
+		if (filterClass != null) {
+			filter(context, route + "*", filterClass);
+		}
+		registeredPaths.add(route);
+	}
+
+	/**
+	 * Registers a path filter.
+	 *
+	 * @param context
+	 * @param route
+	 * @param filterClass
+	 */
+	protected void filter(ServletContext context, String route, Class<? extends Filter> filterClass) {
+		filter(context, route, filterClass, null);
+	}
+
+	/**
+	 * Registers a path filter with init parameters.
+	 *
+	 * @param context
+	 * @param route
+	 * @param filterClass
+	 * @param initParams
+	 */
+	protected void filter(ServletContext context, String route, Class<? extends Filter> filterClass, Map<String, String> initParams) {
+		Filter filter = instantiate(context, filterClass);
+		FilterRegistration.Dynamic d = context.addFilter(sanitize(filterClass.getSimpleName() + route), filter);
+		d.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, route);
+		if (initParams != null) {
+			d.setInitParameters(initParams);
+		}
+	}
+
+	/**
+	 * Limit the generated servlet/filter names to alpha-numeric values with a
+	 * handful of acceptable other characters.
+	 *
+	 * @param name
+	 * @return a sanitized name
+	 */
+	protected String sanitize(String name) {
+		StringBuilder sb = new StringBuilder();
+		for (char c : name.toCharArray()) {
+			if (Character.isLetterOrDigit(c)) {
+				sb.append(c);
+			} else if ('-' == c) {
+				sb.append(c);
+			} else if ('*' == c) {
+				sb.append("all");
+			} else if ('.' == c) {
+				sb.append('.');
+			} else {
+				sb.append('_');
+			}
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Instantiates an object.
+	 *
+	 * @param clazz
+	 * @return the object
+	 */
+	protected <X> X instantiate(ServletContext context, Class<X> clazz) {
+		try {
+			return clazz.newInstance();
+		} catch (Throwable t) {
+			logger.error(null, t);
+		}
+		return null;
+	}
+}
