diff --git a/pom.xml b/pom.xml
index 0c4778c..acbb738 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.apache.sling</groupId>
         <artifactId>sling-bundle-parent</artifactId>
-        <version>38</version>
+        <version>49</version>
         <relativePath />
     </parent>
 
@@ -66,6 +66,7 @@
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
+            <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>
diff --git a/src/main/java/org/apache/sling/installer/core/impl/console/ConfigurationSerializerWebConsolePlugin.java b/src/main/java/org/apache/sling/installer/core/impl/console/ConfigurationSerializerWebConsolePlugin.java
deleted file mode 100644
index 5ff745c..0000000
--- a/src/main/java/org/apache/sling/installer/core/impl/console/ConfigurationSerializerWebConsolePlugin.java
+++ /dev/null
@@ -1,252 +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.sling.installer.core.impl.console;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.nio.charset.StandardCharsets;
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Set;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
-import org.apache.sling.installer.api.serializer.ConfigurationSerializerFactory;
-import org.apache.sling.installer.api.serializer.ConfigurationSerializerFactory.Format;
-import org.osgi.framework.Constants;
-import org.osgi.service.cm.Configuration;
-import org.osgi.service.cm.ConfigurationAdmin;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Reference;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Component(service=javax.servlet.Servlet.class,
-    property = {
-        Constants.SERVICE_VENDOR + "=The Apache Software Foundation",
-        Constants.SERVICE_DESCRIPTION + "=Apache Sling OSGi Installer Configuration Serializer Web Console Plugin",
-        "felix.webconsole.label=" + ConfigurationSerializerWebConsolePlugin.LABEL,
-        "felix.webconsole.title=OSGi Installer Configuration Printer",
-        "felix.webconsole.category=OSGi"
-    })
-@SuppressWarnings("serial")
-public class ConfigurationSerializerWebConsolePlugin extends AbstractWebConsolePlugin {
-
-    public static final String LABEL = "osgi-installer-config-printer";
-    private static final String RES_LOC = LABEL + "/res/ui/";
-    private static final String PARAMETER_PID = "pid";
-    private static final String PARAMETER_FORMAT = "format";
-
-    // copied from org.apache.sling.installer.factories.configuration.impl.ConfigUtil
-    /**
-     * This property has been used in older versions to keep track where the
-     * configuration has been installed from.
-     */
-    private static final String CONFIG_PATH_KEY = "org.apache.sling.installer.osgi.path";
-
-    /**
-     * This property has been used in older versions to keep track of factory
-     * configurations.
-     */
-    private static final String ALIAS_KEY = "org.apache.sling.installer.osgi.factoryaliaspid";
-
-    /** Configuration properties to ignore when printing */
-    private static final Set<String> IGNORED_PROPERTIES = new HashSet<>();
-    static {
-        IGNORED_PROPERTIES.add(Constants.SERVICE_PID);
-        IGNORED_PROPERTIES.add(CONFIG_PATH_KEY);
-        IGNORED_PROPERTIES.add(ALIAS_KEY);
-        IGNORED_PROPERTIES.add(ConfigurationAdmin.SERVICE_FACTORYPID);
-    }
-    
-    /** The logger */
-    private final Logger LOGGER =  LoggerFactory.getLogger(ConfigurationSerializerWebConsolePlugin.class);
-
-    @Reference
-    ConfigurationAdmin configurationAdmin;
-
-    @Override
-    public void service(final ServletRequest request, final ServletResponse response)
-            throws IOException {
-        
-        final String pid = request.getParameter(PARAMETER_PID);
-        final String format = request.getParameter(PARAMETER_FORMAT);
-        ConfigurationSerializerFactory.Format serializationFormat = Format.JSON;
-        if (format != null && !format.trim().isEmpty()) {
-            try {
-                serializationFormat = ConfigurationSerializerFactory.Format.valueOf(format);
-            } catch (IllegalArgumentException e) {
-                LOGGER.warn("Illegal parameter 'format' given, falling back to default '{}'", serializationFormat, e);
-            }
-        }
-        final PrintWriter pw = response.getWriter();
-
-        pw.println("<script type=\"text/javascript\" src=\"" + RES_LOC + "clipboard.js\"></script>");
-        pw.print("<form method='get'>");
-        pw.println("<table class='content' cellpadding='0' cellspacing='0' width='100%'>");
-
-        titleHtml(
-                pw,
-                "OSGi Installer Configuration Printer",
-                "To emit the configuration properties just enter the configuration PID, select a <a href='https://sling.apache.org/documentation/bundles/configuration-installer-factory.html'>serialization format</a> and click 'Print'");
-
-        tr(pw);
-        tdLabel(pw, "PID");
-        tdContent(pw);
-
-        pw.print("<input type='text' name='");
-        pw.print(PARAMETER_PID);
-        pw.print("' value='");
-        if ( pid != null ) {
-            pw.print(escapeXml(pid));
-        }
-        
-        pw.println("' class='input' size='120'>");
-        closeTd(pw);
-        closeTr(pw);
-        closeTr(pw);
-
-        tr(pw);
-        tdLabel(pw, "Serialization Format");
-        tdContent(pw);
-        pw.print("<select name='");
-        pw.print(PARAMETER_FORMAT);
-        pw.println("'>");
-        option(pw, "JSON", "OSGi Configurator JSON", format);
-        option(pw, "CONFIG", "Apache Felix Config", format);
-        option(pw, "PROPERTIES", "Java Properties", format);
-        option(pw, "PROPERTIES_XML", "Java Properties (XML)", format);
-        pw.println("</select>");
-
-        pw.println("&nbsp;&nbsp;<input type='submit' value='Print' class='submit'>");
-
-        closeTd(pw);
-        closeTr(pw);
-
-        if (pid != null && !pid.trim().isEmpty()) {
-            tr(pw);
-            tdLabel(pw, "Serialized Configuration Properties");
-            tdContent(pw);
-            
-            Configuration configuration = configurationAdmin.getConfiguration(pid, null);
-            Dictionary<String, Object> properties = configuration.getProperties();
-            if (properties == null) {
-                pw.print("<p class='ui-state-error-text'>");
-                pw.print("No configuration properties for pid '" + escapeXml(pid) + "' found!");
-                pw.println("</p>");
-            } else {
-                properties = cleanConfiguration(properties);
-                try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
-                    ConfigurationSerializerFactory.create(serializationFormat).serialize(properties, baos);
-                    pw.println("<textarea rows=\"20\" cols=\"120\" id=\"output\" readonly>");
-                    pw.print(new String(baos.toByteArray(), StandardCharsets.UTF_8));
-                    pw.println("</textarea>");
-                    pw.println("<button type='button' id='copy'>Copy to Clipboard</a>");
-                } catch (Throwable e) {
-                    pw.print("<p class='ui-state-error-text'>");
-                    pw.print("Error serializing pid '" + escapeXml(pid) + "': " + e.getMessage());
-                    pw.println("</p>");
-                    LOGGER.warn("Error serializing pid '{}'", pid, e);
-                }
-            }
-            closeTd(pw);
-            closeTr(pw);
-        }
-
-        pw.println("</table>");
-        pw.print("</form>");
-    }
-
-    // copied from org.apache.sling.installer.factories.configuration.impl.ConfigUtil
-    /**
-     * Remove all ignored properties
-     */
-    public static Dictionary<String, Object> cleanConfiguration(final Dictionary<String, Object> config) {
-        final Dictionary<String, Object> cleanedConfig = new Hashtable<>();
-        final Enumeration<String> e = config.keys();
-        while(e.hasMoreElements()) {
-            final String key = e.nextElement();
-            if ( !IGNORED_PROPERTIES.contains(key) ) {
-                cleanedConfig.put(key, config.get(key));
-            }
-        }
-
-        return cleanedConfig;
-    }
-
-    private void tdContent(final PrintWriter pw) {
-        pw.print("<td class='content' colspan='2'>");
-    }
-
-    private void closeTd(final PrintWriter pw) {
-        pw.print("</td>");
-    }
-
-    private void closeTr(final PrintWriter pw) {
-        pw.println("</tr>");
-    }
-
-    private void tdLabel(final PrintWriter pw, final String label) {
-        pw.print("<td class='content'>");
-        pw.print(label);
-        pw.println("</td>");
-    }
-
-    private void tr(final PrintWriter pw) {
-        pw.println("<tr class='content'>");
-    }
-
-    private void option(final PrintWriter pw, String value, String label, String selectedValue) {
-        pw.print("<option value='");
-        pw.print(value);
-        pw.print("'");
-        if (value.equals(selectedValue)) {
-            pw.print(" selected");
-        }
-        pw.print(">");
-        pw.print(label);
-        pw.println("</option>");
-    }
-
-    private void titleHtml(final PrintWriter pw, final String title, final String description) {
-        tr(pw);
-        pw.print("<th colspan='3' class='content container'>");
-        pw.print(escapeXml(title));
-        pw.println("</th>");
-        closeTr(pw);
-
-        if (description != null) {
-            tr(pw);
-            pw.print("<td colspan='3' class='content'>");
-            pw.print(description);
-            pw.println("</th>");
-            closeTr(pw);
-        }
-    }
-
-    @Override
-    String getRelativeResourcePrefix() {
-        return RES_LOC;
-    }
-
-}
diff --git a/src/main/resources/res/ui/clipboard.js b/src/main/resources/res/ui/clipboard.js
deleted file mode 100644
index 197f933..0000000
--- a/src/main/resources/res/ui/clipboard.js
+++ /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.
- */
-function copyToClipboard(inputElement) {
-  inputElement.select();
-  document.execCommand("copy");
-}
-
-window.onload = function() {
-  button = document.querySelector("#copy");
-  if (button != null) {
-    button.addEventListener("click", function() {
-      copyToClipboard(document.querySelector("#output"));
-    });
-  }
-}
