diff --git a/ivy/ivy.xml b/ivy/ivy.xml
index 2781c6c..585a0fa 100644
--- a/ivy/ivy.xml
+++ b/ivy/ivy.xml
@@ -120,22 +120,6 @@
 		<dependency org="org.mortbay.jetty" name="jetty" rev="6.1.26" />
 
 		<dependency org="org.apache.commons" name="commons-collections4" rev="4.1" conf="*->default" />
-		<dependency org="org.springframework" name="spring-core" rev="4.0.9.RELEASE" conf="*->default" />
-		<dependency org="org.springframework" name="spring-context" rev="4.0.9.RELEASE" conf="*->default" />
-		<dependency org="org.springframework" name="spring-web" rev="4.0.9.RELEASE" conf="*->default" />
-
-		<dependency org="com.sun.jersey" name="jersey-client" rev="1.19.4" conf="*->default" />
-
-		<dependency org="com.j256.ormlite" name="ormlite-jdbc" rev="5.1" conf="*->default" />
-		<dependency org="com.h2database" name="h2" rev="1.4.197" conf="*->default" />
-		<dependency org="org.eclipse.persistence" name="javax.persistence" rev="2.2.0" conf="*->default" />
-
-		<dependency org="org.apache.wicket" name="wicket-core" rev="6.17.0" conf="*->default" />
-		<dependency org="org.apache.wicket" name="wicket-spring" rev="6.17.0" conf="*->default" />
-		<dependency org="de.agilecoders.wicket" name="wicket-bootstrap-core" rev="0.9.2" conf="*->default" />
-		<dependency org="de.agilecoders.wicket" name="wicket-bootstrap-extensions" rev="0.9.2" conf="*->default">
-			<exclude org="org.json" />
-		</dependency>
 
 		<!-- RabbitMQ dependencies -->
 		<dependency org="com.rabbitmq" name="amqp-client" rev="5.2.0" conf="*->default" />
diff --git a/src/bin/nutch b/src/bin/nutch
index 9240a9e..3563b45 100755
--- a/src/bin/nutch
+++ b/src/bin/nutch
@@ -98,7 +98,6 @@
   echo "  plugin            load a plugin and run one of its classes main()"
   echo "  junit             runs the given JUnit test"
   echo "  startserver       runs the Nutch Server on localhost:8081"
-  echo "  webapp            run a local Nutch Web Application on locahost:8080"
   echo "  warc              exports crawled data from segments at the WARC format"
   echo "  updatehostdb      update the host db with records from the crawl db"
   echo "  readhostdb        read / dump host db"
@@ -302,8 +301,6 @@
   CLASS=org.junit.runner.JUnitCore
 elif [ "$COMMAND" = "startserver" ] ; then
   CLASS=org.apache.nutch.service.NutchServer
-elif [ "$COMMAND" = "webapp" ] ; then
-  CLASS=org.apache.nutch.webui.NutchUiServer
 elif [ "$COMMAND" = "warc" ] ; then
   CLASS=org.apache.nutch.tools.warc.WARCExporter
 elif [ "$COMMAND" = "updatehostdb" ] ; then
diff --git a/src/java/org/apache/nutch/webui/NutchUiApplication.java b/src/java/org/apache/nutch/webui/NutchUiApplication.java
deleted file mode 100644
index fc08874..0000000
--- a/src/java/org/apache/nutch/webui/NutchUiApplication.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui;
-
-import org.apache.nutch.webui.pages.DashboardPage;
-import org.apache.nutch.webui.pages.assets.NutchUiCssReference;
-import org.apache.wicket.RuntimeConfigurationType;
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.protocol.http.WebApplication;
-import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
-import org.springframework.beans.BeansException;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.stereotype.Component;
-
-import de.agilecoders.wicket.core.Bootstrap;
-import de.agilecoders.wicket.core.markup.html.themes.bootstrap.BootstrapCssReference;
-import de.agilecoders.wicket.core.settings.BootstrapSettings;
-import de.agilecoders.wicket.core.settings.SingleThemeProvider;
-import de.agilecoders.wicket.core.settings.Theme;
-import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesomeCssReference;
-
-@Component
-public class NutchUiApplication extends WebApplication implements
-    ApplicationContextAware {
-  private static final String THEME_NAME = "bootstrap";
-  private ApplicationContext context;
-
-  /**
-   * @see org.apache.wicket.Application#getHomePage()
-   */
-  @Override
-  public Class<? extends WebPage> getHomePage() {
-    return DashboardPage.class;
-  }
-
-  /**
-   * @see org.apache.wicket.Application#init()
-   */
-  @Override
-  public void init() {
-    super.init();
-    BootstrapSettings settings = new BootstrapSettings();
-    Bootstrap.install(this, settings);
-    configureTheme(settings);
-
-    getComponentInstantiationListeners().add(
-        new SpringComponentInjector(this, context));
-  }
-
-  @Override
-  public RuntimeConfigurationType getConfigurationType() {
-    return RuntimeConfigurationType.DEPLOYMENT;
-  }
-
-  private void configureTheme(BootstrapSettings settings) {
-    Theme theme = new Theme(THEME_NAME, BootstrapCssReference.instance(),
-        FontAwesomeCssReference.instance(), NutchUiCssReference.instance());
-    settings.setThemeProvider(new SingleThemeProvider(theme));
-  }
-
-  @Override
-  public void setApplicationContext(ApplicationContext applicationContext)
-      throws BeansException {
-    this.context = applicationContext;
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/NutchUiApplication.properties b/src/java/org/apache/nutch/webui/NutchUiApplication.properties
deleted file mode 100644
index 4c62939..0000000
--- a/src/java/org/apache/nutch/webui/NutchUiApplication.properties
+++ /dev/null
@@ -1,63 +0,0 @@
-#############################################################################
-#Licensed to the Apache Software Foundation (ASF) under one or more
-#contributor license agreements.  See the NOTICE file distributed with
-#this work for additional information regarding copyright ownership.
-#The ASF licenses this file to You 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.
-#############################################################################
-
-navbar.menu.dashboard = Dashboard
-navbar.menu.statistics = Statistics
-navbar.menu.instances = Instances
-navbar.menu.settings = Settings
-navbar.menu.crawls = Crawls
-navbar.menu.scheduling = Scheduling
-navbar.menu.search = Search
-navbar.menu.url = URLs upload
-navbar.menu.seedLists = Seed lists
-
-page.header.seedList = Seed list
-
-navbar.userMenu.settings = Settings
-navbar.userMenu.logout = Log out
-
-menu.settings=Settings
-menu.instances=Instances
-
-connected=Connected
-disconnected=Disconnected
-
-##ENUMS
-ConnectionStatus.CONNECTING=Connecting
-ConnectionStatus.CONNECTED=Connected
-ConnectionStatus.DISCONNECTED=Disconnected
-
-CrawlStatus.NEW=New
-CrawlStatus.ERROR=Error
-CrawlStatus.CRAWLING=Crawling
-CrawlStatus.FINISHED=Finished
-
-instances=Instances
-instances.header.name=Instance name
-instances.header.hostname=Hostname
-instances.header.status=Status
-instances.header.username=Username
-instances.label.name=Instance name
-instances.label.hostname=Hostname
-instances.label.port=Port
-instances.label.username=Username
-instances.label.password=Password
-instances.buttons.addInstance=Add instance
-
-settings=Settings
-settings.header.name = Name
-settings.header.value = Value
\ No newline at end of file
diff --git a/src/java/org/apache/nutch/webui/NutchUiServer.java b/src/java/org/apache/nutch/webui/NutchUiServer.java
deleted file mode 100644
index 4af3915..0000000
--- a/src/java/org/apache/nutch/webui/NutchUiServer.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui;
-
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
-import org.apache.commons.cli.GnuParser;
-import org.apache.commons.cli.HelpFormatter;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.OptionBuilder;
-import org.apache.commons.cli.Options;
-import org.apache.hadoop.util.StringUtils;
-import org.apache.wicket.protocol.http.WicketFilter;
-import org.apache.wicket.spring.SpringWebApplicationFactory;
-import org.mortbay.jetty.Handler;
-import org.mortbay.jetty.Server;
-import org.mortbay.jetty.servlet.Context;
-import org.mortbay.jetty.servlet.DefaultServlet;
-import org.mortbay.jetty.servlet.FilterHolder;
-import org.springframework.web.context.ContextLoaderListener;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.context.request.RequestContextListener;
-import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
-
-public class NutchUiServer {
-  private static final String APP_FACTORY_NAME = SpringWebApplicationFactory.class
-      .getName();
-  private static final String CONFIG_LOCATION = "org.apache.nutch.webui";
-  private static final String CMD_PORT = "port";
-  private static Integer port = 8080;
-
-  public static void main(String[] args) throws Exception {
-    CommandLineParser parser = new GnuParser();
-    Options options = createWebAppOptions();
-    CommandLine commandLine = null;
-    HelpFormatter formatter = new HelpFormatter();
-    try {
-      commandLine = parser.parse(options, args);
-    } catch (Exception e) {
-      formatter.printHelp("NutchUiServer", options, true);
-      StringUtils.stringifyException(e);
-    }
-
-    if (commandLine.hasOption("help")) {
-      formatter.printHelp("NutchUiServer", options, true);
-      return;
-    }
-    if (commandLine.hasOption(CMD_PORT)) {
-      port = Integer.parseInt(commandLine.getOptionValue(CMD_PORT));
-    }
-    startServer();
-  }
-
-  private static void startServer() throws Exception, InterruptedException {
-    Server server = new Server(port);
-    Context context = new Context(server, "/", Context.SESSIONS);
-    context.addServlet(DefaultServlet.class, "/*");
-
-    context.addEventListener(new ContextLoaderListener(getContext()));
-    context.addEventListener(new RequestContextListener());
-
-    WicketFilter filter = new WicketFilter();
-    filter.setFilterPath("/");
-    FilterHolder holder = new FilterHolder(filter);
-    holder.setInitParameter("applicationFactoryClassName", APP_FACTORY_NAME);
-    context.addFilter(holder, "/*", Handler.DEFAULT);
-
-    server.setHandler(context);
-    server.start();
-    server.join();
-  }
-
-  private static WebApplicationContext getContext() {
-    AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
-    context.setConfigLocation(CONFIG_LOCATION);
-    return context;
-  }
-
-  private static Options createWebAppOptions() {
-    Options options = new Options();
-    Option helpOpt = new Option("h", "help", false, "show this help message");
-    OptionBuilder.withDescription("Port to run the WebApplication on.");
-    OptionBuilder.hasOptionalArg();
-    OptionBuilder.withArgName("port number");
-    options.addOption(OptionBuilder.create(CMD_PORT));
-    options.addOption(helpOpt);
-    return options;
-  }
-
-}
diff --git a/src/java/org/apache/nutch/webui/client/NutchClient.java b/src/java/org/apache/nutch/webui/client/NutchClient.java
deleted file mode 100644
index 5b2dab3..0000000
--- a/src/java/org/apache/nutch/webui/client/NutchClient.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.client;
-
-import java.util.Map;
-
-import org.apache.nutch.webui.client.model.ConnectionStatus;
-import org.apache.nutch.webui.client.model.JobConfig;
-import org.apache.nutch.webui.client.model.JobInfo;
-import org.apache.nutch.webui.client.model.NutchStatus;
-import org.apache.nutch.webui.model.NutchInstance;
-import org.apache.nutch.webui.model.SeedList;
-
-public interface NutchClient {
-
-  public NutchInstance getNutchInstance();
-
-  public NutchStatus getNutchStatus();
-
-  public ConnectionStatus getConnectionStatus();
-
-  public String executeJob(JobConfig jobConfig);
-
-  public JobInfo getJobInfo(String jobId);
-
-  public Map<String, String> getNutchConfig(String config);
-
-  /**
-   * Create seed list and return seed directory location
-   * 
-   * @param seedList a populated {@link org.apache.nutch.webui.model.SeedList}
-   * @return a JSON HTTP response indicating the seed creation result
-   */
-  public String createSeed(SeedList seedList);
-}
diff --git a/src/java/org/apache/nutch/webui/client/NutchClientFactory.java b/src/java/org/apache/nutch/webui/client/NutchClientFactory.java
deleted file mode 100644
index e51ae5a..0000000
--- a/src/java/org/apache/nutch/webui/client/NutchClientFactory.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.client;
-
-import java.util.concurrent.ExecutionException;
-
-import org.apache.nutch.webui.client.impl.NutchClientImpl;
-import org.apache.nutch.webui.model.NutchInstance;
-import org.springframework.stereotype.Component;
-
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-
-@Component
-public class NutchClientFactory {
-  private LoadingCache<NutchInstance, NutchClient> cache;
-
-  public NutchClientFactory() {
-    cache = CacheBuilder.newBuilder().build(new NutchClientCacheLoader());
-  }
-
-  public NutchClient getClient(NutchInstance instance) {
-    try {
-      return cache.get(instance);
-    } catch (ExecutionException e) {
-      throw new IllegalStateException(e);
-    }
-  }
-
-  private static class NutchClientCacheLoader extends
-      CacheLoader<NutchInstance, NutchClient> {
-    @Override
-    public NutchClient load(NutchInstance key) throws Exception {
-      return new NutchClientImpl(key);
-    }
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/client/impl/CrawlingCycle.java b/src/java/org/apache/nutch/webui/client/impl/CrawlingCycle.java
deleted file mode 100644
index 4ddcfbb..0000000
--- a/src/java/org/apache/nutch/webui/client/impl/CrawlingCycle.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.client.impl;
-
-import java.lang.invoke.MethodHandles;
-import java.util.List;
-
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.nutch.webui.client.model.Crawl;
-import org.apache.nutch.webui.client.model.JobInfo;
-import org.apache.nutch.webui.client.model.JobInfo.State;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.collect.Lists;
-
-/**
- * This class implements crawl cycle as in crawl script
- * 
- * @author feodor
- * 
- */
-public class CrawlingCycle {
-  private static final Logger LOG = LoggerFactory
-      .getLogger(MethodHandles.lookup().lookupClass());
-
-  private CrawlingCycleListener listener;
-  private RemoteCommandExecutor executor;
-  private Crawl crawl;
-
-  private List<RemoteCommand> remoteCommands;
-  private List<RemoteCommand> executedCommands = Lists.newArrayList();
-
-  public CrawlingCycle(CrawlingCycleListener listener,
-      RemoteCommandExecutor executor, Crawl crawl, List<RemoteCommand> commands) {
-    this.listener = listener;
-    this.executor = executor;
-    this.crawl = crawl;
-    this.remoteCommands = commands;
-  }
-
-  public synchronized void executeCrawlCycle() {
-    listener.crawlingStarted(crawl);
-
-    for (RemoteCommand command : remoteCommands) {
-      JobInfo jobInfo = executor.executeRemoteJob(command);
-      command.setJobInfo(jobInfo);
-
-      LOG.info("Executed remote command data: {}", command);
-
-      if (jobInfo.getState() == State.FAILED) {
-        listener.onCrawlError(crawl, jobInfo.getMsg());
-        return;
-      }
-
-      executedCommands.add(command);
-      listener.commandExecuted(crawl, command, calculateProgress());
-    }
-    listener.crawlingFinished(crawl);
-  }
-
-  private int calculateProgress() {
-    if (CollectionUtils.isEmpty(remoteCommands)) {
-      return 0;
-    }
-    return (int) ((float) executedCommands.size()
-        / (float) remoteCommands.size() * 100);
-  }
-
-}
diff --git a/src/java/org/apache/nutch/webui/client/impl/CrawlingCycleListener.java b/src/java/org/apache/nutch/webui/client/impl/CrawlingCycleListener.java
deleted file mode 100644
index 86c916e..0000000
--- a/src/java/org/apache/nutch/webui/client/impl/CrawlingCycleListener.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.client.impl;
-
-import org.apache.nutch.webui.client.model.Crawl;
-
-public interface CrawlingCycleListener {
-
-  void crawlingStarted(Crawl crawl);
-
-  void onCrawlError(Crawl crawl, String msg);
-
-  void commandExecuted(Crawl crawl, RemoteCommand command, int progress);
-
-  void crawlingFinished(Crawl crawl);
-
-}
diff --git a/src/java/org/apache/nutch/webui/client/impl/NutchClientImpl.java b/src/java/org/apache/nutch/webui/client/impl/NutchClientImpl.java
deleted file mode 100644
index 671f735..0000000
--- a/src/java/org/apache/nutch/webui/client/impl/NutchClientImpl.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.client.impl;
-
-import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
-
-import java.util.Map;
-
-import org.apache.nutch.webui.client.NutchClient;
-import org.apache.nutch.webui.client.model.ConnectionStatus;
-import org.apache.nutch.webui.client.model.JobConfig;
-import org.apache.nutch.webui.client.model.JobInfo;
-import org.apache.nutch.webui.client.model.NutchStatus;
-import org.apache.nutch.webui.model.NutchInstance;
-import org.apache.nutch.webui.model.SeedList;
-
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.WebResource;
-import com.sun.jersey.api.client.config.ClientConfig;
-import com.sun.jersey.api.client.config.DefaultClientConfig;
-import com.sun.jersey.api.json.JSONConfiguration;
-
-public class NutchClientImpl implements NutchClient {
-  private Client client;
-  private WebResource nutchResource;
-  private NutchInstance instance;
-
-  public NutchClientImpl(NutchInstance instance) {
-    this.instance = instance;
-    createClient();
-  }
-
-  public void createClient() {
-    ClientConfig clientConfig = new DefaultClientConfig();
-    clientConfig.getFeatures()
-        .put(JSONConfiguration.FEATURE_POJO_MAPPING, true);
-    this.client = Client.create(clientConfig);
-    this.nutchResource = client.resource(instance.getUrl());
-  }
-
-  @Override
-  public NutchStatus getNutchStatus() {
-    return nutchResource.path("/admin").type(APPLICATION_JSON)
-        .get(NutchStatus.class);
-  }
-
-  @Override
-  public ConnectionStatus getConnectionStatus() {
-
-    getNutchStatus();
-    return ConnectionStatus.CONNECTED;
-    // TODO implement disconnected status
-  }
-
-  @Override
-  public String executeJob(JobConfig jobConfig) {
-    JobInfo jobInfo = nutchResource.path("/job/create").type(APPLICATION_JSON)
-        .post(JobInfo.class, jobConfig);
-    return jobInfo.getId();
-  }
-
-  @Override
-  public JobInfo getJobInfo(String jobId) {
-    return nutchResource.path("/job/" + jobId).type(APPLICATION_JSON)
-        .get(JobInfo.class);
-  }
-
-  @Override
-  public NutchInstance getNutchInstance() {
-    return instance;
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public Map<String, String> getNutchConfig(String config) {
-    return nutchResource.path("/config/" + config).type(APPLICATION_JSON)
-        .get(Map.class);
-  }
-
-  @Override
-  public String createSeed(SeedList seedList) {
-    return nutchResource.path("/seed/create").type(APPLICATION_JSON)
-        .post(String.class, seedList);
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/client/impl/RemoteCommand.java b/src/java/org/apache/nutch/webui/client/impl/RemoteCommand.java
deleted file mode 100644
index 173223e..0000000
--- a/src/java/org/apache/nutch/webui/client/impl/RemoteCommand.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.client.impl;
-
-import java.io.Serializable;
-import java.text.MessageFormat;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.nutch.webui.client.model.JobConfig;
-import org.apache.nutch.webui.client.model.JobInfo;
-import org.joda.time.Duration;
-
-public class RemoteCommand implements Serializable {
-  private JobConfig jobConfig;
-  private JobInfo jobInfo = new JobInfo();
-  private Duration timeout;
-
-  /**
-   * Use {@link RemoteCommandBuilder} instead
-   */
-  @SuppressWarnings("unused")
-  private RemoteCommand() {
-  }
-
-  public RemoteCommand(JobConfig jobConfig) {
-    this.jobConfig = jobConfig;
-  }
-
-  public JobConfig getJobConfig() {
-    return jobConfig;
-  }
-
-  public void setJobConfig(JobConfig jobConfig) {
-    this.jobConfig = jobConfig;
-  }
-
-  public JobInfo getJobInfo() {
-    return jobInfo;
-  }
-
-  public void setJobInfo(JobInfo jobInfo) {
-    this.jobInfo = jobInfo;
-  }
-
-  public Duration getTimeout() {
-    return timeout;
-  }
-
-  public void setTimeout(Duration timeout) {
-    this.timeout = timeout;
-  }
-
-  @Override
-  public String toString() {
-    String statusInfo = StringUtils.EMPTY;
-    if (jobInfo != null) {
-      statusInfo = MessageFormat.format("{0}", jobInfo.getState());
-    }
-    return MessageFormat.format("{0} status: {1}", jobConfig.getType(),
-        statusInfo);
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/client/impl/RemoteCommandBuilder.java b/src/java/org/apache/nutch/webui/client/impl/RemoteCommandBuilder.java
deleted file mode 100644
index ceb59b1..0000000
--- a/src/java/org/apache/nutch/webui/client/impl/RemoteCommandBuilder.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.client.impl;
-
-import org.apache.nutch.webui.client.model.JobConfig;
-import org.apache.nutch.webui.client.model.JobInfo.JobType;
-import org.joda.time.Duration;
-
-public class RemoteCommandBuilder {
-  private JobConfig jobConfig = new JobConfig();
-  private Duration timeout = Duration.standardSeconds(10);
-
-  private RemoteCommandBuilder() {
-  }
-
-  public static RemoteCommandBuilder instance(JobType jobType) {
-    return new RemoteCommandBuilder().withJobType(jobType);
-  }
-
-  public RemoteCommandBuilder withJobType(JobType jobType) {
-    jobConfig.setType(jobType);
-    return this;
-  }
-
-  public RemoteCommandBuilder withConfigId(String configId) {
-    jobConfig.setConfId(configId);
-    return this;
-  }
-
-  public RemoteCommandBuilder withCrawlId(String crawlId) {
-    jobConfig.setCrawlId(crawlId);
-    return this;
-  }
-
-  public RemoteCommandBuilder withArgument(String key, String value) {
-    jobConfig.setArgument(key, value);
-    return this;
-  }
-
-  public RemoteCommandBuilder withTimeout(Duration timeout) {
-    this.timeout = timeout;
-    return this;
-  }
-
-  public RemoteCommand build() {
-    RemoteCommand remoteCommand = new RemoteCommand(jobConfig);
-    remoteCommand.setTimeout(timeout);
-    return remoteCommand;
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/client/impl/RemoteCommandExecutor.java b/src/java/org/apache/nutch/webui/client/impl/RemoteCommandExecutor.java
deleted file mode 100644
index 30fcf4d..0000000
--- a/src/java/org/apache/nutch/webui/client/impl/RemoteCommandExecutor.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.client.impl;
-
-import static com.google.common.base.Preconditions.checkState;
-
-import java.lang.invoke.MethodHandles;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.apache.nutch.webui.client.NutchClient;
-import org.apache.nutch.webui.client.model.JobInfo;
-import org.apache.nutch.webui.client.model.JobInfo.State;
-import org.joda.time.DateTimeConstants;
-import org.joda.time.Duration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * This class executes remote job and waits for success/failure result
- * 
- * @author feodor
- * 
- */
-public class RemoteCommandExecutor {
-  private static final Logger LOG = LoggerFactory
-      .getLogger(MethodHandles.lookup().lookupClass());
-
-  private static final int DEFAULT_TIMEOUT_SEC = 60;
-  private Duration requestDelay = new Duration(500);
-
-  private NutchClient client;
-  private ExecutorService executor;
-
-  public RemoteCommandExecutor(NutchClient client) {
-    this.client = client;
-    this.executor = Executors.newSingleThreadExecutor();
-  }
-
-  public JobInfo executeRemoteJob(RemoteCommand command) {
-    try {
-      String jobId = client.executeJob(command.getJobConfig());
-      Future<JobInfo> chekerFuture = executor
-          .submit(new JobStateChecker(jobId));
-      return chekerFuture.get(getTimeout(command), TimeUnit.MILLISECONDS);
-    } catch (Exception e) {
-      LOG.error("Remote command failed", e);
-      JobInfo jobInfo = new JobInfo();
-      jobInfo.setState(State.FAILED);
-      jobInfo.setMsg(ExceptionUtils.getStackTrace(e));
-      return jobInfo;
-    }
-  }
-
-  private long getTimeout(RemoteCommand command) {
-    if (command.getTimeout() == null) {
-      return DEFAULT_TIMEOUT_SEC * DateTimeConstants.MILLIS_PER_SECOND;
-    }
-    return command.getTimeout().getMillis();
-  }
-
-  public void setRequestDelay(Duration requestDelay) {
-    this.requestDelay = requestDelay;
-  }
-
-  public class JobStateChecker implements Callable<JobInfo> {
-
-    private String jobId;
-
-    public JobStateChecker(String jobId) {
-      this.jobId = jobId;
-    }
-
-    @Override
-    public JobInfo call() throws Exception {
-      while (!Thread.interrupted()) {
-        JobInfo jobInfo = client.getJobInfo(jobId);
-        checkState(jobInfo != null, "Cannot get job info!");
-
-        State state = jobInfo.getState();
-        checkState(state != null, "Unknown job state!");
-
-        if (state == State.RUNNING || state == State.ANY || state == State.IDLE) {
-          Thread.sleep(requestDelay.getMillis());
-          continue;
-        }
-
-        return jobInfo;
-      }
-      return null;
-    }
-
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/client/impl/RemoteCommandsBatchFactory.java b/src/java/org/apache/nutch/webui/client/impl/RemoteCommandsBatchFactory.java
deleted file mode 100644
index 00ff13f..0000000
--- a/src/java/org/apache/nutch/webui/client/impl/RemoteCommandsBatchFactory.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.client.impl;
-
-import java.util.List;
-import java.util.UUID;
-
-import org.apache.nutch.webui.client.model.Crawl;
-import org.apache.nutch.webui.client.model.JobInfo.JobType;
-import org.joda.time.Duration;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import com.google.common.collect.Lists;
-
-@Component
-@Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RemoteCommandsBatchFactory {
-
-  private List<RemoteCommand> remoteCommands;
-  private Crawl crawl;
-
-  private String batchId;
-
-  public List<RemoteCommand> createCommands(Crawl crawl) {
-    this.crawl = crawl;
-    this.remoteCommands = Lists.newArrayList();
-
-    remoteCommands.add(inject());
-    for (int i = 0; i < crawl.getNumberOfRounds(); i++) {
-      remoteCommands.addAll(createBatchCommands());
-    }
-    return remoteCommands;
-  }
-
-  private List<RemoteCommand> createBatchCommands() {
-    this.batchId = UUID.randomUUID().toString();
-    List<RemoteCommand> batchCommands = Lists.newArrayList();
-
-    batchCommands.add(createGenerateCommand());
-    batchCommands.add(createFetchCommand());
-    batchCommands.add(createParseCommand());
-    batchCommands.add(createUpdateDbCommand());
-    batchCommands.add(createIndexCommand());
-
-    return batchCommands;
-  }
-
-  private RemoteCommand inject() {
-    RemoteCommandBuilder builder = RemoteCommandBuilder
-        .instance(JobType.INJECT).withCrawlId(crawl.getCrawlId())
-        .withArgument("url_dir", crawl.getSeedDirectory());
-    return builder.build();
-  }
-
-  private RemoteCommand createGenerateCommand() {
-    return createBuilder(JobType.GENERATE).build();
-  }
-
-  private RemoteCommand createFetchCommand() {
-    return createBuilder(JobType.FETCH).withTimeout(
-        Duration.standardSeconds(50)).build();
-  }
-
-  private RemoteCommand createParseCommand() {
-    return createBuilder(JobType.PARSE).build();
-  }
-
-  private RemoteCommand createIndexCommand() {
-    return createBuilder(JobType.INDEX).build();
-  }
-
-  private RemoteCommand createUpdateDbCommand() {
-    return createBuilder(JobType.UPDATEDB).build();
-  }
-
-  private RemoteCommandBuilder createBuilder(JobType jobType) {
-    return RemoteCommandBuilder.instance(jobType)
-        .withCrawlId(crawl.getCrawlId()).withArgument("batch", batchId);
-  }
-
-}
diff --git a/src/java/org/apache/nutch/webui/client/model/ConnectionStatus.java b/src/java/org/apache/nutch/webui/client/model/ConnectionStatus.java
deleted file mode 100644
index 66dec88..0000000
--- a/src/java/org/apache/nutch/webui/client/model/ConnectionStatus.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.client.model;
-
-public enum ConnectionStatus {
-  CONNECTING, CONNECTED, DISCONNECTED;
-}
diff --git a/src/java/org/apache/nutch/webui/client/model/Crawl.java b/src/java/org/apache/nutch/webui/client/model/Crawl.java
deleted file mode 100644
index bb818c5..0000000
--- a/src/java/org/apache/nutch/webui/client/model/Crawl.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.client.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-import org.apache.nutch.webui.model.SeedList;
-
-import com.j256.ormlite.field.DatabaseField;
-
-@Entity
-public class Crawl implements Serializable {
-  public enum CrawlStatus {
-    NEW, CRAWLING, FINISHED, ERROR
-  }
-
-  @Id
-  @GeneratedValue
-  private Long id;
-
-  @Column
-  private String crawlId;
-
-  @Column
-  private String crawlName;
-
-  @Column
-  private CrawlStatus status = CrawlStatus.NEW;
-
-  @Column
-  private Integer numberOfRounds = 1;
-
-  @Column
-  @DatabaseField(foreign = true, foreignAutoRefresh = true)
-  private SeedList seedList;
-
-  @Column
-  private String seedDirectory;
-
-  @Column
-  private int progress;
-
-  public Integer getNumberOfRounds() {
-    return numberOfRounds;
-  }
-
-  public void setNumberOfRounds(Integer numberOfRounds) {
-    this.numberOfRounds = numberOfRounds;
-  }
-
-  public String getCrawlId() {
-    return crawlId;
-  }
-
-  public void setCrawlId(String crawlId) {
-    this.crawlId = crawlId;
-  }
-
-  public CrawlStatus getStatus() {
-    return status;
-  }
-
-  public void setStatus(CrawlStatus status) {
-    this.status = status;
-  }
-
-  public String getCrawlName() {
-    return crawlName;
-  }
-
-  public void setCrawlName(String crawlName) {
-    this.crawlName = crawlName;
-  }
-
-  public SeedList getSeedList() {
-    return seedList;
-  }
-
-  public void setSeedList(SeedList seedList) {
-    this.seedList = seedList;
-  }
-
-  public Long getId() {
-    return id;
-  }
-
-  public void setId(Long id) {
-    this.id = id;
-  }
-
-  public String getSeedDirectory() {
-    return seedDirectory;
-  }
-
-  public void setSeedDirectory(String seedDirectory) {
-    this.seedDirectory = seedDirectory;
-  }
-
-  public int getProgress() {
-    return progress;
-  }
-
-  public void setProgress(int progress) {
-    this.progress = progress;
-  }
-
-}
diff --git a/src/java/org/apache/nutch/webui/client/model/JobConfig.java b/src/java/org/apache/nutch/webui/client/model/JobConfig.java
deleted file mode 100644
index c15444b..0000000
--- a/src/java/org/apache/nutch/webui/client/model/JobConfig.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.client.model;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.Map;
-
-import org.apache.nutch.webui.client.model.JobInfo.JobType;
-
-import com.google.common.collect.Maps;
-
-public class JobConfig implements Serializable {
-  private String crawlId;
-  private JobType type;
-  private String confId = "default";
-  private String jobClassName;
-  private Map<String, Object> args = Maps.newHashMap();
-
-  public void setArgument(String key, String value) {
-    args.put(key, value);
-  }
-
-  public String getCrawlId() {
-    return crawlId;
-  }
-
-  public void setCrawlId(String crawlId) {
-    this.crawlId = crawlId;
-  }
-
-  public JobType getType() {
-    return type;
-  }
-
-  public void setType(JobType type) {
-    this.type = type;
-  }
-
-  public String getConfId() {
-    return confId;
-  }
-
-  public void setConfId(String confId) {
-    this.confId = confId;
-  }
-
-  public Map<String, Object> getArgs() {
-    return Collections.unmodifiableMap(args);
-  }
-
-  public void setArgs(Map<String, Object> args) {
-    this.args = args;
-  }
-
-  public String getJobClassName() {
-    return jobClassName;
-  }
-
-  public void setJobClassName(String jobClass) {
-    this.jobClassName = jobClass;
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/client/model/JobInfo.java b/src/java/org/apache/nutch/webui/client/model/JobInfo.java
deleted file mode 100644
index e293f4d..0000000
--- a/src/java/org/apache/nutch/webui/client/model/JobInfo.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.client.model;
-
-import java.io.Serializable;
-import java.util.Map;
-
-public class JobInfo implements Serializable {
-  public static enum JobType {
-    INJECT, GENERATE, FETCH, PARSE, UPDATEDB, INDEX, READDB, CLASS
-  };
-
-  public static enum State {
-    IDLE, RUNNING, FINISHED, FAILED, KILLED, STOPPING, KILLING, ANY
-  };
-
-  private String id;
-  private String type;
-  private String confId;
-  private Map<String, Object> args;
-  private Map<String, Object> result;
-  private State state;
-  private String msg;
-  private String crawlId;
-
-  public String getMsg() {
-    return msg;
-  }
-
-  public void setMsg(String msg) {
-    this.msg = msg;
-  }
-
-  public State getState() {
-    return state;
-  }
-
-  public void setState(State state) {
-    this.state = state;
-  }
-
-  public Map<String, Object> getResult() {
-    return result;
-  }
-
-  public void setResult(Map<String, Object> result) {
-    this.result = result;
-  }
-
-  public Map<String, Object> getArgs() {
-    return args;
-  }
-
-  public void setArgs(Map<String, Object> args) {
-    this.args = args;
-  }
-
-  public String getConfId() {
-    return confId;
-  }
-
-  public void setConfId(String confId) {
-    this.confId = confId;
-  }
-
-  public String getId() {
-    return id;
-  }
-
-  public void setId(String id) {
-    this.id = id;
-  }
-
-  public String getCrawlId() {
-    return crawlId;
-  }
-
-  public void setCrawlId(String crawlId) {
-    this.crawlId = crawlId;
-  }
-
-  public String getType() {
-    return type;
-  }
-
-  public void setType(String type) {
-    this.type = type;
-  }
-
-}
diff --git a/src/java/org/apache/nutch/webui/client/model/NutchStatus.java b/src/java/org/apache/nutch/webui/client/model/NutchStatus.java
deleted file mode 100644
index 3c8c137..0000000
--- a/src/java/org/apache/nutch/webui/client/model/NutchStatus.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.client.model;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.Date;
-import java.util.Set;
-
-public class NutchStatus implements Serializable {
-
-  private Date startDate;
-  private Set<String> configuration;
-  private Collection<JobInfo> jobs;
-  private Collection<JobInfo> runningJobs;
-
-  public Date getStartDate() {
-    return startDate;
-  }
-
-  public void setStartDate(Date startDate) {
-    this.startDate = startDate;
-  }
-
-  public Set<String> getConfiguration() {
-    return configuration;
-  }
-
-  public void setConfiguration(Set<String> configuration) {
-    this.configuration = configuration;
-  }
-
-  public Collection<JobInfo> getJobs() {
-    return jobs;
-  }
-
-  public void setJobs(Collection<JobInfo> jobs) {
-    this.jobs = jobs;
-  }
-
-  public Collection<JobInfo> getRunningJobs() {
-    return runningJobs;
-  }
-
-  public void setRunningJobs(Collection<JobInfo> runningJobs) {
-    this.runningJobs = runningJobs;
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/config/CustomDaoFactory.java b/src/java/org/apache/nutch/webui/config/CustomDaoFactory.java
deleted file mode 100644
index 26fbece..0000000
--- a/src/java/org/apache/nutch/webui/config/CustomDaoFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.config;
-
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import com.j256.ormlite.dao.Dao;
-import com.j256.ormlite.spring.DaoFactory;
-import com.j256.ormlite.support.ConnectionSource;
-
-public class CustomDaoFactory {
-  private ConnectionSource connectionSource;
-  private List<Dao<?, ?>> registredDaos = Collections
-      .synchronizedList(new ArrayList<Dao<?, ?>>());
-
-  public CustomDaoFactory(ConnectionSource connectionSource) {
-    this.connectionSource = connectionSource;
-  }
-
-  public <T, ID> Dao<T, ID> createDao(Class<T> clazz) {
-    try {
-      Dao<T, ID> dao = DaoFactory.createDao(connectionSource, clazz);
-      register(dao);
-      return dao;
-    } catch (SQLException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  private <T, ID> void register(Dao<T, ID> dao) {
-    synchronized (registredDaos) {
-      registredDaos.add(dao);
-    }
-  }
-
-  public List<Dao<?, ?>> getCreatedDaos() {
-    synchronized (registredDaos) {
-      return Collections.unmodifiableList(registredDaos);
-    }
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/config/CustomTableCreator.java b/src/java/org/apache/nutch/webui/config/CustomTableCreator.java
deleted file mode 100644
index 87a0e64..0000000
--- a/src/java/org/apache/nutch/webui/config/CustomTableCreator.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.config;
-
-import java.sql.SQLException;
-import java.util.List;
-
-import com.j256.ormlite.dao.BaseDaoImpl;
-import com.j256.ormlite.dao.Dao;
-import com.j256.ormlite.support.ConnectionSource;
-import com.j256.ormlite.table.DatabaseTableConfig;
-import com.j256.ormlite.table.TableUtils;
-
-public class CustomTableCreator {
-
-  private ConnectionSource connectionSource;
-  private List<Dao<?, ?>> configuredDaos;
-
-  public CustomTableCreator(ConnectionSource connectionSource,
-      List<Dao<?, ?>> configuredDaos) {
-    this.connectionSource = connectionSource;
-    this.configuredDaos = configuredDaos;
-    initialize();
-  }
-
-  private void initialize() {
-    if (configuredDaos == null) {
-      throw new IllegalStateException("configuredDaos was not set in "
-          + getClass().getSimpleName());
-    }
-
-    for (Dao<?, ?> dao : configuredDaos) {
-      createTableForDao(dao);
-    }
-  }
-
-  private void createTableForDao(Dao<?, ?> dao) {
-    DatabaseTableConfig<?> tableConfig = getTableConfig(dao);
-    createTableIfNotExists(tableConfig);
-  }
-
-  private DatabaseTableConfig<?> getTableConfig(Dao<?, ?> dao) {
-    Class<?> clazz = dao.getDataClass();
-    DatabaseTableConfig<?> tableConfig = null;
-    if (dao instanceof BaseDaoImpl) {
-      tableConfig = ((BaseDaoImpl<?, ?>) dao).getTableConfig();
-    }
-    if (tableConfig == null) {
-      return getConfigFromClass(clazz);
-    }
-    return tableConfig;
-  }
-
-  private DatabaseTableConfig<?> getConfigFromClass(Class<?> clazz) {
-    try {
-      return DatabaseTableConfig.fromClass(connectionSource, clazz);
-    } catch (SQLException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  private void createTableIfNotExists(DatabaseTableConfig<?> tableConfig) {
-    try {
-      TableUtils.createTableIfNotExists(connectionSource, tableConfig);
-    } catch (SQLException e) {
-      throw new RuntimeException(e);
-    }
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/config/NutchGuiConfiguration.java b/src/java/org/apache/nutch/webui/config/NutchGuiConfiguration.java
deleted file mode 100644
index 82cab4c..0000000
--- a/src/java/org/apache/nutch/webui/config/NutchGuiConfiguration.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.config;
-
-import java.util.List;
-
-import org.apache.nutch.webui.model.NutchInstance;
-
-public class NutchGuiConfiguration {
-  private List<NutchInstance> instances;
-
-  public List<NutchInstance> getInstances() {
-    return instances;
-  }
-
-  public void setInstances(List<NutchInstance> instances) {
-    this.instances = instances;
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/config/SpringConfiguration.java b/src/java/org/apache/nutch/webui/config/SpringConfiguration.java
deleted file mode 100644
index 7783d78..0000000
--- a/src/java/org/apache/nutch/webui/config/SpringConfiguration.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.config;
-
-import java.sql.SQLException;
-import java.util.concurrent.Executor;
-
-import org.apache.nutch.webui.client.model.Crawl;
-import org.apache.nutch.webui.model.NutchInstance;
-import org.apache.nutch.webui.model.SeedList;
-import org.apache.nutch.webui.model.SeedUrl;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.scheduling.annotation.AsyncConfigurer;
-import org.springframework.scheduling.annotation.EnableAsync;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
-
-import com.j256.ormlite.dao.Dao;
-import com.j256.ormlite.db.H2DatabaseType;
-import com.j256.ormlite.jdbc.JdbcConnectionSource;
-
-@Configuration
-@EnableAsync
-public class SpringConfiguration implements AsyncConfigurer {
-
-  @Override
-  public Executor getAsyncExecutor() {
-    // TODO move magic numbers to properties file
-    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
-    executor.setCorePoolSize(7);
-    executor.setMaxPoolSize(42);
-    executor.setQueueCapacity(11);
-    executor.setThreadNamePrefix("SpringExecutor-");
-    executor.initialize();
-    return executor;
-  }
-
-  @Bean
-  public JdbcConnectionSource getConnectionSource() throws SQLException {
-    JdbcConnectionSource source = new JdbcConnectionSource(
-        "jdbc:h2:~/.nutch/config", new H2DatabaseType());
-    source.initialize();
-    return source;
-  }
-
-  @Bean
-  public CustomDaoFactory getDaoFactory() throws SQLException {
-    return new CustomDaoFactory(getConnectionSource());
-  }
-
-  @Bean
-  public Dao<NutchInstance, Long> createNutchDao() throws SQLException {
-    return getDaoFactory().createDao(NutchInstance.class);
-  }
-
-  @Bean
-  public Dao<SeedList, Long> createSeedListDao() throws SQLException {
-    return getDaoFactory().createDao(SeedList.class);
-  }
-
-  @Bean
-  public Dao<SeedUrl, Long> createSeedUrlDao() throws SQLException {
-    return getDaoFactory().createDao(SeedUrl.class);
-  }
-
-  @Bean
-  public Dao<Crawl, Long> createCrawlDao() throws SQLException {
-    return getDaoFactory().createDao(Crawl.class);
-  }
-
-  @Bean
-  public CustomTableCreator createTableCreator() throws SQLException {
-    return new CustomTableCreator(getConnectionSource(), getDaoFactory()
-        .getCreatedDaos());
-  }
-
-}
diff --git a/src/java/org/apache/nutch/webui/model/NutchConfig.java b/src/java/org/apache/nutch/webui/model/NutchConfig.java
deleted file mode 100644
index 7acf9ad..0000000
--- a/src/java/org/apache/nutch/webui/model/NutchConfig.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.model;
-
-import java.io.Serializable;
-
-public class NutchConfig implements Serializable {
-  private String name = "name";
-  private String value;
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public String getName() {
-    return this.name;
-  }
-
-  public String getValue() {
-    return value;
-  }
-
-  public void setValue(String value) {
-    this.value = value;
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/model/NutchInstance.java b/src/java/org/apache/nutch/webui/model/NutchInstance.java
deleted file mode 100644
index 3800df2..0000000
--- a/src/java/org/apache/nutch/webui/model/NutchInstance.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.model;
-
-import java.io.Serializable;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-import org.apache.nutch.webui.client.model.ConnectionStatus;
-
-@Entity
-public class NutchInstance implements Serializable {
-
-  @Id
-  @GeneratedValue
-  private Long id;
-
-  @Column
-  private String name = "localhost";
-
-  @Column
-  private String host = "localhost";
-
-  @Column
-  private Integer port = 8081;
-
-  @Column
-  private String username;
-
-  @Column
-  private String password;
-
-  private ConnectionStatus connectionStatus;
-
-  public String getName() {
-    return name;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public String getHost() {
-    return host;
-  }
-
-  public void setUsername(String username) {
-    this.username = username;
-  }
-
-  public String getUsername() {
-    return username;
-  }
-
-  public void setHost(String host) {
-    this.host = host;
-  }
-
-  public Integer getPort() {
-    return port;
-  }
-
-  public void setPort(Integer port) {
-    this.port = port;
-  }
-
-  public ConnectionStatus getConnectionStatus() {
-    return connectionStatus;
-  }
-
-  public void setConnectionStatus(ConnectionStatus connectionStatus) {
-    this.connectionStatus = connectionStatus;
-  }
-
-  public URI getUrl() {
-    try {
-      return new URI("http", null, host, port, null, null, null);
-    } catch (URISyntaxException e) {
-      throw new IllegalStateException("Cannot parse url parameters", e);
-    }
-  }
-
-  public String getPassword() {
-    return password;
-  }
-
-  public void setPassword(String password) {
-    this.password = password;
-  }
-
-  public Long getId() {
-    return id;
-  }
-
-  public void setId(Long id) {
-    this.id = id;
-  }
-
-}
diff --git a/src/java/org/apache/nutch/webui/model/SeedList.java b/src/java/org/apache/nutch/webui/model/SeedList.java
deleted file mode 100644
index a963e94..0000000
--- a/src/java/org/apache/nutch/webui/model/SeedList.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.model;
-
-import java.io.Serializable;
-import java.util.Collection;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-
-import org.apache.commons.collections4.CollectionUtils;
-import org.codehaus.jackson.annotate.JsonIgnore;
-
-import com.fasterxml.jackson.annotation.JsonManagedReference;
-import com.j256.ormlite.field.ForeignCollectionField;
-
-@Entity
-public class SeedList implements Serializable {
-
-  @Id
-  @GeneratedValue
-  private Long id;
-
-  @Column
-  private String name;
-
-  @OneToMany
-  @ForeignCollectionField(eager = true)
-  @JsonManagedReference
-  private Collection<SeedUrl> seedUrls;
-
-  public Long getId() {
-    return id;
-  }
-
-  public void setId(Long id) {
-    this.id = id;
-  }
-
-  @JsonIgnore
-  public int getSeedUrlsCount() {
-    if (CollectionUtils.isEmpty(seedUrls)) {
-      return 0;
-    }
-    return seedUrls.size();
-  }
-
-  public Collection<SeedUrl> getSeedUrls() {
-    return seedUrls;
-  }
-
-  public void setSeedUrls(Collection<SeedUrl> seedUrls) {
-    this.seedUrls = seedUrls;
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  @Override
-  public int hashCode() {
-    final int prime = 31;
-    int result = 1;
-    result = prime * result + ((id == null) ? 0 : id.hashCode());
-    return result;
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (this == obj)
-      return true;
-    if (obj == null)
-      return false;
-    if (getClass() != obj.getClass())
-      return false;
-    SeedList other = (SeedList) obj;
-    if (id == null) {
-      if (other.id != null)
-        return false;
-    } else if (!id.equals(other.id))
-      return false;
-    return true;
-  }
-
-}
diff --git a/src/java/org/apache/nutch/webui/model/SeedUrl.java b/src/java/org/apache/nutch/webui/model/SeedUrl.java
deleted file mode 100644
index b45164c..0000000
--- a/src/java/org/apache/nutch/webui/model/SeedUrl.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-import org.codehaus.jackson.annotate.JsonIgnore;
-
-import com.fasterxml.jackson.annotation.JsonBackReference;
-import com.j256.ormlite.field.DatabaseField;
-
-@Entity
-public class SeedUrl implements Serializable {
-
-  @Id
-  @GeneratedValue
-  private Long id;
-
-  @Column
-  @DatabaseField(foreign = true, foreignAutoCreate = true, foreignAutoRefresh = true)
-  @JsonBackReference
-  private SeedList seedList;
-
-  @Column
-  private String url;
-
-  public Long getId() {
-    return id;
-  }
-
-  public void setId(Long id) {
-    this.id = id;
-  }
-
-  public String getUrl() {
-    return url;
-  }
-
-  public void setUrl(String url) {
-    this.url = url;
-  }
-
-  @JsonIgnore
-  public SeedList getSeedList() {
-    return seedList;
-  }
-
-  @JsonIgnore
-  public void setSeedList(SeedList seedList) {
-    this.seedList = seedList;
-  }
-
-  @Override
-  public int hashCode() {
-    final int prime = 31;
-    int result = 1;
-    result = prime * result + ((id == null) ? 0 : id.hashCode());
-    return result;
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (this == obj)
-      return true;
-    if (obj == null)
-      return false;
-    if (getClass() != obj.getClass())
-      return false;
-    SeedUrl other = (SeedUrl) obj;
-    if (id == null) {
-      if (other.id != null)
-        return false;
-    } else if (!id.equals(other.id))
-      return false;
-    return true;
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/pages/AbstractBasePage.html b/src/java/org/apache/nutch/webui/pages/AbstractBasePage.html
deleted file mode 100644
index 101a0f3..0000000
--- a/src/java/org/apache/nutch/webui/pages/AbstractBasePage.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
-	license agreements. See the NOTICE file distributed with this work for additional 
-	information regarding copyright ownership. The ASF licenses this file to 
-	You 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. -->
-<!DOCTYPE html>
-<html xmlns:wicket="http://wicket.apache.org">
-<head>
-<meta charset="utf-8">
-<meta http-equiv="X-UA-Compatible" content="IE=edge">
-<meta name="viewport" content="width=device-width, initial-scale=1">
-<meta name="description" content="">
-<meta name="author" content="">
-<link rel="shortcut icon" href="../../assets/ico/favicon.ico">
-
-<title>Apache Nutch</title>
-
-</head>
-<body>
-	<div id="wrapper">
-		<nav wicket:id="navigation" class="bs-docs-nav"></nav>
-		<div id="page-wrapper">
-			<div wicket:id="globalNotificationPanel"></div>
-			<wicket:child></wicket:child>
-		</div>
-	</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/src/java/org/apache/nutch/webui/pages/AbstractBasePage.java b/src/java/org/apache/nutch/webui/pages/AbstractBasePage.java
deleted file mode 100644
index 0a89c0f..0000000
--- a/src/java/org/apache/nutch/webui/pages/AbstractBasePage.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages;
-
-import static de.agilecoders.wicket.core.markup.html.bootstrap.navbar.Navbar.ComponentPosition.LEFT;
-import static de.agilecoders.wicket.core.markup.html.bootstrap.navbar.NavbarComponents.transform;
-
-import java.util.List;
-
-import org.apache.nutch.webui.model.NutchInstance;
-import org.apache.nutch.webui.pages.crawls.CrawlsPage;
-import org.apache.nutch.webui.pages.instances.InstancesPage;
-import org.apache.nutch.webui.pages.menu.VerticalMenu;
-import org.apache.nutch.webui.pages.seed.SeedListsPage;
-import org.apache.nutch.webui.pages.settings.SettingsPage;
-import org.apache.nutch.webui.service.NutchInstanceService;
-import org.apache.nutch.webui.service.NutchService;
-import org.apache.wicket.Component;
-import org.apache.wicket.Page;
-import org.apache.wicket.markup.html.GenericWebPage;
-import org.apache.wicket.markup.html.link.AbstractLink;
-import org.apache.wicket.markup.html.link.Link;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.LoadableDetachableModel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.model.PropertyModel;
-import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
-
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-
-import de.agilecoders.wicket.core.markup.html.bootstrap.button.dropdown.DropDownButton;
-import de.agilecoders.wicket.core.markup.html.bootstrap.button.dropdown.MenuBookmarkablePageLink;
-import de.agilecoders.wicket.core.markup.html.bootstrap.button.dropdown.MenuDivider;
-import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
-import de.agilecoders.wicket.core.markup.html.bootstrap.image.IconType;
-import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.Navbar.ComponentPosition;
-import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.Navbar.Position;
-import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.NavbarButton;
-import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.NavbarComponents;
-import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.NavbarDropDownButton;
-import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesomeIconType;
-
-public abstract class AbstractBasePage<T> extends GenericWebPage<T> {
-  /**
-   * 
-   */
-  private static final long serialVersionUID = 1L;
-
-  @SpringBean
-  private NutchService service;
-
-  @SpringBean
-  private NutchInstanceService instanceService;
-
-  private VerticalMenu navbar;
-
-  protected IModel<NutchInstance> currentInstance = new InstanceModel();
-
-  public AbstractBasePage() {
-    navbar = new VerticalMenu("navigation");
-    navbar.brandName(Model.of("Apache Nutch GUI"));
-    navbar.setInverted(true);
-    navbar.setPosition(Position.TOP);
-    add(navbar);
-
-    addMenuItem(DashboardPage.class, "navbar.menu.dashboard",
-        FontAwesomeIconType.dashboard);
-    addMenuItem(StatisticsPage.class, "navbar.menu.statistics",
-        FontAwesomeIconType.bar_chart_o);
-    addMenuItem(InstancesPage.class, "navbar.menu.instances",
-        FontAwesomeIconType.gears);
-    addMenuItem(SettingsPage.class, "navbar.menu.settings",
-        FontAwesomeIconType.wrench);
-    addMenuItem(CrawlsPage.class, "navbar.menu.crawls",
-        FontAwesomeIconType.refresh);
-    addMenuItem(SchedulingPage.class, "navbar.menu.scheduling",
-        FontAwesomeIconType.clock_o);
-    addMenuItem(SearchPage.class, "navbar.menu.search",
-        FontAwesomeIconType.search);
-    addMenuItem(SeedListsPage.class, "navbar.menu.seedLists",
-        FontAwesomeIconType.file);
-
-    navbar.addComponents(transform(ComponentPosition.RIGHT,
-        addInstancesMenuMenu()));
-    navbar.addComponents(transform(ComponentPosition.RIGHT, addUserMenu()));
-
-    add(new NotificationPanel("globalNotificationPanel"));
-
-    if (currentInstance.getObject() == null && !(this instanceof InstancesPage)) {
-      getSession().error("No running instances found!");
-      setResponsePage(InstancesPage.class);
-    }
-  }
-
-  protected Component addUserMenu() {
-    DropDownButton userMenu = new NavbarDropDownButton(Model.of("Username")) {
-      /**
-       * 
-       */
-      private static final long serialVersionUID = 1L;
-
-      @Override
-      protected List<AbstractLink> newSubMenuButtons(final String buttonMarkupId) {
-        List<AbstractLink> subMenu = Lists.newArrayList();
-        subMenu.add(new MenuBookmarkablePageLink<Void>(UserSettingsPage.class,
-            new ResourceModel("navbar.userMenu.settings"))
-            .setIconType(FontAwesomeIconType.gear));
-        subMenu.add(new MenuDivider());
-        subMenu.add(new MenuBookmarkablePageLink<Void>(LogOutPage.class,
-            new ResourceModel("navbar.userMenu.logout"))
-            .setIconType(FontAwesomeIconType.power_off));
-        return subMenu;
-      }
-    }.setIconType(FontAwesomeIconType.user);
-    return userMenu;
-  }
-
-  protected Component addInstancesMenuMenu() {
-    IModel<String> instanceName = PropertyModel.of(currentInstance, "name");
-    DropDownButton instancesMenu = new NavbarDropDownButton(instanceName) {
-
-      /**
-       * 
-       */
-      private static final long serialVersionUID = 1L;
-
-      @Override
-      protected List<AbstractLink> newSubMenuButtons(String buttonMarkupId) {
-        List<NutchInstance> instances = instanceService.getInstances();
-        List<AbstractLink> subMenu = Lists.newArrayList();
-        for (NutchInstance instance : instances) {
-          subMenu.add(new Link<NutchInstance>(buttonMarkupId, Model
-              .of(instance)) {
-            /**
-                 * 
-                 */
-                private static final long serialVersionUID = 1L;
-
-            @Override
-            public void onClick() {
-              currentInstance.setObject(getModelObject());
-              setResponsePage(DashboardPage.class);
-            }
-          }.setBody(Model.of(instance.getName())));
-        }
-        return subMenu;
-      }
-    }.setIconType(FontAwesomeIconType.gears);
-
-    return instancesMenu;
-  }
-
-  private <P extends Page> void addMenuItem(Class<P> page, String label,
-      IconType icon) {
-    Component button = new NavbarButton<Void>(page, Model.of(getString(label)))
-        .setIconType(icon);
-    navbar.addComponents(NavbarComponents.transform(LEFT, button));
-  }
-
-  protected NutchInstance getCurrentInstance() {
-    return currentInstance.getObject();
-  }
-
-  private class InstanceModel extends LoadableDetachableModel<NutchInstance> {
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 1L;
-
-    @Override
-    public void setObject(NutchInstance instance) {
-      super.setObject(instance);
-      getSession().setAttribute("instanceId", instance.getId());
-    }
-
-    @Override
-    protected NutchInstance load() {
-      Long instanceId = (Long) getSession().getAttribute("instanceId");
-      if (instanceId == null) {
-        return getFirstInstance();
-      }
-      return instanceService.getInstance(instanceId);
-    }
-
-    private NutchInstance getFirstInstance() {
-      return Iterables.getFirst(instanceService.getInstances(), null);
-    }
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/pages/DashboardPage.html b/src/java/org/apache/nutch/webui/pages/DashboardPage.html
deleted file mode 100644
index b6d5426..0000000
--- a/src/java/org/apache/nutch/webui/pages/DashboardPage.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
-	license agreements. See the NOTICE file distributed with this work for additional 
-	information regarding copyright ownership. The ASF licenses this file to 
-	You 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. -->
-<!DOCTYPE html>
-<html xmlns:wicket="http://wicket.apache.org">
-<head>
-<meta charset="utf-8" />
-<title>Wicket extend</title>
-</head>
-
-<body>
-	<wicket:extend>
-		<h2>
-			<wicket:message key="navbar.menu.dashboard">Instances</wicket:message>
-		</h2>
-		<div class="row">
-			<div class="col-lg-3">
-				<div class="panel panel-info">
-					<div wicket:id="panel" class="panel-heading">
-						<div class="row">
-							<div class="col-xs-6">
-								<i class="fa fa-gears fa-5x"></i>
-							</div>
-							<div class="col-xs-6 text-right">
-								<p class="announcement-heading" wicket:id="jobsRunning">2</p>
-								<p class="announcement-text">Jobs running</p>
-							</div>
-						</div>
-					</div>
-					<a href="#non-existing-id" wicket:id="viewInstances">
-						<div class="panel-footer announcement-bottom">
-							<div class="row">
-								<div class="col-xs-6">View instances</div>
-								<div class="col-xs-6 text-right">
-									<i class="fa fa-arrow-circle-right"></i>
-								</div>
-							</div>
-						</div>
-					</a>
-				</div>
-			</div>
-		</div>
-	</wicket:extend>
-</body>
-</html>
diff --git a/src/java/org/apache/nutch/webui/pages/DashboardPage.java b/src/java/org/apache/nutch/webui/pages/DashboardPage.java
deleted file mode 100644
index ae6d760..0000000
--- a/src/java/org/apache/nutch/webui/pages/DashboardPage.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages;
-
-import org.apache.nutch.webui.client.model.NutchStatus;
-import org.apache.nutch.webui.model.NutchInstance;
-import org.apache.nutch.webui.pages.instances.InstancesPage;
-import org.apache.nutch.webui.service.NutchService;
-import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.link.BookmarkablePageLink;
-import org.apache.wicket.model.LoadableDetachableModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
-import org.apache.wicket.util.time.Duration;
-
-public class DashboardPage extends AbstractBasePage<Object> {
-  /**
-   * 
-   */
-  private static final long serialVersionUID = 1L;
-
-  @SpringBean
-  private NutchService nutchService;
-
-  private WebMarkupContainer panel;
-
-  public DashboardPage() {
-    panel = new WebMarkupContainer("panel");
-    panel.setOutputMarkupId(true);
-    panel.add(new AjaxSelfUpdatingTimerBehavior(Duration.ONE_SECOND));
-    panel.add(new Label("jobsRunning", new JobsModel()));
-    add(panel);
-    add(new BookmarkablePageLink<Void>("viewInstances", InstancesPage.class));
-  }
-
-  private class JobsModel extends LoadableDetachableModel<Integer> {
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 1L;
-
-    @Override
-    protected Integer load() {
-      NutchInstance currentInstance = getCurrentInstance();
-      Long id = currentInstance.getId();
-      NutchStatus nutchStatus = nutchService.getNutchStatus(id);
-      return nutchStatus.getRunningJobs().size();
-    }
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/pages/LogOutPage.java b/src/java/org/apache/nutch/webui/pages/LogOutPage.java
deleted file mode 100644
index a9bb883..0000000
--- a/src/java/org/apache/nutch/webui/pages/LogOutPage.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages;
-
-public class LogOutPage extends AbstractBasePage {
-
-}
diff --git a/src/java/org/apache/nutch/webui/pages/SchedulingPage.java b/src/java/org/apache/nutch/webui/pages/SchedulingPage.java
deleted file mode 100644
index 39b07a3..0000000
--- a/src/java/org/apache/nutch/webui/pages/SchedulingPage.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages;
-
-public class SchedulingPage extends AbstractBasePage {
-
-}
diff --git a/src/java/org/apache/nutch/webui/pages/SearchPage.java b/src/java/org/apache/nutch/webui/pages/SearchPage.java
deleted file mode 100644
index a390c01..0000000
--- a/src/java/org/apache/nutch/webui/pages/SearchPage.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages;
-
-public class SearchPage extends AbstractBasePage {
-
-}
diff --git a/src/java/org/apache/nutch/webui/pages/StatisticsPage.java b/src/java/org/apache/nutch/webui/pages/StatisticsPage.java
deleted file mode 100644
index c676b40..0000000
--- a/src/java/org/apache/nutch/webui/pages/StatisticsPage.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages;
-
-public class StatisticsPage extends AbstractBasePage {
-
-}
diff --git a/src/java/org/apache/nutch/webui/pages/UrlsUploadPage.java b/src/java/org/apache/nutch/webui/pages/UrlsUploadPage.java
deleted file mode 100644
index 9ae1c7b..0000000
--- a/src/java/org/apache/nutch/webui/pages/UrlsUploadPage.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages;
-
-public class UrlsUploadPage extends AbstractBasePage {
-
-}
diff --git a/src/java/org/apache/nutch/webui/pages/UserSettingsPage.java b/src/java/org/apache/nutch/webui/pages/UserSettingsPage.java
deleted file mode 100644
index 5a95bba..0000000
--- a/src/java/org/apache/nutch/webui/pages/UserSettingsPage.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages;
-
-public class UserSettingsPage extends AbstractBasePage {
-
-}
diff --git a/src/java/org/apache/nutch/webui/pages/assets/NutchUiCssReference.java b/src/java/org/apache/nutch/webui/pages/assets/NutchUiCssReference.java
deleted file mode 100644
index dbc2be5..0000000
--- a/src/java/org/apache/nutch/webui/pages/assets/NutchUiCssReference.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages.assets;
-
-import org.apache.wicket.request.resource.CssResourceReference;
-
-public class NutchUiCssReference extends CssResourceReference {
-  private static final long serialVersionUID = 1L;
-
-  /**
-   * Singleton instance of this reference
-   */
-  private static final NutchUiCssReference INSTANCE = new NutchUiCssReference();
-
-  public static NutchUiCssReference instance() {
-    return INSTANCE;
-  }
-
-  /**
-   * Private constructor.
-   */
-  private NutchUiCssReference() {
-    super(NutchUiCssReference.class, "nutch-style.css");
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/pages/assets/nutch-style.css b/src/java/org/apache/nutch/webui/pages/assets/nutch-style.css
deleted file mode 100644
index 8cc01ac..0000000
--- a/src/java/org/apache/nutch/webui/pages/assets/nutch-style.css
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-@CHARSET "UTF-8";
-
-body {
-	margin-top: 50px;
-}
-
-#wrapper {
-	padding-left: 0;
-}
-
-#page-wrapper {
-	width: 100%;
-	padding: 5px 15px;
-}
-
-/* Nav Messages */
-.messages-dropdown .dropdown-menu .message-preview .avatar,.messages-dropdown .dropdown-menu .message-preview .name,.messages-dropdown .dropdown-menu .message-preview .message,.messages-dropdown .dropdown-menu .message-preview .time
-	{
-	display: block;
-}
-
-.messages-dropdown .dropdown-menu .message-preview .avatar {
-	float: left;
-	margin-right: 15px;
-}
-
-.messages-dropdown .dropdown-menu .message-preview .name {
-	font-weight: bold;
-}
-
-.messages-dropdown .dropdown-menu .message-preview .message {
-	font-size: 12px;
-}
-
-.messages-dropdown .dropdown-menu .message-preview .time {
-	font-size: 12px;
-}
-
-/* Nav Announcements */
-.announcement-heading {
-	font-size: 50px;
-	margin: 0;
-}
-
-.announcement-text {
-	margin: 0;
-}
-
-/* Table Headers */
-table.tablesorter thead {
-	cursor: pointer;
-}
-
-table.tablesorter thead tr th:hover {
-	background-color: #f5f5f5;
-}
-
-/* Flot Chart Containers */
-.flot-chart {
-	display: block;
-	height: 400px;
-}
-
-.flot-chart-content {
-	width: 100%;
-	height: 100%;
-}
-
-/* Edit Below to Customize Widths > 768px */
-@media ( min-width :768px) {
-	/* Wrappers */
-	#wrapper {
-		padding-left: 225px;
-	}
-	#page-wrapper {
-		padding: 15px 25px;
-	}
-
-	/* Side Nav */
-	.side-nav {
-		margin-left: -225px;
-		left: 225px;
-		width: 225px;
-		position: fixed;
-		top: 50px;
-		height: 100%;
-		border-radius: 0;
-		border: none;
-		background-color: #222222;
-		overflow-y: auto;
-	}
-
-	/* Bootstrap Default Overrides - Customized Dropdowns for the Side Nav */
-	.side-nav>li.dropdown>ul.dropdown-menu {
-		position: relative;
-		min-width: 225px;
-		margin: 0;
-		padding: 0;
-		border: none;
-		border-radius: 0;
-		background-color: transparent;
-		box-shadow: none;
-		-webkit-box-shadow: none;
-	}
-	.side-nav>li.dropdown>ul.dropdown-menu>li>a {
-		color: #999999;
-		padding: 15px 15px 15px 25px;
-	}
-	.side-nav>li.dropdown>ul.dropdown-menu>li>a:hover,.side-nav>li.dropdown>ul.dropdown-menu>li>a.active,.side-nav>li.dropdown>ul.dropdown-menu>li>a:focus
-		{
-		color: #fff;
-		background-color: #080808;
-	}
-	.side-nav>li>a {
-		width: 225px;
-	}
-	.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus
-		{
-		background-color: #080808;
-	}
-
-	/* Nav Messages */
-	.messages-dropdown .dropdown-menu {
-		min-width: 300px;
-	}
-	.messages-dropdown .dropdown-menu li a {
-		white-space: normal;
-	}
-	.navbar-collapse {
-		padding-left: 15px !important;
-		padding-right: 15px !important;
-	}
-}
\ No newline at end of file
diff --git a/src/java/org/apache/nutch/webui/pages/components/ColorEnumLabel.java b/src/java/org/apache/nutch/webui/pages/components/ColorEnumLabel.java
deleted file mode 100644
index 8518c0b..0000000
--- a/src/java/org/apache/nutch/webui/pages/components/ColorEnumLabel.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages.components;
-
-import java.util.Map;
-
-import org.apache.wicket.markup.html.basic.EnumLabel;
-import org.apache.wicket.model.AbstractReadOnlyModel;
-import org.apache.wicket.model.IModel;
-
-import de.agilecoders.wicket.core.markup.html.bootstrap.block.LabelBehavior;
-import de.agilecoders.wicket.core.markup.html.bootstrap.block.LabelType;
-
-/**
- * Label which renders connection status as bootstrap label
- * 
- * @author feodor
- * 
- */
-public class ColorEnumLabel<E extends Enum<E>> extends EnumLabel<E> {
-  private Map<E, LabelType> labelTypeMap;
-
-  ColorEnumLabel(String id, IModel<E> model, Map<E, LabelType> labelTypeMap) {
-    super(id, model);
-    this.labelTypeMap = labelTypeMap;
-  }
-
-  @Override
-  protected void onInitialize() {
-    super.onInitialize();
-    setOutputMarkupId(true);
-    add(new LabelBehavior(new EnumCssModel(getModel())));
-  }
-
-  private class EnumCssModel extends AbstractReadOnlyModel<LabelType> {
-    private IModel<E> model;
-
-    public EnumCssModel(IModel<E> model) {
-      this.model = model;
-    }
-
-    @Override
-    public LabelType getObject() {
-      LabelType labelType = labelTypeMap.get(model.getObject());
-      if (labelType == null) {
-        return LabelType.Default;
-      }
-      return labelType;
-    }
-  }
-
-  public static <E extends Enum<E>> ColorEnumLabelBuilder<E> getBuilder(
-      String id) {
-    return new ColorEnumLabelBuilder<>(id);
-  }
-
-}
diff --git a/src/java/org/apache/nutch/webui/pages/components/ColorEnumLabelBuilder.java b/src/java/org/apache/nutch/webui/pages/components/ColorEnumLabelBuilder.java
deleted file mode 100644
index d12b594..0000000
--- a/src/java/org/apache/nutch/webui/pages/components/ColorEnumLabelBuilder.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages.components;
-
-import java.util.Map;
-
-import org.apache.wicket.model.IModel;
-
-import com.google.common.collect.Maps;
-
-import de.agilecoders.wicket.core.markup.html.bootstrap.block.LabelType;
-
-public class ColorEnumLabelBuilder<E extends Enum<E>> {
-  private Map<E, LabelType> labelTypeMap = Maps.newHashMap();
-  private IModel<E> model;
-  private String id;
-
-  public ColorEnumLabelBuilder(String id) {
-    this.id = id;
-  }
-
-  public ColorEnumLabelBuilder<E> withModel(IModel<E> model) {
-    this.model = model;
-    return this;
-  }
-
-  public ColorEnumLabelBuilder<E> withEnumColor(E e, LabelType type) {
-    labelTypeMap.put(e, type);
-    return this;
-  }
-
-  public ColorEnumLabel<E> build() {
-    return new ColorEnumLabel<>(id, model, labelTypeMap);
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/pages/components/CpmIteratorAdapter.java b/src/java/org/apache/nutch/webui/pages/components/CpmIteratorAdapter.java
deleted file mode 100644
index ae31003..0000000
--- a/src/java/org/apache/nutch/webui/pages/components/CpmIteratorAdapter.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages.components;
-
-import org.apache.wicket.markup.repeater.util.ModelIteratorAdapter;
-import org.apache.wicket.model.CompoundPropertyModel;
-import org.apache.wicket.model.IModel;
-
-/**
- * This is iterator adapter, which wraps iterable items with
- * CompoundPropertyModel.
- * 
- * @author feodor
- * 
- */
-public class CpmIteratorAdapter<T> extends ModelIteratorAdapter<T> {
-  public CpmIteratorAdapter(Iterable<T> iterable) {
-    super(iterable);
-  }
-
-  @Override
-  protected IModel<T> model(T object) {
-    return new CompoundPropertyModel<>(object);
-  }
-
-}
diff --git a/src/java/org/apache/nutch/webui/pages/crawls/CrawlPanel.html b/src/java/org/apache/nutch/webui/pages/crawls/CrawlPanel.html
deleted file mode 100644
index 81095f0..0000000
--- a/src/java/org/apache/nutch/webui/pages/crawls/CrawlPanel.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
-	license agreements. See the NOTICE file distributed with this work for additional 
-	information regarding copyright ownership. The ASF licenses this file to 
-	You 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. -->
-<!DOCTYPE html>
-<html xmlns:wicket="http://wicket.apache.org">
-<head>
-<meta charset="utf-8" />
-<title>Wicket extend</title>
-</head>
-
-<body>
-	<wicket:extend>
-		<div wicket:id="notificationPanel"></div>
-
-		<form class="form-horizontal" wicket:id="crawlForm">
-			<div class="form-group">
-				<label for="inputEmail" class="control-label col-xs-2">Crawl id</label>
-				<div class="col-xs-10">
-					<span wicket:id="crawlId">123-1321-123</span>
-				</div>
-			</div>
-			<div class="form-group">
-				<label for="seedDir" class="control-label col-xs-2">Crawl name</label>
-				<div class="col-xs-10">
-					<input class="form-control" id="seedDir" wicket:id="crawlName" placeholder="Crawl name">
-				</div>
-			</div>
-			<div class="form-group">
-				<label for="seedDir" class="control-label col-xs-2">Seed list</label>
-				<div class="col-xs-10">
-					<select wicket:id="seedList">
-						<option>Google list</option>
-						<option>Yahoo list</option>
-					</select>
-				</div>
-			</div>
-
-			<div class="form-group">
-				<label for="numberOfRounds" class="control-label col-xs-2">Rounds</label>
-				<div class="col-xs-10">
-					<select wicket:id="numberOfRounds">
-						<option>1</option>
-						<option>2</option>
-					</select>
-				</div>
-			</div>
-		</form>
-
-	</wicket:extend>
-</body>
-</html>
diff --git a/src/java/org/apache/nutch/webui/pages/crawls/CrawlPanel.java b/src/java/org/apache/nutch/webui/pages/crawls/CrawlPanel.java
deleted file mode 100644
index e778f83..0000000
--- a/src/java/org/apache/nutch/webui/pages/crawls/CrawlPanel.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages.crawls;
-
-import java.util.List;
-
-import org.apache.nutch.webui.client.model.Crawl;
-import org.apache.nutch.webui.model.SeedList;
-import org.apache.nutch.webui.service.CrawlService;
-import org.apache.nutch.webui.service.SeedListService;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.ChoiceRenderer;
-import org.apache.wicket.markup.html.form.DropDownChoice;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.spring.injection.annot.SpringBean;
-
-import com.google.common.collect.Lists;
-
-import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
-import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
-import de.agilecoders.wicket.core.markup.html.bootstrap.form.BootstrapForm;
-
-public class CrawlPanel extends Modal {
-  private static final int MAX_ROUNDS = 10;
-
-  private BootstrapForm<Crawl> form;
-
-  @SpringBean
-  private CrawlService crawlService;
-
-  @SpringBean
-  private SeedListService seedListService;
-
-  private NotificationPanel notificationPanel;
-
-  public CrawlPanel(String markupId) {
-    super(markupId);
-    header(Model.of("Crawl"));
-
-    notificationPanel = new NotificationPanel("notificationPanel");
-    notificationPanel.setOutputMarkupId(true);
-    add(notificationPanel);
-
-    form = new BootstrapForm<>("crawlForm");
-    form.add(new Label("crawlId"));
-    form.add(new TextField<String>("crawlName").setRequired(true));
-
-    form.add(new DropDownChoice<>("numberOfRounds", getNumbersOfRounds()));
-    form.add(new DropDownChoice<>("seedList",
-        seedListService.findAll(), new ChoiceRenderer<>("name"))
-        .setRequired(true));
-
-    addButton(new AjaxSubmitLink("button", form) {
-      @Override
-      protected void onSubmit(AjaxRequestTarget target, Form<?> ajaxForm) {
-        crawlService.saveCrawl(form.getModelObject());
-        target.add(this.getPage());
-      }
-
-      protected void onError(AjaxRequestTarget target, Form<?> form) {
-        target.add(notificationPanel);
-      };
-    }.setBody(Model.of("Save")));
-    add(form);
-  }
-
-  public void setModel(IModel<Crawl> model) {
-    form.setModel(model);
-  }
-
-  private List<Integer> getNumbersOfRounds() {
-    List<Integer> numbers = Lists.newArrayList();
-    for (int i = 1; i <= MAX_ROUNDS; i++) {
-      numbers.add(i);
-    }
-    return numbers;
-  }
-
-}
diff --git a/src/java/org/apache/nutch/webui/pages/crawls/CrawlsPage.html b/src/java/org/apache/nutch/webui/pages/crawls/CrawlsPage.html
deleted file mode 100644
index 3c5d789..0000000
--- a/src/java/org/apache/nutch/webui/pages/crawls/CrawlsPage.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
-	license agreements. See the NOTICE file distributed with this work for additional 
-	information regarding copyright ownership. The ASF licenses this file to 
-	You 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. -->
-<!DOCTYPE html>
-<html xmlns:wicket="http://wicket.apache.org">
-<head>
-<meta charset="utf-8" />
-<title>Wicket extend</title>
-</head>
-
-<body>
-	<wicket:extend>
-		<h2>
-			<wicket:message key="navbar.menu.crawls">Crawls</wicket:message>
-		</h2>
-
-		<div class="row">
-			<div class="col-lg-8">
-				<div class="row">
-					<div class="col-lg-8 col-md-offset-10">
-						<button class="btn btn-success btn-default" wicket:id="newCrawl">
-							<i class="fa fa-plus"></i> Add new crawl
-						</button>
-					</div>
-				</div>
-				<table class="table table-hover table-striped tablesorter">
-					<thead>
-						<tr>
-							<th class="header col-md-2">Crawl name</th>
-							<th class="header col-md-2">Seed list</th>
-							<th class="header col-md-2">Status</th>
-							<th class="header col-md-2">Progress</th>
-							<th></th>
-						</tr>
-					</thead>
-
-					<tbody wicket:id="crawlsTable">
-						<tr wicket:id="crawls">
-							<td>
-								<a href="#" data-toggle="modal" data-target="#crawlInfo" wicket:id="edit">
-									<span wicket:id="crawlName">Crawl name</span>
-								</a>
-							</td>
-							<td>
-								<span wicket:id="seedList.name">Google list</span>
-							</td>
-							<td>
-								<span wicket:id="status" class="label">Finished</span>
-							</td>
-							<td>
-								<span wicket:id="progress">50</span>
-								%
-
-							</td>
-
-							<td>
-								<button class="btn btn-sm btn-default" type="button" wicket:id="start">
-									<span class="fa fa-play"></span>
-								</button>
-								<button class="btn btn-sm btn-danger" type="button" wicket:id="delete">
-									<span class="fa fa-trash-o"></span>
-								</button>
-							</td>
-						</tr>
-					</tbody>
-				</table>
-				<div wicket:id="crawl"></div>
-			</div>
-			<div class="col-lg-4">
-				<div class="panel panel-primary">
-					<div class="panel-heading">
-						<h3 class="panel-title">Help</h3>
-					</div>
-					<div class="panel-body">
-						<p>Some help about crawling</p>
-					</div>
-				</div>
-			</div>
-		</div>
-		<!--row-->
-	</wicket:extend>
-</body>
-</html>
diff --git a/src/java/org/apache/nutch/webui/pages/crawls/CrawlsPage.java b/src/java/org/apache/nutch/webui/pages/crawls/CrawlsPage.java
deleted file mode 100644
index df9419b..0000000
--- a/src/java/org/apache/nutch/webui/pages/crawls/CrawlsPage.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages.crawls;
-
-import static de.agilecoders.wicket.core.markup.html.bootstrap.block.LabelType.Danger;
-import static de.agilecoders.wicket.core.markup.html.bootstrap.block.LabelType.Default;
-import static de.agilecoders.wicket.core.markup.html.bootstrap.block.LabelType.Info;
-import static de.agilecoders.wicket.core.markup.html.bootstrap.block.LabelType.Success;
-import static org.apache.nutch.webui.client.model.Crawl.CrawlStatus.CRAWLING;
-import static org.apache.nutch.webui.client.model.Crawl.CrawlStatus.ERROR;
-import static org.apache.nutch.webui.client.model.Crawl.CrawlStatus.FINISHED;
-import static org.apache.nutch.webui.client.model.Crawl.CrawlStatus.NEW;
-
-import java.util.Iterator;
-
-import org.apache.nutch.webui.client.model.Crawl;
-import org.apache.nutch.webui.client.model.Crawl.CrawlStatus;
-import org.apache.nutch.webui.pages.AbstractBasePage;
-import org.apache.nutch.webui.pages.components.ColorEnumLabelBuilder;
-import org.apache.nutch.webui.pages.components.CpmIteratorAdapter;
-import org.apache.nutch.webui.service.CrawlService;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior;
-import org.apache.wicket.ajax.markup.html.AjaxLink;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.EnumLabel;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.link.Link;
-import org.apache.wicket.markup.repeater.Item;
-import org.apache.wicket.markup.repeater.RefreshingView;
-import org.apache.wicket.model.CompoundPropertyModel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
-import org.apache.wicket.util.time.Duration;
-
-/**
- * This page is for crawls management
- * 
- * @author feodor
- * 
- */
-public class CrawlsPage extends AbstractBasePage<Void> {
-
-  private static final Duration UPDATE_TIMEOUT = Duration.seconds(2);
-
-  @SpringBean
-  private CrawlService crawlService;
-
-  private WebMarkupContainer crawlsTable;
-  private CrawlPanel crawlPanel;
-
-  public CrawlsPage() {
-    crawlsTable = new WebMarkupContainer("crawlsTable");
-    crawlsTable.setOutputMarkupId(true);
-    crawlsTable.add(new AjaxSelfUpdatingTimerBehavior(UPDATE_TIMEOUT));
-
-    RefreshingView<Crawl> crawls = new RefreshingView<Crawl>("crawls") {
-
-      @Override
-      protected Iterator<IModel<Crawl>> getItemModels() {
-        return new CpmIteratorAdapter<>(crawlService.getCrawls());
-      }
-
-      @Override
-      protected void populateItem(Item<Crawl> item) {
-        populateCrawlRow(item);
-      }
-    };
-
-    crawlsTable.add(crawls);
-    add(crawlsTable);
-
-    crawlPanel = new CrawlPanel("crawl");
-    add(crawlPanel);
-
-    add(new AjaxLink<Crawl>("newCrawl") {
-      @Override
-      public void onClick(AjaxRequestTarget target) {
-        editCrawl(target, new CompoundPropertyModel<>(createNewCrawl()));
-      }
-    });
-  }
-
-  private void populateCrawlRow(Item<Crawl> item) {
-    item.add(new AjaxLink<Crawl>("edit", item.getModel()) {
-      @Override
-      public void onClick(AjaxRequestTarget target) {
-        editCrawl(target, getModel());
-      }
-    }.add(new Label("crawlName")));
-    item.add(new Label("seedList.name"));
-
-    item.add(new Label("progress"));
-    item.add(createStatusLabel());
-    item.add(new Link<Crawl>("start", item.getModel()) {
-      @Override
-      public void onClick() {
-        crawlService.startCrawl(getModelObject().getId(), getCurrentInstance());
-      }
-    });
-
-    item.add(new Link<Crawl>("delete", item.getModel()) {
-      @Override
-      public void onClick() {
-        crawlService.deleteCrawl(getModelObject().getId());
-      }
-    });
-  }
-
-  private void editCrawl(AjaxRequestTarget target, IModel<Crawl> model) {
-    crawlPanel.setModel(model);
-    target.add(crawlPanel);
-    crawlPanel.appendShowDialogJavaScript(target);
-  }
-
-  private Crawl createNewCrawl() {
-    return new Crawl();
-  }
-
-  private EnumLabel<CrawlStatus> createStatusLabel() {
-    return new ColorEnumLabelBuilder<CrawlStatus>("status")
-        .withEnumColor(NEW, Default).withEnumColor(ERROR, Danger)
-        .withEnumColor(FINISHED, Success).withEnumColor(CRAWLING, Info).build();
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/pages/instances/InstancePanel.html b/src/java/org/apache/nutch/webui/pages/instances/InstancePanel.html
deleted file mode 100644
index cdbc242..0000000
--- a/src/java/org/apache/nutch/webui/pages/instances/InstancePanel.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Insert title here</title>
-</head>
-<body>
-	<wicket:extend>
-		<div wicket:id="notificationPanel"></div>
-		<form class="form-horizontal" wicket:id="instanceForm">
-			<div class="form-group">
-				<label class="control-label col-xs-2"><wicket:message key="instances.label.name">Instance name</wicket:message></label>
-				<div class="col-xs-10">
-					<input class="form-control" wicket:id="name" placeholder="Localhost instance">
-				</div>
-			</div>
-			<div class="form-group">
-				<label class="control-label col-xs-2"><wicket:message key="instances.label.hostname">Host</wicket:message></label>
-				<div class="col-xs-10">
-					<input class="form-control" wicket:id="host" placeholder="http://localhost:8080">
-				</div>
-			</div>
-
-			<div class="form-group">
-				<label class="control-label col-xs-2"><wicket:message key="instances.label.port">Port</wicket:message></label>
-				<div class="col-xs-10">
-					<input class="form-control" wicket:id="port" placeholder="http://localhost:8080">
-				</div>
-			</div>
-			
-			<div class="form-group">
-				<label class="control-label col-xs-2"><wicket:message key="instances.label.username">Username</wicket:message></label>
-				<div class="col-xs-10">
-					<input class="form-control" wicket:id="username" placeholder="">
-				</div>
-			</div>
-			<div class="form-group">
-				<label class="control-label col-xs-2"><wicket:message key="instances.label.password">Password</wicket:message></label>
-				<div class="col-xs-10">
-					<input class="form-control" type="password" wicket:id="password" placeholder="">
-				</div>
-			</div>
-		</form>
-	</wicket:extend>
-</body>
-</html>
\ No newline at end of file
diff --git a/src/java/org/apache/nutch/webui/pages/instances/InstancePanel.java b/src/java/org/apache/nutch/webui/pages/instances/InstancePanel.java
deleted file mode 100644
index 09ac71a..0000000
--- a/src/java/org/apache/nutch/webui/pages/instances/InstancePanel.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages.instances;
-
-import org.apache.nutch.webui.model.NutchInstance;
-import org.apache.nutch.webui.service.NutchInstanceService;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.PasswordTextField;
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.spring.injection.annot.SpringBean;
-
-import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
-import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
-import de.agilecoders.wicket.core.markup.html.bootstrap.form.BootstrapForm;
-
-public class InstancePanel extends Modal {
-
-  private BootstrapForm<NutchInstance> form;
-
-  private NotificationPanel notificationPanel;
-
-  @SpringBean
-  private NutchInstanceService instanceService;
-
-  public InstancePanel(String markupId) {
-    super(markupId);
-    header(Model.of("Instance"));
-
-    notificationPanel = new NotificationPanel("notificationPanel");
-    notificationPanel.setOutputMarkupId(true);
-    add(notificationPanel);
-
-    form = new BootstrapForm<>("instanceForm");
-    form.add(new TextField<String>("name").setRequired(true));
-    form.add(new TextField<String>("host").setRequired(true));
-    form.add(new TextField<Integer>("port").setRequired(true));
-    form.add(new TextField<String>("username"));
-    form.add(new PasswordTextField("password").setResetPassword(false)
-        .setRequired(false));
-
-    addButton(new AjaxSubmitLink("button", form) {
-      @Override
-      protected void onSubmit(AjaxRequestTarget target, Form<?> ajaxForm) {
-        instanceService.saveInstance(form.getModelObject());
-        target.add(this.getPage());
-
-      }
-
-      protected void onError(AjaxRequestTarget target, Form<?> form) {
-        target.add(notificationPanel);
-      };
-    }.setBody(Model.of("Save")));
-    add(form);
-  }
-
-  public void setModel(IModel<NutchInstance> model) {
-    form.setModel(model);
-  }
-
-}
diff --git a/src/java/org/apache/nutch/webui/pages/instances/InstancesPage.html b/src/java/org/apache/nutch/webui/pages/instances/InstancesPage.html
deleted file mode 100644
index 15e6ed8..0000000
--- a/src/java/org/apache/nutch/webui/pages/instances/InstancesPage.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Instances</title>
-</head>
-<body>
-	<wicket:extend>
-		<h2>
-			<wicket:message key="navbar.menu.instances">Instances</wicket:message>
-		</h2>
-		<div class="row">
-			<div class="col-lg-8">
-				<table class="table table-hover table-striped tablesorter">
-					<thead>
-						<tr>
-							<th class="header col-md-2"><wicket:message key="instances.header.name">Name</wicket:message></th>
-							<th class="header col-md-2"><wicket:message key="instances.header.hostname">Host</wicket:message></th>
-							<th class="header col-md-2"><wicket:message key="instances.header.username">Username</wicket:message></th>
-							<th class="header col-md-2"><wicket:message key="instances.header.status">Status</wicket:message></th>
-							<th></th>
-						</tr>
-					</thead>
-					<tbody wicket:id="instancesTable">
-						<tr wicket:id="instances">
-							<td>
-								<a href="#" data-toggle="modal" data-target="#instanceInfo" wicket:id="editInstance">
-									<span wicket:id="name">Instance name</span>
-								</a>
-							</td>
-							<td>
-								<span wicket:id="host">Host</span>
-							</td>
-							<td>
-								<span wicket:id="username">Username</span>
-							</td>
-							<td>
-								<span wicket:id="connectionStatus" class="label">Status</span>
-							</td>
-							<td>
-								<button class="btn btn-sm btn-danger" type="button" wicket:id="instanceDelete">
-									<span class="fa fa-trash-o"></span>
-								</button>
-							</td>
-						</tr>
-					</tbody>
-				</table>
-				<div wicket:id="instanceForm"></div>
-				<button class="btn btn-sm btn-primary" wicket:id="addInstance">
-					<i class="fa fa-plus"></i> <wicket:message key="instances.buttons.addInstance">Add instance</wicket:message>
-				</button>
-			</div>
-			<div class="col-lg-4">
-				<div class="panel panel-primary">
-					<div class="panel-heading">
-						<h3 class="panel-title">Help</h3>
-					</div>
-					<div class="panel-body">
-						<p>Some help about crawling</p>
-					</div>
-				</div>
-			</div>
-		</div>
-	</wicket:extend>
-</body>
-</html>
\ No newline at end of file
diff --git a/src/java/org/apache/nutch/webui/pages/instances/InstancesPage.java b/src/java/org/apache/nutch/webui/pages/instances/InstancesPage.java
deleted file mode 100644
index 89ac8f9..0000000
--- a/src/java/org/apache/nutch/webui/pages/instances/InstancesPage.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages.instances;
-
-import static de.agilecoders.wicket.core.markup.html.bootstrap.block.LabelType.Danger;
-import static de.agilecoders.wicket.core.markup.html.bootstrap.block.LabelType.Info;
-import static de.agilecoders.wicket.core.markup.html.bootstrap.block.LabelType.Success;
-import static org.apache.nutch.webui.client.model.ConnectionStatus.CONNECTED;
-import static org.apache.nutch.webui.client.model.ConnectionStatus.CONNECTING;
-import static org.apache.nutch.webui.client.model.ConnectionStatus.DISCONNECTED;
-
-import java.util.Iterator;
-
-import org.apache.nutch.webui.client.model.ConnectionStatus;
-import org.apache.nutch.webui.model.NutchInstance;
-import org.apache.nutch.webui.pages.AbstractBasePage;
-import org.apache.nutch.webui.pages.components.ColorEnumLabel;
-import org.apache.nutch.webui.pages.components.ColorEnumLabelBuilder;
-import org.apache.nutch.webui.pages.components.CpmIteratorAdapter;
-import org.apache.nutch.webui.service.NutchInstanceService;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior;
-import org.apache.wicket.ajax.markup.html.AjaxLink;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.repeater.Item;
-import org.apache.wicket.markup.repeater.RefreshingView;
-import org.apache.wicket.model.CompoundPropertyModel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
-import org.apache.wicket.util.time.Duration;
-
-public class InstancesPage extends AbstractBasePage<Void> {
-  @SpringBean
-  private NutchInstanceService instanceService;
-
-  private InstancePanel instancePanel;
-
-  private WebMarkupContainer instancesTable;
-  private static final Duration UPDATE_TIMEOUT = Duration.seconds(1);
-
-  public InstancesPage() {
-
-    instancesTable = new WebMarkupContainer("instancesTable");
-    instancesTable.setOutputMarkupId(true);
-    instancesTable.add(new AjaxSelfUpdatingTimerBehavior(UPDATE_TIMEOUT));
-
-    instancePanel = new InstancePanel("instanceForm");
-
-    RefreshingView<NutchInstance> instances = refreshingView();
-    instancesTable.add(instances);
-    add(instancesTable);
-    add(instancePanel);
-    add(addInstanceButton());
-  }
-
-  private RefreshingView<NutchInstance> refreshingView() {
-    RefreshingView<NutchInstance> instances = new RefreshingView<NutchInstance>(
-        "instances") {
-
-      @Override
-      protected Iterator<IModel<NutchInstance>> getItemModels() {
-        return new CpmIteratorAdapter<>(
-            instanceService.getInstances());
-      }
-
-      @Override
-      protected void populateItem(Item<NutchInstance> item) {
-        populateInstanceRow(item);
-      }
-    };
-    return instances;
-  }
-
-  private AjaxLink<NutchInstance> addInstanceButton() {
-    return new AjaxLink<NutchInstance>("addInstance") {
-      @Override
-      public void onClick(AjaxRequestTarget target) {
-        instancePanel.setModel(new CompoundPropertyModel<>(
-            new NutchInstance()));
-        target.add(instancePanel);
-        instancePanel.appendShowDialogJavaScript(target);
-      }
-    };
-  }
-
-  private void populateInstanceRow(final Item<NutchInstance> item) {
-    item.add(new AjaxLink<NutchInstance>("editInstance") {
-      @Override
-      public void onClick(AjaxRequestTarget target) {
-        instancePanel.setModel(item.getModel());
-        target.add(instancePanel);
-        instancePanel.appendShowDialogJavaScript(target);
-      }
-    }.add(new Label("name")));
-    item.add(new Label("host"));
-    item.add(new Label("username"));
-    item.add(createStatusLabel());
-    item.add(new AjaxLink<NutchInstance>("instanceDelete", item.getModel()) {
-      @Override
-      public void onClick(AjaxRequestTarget target) {
-        instanceService.removeInstance(getModelObject().getId());
-        target.add(instancesTable);
-      }
-    });
-  }
-
-  private ColorEnumLabel<ConnectionStatus> createStatusLabel() {
-    return new ColorEnumLabelBuilder<ConnectionStatus>("connectionStatus")
-        .withEnumColor(CONNECTED, Success).withEnumColor(CONNECTING, Info)
-        .withEnumColor(DISCONNECTED, Danger).build();
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/pages/menu/VerticalMenu.html b/src/java/org/apache/nutch/webui/pages/menu/VerticalMenu.html
deleted file mode 100644
index 32d6e01..0000000
--- a/src/java/org/apache/nutch/webui/pages/menu/VerticalMenu.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
-	license agreements. See the NOTICE file distributed with this work for additional 
-	information regarding copyright ownership. The ASF licenses this file to 
-	You 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. -->
-<html xmlns:wicket="http://wicket.apache.org">
-<head>
-<title>Navbar</title>
-</head>
-<body>
-	<wicket:panel>
-		<div class="fluid-container" wicket:id="container">
-			<!-- Brand and toggle get grouped for better mobile display -->
-			<div class="navbar-header">
-				<button type="button" class="navbar-toggle" data-toggle="collapse"
-					wicket:id="collapseButton">
-					<span class="sr-only" wicket:id="toggleNavigationLabel">[[CONTENT]]</span>
-					<span class="icon-bar"></span> <span class="icon-bar"></span> <span
-						class="icon-bar"></span>
-				</button>
-				<a wicket:id="brandName" class="navbar-brand" href="#"> <img
-					wicket:id="brandImage" /> <span wicket:id="brandLabel"></span>
-				</a>
-			</div>
-
-			<div class="collapse navbar-collapse navbar-ex1-collapse"
-				role="navigation" wicket:id="collapse">
-				<ul class="nav navbar-nav side-nav">
-					<li wicket:id="navLeftList">
-						<div wicket:id="component">[[CONTENT]]</div>
-					</li>
-				</ul>
-				<ul wicket:enclosure="navRightList"
-					class="nav navbar-nav navbar-right">
-					<li wicket:id="navRightList">
-						<div wicket:id="component">[[CONTENT]]</div>
-					</li>
-				</ul>
-			</div>
-		</div>
-	</wicket:panel>
-</body>
-</html>
diff --git a/src/java/org/apache/nutch/webui/pages/menu/VerticalMenu.java b/src/java/org/apache/nutch/webui/pages/menu/VerticalMenu.java
deleted file mode 100644
index 0085e46..0000000
--- a/src/java/org/apache/nutch/webui/pages/menu/VerticalMenu.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages.menu;
-
-import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.Navbar;
-
-public class VerticalMenu extends Navbar {
-
-  public VerticalMenu(String componentId) {
-    super(componentId);
-  }
-
-}
diff --git a/src/java/org/apache/nutch/webui/pages/seed/SeedListsPage.html b/src/java/org/apache/nutch/webui/pages/seed/SeedListsPage.html
deleted file mode 100644
index f9aff87..0000000
--- a/src/java/org/apache/nutch/webui/pages/seed/SeedListsPage.html
+++ /dev/null
@@ -1,75 +0,0 @@
-<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
-	license agreements. See the NOTICE file distributed with this work for additional 
-	information regarding copyright ownership. The ASF licenses this file to 
-	You 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. -->
-<!DOCTYPE html>
-<html xmlns:wicket="http://wicket.apache.org">
-<head>
-<meta charset="utf-8" />
-<title>Wicket extend</title>
-</head>
-
-<body>
-	<wicket:extend>
-		<h2>
-			<wicket:message key="navbar.menu.seedLists">Seed lists</wicket:message>
-		</h2>
-
-		<div class="row">
-			<div class="col-lg-8">
-				<div class="row">
-					<div class="col-lg-8 col-md-offset-10">
-						<button class="btn btn-success btn-default" wicket:id="newSeedList">
-							<i class="fa fa-plus"></i> Add new list
-						</button>
-					</div>
-				</div>
-				<table class="table table-hover table-striped tablesorter">
-					<thead>
-						<tr>
-							<th class="header col-md-3">Name</th>
-							<th class="header col-md-2">Urls</th>
-							<th></th>
-						</tr>
-					</thead>
-
-					<tbody>
-						<tr wicket:id="seedLists">
-							<td>
-								<a href="#" wicket:id="edit">
-									<span wicket:id="name">List name</span>
-								</a>
-							</td>
-							<td>
-								<span wicket:id="seedUrlsCount">10</span>
-							</td>
-							<td>
-								<button class="btn btn-sm btn-danger" type="button" wicket:id="delete">
-									<span class="fa fa-trash-o"></span>
-								</button>
-							</td>
-						</tr>
-					</tbody>
-				</table>
-			</div>
-			<div class="col-lg-4">
-				<div class="panel panel-primary">
-					<div class="panel-heading">
-						<h3 class="panel-title">Help</h3>
-					</div>
-					<div class="panel-body">
-						<p>Some help about seed lists</p>
-					</div>
-				</div>
-			</div>
-		</div>
-		<!--row-->
-	</wicket:extend>
-</body>
-</html>
diff --git a/src/java/org/apache/nutch/webui/pages/seed/SeedListsPage.java b/src/java/org/apache/nutch/webui/pages/seed/SeedListsPage.java
deleted file mode 100644
index b837438..0000000
--- a/src/java/org/apache/nutch/webui/pages/seed/SeedListsPage.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages.seed;
-
-import java.util.Iterator;
-
-import org.apache.nutch.webui.model.SeedList;
-import org.apache.nutch.webui.pages.AbstractBasePage;
-import org.apache.nutch.webui.pages.components.CpmIteratorAdapter;
-import org.apache.nutch.webui.service.SeedListService;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.link.BookmarkablePageLink;
-import org.apache.wicket.markup.html.link.Link;
-import org.apache.wicket.markup.repeater.Item;
-import org.apache.wicket.markup.repeater.RefreshingView;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.spring.injection.annot.SpringBean;
-
-/**
- * This page is for seed lists management
- * 
- * @author feodor
- * 
- */
-public class SeedListsPage extends AbstractBasePage<Void> {
-
-  @SpringBean
-  private SeedListService seedListService;
-
-  public SeedListsPage() {
-
-    RefreshingView<SeedList> seedLists = new RefreshingView<SeedList>(
-        "seedLists") {
-
-      @Override
-      protected Iterator<IModel<SeedList>> getItemModels() {
-        return new CpmIteratorAdapter<>(seedListService.findAll());
-      }
-
-      @Override
-      protected void populateItem(final Item<SeedList> item) {
-        PageParameters params = new PageParameters();
-        params.add("id", item.getModelObject().getId());
-
-        Link<Void> edit = new BookmarkablePageLink<>("edit",
-            SeedPage.class, params);
-        edit.add(new Label("name"));
-        item.add(edit);
-
-        item.add(new Label("seedUrlsCount"));
-
-        item.add(new Link<SeedList>("delete", item.getModel()) {
-          @Override
-          public void onClick() {
-            seedListService.delete(item.getModelObject().getId());
-          }
-        });
-      }
-    };
-
-    add(seedLists);
-    add(new BookmarkablePageLink<Void>("newSeedList", SeedPage.class));
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/pages/seed/SeedPage.html b/src/java/org/apache/nutch/webui/pages/seed/SeedPage.html
deleted file mode 100644
index d6f33a3..0000000
--- a/src/java/org/apache/nutch/webui/pages/seed/SeedPage.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
-	license agreements. See the NOTICE file distributed with this work for additional 
-	information regarding copyright ownership. The ASF licenses this file to 
-	You 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. -->
-<!DOCTYPE html>
-<html xmlns:wicket="http://wicket.apache.org">
-<head>
-<meta charset="utf-8" />
-<title>Wicket extend</title>
-</head>
-
-<body>
-	<wicket:extend>
-		<h2>
-			<wicket:message key="page.header.seedList">Seed list</wicket:message>
-		</h2>
-
-		<div class="row">
-			<div class="col-lg-8">
-				<form class="form-horizontal" wicket:id="seedList">
-					<fieldset>
-						<!-- Text input-->
-						<div class="form-group">
-							<label class="col-md-4 control-label" for="textinput">Seed list name</label>
-							<div class="col-md-4">
-								<input wicket:id="name" name="textinput" class="form-control input-md" type="text">
-							</div>
-						</div>
-						<div class="form-group">
-							<div class="col-md-offset-4 col-md-4">
-								<button type="submit" class="btn btn-primary">Save</button>
-							</div>
-						</div>
-					</fieldset>
-				</form>
-				<h3>Seed urls</h3>
-				<table class="table table-hover table-striped tablesorter">
-					<thead>
-						<tr>
-							<th class="header col-md-3">Url</th>
-							<th></th>
-						</tr>
-					</thead>
-
-					<tbody wicket:id="seedUrlsTable">
-						<tr wicket:id="seedUrls">
-							<td>
-								<span wicket:id="url">http://google.com</span>
-							</td>
-							<td>
-								<button wicket:id="delete" class="btn btn-sm btn-danger" type="button">
-									<span class="fa fa-trash-o"></span>
-								</button>
-							</td>
-						</tr>
-					</tbody>
-				</table>
-				<form class="form-horizontal" wicket:id="urlForm">
-					<fieldset>
-						<div class="form-group">
-							<div class="col-md-4">
-								<input wicket:id="url" name="textinput" class="form-control input-md" type="text">
-							</div>
-							<div>
-								<button wicket:id="addUrl" class="btn btn-primary">Add url</button>
-							</div>
-						</div>
-					</fieldset>
-				</form>
-			</div>
-			<div class="col-lg-4">
-				<div class="panel panel-primary">
-					<div class="panel-heading">
-						<h3 class="panel-title">Help</h3>
-					</div>
-					<div class="panel-body">
-						<p>Some help about seed management</p>
-					</div>
-				</div>
-			</div>
-		</div>
-		<!--row-->
-	</wicket:extend>
-</body>
-</html>
diff --git a/src/java/org/apache/nutch/webui/pages/seed/SeedPage.java b/src/java/org/apache/nutch/webui/pages/seed/SeedPage.java
deleted file mode 100644
index fd9c418..0000000
--- a/src/java/org/apache/nutch/webui/pages/seed/SeedPage.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages.seed;
-
-import java.util.Iterator;
-
-import org.apache.nutch.webui.model.SeedList;
-import org.apache.nutch.webui.model.SeedUrl;
-import org.apache.nutch.webui.pages.AbstractBasePage;
-import org.apache.nutch.webui.pages.components.CpmIteratorAdapter;
-import org.apache.nutch.webui.service.SeedListService;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.markup.html.AjaxLink;
-import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.markup.repeater.Item;
-import org.apache.wicket.markup.repeater.RefreshingView;
-import org.apache.wicket.model.CompoundPropertyModel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.LoadableDetachableModel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.spring.injection.annot.SpringBean;
-
-import com.google.common.collect.Lists;
-
-/**
- * This page is for seed urls management
- * 
- * @author feodor
- * 
- */
-public class SeedPage extends AbstractBasePage<SeedList> {
-
-  @SpringBean
-  private SeedListService seedListService;
-
-  private Form<SeedUrl> urlForm;
-
-  private WebMarkupContainer seedUrlsTable;
-
-  public SeedPage() {
-    SeedList list = new SeedList();
-    list.setSeedUrls(Lists.<SeedUrl> newArrayList());
-    initPage(Model.of(list));
-  }
-
-  public SeedPage(final PageParameters parameters) {
-    initPage(new LoadableDetachableModel<SeedList>() {
-
-      @Override
-      protected SeedList load() {
-        Long seedListId = parameters.get("id").toLongObject();
-        return seedListService.getSeedList(seedListId);
-      }
-    });
-  }
-
-  public void initPage(IModel<SeedList> model) {
-    setModel(new CompoundPropertyModel<>(model));
-
-    addBaseForm();
-    addSeedUrlsList();
-    addUrlForm();
-  }
-
-  private void addBaseForm() {
-    Form<SeedList> form = new Form<SeedList>("seedList", getModel()) {
-      @Override
-      protected void onSubmit() {
-        seedListService.save(getModelObject());
-        setResponsePage(SeedListsPage.class);
-      }
-    };
-    form.add(new TextField<String>("name"));
-    add(form);
-  }
-
-  private void addSeedUrlsList() {
-    seedUrlsTable = new WebMarkupContainer("seedUrlsTable");
-    seedUrlsTable.setOutputMarkupId(true);
-
-    RefreshingView<SeedUrl> seedUrls = new RefreshingView<SeedUrl>("seedUrls") {
-
-      @Override
-      protected Iterator<IModel<SeedUrl>> getItemModels() {
-        return new CpmIteratorAdapter<>(getModelObject().getSeedUrls());
-      }
-
-      @Override
-      protected void populateItem(Item<SeedUrl> item) {
-        item.add(new Label("url"));
-        item.add(new AjaxLink<SeedUrl>("delete", item.getModel()) {
-
-          @Override
-          public void onClick(AjaxRequestTarget target) {
-            deleteSeedUrl(getModelObject());
-            target.add(seedUrlsTable);
-          }
-        });
-      }
-    };
-    seedUrlsTable.add(seedUrls);
-    add(seedUrlsTable);
-  }
-
-  private void addUrlForm() {
-    urlForm = new Form<>("urlForm", CompoundPropertyModel.of(Model
-        .of(new SeedUrl())));
-    urlForm.setOutputMarkupId(true);
-    urlForm.add(new TextField<String>("url"));
-    urlForm.add(new AjaxSubmitLink("addUrl", urlForm) {
-      @Override
-      protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
-        addSeedUrl();
-        urlForm.setModelObject(new SeedUrl());
-        target.add(urlForm);
-        target.add(seedUrlsTable);
-      }
-    });
-    add(urlForm);
-  }
-
-  private void addSeedUrl() {
-    SeedUrl url = urlForm.getModelObject();
-    SeedList seedList = getModelObject();
-    url.setSeedList(seedList);
-    seedList.getSeedUrls().add(url);
-  }
-
-  private void deleteSeedUrl(SeedUrl url) {
-    SeedList seedList = getModelObject();
-    seedList.getSeedUrls().remove(url);
-  }
-
-}
diff --git a/src/java/org/apache/nutch/webui/pages/settings/SettingsPage.html b/src/java/org/apache/nutch/webui/pages/settings/SettingsPage.html
deleted file mode 100644
index 8810371..0000000
--- a/src/java/org/apache/nutch/webui/pages/settings/SettingsPage.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:wicket="http://wicket.apache.org">
-<head>
-<meta charset="utf-8" />
-<title>Wicket extend</title>
-</head>
-
-<body>
-	<wicket:extend>
-		<h2>
-			<wicket:message key="settings">Settings</wicket:message>
-		</h2>
-		<div class="row">
-			<div class="col-lg-12">
-				<table class="table table-hover tablesorter table-bordered">
-					<thead>
-						<tr>
-							<th class="header col-lg-3">
-								<wicket:message key="settings.header.name">Name</wicket:message>
-							</th>
-							<th class="header col-lg-9">
-								<wicket:message key="settings.header.value">Value</wicket:message>
-							</th>
-						</tr>
-					</thead>
-					<tbody wicket:id="settingsTable">
-						<tr wicket:id="settings">
-							<td>
-								<span wicket:id="name">Name</span>
-							</td>
-							<td>
-<!-- 								<span wicket:id="value">Value</span> -->
-					<input class="col-lg-12" wicket:id="value" placeholder="http://localhost:8080">
-							</td>
-						</tr>
-					</tbody>
-				</table>
-			</div>
-		</div>
-	</wicket:extend>
-
-</body>
-</html>
diff --git a/src/java/org/apache/nutch/webui/pages/settings/SettingsPage.java b/src/java/org/apache/nutch/webui/pages/settings/SettingsPage.java
deleted file mode 100644
index dd3780b..0000000
--- a/src/java/org/apache/nutch/webui/pages/settings/SettingsPage.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.pages.settings;
-
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.nutch.webui.model.NutchConfig;
-import org.apache.nutch.webui.pages.AbstractBasePage;
-import org.apache.nutch.webui.pages.components.CpmIteratorAdapter;
-import org.apache.nutch.webui.service.NutchService;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.markup.repeater.Item;
-import org.apache.wicket.markup.repeater.RefreshingView;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
-
-public class SettingsPage extends AbstractBasePage<Void> {
-  @SpringBean
-  private NutchService nutchService;
-
-  private WebMarkupContainer settingsTable;
-
-  public SettingsPage() {
-    settingsTable = new WebMarkupContainer("settingsTable");
-    settingsTable.setOutputMarkupId(true);
-    RefreshingView<NutchConfig> nutchConfig = new RefreshingView<NutchConfig>(
-        "settings") {
-
-      @Override
-      protected Iterator<IModel<NutchConfig>> getItemModels() {
-        return new CpmIteratorAdapter<>(
-            convertNutchConfig(nutchService.getNutchConfig(getCurrentInstance()
-                .getId())));
-      }
-
-      @Override
-      protected void populateItem(Item<NutchConfig> item) {
-        item.add(new Label("name"));
-        item.add(new TextField<String>("value"));
-      }
-    };
-    settingsTable.add(nutchConfig);
-    add(settingsTable);
-  }
-
-  private List<NutchConfig> convertNutchConfig(Map<String, String> map) {
-    List<NutchConfig> listNutchConfigs = new LinkedList<>();
-    for (String key : map.keySet()) {
-      NutchConfig conf = new NutchConfig();
-      conf.setName(key);
-      conf.setValue(map.get(key));
-      listNutchConfigs.add(conf);
-    }
-    return listNutchConfigs;
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/service/CrawlService.java b/src/java/org/apache/nutch/webui/service/CrawlService.java
deleted file mode 100644
index c23c0da..0000000
--- a/src/java/org/apache/nutch/webui/service/CrawlService.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.service;
-
-import java.util.List;
-
-import org.apache.nutch.webui.client.model.Crawl;
-import org.apache.nutch.webui.model.NutchInstance;
-
-public interface CrawlService {
-
-  public void saveCrawl(Crawl crawl);
-
-  public List<Crawl> getCrawls();
-
-  void startCrawl(Long crawlId, NutchInstance instance);
-
-  void deleteCrawl(Long crawlId);
-}
diff --git a/src/java/org/apache/nutch/webui/service/NutchInstanceService.java b/src/java/org/apache/nutch/webui/service/NutchInstanceService.java
deleted file mode 100644
index 8607539..0000000
--- a/src/java/org/apache/nutch/webui/service/NutchInstanceService.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.service;
-
-import java.util.List;
-
-import org.apache.nutch.webui.model.NutchInstance;
-
-public interface NutchInstanceService {
-
-  public List<NutchInstance> getInstances();
-
-  public void saveInstance(NutchInstance instance);
-
-  public void removeInstance(Long id);
-
-  public NutchInstance getInstance(Long id);
-
-}
diff --git a/src/java/org/apache/nutch/webui/service/NutchService.java b/src/java/org/apache/nutch/webui/service/NutchService.java
deleted file mode 100644
index 6a145c4..0000000
--- a/src/java/org/apache/nutch/webui/service/NutchService.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.service;
-
-import java.util.Map;
-
-import org.apache.nutch.webui.client.model.ConnectionStatus;
-import org.apache.nutch.webui.client.model.NutchStatus;
-
-public interface NutchService {
-  public ConnectionStatus getConnectionStatus(Long instanceId);
-
-  public Map<String, String> getNutchConfig(Long instanceId);
-
-  public NutchStatus getNutchStatus(Long instanceId);
-
-}
diff --git a/src/java/org/apache/nutch/webui/service/SeedListService.java b/src/java/org/apache/nutch/webui/service/SeedListService.java
deleted file mode 100644
index 731ab6c..0000000
--- a/src/java/org/apache/nutch/webui/service/SeedListService.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.service;
-
-import java.util.List;
-
-import org.apache.nutch.webui.model.SeedList;
-
-public interface SeedListService {
-
-  public void save(SeedList seedList);
-
-  public void delete(Long seedListId);
-
-  public List<SeedList> findAll();
-
-  public SeedList getSeedList(Long seedListId);
-
-}
diff --git a/src/java/org/apache/nutch/webui/service/impl/CrawlServiceImpl.java b/src/java/org/apache/nutch/webui/service/impl/CrawlServiceImpl.java
deleted file mode 100644
index 1d9120e..0000000
--- a/src/java/org/apache/nutch/webui/service/impl/CrawlServiceImpl.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.service.impl;
-
-import java.lang.invoke.MethodHandles;
-import java.sql.SQLException;
-import java.util.List;
-
-import javax.annotation.Resource;
-
-import org.apache.nutch.webui.client.NutchClient;
-import org.apache.nutch.webui.client.NutchClientFactory;
-import org.apache.nutch.webui.client.impl.CrawlingCycle;
-import org.apache.nutch.webui.client.impl.RemoteCommandsBatchFactory;
-import org.apache.nutch.webui.client.impl.CrawlingCycleListener;
-import org.apache.nutch.webui.client.impl.RemoteCommand;
-import org.apache.nutch.webui.client.impl.RemoteCommandExecutor;
-import org.apache.nutch.webui.client.model.Crawl;
-import org.apache.nutch.webui.client.model.Crawl.CrawlStatus;
-import org.apache.nutch.webui.model.NutchInstance;
-import org.apache.nutch.webui.service.CrawlService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Service;
-
-import com.j256.ormlite.dao.Dao;
-
-@Service
-public class CrawlServiceImpl implements CrawlService, CrawlingCycleListener {
-  private static final Logger LOG = LoggerFactory
-      .getLogger(MethodHandles.lookup().lookupClass());
-
-  @Resource
-  private Dao<Crawl, Long> crawlDao;
-
-  @Resource
-  private NutchClientFactory nutchClientFactory;
-
-  @Resource
-  private RemoteCommandsBatchFactory commandFactory;
-
-  @Override
-  @Async
-  public void startCrawl(Long crawlId, NutchInstance instance) {
-    Crawl crawl = null;
-    try {
-      crawl = crawlDao.queryForId(crawlId);
-      if(crawl.getCrawlId()==null) {
-        crawl.setCrawlId("crawl-" + crawlId.toString());
-      }
-      NutchClient client = nutchClientFactory.getClient(instance);
-      String seedDirectory = client.createSeed(crawl.getSeedList());
-      crawl.setSeedDirectory(seedDirectory);
-
-      List<RemoteCommand> commands = commandFactory.createCommands(crawl);
-      RemoteCommandExecutor executor = new RemoteCommandExecutor(client);
-
-      CrawlingCycle cycle = new CrawlingCycle(this, executor, crawl, commands);
-      cycle.executeCrawlCycle();
-
-    } catch (Exception e) {
-      crawl.setStatus(CrawlStatus.ERROR);
-      saveCrawl(crawl);
-      LOG.error("exception occured", e);
-    }
-  }
-
-  @Override
-  public List<Crawl> getCrawls() {
-    try {
-      return crawlDao.queryForAll();
-    } catch (SQLException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  @Override
-  public void saveCrawl(Crawl crawl) {
-    try {
-      crawlDao.createOrUpdate(crawl);
-    } catch (SQLException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  @Override
-  public void deleteCrawl(Long crawlId) {
-    try {
-      crawlDao.deleteById(crawlId);
-    } catch (SQLException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  @Override
-  public void crawlingStarted(Crawl crawl) {
-    crawl.setStatus(CrawlStatus.CRAWLING);
-    crawl.setProgress(0);
-    saveCrawl(crawl);
-  }
-
-  @Override
-  public void onCrawlError(Crawl crawl, String msg) {
-    crawl.setStatus(CrawlStatus.ERROR);
-    saveCrawl(crawl);
-  }
-
-  @Override
-  public void commandExecuted(Crawl crawl, RemoteCommand command, int progress) {
-    crawl.setProgress(progress);
-    saveCrawl(crawl);
-  }
-
-  @Override
-  public void crawlingFinished(Crawl crawl) {
-    crawl.setStatus(CrawlStatus.FINISHED);
-    saveCrawl(crawl);
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/service/impl/NutchInstanceServiceImpl.java b/src/java/org/apache/nutch/webui/service/impl/NutchInstanceServiceImpl.java
deleted file mode 100644
index ac8b815..0000000
--- a/src/java/org/apache/nutch/webui/service/impl/NutchInstanceServiceImpl.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.service.impl;
-
-import java.sql.SQLException;
-import java.util.List;
-
-import javax.annotation.Resource;
-
-import org.apache.nutch.webui.client.NutchClientFactory;
-import org.apache.nutch.webui.model.NutchInstance;
-import org.apache.nutch.webui.service.NutchInstanceService;
-import org.springframework.stereotype.Service;
-
-import com.j256.ormlite.dao.Dao;
-
-@Service
-public class NutchInstanceServiceImpl implements NutchInstanceService {
-
-  @Resource
-  private NutchClientFactory nutchClientFactory;
-
-  @Resource
-  private Dao<NutchInstance, Long> instancesDao;
-
-  @Override
-  public List<NutchInstance> getInstances() {
-    try {
-      return instancesDao.queryForAll();
-    } catch (SQLException e) {
-      throw new RuntimeException(e);
-    }
-
-  }
-
-  @Override
-  public NutchInstance getInstance(Long id) {
-    try {
-      return instancesDao.queryForId(id);
-    } catch (SQLException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  @Override
-  public void saveInstance(NutchInstance instance) {
-    try {
-      instancesDao.createOrUpdate(instance);
-    } catch (SQLException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  @Override
-  public void removeInstance(Long id) {
-    try {
-      instancesDao.deleteById(id);
-    } catch (SQLException e) {
-      throw new RuntimeException(e);
-    }
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/service/impl/NutchServiceImpl.java b/src/java/org/apache/nutch/webui/service/impl/NutchServiceImpl.java
deleted file mode 100644
index 322b864..0000000
--- a/src/java/org/apache/nutch/webui/service/impl/NutchServiceImpl.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.service.impl;
-
-import java.lang.invoke.MethodHandles;
-import java.net.ConnectException;
-import java.util.Collections;
-import java.util.Map;
-
-import javax.annotation.Resource;
-
-import org.apache.nutch.webui.client.NutchClientFactory;
-import org.apache.nutch.webui.client.model.ConnectionStatus;
-import org.apache.nutch.webui.client.model.NutchStatus;
-import org.apache.nutch.webui.model.NutchInstance;
-import org.apache.nutch.webui.service.NutchInstanceService;
-import org.apache.nutch.webui.service.NutchService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import com.sun.jersey.api.client.ClientHandlerException;
-
-@Service
-public class NutchServiceImpl implements NutchService {
-  private static final Logger LOG = LoggerFactory
-      .getLogger(MethodHandles.lookup().lookupClass());
-
-  @Resource
-  private NutchClientFactory nutchClientFactory;
-
-  @Resource
-  private NutchInstanceService instanceService;
-
-  @Override
-  public ConnectionStatus getConnectionStatus(Long instanceId) {
-    NutchInstance instance = instanceService.getInstance(instanceId);
-    try {
-      NutchStatus nutchStatus = nutchClientFactory.getClient(instance)
-          .getNutchStatus();
-      if (nutchStatus.getStartDate() != null) {
-        return ConnectionStatus.CONNECTED;
-      }
-    } catch (Exception e) {
-      if (e.getCause() instanceof ConnectException) {
-        return ConnectionStatus.DISCONNECTED;
-      }
-
-      LOG.error("Cannot connect to nutch server!", e);
-    }
-    return null;
-  }
-
-  @Override
-  public Map<String, String> getNutchConfig(Long instanceId) {
-    NutchInstance instance = instanceService.getInstance(instanceId);
-    try {
-      return nutchClientFactory.getClient(instance).getNutchConfig("default");
-    } catch (ClientHandlerException exception) {
-      return Collections.emptyMap();
-    }
-  }
-
-  @Override
-  public NutchStatus getNutchStatus(Long instanceId) {
-    NutchInstance instance = instanceService.getInstance(instanceId);
-    return nutchClientFactory.getClient(instance).getNutchStatus();
-  }
-}
diff --git a/src/java/org/apache/nutch/webui/service/impl/SeedListServiceImpl.java b/src/java/org/apache/nutch/webui/service/impl/SeedListServiceImpl.java
deleted file mode 100644
index d54d3ff..0000000
--- a/src/java/org/apache/nutch/webui/service/impl/SeedListServiceImpl.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.nutch.webui.service.impl;
-
-import java.sql.SQLException;
-import java.util.List;
-
-import javax.annotation.Resource;
-
-import org.apache.nutch.webui.model.SeedList;
-import org.apache.nutch.webui.model.SeedUrl;
-import org.apache.nutch.webui.service.SeedListService;
-import org.springframework.stereotype.Service;
-
-import com.j256.ormlite.dao.Dao;
-
-@Service
-public class SeedListServiceImpl implements SeedListService {
-
-  @Resource
-  private Dao<SeedList, Long> seedListDao;
-
-  @Resource
-  private Dao<SeedUrl, Long> seedUrlDao;
-
-  @Override
-  public void save(SeedList seedList) {
-    try {
-      seedListDao.createOrUpdate(seedList);
-    } catch (SQLException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  @Override
-  public void delete(Long seedListId) {
-    try {
-      seedListDao.deleteById(seedListId);
-    } catch (SQLException e) {
-      throw new RuntimeException(e);
-    }
-
-  }
-
-  @Override
-  public List<SeedList> findAll() {
-    try {
-      return seedListDao.queryForAll();
-    } catch (SQLException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  @Override
-  public SeedList getSeedList(Long seedListId) {
-    try {
-      return seedListDao.queryForId(seedListId);
-    } catch (SQLException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-}
