diff --git a/org.apache.sling.samples.jcr.contentloader/README.md b/org.apache.sling.samples.jcr.contentloader/README.md
deleted file mode 100644
index 314154f..0000000
--- a/org.apache.sling.samples.jcr.contentloader/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-Sling JCR Content Loader Sample
-===============================
-
-Basic sample to show how to provide a custom content reader and use it instead of the default one for JSON.
diff --git a/org.apache.sling.samples.jcr.contentloader/pom.xml b/org.apache.sling.samples.jcr.contentloader/pom.xml
deleted file mode 100644
index 2a4ec81..0000000
--- a/org.apache.sling.samples.jcr.contentloader/pom.xml
+++ /dev/null
@@ -1,117 +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">
-
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.sling</groupId>
-    <artifactId>sling</artifactId>
-    <version>22</version>
-    <relativePath/>
-  </parent>
-
-  <groupId>org.apache.sling.samples</groupId>
-  <artifactId>org.apache.sling.samples.jcr.contentloader</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
-  <packaging>bundle</packaging>
-
-  <name>Apache Sling JCR Content Loader Sample</name>
-  <description>sample providing custom reader for Sling JCR Content Loader</description>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-    <sling.java.version>7</sling.java.version>
-  </properties>
-
-  <dependencies>
-    <!-- javax -->
-    <dependency>
-      <groupId>javax.jcr</groupId>
-      <artifactId>jcr</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <!-- OSGi -->
-    <dependency>
-      <groupId>org.osgi</groupId>
-      <artifactId>org.osgi.core</artifactId>
-      <version>4.3.1</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.osgi</groupId>
-      <artifactId>org.osgi.compendium</artifactId>
-      <version>4.3.1</version>
-      <scope>provided</scope>
-    </dependency>
-    <!-- Apache Commons -->
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-      <version>2.4</version>
-      <scope>provided</scope>
-    </dependency>
-    <!-- Apache Sling -->
-    <dependency>
-      <groupId>org.apache.sling</groupId>
-      <artifactId>org.apache.sling.jcr.contentloader</artifactId>
-      <version>2.1.11-SNAPSHOT</version>
-      <scope>provided</scope>
-    </dependency>
-    <!-- Google Gson -->
-    <dependency>
-      <groupId>com.google.code.gson</groupId>
-      <artifactId>gson</artifactId>
-      <version>2.3.1</version>
-      <scope>provided</scope>
-    </dependency>
-    <!-- logging -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <scope>provided</scope>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <version>3.1</version>
-        <configuration>
-          <source>1.7</source>
-          <target>1.7</target>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-scr-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </build>
-
-</project>
diff --git a/org.apache.sling.samples.jcr.contentloader/src/main/java/org/apache/sling/samples/jcr/contentloader/internal/GsonReader.java b/org.apache.sling.samples.jcr.contentloader/src/main/java/org/apache/sling/samples/jcr/contentloader/internal/GsonReader.java
deleted file mode 100644
index efbccad..0000000
--- a/org.apache.sling.samples.jcr.contentloader/src/main/java/org/apache/sling/samples/jcr/contentloader/internal/GsonReader.java
+++ /dev/null
@@ -1,140 +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.samples.jcr.contentloader.internal;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.net.URL;
-import java.nio.charset.StandardCharsets;
-
-import javax.jcr.PropertyType;
-import javax.jcr.RepositoryException;
-
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonObject;
-import org.apache.commons.io.IOUtils;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Modified;
-import org.apache.felix.scr.annotations.Properties;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.PropertyUnbounded;
-import org.apache.felix.scr.annotations.Service;
-import org.apache.sling.jcr.contentloader.BaseContentReader;
-import org.apache.sling.jcr.contentloader.ContentCreator;
-import org.apache.sling.jcr.contentloader.ContentReader;
-import org.osgi.framework.Constants;
-import org.osgi.service.component.ComponentContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Component(
-    label = "Apache Sling JCR Content Loader Sample GsonReader",
-    description = "parses JSON content with Gson",
-    immediate = true,
-    metatype = true
-)
-@Service
-@Properties({
-    @Property(
-        name = Constants.SERVICE_VENDOR,
-        value = "The Apache Software Foundation"
-    ),
-    @Property(
-        name = Constants.SERVICE_DESCRIPTION,
-        value = "Apache Sling JCR Content Loader Sample GsonReader"
-    ),
-    @Property(
-        name = ContentReader.PROPERTY_EXTENSIONS,
-        value = {
-            "json"
-        },
-        unbounded = PropertyUnbounded.ARRAY
-    ),
-    @Property(
-        name = ContentReader.PROPERTY_CONTENTTYPES,
-        value = {
-            "application/json"
-        },
-        unbounded = PropertyUnbounded.ARRAY
-    ),
-    @Property(
-        name = Constants.SERVICE_RANKING,
-        intValue = 1,
-        propertyPrivate = false
-    )
-})
-public final class GsonReader extends BaseContentReader implements ContentReader {
-
-    private GsonBuilder gsonBuilder;
-
-    private final Logger logger = LoggerFactory.getLogger(GsonReader.class);
-
-    public GsonReader() {
-    }
-
-    @Activate
-    protected void activate(final ComponentContext componentContext) {
-        configure(componentContext);
-        gsonBuilder = new GsonBuilder();
-    }
-
-    @Modified
-    protected void modified(final ComponentContext componentContext) {
-        configure(componentContext);
-    }
-
-    @Deactivate
-    protected void deactivate(final ComponentContext componentContext) {
-        extensions = null;
-        contentTypes = null;
-        gsonBuilder = null;
-    }
-
-    @Override
-    public void parse(final URL url, final ContentCreator contentCreator) throws IOException, RepositoryException {
-        InputStream inputStream = null;
-        try {
-            inputStream = url.openStream();
-            parse(inputStream, contentCreator);
-        } finally {
-            IOUtils.closeQuietly(inputStream);
-        }
-    }
-
-    /**
-     * TODO well, implement real parsing...
-     */
-    @Override
-    public void parse(final InputStream inputStream, final ContentCreator contentCreator) throws IOException, RepositoryException {
-        final Gson gson = gsonBuilder.create();
-        final Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
-        final JsonObject jsonObject = gson.fromJson(reader, JsonObject.class);
-        final String json = jsonObject.toString();
-        logger.debug("json: {}", json);
-        contentCreator.createNode(null, "nt:unstructured", null);
-        contentCreator.createProperty("json", PropertyType.STRING, json);
-        contentCreator.finishNode();
-    }
-
-}
