diff --git a/README b/README
new file mode 100644
index 0000000..5f79157
--- /dev/null
+++ b/README
@@ -0,0 +1,24 @@
+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
deleted file mode 100644
index 08d468b..0000000
--- a/README.md
+++ /dev/null
@@ -1,55 +0,0 @@
-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.
-
-    [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 abdc915..da93aa1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,31 +28,103 @@
     <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.7.0-SNAPSHOT</version>
-      <exclusions>
-        <exclusion>
-          <groupId>org.apache.wicket</groupId>
-          <artifactId>wicket</artifactId>
-        </exclusion>
-      </exclusions>
+      <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>
     </dependency>
     <dependency>
       <groupId>org.apache.wicket</groupId>
       <artifactId>wicket</artifactId>
-      <version>1.4.23-gerrit</version>
+      <version>1.4.21-selfload</version>
     </dependency>
   </dependencies>
   <build>
@@ -79,6 +151,7 @@
           <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
           <artifactSet>
             <excludes>
+              <exclude>com.google.gerrit:*</exclude>
               <exclude>org.bouncycastle:*</exclude>
               <exclude>org.slf4j:*</exclude>
               <exclude>com.google.guava:*</exclude>
@@ -88,26 +161,6 @@
               <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
deleted file mode 100644
index 6e3d101..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GerritGitBlitContext.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// 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 d6f5aeb..a9d0601 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) 2014 The Android Open Source Project
+// 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.
@@ -11,80 +11,68 @@
 // 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.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.gitblit.GitBlit;
 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 GitblitWicketFilter {
+public class GerritWicketFilter extends WicketFilter {
   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 DynamicItem<WebSession> webSession;
-
+  private final Provider<WebSession> webSession;
+  @SuppressWarnings("unused")
+  // We need Guice to create the GerritGitBlit instance
+  private final GerritGitBlit gitBlit;
   private final GerritAuthFilter gerritAuthFilter;
-
-  private final GerritGitBlitContext gerritGitblitContext;
+  private final GitBlitSettings settings;
 
   @Inject
   public GerritWicketFilter(
-      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);
+      final Provider<WebSession> webSession, final GerritGitBlit gitBlit,
+      final GerritAuthFilter gerritAuthFilter, final GitBlitSettings settings) {
     this.webSession = webSession;
+    this.gitBlit = gitBlit;
     this.gerritAuthFilter = gerritAuthFilter;
-    this.gerritGitblitContext = gerritGitblitContext;
+    this.settings = settings;
   }
 
   @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);
@@ -114,32 +102,8 @@
   @Override
   public void doFilter(ServletRequest request, ServletResponse response,
       FilterChain chain) throws IOException, ServletException {
-    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);
+    if (gerritAuthFilter.doFilter(webSession, request, response, chain)) {
+      super.doFilter(request, response, chain);
     }
   }
 
@@ -149,6 +113,7 @@
 
     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 3ec851d..4ecdf54 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) 2014 The Android Open Source Project
+// 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.
@@ -11,55 +11,23 @@
 // 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.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.gitblit.IUserService;
 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.GitBlitSettings;
+import com.googlesource.gerrit.plugins.gitblit.app.GerritGitBlit;
 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,
@@ -69,38 +37,15 @@
 
   @Override
   protected void configureServlets() {
-    log.info("Configuring Gitblit core services");
-    bind(IStoredSettings.class).to(GitBlitSettings.class);
-    bind(XssFilter.class).to(JSoupXssFilter.class);
+    log.info("Configuring servlet and filters");
+    bind(IUserService.class).to(GerritToGitBlitUserService.class);
+    bind(GerritGitBlit.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);
+    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);
 
     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 b4e5778..83204ae 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitTopMenu.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GitBlitTopMenu.java
@@ -1,17 +1,3 @@
-// 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 9c95f9d..75c681d 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) 2014 The Android Open Source Project
+// 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.
@@ -11,7 +11,6 @@
 // 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;
@@ -25,7 +24,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
 
 public class GitBlitUrlsConfig {
   private static final int SSH_DEF_PORT = 22;
@@ -100,7 +99,7 @@
         return "";
       }
 
-    String httpUrl = MoreObjects.firstNonNull(canonicalWebUrlString, httpListenUrl);
+    String httpUrl = Objects.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
deleted file mode 100644
index fa89c87..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/NullPluginManager.java
+++ /dev/null
@@ -1,144 +0,0 @@
-// 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
deleted file mode 100644
index 2cdfc7e..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/StaticHttpServletRequest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// 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
new file mode 100644
index 0000000..4b5fd24
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedDownloadZipServlet.java
@@ -0,0 +1,28 @@
+// 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
new file mode 100644
index 0000000..1edea30
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedLogoServlet.java
@@ -0,0 +1,27 @@
+// 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 80a8968..ad01de7 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) 2014 The Android Open Source Project
+// 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.
@@ -11,7 +11,6 @@
 // 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;
@@ -22,29 +21,22 @@
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 
-import com.gitblit.manager.IAuthenticationManager;
-import com.gitblit.manager.IRepositoryManager;
-import com.gitblit.manager.IRuntimeManager;
+import com.gitblit.PagesFilter;
 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 DynamicItem<WebSession> webSession;
+  private final Provider<WebSession> webSession;
 
   @Inject
-  public WrappedPagesFilter(DynamicItem<WebSession> webSession,
-      GerritAuthFilter gerritAuthFilter,
-      IRuntimeManager runtimeManager,
-      IAuthenticationManager authenticationManager,
-      IRepositoryManager repositoryManager) {
-    super(runtimeManager, authenticationManager, repositoryManager);
+  public WrappedPagesFilter(final Provider<WebSession> webSession, final GerritAuthFilter gerritAuthFilter) {
+    super();
 
     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
new file mode 100644
index 0000000..13bfcfc
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedPagesServlet.java
@@ -0,0 +1,27 @@
+// 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 88c93a7..d86a268 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) 2014 The Android Open Source Project
+// 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.
@@ -11,7 +11,6 @@
 // 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,54 +20,34 @@
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
 
-import com.gitblit.manager.IAuthenticationManager;
-import com.gitblit.manager.IProjectManager;
-import com.gitblit.manager.IRepositoryManager;
-import com.gitblit.manager.IRuntimeManager;
+import com.gitblit.SyndicationFilter;
 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 {
-  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 GerritAuthFilter gerritAuthFilter;
 
   @Inject
-  public WrappedSyndicationFilter(DynamicItem<WebSession> webSession,
-      GerritAuthFilter gerritAuthFilter,
-      IRuntimeManager runtimeManager,
-      IAuthenticationManager authenticationManager,
-      IRepositoryManager repositoryManager,
-      IProjectManager projectManager) {
-    super(runtimeManager, authenticationManager, repositoryManager, projectManager);
+  private final Provider<WebSession> webSession;
+
+  @Inject
+  public WrappedSyndicationFilter(final Provider<WebSession> webSession) {
+    super();
     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(new SyndicationHttpServletRequest(
-          (HttpServletRequest) request), response, chain);
+      super.doFilter(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
new file mode 100644
index 0000000..8560b74
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/WrappedSyndicationServlet.java
@@ -0,0 +1,27 @@
+// 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
new file mode 100644
index 0000000..8da4164
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GerritGitBlit.java
@@ -0,0 +1,65 @@
+// 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
new file mode 100644
index 0000000..419487c
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GerritToGitBlitWebApp.java
@@ -0,0 +1,31 @@
+// 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 67a3090..2f93f52 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) 2014 The Android Open Source Project
+// 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.
@@ -11,7 +11,6 @@
 // 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;
@@ -33,13 +32,10 @@
 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;
@@ -132,10 +128,4 @@
     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
new file mode 100644
index 0000000..f196e27
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/StaticCodingStrategy.java
@@ -0,0 +1,89 @@
+//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 ba34643..5b5058a 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) 2014 The Android Open Source Project
+// 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.
@@ -11,7 +11,6 @@
 // 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;
@@ -28,25 +27,17 @@
 
 import org.apache.commons.codec.binary.Base64;
 
-import com.gitblit.manager.IGitblit;
+import com.gitblit.GitBlit;
 import com.gitblit.models.UserModel;
-import com.google.common.base.MoreObjects;
-import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.common.base.Objects;
 import com.google.gerrit.httpd.WebSession;
-import com.google.inject.Inject;
+import com.google.inject.Provider;
 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
@@ -62,7 +53,7 @@
     }
 
     user =
-        gitBlit.authenticate(username,
+        GitBlit.self().authenticate(username,
             (GerritToGitBlitUserService.SESSIONAUTH + token).toCharArray());
     if (user != null) {
       return user;
@@ -71,7 +62,7 @@
     return null;
   }
 
-  public boolean doFilter(final DynamicItem<WebSession> webSession,
+  public boolean doFilter(final Provider<WebSession> webSession,
       ServletRequest request, ServletResponse response, FilterChain chain)
       throws IOException, ServletException {
     HttpServletRequest httpRequest = (HttpServletRequest) request;
@@ -87,7 +78,7 @@
     }
   }
 
-  public boolean filterSessionAuth(final DynamicItem<WebSession> webSession,
+  public boolean filterSessionAuth(final Provider<WebSession> webSession,
       HttpServletRequest request) {
     request.setAttribute("gerrit-username", webSession.get().getCurrentUser()
         .getUserName());
@@ -107,7 +98,7 @@
     final byte[] decoded =
         new Base64().decode(hdr.substring(LIT_BASIC.length()).getBytes());
     String usernamePassword =
-        new String(decoded, MoreObjects.firstNonNull(
+        new String(decoded, Objects.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 49951cf..30e3baa 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) 2014 The Android Open Source Project
+// 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.
@@ -11,7 +11,6 @@
 // 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;
@@ -27,6 +26,7 @@
 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,9 +136,30 @@
     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.hasRepositoryPermission(repositoryName)) {
+      if (team.hasRepository(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 1d0ce9d..7ba6182 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) 2014 The Android Open Source Project
+// 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.
@@ -11,31 +11,20 @@
 // 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.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.IStoredSettings;
+import com.gitblit.IUserService;
 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;
@@ -43,24 +32,25 @@
 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 IAuthenticationManager,
-    IUserManager {
+public class GerritToGitBlitUserService implements IUserService {
   private static final Logger log = LoggerFactory
       .getLogger(GerritToGitBlitUserService.class);
 
   private final ProjectControl.Factory projectControl;
-  private final AccountManager accountManager;
-  private final DynamicItem<WebSession> webSession;
+  private AccountManager accountManager;
+
+  private Provider<WebSession> webSession;
 
   public static final String SESSIONAUTH = "sessionid:";
 
   @Inject
   public GerritToGitBlitUserService(
       final ProjectControl.Factory projectControl,
-      AccountManager accountManager, final DynamicItem<WebSession> webSession) {
+      AccountManager accountManager, final Provider<WebSession> webSession) {
     this.projectControl = projectControl;
     this.accountManager = accountManager;
     this.webSession = webSession;
@@ -85,8 +75,7 @@
   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;
     }
@@ -126,117 +115,57 @@
     return new GerritToGitBlitUserModel(username, projectControl);
   }
 
-
-  @Override
-  public IManager start() {
-    return null;
-  }
-
-  @Override
-  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
-  public boolean updateUserModel(UserModel model) {
+  public boolean supportsCookies() {
     return false;
   }
 
   @Override
-  public boolean updateUserModels(Collection<UserModel> models) {
+  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) {
+    return null;
+  }
+
+  @Override
+  public void logout(UserModel user) {
+  }
+
+  @Override
+  public boolean updateUserModel(UserModel model) {
     return false;
   }
 
@@ -272,12 +201,18 @@
 
   @Override
   public List<TeamModel> getAllTeams() {
-    return null;
+    return Collections.emptyList();
   }
 
   @Override
-  public List<String> getTeamNamesForRepositoryRole(String role) {
-    return null;
+  public List<String> getTeamnamesForRepositoryRole(String role) {
+    return Collections.emptyList();
+  }
+
+  @Override
+  public boolean setTeamnamesForRepositoryRole(String role,
+      List<String> teamnames) {
+    return false;
   }
 
   @Override
@@ -291,11 +226,6 @@
   }
 
   @Override
-  public boolean updateTeamModels(Collection<TeamModel> models) {
-    return false;
-  }
-
-  @Override
   public boolean updateTeamModel(String teamname, TeamModel model) {
     return false;
   }
@@ -312,7 +242,13 @@
 
   @Override
   public List<String> getUsernamesForRepositoryRole(String role) {
-    return null;
+    return Collections.emptyList();
+  }
+
+  @Override
+  public boolean setUsernamesForRepositoryRole(String role,
+      List<String> usernames) {
+    return false;
   }
 
   @Override
@@ -326,17 +262,12 @@
   }
 
   @Override
-  public boolean isInternalAccount(String username) {
+  public boolean updateTeamModels(Collection<TeamModel> arg0) {
     return false;
   }
 
   @Override
-  public boolean supportsRoleChanges(UserModel user, Role role) {
-    return false;
-  }
-
-  @Override
-  public boolean supportsRoleChanges(TeamModel team, Role role) {
+  public boolean updateUserModels(Collection<UserModel> arg0) {
     return false;
   }
 }
