diff --git a/meecrowave-doc/src/main/jbake/content/components.adoc b/meecrowave-doc/src/main/jbake/content/components.adoc
index 87811f2..b453bf5 100755
--- a/meecrowave-doc/src/main/jbake/content/components.adoc
+++ b/meecrowave-doc/src/main/jbake/content/components.adoc
@@ -46,9 +46,8 @@
 
 == Meecrowave and Monitoring
 
-Meecrowave provides few integration for the monitoring:
-
-link:{context_rootpath}/meecrowave-jolokia/index.html[Jolokia (JMX)]
+For monitoring, link:https://microprofile.io/[Microprofile] can be a neat companion of Apache Meecrowave.
+You can have a look to link:http://geronimo.apache.org/microprofile/[Geronimo] implementation.
 
 == Meecrowave and JTA
 
diff --git a/meecrowave-doc/src/main/jbake/content/meecrowave-jolokia/index.adoc b/meecrowave-doc/src/main/jbake/content/meecrowave-jolokia/index.adoc
deleted file mode 100644
index 5bb908c..0000000
--- a/meecrowave-doc/src/main/jbake/content/meecrowave-jolokia/index.adoc
+++ /dev/null
@@ -1,107 +0,0 @@
-= Meecrowave Jolokia
-:jbake-date: 2016-12-04
-:jbake-type: page
-:jbake-status: published
-:jbake-meecrowavepdf:
-:jbake-meecrowavetitleicon: icon icon_puzzle_alt
-:jbake-meecrowavecolor: body-red
-:icons: font
-
-Coordinates:
-
-[source,xml]
-----
-<dependency>
-  <groupId>org.apache.meecrowave</groupId>
-  <artifactId>meecrowave-jolokia</artifactId>
-  <version>${meecrowave.version}</version>
-</dependency>
-----
-
-== Jolokia only
-
-If Hawt.io is not setup (not there or inactive) the module will set up jolokia alone.
-
-It will deploy the jolokia servlet on `/jolokia/*` or the property `jolokia.web.mapping` set
-on the `Meecrowave.Builder`.
-
-IMPORTANT: don't forget to secure this endpoint cause it let you access all the JMX MBeans. See
-Meecrowave core configuration for more details.
-
-More on https://jolokia.org/reference/html/
-
-== Hawt.io
-
-By default hawt.io will be deployed and activated on `/hawtio/` endpoint.
-
-To activate it you need to add these dependencies:
-
-[source,xml]
-----
-<dependency>
-  <groupId>io.hawt</groupId>
-  <artifactId>hawtio-springboot</artifactId>
-  <version>1.4.67</version>
-  <optional>true</optional>
-  <exclusions>
-    <exclusion>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter-web</artifactId>
-    </exclusion>
-  </exclusions>
-</dependency>
-<dependency>
-  <groupId>org.apache.logging.log4j</groupId>
-  <artifactId>log4j-slf4j-impl</artifactId>
-  <version>${log4j2.version}</version>
-  <optional>true</optional>
-</dependency>
-----
-
-NOTE: we don't need spring boot but we reuse hawt.io spring boot module which packages web resources in a jar.
-
-By default it will setup the security to use the Servlet security which means you can use meecrowave options:
-
-[source]
-----
-./meecrowave-runner --users=admin=admin --roles=admin=admin
-----
-
-And log with admin/admin user.
-
-== Running HawtIO war
-
-To run http://hawt.io, the easiest is to setup jaas and run the hawt.io war:
-
-[source]
-----
-java -Djava.security.auth.login.config=login.config \
-    -jar meecrowave-runner.jar \
-    -webapp hawtio-default-offline-1.4.67.war
-----
-
-This assumes you created a `login.config`:
-
-[source]
-----
-karaf {
-  org.apache.catalina.realm.JAASMemoryLoginModule required
-	pathname="/path/to/tomcat-users.xml";
-};
-----
-
-NOTE: the JAAS login module is named `karaf` because it is the default of hawt.io (check `io.hawt.web.AuthenticationFilter.init()`).
-
-And if you use - as in previous snippet - tomcat-users.xml you need to create an admin (role) user:
-
-[source,xml]
-----
-<tomcat-users>
-  <user username="admin" password="admin" role="hawtio" roles="admin" />
-</tomcat-users>
-----
-
-NOTE: don't try to use `io.hawt.web.tomcat.TomcatUserDatabaseLoginContext` of hawt.io which does the same as `JAASMemoryLoginModule`
-excepted it doesn't handle absolute paths which enforce you to use a `catalina.base`.
-
-Using hawt.io war you don't need to run jolokia servlet by yourself, it is already done.
diff --git a/meecrowave-jolokia/pom.xml b/meecrowave-jolokia/pom.xml
deleted file mode 100644
index e91be7f..0000000
--- a/meecrowave-jolokia/pom.xml
+++ /dev/null
@@ -1,111 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <parent>
-    <artifactId>meecrowave</artifactId>
-    <groupId>org.apache.meecrowave</groupId>
-    <version>1.2.9-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>meecrowave-jolokia</artifactId>
-  <name>Meecrowave :: Jolokia</name>
-
-  <properties>
-    <jolokia.version>2.0.0-M3</jolokia.version>
-    <meecrowave.build.name>${project.groupId}.jolokia</meecrowave.build.name>
-  </properties>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.tomcat</groupId>
-      <artifactId>tomcat-servlet-api</artifactId>
-      <version>${tomcat.version}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.meecrowave</groupId>
-      <artifactId>meecrowave-core</artifactId>
-      <version>${project.version}</version>
-      <scope>provided</scope>
-    </dependency>
-    <!-- <jolokia.version>2.0.0-M3</jolokia.version>
-    <dependency>
-      <groupId>org.jolokia</groupId>
-      <artifactId>jolokia-server-core</artifactId>
-      <version>${jolokia.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.jolokia</groupId>
-      <artifactId>jolokia-service-serializer</artifactId>
-      <version>${jolokia.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.jolokia</groupId>
-      <artifactId>jolokia-service-jmx</artifactId>
-      <version>${jolokia.version}</version>
-    </dependency>
-    -->
-
-    <dependency> <!-- spring boot module has web resources embedded, reusing that part -->
-      <groupId>io.hawt</groupId>
-      <artifactId>hawtio-springboot</artifactId>
-      <version>1.4.68</version>
-      <optional>true</optional>
-      <exclusions>
-        <exclusion>
-          <groupId>org.springframework.boot</groupId>
-          <artifactId>spring-boot-starter-web</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.logging.log4j</groupId>
-      <artifactId>log4j-slf4j-impl</artifactId>
-      <version>${log4j2.version}</version>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>commons-cli</groupId>
-      <artifactId>commons-cli</artifactId>
-      <version>${commons-cli.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.meecrowave</groupId>
-      <artifactId>meecrowave-junit</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${junit.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-      <version>2.6</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/meecrowave-jolokia/src/main/java/org/apache/meecrowave/jolokia/HawtioInitializer.java b/meecrowave-jolokia/src/main/java/org/apache/meecrowave/jolokia/HawtioInitializer.java
deleted file mode 100644
index 3c6f9df..0000000
--- a/meecrowave-jolokia/src/main/java/org/apache/meecrowave/jolokia/HawtioInitializer.java
+++ /dev/null
@@ -1,339 +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.meecrowave.jolokia;
-
-import io.hawt.HawtioContextListener;
-import io.hawt.web.AuthenticationFilter;
-import io.hawt.web.CORSFilter;
-import io.hawt.web.CacheHeadersFilter;
-import io.hawt.web.ContextFormatterServlet;
-import io.hawt.web.ExportContextServlet;
-import io.hawt.web.GitServlet;
-import io.hawt.web.JavaDocServlet;
-import io.hawt.web.JolokiaConfiguredAgentServlet;
-import io.hawt.web.LoginServlet;
-import io.hawt.web.LogoutServlet;
-import io.hawt.web.PluginServlet;
-import io.hawt.web.ProxyServlet;
-import io.hawt.web.RedirectFilter;
-import io.hawt.web.SessionExpiryFilter;
-import io.hawt.web.UploadServlet;
-import io.hawt.web.UserServlet;
-import io.hawt.web.XFrameOptionsFilter;
-import io.hawt.web.keycloak.KeycloakServlet;
-import org.apache.catalina.Globals;
-import org.apache.catalina.WebResourceRoot;
-import org.apache.catalina.realm.GenericPrincipal;
-import org.apache.catalina.webresources.JarResourceSet;
-import org.apache.commons.fileupload.servlet.FileCleanerCleanup;
-import org.apache.meecrowave.runner.Cli;
-import org.apache.meecrowave.runner.cli.CliOption;
-
-import javax.enterprise.inject.spi.BeanManager;
-import javax.enterprise.inject.spi.CDI;
-import javax.security.auth.Subject;
-import javax.security.auth.callback.Callback;
-import javax.security.auth.callback.CallbackHandler;
-import javax.security.auth.callback.NameCallback;
-import javax.security.auth.callback.PasswordCallback;
-import javax.security.auth.callback.UnsupportedCallbackException;
-import javax.security.auth.login.AppConfigurationEntry;
-import javax.security.auth.login.Configuration;
-import javax.security.auth.login.LoginException;
-import javax.security.auth.spi.LoginModule;
-import javax.servlet.DispatcherType;
-import javax.servlet.FilterRegistration;
-import javax.servlet.ServletContainerInitializer;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRegistration;
-import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
-import java.security.Principal;
-import java.security.Security;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import static java.util.Optional.ofNullable;
-
-public class HawtioInitializer implements ServletContainerInitializer {
-    @Override
-    public void onStartup(final Set<Class<?>> set, final ServletContext servletContext) throws ServletException {
-        try {
-            servletContext.getClassLoader().loadClass("io.hawt.web.UserServlet");
-        } catch (final ClassNotFoundException e) {
-            servletContext.log("Hawt.io not available, skipping");
-            return;
-        }
-        Delegate.doSetup(servletContext);
-    }
-
-    private static class Delegate {
-        private Delegate() {
-            // no-op
-        }
-
-        private static void doSetup(final ServletContext servletContext) {
-            final org.apache.meecrowave.configuration.Configuration config = org.apache.meecrowave.configuration.Configuration.class.cast(
-                    servletContext.getAttribute("meecrowave.configuration"));
-            final HawtioConfiguration configuration = config.getExtension(HawtioConfiguration.class);
-            final JolokiaInitializer.JolokiaConfiguration jolokia = config.getExtension(JolokiaInitializer.JolokiaConfiguration.class);
-            if (!configuration.isActive()) {
-                return;
-            }
-
-            doSetupJaas(configuration, servletContext);
-
-            final String mapping = ofNullable(configuration.getMapping()).orElse("/hawtio/");
-
-            {
-                final ServletRegistration.Dynamic servlet = servletContext.addServlet("hawtio-user", UserServlet.class);
-                servlet.addMapping(mapping + "user/*");
-            }
-            {
-                final ServletRegistration.Dynamic servlet = servletContext.addServlet("hawtio-proxy", ProxyServlet.class);
-                servlet.addMapping(mapping + "proxy/*");
-            }
-            {
-                final ServletRegistration.Dynamic servlet = servletContext.addServlet("hawtio-file-upload", UploadServlet.class);
-                servlet.addMapping(mapping + "file-upload/*");
-            }
-            {
-                final ServletRegistration.Dynamic servlet = servletContext.addServlet("hawtio-login", LoginServlet.class);
-                servlet.addMapping(mapping + "auth/login/*");
-            }
-            {
-                final ServletRegistration.Dynamic servlet = servletContext.addServlet("hawtio-logout", LogoutServlet.class);
-                servlet.addMapping(mapping + "auth/logout/*");
-            }
-            {
-                final ServletRegistration.Dynamic servlet = servletContext.addServlet("hawtio-keycloak", KeycloakServlet.class);
-                servlet.addMapping(mapping + "keycloak/*");
-            }
-            {
-                final ServletRegistration.Dynamic servlet = servletContext.addServlet("hawtio-exportContext", ExportContextServlet.class);
-                servlet.addMapping(mapping + "exportContext/*");
-            }
-            {
-                final ServletRegistration.Dynamic servlet = servletContext.addServlet("hawtio-javadoc", JavaDocServlet.class);
-                servlet.addMapping(mapping + "javadoc/*");
-            }
-            {
-                final ServletRegistration.Dynamic servlet = servletContext.addServlet("hawtio-plugin", PluginServlet.class);
-                servlet.addMapping(mapping + "plugin/*");
-            }
-            {
-                final ServletRegistration.Dynamic servlet = servletContext.addServlet("hawtio-contextFormatter", ContextFormatterServlet.class);
-                servlet.addMapping(mapping + "contextFormatter/*");
-            }
-            {
-                final ServletRegistration.Dynamic servlet = servletContext.addServlet("hawtio-git", GitServlet.class);
-                servlet.addMapping(mapping + "git/*");
-            }
-            {
-                final ServletRegistration.Dynamic servlet = servletContext.addServlet("hawtio-jolokia", JolokiaConfiguredAgentServlet.class);
-                servlet.setInitParameter("mbeanQualifier", "qualifier=hawtio");
-                servlet.setInitParameter("includeStackTrace", "false");
-                servlet.setInitParameter("restrictorClass", "io.hawt.web.RBACRestrictor");
-                servlet.addMapping(mapping + "jolokia/*");
-            }
-            {
-                final WebResourceRoot root = WebResourceRoot.class.cast(servletContext.getAttribute(Globals.RESOURCES_ATTR));
-                final String url = servletContext.getClassLoader().getResource("static/hawtio").toExternalForm();
-                final int sep = url.lastIndexOf("!/");
-                String jar = url;
-                if (jar.startsWith("jar:")) {
-                    jar = url.substring("jar:".length(), sep);
-                }
-                if (jar.startsWith("file:")) {
-                    jar = jar.substring("file:".length());
-                }
-                root.addPostResources(new JarResourceSet(root, mapping, jar, "/static/hawtio/"));
-            }
-
-            servletContext.addListener(HawtioContextListener.class);
-            servletContext.addListener(FileCleanerCleanup.class);
-
-            {
-                final FilterRegistration.Dynamic filter = servletContext.addFilter("hawtio-redirect", RedirectFilter.class);
-                filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, mapping + "*");
-            }
-            {
-                final FilterRegistration.Dynamic filter = servletContext.addFilter("hawtio-cacheheaders", CacheHeadersFilter.class);
-                filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, mapping + "*");
-            }
-            {
-                final FilterRegistration.Dynamic filter = servletContext.addFilter("hawtio-cors", CORSFilter.class);
-                filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, mapping + "*");
-            }
-            {
-                final FilterRegistration.Dynamic filter = servletContext.addFilter("hawtio-xframe", XFrameOptionsFilter.class);
-                filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, mapping + "*");
-            }
-            {
-                final FilterRegistration.Dynamic filter = servletContext.addFilter("hawtio-sessionexpiry", SessionExpiryFilter.class);
-                filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, mapping + "*");
-            }
-            {
-                final FilterRegistration.Dynamic filter = servletContext.addFilter("hawtio-authentication", AuthenticationFilter.class);
-                filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false,
-                        mapping + "auth/*", mapping + "upload/*", mapping + "javadoc/*", mapping + "jolokia/*",
-                        ofNullable(jolokia.getMapping()).orElse("/jolokia/*"));
-            }
-
-            servletContext.log("Installed Hawt.io on " + mapping);
-        }
-
-        private static void doSetupJaas(final HawtioConfiguration configuration, final ServletContext servletContext) {
-            if (!configuration.isJaas()) {
-                return;
-            }
-            final String key = "login.configuration.provider";
-            final String val = Security.getProperty(key);
-            Security.setProperty(key, EmbeddedConfiguration.class.getName());
-            servletContext.addListener(new ServletContextListener() {
-                @Override
-                public void contextDestroyed(final ServletContextEvent sce) {
-                    Security.setProperty(key, val == null ? "sun.security.provider.ConfigFile" : val);
-                }
-            });
-        }
-    }
-
-    public static class EmbeddedConfiguration extends Configuration {
-        private final AppConfigurationEntry[] entries = new AppConfigurationEntry[]{
-                new AppConfigurationEntry(EmbeddedLoginModule.class.getName(), AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, new HashMap<>())
-        };
-
-        @Override
-        public AppConfigurationEntry[] getAppConfigurationEntry(final String name) {
-            return "karaf".equals(name) ? entries : null;
-        }
-    }
-
-    public static class EmbeddedLoginModule implements LoginModule {
-        private Subject subject;
-        private CallbackHandler callbackHandler;
-
-        private Principal principal;
-
-        @Override
-        public void initialize(final Subject subject, final CallbackHandler callbackHandler,
-                               final Map<String, ?> sharedState, final Map<String, ?> options) {
-            this.subject = subject;
-            this.callbackHandler = callbackHandler;
-        }
-
-        @Override
-        public boolean login() throws LoginException {
-            final Callback[] callbacks = new Callback[2];
-            callbacks[0] = new NameCallback("Username: ");
-            callbacks[1] = new PasswordCallback("Password: ", false);
-            try {
-                callbackHandler.handle(callbacks);
-            } catch (IOException | UnsupportedCallbackException e) {
-                throw new LoginException(e.toString());
-            }
-
-            final BeanManager beanManager = CDI.current().getBeanManager();
-            final HttpServletRequest request =
-                    HttpServletRequest.class.cast(
-                            beanManager.getReference(
-                                    beanManager.resolve(beanManager.getBeans(HttpServletRequest.class)),
-                                    HttpServletRequest.class,
-                                    beanManager.createCreationalContext(null)));
-
-            try {
-                request.login(NameCallback.class.cast(callbacks[0]).getName(), new String(PasswordCallback.class.cast(callbacks[1]).getPassword()));
-            } catch (final ServletException e) {
-                throw new LoginException(e.getMessage());
-            }
-
-            principal = request.getUserPrincipal();
-
-            return principal != null;
-        }
-
-        @Override
-        public boolean commit() throws LoginException {
-            if (!subject.getPrincipals().contains(principal)) {
-                subject.getPrincipals().add(principal);
-                if (GenericPrincipal.class.isInstance(principal)) {
-                    final String roles[] = GenericPrincipal.class.cast(principal).getRoles();
-                    for (final String role : roles) {
-                        subject.getPrincipals().add(new GenericPrincipal(role, null, null));
-                    }
-
-                }
-            }
-            return true;
-        }
-
-        @Override
-        public boolean abort() throws LoginException {
-            principal = null;
-            return true;
-        }
-
-        @Override
-        public boolean logout() throws LoginException {
-            subject.getPrincipals().remove(principal);
-            return true;
-        }
-    }
-
-    public static class HawtioConfiguration implements Cli.Options {
-        @CliOption(name = "hawtio-mapping", description = "Hawt.io base endpoint")
-        private String mapping;
-
-        @CliOption(name = "hawtio-active", description = "Should Hawt.io be deployed if present")
-        private boolean active = true;
-
-        @CliOption(name = "hawtio-meecrowave-jaas", description = "Should meecrowave setup jaas")
-        private boolean jaas = true;
-
-        public boolean isJaas() {
-            return jaas;
-        }
-
-        public void setJaas(final boolean jaas) {
-            this.jaas = jaas;
-        }
-
-        public boolean isActive() {
-            return active;
-        }
-
-        public void setActive(final boolean active) {
-            this.active = active;
-        }
-
-        public String getMapping() {
-            return mapping;
-        }
-
-        public void setMapping(final String mapping) {
-            this.mapping = mapping;
-        }
-    }
-}
diff --git a/meecrowave-jolokia/src/main/java/org/apache/meecrowave/jolokia/JolokiaInitializer.java b/meecrowave-jolokia/src/main/java/org/apache/meecrowave/jolokia/JolokiaInitializer.java
deleted file mode 100644
index bbbb88f..0000000
--- a/meecrowave-jolokia/src/main/java/org/apache/meecrowave/jolokia/JolokiaInitializer.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.meecrowave.jolokia;
-
-import org.apache.meecrowave.configuration.Configuration;
-import org.apache.meecrowave.runner.Cli;
-import org.apache.meecrowave.runner.cli.CliOption;
-import org.jolokia.http.AgentServlet;
-
-import javax.servlet.ServletContainerInitializer;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRegistration;
-import java.util.Set;
-
-import static java.util.Optional.ofNullable;
-
-public class JolokiaInitializer implements ServletContainerInitializer {
-    @Override
-    public void onStartup(final Set<Class<?>> set, final ServletContext servletContext) throws ServletException {
-        final Configuration config = Configuration.class.cast(servletContext.getAttribute("meecrowave.configuration"));
-        final JolokiaConfiguration configuration = config.getExtension(JolokiaConfiguration.class);
-        if (!configuration.isActive()) {
-            return;
-        }
-        try { // if hawtio is setup skip it
-            servletContext.getClassLoader().loadClass("io.hawt.web.UserServlet");
-            if (config.getExtension(HawtioInitializer.HawtioConfiguration.class).isActive()) {
-                return;
-            }
-        } catch (final ClassNotFoundException e) {
-            // that's what we want
-        }
-
-        final ServletRegistration.Dynamic jolokia = servletContext.addServlet("jolokia", AgentServlet.class);
-        jolokia.setLoadOnStartup(1);
-        final String mapping = ofNullable(configuration.getMapping()).orElse("/jolokia/*");
-        jolokia.addMapping(mapping);
-        servletContext.log("Installed Jolokia on " + mapping);
-    }
-
-    public static class JolokiaConfiguration implements Cli.Options {
-        @CliOption(name = "jolokia-mapping", description = "Jolokia endpoint")
-        private String mapping;
-
-        @CliOption(name = "jolokia-active", description = "Should Jolokia be deployed (only if hawt.io is not)")
-        private boolean active = true;
-
-        public boolean isActive() {
-            return active;
-        }
-
-        public void setActive(final boolean active) {
-            this.active = active;
-        }
-
-        public String getMapping() {
-            return mapping;
-        }
-
-        public void setMapping(final String mapping) {
-            this.mapping = mapping;
-        }
-    }
-}
diff --git a/meecrowave-jolokia/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer b/meecrowave-jolokia/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer
deleted file mode 100644
index fb09a91..0000000
--- a/meecrowave-jolokia/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer
+++ /dev/null
@@ -1,2 +0,0 @@
-org.apache.meecrowave.jolokia.JolokiaInitializer
-org.apache.meecrowave.jolokia.HawtioInitializer
diff --git a/meecrowave-jolokia/src/main/resources/META-INF/services/org.apache.meecrowave.runner.Cli$Options b/meecrowave-jolokia/src/main/resources/META-INF/services/org.apache.meecrowave.runner.Cli$Options
deleted file mode 100644
index 4ff54c5..0000000
--- a/meecrowave-jolokia/src/main/resources/META-INF/services/org.apache.meecrowave.runner.Cli$Options
+++ /dev/null
@@ -1,2 +0,0 @@
-org.apache.meecrowave.jolokia.HawtioInitializer$HawtioConfiguration
-org.apache.meecrowave.jolokia.JolokiaInitializer$JolokiaConfiguration
\ No newline at end of file
diff --git a/meecrowave-jolokia/src/test/java/org/apache/meecrowave/jolokia/HawtioTest.java b/meecrowave-jolokia/src/test/java/org/apache/meecrowave/jolokia/HawtioTest.java
deleted file mode 100644
index 9b003a2..0000000
--- a/meecrowave-jolokia/src/test/java/org/apache/meecrowave/jolokia/HawtioTest.java
+++ /dev/null
@@ -1,43 +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.meecrowave.jolokia;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.meecrowave.junit.MeecrowaveRule;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.net.URL;
-import java.nio.charset.StandardCharsets;
-
-import static org.junit.Assert.assertTrue;
-
-public class HawtioTest {
-    @ClassRule
-    public static final MeecrowaveRule RULE = new MeecrowaveRule();
-
-    @Test
-    public void run() throws IOException {
-        final String actual = IOUtils.toString(
-                new URL("http://localhost:" + RULE.getConfiguration().getHttpPort() + "/hawtio/"),
-                StandardCharsets.UTF_8);
-        assertTrue(actual, actual.contains("<title>hawtio</title>"));
-    }
-}
diff --git a/meecrowave-jolokia/src/test/java/org/apache/meecrowave/jolokia/JolokiaInitializerTest.java b/meecrowave-jolokia/src/test/java/org/apache/meecrowave/jolokia/JolokiaInitializerTest.java
deleted file mode 100644
index ea0e4bf..0000000
--- a/meecrowave-jolokia/src/test/java/org/apache/meecrowave/jolokia/JolokiaInitializerTest.java
+++ /dev/null
@@ -1,50 +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.meecrowave.jolokia;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.meecrowave.Meecrowave;
-import org.apache.meecrowave.junit.MeecrowaveRule;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.net.URL;
-import java.nio.charset.StandardCharsets;
-
-import static org.junit.Assert.assertTrue;
-
-public class JolokiaInitializerTest {
-    @ClassRule
-    public static final MeecrowaveRule RULE = new MeecrowaveRule(new Meecrowave.Builder() {{
-        randomHttpPort();
-        this.setExtension(HawtioInitializer.HawtioConfiguration.class, new HawtioInitializer.HawtioConfiguration() {{
-            setActive(false);
-        }});
-    }}, "");
-
-    @Test
-    public void run() throws IOException {
-        final String actual = IOUtils.toString(
-                new URL("http://localhost:" + RULE.getConfiguration().getHttpPort() + "/jolokia/read/java.lang:type=Memory/HeapMemoryUsage"),
-                StandardCharsets.UTF_8);
-        assertTrue(actual, actual.contains("\"status\":200"));
-        assertTrue(actual, actual.contains("\"mbean\":\"java.lang:type=Memory\""));
-    }
-}
diff --git a/pom.xml b/pom.xml
index 6aca342..efd86b0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -75,7 +75,6 @@
     <module>meecrowave-junit</module>
     <module>meecrowave-arquillian</module>
     <module>meecrowave-jpa</module>
-    <module>meecrowave-jolokia</module>
     <module>meecrowave-doc</module>
     <module>meecrowave-jta</module>
     <module>integration-tests</module>
