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;
   }
 }
