Bump to GitBlit 1.7.0-SNAPSHOT

Change-Id: I11081a077aaad974ca20f29ab0be5d56d69846bb
diff --git a/README b/README
deleted file mode 100644
index 5f79157..0000000
--- a/README
+++ /dev/null
@@ -1,24 +0,0 @@
-GitBlit plugin
-==============
-
-In order to use GitBlit as GitWeb replacement, please apply
-the following configuration to your Gerrit config.
-(assuming plugin was copied as gitblit.jar)
-
-[gitweb]
-        type = custom
-        url = /plugins/gitblit/
-        linkname = gitblit
-        project = summary/${project}.git
-        revision = commit/${project}.git/${commit}
-        branch = log/${project}.git/${branch}
-        filehistory = history/${project}.git/${branch}/${file}
-
-How to build:
-
-gitblit.jar (optionally):
-1. clone GitBlit
-2. ant -DresourceFolderPrefix=static installMaven
-
-gerrit-gitblit-plugin:
-mvn package
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..6c6bec3
--- /dev/null
+++ b/README.md
@@ -0,0 +1,56 @@
+GitBlit plugin
+==============
+
+Overview
+--------
+Purpose of this plugin is to use Gitblit as web-based viewer
+(i.e. GitWeb replacement) on top of Gerrit Code Review.
+
+How to build
+------------
+As pre-requisites you need to make a custom-build of Gitblit
+and Wicket: the standard JARs downloaded from a public Maven
+repository aren't enough as they are missing some specific
+build parameters and constraints (i.e. shaded-jar) that are
+needed for a Gerrit plugin to work properly.
+
+### Wicket
+You need to clone and build a modified version of Wicket that
+is currently published on GitHub under the GerritCodeReview
+organisation: https://github.com/GerritCodeReview/wicket.git
+
+    $ git clone https://github.com/GerritCodeReview/wicket.git
+    $ git checkout wicket-1.4.23-gerrit
+    $ mvn clean install -DskipTests
+
+### Gitblit
+You need to clone Gitblit from GitHub and build it locally
+using the installMaven ANT target.
+
+    $ git clone https://github.com/gitblit/gitblit.git
+    $ git checkout develop
+    $ ant -DresourceFolderPrefix=static installMaven
+
+### Gitblit plugin
+You are ready now to clone and build the Gitblit plugin: the
+Wicket and Giblit dependencies will be taken from your local
+Maven repository.
+
+    $ mvn package
+
+Configuration
+-------------
+In order to use GitBlit as GitWeb replacement, please apply
+the following configuration to your Gerrit config.
+(assuming plugin was copied as gitblit.jar)
+
+    [gitweb]
+        type = custom
+        linkname = Gitblit
+        url = plugins/
+        revision = gitblit/commit/?r=${project}&h=${commit}
+        project = gitblit/summary/?r=${project}
+        branch = gitblit/log/?r=${project}&h=${branch}
+        filehistory = gitblit/history/?f=${file}&r=${project}&h=${branch}
+        file = gitblit/blob/?r=${project}&h=${commit}&f=${file}
+        roottree = gitblit/tree/?r=${project}&h=${commit}
diff --git a/pom.xml b/pom.xml
index 1bdabb7..7726835 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,103 +28,31 @@
     <Gerrit-InitStep>com.googlesource.gerrit.plugins.gitblit.GitBlitInitStep</Gerrit-InitStep>
     <Gerrit-Module>com.googlesource.gerrit.plugins.gitblit.GitBlitModule</Gerrit-Module>
     <Gerrit-HttpModule>com.googlesource.gerrit.plugins.gitblit.GitBlitServletModule</Gerrit-HttpModule>
+    <dagger.version>1.1.0</dagger.version>
+    <wicket.version>1.4.23-gerrit</wicket.version>
   </properties>
   <dependencies>
     <dependency>
       <groupId>com.google.gerrit</groupId>
       <artifactId>gerrit-plugin-api</artifactId>
       <version>${Gerrit-ApiVersion}</version>
+      <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>com.gitblit</groupId>
       <artifactId>gitblit</artifactId>
-      <version>1.4.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.wicket</groupId>
-      <artifactId>wicket-auth-roles</artifactId>
-      <version>1.4.21</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.wicket</groupId>
-      <artifactId>wicket-extensions</artifactId>
-      <version>1.4.21</version>
-    </dependency>
-    <dependency>
-      <groupId>org.wicketstuff</groupId>
-      <artifactId>googlecharts</artifactId>
-      <version>1.4.21</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpcore</artifactId>
-      <version>4.2.1</version>
-    </dependency>
-    <dependency>
-      <groupId>javax.mail</groupId>
-      <artifactId>mail</artifactId>
-      <version>1.4</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-net</groupId>
-      <artifactId>commons-net</artifactId>
-      <scope>provided</scope>
-      <version>3.1</version>
-    </dependency>
-      <dependency>
-        <groupId>commons-codec</groupId>
-        <artifactId>commons-codec</artifactId>
-        <version>1.6</version>
-      </dependency>
-    <dependency>
-      <groupId>org.codehaus.groovy</groupId>
-      <artifactId>groovy-all</artifactId>
-      <version>1.8.8</version>
-    </dependency>
-    <dependency>
-      <groupId>com.beust</groupId>
-      <artifactId>jcommander</artifactId>
-      <version>1.17</version>
-    </dependency>
-    <dependency>
-      <groupId>jdom</groupId>
-      <artifactId>jdom</artifactId>
-      <version>1.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>3.6.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-highlighter</artifactId>
-      <version>3.6.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-memory</artifactId>
-      <version>3.6.1</version>
-    </dependency>
-    <dependency>
-      <groupId>org.tautua.markdownpapers</groupId>
-      <artifactId>markdownpapers-core</artifactId>
-      <version>1.3.2</version>
-    </dependency>
-    <dependency>
-      <groupId>rome</groupId>
-      <artifactId>rome</artifactId>
-      <version>1.0-selfload</version>
-    </dependency>
-    <dependency>
-      <groupId>com.unboundid</groupId>
-      <artifactId>unboundid-ldapsdk</artifactId>
-      <version>2.3.0</version>
+      <version>1.7.0-SNAPSHOT</version>
+      <exclusions>
+        <exclusion>
+          <groupId>org.apache.wicket</groupId>
+          <artifactId>wicket</artifactId>
+        </exclusion>
+      </exclusions>
     </dependency>
     <dependency>
       <groupId>org.apache.wicket</groupId>
       <artifactId>wicket</artifactId>
-      <version>1.4.21-selfload</version>
+      <version>1.4.23-gerrit</version>
     </dependency>
   </dependencies>
   <build>
@@ -151,7 +79,6 @@
           <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
           <artifactSet>
             <excludes>
-              <exclude>com.google.gerrit:*</exclude>
               <exclude>org.bouncycastle:*</exclude>
               <exclude>org.slf4j:*</exclude>
               <exclude>com.google.guava:*</exclude>
@@ -161,6 +88,26 @@
               <exclude>com.googlecode.javaewah:*</exclude>
               <exclude>com.jcraft:*</exclude>
               <exclude>javax.servlet:*</exclude>
+              <exclude>org.apache.lucene:lucene-core</exclude>
+              <exclude>org.apache.lucene:lucene-analyzers-common</exclude>
+              <exclude>org.apache.lucene:lucene-queries</exclude>
+              <exclude>org.apache.lucene:lucene-queryparser</exclude>
+              <exclude>org.apache.sshd:*</exclude>
+              <exclude>org.apache.mina:*</exclude>
+              <exclude>org.bouncycastle:*</exclude>
+              <exclude>com.google.inject:*</exclude>
+              <exclude>com.google.inject.extensions:*</exclude>
+              <exclude>javax.inject:*</exclude>
+              <exclude>aopalliance:*</exclude>
+              <exclude>org.pegdown:*</exclude>
+              <exclude>org.parboiled:*</exclude>
+              <exclude>commons-io:commons-io</exclude>
+              <exclude>commons-codec:commons-codec</exclude>
+              <exclude>args4j:args4j</exclude>
+              <exclude>org.apache.commons:commons-compress</exclude>
+              <exclude>org.tukaani:xz</exclude>
+              <exclude>org.ow2.asm:*</exclude>
+              <exclude>org.eclipse.jetty:*</exclude>
             </excludes>
           </artifactSet>
           <transformers>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GerritGitBlitContext.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GerritGitBlitContext.java
new file mode 100644
index 0000000..6e3d101
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GerritGitBlitContext.java
@@ -0,0 +1,77 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// 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.googlesource.gerrit.plugins.gitblit;
+
+import javax.servlet.ServletContext;
+
+import com.gitblit.manager.IAuthenticationManager;
+import com.gitblit.manager.IGitblit;
+import com.gitblit.manager.INotificationManager;
+import com.gitblit.manager.IProjectManager;
+import com.gitblit.manager.IRepositoryManager;
+import com.gitblit.manager.IRuntimeManager;
+import com.gitblit.manager.IUserManager;
+import com.gitblit.servlet.GitblitContext;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+class GerritGitBlitContext extends GitblitContext {
+  private final SitePaths sitePaths;
+  private final IRuntimeManager runtime;
+  private final INotificationManager notificationManager;
+  private final IUserManager userManager;
+  private final IAuthenticationManager authenticationManager;
+  private final IRepositoryManager repositoryManager;
+  private final IProjectManager projectManager;
+  private final IGitblit gitblit;
+
+  @Inject
+  GerritGitBlitContext(SitePaths sitePaths, 
+      IRuntimeManager runtime,
+      INotificationManager notificationManager, 
+      IUserManager userManager,
+      IAuthenticationManager authenticationManager,
+      IRepositoryManager repositoryManager, 
+      IProjectManager projectManager,
+      IGitblit gitblit) {
+    this.sitePaths = sitePaths;
+    this.runtime = runtime;
+    this.notificationManager = notificationManager;
+    this.userManager = userManager;
+    this.authenticationManager = authenticationManager;
+    this.repositoryManager = repositoryManager;
+    this.projectManager = projectManager;
+    this.gitblit = gitblit;
+  }
+
+  void init(ServletContext context) {
+    // Manually configure IRuntimeManager
+    runtime.setBaseFolder(sitePaths.site_path);
+    runtime.getStatus().servletContainer = context.getServerInfo();
+    runtime.start();
+
+    // start all other managers
+    startManager(notificationManager);
+    startManager(userManager);
+    startManager(authenticationManager);
+    startManager(repositoryManager);
+    startManager(projectManager);
+    startManager(gitblit);
+
+    logger.info("All Gitblit managers started.");
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GerritWicketFilter.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GerritWicketFilter.java
index a9d0601..d6f5aeb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GerritWicketFilter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GerritWicketFilter.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2012 The Android Open Source Project
+// Copyright (C) 2014 The Android Open Source Project
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,68 +11,80 @@
 // 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.googlesource.gerrit.plugins.gitblit;
 
 import java.io.IOException;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.Set;
 import java.util.Vector;
 
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
 import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
 
-import org.apache.wicket.protocol.http.WicketFilter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.gitblit.Constants;
-import com.gitblit.GitBlit;
+import com.gitblit.IStoredSettings;
+import com.gitblit.manager.IProjectManager;
+import com.gitblit.manager.IRepositoryManager;
+import com.gitblit.manager.IRuntimeManager;
+import com.gitblit.wicket.GitBlitWebApp;
+import com.gitblit.wicket.GitblitWicketFilter;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.registration.DynamicItem;
 import com.google.gerrit.httpd.WebSession;
+import com.google.gerrit.server.config.SitePaths;
 import com.google.inject.Inject;
-import com.google.inject.Provider;
 import com.google.inject.Singleton;
-import com.googlesource.gerrit.plugins.gitblit.app.GerritGitBlit;
-import com.googlesource.gerrit.plugins.gitblit.app.GerritToGitBlitWebApp;
-import com.googlesource.gerrit.plugins.gitblit.app.GitBlitSettings;
 import com.googlesource.gerrit.plugins.gitblit.auth.GerritAuthFilter;
 
 @Singleton
-public class GerritWicketFilter extends WicketFilter {
+public class GerritWicketFilter extends GitblitWicketFilter {
   private static final Logger log = LoggerFactory
       .getLogger(GerritWicketFilter.class);
+  private static final Set<String> RESOURCES_SUFFIXES =
+      new ImmutableSet.Builder<String>().add("css", "js", "png", "gif", "ttf",
+          "swf", "afm", "eot", "otf", "scss", "svg", "woff").build();
 
-  private final Provider<WebSession> webSession;
-  @SuppressWarnings("unused")
-  // We need Guice to create the GerritGitBlit instance
-  private final GerritGitBlit gitBlit;
+  private final DynamicItem<WebSession> webSession;
+
   private final GerritAuthFilter gerritAuthFilter;
-  private final GitBlitSettings settings;
+
+  private final GerritGitBlitContext gerritGitblitContext;
 
   @Inject
   public GerritWicketFilter(
-      final Provider<WebSession> webSession, final GerritGitBlit gitBlit,
-      final GerritAuthFilter gerritAuthFilter, final GitBlitSettings settings) {
+      DynamicItem<WebSession> webSession,
+      GerritAuthFilter gerritAuthFilter,
+      GerritGitBlitContext gerritGitblitContext,
+      SitePaths sitePaths,
+      IStoredSettings settings,
+      IRuntimeManager runtimeManager,
+      IRepositoryManager repositoryManager,
+      IProjectManager projectManager,
+      GitBlitWebApp webapp) {
+    super(settings, runtimeManager, repositoryManager, projectManager, webapp);
     this.webSession = webSession;
-    this.gitBlit = gitBlit;
     this.gerritAuthFilter = gerritAuthFilter;
-    this.settings = settings;
+    this.gerritGitblitContext = gerritGitblitContext;
   }
 
   @Override
   public void init(FilterConfig filterConfig) throws ServletException {
+    ServletContext servletContext = filterConfig.getServletContext();
     showGitBlitBanner();
+    gerritGitblitContext.init(servletContext);
 
     try {
-      GitBlit.self().configureContext(settings, settings.getBasePath(),
-          false);
-      GitBlit.self().contextInitialized(
-          new ServletContextEvent(filterConfig.getServletContext()));
       super.init(new CustomFilterConfig(filterConfig));
     } catch (Exception e) {
       throw new ServletException(e);
@@ -102,8 +114,32 @@
   @Override
   public void doFilter(ServletRequest request, ServletResponse response,
       FilterChain chain) throws IOException, ServletException {
-    if (gerritAuthFilter.doFilter(webSession, request, response, chain)) {
-      super.doFilter(request, response, chain);
+    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
+    String requestPathInfo = httpServletRequest.getPathInfo();
+
+    if (isStaticResourceRequest(requestPathInfo)) {
+      if (!requestPathInfo.startsWith("/static")
+          && !requestPathInfo.startsWith("/resources")) {
+        httpServletRequest = new StaticHttpServletRequest(httpServletRequest);
+      }
+      super.doFilter(httpServletRequest, response, chain);
+    } else if (gerritAuthFilter.doFilter(webSession, httpServletRequest,
+        response, chain)) {
+      super.doFilter(httpServletRequest, response, chain);
+    }
+  }
+
+  private boolean isStaticResourceRequest(String requestPathInfo) {
+    return RESOURCES_SUFFIXES.contains(getResourceSuffix(requestPathInfo)
+        .toLowerCase());
+  }
+
+  private String getResourceSuffix(String requestPathInfo) {
+    int requestPathLastDot = requestPathInfo.lastIndexOf('.');
+    if (requestPathLastDot < 0) {
+      return "";
+    } else {
+      return requestPathInfo.substring(requestPathLastDot + 1);
     }
   }
 
@@ -113,7 +149,6 @@
 
     private HashMap<String, String> getGitblitInitParams() {
       HashMap<String, String> props = new HashMap<String, String>();
-      props.put("applicationClassName", GerritToGitBlitWebApp.class.getName());
       props.put("filterMappingUrlPattern", "/*");
       props.put("ignorePaths", "pages/,feed/");
       return props;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitServletModule.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitServletModule.java
index 4ecdf54..3ec851d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitServletModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitServletModule.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2012 The Android Open Source Project
+// Copyright (C) 2014 The Android Open Source Project
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,23 +11,55 @@
 // 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.googlesource.gerrit.plugins.gitblit;
 
 import org.eclipse.jgit.lib.Config;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.gitblit.IUserService;
+import com.gitblit.IStoredSettings;
+import com.gitblit.guice.IPublicKeyManagerProvider;
+import com.gitblit.guice.ITicketServiceProvider;
+import com.gitblit.guice.WorkQueueProvider;
+import com.gitblit.manager.FederationManager;
+import com.gitblit.manager.GitblitManager;
+import com.gitblit.manager.IAuthenticationManager;
+import com.gitblit.manager.IFederationManager;
+import com.gitblit.manager.IGitblit;
+import com.gitblit.manager.INotificationManager;
+import com.gitblit.manager.IPluginManager;
+import com.gitblit.manager.IProjectManager;
+import com.gitblit.manager.IRepositoryManager;
+import com.gitblit.manager.IRuntimeManager;
+import com.gitblit.manager.IServicesManager;
+import com.gitblit.manager.IUserManager;
+import com.gitblit.manager.NotificationManager;
+import com.gitblit.manager.ProjectManager;
+import com.gitblit.manager.RepositoryManager;
+import com.gitblit.manager.RuntimeManager;
+import com.gitblit.manager.ServicesManager;
+import com.gitblit.servlet.BranchGraphServlet;
+import com.gitblit.servlet.DownloadZipServlet;
+import com.gitblit.servlet.LogoServlet;
+import com.gitblit.servlet.PagesServlet;
+import com.gitblit.servlet.SyndicationServlet;
+import com.gitblit.tickets.ITicketService;
+import com.gitblit.transport.ssh.IPublicKeyManager;
+import com.gitblit.utils.JSoupXssFilter;
+import com.gitblit.utils.WorkQueue;
+import com.gitblit.utils.XssFilter;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gerrit.server.config.SitePaths;
 import com.google.inject.Inject;
 import com.google.inject.servlet.ServletModule;
-import com.googlesource.gerrit.plugins.gitblit.app.GerritGitBlit;
+import com.googlesource.gerrit.plugins.gitblit.app.GitBlitSettings;
 import com.googlesource.gerrit.plugins.gitblit.auth.GerritToGitBlitUserService;
 
 public class GitBlitServletModule extends ServletModule {
-  private static final Logger log = LoggerFactory.getLogger(GitBlitServletModule.class);
+  private static final Logger log = LoggerFactory
+      .getLogger(GitBlitServletModule.class);
 
   @Inject
   public GitBlitServletModule(@PluginName final String name,
@@ -37,15 +69,38 @@
 
   @Override
   protected void configureServlets() {
-    log.info("Configuring servlet and filters");
-    bind(IUserService.class).to(GerritToGitBlitUserService.class);
-    bind(GerritGitBlit.class);
+    log.info("Configuring Gitblit core services");
+    bind(IStoredSettings.class).to(GitBlitSettings.class);
+    bind(XssFilter.class).to(JSoupXssFilter.class);
 
-    serve("/pages/*").with(WrappedPagesServlet.class);
-    serve("/feed/*").with(WrappedSyndicationServlet.class);
-    serve("/zip/*").with(WrappedDownloadZipServlet.class);
-    serve("/logo.png").with(WrappedLogoServlet.class);
-    serve("/static/logo.png").with(WrappedLogoServlet.class);
+    // bind complex providers
+    bind(IPublicKeyManager.class).toProvider(IPublicKeyManagerProvider.class);
+    bind(ITicketService.class).toProvider(ITicketServiceProvider.class);
+    bind(WorkQueue.class).toProvider(WorkQueueProvider.class);
+
+    // core managers
+    bind(IRuntimeManager.class).to(RuntimeManager.class);
+    bind(IPluginManager.class).to(NullPluginManager.class);
+    bind(INotificationManager.class).to(NotificationManager.class);
+    bind(IUserManager.class).to(GerritToGitBlitUserService.class);
+    bind(IAuthenticationManager.class).to(GerritToGitBlitUserService.class);
+    bind(IRepositoryManager.class).to(RepositoryManager.class);
+    bind(IProjectManager.class).to(ProjectManager.class);
+    bind(IFederationManager.class).to(FederationManager.class);
+
+    // the monolithic manager
+    bind(IGitblit.class).to(GitblitManager.class);
+
+    // manager for long-running daemons and services
+    bind(IServicesManager.class).to(ServicesManager.class);
+
+    log.info("Configuring Gitblit servlets and filters");
+    serve("/graph/*").with(BranchGraphServlet.class);
+    serve("/pages/*").with(PagesServlet.class);
+    serve("/feed/*").with(SyndicationServlet.class);
+    serve("/zip/*").with(DownloadZipServlet.class);
+    serve("/logo.png").with(LogoServlet.class);
+    serve("/static/logo.png").with(LogoServlet.class);
 
     filter("/*").through(GerritWicketFilter.class);
     filter("/pages/*").through(WrappedPagesFilter.class);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitTopMenu.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitTopMenu.java
index 83204ae..b4e5778 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitTopMenu.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitTopMenu.java
@@ -1,3 +1,17 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// 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.googlesource.gerrit.plugins.gitblit;
 
 import java.util.Arrays;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitUrlsConfig.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitUrlsConfig.java
index 75c681d..9c95f9d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitUrlsConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitUrlsConfig.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2012 The Android Open Source Project
+// Copyright (C) 2014 The Android Open Source Project
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,6 +11,7 @@
 // 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.googlesource.gerrit.plugins.gitblit;
 
 import java.net.InetAddress;
@@ -24,7 +25,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Objects;
+import com.google.common.base.MoreObjects;
 
 public class GitBlitUrlsConfig {
   private static final int SSH_DEF_PORT = 22;
@@ -99,7 +100,7 @@
         return "";
       }
 
-    String httpUrl = Objects.firstNonNull(canonicalWebUrlString, httpListenUrl);
+    String httpUrl = MoreObjects.firstNonNull(canonicalWebUrlString, httpListenUrl);
     httpUrl = httpUrl.replace("://", "://" + GITBLIT_USER + "@");
     httpUrl += (httpUrl.endsWith("/") ? "" : "/") + GITBLIT_REPO;
     return httpUrl;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/NullPluginManager.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/NullPluginManager.java
new file mode 100644
index 0000000..fa89c87
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/NullPluginManager.java
@@ -0,0 +1,144 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// 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.googlesource.gerrit.plugins.gitblit;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+
+import ro.fortsoft.pf4j.PluginState;
+import ro.fortsoft.pf4j.PluginWrapper;
+import ro.fortsoft.pf4j.Version;
+
+import com.gitblit.manager.IManager;
+import com.gitblit.manager.IPluginManager;
+import com.gitblit.models.PluginRegistry.InstallState;
+import com.gitblit.models.PluginRegistry.PluginRegistration;
+import com.gitblit.models.PluginRegistry.PluginRelease;
+import com.google.inject.Singleton;
+
+@Singleton
+public class NullPluginManager implements IPluginManager {
+
+  @Override
+  public IManager start() {
+    return this;
+  }
+
+  @Override
+  public IManager stop() {
+    return this;
+  }
+
+  @Override
+  public Version getSystemVersion() {
+    return Version.ZERO;
+  }
+
+  @Override
+  public void startPlugins() {
+  }
+
+  @Override
+  public void stopPlugins() {
+  }
+
+  @Override
+  public PluginState startPlugin(String pluginId) {
+    return null;
+  }
+
+  @Override
+  public PluginState stopPlugin(String pluginId) {
+    return null;
+  }
+
+  @Override
+  public List<Class<?>> getExtensionClasses(String pluginId) {
+    return Collections.emptyList();
+  }
+
+  @Override
+  public <T> List<T> getExtensions(Class<T> type) {
+    return Collections.emptyList();
+  }
+
+  @Override
+  public List<PluginWrapper> getPlugins() {
+    return Collections.emptyList();
+  }
+
+  @Override
+  public PluginWrapper getPlugin(String pluginId) {
+    return null;
+  }
+
+  @Override
+  public PluginWrapper whichPlugin(Class<?> clazz) {
+    return null;
+  }
+
+  @Override
+  public boolean disablePlugin(String pluginId) {
+    return false;
+  }
+
+  @Override
+  public boolean enablePlugin(String pluginId) {
+    return false;
+  }
+
+  @Override
+  public boolean uninstallPlugin(String pluginId) {
+    return false;
+  }
+
+  @Override
+  public boolean refreshRegistry(boolean verifyChecksum) {
+    return false;
+  }
+
+  @Override
+  public boolean installPlugin(String url, boolean verifyChecksum)
+      throws IOException {
+    return false;
+  }
+
+  @Override
+  public boolean upgradePlugin(String pluginId, String url,
+      boolean verifyChecksum) throws IOException {
+    return false;
+  }
+
+  @Override
+  public List<PluginRegistration> getRegisteredPlugins() {
+    return null;
+  }
+
+  @Override
+  public List<PluginRegistration> getRegisteredPlugins(InstallState state) {
+    return null;
+  }
+
+  @Override
+  public PluginRegistration lookupPlugin(String idOrName) {
+    return null;
+  }
+
+  @Override
+  public PluginRelease lookupRelease(String idOrName, String version) {
+    return null;
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/StaticHttpServletRequest.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/StaticHttpServletRequest.java
new file mode 100644
index 0000000..2cdfc7e
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/StaticHttpServletRequest.java
@@ -0,0 +1,35 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// 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.googlesource.gerrit.plugins.gitblit;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+public class StaticHttpServletRequest extends HttpServletRequestWrapper {
+
+  public StaticHttpServletRequest(HttpServletRequest request) {
+    super(request);
+  }
+
+  @Override
+  public String getPathInfo() {
+    return "/static" + super.getPathInfo();
+  }
+
+  @Override
+  public String getRequestURI() {
+    return super.getContextPath() + "/static" + super.getPathInfo();
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedDownloadZipServlet.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedDownloadZipServlet.java
deleted file mode 100644
index 4b5fd24..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedDownloadZipServlet.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (C) 2013 The Android Open Source Project
-//
-// 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.googlesource.gerrit.plugins.gitblit;
-
-import com.gitblit.DownloadZipServlet;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class WrappedDownloadZipServlet extends DownloadZipServlet {
-  private static final long serialVersionUID = 1348780775920545752L;
-
-  @Inject
-  public WrappedDownloadZipServlet() {
-    super();
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedLogoServlet.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedLogoServlet.java
deleted file mode 100644
index 1edea30..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedLogoServlet.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2013 The Android Open Source Project
-//
-// 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.googlesource.gerrit.plugins.gitblit;
-
-import com.gitblit.LogoServlet;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-@SuppressWarnings("serial")
-public class WrappedLogoServlet extends LogoServlet {
-  @Inject
-  public WrappedLogoServlet() {
-    super();
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedPagesFilter.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedPagesFilter.java
index ad01de7..80a8968 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedPagesFilter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedPagesFilter.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2012 The Android Open Source Project
+// Copyright (C) 2014 The Android Open Source Project
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,6 +11,7 @@
 // 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.googlesource.gerrit.plugins.gitblit;
 
 import java.io.IOException;
@@ -21,22 +22,29 @@
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 
-import com.gitblit.PagesFilter;
+import com.gitblit.manager.IAuthenticationManager;
+import com.gitblit.manager.IRepositoryManager;
+import com.gitblit.manager.IRuntimeManager;
 import com.gitblit.models.UserModel;
+import com.gitblit.servlet.PagesFilter;
+import com.google.gerrit.extensions.registration.DynamicItem;
 import com.google.gerrit.httpd.WebSession;
 import com.google.inject.Inject;
-import com.google.inject.Provider;
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.gitblit.auth.GerritAuthFilter;
 
 @Singleton
 public class WrappedPagesFilter extends PagesFilter {
   private final GerritAuthFilter gerritAuthFilter;
-  private final Provider<WebSession> webSession;
+  private final DynamicItem<WebSession> webSession;
 
   @Inject
-  public WrappedPagesFilter(final Provider<WebSession> webSession, final GerritAuthFilter gerritAuthFilter) {
-    super();
+  public WrappedPagesFilter(DynamicItem<WebSession> webSession,
+      GerritAuthFilter gerritAuthFilter,
+      IRuntimeManager runtimeManager,
+      IAuthenticationManager authenticationManager,
+      IRepositoryManager repositoryManager) {
+    super(runtimeManager, authenticationManager, repositoryManager);
 
     this.webSession = webSession;
     this.gerritAuthFilter = gerritAuthFilter;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedPagesServlet.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedPagesServlet.java
deleted file mode 100644
index 13bfcfc..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedPagesServlet.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2012 The Android Open Source Project
-//
-// 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.googlesource.gerrit.plugins.gitblit;
-
-import com.gitblit.PagesServlet;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-@SuppressWarnings("serial")
-public class WrappedPagesServlet extends PagesServlet {
-  @Inject
-  public WrappedPagesServlet() {
-   super();
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedSyndicationFilter.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedSyndicationFilter.java
index d86a268..88c93a7 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedSyndicationFilter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedSyndicationFilter.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2012 The Android Open Source Project
+// Copyright (C) 2014 The Android Open Source Project
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,6 +11,7 @@
 // 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.googlesource.gerrit.plugins.gitblit;
 
 import java.io.IOException;
@@ -20,34 +21,54 @@
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
 
-import com.gitblit.SyndicationFilter;
+import com.gitblit.manager.IAuthenticationManager;
+import com.gitblit.manager.IProjectManager;
+import com.gitblit.manager.IRepositoryManager;
+import com.gitblit.manager.IRuntimeManager;
 import com.gitblit.models.UserModel;
+import com.gitblit.servlet.SyndicationFilter;
+import com.google.gerrit.extensions.registration.DynamicItem;
 import com.google.gerrit.httpd.WebSession;
 import com.google.inject.Inject;
-import com.google.inject.Provider;
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.gitblit.auth.GerritAuthFilter;
 
 @Singleton
 public class WrappedSyndicationFilter extends SyndicationFilter {
-  @Inject
-  private GerritAuthFilter gerritAuthFilter;
+  private final GerritAuthFilter gerritAuthFilter;
+  private final DynamicItem<WebSession> webSession;
+  
+  static class SyndicationHttpServletRequest extends HttpServletRequestWrapper {
+    public SyndicationHttpServletRequest(HttpServletRequest request) {
+      super(request);
+    }
+
+    @Override
+    public String getServletPath() {
+      return super.getServletPath() + "/feed";
+    }
+  }
 
   @Inject
-  private final Provider<WebSession> webSession;
-
-  @Inject
-  public WrappedSyndicationFilter(final Provider<WebSession> webSession) {
-    super();
+  public WrappedSyndicationFilter(DynamicItem<WebSession> webSession,
+      GerritAuthFilter gerritAuthFilter,
+      IRuntimeManager runtimeManager,
+      IAuthenticationManager authenticationManager,
+      IRepositoryManager repositoryManager,
+      IProjectManager projectManager) {
+    super(runtimeManager, authenticationManager, repositoryManager, projectManager);
     this.webSession = webSession;
+    this.gerritAuthFilter = gerritAuthFilter;
   }
 
   @Override
   public void doFilter(ServletRequest request, ServletResponse response,
       FilterChain chain) throws IOException, ServletException {
     if (gerritAuthFilter.doFilter(webSession, request, response, chain)) {
-      super.doFilter(request, response, chain);
+      super.doFilter(new SyndicationHttpServletRequest(
+          (HttpServletRequest) request), response, chain);
     }
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedSyndicationServlet.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedSyndicationServlet.java
deleted file mode 100644
index 8560b74..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedSyndicationServlet.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2012 The Android Open Source Project
-//
-// 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.googlesource.gerrit.plugins.gitblit;
-
-import com.gitblit.SyndicationServlet;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-@SuppressWarnings("serial")
-public class WrappedSyndicationServlet extends SyndicationServlet {
-  @Inject
-  public WrappedSyndicationServlet() {
-    super();
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GerritGitBlit.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GerritGitBlit.java
deleted file mode 100644
index 8da4164..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GerritGitBlit.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright (C) 2012 The Android Open Source Project
-//
-// 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.googlesource.gerrit.plugins.gitblit.app;
-
-import java.io.InputStream;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
-
-import com.gitblit.GitBlit;
-import com.gitblit.models.UserModel;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.googlesource.gerrit.plugins.gitblit.auth.GerritToGitBlitUserModel;
-import com.googlesource.gerrit.plugins.gitblit.auth.GerritToGitBlitUserService;
-
-@Singleton
-public class GerritGitBlit extends GitBlit {
-
-  @Inject
-  public GerritGitBlit(GerritToGitBlitUserService userService) {
-    super(userService);
-  }
-
-  public UserModel authenticate(HttpServletRequest request) {
-    String user = (String) request.getAttribute("gerrit-username");
-    String token = (String) request.getAttribute("gerrit-token");
-    String password = (String) request.getAttribute("gerrit-password");
-    if (token != null) {
-      return GitBlit.self().authenticate(user,
-          (GerritToGitBlitUserService.SESSIONAUTH + token).toCharArray());
-    } else if(user != null && password != null){
-      return GitBlit.self().authenticate(user, password.toCharArray());
-    } else {
-      return GitBlit.self().authenticate(
-          GerritToGitBlitUserModel.ANONYMOUS_USER,
-          GerritToGitBlitUserModel.ANONYMOUS_PASSWORD);
-    }
-  }
-
-  @Override
-  public InputStream getResourceAsStream(String file)
-      throws ResourceStreamNotFoundException {
-    String resourceName = "/static/" + file;
-    InputStream is = getClass().getResourceAsStream(resourceName);
-    if (is == null) {
-      throw new ResourceStreamNotFoundException("Cannot access resource "
-          + resourceName + " using class-loader " + getClass().getClassLoader());
-    }
-
-    return is;
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GerritToGitBlitWebApp.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GerritToGitBlitWebApp.java
deleted file mode 100644
index 419487c..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GerritToGitBlitWebApp.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (C) 2012 The Android Open Source Project
-//
-// 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.googlesource.gerrit.plugins.gitblit.app;
-
-import org.apache.wicket.protocol.http.WebRequestCycleProcessor;
-import org.apache.wicket.request.IRequestCodingStrategy;
-import org.apache.wicket.request.IRequestCycleProcessor;
-
-import com.gitblit.wicket.GitBlitWebApp;
-
-public class GerritToGitBlitWebApp extends GitBlitWebApp {
-    @Override
-    protected IRequestCycleProcessor newRequestCycleProcessor() {
-        return new WebRequestCycleProcessor() {
-            protected IRequestCodingStrategy newRequestCodingStrategy() {
-                return new StaticCodingStrategy("summary/", "project/");
-            }
-        };
-    }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GitBlitSettings.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GitBlitSettings.java
index 2f93f52..67a3090 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GitBlitSettings.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GitBlitSettings.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2012 The Android Open Source Project
+// Copyright (C) 2014 The Android Open Source Project
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,6 +11,7 @@
 // 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.googlesource.gerrit.plugins.gitblit.app;
 
 import java.io.File;
@@ -32,10 +33,13 @@
 import com.google.gerrit.server.config.SitePaths;
 import com.google.gerrit.server.git.LocalDiskRepositoryManager;
 import com.google.inject.Inject;
+import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.gitblit.GitBlitUrlsConfig;
 import com.googlesource.gerrit.plugins.gitblit.auth.GerritToGitBlitUserService;
 
+@Singleton
 public class GitBlitSettings extends IStoredSettings {
+  private static final Logger log = LoggerFactory.getLogger(GitBlitSettings.class);
   private static final String GITBLIT_GERRIT_PROPERTIES = "/gitblit.properties";
 
   private final LocalDiskRepositoryManager repoManager;
@@ -128,4 +132,10 @@
     stringSettings.append(properties.toString());
     return stringSettings.toString();
   }
+
+  @Override
+  public boolean saveSettings() {
+    log.warn("Store of GitBlit settings is not supported");
+    return false;
+  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/StaticCodingStrategy.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/StaticCodingStrategy.java
deleted file mode 100644
index f196e27..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/StaticCodingStrategy.java
+++ /dev/null
@@ -1,89 +0,0 @@
-//Copyright (C) 2012 The Android Open Source Project
-//
-//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.googlesource.gerrit.plugins.gitblit.app;
-
-import org.apache.wicket.Request;
-import org.apache.wicket.RequestCycle;
-import org.apache.wicket.protocol.http.request.WebRequestCodingStrategy;
-import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class StaticCodingStrategy extends WebRequestCodingStrategy {
-  private static final Logger LOG = LoggerFactory
-      .getLogger(StaticCodingStrategy.class);
-  private String[] ignoreResourceUrlPrefixes;
-
-  public StaticCodingStrategy(String... ignoreResourceUrlPrefixes) {
-    this.ignoreResourceUrlPrefixes = ignoreResourceUrlPrefixes;
-  }
-
-  @Override
-  public String rewriteStaticRelativeUrl(String url) {
-    // Avoid rewriting of non-static resources
-    String[] urlParts = url.split("/");
-    if (urlParts[urlParts.length - 1].indexOf('.') < 0) {
-      return url;
-    }
-
-    if(isMatchingIgnoreUrlPrefixes(url)) {
-      return url;
-    }
-
-    int depth =
-        ((ServletWebRequest) RequestCycle.get().getRequest())
-            .getDepthRelativeToWicketHandler();
-    return getRelativeStaticUrl(url, depth);
-  }
-
-  private boolean isMatchingIgnoreUrlPrefixes(String url) {
-    for (String ignoredUrlPrefix : ignoreResourceUrlPrefixes) {
-      if(url.startsWith(ignoredUrlPrefix)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  public static String getRelativePrefix(Request request) {
-    int depth = ((ServletWebRequest) request).getDepthRelativeToWicketHandler();
-
-    StringBuffer urlBuffer = new StringBuffer();
-    for (; depth > 0; depth--) {
-      urlBuffer.append("../");
-    }
-
-    return urlBuffer.toString();
-  }
-
-  public static String getStaticRelativePrefix(Request request) {
-    int depth = ((ServletWebRequest) request).getDepthRelativeToWicketHandler();
-    return getRelativeStaticUrl("", depth);
-  }
-
-  public static String getRelativeStaticUrl(String url, int depth) {
-    StringBuffer urlBuffer = new StringBuffer();
-    for (; depth > 0; depth--) {
-      urlBuffer.append("../");
-    }
-    urlBuffer.append("static/"); // tells to Gerrit plugin runtime to load
-                                 // static resources from gitblit plugin jar
-                                 // file
-    urlBuffer.append(url);
-
-    LOG.debug("Rewriting URL " + url + " to " + urlBuffer);
-
-    return urlBuffer.toString();
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/auth/GerritAuthFilter.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/auth/GerritAuthFilter.java
index 5b5058a..ba34643 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/auth/GerritAuthFilter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/auth/GerritAuthFilter.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2012 The Android Open Source Project
+// Copyright (C) 2014 The Android Open Source Project
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,6 +11,7 @@
 // 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.googlesource.gerrit.plugins.gitblit.auth;
 
 import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;
@@ -27,17 +28,25 @@
 
 import org.apache.commons.codec.binary.Base64;
 
-import com.gitblit.GitBlit;
+import com.gitblit.manager.IGitblit;
 import com.gitblit.models.UserModel;
-import com.google.common.base.Objects;
+import com.google.common.base.MoreObjects;
+import com.google.gerrit.extensions.registration.DynamicItem;
 import com.google.gerrit.httpd.WebSession;
-import com.google.inject.Provider;
+import com.google.inject.Inject;
 import com.google.inject.Singleton;
 
 @Singleton
 public class GerritAuthFilter {
   private static final String LIT_BASIC = "Basic ";
 
+  private final IGitblit gitBlit;
+
+  @Inject
+  public GerritAuthFilter(IGitblit gitBlit) {
+    this.gitBlit = gitBlit;
+  }
+
   /**
    * Returns the user making the request, if the user has authenticated.
    * @param httpRequest
@@ -53,7 +62,7 @@
     }
 
     user =
-        GitBlit.self().authenticate(username,
+        gitBlit.authenticate(username,
             (GerritToGitBlitUserService.SESSIONAUTH + token).toCharArray());
     if (user != null) {
       return user;
@@ -62,7 +71,7 @@
     return null;
   }
 
-  public boolean doFilter(final Provider<WebSession> webSession,
+  public boolean doFilter(final DynamicItem<WebSession> webSession,
       ServletRequest request, ServletResponse response, FilterChain chain)
       throws IOException, ServletException {
     HttpServletRequest httpRequest = (HttpServletRequest) request;
@@ -78,7 +87,7 @@
     }
   }
 
-  public boolean filterSessionAuth(final Provider<WebSession> webSession,
+  public boolean filterSessionAuth(final DynamicItem<WebSession> webSession,
       HttpServletRequest request) {
     request.setAttribute("gerrit-username", webSession.get().getCurrentUser()
         .getUserName());
@@ -98,7 +107,7 @@
     final byte[] decoded =
         new Base64().decode(hdr.substring(LIT_BASIC.length()).getBytes());
     String usernamePassword =
-        new String(decoded, Objects.firstNonNull(
+        new String(decoded, MoreObjects.firstNonNull(
             request.getCharacterEncoding(), "UTF-8"));
     int splitPos = usernamePassword.indexOf(':');
     if (splitPos < 1) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/auth/GerritToGitBlitUserModel.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/auth/GerritToGitBlitUserModel.java
index 30e3baa..49951cf 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/auth/GerritToGitBlitUserModel.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/auth/GerritToGitBlitUserModel.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2012 The Android Open Source Project
+// Copyright (C) 2014 The Android Open Source Project
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,6 +11,7 @@
 // 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.googlesource.gerrit.plugins.gitblit.auth;
 
 import java.util.HashSet;
@@ -26,7 +27,6 @@
 import com.google.gerrit.server.project.NoSuchProjectException;
 import com.google.gerrit.server.project.ProjectControl;
 import com.google.gerrit.server.project.ProjectControl.Factory;
-import com.google.gerrit.server.project.RefControl;
 
 public class GerritToGitBlitUserModel extends UserModel {
   public static final String ANONYMOUS_USER = "$anonymous";
@@ -136,30 +136,9 @@
     return result;
   }
 
-  @Override
-  public boolean hasBranchPermission(String repoName, String branchRef) {
-    boolean result = false;
-
-    try {
-      repoName = getRepositoryName(repoName);
-
-      ProjectControl control =
-          projectControlFactory.validateFor(new NameKey(repoName));
-      if (control != null && control.isVisible()) {
-        RefControl branchCtrl = control.controlForRef(branchRef);
-        result = branchCtrl != null && branchCtrl.isVisible();
-      }
-
-    } catch (NoSuchProjectException e) {
-      result = false;
-    }
-
-    return result;
-  }
-
   public boolean hasTeamAccess(String repositoryName) {
     for (TeamModel team : teams) {
-      if (team.hasRepository(repositoryName)) {
+      if (team.hasRepositoryPermission(repositoryName)) {
         return true;
       }
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/auth/GerritToGitBlitUserService.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/auth/GerritToGitBlitUserService.java
index 7ba6182..1d0ce9d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/auth/GerritToGitBlitUserService.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/auth/GerritToGitBlitUserService.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2012 The Android Open Source Project
+// Copyright (C) 2014 The Android Open Source Project
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,20 +11,31 @@
 // 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.googlesource.gerrit.plugins.gitblit.auth;
 
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.gitblit.IStoredSettings;
-import com.gitblit.IUserService;
+import com.gitblit.Constants;
+import com.gitblit.Constants.AuthenticationType;
+import com.gitblit.Constants.Role;
+import com.gitblit.manager.IAuthenticationManager;
+import com.gitblit.manager.IManager;
+import com.gitblit.manager.IRuntimeManager;
+import com.gitblit.manager.IUserManager;
 import com.gitblit.models.TeamModel;
 import com.gitblit.models.UserModel;
+import com.gitblit.transport.ssh.SshKey;
 import com.google.common.base.Strings;
+import com.google.gerrit.extensions.registration.DynamicItem;
 import com.google.gerrit.httpd.WebSession;
 import com.google.gerrit.server.account.AccountException;
 import com.google.gerrit.server.account.AccountManager;
@@ -32,25 +43,24 @@
 import com.google.gerrit.server.account.AuthResult;
 import com.google.gerrit.server.project.ProjectControl;
 import com.google.inject.Inject;
-import com.google.inject.Provider;
 import com.google.inject.Singleton;
 
 @Singleton
-public class GerritToGitBlitUserService implements IUserService {
+public class GerritToGitBlitUserService implements IAuthenticationManager,
+    IUserManager {
   private static final Logger log = LoggerFactory
       .getLogger(GerritToGitBlitUserService.class);
 
   private final ProjectControl.Factory projectControl;
-  private AccountManager accountManager;
-
-  private Provider<WebSession> webSession;
+  private final AccountManager accountManager;
+  private final DynamicItem<WebSession> webSession;
 
   public static final String SESSIONAUTH = "sessionid:";
 
   @Inject
   public GerritToGitBlitUserService(
       final ProjectControl.Factory projectControl,
-      AccountManager accountManager, final Provider<WebSession> webSession) {
+      AccountManager accountManager, final DynamicItem<WebSession> webSession) {
     this.projectControl = projectControl;
     this.accountManager = accountManager;
     this.webSession = webSession;
@@ -75,7 +85,8 @@
   public UserModel authenticateSSO(String username, String sessionToken) {
     WebSession session = webSession.get();
 
-    if (session.getSessionId() == null || !session.getSessionId().equals(sessionToken)) {
+    if (session.getSessionId() == null
+        || !session.getSessionId().equals(sessionToken)) {
       log.warn("Invalid Gerrit session token for user '" + username + "'");
       return null;
     }
@@ -115,53 +126,108 @@
     return new GerritToGitBlitUserModel(username, projectControl);
   }
 
-  @Override
-  public UserModel getUserModel(String username) {
-
-    return new GerritToGitBlitUserModel(username, projectControl);
-  }
 
   @Override
-  public boolean supportsCookies() {
-    return false;
-  }
-
-  @Override
-  public void setup(IStoredSettings settings) {
-  }
-
-  @Override
-  public boolean supportsCredentialChanges() {
-    return false;
-  }
-
-  @Override
-  public boolean supportsDisplayNameChanges() {
-    return false;
-  }
-
-  @Override
-  public boolean supportsEmailAddressChanges() {
-    return false;
-  }
-
-  @Override
-  public boolean supportsTeamMembershipChanges() {
-    return false;
-  }
-
-  @Override
-  public String getCookie(UserModel model) {
-    return model.cookie;
-  }
-
-  @Override
-  public UserModel authenticate(char[] cookie) {
+  public IManager start() {
     return null;
   }
 
   @Override
-  public void logout(UserModel user) {
+  public IManager stop() {
+    return null;
+  }
+
+  @Override
+  public UserModel authenticate(HttpServletRequest httpRequest) {
+    String gerritUsername =
+        (String) httpRequest.getAttribute("gerrit-username");
+    String gerritToken = (String) httpRequest.getAttribute("gerrit-token");
+    if (Strings.isNullOrEmpty(gerritUsername)
+        || Strings.isNullOrEmpty(gerritToken)) {
+      return null;
+    }
+
+    httpRequest.getSession().setAttribute(Constants.AUTHENTICATION_TYPE,
+        AuthenticationType.CONTAINER);
+    return authenticateSSO(gerritUsername, gerritToken);
+  }
+
+  @Override
+  public UserModel authenticate(String username, SshKey key) {
+    return null;
+  }
+
+  @Override
+  public UserModel authenticate(HttpServletRequest httpRequest,
+      boolean requiresCertificate) {
+    return null;
+  }
+
+  @Override
+  public String getCookie(HttpServletRequest request) {
+    return null;
+  }
+
+  @Override
+  public void setCookie(HttpServletResponse response, UserModel user) {
+  }
+
+  @Override
+  public void setCookie(HttpServletRequest request,
+      HttpServletResponse response, UserModel user) {
+  }
+
+  @Override
+  public void logout(HttpServletResponse response, UserModel user) {
+  }
+
+  @Override
+  public void logout(HttpServletRequest request, HttpServletResponse response,
+      UserModel user) {
+  }
+
+  @Override
+  public boolean supportsCredentialChanges(UserModel user) {
+    return false;
+  }
+
+  @Override
+  public boolean supportsDisplayNameChanges(UserModel user) {
+    return false;
+  }
+
+  @Override
+  public boolean supportsEmailAddressChanges(UserModel user) {
+    return false;
+  }
+
+  @Override
+  public boolean supportsTeamMembershipChanges(UserModel user) {
+    return false;
+  }
+
+  @Override
+  public boolean supportsTeamMembershipChanges(TeamModel team) {
+    return false;
+  }
+
+  @Override
+  public void setup(IRuntimeManager runtimeManager) {
+  }
+
+  @Override
+  public String getCookie(UserModel model) {
+    return null;
+  }
+
+  @Override
+  public UserModel getUserModel(char[] cookie) {
+    return null;
+  }
+
+  @Override
+  public UserModel getUserModel(String username) {
+    return new GerritToGitBlitUserModel(username, projectControl);
   }
 
   @Override
@@ -170,6 +236,11 @@
   }
 
   @Override
+  public boolean updateUserModels(Collection<UserModel> models) {
+    return false;
+  }
+
+  @Override
   public boolean updateUserModel(String username, UserModel model) {
     return false;
   }
@@ -201,18 +272,12 @@
 
   @Override
   public List<TeamModel> getAllTeams() {
-    return Collections.emptyList();
+    return null;
   }
 
   @Override
-  public List<String> getTeamnamesForRepositoryRole(String role) {
-    return Collections.emptyList();
-  }
-
-  @Override
-  public boolean setTeamnamesForRepositoryRole(String role,
-      List<String> teamnames) {
-    return false;
+  public List<String> getTeamNamesForRepositoryRole(String role) {
+    return null;
   }
 
   @Override
@@ -226,6 +291,11 @@
   }
 
   @Override
+  public boolean updateTeamModels(Collection<TeamModel> models) {
+    return false;
+  }
+
+  @Override
   public boolean updateTeamModel(String teamname, TeamModel model) {
     return false;
   }
@@ -242,13 +312,7 @@
 
   @Override
   public List<String> getUsernamesForRepositoryRole(String role) {
-    return Collections.emptyList();
-  }
-
-  @Override
-  public boolean setUsernamesForRepositoryRole(String role,
-      List<String> usernames) {
-    return false;
+    return null;
   }
 
   @Override
@@ -262,12 +326,17 @@
   }
 
   @Override
-  public boolean updateTeamModels(Collection<TeamModel> arg0) {
+  public boolean isInternalAccount(String username) {
     return false;
   }
 
   @Override
-  public boolean updateUserModels(Collection<UserModel> arg0) {
+  public boolean supportsRoleChanges(UserModel user, Role role) {
+    return false;
+  }
+
+  @Override
+  public boolean supportsRoleChanges(TeamModel team, Role role) {
     return false;
   }
 }