diff --git a/bom/camel-karaf-bom/pom.xml b/bom/camel-karaf-bom/pom.xml
index 55ffcab..a6e98ed 100644
--- a/bom/camel-karaf-bom/pom.xml
+++ b/bom/camel-karaf-bom/pom.xml
@@ -78,11 +78,6 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel.karaf</groupId>
-        <artifactId>camel-osgi-activator</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.camel.karaf</groupId>
         <artifactId>camel-paxlogging</artifactId>
         <version>${project.version}</version>
       </dependency>
diff --git a/components/camel-osgi-activator/pom.xml b/components/camel-osgi-activator/pom.xml
deleted file mode 100644
index 5e62543..0000000
--- a/components/camel-osgi-activator/pom.xml
+++ /dev/null
@@ -1,198 +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.camel.karaf</groupId>
-        <artifactId>components</artifactId>
-        <version>3.15.0-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>camel-osgi-activator</artifactId>
-    <packaging>jar</packaging>
-
-    <name>Camel Karaf :: OSGi Activator (deprecated)</name>
-    <description>Camel OSGi Activator for running Camel routes from other bundles</description>
-
-    <properties>
-        <camel.osgi.activator>org.apache.camel.osgi.activator.CamelRoutesActivator</camel.osgi.activator>
-        <camel.osgi.dynamic>*</camel.osgi.dynamic>
-        <firstVersion>3.1.0</firstVersion>
-
-        <supportLevel>preview</supportLevel>
-    </properties>
-
-    <dependencies>
-        <!-- osgi -->
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>osgi.cmpn</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel.karaf</groupId>
-            <artifactId>camel-core-osgi</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel</groupId>
-            <artifactId>camel-core-languages</artifactId>
-        </dependency>
-        <!-- test -->
-        <dependency>
-            <groupId>org.apache.camel</groupId>
-            <artifactId>camel-timer</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel</groupId>
-            <artifactId>camel-log</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-        <!-- PAX Exam -->
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-spi</artifactId>
-            <version>${pax-exam-version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-junit4</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-container-karaf</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.url</groupId>
-            <artifactId>pax-url-aether</artifactId>
-            <version>2.6.2</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.tinybundles</groupId>
-            <artifactId>tinybundles</artifactId>
-            <version>2.1.1</version>
-            <scope>test</scope>
-        </dependency>
-
-        <!-- Karaf & Command Shell -->
-        <dependency>
-            <groupId>org.apache.karaf</groupId>
-            <artifactId>apache-karaf</artifactId>
-            <version>${karaf4-version}</version>
-            <type>zip</type>
-            <scope>test</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.apache.karaf.features</groupId>
-                    <artifactId>framework</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <!-- Karaf Features -->
-        <dependency>
-            <groupId>org.apache.camel.karaf</groupId>
-            <artifactId>apache-camel</artifactId>
-            <version>${project.version}</version>
-            <classifier>features</classifier>
-            <type>xml</type>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>javax.inject</groupId>
-            <artifactId>javax.inject</artifactId>
-            <version>1</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.servicemix.tooling</groupId>
-                <artifactId>depends-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>generate-depends-file</id>
-                        <goals>
-                            <goal>generate-depends-file</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>pre-integration-test</phase>
-                        <goals>
-                            <goal>single</goal>
-                        </goals>
-                        <configuration>
-                            <descriptors>
-                                <descriptor>src/assembly/test-bundles.xml</descriptor>
-                            </descriptors>
-                            <finalName>test</finalName>
-                            <attach>false</attach>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <!-- Execute in the integration-test phase so that the packaged 
-                JAR can be used -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>integration-test</phase>
-                        <goals>
-                            <goal>test</goal>
-                        </goals>
-                        <configuration>
-                            <includes>
-                                <include>**/*IT.java</include>
-                            </includes>
-                            <forkedProcessTimeoutInSeconds>300</forkedProcessTimeoutInSeconds>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/components/camel-osgi-activator/src/assembly/test-bundles.xml b/components/camel-osgi-activator/src/assembly/test-bundles.xml
deleted file mode 100644
index 79dc20c..0000000
--- a/components/camel-osgi-activator/src/assembly/test-bundles.xml
+++ /dev/null
@@ -1,52 +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.
-
--->
-<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
-  <id>bundles</id>
-  <formats>
-    <format>dir</format>
-  </formats>
-  <includeBaseDirectory>false</includeBaseDirectory>
-  <dependencySets>
-    <dependencySet>
-      <outputDirectory/>
-      <outputFileNameMapping>${artifact.artifactId}.jar</outputFileNameMapping>
-      <includes>
-        <include>org.apache.camel:camel-api</include>
-        <include>org.apache.camel:camel-base</include>
-        <include>org.apache.camel:camel-base-engine</include>
-        <include>org.apache.camel:camel-core-reifier</include>
-        <include>org.apache.camel:camel-core-model</include>
-        <include>org.apache.camel:camel-core-processor</include>
-        <include>org.apache.camel:camel-core-engine</include>
-        <include>org.apache.camel:camel-core-languages</include>
-        <include>org.apache.camel:camel-management-api</include>
-        <include>org.apache.camel.karaf:camel-core-osgi</include>
-        <include>org.apache.camel.karaf:camel-osgi-activator</include>
-        <include>org.apache.camel:camel-support</include>
-        <include>org.apache.camel:camel-util</include>
-        <include>org.apache.camel:camel-timer</include>
-        <include>org.apache.camel:camel-log</include>
-      </includes>
-      <scope>test</scope>
-    </dependencySet>
-  </dependencySets>
-</assembly>
diff --git a/components/camel-osgi-activator/src/generated/resources/META-INF/services/org/apache/camel/other.properties b/components/camel-osgi-activator/src/generated/resources/META-INF/services/org/apache/camel/other.properties
deleted file mode 100644
index 5316a19..0000000
--- a/components/camel-osgi-activator/src/generated/resources/META-INF/services/org/apache/camel/other.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-name=osgi-activator
-groupId=org.apache.camel.karaf
-artifactId=camel-osgi-activator
-version=3.15.0-SNAPSHOT
-projectName=Camel Karaf :: OSGi Activator (deprecated)
-projectDescription=Camel OSGi Activator for running Camel routes from other bundles
diff --git a/components/camel-osgi-activator/src/generated/resources/osgi-activator.json b/components/camel-osgi-activator/src/generated/resources/osgi-activator.json
deleted file mode 100644
index c4998c7..0000000
--- a/components/camel-osgi-activator/src/generated/resources/osgi-activator.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "other": {
-    "kind": "other",
-    "name": "osgi-activator",
-    "title": "Osgi Activator",
-    "description": "Camel OSGi Activator for running Camel routes from other bundles",
-    "deprecated": true,
-    "firstVersion": "3.1.0",
-    "supportLevel": "Preview",
-    "groupId": "org.apache.camel.karaf",
-    "artifactId": "camel-osgi-activator",
-    "version": "3.15.0-SNAPSHOT"
-  }
-}
diff --git a/components/camel-osgi-activator/src/main/docs/osgi-activator.adoc b/components/camel-osgi-activator/src/main/docs/osgi-activator.adoc
deleted file mode 100644
index 6546cb1..0000000
--- a/components/camel-osgi-activator/src/main/docs/osgi-activator.adoc
+++ /dev/null
@@ -1,74 +0,0 @@
-[[OsgiActivator]]
-= OSGi Camel Routes Activator (deprecated)
-:page-source: components/camel-osgi-activator/src/main/docs/osgi-activator.adoc
-
-*Since Camel 3.1*
-
-A small OSGi activator for starting an OSGi Apache Camel Project.
-
-The bundle starts a shared CamelContext and registers any RouteBuilder instances
-(discovered via the OSGi Service Registry), from any other bundles that gets installed.
-And when the bundles gets uninstalled then the routes are stopped and removed from the shared CamelContext.
-
-== Important
-
-This OSGi activator is a based prototype for quickly starting up an OSGi container with a single shared
-CamelContext and then being able to use OSGi dynamism to deploy and undeploy bundlers with Camel routes.
-
-Beware that this OSGi activator is a basic implementation and has limited support for dealing with errors
-when new routes are added which may clash with existing routes (route ids).
-
-Configuration of the CamelContext is also very limited.
-
-Therefore only use this for prototyping and experiments. This is NOT recommended for production usage.
-
-== Install bundle
-
-Register an Apache Camel RouteBuilder as an OSGi service.
-
-Using OSGi annotations:
-
-[source,java]
-----
-@Component(service = RouteBuilder.class)
-public class MyRouteBuilder extends RouteBuilder {
-    @Override
-    public void configure() throws Exception {
-        from("timer:test?fixedRate=true&period=1000")
-            .log("Hello");
-    }
-}
-----
-
-Or Manually:
-
-[source,java]
-----
-public void start(BundleContext context) throws Exception {
-  context.registerService(RouteBuilder.class, new MyRouteBuilder(), null);
-}
-----
-
-And it's automatically added or removed to the context from any bundle!
-
-[source,text]
-----
-Route: route1 started and consuming from: timer://test?fixedRate=true&period=1000
-----
-
-For routes that need to be started before the CamelContext the "camel.osgi.activator.pre-startup" service property may be added.  
-
-[source,java]
-----
-@Component(service = RouteBuilder.class, property = {CamelRoutesActivatorConstants.PRE_START_UP_PROP_NAME + "=true"})
-public class MyStartupRouteBuilder extends RouteBuilder {
-    @Override
-    public void configure() throws Exception {
-        getContext().setStreamCaching(true);
-
-        restConfiguration().component("netty-http").port(8080);
-    }
-}
-----
-
-If this RouteBuilder is added after other non pre startup RouteBuilders then CamelContext will automatically restart.  This allows pre start up RouteBuilder to run their configure methods before other RouteBuilders.
diff --git a/components/camel-osgi-activator/src/main/java/org/apache/camel/osgi/activator/CamelRoutesActivator.java b/components/camel-osgi-activator/src/main/java/org/apache/camel/osgi/activator/CamelRoutesActivator.java
deleted file mode 100644
index 2b2160a..0000000
--- a/components/camel-osgi-activator/src/main/java/org/apache/camel/osgi/activator/CamelRoutesActivator.java
+++ /dev/null
@@ -1,181 +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.camel.osgi.activator;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.core.osgi.OsgiDefaultCamelContext;
-import org.apache.camel.model.ModelCamelContext;
-import org.apache.camel.model.RouteDefinition;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
-import org.osgi.util.tracker.ServiceTracker;
-import org.osgi.util.tracker.ServiceTrackerCustomizer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class CamelRoutesActivator implements BundleActivator, ServiceTrackerCustomizer<RouteBuilder, RouteBuilder> {
-
-    private static final Logger LOG = LoggerFactory.getLogger(CamelRoutesActivator.class);
-    private ServiceRegistration<CamelContext> camelContextRef;
-    private ModelCamelContext camelContext;
-    private BundleContext bundleContext;
-    private ServiceTracker<RouteBuilder, RouteBuilder> routeServiceTracker;
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public void start(BundleContext context) throws Exception {
-        this.bundleContext = context;
-        
-        this.camelContext = new OsgiDefaultCamelContext(this.bundleContext);
-        
-        camelContextRef = this.bundleContext.registerService(CamelContext.class, camelContext, null);
-        
-        camelContext.start();
-
-        this.routeServiceTracker = new ServiceTracker<RouteBuilder, RouteBuilder>(context, RouteBuilder.class, this);
-        
-        this.routeServiceTracker.open();
-
-        LOG.info("Camel OSGi Activator RouteBuilder ServiceTracker Tracker Open");
-    }
-
-    @Override
-    public RouteBuilder addingService(ServiceReference<RouteBuilder> reference) {
-        RouteBuilder builder = this.bundleContext.getService(reference);
-        if (isPreStartRouteBuilder(reference)) {
-            reloadTrackedServices(reference);
-        } else {
-            addRoute(builder);
-        }
-        return builder;
-    }
-    
-    @Override
-    public void stop(BundleContext context) throws Exception {
-        this.routeServiceTracker.close();
-        stopAndClearCamelRoutes();
-        this.bundleContext.ungetService(camelContextRef.getReference());
-    }
-    
-    @Override
-    public void modifiedService(ServiceReference<RouteBuilder> reference, RouteBuilder service) {
-        removedService(reference, service);
-        addingService(reference);
-    }
-
-    @Override
-    public void removedService(ServiceReference<RouteBuilder> reference, RouteBuilder service) {
-        if (isPreStartRouteBuilder(reference)) {
-            reloadTrackedServices();
-        } else {
-            removeRoute(service);
-        }
-    }
-    
-    private boolean isPreStartRouteBuilder(ServiceReference<RouteBuilder> reference) {
-        
-        boolean result = false;
-        
-        Object preStartProperty = reference.getProperty(CamelRoutesActivatorConstants.PRE_START_UP_PROP_NAME);
-        
-        if (preStartProperty instanceof Boolean) {
-            result = (Boolean)preStartProperty;
-        } else if (preStartProperty instanceof String) {
-            result = Boolean.parseBoolean((String) preStartProperty);
-        }
-                
-        return result;
-    }
-    
-    private void loadAndRestartCamelContext(List<ServiceReference<RouteBuilder>> existingRouteBuildersReferences) {
-        if (existingRouteBuildersReferences != null) {
-            List<RouteBuilder> postStartUpRoutes = new ArrayList<>();
-            for (ServiceReference<RouteBuilder> currentRouteBuilderReference : existingRouteBuildersReferences) {
-                RouteBuilder builder = this.bundleContext.getService(currentRouteBuilderReference);
-                if (isPreStartRouteBuilder(currentRouteBuilderReference)) {
-                    addRoute(builder);
-                } else {
-                    postStartUpRoutes.add(builder);
-                }
-            }
-            camelContext.start();
-            postStartUpRoutes.forEach(this::addRoute);
-        }
-    }
-    
-    private void reloadTrackedServices(ServiceReference<RouteBuilder> reference) {
-        LOG.info("Reload Camel Context Routes Triggered");
-        try {
-            synchronized (camelContext) {
-                stopAndClearCamelRoutes();
-                List<ServiceReference<RouteBuilder>> routeServiceReferenceArrayList = new ArrayList<>();
-                if (reference != null) {
-                    routeServiceReferenceArrayList.add(reference);
-                }
-                ServiceReference<RouteBuilder>[] existingTrackedRoutes = this.routeServiceTracker.getServiceReferences();
-                if (existingTrackedRoutes != null) {
-                    routeServiceReferenceArrayList.addAll(Arrays.asList(existingTrackedRoutes));
-                }
-                loadAndRestartCamelContext(routeServiceReferenceArrayList);
-            }
-        } catch (Exception e) {
-            LOG.error("Error Reloading Camel Context Routes", e);
-        }
-    }
-    
-    private void reloadTrackedServices() {
-        reloadTrackedServices(null);
-    }
-
-    private void addRoute(RouteBuilder builder) {
-        try {
-            // need to synchronize here since adding routes is not synchronized
-            synchronized (camelContext) {
-                this.camelContext.addRoutes(builder);
-                LOG.debug("Camel Routes from RouteBuilder Class {} Added to Camel OSGi Activator Context", builder.getClass().getName());
-            }
-        } catch (Exception e) {
-            LOG.error("Error Adding Camel RouteBuilder", e);
-        }
-    }
-
-    private void stopAndClearCamelRoutes() throws Exception {
-        camelContext.stop();
-        camelContext.removeRouteDefinitions(new ArrayList<RouteDefinition>(this.camelContext.getRouteDefinitions()));
-    }
-
-    private void removeRoute(RouteBuilder service) {
-        List<RouteDefinition> routesToBeRemoved = service.getRouteCollection().getRoutes();
-        try {
-            synchronized (camelContext) {
-                camelContext.removeRouteDefinitions(routesToBeRemoved);
-                LOG.debug("Camel Routes from RouteBuilder Class {} Removed from Camel OSGi Activator Context",
-                        service.getClass().getName());
-            }
-        } catch (Exception e) {
-            LOG.error("Error Removing Camel Route Builder", e);
-        }
-    }
-
-}
diff --git a/components/camel-osgi-activator/src/main/java/org/apache/camel/osgi/activator/CamelRoutesActivatorConstants.java b/components/camel-osgi-activator/src/main/java/org/apache/camel/osgi/activator/CamelRoutesActivatorConstants.java
deleted file mode 100644
index dc01581..0000000
--- a/components/camel-osgi-activator/src/main/java/org/apache/camel/osgi/activator/CamelRoutesActivatorConstants.java
+++ /dev/null
@@ -1,26 +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.camel.osgi.activator;
-
-public final class CamelRoutesActivatorConstants {
-
-    public static final String PRE_START_UP_PROP_NAME = "camel.osgi.activator.pre-startup";
-    
-    private CamelRoutesActivatorConstants() {
-        
-    }
-}
diff --git a/components/camel-osgi-activator/src/test/java/org/apache/camel/component/osgi/activator/CamelOsgiActivatorIT.java b/components/camel-osgi-activator/src/test/java/org/apache/camel/component/osgi/activator/CamelOsgiActivatorIT.java
deleted file mode 100644
index b2cac9b..0000000
--- a/components/camel-osgi-activator/src/test/java/org/apache/camel/component/osgi/activator/CamelOsgiActivatorIT.java
+++ /dev/null
@@ -1,226 +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.camel.component.osgi.activator;
-
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.Date;
-import java.util.Dictionary;
-import java.util.Hashtable;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import javax.inject.Inject;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.osgi.activator.CamelRoutesActivatorConstants;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.Configuration;
-import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.junit.PaxExam;
-import org.ops4j.pax.exam.karaf.container.internal.JavaVersionUtil;
-import org.ops4j.pax.exam.options.extra.VMOption;
-import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
-import org.ops4j.pax.exam.spi.reactors.PerClass;
-import org.ops4j.pax.tinybundles.core.TinyBundles;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceRegistration;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.ops4j.pax.exam.CoreOptions.junitBundles;
-import static org.ops4j.pax.exam.CoreOptions.options;
-import static org.ops4j.pax.exam.CoreOptions.streamBundle;
-import static org.ops4j.pax.exam.CoreOptions.when;
-
-@RunWith(PaxExam.class)
-@ExamReactorStrategy(PerClass.class)
-public class CamelOsgiActivatorIT {
-    @Inject
-    private BundleContext bc;
-
-    @Configuration
-    public Option[] configuration() throws IOException, URISyntaxException, ClassNotFoundException {
-        return options(
-                PaxExamOptions.KARAF.option(),
-                PaxExamOptions.CAMEL_CORE_OSGI.option(),
-                when(JavaVersionUtil.getMajorVersion() >= 16)
-                        .useOptions(
-                                new VMOption("--add-opens"),
-                                new VMOption("java.base/java.net=ALL-UNNAMED"),
-                                new VMOption("--add-opens"),
-                                new VMOption("java.base/sun.net.www.protocol.file=ALL-UNNAMED"),
-                                new VMOption("--add-opens"),
-                                new VMOption("java.base/sun.net.www.protocol.ftp=ALL-UNNAMED"),
-                                new VMOption("--add-opens"),
-                                new VMOption("java.base/sun.net.www.protocol.http=ALL-UNNAMED"),
-                                new VMOption("--add-opens"),
-                                new VMOption("java.base/sun.net.www.protocol.https=ALL-UNNAMED"),
-                                new VMOption("--add-opens"),
-                                new VMOption("java.base/sun.net.www.protocol.jar=ALL-UNNAMED"),
-                                new VMOption("--add-opens"),
-                                new VMOption("java.base/sun.net.www.protocol.jmod=ALL-UNNAMED"),
-                                new VMOption("--add-opens"),
-                                new VMOption("java.base/sun.net.www.protocol.mailto=ALL-UNNAMED"),
-                                new VMOption("--add-opens"),
-                                new VMOption("java.base/sun.net.www.protocol.jrt=ALL-UNNAMED"),
-                                new VMOption("--add-opens"),
-                                new VMOption("java.base/jdk.internal.loader=ALL-UNNAMED"),
-                                new VMOption("--add-opens"),
-                                new VMOption("java.base/java.security=ALL-UNNAMED")
-                        ),
-                streamBundle(
-                        TinyBundles.bundle()
-                            .read(
-                                Files.newInputStream(
-                                    Paths.get("target/test-bundles")
-                                        .resolve("camel-osgi-activator.jar")))
-                            .build()),
-                junitBundles());
-    }
-    
-    @Test
-    public void testBundleLoaded() throws Exception {
-        boolean hasOsgi = false;
-        boolean hasCamelCoreOsgiActivator = false;
-        for (Bundle b : bc.getBundles()) {
-            if ("org.apache.camel.karaf.camel-core-osgi".equals(b.getSymbolicName())) {
-                hasOsgi = true;
-                assertEquals("Camel Core OSGi not activated", Bundle.ACTIVE, b.getState());
-            }
-            
-            if ("org.apache.camel.karaf.camel-osgi-activator".equals(b.getSymbolicName())) {
-                hasCamelCoreOsgiActivator = true;
-                assertEquals("Camel OSGi Activator not activated", Bundle.ACTIVE, b.getState());
-            }
-        }
-        assertTrue("Camel Core OSGi bundle not found", hasOsgi);
-        assertTrue("Camel OSGi Activator bundle not found", hasCamelCoreOsgiActivator);
-    }
-
-    @Test
-    public void testRouteLoadAndRemoved() throws Exception {
-        CountDownLatch latch = new CountDownLatch(1);
-        ServiceRegistration<RouteBuilder> testServiceRegistration = bc.registerService(RouteBuilder.class,
-                new RouteBuilder() {
-
-                    @Override
-                    public void configure() throws Exception {
-                        from("timer:test?fixedRate=true&period=300").process(exchange -> {
-                            latch.countDown();
-                        });
-                    }
-                }, null);
-
-        latch.await(10, TimeUnit.SECONDS);
-
-        CamelContext camelContext = bc.getService(bc.getServiceReference(CamelContext.class));
-
-        assertEquals("There should be one route in the context.", 1, camelContext.getRoutes().size());
-
-        testServiceRegistration.unregister();
-
-        assertEquals("There should be no routes in the context.", 0, camelContext.getRoutes().size());
-
-    }
-    
-    @Test
-    public void testPreStartupLoadAndRemoved() throws Exception {
-        CountDownLatch preStartLatch = new CountDownLatch(1);
-        
-        CountDownLatch postStartLatch = new CountDownLatch(1);
-        
-        CamelContext camelContext = bc.getService(bc.getServiceReference(CamelContext.class));
-        
-        Date originalCamelStartTime = camelContext.getStartDate(); 
-        
-        ServiceRegistration<RouteBuilder> testRegularServiceRegistration = bc.registerService(RouteBuilder.class,
-                new RouteBuilder() {
-
-                    @Override
-                    public void configure() throws Exception {
-                        from("timer:test1?fixedRate=true&period=300")
-                            .description("PostStartRoute")
-                            .process(exchange -> {
-                                postStartLatch.countDown();
-                            });
-                    }
-                }, null);
-        
-        postStartLatch.await(10, TimeUnit.SECONDS);
-        
-        Date regularRouteAddCamelContextStartTime = camelContext.getStartDate();
-        
-        assertEquals("Camel Context Should NOT be restarted when removing regular RouteBuilder", originalCamelStartTime, regularRouteAddCamelContextStartTime);
-        
-        assertEquals("There should be one route in the context.", 1, camelContext.getRoutes().size());
-        
-        assertEquals("The PostStartRoute should be first.", "PostStartRoute", camelContext.getRoutes().get(0).getDescription());
-
-        
-        Dictionary<String, String> preStartUpProperties = new Hashtable<>();
-        preStartUpProperties.put(CamelRoutesActivatorConstants.PRE_START_UP_PROP_NAME, "true");
-        ServiceRegistration<RouteBuilder> testPreStartupServiceRegistration = bc.registerService(RouteBuilder.class, 
-                new RouteBuilder() {
-                    
-                    @Override
-                    public void configure() throws Exception {
-                        getContext().setStreamCaching(true);
-                        
-                        from("timer:test2?fixedRate=true&period=300")
-                            .description("PreStartRoute")
-                            .process(exchange -> {
-                                preStartLatch.countDown();
-                            });
-                        
-                    }
-                }, preStartUpProperties);
-
-        preStartLatch.await(10, TimeUnit.SECONDS);
-
-        Date preStartCamelContextStartTime = camelContext.getStartDate();
-        
-        assertTrue("Camel Context Should be restarted when adding startup RouteBuilder", preStartCamelContextStartTime.after(originalCamelStartTime));
-
-        assertEquals("There should be two route in the context.", 2, camelContext.getRoutes().size());
-        
-        assertEquals("The PreStartRoute should be first.", "PreStartRoute", camelContext.getRoutes().get(0).getDescription());
-
-        testPreStartupServiceRegistration.unregister();
-
-        Date preStartRemovedCamelContextStartTime = camelContext.getStartDate();
-        
-        assertEquals("There should be one routes in the context.", 1, camelContext.getRoutes().size());
-        
-        assertTrue("Camel Context Should be restarted when removing startup RouteBuilder", preStartRemovedCamelContextStartTime.after(preStartCamelContextStartTime));
-        
-        testRegularServiceRegistration.unregister();
-        
-        Date regularRouteRemovedCamelContextStartTime = camelContext.getStartDate();
-        
-        assertEquals("Camel Context Should NOT be restarted when removing regular RouteBuilder", preStartRemovedCamelContextStartTime, regularRouteRemovedCamelContextStartTime);
-
-        assertEquals("There should be no routes in the context.", 0, camelContext.getRoutes().size());
-
-    }
-
-}
diff --git a/components/camel-osgi-activator/src/test/java/org/apache/camel/component/osgi/activator/PaxExamOptions.java b/components/camel-osgi-activator/src/test/java/org/apache/camel/component/osgi/activator/PaxExamOptions.java
deleted file mode 100644
index c45f75a..0000000
--- a/components/camel-osgi-activator/src/test/java/org/apache/camel/component/osgi/activator/PaxExamOptions.java
+++ /dev/null
@@ -1,107 +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.camel.component.osgi.activator;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-
-import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.karaf.container.internal.JavaVersionUtil;
-import org.ops4j.pax.exam.karaf.options.LogLevelOption;
-import org.ops4j.pax.exam.options.DefaultCompositeOption;
-import org.ops4j.pax.exam.options.extra.VMOption;
-import org.ops4j.pax.tinybundles.core.TinyBundles;
-
-import static org.ops4j.pax.exam.CoreOptions.maven;
-import static org.ops4j.pax.exam.CoreOptions.streamBundle;
-import static org.ops4j.pax.exam.CoreOptions.when;
-import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.configureConsole;
-import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.karafDistributionConfiguration;
-import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.keepRuntimeFolder;
-import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.logLevel;
-
-public enum PaxExamOptions {
-    
-    KARAF(
-            karafDistributionConfiguration()
-                .frameworkUrl(
-                    maven()
-                        .groupId("org.apache.karaf")
-                        .artifactId("apache-karaf")
-                        .versionAsInProject()
-                        .type("zip"))
-                .name("Apache Karaf")
-                .useDeployFolder(false)
-                .unpackDirectory(new File("target/paxexam/unpack/")),
-            keepRuntimeFolder(),
-            // Don't bother with local console output as it just ends up cluttering the logs
-            configureConsole().ignoreLocalConsole(),
-            // Force the log level to INFO so we have more details during the test. It defaults to WARN.
-            logLevel(LogLevelOption.LogLevel.INFO),
-            when(JavaVersionUtil.getMajorVersion() >= 9)
-                .useOptions(
-                        new VMOption("-classpath"),
-                        new VMOption("lib/jdk9plus/*" + File.pathSeparator + "lib/boot/*")
-                        )
-        ),
-        CAMEL_CORE_OSGI(
-                createStreamBundleOption("camel-core-model.jar"),
-                createStreamBundleOption("camel-core-reifier.jar"),
-                createStreamBundleOption("camel-core-processor.jar"),
-                createStreamBundleOption("camel-core-engine.jar"),
-                createStreamBundleOption("camel-core-languages.jar"),
-                createStreamBundleOption("camel-api.jar"),
-                createStreamBundleOption("camel-base.jar"),
-                createStreamBundleOption("camel-base-engine.jar"),
-                createStreamBundleOption("camel-management-api.jar"),
-                createStreamBundleOption("camel-support.jar"),
-                createStreamBundleOption("camel-util.jar"),
-                createStreamBundleOption("camel-timer.jar"),
-                createStreamBundleOption("camel-log.jar"),
-                createStreamBundleOption("camel-core-osgi.jar")
-        );
-
-    private final Option[] options;
-
-    PaxExamOptions(Option... options) {
-        this.options = options;
-    }
-
-    public Option option() {
-        return new DefaultCompositeOption(options);
-    }
-    
-    public static Option createStreamBundleOption(String fileName) {
-        InputStream bundleInputStream = null;
-        try {
-            bundleInputStream = Files.newInputStream(
-                    Paths.get("target/test-bundles")
-                        .resolve(fileName));
-            
-        } catch (IOException e) {
-            throw new RuntimeException("Error resolving Bundle", e);
-        }
-        
-        return streamBundle(
-                    TinyBundles.bundle()
-                        .read(bundleInputStream)
-                        .build());
-    }
-}
diff --git a/components/pom.xml b/components/pom.xml
index 18e9fb3..885b312 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -43,7 +43,6 @@
         <module>camel-eventadmin</module>
         <module>camel-jcache-osgi</module>
         <module>camel-kura</module>
-        <module>camel-osgi-activator</module>
         <module>camel-paxlogging</module>
         <module>camel-servlet-osgi</module>
         <module>camel-test-karaf</module>
diff --git a/docs/modules/ROOT/pages/components.adoc b/docs/modules/ROOT/pages/components.adoc
index 09809ac..c902355 100644
--- a/docs/modules/ROOT/pages/components.adoc
+++ b/docs/modules/ROOT/pages/components.adoc
@@ -5,7 +5,7 @@
 == Camel Components
 
 // components: START
-Number of Camel components: 204 in 204 JAR artifacts (11 deprecated)
+Number of Camel components: 203 in 203 JAR artifacts (10 deprecated)
 
 [width="100%",cols="4,1,5",options="header"]
 |===
@@ -332,9 +332,6 @@
 | xref:next@components::kamelet-component.adoc[Kamelet] (camel-kamelet) +
 `kamelet:templateId/routeId` | 3.8 | To call Kamelets
 
-| xref:next@components::kamelet-reify-component.adoc[Kamelet Reify] (camel-kamelet-reify) +
-`kamelet-reify:delegateUri` | 3.6 | *deprecated* To call Kamelets (indirectly)
-
 | xref:next@components::kudu-component.adoc[Kudu] (camel-kudu) +
 `kudu:host:port/tableName` | 3.0 | Interact with Apache Kudu, a free and open source column-oriented data store of the Apache Hadoop ecosystem.
 
@@ -856,7 +853,7 @@
 == Miscellaneous Extensions
 
 // others: START
-Number of miscellaneous extensions: 20 in 20 JAR artifacts (5 deprecated)
+Number of miscellaneous extensions: 19 in 19 JAR artifacts (4 deprecated)
 
 [width="100%",cols="4,1,5",options="header"]
 |===
@@ -901,9 +898,6 @@
 | xref:next@components:others:opentracing.adoc[OpenTracing] +
 (camel-opentracing) | 2.19 | Distributed tracing using OpenTracing
 
-| xref:osgi-activator.adoc[Osgi Activator] +
-(camel-osgi-activator) | 3.1 | *deprecated* Camel OSGi Activator for running Camel routes from other bundles
-
 | xref:next@components:others:reactor.adoc[Reactor] +
 (camel-reactor) | 2.20 | Reactor based back-end for Camel's reactive streams component
 
diff --git a/docs/modules/ROOT/pages/osgi-activator.adoc b/docs/modules/ROOT/pages/osgi-activator.adoc
deleted file mode 100644
index 6546cb1..0000000
--- a/docs/modules/ROOT/pages/osgi-activator.adoc
+++ /dev/null
@@ -1,74 +0,0 @@
-[[OsgiActivator]]
-= OSGi Camel Routes Activator (deprecated)
-:page-source: components/camel-osgi-activator/src/main/docs/osgi-activator.adoc
-
-*Since Camel 3.1*
-
-A small OSGi activator for starting an OSGi Apache Camel Project.
-
-The bundle starts a shared CamelContext and registers any RouteBuilder instances
-(discovered via the OSGi Service Registry), from any other bundles that gets installed.
-And when the bundles gets uninstalled then the routes are stopped and removed from the shared CamelContext.
-
-== Important
-
-This OSGi activator is a based prototype for quickly starting up an OSGi container with a single shared
-CamelContext and then being able to use OSGi dynamism to deploy and undeploy bundlers with Camel routes.
-
-Beware that this OSGi activator is a basic implementation and has limited support for dealing with errors
-when new routes are added which may clash with existing routes (route ids).
-
-Configuration of the CamelContext is also very limited.
-
-Therefore only use this for prototyping and experiments. This is NOT recommended for production usage.
-
-== Install bundle
-
-Register an Apache Camel RouteBuilder as an OSGi service.
-
-Using OSGi annotations:
-
-[source,java]
-----
-@Component(service = RouteBuilder.class)
-public class MyRouteBuilder extends RouteBuilder {
-    @Override
-    public void configure() throws Exception {
-        from("timer:test?fixedRate=true&period=1000")
-            .log("Hello");
-    }
-}
-----
-
-Or Manually:
-
-[source,java]
-----
-public void start(BundleContext context) throws Exception {
-  context.registerService(RouteBuilder.class, new MyRouteBuilder(), null);
-}
-----
-
-And it's automatically added or removed to the context from any bundle!
-
-[source,text]
-----
-Route: route1 started and consuming from: timer://test?fixedRate=true&period=1000
-----
-
-For routes that need to be started before the CamelContext the "camel.osgi.activator.pre-startup" service property may be added.  
-
-[source,java]
-----
-@Component(service = RouteBuilder.class, property = {CamelRoutesActivatorConstants.PRE_START_UP_PROP_NAME + "=true"})
-public class MyStartupRouteBuilder extends RouteBuilder {
-    @Override
-    public void configure() throws Exception {
-        getContext().setStreamCaching(true);
-
-        restConfiguration().component("netty-http").port(8080);
-    }
-}
-----
-
-If this RouteBuilder is added after other non pre startup RouteBuilders then CamelContext will automatically restart.  This allows pre start up RouteBuilder to run their configure methods before other RouteBuilders.
diff --git a/pom.xml b/pom.xml
index ccf31ae..c4e95f2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -383,11 +383,6 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.camel.karaf</groupId>
-                <artifactId>camel-osgi-activator</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.camel.karaf</groupId>
                 <artifactId>camel-paxlogging</artifactId>
                 <version>${project.version}</version>
             </dependency>
diff --git a/tooling/camel-catalog-generator-karaf-maven-plugin/src/main/java/org/apache/camel/karaf/maven/PrepareCatalogKarafMojo.java b/tooling/camel-catalog-generator-karaf-maven-plugin/src/main/java/org/apache/camel/karaf/maven/PrepareCatalogKarafMojo.java
index 3a0d29b..2de9398 100644
--- a/tooling/camel-catalog-generator-karaf-maven-plugin/src/main/java/org/apache/camel/karaf/maven/PrepareCatalogKarafMojo.java
+++ b/tooling/camel-catalog-generator-karaf-maven-plugin/src/main/java/org/apache/camel/karaf/maven/PrepareCatalogKarafMojo.java
@@ -211,7 +211,6 @@
         // include others that are in camel-karaf only
         jsonFiles.add(new File(karafComponentsDir, "camel-blueprint/target/classes/blueprint.json"));
         jsonFiles.add(new File(karafComponentsDir, "camel-kura/target/classes/kura.json"));
-        jsonFiles.add(new File(karafComponentsDir, "camel-osgi-activator/target/classes/osgi-activator.json"));
         if (!jsonFiles.isEmpty()) {
             Path outDir = othersOutDir.toPath();
             copyFiles(outDir, jsonFiles);
