SLING-11590 Make compatible with m2e 2.x (#14)

Require at least Eclipse 2022-09
Update Eclipse plugins to Java 17
Update to Tycho 3.0.0
No longer generate p2 repo for plain OSGi bundles
Update to latest dependencies/parent poms
Require Java 11 for Shared and CLI
Rely on DS component description generation with tycho-ds-plugin
Remove dependency on OSGi EventHandler
diff --git a/.gitignore b/.gitignore
index 6cb7699..d139621 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,7 +3,10 @@
 .classpath
 .metadata
 .project
-.settings
+OSGI-INF
+**/.settings/*
+# include the PDE DS annotation settings until https://github.com/eclipse-m2e/m2e-core/pull/967 is released and prerequisite
+!**/.settings/org.eclipse.pde.ds.annotations.prefs
 .externalToolBuilders
 maven-eclipse.xml
 *.swp
@@ -16,3 +19,4 @@
 jcr.log
 atlassian-ide-plugin.xml
 derby.log
+bin
diff --git a/Jenkinsfile b/Jenkinsfile
index 8de6f29..ce88ca2 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -1,75 +1,71 @@
 import org.apache.sling.jenkins.SlingJenkinsHelper;
 
-def mvnVersion = 'Maven 3.3.9'
-def javaVersion = 'JDK 1.8 (latest)'
+def mvnVersion = 'maven_3_latest' // https://cwiki.apache.org/confluence/x/cRTiAw
+def javaVersion = 'jdk_17_latest' // https://cwiki.apache.org/confluence/x/kRLiAw
 
-node('ubuntu') {
-    def helper = new SlingJenkinsHelper()
-    helper.runWithErrorHandling({ jobConfig ->
-        parallel 'linux': generateStages('linux', mvnVersion, javaVersion),
-            'windows': generateStages('windows', mvnVersion, javaVersion)
-    })
-}
+def helper = new SlingJenkinsHelper()
+def jobConfig = [
+    jdks: [8],
+    upstreamProjects: [],
+    archivePatterns: [],
+    mavenGoal: '',
+    additionalMavenParams: '',
+    rebuildFrequency: '@weekly',
+    enabled: true,
+    emailRecipients: [],
+    sonarQubeEnabled: true,
+    sonarQubeUseAdditionalMavenParams: true,
+    sonarQubeAdditionalParams: ''
+]
+helper.runWithErrorHandling(jobConfig, {
+    parallel 'linux': generateStages('linux', mvnVersion, javaVersion),
+        'windows': generateStages('windows', mvnVersion, javaVersion)
+})
 
 // generates os-specific stages
 def generateStages(String os, def mvnVersion, def javaVersion) {
     def isWindows = os == "windows"
     def prefix = isWindows ? "win" : "linux"
+    def nodeName = isWindows ? "Windows" : "ubuntu"
 
     def stages = [
+        // use a local repository due to using version ranges in Tycho (https://github.com/eclipse-tycho/tycho/issues/1464)
+        // otherwise resolving metadata might fail as the global repo seems to have invalid metadata
         "[$prefix] Build shared code": {
-            withMaven(maven: mvnVersion, jdk: javaVersion, options: [artifactsPublisher(disabled: true)]) {
+            withMaven(maven: mvnVersion, jdk: javaVersion, mavenLocalRepo: '.repository', options: [artifactsPublisher(disabled: true)]) {
                 timeout(10) {
-                    runCmd "mvn -f shared/modules clean install"
+                    runCmd "mvn -f shared clean install"
                 }
             }
         }, "[$prefix] Build CLI bundles": {
-            withMaven(maven: mvnVersion, jdk: javaVersion, options: [artifactsPublisher(disabled: true)]) {
+            withMaven(maven: mvnVersion, jdk: javaVersion, mavenLocalRepo: '.repository', options: [artifactsPublisher(disabled: true)]) {
                 timeout(10) {
                     runCmd "mvn -f cli clean install"
                 }
             }
-        }, "[$prefix] Build shared code P2 repository": {
-            withMaven(maven: mvnVersion, jdk: javaVersion, options: [artifactsPublisher(disabled: true)]) {
-                timeout(10) {
-                    runCmd 'mvn -f shared/p2 clean package'
-                }
-            }
         }, "[$prefix] Build Eclipse plug-ins": {
-            withMaven(maven: mvnVersion, jdk: javaVersion, options: [artifactsPublisher(disabled: true)]) {
+            withMaven(maven: mvnVersion, jdk: javaVersion, mavenLocalRepo: '.repository', options: [artifactsPublisher(disabled: true)]) {
                 timeout(20) {
                     // workaround for https://issues.jenkins-ci.org/browse/JENKINS-39415
                     wrap([$class: 'Xvfb', autoDisplayName: true]) {
                         runCmd 'mvn -f eclipse clean verify'
                     }
                     // workaround for https://issues.jenkins-ci.org/browse/JENKINS-55889
-                    junit 'eclipse/**/surefire-reports/*.xml' 
-                    archiveArtifacts artifacts: 'eclipse/**/logs/*.log'
+                    junit(testResults: 'eclipse/**/surefire-reports/*.xml', allowEmptyResults: true)
+                    archiveArtifacts(artifacts: 'eclipse/**/logs/*.log', allowEmptyArchive: true)
                 }
             }
         }
     ]
 
-    // avoid wrapping Linux nodes again in node() context since that seems to make the 
-    // SCM checkout unavailable
-    if ( isWindows ) {
-        return {
-            node("Windows") {
-                checkout scm
-                stages.each { name, body ->
-                    stage(name) {
-                        body.call()
-                    }
-                }
-            }
-        }
-    }
-
     return {
-        stages.each { name, body ->
-            stage(name) {
-                body.call()
-            }
+    	node(nodeName) {
+    		checkout scm
+	        stages.each { name, body ->
+	            stage(name) {
+	                body.call()
+	            }
+	        }
         }
     }
 }
diff --git a/README.md b/README.md
index c40a52b..eab479c 100644
--- a/README.md
+++ b/README.md
@@ -11,16 +11,18 @@
 
 ## Repository structure
 
-The modules are split into two sub-trees
+The modules are split into distinct sub-trees
 
 * shared
+* cli
 * eclipse
 
 to ensure that the reusable code is available for usage in other IDEs or
 environments.
 
 The modules placed under `shared/modules` should bring as few external dependencies as
-possible, and must not depend on IDE-specific APIs, such as Eclipse or OSGi.
+possible, and must not depend on IDE-specific APIs, such as Eclipse or OSGi. However,
+all modules come with OSGi bundle headers and provide even some OSGi DS components.
 
 The modules placed under `eclipse` may depend on any Eclipse-specific APIs.
 
@@ -34,7 +36,7 @@
 Development Environment and Maven features installed. You should have
 previously built the projects using
 
-    ./build-eclipse.sh
+    ./build.sh
 
 to ensure that Maven artifacts which are not available on p2 update sites are
 included in the workspace.
@@ -59,3 +61,6 @@
 Now you can use the 'Sling IDE Tooling' launch configuration which is present 
 in the org.apache.sling.ide.target-definition project to launch a local instance
 of Eclipse with Sling IDE Tooling plug-ins picked up from the local workspace.
+
+Due to the unclear future of https://github.com/tesla/m2eclipse-tycho (compare with https://github.com/eclipse-m2e/m2e-core/issues/605)
+for the time being the pom.xml configuration is duplicated in the project settings (which is checked in)
diff --git a/build.sh b/build.sh
index 69deda1..0b56b1e 100755
--- a/build.sh
+++ b/build.sh
@@ -1,25 +1,21 @@
 #!/bin/sh -e
 
 build_all()  {
-    mvn -f shared/modules clean install
-    mvn -f cli clean install
-    mvn -f shared/p2 clean package
-    mvn -f eclipse clean verify
+    mvn -e -f shared clean install
+    mvn -e -f cli clean install
+    mvn -e -f eclipse clean verify
 
 }
 
-
-
 if [ $# -eq 1 ]; then
     case "$1" in
         eclipse)
-            mvn -f shared/modules clean install
-            mvn -f shared/p2 clean package
-            mvn -f eclipse clean verify
+            mvn -e -f shared clean install
+            mvn -e -f eclipse clean verify
             ;;
         cli)
-            mvn -f shared/modules clean install
-            mvn -f cli clean install
+            mvn -e -f shared clean install
+            mvn -e -f cli clean install
             ;;
         *)
             build_all
diff --git a/cli/cli/pom.xml b/cli/cli/pom.xml
index f6b83c0..ca32c61 100644
--- a/cli/cli/pom.xml
+++ b/cli/cli/pom.xml
@@ -16,10 +16,12 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.sling</groupId>
-        <artifactId>sling</artifactId>
-        <version>33</version>
+        <artifactId>sling-bundle-parent</artifactId>
+        <version>49</version>
+        <relativePath />
     </parent>
 
+	<groupId>org.apache.sling.ide</groupId>
     <artifactId>org.apache.sling.ide.cli</artifactId>
     <name>Apache Sling IDE Tools CLI</name>
     <version>1.2.3-SNAPSHOT</version>
@@ -30,15 +32,20 @@
         <url>https://gitbox.apache.org/repos/asf?p=sling-ide-tooling.git</url>
     </scm>
 
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>biz.aQute.bnd</groupId>
-                <artifactId>bnd-maven-plugin</artifactId>
-            </plugin>
-        </plugins>
+	<build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>biz.aQute.bnd</groupId>
+                    <artifactId>bnd-baseline-maven-plugin</artifactId>
+                    <configuration>
+                        <failOnMissing>false</failOnMissing><!-- no release yet -->
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
     </build>
-
+        
     <dependencies>
         <dependency>
             <groupId>org.osgi</groupId>
@@ -75,6 +82,7 @@
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
+            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.hamcrest</groupId>
@@ -82,7 +90,12 @@
             <version>1.3</version>
             <scope>test</scope>
         </dependency>
-
+		<dependency>
+		  	<groupId>org.apache.commons</groupId>
+		  	<artifactId>commons-lang3</artifactId>
+		  	<version>3.12.0</version>
+		  	<scope>test</scope>
+		</dependency>
         <!-- Note that OSGi annotations are OK since they are not retained at compile time -->        
         <dependency>
             <groupId>org.osgi</groupId>
@@ -100,8 +113,10 @@
             <scope>provided</scope>
         </dependency>
     </dependencies>
+
     <properties>
-        <sling.java.version>8</sling.java.version>
+        <sling.java.version>11</sling.java.version>
+        <minimalJavaBuildVersion>11</minimalJavaBuildVersion>
     </properties>
-    <groupId>org.apache.sling.ide</groupId>
+    
 </project>
diff --git a/cli/cli/src/main/java/org/apache/sling/ide/cli/impl/ContentSync.java b/cli/cli/src/main/java/org/apache/sling/ide/cli/impl/ContentSync.java
index dd33905..5daccfa 100644
--- a/cli/cli/src/main/java/org/apache/sling/ide/cli/impl/ContentSync.java
+++ b/cli/cli/src/main/java/org/apache/sling/ide/cli/impl/ContentSync.java
@@ -20,6 +20,7 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.net.URI;
 import java.nio.file.Path;
 import java.nio.file.StandardWatchEventKinds;
 
@@ -73,7 +74,7 @@
         
         logger.trace("Working on project {0} at {1}", prj.getName(), prj.getOSPath());
         
-        Repository repo = repoFactory.connectRepository(new RepositoryInfo(cfg.username(), cfg.password(), cfg.repositoryUrl()));
+        Repository repo = repoFactory.connectRepository(new RepositoryInfo(cfg.username(), cfg.password(), URI.create(cfg.repositoryUrl())));
         
         repo.newListChildrenNodeCommand("/").execute();
         
diff --git a/cli/cli/src/main/java/org/apache/sling/ide/cli/impl/DirWatcher.java b/cli/cli/src/main/java/org/apache/sling/ide/cli/impl/DirWatcher.java
index e5537f7..415f955 100644
--- a/cli/cli/src/main/java/org/apache/sling/ide/cli/impl/DirWatcher.java
+++ b/cli/cli/src/main/java/org/apache/sling/ide/cli/impl/DirWatcher.java
@@ -175,7 +175,7 @@
         
         @Override
         public String toString() {
-            return getClass().getSimpleName() + "[ kind: " + kind +", path: " + path + ", count: " + count +"]";
+            return getClass().getSimpleName() + " [kind: " + kind +", path: " + path + ", count: " + count +"]";
         }
     }
     
diff --git a/cli/cli/src/test/java/org/apache/sling/ide/cli/impl/DirWatcherTest.java b/cli/cli/src/test/java/org/apache/sling/ide/cli/impl/DirWatcherTest.java
index be17894..ba94696 100644
--- a/cli/cli/src/test/java/org/apache/sling/ide/cli/impl/DirWatcherTest.java
+++ b/cli/cli/src/test/java/org/apache/sling/ide/cli/impl/DirWatcherTest.java
@@ -20,12 +20,10 @@
 import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
 import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;
 import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;
-import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.greaterThanOrEqualTo;
-import static org.hamcrest.Matchers.not;
 import static org.junit.Assert.assertThat;
-import static org.junit.Assume.assumeThat;
+import static org.junit.Assume.assumeFalse;
 
 import java.io.File;
 import java.io.IOException;
@@ -35,6 +33,7 @@
 import java.util.List;
 import java.util.function.Consumer;
 
+import org.apache.commons.lang3.SystemUtils;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
@@ -45,8 +44,10 @@
     public TemporaryFolder folder = new TemporaryFolder();
     
     @Test(timeout = 3000)
+    
     public void addedFileInRoot() throws IOException, InterruptedException {
-        
+    	// TODO: does not work on Mac OS yet
+    	assumeFalse(SystemUtils.IS_OS_MAC);
         File watchRoot = folder.newFolder();
         
         try ( DirWatcher w = new DirWatcher(watchRoot.toPath()) ) {
@@ -65,7 +66,8 @@
     
     @Test(timeout = 3000)
     public void addedFileInSubdir() throws IOException, InterruptedException {
-        
+    	// TODO: does not work on Mac OS yet
+    	assumeFalse(SystemUtils.IS_OS_MAC);
         File watchRoot = folder.newFolder();
         File subDir = new File(watchRoot, "subDir");
         subDir.mkdir();
@@ -87,7 +89,8 @@
     
     @Test(timeout = 3000)
     public void addedFileInNewSubdir() throws IOException, InterruptedException {
-
+    	// TODO: does not work on Mac OS yet
+    	assumeFalse(SystemUtils.IS_OS_MAC);
         File watchRoot = folder.newFolder();
         
         try ( DirWatcher w = new DirWatcher(watchRoot.toPath()) ) {
@@ -113,8 +116,9 @@
     
     @Test(timeout = 3000)
     public void deletedFile() throws IOException, InterruptedException {
-        
-        assumeThat(System.getProperty("os.name"), not(containsString("Windows"))); // TODO - SLING-7596
+    	// TODO: does not work on Mac OS yet
+    	assumeFalse(SystemUtils.IS_OS_MAC);
+        assumeFalse(SystemUtils.IS_OS_WINDOWS); // TODO - SLING-7596
         
         File watchRoot = folder.newFolder();
         File subDir = new File(watchRoot, "subDir");
@@ -138,7 +142,9 @@
     
     @Test(timeout = 300000)
     public void deleteDir() throws IOException, InterruptedException {
-        
+    	// TODO: does not work on Mac OS yet
+    	assumeFalse(SystemUtils.IS_OS_MAC);
+
         File watchRoot = folder.newFolder();
         File subDir = new File(watchRoot, "subDir");
         subDir.mkdir();
@@ -159,7 +165,9 @@
 
     @Test(timeout = 3000)
     public void modifyFile() throws IOException, InterruptedException {
-        
+        // TODO: does not work on Mac OS yet
+    	assumeFalse(SystemUtils.IS_OS_MAC);
+    	
         File watchRoot = folder.newFolder();
         final File created = new File(watchRoot, "README");
         created.createNewFile();        
diff --git a/cli/pom.xml b/cli/pom.xml
index 46e7cfa..d261a82 100644
--- a/cli/pom.xml
+++ b/cli/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.apache</groupId>
         <artifactId>apache</artifactId>
-        <version>14</version>
+        <version>27</version>
     </parent>
     <groupId>org.apache.sling.ide</groupId>
     <artifactId>sling-ide-tooling-cli</artifactId>
diff --git a/eclipse/eclipse-core/.settings/org.eclipse.pde.ds.annotations.prefs b/eclipse/eclipse-core/.settings/org.eclipse.pde.ds.annotations.prefs
new file mode 100644
index 0000000..38f9eec
--- /dev/null
+++ b/eclipse/eclipse-core/.settings/org.eclipse.pde.ds.annotations.prefs
@@ -0,0 +1,7 @@
+dsVersion=V1_3
+eclipse.preferences.version=1
+enabled=true
+generateBundleActivationPolicyLazy=true
+path=OSGI-INF
+validationErrorLevel=error
+validationErrorLevel.missingImplicitUnbindMethod=error
diff --git a/eclipse/eclipse-core/META-INF/MANIFEST.MF b/eclipse/eclipse-core/META-INF/MANIFEST.MF
index 706d51c..3c1aef5 100644
--- a/eclipse/eclipse-core/META-INF/MANIFEST.MF
+++ b/eclipse/eclipse-core/META-INF/MANIFEST.MF
@@ -5,41 +5,31 @@
 Bundle-SymbolicName: org.apache.sling.ide.eclipse-core;singleton:=true
 Bundle-Version: 1.2.3.qualifier
 Bundle-Activator: org.apache.sling.ide.eclipse.core.internal.Activator
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.equinox.ds;bundle-version="1.2.1",
- org.eclipse.osgi.services;bundle-version="3.2.100",
- org.eclipse.core.resources,
- org.eclipse.ui,
- org.eclipse.jdt.debug
 Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Bundle-ClassPath: .
-Import-Package: org.apache.commons.httpclient;version="3.1.0",
- org.apache.commons.httpclient.auth;version="3.1.0",
- org.apache.commons.httpclient.methods;version="3.1.0",
- org.apache.commons.httpclient.params;version="3.1.0",
- org.apache.commons.io;version="2.0.1",
- org.apache.sling.ide.artifacts,
+Bundle-RequiredExecutionEnvironment: JavaSE-17
+Import-Package: org.apache.sling.ide.artifacts,
  org.apache.sling.ide.filter,
  org.apache.sling.ide.log,
  org.apache.sling.ide.osgi,
  org.apache.sling.ide.serialization,
  org.apache.sling.ide.sync.content,
  org.apache.sling.ide.transport,
- org.apache.sling.ide.util,
  org.eclipse.core.commands,
  org.eclipse.core.commands.operations,
  org.eclipse.core.expressions,
+ org.eclipse.core.internal.resources,
  org.eclipse.core.resources,
+ org.eclipse.core.runtime;version="3.7.0",
+ org.eclipse.core.runtime.jobs,
+ org.eclipse.core.runtime.preferences;version="3.5.0",
  org.eclipse.debug.core,
  org.eclipse.debug.core.model,
  org.eclipse.debug.core.sourcelookup,
- org.eclipse.debug.core.sourcelookup.containers,
  org.eclipse.jdt.core,
  org.eclipse.jdt.internal.launching,
  org.eclipse.jdt.launching,
- org.eclipse.jdt.launching.sourcelookup.containers,
  org.eclipse.osgi.service.debug;version="1.2.0",
+ org.eclipse.osgi.util;version="1.1.0",
  org.eclipse.wst.common.project.facet.core,
  org.eclipse.wst.server.core,
  org.eclipse.wst.server.core.model,
@@ -49,12 +39,21 @@
  org.eclipse.wst.validation.internal.provisional.core,
  org.eclipse.wst.xml.core.internal.validation.core,
  org.eclipse.wst.xml.core.internal.validation.eclipse,
- org.osgi.service.component;version="1.1.0"
+ org.osgi.framework;version="1.10.0",
+ org.osgi.framework.dto;version="1.8.0",
+ org.osgi.service.component;version="1.1.0",
+ org.osgi.service.component.runtime;version="1.5.0",
+ org.osgi.service.component.runtime.dto;version="1.5.0",
+ org.osgi.service.prefs;version="1.1.2",
+ org.osgi.util.tracker;version="1.5.3"
 Export-Package: org.apache.sling.ide.eclipse.core,
  org.apache.sling.ide.eclipse.core.facet,
  org.apache.sling.ide.eclipse.core.internal,
  org.apache.sling.ide.eclipse.core.launch,
+ org.apache.sling.ide.eclipse.core.logger,
  org.apache.sling.ide.eclipse.core.progress,
  org.apache.sling.ide.eclipse.internal.validation;x-friends:="org.apache.sling.ide.eclipse-test"
-Service-Component: OSGI-INF/TraceCommandExecutionEventsHandler.xml, OSGI-INF/Tracer.xml
 Provide-Capability: osgi.service;objectClass=org.apache.sling.ide.log.Logger
+Service-Component: OSGI-INF/org.apache.sling.ide.eclipse.core.debug.impl.Tracer.xml,
+ OSGI-INF/org.apache.sling.ide.eclipse.core.logger.CompositeLogger.xml,
+ OSGI-INF/org.apache.sling.ide.eclipse.core.logger.DefaultEclipseLogger.xml
diff --git a/eclipse/eclipse-core/META-INF/NOTICE b/eclipse/eclipse-core/META-INF/NOTICE
index 7cb7b33..ea12400 100644
--- a/eclipse/eclipse-core/META-INF/NOTICE
+++ b/eclipse/eclipse-core/META-INF/NOTICE
@@ -1,6 +1,6 @@
 
 Sling IDE Tools: Eclipse Core
-Copyright 2007-2014 The Apache Software Foundation
+Copyright 2007-2022 The Apache Software Foundation
 
 Apache Sling is based on source code originally developed 
 by Day Software (http://www.day.com/).
diff --git a/eclipse/eclipse-core/OSGI-INF/TraceCommandExecutionEventsHandler.xml b/eclipse/eclipse-core/OSGI-INF/TraceCommandExecutionEventsHandler.xml
deleted file mode 100644
index 6fa7bc3..0000000
--- a/eclipse/eclipse-core/OSGI-INF/TraceCommandExecutionEventsHandler.xml
+++ /dev/null
@@ -1,25 +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.
--->
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
-    <implementation class="org.apache.sling.ide.eclipse.core.debug.impl.TraceCommandExecutionEventsHandler" />
-    <reference bind="bindLogger" cardinality="1..1" interface="org.apache.sling.ide.log.Logger" name="Logger" policy="static" unbind="unbindLogger"/>
-    <service>
-        <provide interface="org.osgi.service.event.EventHandler" />
-    </service>
-    <property name="event.topics" value="org/apache/sling/ide/transport" />
-</scr:component>
diff --git a/eclipse/eclipse-core/OSGI-INF/Tracer.xml b/eclipse/eclipse-core/OSGI-INF/Tracer.xml
deleted file mode 100644
index 992b2f3..0000000
--- a/eclipse/eclipse-core/OSGI-INF/Tracer.xml
+++ /dev/null
@@ -1,24 +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.
--->
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.2.0">
-    <implementation class="org.apache.sling.ide.eclipse.core.debug.impl.Tracer" />
-    <service servicefactory="true">
-       <provide interface="org.apache.sling.ide.log.Logger"/>
-       <provide interface="org.eclipse.osgi.service.debug.DebugOptionsListener"/>
-    </service>
-</scr:component>
diff --git a/eclipse/eclipse-core/pom.xml b/eclipse/eclipse-core/pom.xml
index e000664..743adc6 100644
--- a/eclipse/eclipse-core/pom.xml
+++ b/eclipse/eclipse-core/pom.xml
@@ -55,7 +55,11 @@
                     <manifestFile>META-INF/MANIFEST.MF</manifestFile>
                 </archive>
             </configuration>
-        </plugin>        
+        </plugin>
+        <plugin>
+			<groupId>org.eclipse.tycho</groupId>
+			<artifactId>tycho-ds-plugin</artifactId>
+		</plugin>
     </plugins>
   </build>  
 </project>
diff --git a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/ExtendedServiceTracker.java b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/ExtendedServiceTracker.java
new file mode 100644
index 0000000..7581ba3
--- /dev/null
+++ b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/ExtendedServiceTracker.java
@@ -0,0 +1,123 @@
+/*
+ * 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.ide.eclipse.core;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.service.component.runtime.ServiceComponentRuntime;
+import org.osgi.service.component.runtime.dto.ComponentConfigurationDTO;
+import org.osgi.service.component.runtime.dto.ComponentDescriptionDTO;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * Provides some capabilities to better trace issues with services provided by DS components in case the service cannot be retrieved.
+ *
+ * @param <T> the tracked service class
+ */
+public class ExtendedServiceTracker<T> implements AutoCloseable {
+	
+	private final Class<T> trackedClass;
+	
+	private final ServiceTracker<T,T> serviceTracker;
+	
+	private final ServiceTracker<ServiceComponentRuntime, ServiceComponentRuntime> scrServiceTracker;
+	
+	
+	public ExtendedServiceTracker(BundleContext bundleContext, Class<T> trackedClass) {
+		this.trackedClass = trackedClass;
+		serviceTracker = new ServiceTracker<T, T>(bundleContext, trackedClass, null);
+		serviceTracker.open();
+		scrServiceTracker = new ServiceTracker<ServiceComponentRuntime, ServiceComponentRuntime>(bundleContext, ServiceComponentRuntime.class, null);
+		scrServiceTracker.open();
+	}
+
+	public Optional<T> getOptional() {
+		return Optional.ofNullable(serviceTracker.getService());
+	}
+
+    public T getNotNull() {
+        T service = serviceTracker.getService();
+        if (service == null) {
+        	ServiceComponentRuntime scr = scrServiceTracker.getService();
+        	if (scr == null) {
+        		throw new IllegalStateException("Could not get service of type " + trackedClass + " and 'ServiceComponentRuntime' is not available either for further debugging hints");
+        	}
+        	List<ComponentDescriptionDTO> components = getComponentDescriptionDTOs(scr, trackedClass);
+        	if (components.isEmpty()) {
+        		throw new IllegalStateException("Could not get service of type " + trackedClass + ". The providing bundle is probably not properly installed or was not started as no DS component was found providing that service interface");
+        	} else {
+        	    // only dump the first found component
+        		throw new IllegalStateException("Could not get service of type " + trackedClass + ": Providing " + getRelevantComponentInfo(scr, components.get(0))); 
+        	}
+        }	
+        return service;
+    }
+
+    static List<ComponentDescriptionDTO> getComponentDescriptionDTOs(ServiceComponentRuntime scr, Class<?> serviceInterface) {
+    	return scr.getComponentDescriptionDTOs().stream().filter(c -> Arrays.asList(c.serviceInterfaces).contains(serviceInterface.getName())).collect(Collectors.toList());
+    }
+
+    
+    public String getRelevantComponentInfo(ServiceComponentRuntime scr, ComponentDescriptionDTO component) {
+    	StringBuilder info = new StringBuilder("DS Component ").append(component.name).append(" from bundle ").append(component.bundle.symbolicName);
+    	Collection<ComponentConfigurationDTO> componentConfigurations = scr.getComponentConfigurationDTOs(component);
+    	if (componentConfigurations.isEmpty()) {
+    		info.append(" is not available"); // why?
+    	} else {
+    		for (ComponentConfigurationDTO componentConfiguration : componentConfigurations) {
+    			info.append(" has state \"").append(getState(componentConfiguration)).append("\"");
+    		}
+    	}
+    	return info.toString();
+    }
+
+    static String getState(ComponentConfigurationDTO componentConfiguration) {
+    	String state;
+    	switch(componentConfiguration.state) {
+    	case ComponentConfigurationDTO.UNSATISFIED_CONFIGURATION:
+    		state = "Unsatisfied configuration";
+    		break;
+    	case ComponentConfigurationDTO.UNSATISFIED_REFERENCE:
+    		state = "Unsatisfied reference(s): " + String.join(", ", Arrays.asList(componentConfiguration.unsatisfiedReferences.toString()));
+    		break;
+    	case ComponentConfigurationDTO.SATISFIED:
+    		state = "Satisfied";
+    		break;
+    	case ComponentConfigurationDTO.ACTIVE:
+    		state = "Active";
+    		break;
+    	case ComponentConfigurationDTO.FAILED_ACTIVATION:
+    		state = "Activate method failed: " + componentConfiguration.failure;
+    		break;
+        default:
+        	state = "Unknown state: " + componentConfiguration.state;
+    	}
+    	return state;
+    }
+
+	@Override
+	public void close() throws Exception {
+		serviceTracker.close();
+		scrServiceTracker.close();
+	}
+    
+}
diff --git a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/ServerUtil.java b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/ServerUtil.java
index 7688d57..f268b9e 100644
--- a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/ServerUtil.java
+++ b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/ServerUtil.java
@@ -171,7 +171,7 @@
         URI uri = new URI("http", null, server.getHost(), configuration.getPort(), configuration.getContextPath(),
                 null, null);
         return new RepositoryInfo(configuration.getUsername(),
-                configuration.getPassword(), uri.toString());
+                configuration.getPassword(), uri);
     }
 
     private ServerUtil() {
diff --git a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/debug/impl/TraceCommandExecutionEventsHandler.java b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/debug/impl/TraceCommandExecutionEventsHandler.java
deleted file mode 100644
index b4de82a..0000000
--- a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/debug/impl/TraceCommandExecutionEventsHandler.java
+++ /dev/null
@@ -1,69 +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.ide.eclipse.core.debug.impl;
-
-import java.text.DateFormat;
-import java.util.Date;
-
-import org.apache.sling.ide.log.Logger;
-import org.apache.sling.ide.transport.CommandExecutionProperties;
-import org.osgi.service.event.Event;
-import org.osgi.service.event.EventHandler;
-
-/**
- * The <tt>TraceCommandExecutionEventsHandler</tt> listens to events related to command execution and writes them using
- * the PluginLogger
- *
- */
-public class TraceCommandExecutionEventsHandler implements EventHandler {
-
-    private Logger logger;
-
-    @Override
-    public void handleEvent(Event event) {
-
-        Long start = (Long) event.getProperty(CommandExecutionProperties.TIMESTAMP_START);
-        Long end = (Long) event.getProperty(CommandExecutionProperties.TIMESTAMP_END);
-        String type = (String) event.getProperty(CommandExecutionProperties.ACTION_TYPE);
-        String flags = (String) event.getProperty(CommandExecutionProperties.ACTION_FLAGS);
-        String target = (String) event.getProperty(CommandExecutionProperties.ACTION_TARGET);
-        String result = (String) event.getProperty(CommandExecutionProperties.RESULT_TEXT);
-        Throwable t = (Throwable) event.getProperty(CommandExecutionProperties.RESULT_THROWABLE);
-
-        // TODO format copied from SlingConsoleEventListener
-        StringBuilder message = new StringBuilder();
-        DateFormat format = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
-        message.append("[").append(format.format(new Date(start))).append("] ").append(type);
-        if (flags != null && flags.length() > 0) {
-            message.append(" (").append(flags).append(")");
-        }
-        message.append(" -> ").append(target);
-        message.append(" : ").append(result).append(" (").append(end - start).append(" ms)");
-
-        logger.trace(message.toString(), t);
-    }
-
-    protected void bindLogger(Logger logger) {
-        this.logger = logger;
-    }
-
-    protected void unbindLogger(Logger logger) {
-        if (this.logger == logger)
-            this.logger = null;
-    }
-
-}
diff --git a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/debug/impl/Tracer.java b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/debug/impl/Tracer.java
index 60a255d..513a5e3 100644
--- a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/debug/impl/Tracer.java
+++ b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/debug/impl/Tracer.java
@@ -18,120 +18,53 @@
 
 import java.util.Date;
 
-import org.apache.sling.ide.log.Logger;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
+import org.apache.sling.ide.eclipse.core.logger.LogSubscriber;
 import org.eclipse.osgi.service.debug.DebugOptions;
 import org.eclipse.osgi.service.debug.DebugOptionsListener;
 import org.eclipse.osgi.service.debug.DebugTrace;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.Bundle;
-import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Component;
 
 /**
- * The <tt>Tracer</tt> is the default implementation of the <tt>Logger</tt>
+ * The <tt>Tracer</tt> is the default implementation of the <tt>Logger</tt>.
+ * 
  */
-public class Tracer implements DebugOptionsListener, Logger {
+@Component(property = DebugOptions.LISTENER_SYMBOLICNAME + "="
+		+ Tracer.BUNDLE_SYMBOLIC_NAME)
+public class Tracer implements DebugOptionsListener, LogSubscriber {
 
-    private static final long PERF_IGNORE_THRESHOLD = 50;
-
-    private Bundle bundle;
+	protected static final String BUNDLE_SYMBOLIC_NAME = "org.apache.sling.ide.eclipse-core";
     private boolean debugEnabled;
     private boolean consoleEnabled;
     private boolean performanceEnabled;
     private DebugTrace trace;
-    
-    protected void activate(ComponentContext ctx) {
-        bundle = ctx.getUsingBundle();
-    }
 
     @Override
     public void optionsChanged(DebugOptions options) {
-    	
-        String pluginId = bundle.getSymbolicName();
-
-        debugEnabled = options.getBooleanOption(pluginId + "/debug", false);
-        consoleEnabled = options.getBooleanOption(pluginId + "/debug/console", false) && debugEnabled;
-        performanceEnabled = options.getBooleanOption(pluginId + "/debug/performance", false) && debugEnabled;
-        trace = options.newDebugTrace(pluginId, getClass());
+        debugEnabled = options.getBooleanOption(BUNDLE_SYMBOLIC_NAME + "/debug", false);
+        consoleEnabled = options.getBooleanOption(BUNDLE_SYMBOLIC_NAME + "/debug/console", false) && debugEnabled;
+        performanceEnabled = options.getBooleanOption(BUNDLE_SYMBOLIC_NAME + "/debug/performance", false) && debugEnabled;
+        trace = options.newDebugTrace(BUNDLE_SYMBOLIC_NAME, getClass());
     }
     
-    @Override
-    public void trace(String message, Object... arguments) {
-
-        if (!debugEnabled)
-            return;
-
-    	if ( arguments.length > 0 )
-    		message = NLS.bind(message, arguments);
-    	
-    	trace.trace("/debug", message);
-
-        if (consoleEnabled)
-            writeToConsole(message, null);
-    }
-
-    private void writeToConsole(String message, Throwable t) {
-
+    private void writeToStdOut(String message, Throwable t) {
         System.out.println("[" + Thread.currentThread().getName() + "] " + new Date() + " "
-                + bundle.getSymbolicName() + " : " + message);
+                + " : " + message);
         if (t != null)
             t.printStackTrace(System.out);
     }
 
-    @Override
-    public void trace(String message, Throwable error) {
-        if (!debugEnabled)
-            return;
+	@Override
+	public void log(Severity severity, String message, Throwable t) {
+		if (!debugEnabled) {
+			return;
+		}
+		if (consoleEnabled && severity == Severity.TRACE) {
+			trace.trace("/debug", message);
+			writeToStdOut(message, t);
+		} else if (performanceEnabled && severity == Severity.TRACE) {
+			trace.trace("/debug/performance", message);
+			writeToStdOut(message, t);
+		}
+	}
 
-        trace.trace("/debug", message, error);
-
-        if (consoleEnabled)
-            writeToConsole(message, error);
-    }
-
-    @Override
-    public void warn(String message) {
-        logInternal(IStatus.WARNING, message, null);
-    }
-
-    @Override
-    public void warn(String message, Throwable cause) {
-        logInternal(IStatus.WARNING, message, cause);
-    }
-
-    @Override
-    public void error(String message) {
-        logInternal(IStatus.ERROR, message, null);
-    }
-
-    @Override
-    public void error(String message, Throwable cause) {
-        logInternal(IStatus.ERROR, message, cause);
-    }
-
-    @Override
-    public void tracePerformance(String message, long duration, Object... arguments) {
-        if (!performanceEnabled)
-            return;
-
-        if (duration < PERF_IGNORE_THRESHOLD) {
-            return;
-        }
-
-        if (arguments.length > 0)
-            message = NLS.bind(message, arguments);
-
-        String fullMessage = message + " took " + duration + " ms";
-
-        trace.trace("/debug/performance", fullMessage);
-
-        if (consoleEnabled)
-            writeToConsole(fullMessage, null);
-    }
-
-    private void logInternal(int statusCode, String message, Throwable cause) {
-        Platform.getLog(bundle).log(new Status(statusCode, bundle.getSymbolicName(), message, cause));
-    }
 }
diff --git a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/Activator.java b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/Activator.java
index 05b809f..02ecf04 100644
--- a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/Activator.java
+++ b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/Activator.java
@@ -16,12 +16,11 @@
  */
 package org.apache.sling.ide.eclipse.core.internal;
 
-import java.util.HashMap;
-import java.util.Map;
+import java.util.Optional;
 
 import org.apache.sling.ide.artifacts.EmbeddedArtifactLocator;
+import org.apache.sling.ide.eclipse.core.ExtendedServiceTracker;
 import org.apache.sling.ide.eclipse.core.Preferences;
-import org.apache.sling.ide.eclipse.core.ServiceUtil;
 import org.apache.sling.ide.eclipse.core.launch.SourceReferenceResolver;
 import org.apache.sling.ide.filter.FilterLocator;
 import org.apache.sling.ide.log.Logger;
@@ -29,13 +28,10 @@
 import org.apache.sling.ide.serialization.SerializationManager;
 import org.apache.sling.ide.sync.content.SyncCommandFactory;
 import org.apache.sling.ide.transport.BatcherFactory;
-import org.apache.sling.ide.transport.CommandExecutionProperties;
 import org.apache.sling.ide.transport.RepositoryFactory;
 import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
-import org.osgi.service.event.Event;
-import org.osgi.service.event.EventAdmin;
-import org.osgi.util.tracker.ServiceTracker;
 
 /**
  * The activator class controls the plug-in life cycle
@@ -53,54 +49,52 @@
 	// The shared instance
 	private static Activator plugin;
 
-    private ServiceTracker<EventAdmin, EventAdmin> eventAdmin;
-    private ServiceTracker<RepositoryFactory, RepositoryFactory> repositoryFactory;
-    private ServiceTracker<SerializationManager, SerializationManager> serializationManager;
-    private ServiceTracker<FilterLocator, FilterLocator> filterLocator;
-    private ServiceTracker<OsgiClientFactory, OsgiClientFactory> osgiClientFactory;
-    private ServiceTracker<EmbeddedArtifactLocator, EmbeddedArtifactLocator> artifactLocator;
-    private ServiceTracker<Logger, Logger> tracer;
-    private ServiceTracker<BatcherFactory, BatcherFactory> batcherFactoryLocator;
-    private ServiceTracker<SourceReferenceResolver, Object> sourceReferenceLocator;
-    private ServiceTracker<SyncCommandFactory, SyncCommandFactory> commandFactory;
+    private ExtendedServiceTracker<RepositoryFactory> repositoryFactory;
+    private ExtendedServiceTracker<SerializationManager> serializationManager;
+    private ExtendedServiceTracker<FilterLocator> filterLocator;
+    private ExtendedServiceTracker<OsgiClientFactory> osgiClientFactory;
+    private ExtendedServiceTracker<EmbeddedArtifactLocator> artifactLocator;
+    private ExtendedServiceTracker<Logger> tracer;
+    private ExtendedServiceTracker<BatcherFactory> batcherFactoryLocator;
+    private ExtendedServiceTracker<SourceReferenceResolver> sourceReferenceLocator;
+    private ExtendedServiceTracker<SyncCommandFactory> commandFactory;
     
     private Preferences preferences;
+    
+    public static final String BSN_VAULT_IMPL = "org.apache.sling.ide.impl-vlt";
+    public static final String BSN_API = "org.apache.sling.ide.api";
+    public static final String BSN_ARTIFACTS = "org.apache.sling.ide.artifacts";
 
 	public void start(BundleContext context) throws Exception {
 		super.start(context);
 		plugin = this;
 		
-        eventAdmin = new ServiceTracker<>(context, EventAdmin.class, null);
-        eventAdmin.open();
+		// the following bundles need to be explicitly started as no class is directly referenced
+		// and everything works via declarative services
+		// compare with https://github.com/eclipse-m2e/m2e-core/issues/945
+		getFirstBundle(context, BSN_API).start();
+		getFirstBundle(context, BSN_VAULT_IMPL).start();
+		getFirstBundle(context, BSN_ARTIFACTS).start();
+		
+        repositoryFactory = new ExtendedServiceTracker<>(context, RepositoryFactory.class);
+        serializationManager = new ExtendedServiceTracker<>(context, SerializationManager.class);
+        filterLocator = new ExtendedServiceTracker<>(context, FilterLocator.class);
+        osgiClientFactory = new ExtendedServiceTracker<>(context, OsgiClientFactory.class);
+        artifactLocator = new ExtendedServiceTracker<>(context, EmbeddedArtifactLocator.class);
+        tracer = new ExtendedServiceTracker<>(context, Logger.class);
+        batcherFactoryLocator = new ExtendedServiceTracker<>(context, BatcherFactory.class);
+        sourceReferenceLocator = new ExtendedServiceTracker<>(context, SourceReferenceResolver.class);
+        commandFactory = new ExtendedServiceTracker<>(context, SyncCommandFactory.class);
+	}
 
-        repositoryFactory = new ServiceTracker<>(context, RepositoryFactory.class,
-                null);
-        repositoryFactory.open();
-
-        serializationManager = new ServiceTracker<>(context, SerializationManager.class, null);
-        serializationManager.open();
-
-        filterLocator = new ServiceTracker<>(context, FilterLocator.class, null);
-        filterLocator.open();
-
-        osgiClientFactory = new ServiceTracker<>(context, OsgiClientFactory.class,
-                null);
-        osgiClientFactory.open();
-
-        artifactLocator = new ServiceTracker<>(context, EmbeddedArtifactLocator.class, null);
-        artifactLocator.open();
-
-        tracer = new ServiceTracker<>(context, Logger.class, null);
-        tracer.open();
-        
-        batcherFactoryLocator = new ServiceTracker<>(context, BatcherFactory.class, null);
-        batcherFactoryLocator.open();
-        
-        sourceReferenceLocator = new ServiceTracker<>(context, SourceReferenceResolver.class, null);
-        sourceReferenceLocator.open();
-        
-        commandFactory = new ServiceTracker<>(context, SyncCommandFactory.class, null);
-        commandFactory.open();
+	static Bundle getFirstBundle(BundleContext bundleContext, String bundleSymbolicName)
+	{
+		for (Bundle bundle : bundleContext.getBundles()) {
+			if (bundleSymbolicName.equals(bundle.getSymbolicName())) {
+				return bundle;
+			}
+		}
+		throw new IllegalStateException("Bundle with Bundle-SymbolicName '" + bundleSymbolicName + "' could not be found. Something went wrong during installation");
 	}
 
 	/*
@@ -133,63 +127,42 @@
 	}
 
     public RepositoryFactory getRepositoryFactory() {
-
-        return ServiceUtil.getNotNull(repositoryFactory);
+        return repositoryFactory.getNotNull();
 	}
 
     public SerializationManager getSerializationManager() {
-        return ServiceUtil.getNotNull(serializationManager);
+        return serializationManager.getNotNull();
     }
 
     public FilterLocator getFilterLocator() {
-        return ServiceUtil.getNotNull(filterLocator);
+        return filterLocator.getNotNull();
     }
 
     public OsgiClientFactory getOsgiClientFactory() {
-        return ServiceUtil.getNotNull(osgiClientFactory);
+        return osgiClientFactory.getNotNull();
     }
 
     public EmbeddedArtifactLocator getArtifactLocator() {
-
-        return ServiceUtil.getNotNull(artifactLocator);
+        return artifactLocator.getNotNull();
     }
 
     public Logger getPluginLogger() {
-        return (Logger) ServiceUtil.getNotNull(tracer);
+        return tracer.getNotNull();
     }
     
     public BatcherFactory getBatcherFactory() {
-        return (BatcherFactory) ServiceUtil.getNotNull(batcherFactoryLocator);
+        return batcherFactoryLocator.getNotNull();
     }
     
     public SyncCommandFactory getCommandFactory() {
-        return ServiceUtil.getNotNull(commandFactory);
-    }
-    
-    /**
-     * @deprecated This should not be used directly to communicate with the client . There is no direct replacement
-     */
-    @Deprecated
-    public void issueConsoleLog(String actionType, String path, String message) {
-        Map<String, Object> props = new HashMap<>();
-        props.put(CommandExecutionProperties.RESULT_TEXT, message);
-        props.put(CommandExecutionProperties.ACTION_TYPE, actionType);
-        props.put(CommandExecutionProperties.ACTION_TARGET, path);
-        props.put(CommandExecutionProperties.TIMESTAMP_START, System.currentTimeMillis());
-        props.put(CommandExecutionProperties.TIMESTAMP_END, System.currentTimeMillis());
-        Event event = new Event(CommandExecutionProperties.REPOSITORY_TOPIC, props);
-        getEventAdmin().postEvent(event);
-    }
-    
-    public EventAdmin getEventAdmin() {
-        return (EventAdmin) ServiceUtil.getNotNull(eventAdmin);
+        return commandFactory.getNotNull();
     }
     
     /**
      * @return the source reference resolver, possibly null
      */
-    public SourceReferenceResolver getSourceReferenceResolver() {
-        return (SourceReferenceResolver) sourceReferenceLocator.getService();
+    public Optional<SourceReferenceResolver> getSourceReferenceResolver() {
+        return sourceReferenceLocator.getOptional();
     }
     
     public Preferences getPreferences() {
diff --git a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/JVMDebuggerConnection.java b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/JVMDebuggerConnection.java
index fc25de2..7ccddd0 100644
--- a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/JVMDebuggerConnection.java
+++ b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/JVMDebuggerConnection.java
@@ -20,6 +20,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 import org.apache.sling.ide.eclipse.core.ISlingLaunchpadConfiguration;
 import org.apache.sling.ide.eclipse.core.ISlingLaunchpadServer;
@@ -114,15 +115,15 @@
         
         int workTicksForReferences = 24; // 30 - 5 - 1
         
-        SourceReferenceResolver resolver = Activator.getDefault().getSourceReferenceResolver();
-        if ( resolver != null  && configuration.resolveSourcesInDebugMode()) {
+        Optional<SourceReferenceResolver> resolver = Activator.getDefault().getSourceReferenceResolver();
+        if ( resolver.isPresent()  && configuration.resolveSourcesInDebugMode()) {
             try {
                 List<SourceReference> references = osgiClient.findSourceReferences();
                 SubMonitor subMonitor = SubMonitor.convert(monitor, "Resolving source references", workTicksForReferences).setWorkRemaining(references.size());
                 for ( SourceReference reference :  references ) {
                     try {
                         subMonitor.setTaskName("Resolving source reference: " + reference);
-                        IRuntimeClasspathEntry classpathEntry = resolver.resolve(reference);
+                        IRuntimeClasspathEntry classpathEntry = resolver.get().resolve(reference);
                         if ( classpathEntry != null ) {
                             classpathEntries.add(classpathEntry);
                         }
diff --git a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java
index df3c2c4..81dd892 100644
--- a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java
+++ b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadBehaviour.java
@@ -92,11 +92,10 @@
         
         Repository repository;
         RepositoryInfo repositoryInfo;
-        OsgiClient client;
         try {
             repository = ServerUtil.connectRepository(getServer(), monitor);
             repositoryInfo = ServerUtil.getRepositoryInfo(getServer(), monitor);
-            client = Activator.getDefault().getOsgiClientFactory().createOsgiClient(repositoryInfo);
+            
         } catch (CoreException e) {
             setServerState(IServer.STATE_STOPPED);
             throw e;
@@ -104,52 +103,55 @@
             setServerState(IServer.STATE_STOPPED);
             throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e));
         }
-
         monitor.worked(10); // 10/50 done
+        try (OsgiClient client = Activator.getDefault().getOsgiClientFactory().createOsgiClient(repositoryInfo)) {
         
-        try {
-            EmbeddedArtifactLocator artifactLocator = Activator.getDefault().getArtifactLocator();
-
-            installBundle(monitor,client, artifactLocator.loadSourceSupportBundle(), SUPPORT_SOURCE_BUNDLE_SYMBOLIC_NAME); // 15/50 done
-            installBundle(monitor,client, artifactLocator.loadToolingSupportBundle(), SUPPORT_BUNDLE_SYMBOLIC_NAME); // 20/50 done
-            
-        } catch ( IOException | OsgiClientException e) {
-            Activator.getDefault().getPluginLogger()
-                .warn("Failed reading the installation support bundle", e);
-        }
-        
-        try {
-            if (getServer().getMode().equals(ILaunchManager.DEBUG_MODE)) {
-                debuggerConnection = new JVMDebuggerConnection(client);
-                
-                success = debuggerConnection.connectInDebugMode(launch, getServer(), SubMonitor.convert(monitor, 30));
-
-                // 50/50 done
-
-            } else {
-                
-                Command<ResourceProxy> command = repository.newListChildrenNodeCommand("/");
-                result = command.execute();
-                success = result.isSuccess();
-                
-                monitor.worked(30); // 50/50 done
-                
-            }
-
-            if (success) {
-                setServerState(IServer.STATE_STARTED);
-            } else {
-                setServerState(IServer.STATE_STOPPED);
-                String message = "Unable to connect to the Server. Please make sure a server instance is running ";
-                if (result != null) {
-                    message += " (" + result.toString() + ")";
-                }
-                throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, message));
-            }
-        } catch ( CoreException | RuntimeException e ) {
-            setServerState(IServer.STATE_STOPPED);
-            throw e;
-        } finally {
+	        try {
+	            EmbeddedArtifactLocator artifactLocator = Activator.getDefault().getArtifactLocator();
+	
+	            installBundle(monitor,client, artifactLocator.loadSourceSupportBundle(), SUPPORT_SOURCE_BUNDLE_SYMBOLIC_NAME); // 15/50 done
+	            installBundle(monitor,client, artifactLocator.loadToolingSupportBundle(), SUPPORT_BUNDLE_SYMBOLIC_NAME); // 20/50 done
+	            
+	        } catch ( IOException | OsgiClientException e) {
+	            Activator.getDefault().getPluginLogger()
+	                .warn("Failed reading the installation support bundle", e);
+	        }
+	        
+	        try {
+	            if (getServer().getMode().equals(ILaunchManager.DEBUG_MODE)) {
+	                debuggerConnection = new JVMDebuggerConnection(client);
+	                
+	                success = debuggerConnection.connectInDebugMode(launch, getServer(), SubMonitor.convert(monitor, 30));
+	
+	                // 50/50 done
+	
+	            } else {
+	                
+	                Command<ResourceProxy> command = repository.newListChildrenNodeCommand("/");
+	                result = command.execute();
+	                success = result.isSuccess();
+	                
+	                monitor.worked(30); // 50/50 done
+	                
+	            }
+	
+	            if (success) {
+	                setServerState(IServer.STATE_STARTED);
+	            } else {
+	                setServerState(IServer.STATE_STOPPED);
+	                String message = "Unable to connect to the Server. Please make sure a server instance is running ";
+	                if (result != null) {
+	                    message += " (" + result.toString() + ")";
+	                }
+	                throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, message));
+	            }
+	        } catch ( CoreException | RuntimeException e ) {
+	            setServerState(IServer.STATE_STOPPED);
+	            throw e;
+	        }
+        } catch (IOException e1) {
+        	throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Error closing OSGi client", e1));
+		} finally {
             monitor.done();
         }
     }
@@ -325,9 +327,8 @@
         boolean installLocally = getServer().getAttribute(ISlingLaunchpadServer.PROP_INSTALL_LOCALLY, true);
 		monitor.beginTask("deploying via local install", 5);
 
-        try {
-            OsgiClient osgiClient = Activator.getDefault().getOsgiClientFactory()
-                    .createOsgiClient(ServerUtil.getRepositoryInfo(getServer(), monitor));
+        try (OsgiClient osgiClient = Activator.getDefault().getOsgiClientFactory()
+                .createOsgiClient(ServerUtil.getRepositoryInfo(getServer(), monitor))) {
 
             Version supportBundleVersion = osgiClient
                     .getBundleVersion(EmbeddedArtifactLocator.SUPPORT_BUNDLE_SYMBOLIC_NAME);
@@ -345,7 +346,6 @@
             IResource manifest = outputFolder.findMember("META-INF/MANIFEST.MF");
             if (manifest==null) {
                 Activator.getDefault().getPluginLogger().warn("Project "+project+" does not have a META-INF/MANIFEST.MF (yet) - not publishing this time");
-                Activator.getDefault().issueConsoleLog("InstallBundle", outputFolder.getLocation().toOSString(), "Project "+project+" does not have a META-INF/MANIFEST.MF (yet) - not publishing this time");
                 monitor.done();
                 setModulePublishState(module, IServer.PUBLISH_STATE_FULL);
                 return;
@@ -356,7 +356,7 @@
             //TODO SLING-3767:
             //osgiClient must have a timeout!!!
             if ( installLocally ) {
-                osgiClient.installLocalBundle(outputLocation.toOSString());
+                osgiClient.installLocalBundle(outputLocation.toFile().toPath());
                 monitor.worked(3);
             } else {
 
@@ -370,12 +370,12 @@
 
             setModulePublishState(module, IServer.PUBLISH_STATE_NONE);
 
-        } catch (URISyntaxException e1) {
+        } catch (IOException|URISyntaxException e1) {
             throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, e1.getMessage(), e1));
         } catch (OsgiClientException e1) {
             throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Failed installing bundle : "
                     + e1.getMessage(), e1));
-        } finally {
+		} finally {
             monitor.done();
         }
 	}
diff --git a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/logger/CompositeLogger.java b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/logger/CompositeLogger.java
new file mode 100644
index 0000000..f53ca8d
--- /dev/null
+++ b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/logger/CompositeLogger.java
@@ -0,0 +1,91 @@
+/*
+ * 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.ide.eclipse.core.logger;
+
+import java.util.List;
+
+import org.apache.sling.ide.log.Logger;
+import org.eclipse.osgi.util.NLS;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicyOption;
+
+@Component
+public class CompositeLogger implements Logger {
+
+	private static final long PERF_IGNORE_THRESHOLD = 50;
+
+	@Reference(policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.AT_LEAST_ONE)
+	List<LogSubscriber> logSubscribers;
+
+	@Override
+	public void trace(String message, Object... arguments) {
+		if (arguments.length > 0) {
+			message = NLS.bind(message, arguments);
+		}
+		logInternal(LogSubscriber.Severity.TRACE, message);
+	}
+
+	@Override
+	public void trace(String message, Throwable error) {
+		logInternal(LogSubscriber.Severity.TRACE, message, error);
+	}
+
+	@Override
+	public void warn(String message) {
+		logInternal(LogSubscriber.Severity.WARNING, message);
+	}
+
+	@Override
+	public void warn(String message, Throwable cause) {
+		logInternal(LogSubscriber.Severity.WARNING, message, cause);
+	}
+
+	@Override
+	public void error(String message) {
+		logInternal(LogSubscriber.Severity.ERROR, message);
+	}
+
+	@Override
+	public void error(String message, Throwable cause) {
+		logInternal(LogSubscriber.Severity.ERROR, message, cause);
+	}
+
+	@Override
+	public void tracePerformance(String message, long duration, Object... arguments) {
+		if (duration < PERF_IGNORE_THRESHOLD) {
+			return;
+		}
+
+		if (arguments.length > 0) {
+			message = NLS.bind(message, arguments);
+		}
+		String fullMessage = message + " took " + duration + " ms";
+		logInternal(LogSubscriber.Severity.TRACE_PERFORMANCE, fullMessage);
+	}
+
+	private void logInternal(LogSubscriber.Severity severity, String message) {
+		logInternal(severity, message, null);
+	}
+
+	private void logInternal(LogSubscriber.Severity severity, String message, Throwable cause) {
+		for (LogSubscriber logSubscriber : logSubscribers) {
+			logSubscriber.log(severity, message, cause);
+		}
+	}
+}
diff --git a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/logger/DefaultEclipseLogger.java b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/logger/DefaultEclipseLogger.java
new file mode 100644
index 0000000..72c1661
--- /dev/null
+++ b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/logger/DefaultEclipseLogger.java
@@ -0,0 +1,44 @@
+/*
+ * 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.ide.eclipse.core.logger;
+
+import org.apache.sling.ide.eclipse.core.internal.Activator;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.osgi.service.component.annotations.Component;
+
+@Component
+public class DefaultEclipseLogger implements LogSubscriber {
+
+	@Override
+	public void log(Severity severity, String message, Throwable cause) {
+		final int statusCode;
+		switch(severity) {
+		case ERROR:
+			statusCode = IStatus.ERROR;
+			break;
+		case WARNING:
+			statusCode = IStatus.WARNING;
+			break;
+		default:
+			return;
+		}
+		Platform.getLog(Activator.getDefault().getBundle()).log(new Status(statusCode, Activator.getDefault().getBundle().getSymbolicName(), message, cause));
+	}
+
+}
diff --git a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/ServiceUtil.java b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/logger/LogSubscriber.java
similarity index 68%
rename from eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/ServiceUtil.java
rename to eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/logger/LogSubscriber.java
index 3e4252b..0bd2e94 100644
--- a/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/ServiceUtil.java
+++ b/eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/logger/LogSubscriber.java
@@ -14,17 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sling.ide.eclipse.core;
+package org.apache.sling.ide.eclipse.core.logger;
 
-import org.osgi.util.tracker.ServiceTracker;
+public interface LogSubscriber {
 
-public class ServiceUtil {
-
-    public static <S, T> T getNotNull(ServiceTracker<S, T> serviceTracker) {
-        T service = serviceTracker.getService();
-        if (service == null)
-            throw new IllegalStateException("Service is null");
-
-        return service;
-    }
+	enum Severity {
+		ERROR,
+		WARNING,
+		TRACE,
+		TRACE_PERFORMANCE
+	}
+	void log(Severity severity, String message, Throwable cause);
 }
diff --git a/eclipse/eclipse-m2e-core/.settings/org.eclipse.pde.ds.annotations.prefs b/eclipse/eclipse-m2e-core/.settings/org.eclipse.pde.ds.annotations.prefs
new file mode 100644
index 0000000..38f9eec
--- /dev/null
+++ b/eclipse/eclipse-m2e-core/.settings/org.eclipse.pde.ds.annotations.prefs
@@ -0,0 +1,7 @@
+dsVersion=V1_3
+eclipse.preferences.version=1
+enabled=true
+generateBundleActivationPolicyLazy=true
+path=OSGI-INF
+validationErrorLevel=error
+validationErrorLevel.missingImplicitUnbindMethod=error
diff --git a/shared/p2/vlt-wrapper/META-INF/LICENSE b/eclipse/eclipse-m2e-core/META-INF/LICENSE
similarity index 100%
rename from shared/p2/vlt-wrapper/META-INF/LICENSE
rename to eclipse/eclipse-m2e-core/META-INF/LICENSE
diff --git a/eclipse/eclipse-m2e-core/META-INF/MANIFEST.MF b/eclipse/eclipse-m2e-core/META-INF/MANIFEST.MF
index e05559e..5394829 100644
--- a/eclipse/eclipse-m2e-core/META-INF/MANIFEST.MF
+++ b/eclipse/eclipse-m2e-core/META-INF/MANIFEST.MF
@@ -5,13 +5,13 @@
 Bundle-SymbolicName: org.apache.sling.ide.eclipse-m2e-core;singleton:=true
 Bundle-Version: 1.2.3.qualifier
 Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-ClassPath: .
 Import-Package: org.apache.sling.ide.eclipse.core.launch,
  org.apache.sling.ide.osgi,
  org.eclipse.core.resources,
  org.eclipse.core.runtime;version="3.4.0",
  org.eclipse.jdt.launching
-Service-Component: OSGI-INF/MavenSourceReferenceResolver.xml
+Service-Component: OSGI-INF/org.apache.sling.ide.eclipse.m2e.core.internal.launch.MavenSourceReferenceResolver.xml
 Require-Bundle: org.eclipse.m2e.core;bundle-version="1.4.0",
  org.eclipse.m2e.maven.runtime;bundle-version="1.4.0"
diff --git a/shared/p2/vlt-wrapper/META-INF/NOTICE b/eclipse/eclipse-m2e-core/META-INF/NOTICE
similarity index 70%
rename from shared/p2/vlt-wrapper/META-INF/NOTICE
rename to eclipse/eclipse-m2e-core/META-INF/NOTICE
index 45dda0c..ea12400 100644
--- a/shared/p2/vlt-wrapper/META-INF/NOTICE
+++ b/eclipse/eclipse-m2e-core/META-INF/NOTICE
@@ -1,6 +1,6 @@
 
-Sling IDE Tools: FileVault wrapper
-Copyright 2007-2014 The Apache Software Foundation
+Sling IDE Tools: Eclipse Core
+Copyright 2007-2022 The Apache Software Foundation
 
 Apache Sling is based on source code originally developed 
 by Day Software (http://www.day.com/).
diff --git a/eclipse/eclipse-m2e-core/OSGI-INF/MavenSourceReferenceResolver.xml b/eclipse/eclipse-m2e-core/OSGI-INF/MavenSourceReferenceResolver.xml
deleted file mode 100644
index 6af0ff8..0000000
--- a/eclipse/eclipse-m2e-core/OSGI-INF/MavenSourceReferenceResolver.xml
+++ /dev/null
@@ -1,23 +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.
--->
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
-    <implementation class="org.apache.sling.ide.eclipse.m2e.core.internal.launch.MavenSourceReferenceResolver" />
-    <service>
-        <provide interface="org.apache.sling.ide.eclipse.core.launch.SourceReferenceResolver" />
-    </service> />
-</scr:component>
diff --git a/eclipse/eclipse-m2e-core/pom.xml b/eclipse/eclipse-m2e-core/pom.xml
index 1f59fdc..4cad83a 100644
--- a/eclipse/eclipse-m2e-core/pom.xml
+++ b/eclipse/eclipse-m2e-core/pom.xml
@@ -55,7 +55,11 @@
                     <manifestFile>META-INF/MANIFEST.MF</manifestFile>
                 </archive>
             </configuration>
-        </plugin>        
+        </plugin>    
+        <plugin>
+			<groupId>org.eclipse.tycho</groupId>
+			<artifactId>tycho-ds-plugin</artifactId>
+		</plugin>    
     </plugins>
   </build>  
 </project>
diff --git a/eclipse/eclipse-m2e-core/src/org/apache/sling/ide/eclipse/m2e/core/internal/launch/MavenSourceReferenceResolver.java b/eclipse/eclipse-m2e-core/src/org/apache/sling/ide/eclipse/m2e/core/internal/launch/MavenSourceReferenceResolver.java
index d96d228..6d8696f 100644
--- a/eclipse/eclipse-m2e-core/src/org/apache/sling/ide/eclipse/m2e/core/internal/launch/MavenSourceReferenceResolver.java
+++ b/eclipse/eclipse-m2e-core/src/org/apache/sling/ide/eclipse/m2e/core/internal/launch/MavenSourceReferenceResolver.java
@@ -30,7 +30,9 @@
 import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
 import org.eclipse.jdt.launching.JavaRuntime;
 import org.eclipse.m2e.core.MavenPlugin;
+import org.osgi.service.component.annotations.Component;
 
+@Component
 public class MavenSourceReferenceResolver implements SourceReferenceResolver {
     @Override
     public IRuntimeClasspathEntry resolve(SourceReference reference) throws CoreException {
diff --git a/eclipse/eclipse-m2e-test/META-INF/MANIFEST.MF b/eclipse/eclipse-m2e-test/META-INF/MANIFEST.MF
index ac91b91..7d81d23 100644
--- a/eclipse/eclipse-m2e-test/META-INF/MANIFEST.MF
+++ b/eclipse/eclipse-m2e-test/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: Sling IDE Tools: Eclipse M2Eclipse-based tests
 Bundle-SymbolicName: org.apache.sling.ide.eclipse-m2e-test
 Bundle-Version: 1.2.3.qualifier
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-17
 Require-Bundle: org.junit,
   org.eclipse.m2e.core,
   org.eclipse.m2e.launching,
@@ -11,15 +11,10 @@
   org.eclipse.m2e.core.ui,
   org.eclipse.m2e.discovery,
   org.eclipse.m2e.editor,
-  org.eclipse.m2e.editor.xml,
-  org.eclipse.m2e.maven.indexer,
   org.eclipse.m2e.archetype.common,
   org.eclipse.m2e.profiles.ui,
   org.eclipse.m2e.scm,
   org.eclipse.m2e.maven.runtime,
-  org.eclipse.m2e.lifecyclemapping.defaults,
-  org.eclipse.m2e.model.edit,
-  org.eclipse.m2e.maven.runtime.slf4j.simple,
   org.eclipse.m2e.refactoring,
   org.eclipse.m2e.profiles.core
 Fragment-Host: org.apache.sling.ide.eclipse-m2e-ui
diff --git a/eclipse/eclipse-m2e-test/META-INF/NOTICE b/eclipse/eclipse-m2e-test/META-INF/NOTICE
index 61278fc..79fd44e 100644
--- a/eclipse/eclipse-m2e-test/META-INF/NOTICE
+++ b/eclipse/eclipse-m2e-test/META-INF/NOTICE
@@ -1,6 +1,6 @@
 
 Sling IDE Tools: Eclipse M2Eclipse-based Tests
-Copyright 2007-2014 The Apache Software Foundation
+Copyright 2007-2022 The Apache Software Foundation
 
 Apache Sling is based on source code originally developed 
 by Day Software (http://www.day.com/).
diff --git a/eclipse/eclipse-m2e-test/pom.xml b/eclipse/eclipse-m2e-test/pom.xml
index 8b91d1a..76f8c36 100644
--- a/eclipse/eclipse-m2e-test/pom.xml
+++ b/eclipse/eclipse-m2e-test/pom.xml
@@ -54,26 +54,6 @@
                 </archive>
             </configuration>
         </plugin>
-        <plugin>
-            <groupId>org.eclipse.tycho</groupId>
-            <artifactId>target-platform-configuration</artifactId>
-            <configuration>
-                <dependency-resolution>
-                    <extraRequirements>
-                        <requirement>
-                            <type>eclipse-plugin</type>
-                            <id>org.slf4j.binding.simple</id>
-                            <versionRange>0.0.0</versionRange>
-                        </requirement>
-                        <requirement>
-                            <type>eclipse-plugin</type>
-                            <id>org.slf4j.apis.log4j</id>
-                            <versionRange>0.0.0</versionRange>
-                        </requirement>
-                    </extraRequirements>
-                </dependency-resolution>
-            </configuration>
-        </plugin>        
     </plugins>
   </build>  
 </project>
diff --git a/eclipse/eclipse-m2e-ui/META-INF/MANIFEST.MF b/eclipse/eclipse-m2e-ui/META-INF/MANIFEST.MF
index 6976b45..cccd2fb 100644
--- a/eclipse/eclipse-m2e-ui/META-INF/MANIFEST.MF
+++ b/eclipse/eclipse-m2e-ui/META-INF/MANIFEST.MF
@@ -5,41 +5,28 @@
 Bundle-SymbolicName: org.apache.sling.ide.eclipse-m2e-ui;singleton:=true
 Bundle-Activator: org.apache.sling.ide.eclipse.m2e.internal.Activator
 Bundle-Version: 1.2.3.qualifier
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-ClassPath: .
 Require-Bundle: org.eclipse.m2e.core;bundle-version="1.4.0",
  org.eclipse.m2e.archetype.common;bundle-version="1.4.0",
  org.eclipse.m2e.maven.runtime;bundle-version="1.4.0",
  org.eclipse.jst.j2ee,
- org.eclipse.m2e.discovery;bundle-version="1.4.0"
-Import-Package: org.apache.commons.httpclient;version="3.1.0",
- org.apache.commons.httpclient.auth;version="3.1.0",
- org.apache.commons.httpclient.methods;version="3.1.0",
- org.apache.commons.httpclient.methods.multipart;version="3.1.0",
- org.apache.commons.httpclient.params;version="3.1.0",
- org.apache.commons.io;version="2.0.1",
- org.apache.commons.lang,
- org.apache.sling.ide.artifacts,
+ org.eclipse.m2e.discovery;bundle-version="1.4.0",
+ org.eclipse.m2e.core.ui;bundle-version="2.0.0",
+ org.apache.sling.ide.eclipse-core
+Import-Package: org.apache.sling.ide.artifacts,
  org.apache.sling.ide.eclipse.core,
  org.apache.sling.ide.eclipse.core.progress,
  org.apache.sling.ide.eclipse.ui,
  org.apache.sling.ide.eclipse.ui.wizards,
  org.apache.sling.ide.log,
  org.apache.sling.ide.osgi,
- org.apache.sling.ide.transport,
- org.eclipse.core.commands.common,
  org.eclipse.core.resources,
  org.eclipse.core.runtime;version="3.4.0",
- org.eclipse.core.runtime.jobs,
  org.eclipse.core.runtime.preferences;version="3.3.0",
- org.eclipse.debug.core,
- org.eclipse.debug.core.model,
- org.eclipse.debug.internal.ui,
  org.eclipse.jface.dialogs,
- org.eclipse.jface.layout,
  org.eclipse.jface.operation,
  org.eclipse.jface.preference,
- org.eclipse.jface.resource,
  org.eclipse.jface.util,
  org.eclipse.jface.viewers,
  org.eclipse.jface.wizard,
@@ -53,16 +40,12 @@
  org.eclipse.swt.layout,
  org.eclipse.swt.widgets,
  org.eclipse.ui,
- org.eclipse.ui.actions,
  org.eclipse.ui.browser,
- org.eclipse.ui.plugin,
  org.eclipse.ui.preferences,
- org.eclipse.ui.progress,
  org.eclipse.ui.statushandlers,
  org.eclipse.wst.common.frameworks.datamodel,
  org.eclipse.wst.common.project.facet.core,
  org.eclipse.wst.server.core,
- org.osgi.framework;version="1.6.0",
- org.osgi.util.tracker;version="1.5.0"
+ org.osgi.framework;version="1.8.0"
 Bundle-ActivationPolicy: lazy
 Export-Package: org.apache.sling.ide.eclipse.ui.wizards.np
diff --git a/eclipse/eclipse-m2e-ui/META-INF/NOTICE b/eclipse/eclipse-m2e-ui/META-INF/NOTICE
index 1fb9aee..bad6a71 100644
--- a/eclipse/eclipse-m2e-ui/META-INF/NOTICE
+++ b/eclipse/eclipse-m2e-ui/META-INF/NOTICE
@@ -1,6 +1,6 @@
 
 Sling IDE Tools: Eclipse M2Eclipse-based UI
-Copyright 2007-2014 The Apache Software Foundation
+Copyright 2007-2022 The Apache Software Foundation
 
 Apache Sling is based on source code originally developed 
 by Day Software (http://www.day.com/).
diff --git a/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/AbstractBundleProjectConfigurator.java b/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/AbstractBundleProjectConfigurator.java
index 98afa72..15a7242 100644
--- a/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/AbstractBundleProjectConfigurator.java
+++ b/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/AbstractBundleProjectConfigurator.java
@@ -20,6 +20,7 @@
 import org.apache.maven.project.MavenProject;
 import org.apache.sling.ide.eclipse.core.ConfigurationHelper;
 import org.apache.sling.ide.log.Logger;
+import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
@@ -45,12 +46,13 @@
         
         // at this point the JDT project is already created by the tycho plugin
         // we just need to setup the appropriate facets
-        IProject project = configRequest.getProject();
+        IProject project = configRequest.mavenProjectFacade().getProject();
+        IFile pomFile = configRequest.mavenProjectFacade().getPom();
         trace("AbstractBundleProjectConfigurator called for POM {0} and project {1}",
-                configRequest.getPom().getFullPath(),
+        		pomFile.getFullPath(),
                 project.getName());
         // delete all previous markers on this pom.xml set by any project configurator
-        deleteMarkers(configRequest.getPom());
+        deleteMarkers(pomFile);
         
         if (!getPreferences().isBundleProjectConfiguratorEnabled()) {
             trace("m2e project configurator for bundles was disabled through preference.");
@@ -58,7 +60,7 @@
         }
 
         // check for maven-sling-plugin as well (to make sure this is a Sling project)
-        MavenProject mavenProject = configRequest.getMavenProject();
+        MavenProject mavenProject = configRequest.mavenProject();
         if (mavenProject.getPlugin(MAVEN_SLING_PLUGIN_KEY) != null) {
             trace("Found maven-sling-plugin in build plugins for project {0}, therefore adding sling bundle facets!", project.getName());
             ConfigurationHelper.convertToBundleProject(project);
@@ -66,7 +68,7 @@
             trace("Couldn't find maven-sling-plugin in build plugins for project {0}, therefore not adding the sling bundle facets!", project.getName());
         }
         if (!isSupportingM2eIncrementalBuild(mavenProject, getLogger())) {
-            markerManager.addMarker(configRequest.getPom(), MARKER_TYPE_BUNDLE_NOT_SUPPORTING_M2E,
+            markerManager.addMarker(pomFile, MARKER_TYPE_BUNDLE_NOT_SUPPORTING_M2E,
                     "Missing m2e incremental build support for generating the bundle manifest, component descriptions and metatype resources. Please use the provided Quick Fixes on this issue to resolve this.",
                     -1,
                     IMarker.SEVERITY_ERROR);
diff --git a/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/Activator.java b/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/Activator.java
index b41cfa8..4ec1381 100644
--- a/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/Activator.java
+++ b/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/Activator.java
@@ -17,7 +17,6 @@
 package org.apache.sling.ide.eclipse.m2e.internal;
 
 import org.apache.sling.ide.artifacts.EmbeddedArtifactLocator;
-import org.apache.sling.ide.eclipse.core.ServiceUtil;
 import org.apache.sling.ide.log.Logger;
 import org.apache.sling.ide.osgi.OsgiClientFactory;
 import org.eclipse.core.runtime.Plugin;
@@ -25,17 +24,12 @@
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.ui.preferences.ScopedPreferenceStore;
 import org.osgi.framework.BundleContext;
-import org.osgi.util.tracker.ServiceTracker;
 
 public class Activator extends Plugin {
 
     public static final String PLUGIN_ID = "org.apache.sling.ide.eclipse-m2e-ui";
     public static Activator INSTANCE;
 
-    private ServiceTracker<EmbeddedArtifactLocator, EmbeddedArtifactLocator> artifactLocator;
-    private ServiceTracker<OsgiClientFactory, OsgiClientFactory> osgiClientFactory;
-    private ServiceTracker<Logger, Logger> tracer;
-
     /**
      * Storage for preferences.
      */
@@ -50,42 +44,27 @@
         super.start(context);
 
         INSTANCE = this;
-
-        artifactLocator = new ServiceTracker<>(context, EmbeddedArtifactLocator.class, null);
-        artifactLocator.open();
-
-        osgiClientFactory = new ServiceTracker<>(context, OsgiClientFactory.class,
-                null);
-        osgiClientFactory.open();
-
-        tracer = new ServiceTracker<>(context, Logger.class, null);
-        tracer.open();
     }
 
     @Override
     public void stop(BundleContext context) throws Exception {
         INSTANCE = null;
 
-        artifactLocator.close();
-        tracer.close();
-
         super.stop(context);
     }
 
-    public EmbeddedArtifactLocator getArtifactsLocator() {
-
-        return ServiceUtil.getNotNull(artifactLocator);
+    public EmbeddedArtifactLocator getArtifactLocator() {
+        return org.apache.sling.ide.eclipse.core.internal.Activator.getDefault().getArtifactLocator();
     }
 
     public OsgiClientFactory getOsgiClientFactory() {
-
-        return ServiceUtil.getNotNull(osgiClientFactory);
+        return org.apache.sling.ide.eclipse.core.internal.Activator.getDefault().getOsgiClientFactory();
     }
 
     public Logger getPluginLogger() {
-        return ServiceUtil.getNotNull(tracer);
+        return org.apache.sling.ide.eclipse.core.internal.Activator.getDefault().getPluginLogger();
     }
-
+    
     public IPreferenceStore getPreferenceStore() {
         // Create the preference store lazily.
         if (preferenceStore == null) {
diff --git a/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/ContentPackageProjectConfigurator.java b/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/ContentPackageProjectConfigurator.java
index 3e21b2c..403ad59 100644
--- a/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/ContentPackageProjectConfigurator.java
+++ b/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/ContentPackageProjectConfigurator.java
@@ -25,7 +25,7 @@
 
 import org.apache.maven.project.MavenProject;
 import org.apache.sling.ide.eclipse.core.ConfigurationHelper;
-import org.eclipse.aether.util.StringUtils;
+import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IProjectDescription;
@@ -68,16 +68,17 @@
     @Override
     public void configure(ProjectConfigurationRequest configRequest, IProgressMonitor progressMonitor) throws CoreException {
 
-        IProject project = configRequest.getProject();
+        IProject project = configRequest.mavenProjectFacade().getProject();
+        IFile pomFile = configRequest.mavenProjectFacade().getPom();
         // delete all previous markers on this pom.xml set by any project configurator
-        deleteMarkers(configRequest.getPom());
+        deleteMarkers(pomFile);
 
         if (!getPreferences().isContentPackageProjectConfiguratorEnabled()) {
             trace("M2E project configurator for packing type 'content-package' was disabled through preference.");
             return;
         }
 
-        MavenProject mavenProject = configRequest.getMavenProject();
+        MavenProject mavenProject = configRequest.mavenProject();
         boolean active = !"false".equalsIgnoreCase(mavenProject.getProperties().getProperty(M2E_ACTIVE));
         if(!active) {
             trace("M2E project configurator for packing type 'content-package' was disabled with Maven property {0}", M2E_ACTIVE);
@@ -92,7 +93,7 @@
             Optional<java.nio.file.Path> contentSyncPath = MavenProjectUtils.guessJcrRootFolder(mavenProject);
             if (!contentSyncPath.isPresent()) {
                 // add marker
-                addMarker(configRequest.getPom(), "Could not detect jcr_root path for this content package!", IMarker.SEVERITY_ERROR);
+                addMarker(pomFile, "Could not detect jcr_root path for this content package!", IMarker.SEVERITY_ERROR);
                 return;
             }
             
@@ -158,7 +159,7 @@
         WtpProjectConfigurer(ProjectConfigurationRequest configRequest,
                IProject project, String jcrRootPath) {
 
-            this.configRequest = configRequest;
+           this.configRequest = configRequest;
            this.project = project;
            this.jcrRootPath = jcrRootPath;
        }
@@ -168,24 +169,26 @@
            
            trace("Configuring content-package with WTP facets/natures");
            
-            addNatures(project, getDefaultWtpNatures(), progressMonitor, configRequest.getPom());
+            addNatures(project, getDefaultWtpNatures(), progressMonitor, configRequest.mavenProjectFacade().getPom());
            addWtpFacets(progressMonitor);
        }
 
        void addWtpFacets( IProgressMonitor progressMonitor) throws CoreException {
-           MavenProject mavenProject = configRequest.getMavenProject();
-           String javaFacetVersion;
-           if ( !StringUtils.isEmpty(mavenProject.getProperties().getProperty(M2E_JAVA_FACET_VERSION))) {
-               javaFacetVersion = mavenProject.getProperties().getProperty(M2E_JAVA_FACET_VERSION);
+           MavenProject mavenProject = configRequest.mavenProject();
+           final String javaFacetVersion;
+           String javaFacetVersionPropertyValue = mavenProject.getProperties().getProperty(M2E_JAVA_FACET_VERSION, "");
+           if (!javaFacetVersionPropertyValue.isBlank()) {
+               javaFacetVersion = javaFacetVersionPropertyValue;
                trace("Configured Java facet version {0} from pom property {1}", javaFacetVersion, M2E_JAVA_FACET_VERSION);
            } else {
                javaFacetVersion = JavaFacetUtil.getCompilerLevel(project);
                trace("Configured Java facet version {0} using JavaFacetUtil", javaFacetVersion);
            }
            
-           String webFacetVersion;
-           if ( !StringUtils.isEmpty(mavenProject.getProperties().getProperty(M2E_WEB_FACET_VERSION))) {
-               webFacetVersion = mavenProject.getProperties().getProperty(M2E_WEB_FACET_VERSION);
+           final String webFacetVersion;
+           String webFacetVersionPropertyValue = mavenProject.getProperties().getProperty(M2E_WEB_FACET_VERSION);
+           if (!webFacetVersionPropertyValue.isBlank()) {
+               webFacetVersion = webFacetVersionPropertyValue;
                trace("Configured Web facet version {0} from pom property {1}", webFacetVersion, M2E_WEB_FACET_VERSION);
            } else {
                webFacetVersion = MavenProjectUtils.guessServletApiVersion(mavenProject);
diff --git a/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/MavenBundlePluginProjectConfigurator.java b/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/MavenBundlePluginProjectConfigurator.java
index 317c50c..a9e47c0 100644
--- a/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/MavenBundlePluginProjectConfigurator.java
+++ b/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/MavenBundlePluginProjectConfigurator.java
@@ -22,8 +22,6 @@
 import org.apache.maven.project.MavenProject;
 import org.apache.sling.ide.log.Logger;
 import org.codehaus.plexus.util.xml.Xpp3Dom;
-import org.eclipse.m2e.core.internal.lifecyclemapping.LifecycleMappingFactory;
-
 
 public class MavenBundlePluginProjectConfigurator extends AbstractBundleProjectConfigurator {
 
@@ -32,11 +30,6 @@
      */
     private static final String MAVEN_BUNDLE_PLUGIN_KEY ="org.apache.felix:maven-bundle-plugin";
     
-    /**
-     * The configurator id used in <a href="https://github.com/tesla/m2eclipse-tycho/blob/master/org.sonatype.tycho.m2e/lifecycle-mapping-metadata.xml">m2e-tycho</a>.
-     * @see <a href="https://github.com/tesla/m2eclipse-tycho">m2eclipse-tycho Github</a>
-     */
-    private static final String M2E_TYCHO_EXTENSION_PROJECT_CONFIGURATOR_ID = "maven-bundle-plugin";
     
     public MavenBundlePluginProjectConfigurator() {
         super(false); // this configurator is only bound to goal "bundle" which is not supposed to be executed in
@@ -50,12 +43,6 @@
             logger.warn("maven-bundle-plugin not configured!");
             return false;
         } else {
-            // check if m2elipse-tycho is already installed (which supports incremental builds for "bundle" packagings
-            if (LifecycleMappingFactory.createProjectConfigurator(M2E_TYCHO_EXTENSION_PROJECT_CONFIGURATOR_ID) != null) {
-                logger.trace("Project configurator with id '" + M2E_TYCHO_EXTENSION_PROJECT_CONFIGURATOR_ID + "' found -> m2e-tycho installed.");
-                return true;
-            }
-            
             String version = bundlePlugin.getVersion();
             if (version == null) {
                 logger.warn("Could not retrieve used version of maven-bundle-plugin!");
diff --git a/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/SlingstartProjectConfigurator.java b/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/SlingstartProjectConfigurator.java
index c73d668..65b16c1 100644
--- a/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/SlingstartProjectConfigurator.java
+++ b/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/m2e/internal/SlingstartProjectConfigurator.java
@@ -32,8 +32,8 @@
 	@Override
 	public void configure(ProjectConfigurationRequest request, IProgressMonitor monitor) throws CoreException {
 		
-		IProject project = request.getProject();
-		Set<String> candidates = MavenProjectUtils.getModelDirectoryCandidateLocations(request.getMavenProject());
+		IProject project = request.mavenProjectFacade().getProject();
+		Set<String> candidates = MavenProjectUtils.getModelDirectoryCandidateLocations(request.mavenProject());
 		IPath modelsPath = null; 
 		
 		for ( String candidate : candidates ) {
@@ -46,7 +46,6 @@
 		}
 		
 		trace("Configuring project {0} with models path {1}", project.getName(), modelsPath);
-		
-		ConfigurationHelper.convertToLaunchpadProject(request.getProject(), modelsPath);
+		ConfigurationHelper.convertToLaunchpadProject(project, modelsPath);
 	}
 }
diff --git a/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/AbstractNewMavenBasedSlingApplicationWizard.java b/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/AbstractNewMavenBasedSlingApplicationWizard.java
index a3e0d3e..03a0143 100644
--- a/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/AbstractNewMavenBasedSlingApplicationWizard.java
+++ b/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/AbstractNewMavenBasedSlingApplicationWizard.java
@@ -18,6 +18,7 @@
 
 import static org.apache.sling.ide.eclipse.core.progress.ProgressUtils.advance;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.Properties;
 
@@ -34,7 +35,12 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.m2e.core.MavenPlugin;
+import org.eclipse.m2e.core.project.IArchetype;
+import org.eclipse.m2e.core.project.IMavenProjectImportResult;
+import org.eclipse.m2e.core.project.MavenProjectInfo;
 import org.eclipse.m2e.core.project.ProjectImportConfiguration;
+import org.eclipse.m2e.core.ui.internal.M2EUIPluginActivator;
+import org.eclipse.m2e.core.ui.internal.archetype.ArchetypePlugin;
 import org.eclipse.wst.server.core.IServer;
 
 public abstract class AbstractNewMavenBasedSlingApplicationWizard extends AbstractNewSlingApplicationWizard {
@@ -42,17 +48,17 @@
 	private ArchetypeParametersWizardPage archetypeParametersPage;
 
 	private static boolean isConfiguredWithBndPlugin(Model model) {
-	    for ( Plugin buildPlugin: model.getBuild().getPlugins() ) {
-	        if ( "biz.aQute.bnd".equals(buildPlugin.getGroupId())
-	                && "bnd-maven-plugin".equals(buildPlugin.getArtifactId()) ) {
-	            return true;
-	        }
-	    }
-	    
-        return false;
-    }
-	
-    public abstract boolean acceptsArchetype(Archetype archetype);
+		for (Plugin buildPlugin : model.getBuild().getPlugins()) {
+			if ("biz.aQute.bnd".equals(buildPlugin.getGroupId())
+					&& "bnd-maven-plugin".equals(buildPlugin.getArtifactId())) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	public abstract boolean acceptsArchetype(Archetype archetype);
 
 	/**
 	 * Constructor for AbstractNewMavenBasedSlingApplicationWizard.
@@ -62,25 +68,24 @@
 		setWindowTitle(doGetWindowTitle());
 		setNeedsProgressMonitor(true);
 	}
-	
-	
+
 	/**
 	 * Adding the page to the wizard.
 	 */
 	@Override
-    public void addPages() {
+	public void addPages() {
 		chooseArchetypePage = new ChooseArchetypeWizardPage(this);
 		addPage(chooseArchetypePage);
 		archetypeParametersPage = createArchetypeParametersWizardPage();
 		addPage(archetypeParametersPage);
-        addPage(getSetupServerWizardPage());
+		addPage(getSetupServerWizardPage());
 	}
-	
-    protected ArchetypeParametersWizardPage createArchetypeParametersWizardPage() {
-        return new ArchetypeParametersWizardPage(this);
-    }
-	
-    public ChooseArchetypeWizardPage getChooseArchetypePage() {
+
+	protected ArchetypeParametersWizardPage createArchetypeParametersWizardPage() {
+		return new ArchetypeParametersWizardPage(this);
+	}
+
+	public ChooseArchetypeWizardPage getChooseArchetypePage() {
 		return chooseArchetypePage;
 	}
 
@@ -88,13 +93,12 @@
     protected List<IProject> createProjects(IProgressMonitor monitor) throws CoreException {
 
         IPath location = chooseArchetypePage.getLocation();
-        Archetype archetype = chooseArchetypePage.getSelectedArchetype();
+        final Archetype archetype = chooseArchetypePage.getSelectedArchetype();
         String groupId = archetypeParametersPage.getGroupId();
         String artifactId = archetypeParametersPage.getArtifactId();
         String version = archetypeParametersPage.getVersion();
         String javaPackage = archetypeParametersPage.getJavaPackage();
         Properties properties = archetypeParametersPage.getProperties();
-        ProjectImportConfiguration configuration = new ProjectImportConfiguration();
 
         IProject existingProject = ResourcesPlugin.getWorkspace().getRoot().getProject(artifactId);
         if (existingProject!=null && existingProject.exists()) {
@@ -103,69 +107,92 @@
 
         advance(monitor, 1);
 
-        List<IProject> projects = MavenPlugin.getProjectConfigurationManager().createArchetypeProjects(location,
-                archetype, groupId, artifactId, version, javaPackage, properties, configuration,
+        // TODO: depends on https://github.com/eclipse-m2e/m2e-core/issues/921
+        IArchetype m2eArchetype = new IArchetype() {
+
+        	  @Override
+        	  public String getGroupId() {
+        	    return archetype.getGroupId();
+        	  }
+
+        	  @Override
+        	  public String getArtifactId() {
+        	    return archetype.getArtifactId();
+        	  }
+
+        	  @Override
+        	  public String getVersion() {
+        	    return archetype.getVersion();
+        	  }
+        };
+        // rely on internal API, until https://github.com/eclipse-m2e/m2e-core/issues/921 is solved
+    	ArchetypePlugin archetypeManager = M2EUIPluginActivator.getDefault().getArchetypePlugin();
+        Collection<MavenProjectInfo> projects = archetypeManager.getGenerator().createArchetypeProjects(location,
+        		m2eArchetype, groupId, artifactId, version, javaPackage, properties, false,
                 new NullProgressMonitor());
 
         monitor.worked(3);
 
-        return projects;
+        return MavenPlugin.getProjectConfigurationManager()
+                .importProjects(projects, new ProjectImportConfiguration(), null, monitor)
+                .stream().filter(r -> r.getProject() != null && r.getProject().exists())
+                .map(IMavenProjectImportResult::getProject).toList();
 
     }
 
-    @Override
-    protected Projects configureCreatedProjects(List<IProject> createdProjects, IProgressMonitor monitor)
-            throws CoreException {
+	@Override
+	protected Projects configureCreatedProjects(List<IProject> createdProjects, IProgressMonitor monitor)
+			throws CoreException {
 
-        Projects projects = new Projects();
+		Projects projects = new Projects();
 
-        for (IProject project : createdProjects) {
-            IFile pomFile = project.getFile("pom.xml");
-            if (!pomFile.exists()) {
-                // then ignore this project - we only deal with maven projects
-                continue;
-            }
-            final Model model = MavenPlugin.getMavenModelManager().readMavenModel(pomFile);
-            final String packaging = model.getPackaging();
+		for (IProject project : createdProjects) {
+			IFile pomFile = project.getFile("pom.xml");
+			if (!pomFile.exists()) {
+				// then ignore this project - we only deal with maven projects
+				continue;
+			}
+			final Model model = MavenPlugin.getMavenModelManager().readMavenModel(pomFile);
+			final String packaging = model.getPackaging();
 
-            if ("content-package".equals(packaging)) {
-                projects.getContentProjects().add(project);
-            } else if ("bundle".equals(packaging) || isConfiguredWithBndPlugin(model)) {
-                projects.getBundleProjects().add(project);
-            } else if ("pom".equals(packaging)) {
-                if (projects.getReactorProject() == null) {
-                    projects.setReactorProject(project);
-                } else {
-                    IPath currLocation = project.getFullPath();
-                    IPath prevLocation = projects.getReactorProject().getFullPath();
-                    if (currLocation.isPrefixOf(prevLocation)) {
-                        // assume reactor is up in the folder structure
-                        projects.setReactorProject(project);
-                    }
-                }
-            }
-        }
+			if ("content-package".equals(packaging)) {
+				projects.getContentProjects().add(project);
+			} else if ("bundle".equals(packaging) || isConfiguredWithBndPlugin(model)) {
+				projects.getBundleProjects().add(project);
+			} else if ("pom".equals(packaging)) {
+				if (projects.getReactorProject() == null) {
+					projects.setReactorProject(project);
+				} else {
+					IPath currLocation = project.getFullPath();
+					IPath prevLocation = projects.getReactorProject().getFullPath();
+					if (currLocation.isPrefixOf(prevLocation)) {
+						// assume reactor is up in the folder structure
+						projects.setReactorProject(project);
+					}
+				}
+			}
+		}
 
-        advance(monitor, 1);
+		advance(monitor, 1);
 
-        for (IProject contentProject : projects.getContentProjects()) {
-            configureContentProject(contentProject, createdProjects, monitor);
-        }
-        for (IProject bundleProject : projects.getBundleProjects()) {
-            configureBundleProject(bundleProject, createdProjects, monitor);
-        }
+		for (IProject contentProject : projects.getContentProjects()) {
+			configureContentProject(contentProject, createdProjects, monitor);
+		}
+		for (IProject bundleProject : projects.getBundleProjects()) {
+			configureBundleProject(bundleProject, createdProjects, monitor);
+		}
 
-        if (projects.getReactorProject() != null) {
-            configureReactorProject(projects.getReactorProject(), monitor);
-            advance(monitor, 1);
-        }
+		if (projects.getReactorProject() != null) {
+			configureReactorProject(projects.getReactorProject(), monitor);
+			advance(monitor, 1);
+		}
 
-        IServer server = getSetupServerWizardPage().getOrCreateServer(monitor);
-        advance(monitor, 1);
+		IServer server = getSetupServerWizardPage().getOrCreateServer(monitor);
+		advance(monitor, 1);
 
-        finishConfiguration(createdProjects, server, monitor);
-        advance(monitor, 1);
+		finishConfiguration(createdProjects, server, monitor);
+		advance(monitor, 1);
 
-        return projects;
-    }
+		return projects;
+	}
 }
\ No newline at end of file
diff --git a/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ArchetypeParametersWizardPage.java b/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ArchetypeParametersWizardPage.java
index 1623515..ab74636 100644
--- a/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ArchetypeParametersWizardPage.java
+++ b/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ArchetypeParametersWizardPage.java
@@ -23,7 +23,6 @@
 
 import org.apache.maven.archetype.catalog.Archetype;
 import org.apache.maven.archetype.metadata.RequiredProperty;
-import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.jface.dialogs.IDialogPage;
@@ -39,8 +38,9 @@
 import org.eclipse.jface.viewers.TableViewerFocusCellManager;
 import org.eclipse.jface.viewers.TextCellEditor;
 import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.m2e.core.internal.MavenPluginActivator;
-import org.eclipse.m2e.core.internal.archetype.ArchetypeManager;
+import org.eclipse.m2e.core.ui.internal.M2EUIPluginActivator;
+import org.eclipse.m2e.core.ui.internal.archetype.ArchetypePlugin;
+import org.eclipse.m2e.core.ui.internal.archetype.MavenArchetype;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.KeyAdapter;
 import org.eclipse.swt.events.KeyEvent;
@@ -270,9 +270,10 @@
 		}
 		
         try {
-        	ArchetypeManager archetypeManager = MavenPluginActivator.getDefault().getArchetypeManager();
-        	ArtifactRepository remoteArchetypeRepository = archetypeManager.getArchetypeRepository(archetype);
-			properties = (List<RequiredProperty>) archetypeManager.getRequiredProperties(archetype, remoteArchetypeRepository, null);
+        	// rely on internal API, until https://github.com/eclipse-m2e/m2e-core/issues/921 is solved
+        	ArchetypePlugin archetypeManager = M2EUIPluginActivator.getDefault().getArchetypePlugin();
+        	MavenArchetype mavenArchetype = new MavenArchetype(archetype);
+			properties = (List<RequiredProperty>) archetypeManager.getRequiredProperties(mavenArchetype, null);
 			
 			Table table = propertiesViewer.getTable();
 			table.setItemCount(properties.size());
diff --git a/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ChooseArchetypeWizardPage.java b/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ChooseArchetypeWizardPage.java
index 20f41b4..31b996f 100644
--- a/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ChooseArchetypeWizardPage.java
+++ b/eclipse/eclipse-m2e-ui/src/org/apache/sling/ide/eclipse/ui/wizards/np/ChooseArchetypeWizardPage.java
@@ -34,16 +34,12 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.m2e.core.MavenPlugin;
-import org.eclipse.m2e.core.internal.MavenPluginActivator;
-import org.eclipse.m2e.core.internal.archetype.ArchetypeCatalogFactory;
-import org.eclipse.m2e.core.internal.archetype.ArchetypeManager;
-import org.eclipse.m2e.core.internal.index.IndexListener;
-import org.eclipse.m2e.core.repository.IRepository;
+import org.eclipse.m2e.core.ui.internal.M2EUIPluginActivator;
+import org.eclipse.m2e.core.ui.internal.archetype.ArchetypeCatalogFactory;
+import org.eclipse.m2e.core.ui.internal.archetype.ArchetypePlugin;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
@@ -61,7 +57,7 @@
 import org.eclipse.swt.widgets.Label;
 
 @SuppressWarnings("restriction")
-public class ChooseArchetypeWizardPage extends WizardPage implements IndexListener {
+public class ChooseArchetypeWizardPage extends WizardPage {
 	
     static final Comparator<String> ARTIFACT_KEY_COMPARATOR = new Comparator<String>() {
         @Override
@@ -209,15 +205,12 @@
 		
 		setPageComplete(false);
 
-        MavenPlugin.getIndexManager().addIndexListener(this);
-
 		setControl(container);
 	}
 
     @Override
     public void dispose() {
 
-        MavenPlugin.getIndexManager().removeIndexListener(this);
         super.dispose();
     }
 
@@ -297,43 +290,6 @@
 		}
 	}
 
-    @Override
-    public void indexAdded(IRepository repository) {
-
-    }
-
-    @Override
-    public void indexChanged(IRepository repository) {
-
-        Activator.getDefault().getPluginLogger()
-                .trace("Reloading archetypes as index for repository {0} has changed", repository);
-
-        try {
-            new RefreshArchetypesRunnable().run(new NullProgressMonitor());
-        } catch (final InvocationTargetException e) {
-            Display.getDefault().asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    if (isCurrentPage()) {
-                        setErrorMessage("Failed refreshing archetypes : " + e.getCause().getMessage());
-                    }
-                }
-            });
-        } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-        }
-    }
-
-    @Override
-    public void indexRemoved(IRepository repository) {
-
-    }
-
-    @Override
-    public void indexUpdating(IRepository repository) {
-
-    }
-
     class RefreshArchetypesRunnable implements IRunnableWithProgress {
         @Override
         public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
@@ -341,10 +297,11 @@
             Logger logger = Activator.getDefault().getPluginLogger();
 
             monitor.beginTask("Discovering archetypes...", 5);
-            ArchetypeManager manager = MavenPluginActivator.getDefault().getArchetypeManager();
+            // rely on internal API, until https://github.com/eclipse-m2e/m2e-core/issues/921 is solved
+        	ArchetypePlugin archetypeManager = M2EUIPluginActivator.getDefault().getArchetypePlugin();
             monitor.worked(1);
 
-            Collection<ArchetypeCatalogFactory> archetypeCatalogs = manager.getArchetypeCatalogs();
+            Collection<ArchetypeCatalogFactory> archetypeCatalogs = archetypeManager.getActiveArchetypeCatalogs();
             monitor.worked(2);
             ArrayList<Archetype> candidates = new ArrayList<>();
             for (ArchetypeCatalogFactory catalogFactory : archetypeCatalogs) {
diff --git a/eclipse/eclipse-sightly-core/META-INF/MANIFEST.MF b/eclipse/eclipse-sightly-core/META-INF/MANIFEST.MF
index 6a61580..22afcc5 100644
--- a/eclipse/eclipse-sightly-core/META-INF/MANIFEST.MF
+++ b/eclipse/eclipse-sightly-core/META-INF/MANIFEST.MF
@@ -6,11 +6,12 @@
 Bundle-Version: 1.2.3.qualifier
 Bundle-Activator: org.apache.sling.ide.eclipse.sightly.internal.Activator
 Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-17
 Require-Bundle: org.eclipse.core.runtime,
  org.eclipse.core.resources,
  org.eclipse.swt,
- org.eclipse.osgi
+ org.eclipse.osgi,
+ org.apache.sling.ide.eclipse-core
 Import-Package: org.apache.sling.ide.eclipse.core,
  org.apache.sling.ide.eclipse.core.facet,
  org.apache.sling.ide.log,
diff --git a/eclipse/eclipse-sightly-core/src/org/apache/sling/ide/eclipse/sightly/internal/Activator.java b/eclipse/eclipse-sightly-core/src/org/apache/sling/ide/eclipse/sightly/internal/Activator.java
index 74d8a79..4ee4715 100644
--- a/eclipse/eclipse-sightly-core/src/org/apache/sling/ide/eclipse/sightly/internal/Activator.java
+++ b/eclipse/eclipse-sightly-core/src/org/apache/sling/ide/eclipse/sightly/internal/Activator.java
@@ -17,10 +17,8 @@
 package org.apache.sling.ide.eclipse.sightly.internal;
 
 import org.apache.sling.ide.log.Logger;
-import org.apache.sling.ide.eclipse.core.ServiceUtil;
 import org.eclipse.core.runtime.Plugin;
 import org.osgi.framework.BundleContext;
-import org.osgi.util.tracker.ServiceTracker;
 
 public class Activator extends Plugin {
 
@@ -30,14 +28,9 @@
     // The shared instance
     private static Activator plugin;
 
-    private ServiceTracker<Logger, Logger> loggerTracker;
-
 
     public void start(BundleContext context) throws Exception {
         
-        loggerTracker = new ServiceTracker<>(context, Logger.class, null);
-        loggerTracker.open();
-        
         super.start(context);
         plugin = this;
     }
@@ -50,8 +43,6 @@
 
         plugin = null;
         
-        loggerTracker.close();
-        
         super.stop(context);
     }
 
@@ -65,8 +56,7 @@
     }
     
     public Logger getLogger() {
-        
-        return ServiceUtil.getNotNull(loggerTracker);
+        return org.apache.sling.ide.eclipse.core.internal.Activator.getDefault().getPluginLogger();
     }
 }
 
diff --git a/eclipse/eclipse-sightly-ui/META-INF/MANIFEST.MF b/eclipse/eclipse-sightly-ui/META-INF/MANIFEST.MF
index dc54140..80adde3 100644
--- a/eclipse/eclipse-sightly-ui/META-INF/MANIFEST.MF
+++ b/eclipse/eclipse-sightly-ui/META-INF/MANIFEST.MF
@@ -5,7 +5,7 @@
 Bundle-SymbolicName: org.apache.sling.ide.eclipse-sightly-ui;singleton:=true
 Bundle-Version: 1.2.3.qualifier
 Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-17
 Require-Bundle: org.eclipse.core.runtime,
  org.eclipse.core.resources,
  org.eclipse.jface,
diff --git a/eclipse/eclipse-test/.settings/org.eclipse.pde.ds.annotations.prefs b/eclipse/eclipse-test/.settings/org.eclipse.pde.ds.annotations.prefs
new file mode 100644
index 0000000..38f9eec
--- /dev/null
+++ b/eclipse/eclipse-test/.settings/org.eclipse.pde.ds.annotations.prefs
@@ -0,0 +1,7 @@
+dsVersion=V1_3
+eclipse.preferences.version=1
+enabled=true
+generateBundleActivationPolicyLazy=true
+path=OSGI-INF
+validationErrorLevel=error
+validationErrorLevel.missingImplicitUnbindMethod=error
diff --git a/eclipse/eclipse-test/META-INF/MANIFEST.MF b/eclipse/eclipse-test/META-INF/MANIFEST.MF
index 15aa3ff..550dfe9 100644
--- a/eclipse/eclipse-test/META-INF/MANIFEST.MF
+++ b/eclipse/eclipse-test/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: Sling IDE Tools: Eclipse Tests
 Bundle-SymbolicName: org.apache.sling.ide.eclipse-test
 Bundle-Version: 1.2.3.qualifier
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-17
 Require-Bundle: org.junit,
  org.eclipse.core.runtime,
  org.eclipse.core.resources,
@@ -19,11 +19,9 @@
  org.apache.sling.ide.api,
  org.apache.sling.ide.artifacts,
  org.eclipse.debug.core,
- org.apache.commons.httpclient,
  org.eclipse.wst.common.project.facet.core,
  org.eclipse.m2e.core,
  org.eclipse.m2e.maven.runtime,
- org.apache.commons.io,
  org.hamcrest.core,
  org.eclipse.swtbot.eclipse.finder,
  org.eclipse.swtbot.junit4_x,
@@ -35,8 +33,10 @@
  org.apache.jackrabbit.util,
  org.apache.sling.ide.jcr,
  org.eclipse.wst.validation,
+ org.osgi.service.component.propertytypes;version="1.5.0",
  org.osgi.service.event;version="1.3.0",
  org.slf4j
 Bundle-Activator: org.apache.sling.ide.test.impl.Activator
 Bundle-ActivationPolicy: lazy
 Export-Package: org.apache.sling.ide.test.impl.helpers;x-friends:="org.apache.sling.ide.eclipse-m2e-test"
+Service-Component: OSGI-INF/org.apache.sling.ide.test.impl.VerboseStandardLogger.xml
diff --git a/eclipse/eclipse-test/META-INF/NOTICE b/eclipse/eclipse-test/META-INF/NOTICE
index 30a3b98..9156619 100644
--- a/eclipse/eclipse-test/META-INF/NOTICE
+++ b/eclipse/eclipse-test/META-INF/NOTICE
@@ -1,6 +1,6 @@
 
 Sling IDE Tools: Eclipse Tests
-Copyright 2007-2014 The Apache Software Foundation
+Copyright 2007-2022 The Apache Software Foundation
 
 Apache Sling is based on source code originally developed 
 by Day Software (http://www.day.com/).
diff --git a/eclipse/eclipse-test/build.properties b/eclipse/eclipse-test/build.properties
index 34d2e4d..c58ea21 100644
--- a/eclipse/eclipse-test/build.properties
+++ b/eclipse/eclipse-test/build.properties
@@ -1,4 +1,5 @@
 source.. = src/
 output.. = bin/
 bin.includes = META-INF/,\
-               .
+               .,\
+               OSGI-INF/
diff --git a/eclipse/eclipse-test/pom.xml b/eclipse/eclipse-test/pom.xml
index dce6376..7abcbd6 100644
--- a/eclipse/eclipse-test/pom.xml
+++ b/eclipse/eclipse-test/pom.xml
@@ -36,6 +36,10 @@
 
     <build>
         <plugins>
+        	<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-ds-plugin</artifactId>
+			</plugin>
             <plugin>
                 <groupId>org.eclipse.tycho</groupId>
                 <artifactId>target-platform-configuration</artifactId>
@@ -43,16 +47,6 @@
                     <dependency-resolution>
                         <extraRequirements>
                             <requirement>
-                                <type>eclipse-plugin</type>
-                                <id>org.eclipse.equinox.event</id>
-                                <versionRange>0.0.0</versionRange>
-                            </requirement>
-                            <requirement>
-                                <type>eclipse-plugin</type>
-                                <id>org.eclipse.equinox.ds</id>
-                                <versionRange>0.0.0</versionRange>
-                            </requirement>
-                            <requirement>
                                 <type>eclipse-feature</type>
                                 <id>org.apache.sling.ide.feature</id>
                                 <versionRange>0.0.0</versionRange>
@@ -62,16 +56,6 @@
                                 <id>org.apache.sling.ide.sightly-feature</id>
                                 <versionRange>0.0.0</versionRange>
                             </requirement>
-                            <requirement>
-                                <type>eclipse-plugin</type>
-                                <id>org.slf4j.binding.simple</id>
-                                <versionRange>0.0.0</versionRange>
-                            </requirement>
-                            <requirement>
-                                <type>eclipse-plugin</type>
-                                <id>org.slf4j.apis.log4j</id>
-                                <versionRange>0.0.0</versionRange>
-                            </requirement>
                         </extraRequirements>
                     </dependency-resolution>
                 </configuration>
@@ -83,7 +67,7 @@
                 <configuration>
                     <useUIHarness>true</useUIHarness>
                     <useUIThread>false</useUIThread>
-                    <argLine>-XX:MaxPermSize=512m ${ui.test.args}</argLine>
+                    <argLine>${ui.test.args}</argLine>
                     <systemProperties>
                         <launchpad.http.port>${http.port}</launchpad.http.port>
                         <org.slf4j.simpleLogger.showDateTime>true</org.slf4j.simpleLogger.showDateTime>
@@ -98,7 +82,7 @@
             <plugin>
                 <groupId>org.codehaus.mojo</groupId>
                 <artifactId>build-helper-maven-plugin</artifactId>
-                <version>1.7</version>
+                <version>3.3.0</version>
                 <executions>
                     <execution>
                         <id>reserve-network-port</id>
@@ -114,37 +98,42 @@
                     </execution>
                 </executions>
             </plugin>
+            <!-- launch the Sling instances to test; only oak-tar -->
             <plugin>
                 <groupId>org.apache.sling</groupId>
-                <artifactId>slingstart-maven-plugin</artifactId>
-                <version>1.8.2</version>
-                <extensions>true</extensions>
+                <artifactId>feature-launcher-maven-plugin</artifactId>
+                <version>0.1.2</version>
+                <configuration>
+                    <!-- newer versions don't work due to https://issues.apache.org/jira/browse/SLING-11158 -->
+                    <featureLauncherVersion>1.1.26</featureLauncherVersion>
+                    <launches>
+                        <launch>
+                            <id>sling-starter-oak-tar</id>
+                            <!-- launch the regular Starter distribution (based on Oak with Segment Node Store) -->
+                            <feature>
+                                <groupId>org.apache.sling</groupId>
+                                <artifactId>org.apache.sling.starter</artifactId>
+                                <version>12</version>
+                                <classifier>oak_tar</classifier>
+                                <type>slingosgifeature</type>
+                            </feature>
+                            <launcherArguments>
+                                <frameworkProperties>
+                                    <org.osgi.service.http.port>${http.port}</org.osgi.service.http.port>
+                                </frameworkProperties>
+                            </launcherArguments>
+                            <startTimeoutSeconds>${startTimeoutSeconds}</startTimeoutSeconds>
+                        </launch>
+                    </launches>
+                </configuration>
                 <executions>
                     <execution>
-                        <id>start-container</id>
                         <goals>
                             <goal>start</goal>
-                        </goals>
-                    </execution>
-                    <execution>
-                        <id>stop-container</id>
-                        <goals>
                             <goal>stop</goal>
                         </goals>
                     </execution>
                 </executions>
-                <configuration>
-                    <servers>
-                        <server>
-                            <port>${http.port}</port>
-                        </server>
-                    </servers>
-                    <launchpadDependency>
-                        <groupId>org.apache.sling</groupId>
-                        <artifactId>org.apache.sling.starter</artifactId>
-                        <version>11</version>
-                    </launchpadDependency>
-                </configuration>
             </plugin>
         </plugins>
     </build>
@@ -152,6 +141,7 @@
     <properties>
         <ui.test.args></ui.test.args>
         <defaultLogLevel>INFO</defaultLogLevel>
+        <startTimeoutSeconds>120</startTimeoutSeconds>
     </properties>
 
     <profiles>
diff --git a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/Activator.java b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/Activator.java
index 60c983e..3e809c8 100644
--- a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/Activator.java
+++ b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/Activator.java
@@ -17,53 +17,26 @@
 package org.apache.sling.ide.test.impl;
 
 import org.apache.sling.ide.artifacts.EmbeddedArtifactLocator;
-import org.apache.sling.ide.eclipse.core.ServiceUtil;
 import org.apache.sling.ide.osgi.OsgiClientFactory;
 import org.apache.sling.ide.serialization.SerializationManager;
 import org.apache.sling.ide.sync.content.SyncCommandFactory;
 import org.eclipse.core.runtime.Plugin;
 import org.osgi.framework.BundleContext;
-import org.osgi.util.tracker.ServiceTracker;
 
 public class Activator extends Plugin {
 
     private static Activator INSTANCE;
 
-    private ServiceTracker<EmbeddedArtifactLocator, EmbeddedArtifactLocator> artifactLocator;
-
-    private ServiceTracker<OsgiClientFactory, OsgiClientFactory> osgiClientFactory;
-
-    private ServiceTracker<SerializationManager, SerializationManager> serializationManager;
-
-    private ServiceTracker <SyncCommandFactory, SyncCommandFactory> commandFactory;
-
     @Override
     public void start(BundleContext context) throws Exception {
         super.start(context);
 
-        artifactLocator = new ServiceTracker<>(context, EmbeddedArtifactLocator.class, null);
-        artifactLocator.open();
-
-        osgiClientFactory = new ServiceTracker<>(context, OsgiClientFactory.class, null);
-        osgiClientFactory.open();
-
-        serializationManager = new ServiceTracker<>(context, SerializationManager.class, null);
-        serializationManager.open();
-        
-        commandFactory = new ServiceTracker<>(context, SyncCommandFactory.class, null);
-        commandFactory.open();
-
         INSTANCE = this;
     }
 
     @Override
     public void stop(BundleContext context) throws Exception {
 
-        artifactLocator.close();
-        osgiClientFactory.close();
-        serializationManager.close();
-        commandFactory.close();
-
         INSTANCE = null;
 
         super.stop(context);
@@ -73,22 +46,21 @@
         return INSTANCE;
     }
 
-    public EmbeddedArtifactLocator getArtifactLocator() {
 
-        return ServiceUtil.getNotNull(artifactLocator);
+    public SerializationManager getSerializationManager() {
+        return org.apache.sling.ide.eclipse.core.internal.Activator.getDefault().getSerializationManager();
+    }
+
+    public EmbeddedArtifactLocator getArtifactLocator() {
+        return org.apache.sling.ide.eclipse.core.internal.Activator.getDefault().getArtifactLocator();
     }
 
     public OsgiClientFactory getOsgiClientFactory() {
-
-        return ServiceUtil.getNotNull(osgiClientFactory);
+        return org.apache.sling.ide.eclipse.core.internal.Activator.getDefault().getOsgiClientFactory();
     }
-
-    public SerializationManager getSerializationManager() {
-
-        return ServiceUtil.getNotNull(serializationManager);
-    }
-
+    
     public SyncCommandFactory getCommandFactory() {
-        return ServiceUtil.getNotNull(commandFactory);
+        return org.apache.sling.ide.eclipse.core.internal.Activator.getDefault().getCommandFactory();
     }
+
 }
diff --git a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/BundleDeploymentTest.java b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/BundleDeploymentTest.java
index b90a388..f277f1c 100644
--- a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/BundleDeploymentTest.java
+++ b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/BundleDeploymentTest.java
@@ -22,7 +22,6 @@
 import java.io.InputStream;
 import java.util.concurrent.Callable;
 
-import org.apache.commons.httpclient.HttpException;
 import org.apache.sling.ide.eclipse.core.ISlingLaunchpadServer;
 import org.apache.sling.ide.test.impl.helpers.DefaultJavaVMInstall;
 import org.apache.sling.ide.test.impl.helpers.DisableDebugStatusHandlers;
@@ -99,13 +98,13 @@
         project.configureAsJavaProject(slingApiDep, servletApiDep);
 
         // create DS component class
-        InputStream simpleServlet = getClass().getResourceAsStream("SimpleServlet.java.v1.txt");
-        project.createOrUpdateFile(Path.fromPortableString("src/example/SimpleServlet.java"), simpleServlet);
-        
+        try (InputStream simpleServlet = getClass().getResourceAsStream("SimpleServlet.java.v1.txt")) {
+        	project.createOrUpdateFile(Path.fromPortableString("src/example/SimpleServlet.java"), simpleServlet);
+        }
         // create DS component descriptor
-        InputStream servletDescriptor = getClass().getResourceAsStream("SimpleServlet.xml");
-        project.createOrUpdateFile(Path.fromPortableString("src/OSGI-INF/SimpleServlet.xml"), servletDescriptor);
-
+        try (InputStream servletDescriptor = getClass().getResourceAsStream("SimpleServlet.xml")) {
+        	project.createOrUpdateFile(Path.fromPortableString("src/OSGI-INF/SimpleServlet.xml"), servletDescriptor);
+        }
         // create manifest
         OsgiBundleManifest manifest = OsgiBundleManifest.symbolicName("test.bundle001").version("1.0.0.SNAPSHOT")
                 .name("Test bundle").serviceComponent("OSGI-INF/SimpleServlet.xml")
@@ -132,7 +131,7 @@
         Poller poller = new Poller();
         poller.pollUntil(new Callable<Void>() {
             @Override
-            public Void call() throws HttpException, IOException {
+            public Void call() throws IOException, InterruptedException {
                 repo.assertGetIsSuccessful("simple-servlet", "Version 1");
                 return null;
             }
@@ -144,12 +143,12 @@
         });
 
         // update DS component class
-        InputStream simpleServlet2 = getClass().getResourceAsStream("SimpleServlet.java.v2.txt");
-        project.createOrUpdateFile(Path.fromPortableString("src/example/SimpleServlet.java"), simpleServlet2);
-
+        try (InputStream simpleServlet2 = getClass().getResourceAsStream("SimpleServlet.java.v2.txt")) {
+        	project.createOrUpdateFile(Path.fromPortableString("src/example/SimpleServlet.java"), simpleServlet2);
+        }
         poller.pollUntil(new Callable<Void>() {
             @Override
-            public Void call() throws HttpException, IOException {
+            public Void call() throws InterruptedException, IOException {
                 repo.assertGetIsSuccessful("simple-servlet", "Version 2");
                 return null;
             }
diff --git a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/ContentDeploymentTest.java b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/ContentDeploymentTest.java
index 68832cc..f3e7a60 100644
--- a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/ContentDeploymentTest.java
+++ b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/ContentDeploymentTest.java
@@ -27,13 +27,12 @@
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 import java.util.concurrent.Callable;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.URIException;
 import org.apache.sling.ide.test.impl.helpers.DisableDebugStatusHandlers;
 import org.apache.sling.ide.test.impl.helpers.ExternalSlingLaunchpad;
 import org.apache.sling.ide.test.impl.helpers.FailOnUnsuccessfulEventsRule;
@@ -79,7 +78,7 @@
     public DisableDebugStatusHandlers disableDebugHandlers = new DisableDebugStatusHandlers();
 
     @Test
-    public void deployFile() throws CoreException, InterruptedException, URIException, HttpException, IOException {
+    public void deployFile() throws CoreException, InterruptedException, IOException {
 
         wstServer.waitForServerToStart();
 
@@ -105,7 +104,7 @@
         Poller poller = new Poller();
         poller.pollUntil(new Callable<Void>() {
             @Override
-            public Void call() throws HttpException, IOException {
+            public Void call() throws InterruptedException, IOException {
                 repo.assertGetIsSuccessful("test/hello.txt", "hello, world");
                 return null;
             }
@@ -117,7 +116,7 @@
         // verify that file is updated
         poller.pollUntil(new Callable<Void>() {
             @Override
-            public Void call() throws HttpException, IOException {
+            public Void call() throws InterruptedException, IOException {
                 repo.assertGetIsSuccessful("test/hello.txt", "goodbye, world");
                 return null;
             }
@@ -129,7 +128,7 @@
         // verify that file is deleted
         poller.pollUntil(new Callable<Void>() {
             @Override
-            public Void call() throws HttpException, IOException {
+            public Void call() throws InterruptedException, IOException {
                 repo.assertGetReturns404("test/hello.txt");
                 return null;
             }
@@ -157,7 +156,7 @@
         // create filter.xml
         project.createVltFilterWithRoots("/test");
         project.createOrUpdateFile(Path.fromPortableString("jcr_root/test/hello.txt"), new ByteArrayInputStream(
-                "hello, world".getBytes()));
+                "hello, world".getBytes(StandardCharsets.US_ASCII)));
 
         // verifications
         final RepositoryAccessor repo = new RepositoryAccessor(config);
@@ -167,7 +166,7 @@
         // change node type to sling:Folder
         InputStream contentXml = getClass().getResourceAsStream("sling-folder-nodetype.xml");
         project.createOrUpdateFile(Path.fromPortableString("jcr_root/test/.content.xml"), contentXml);
-
+     
         // verifications (2)
         assertThatNode(repo, poller, "/test",
                 allOf(hasPath("/test"), hasPrimaryType("sling:Folder"), hasChildrenCount(1)));
diff --git a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/VerboseStandardLogger.java b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/VerboseStandardLogger.java
new file mode 100644
index 0000000..f6af88c
--- /dev/null
+++ b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/VerboseStandardLogger.java
@@ -0,0 +1,40 @@
+ /*
+ * 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.ide.test.impl;
+
+import java.time.Instant;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+
+import org.apache.sling.ide.eclipse.core.logger.LogSubscriber;
+import org.osgi.service.component.annotations.Component;
+
+/**
+ * Emits all log messages to the standard output.
+ */
+@Component()
+public class VerboseStandardLogger implements LogSubscriber {
+
+	@Override
+	public void log(Severity severity, String message, Throwable t) {
+		// only some severity
+		System.out.println("[" + Thread.currentThread().getName() + "] " + DateTimeFormatter.ISO_LOCAL_TIME.format(LocalTime.now())
+                +" : " + message);
+        if (t != null)
+            t.printStackTrace(System.out);
+	}
+}
diff --git a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/ExternalSlingLaunchpad.java b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/ExternalSlingLaunchpad.java
index 7f49eee..643d3a8 100644
--- a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/ExternalSlingLaunchpad.java
+++ b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/ExternalSlingLaunchpad.java
@@ -16,23 +16,33 @@
  */
 package org.apache.sling.ide.test.impl.helpers;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.lang.reflect.Type;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpClient.Version;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.net.http.HttpResponse.BodyHandlers;
+import java.nio.charset.StandardCharsets;
+import java.time.Duration;
 import java.util.ArrayList;
+import java.util.Base64;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
-import org.apache.commons.httpclient.Credentials;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.UsernamePasswordCredentials;
-import org.apache.commons.httpclient.auth.AuthScope;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.io.IOUtils;
 import org.junit.rules.ExternalResource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.gson.Gson;
+import com.google.gson.annotations.SerializedName;
+import com.google.gson.reflect.TypeToken;
 import com.google.gson.stream.JsonReader;
 
 import junit.framework.AssertionFailedError;
@@ -42,7 +52,7 @@
     private static final Pattern STARTLEVEL_JSON_SNIPPET = Pattern.compile("\"systemStartLevel\":(\\d+)");
     private static final int EXPECTED_START_LEVEL = 30;
     private static final long MAX_WAIT_TIME_MS = TimeUnit.MINUTES.toMillis(1);
-    private final Logger logger = LoggerFactory.getLogger(getClass());
+    private static final Logger logger = LoggerFactory.getLogger(ExternalSlingLaunchpad.class);
 
     private final LaunchpadConfig config;
 
@@ -53,29 +63,30 @@
     @Override
     protected void before() throws Throwable {
 
-        Credentials creds = new UsernamePasswordCredentials(config.getUsername(), config.getPassword());
-
-        HttpClient client = new HttpClient();
-        client.getState().setCredentials(new AuthScope(config.getHostname(), config.getPort()), creds);
-        client.getParams().setAuthenticationPreemptive(true);
+    	String authorizationHeaderValue = "Basic " + Base64.getEncoder()
+                .encodeToString((config.getUsername() + ":" + config.getPassword()).getBytes(StandardCharsets.UTF_8));
+        HttpClient client = HttpClient.newBuilder()
+                .version(Version.HTTP_1_1)
+                .connectTimeout(Duration.ofSeconds(10))
+                .build();
 
         long cutoff = System.currentTimeMillis() + MAX_WAIT_TIME_MS;
 
-        List<SlingReadyRule> rules = new ArrayList<>();
-        rules.add(new StartLevelSlingReadyRule(client));
-        rules.add(new ActiveBundlesSlingReadyRule(client));
-        rules.add(new RepositoryAvailableReadyRule(client));
+        List<ServerReadyGate> gates = new ArrayList<>();
+        gates.add(new StartLevelGate(client, config.getUrl(), authorizationHeaderValue));
+        gates.add(new ActiveBundlesGate(client, config.getUrl(), authorizationHeaderValue));
+        gates.add(new RepositoryAvailableGate(client, config.getUrl(), authorizationHeaderValue));
         
         logger.debug("Starting check");
 
-        for (SlingReadyRule rule : rules) {
-            logger.debug("Checking {}", rule);
+        for (ServerReadyGate gate : gates) {
+            logger.debug("Checking {}", gate);
             while (true) {
-                if (rule.evaluate()) {
-                    logger.debug("Rule {} succeeded.", rule);
+                if (gate.evaluate()) {
+                    logger.debug("Gate {} passed.", gate);
                     break;
                 }
-                assertTimeout(cutoff);
+                assertTimeout(cutoff, gate);
                 Thread.sleep(100);
             }
         }
@@ -83,42 +94,44 @@
         logger.debug("Checks complete");
     }
 
-    private void assertTimeout(long cutoff) throws AssertionFailedError {
-        logger.debug("Checking for timeout, current {}, cutoff {}", System.currentTimeMillis(), cutoff);
+    private void assertTimeout(long cutoff, ServerReadyGate gate) throws AssertionFailedError {
+        logger.debug("Checking for timeout of gate {}, current {}, cutoff {}", gate, System.currentTimeMillis(), cutoff);
         if (System.currentTimeMillis() > cutoff) {
-            throw new AssertionFailedError("Sling launchpad did not start within " + MAX_WAIT_TIME_MS + " milliseconds");
+            throw new AssertionFailedError("Sling server did not pass " + gate.getClass().getName() + " within " + MAX_WAIT_TIME_MS + " milliseconds. It was failing with " + gate.getFailureMessage() );
         }
     }
 
-    private interface SlingReadyRule {
+    private interface ServerReadyGate {
 
         boolean evaluate() throws Exception;
+        String getFailureMessage();
     }
 
-    private class StartLevelSlingReadyRule implements SlingReadyRule {
+    static class StartLevelGate implements ServerReadyGate {
 
         private final HttpClient client;
-        private final GetMethod httpMethod;
+        private final HttpRequest request;
+        private int startLevel;
 
-        public StartLevelSlingReadyRule(HttpClient client) {
+        public StartLevelGate(HttpClient client, URI baseUrl, String authorizationHeaderValue) {
             this.client = client;
-            httpMethod = new GetMethod(config.getUrl() + "system/console/vmstat");
+            request = HttpRequest.newBuilder()
+            		.uri(baseUrl.resolve("system/console/vmstat"))
+            		.header("Authorization", authorizationHeaderValue)
+            		.build();
         }
 
         @Override
         public boolean evaluate() throws Exception {
 
-            int status = client.executeMethod(httpMethod);
-            logger.debug("vmstat http call got return code {}", status);
+            HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
+            logger.debug("vmstat http call got return code {}", response.statusCode());
 
-            if (status == 200) {
+            if (response.statusCode() == 200) {
 
-                String responseBody = IOUtils.toString(httpMethod.getResponseBodyAsStream(),
-                        httpMethod.getResponseCharSet());
-
-                Matcher m = STARTLEVEL_JSON_SNIPPET.matcher(responseBody);
+                Matcher m = STARTLEVEL_JSON_SNIPPET.matcher(response.body());
                 if (m.find()) {
-                    int startLevel = Integer.parseInt(m.group(1));
+                    startLevel = Integer.parseInt(m.group(1));
                     logger.debug("vmstat http call got startLevel {}", startLevel);
                     if (startLevel >= EXPECTED_START_LEVEL) {
                         logger.debug("current startLevel {}  >= {}, we are done here", startLevel, EXPECTED_START_LEVEL);
@@ -129,28 +142,43 @@
             }
             return false;
         }
+
+		@Override
+		public String getFailureMessage() {
+			return "Start Level " + startLevel + " was below expected level " + EXPECTED_START_LEVEL;
+		}
+        
     }
 
-    private class ActiveBundlesSlingReadyRule implements SlingReadyRule {
+    static class ActiveBundlesGate implements ServerReadyGate {
         private final HttpClient client;
-        private final GetMethod httpMethod;
+        private final HttpRequest request;
+        private String failureMessage;
 
-        public ActiveBundlesSlingReadyRule(HttpClient client) {
-            this.client = client;
-            httpMethod = new GetMethod(config.getUrl() + "system/console/bundles.json");
+        public ActiveBundlesGate(HttpClient client, URI baseUrl, String authorizationHeaderValue) {
+        	this.client = client;
+            request = HttpRequest.newBuilder()
+            		.uri(baseUrl.resolve("system/console/bundles.json"))
+            		.header("Authorization", authorizationHeaderValue)
+            		.build();
         }
 
         @Override
         public boolean evaluate() throws Exception {
-            int status = client.executeMethod(httpMethod);
-            logger.debug("bundles http call got return code {}", status);
+        	HttpResponse<InputStream> response = client.send(request, BodyHandlers.ofInputStream());
+            logger.debug("bundles http call got return code {}", response.statusCode());
             
-            if ( status != 200) {
+            if (response.statusCode() != 200) {
+            	failureMessage = request.toString() + " returned " + response.statusCode();
                 return false;
             }
 
-            try (JsonReader jsonReader = new JsonReader(
-                    new InputStreamReader(httpMethod.getResponseBodyAsStream(), httpMethod.getResponseCharSet()))) {
+            return areAllBundlesStarted(response.body());
+        }
+
+		boolean areAllBundlesStarted(InputStream inputJson) throws IOException {
+			try (JsonReader jsonReader = new JsonReader(
+                    new InputStreamReader(inputJson, StandardCharsets.UTF_8))) {
                 jsonReader.beginObject();
                 while (jsonReader.hasNext()) {
                     String name = jsonReader.nextName();
@@ -159,43 +187,99 @@
                         int total = jsonReader.nextInt();
                         int active = jsonReader.nextInt();
                         int fragment = jsonReader.nextInt();
+                        jsonReader.nextInt();
+                        jsonReader.nextInt();
                         logger.debug("bundle http call status: total = {}, active = {}, fragment = {}", total, active, fragment);
-
                         if (total == active + fragment) {
                             logger.debug("All bundles are started, we are done here");
                             return true;
-                        } else {
-                            return false;
                         }
+                        jsonReader.endArray();
+                    } else if (name.equals("data")) {
+                    	Type listType = new TypeToken<List<BundleMetadata>>() {}.getType();
+                    	List<BundleMetadata> bundles = new Gson().fromJson(jsonReader, listType);
+                    	failureMessage = "The following bundles were not started: " + bundles.stream()
+                    		.filter(b -> (b.state != BundleMetadata.State.ACTIVE && !b.isFragment))
+							.map(b -> b.symbolicName + " (" + b.id + ")")
+							.collect(Collectors.joining(", "));
                     } else {
-                        jsonReader.skipValue();
+                    	jsonReader.skipValue();
                     }
                 }
             }
-            return false;
-        }
-    }
-    
-    private class RepositoryAvailableReadyRule implements SlingReadyRule {
-        private final HttpClient client;
+			return false;
+		}
+        
 
-        public RepositoryAvailableReadyRule(HttpClient client) {
+		@Override
+		public String getFailureMessage() {
+			return failureMessage;
+		}
+    }
+
+    protected static final class BundleMetadata {
+		private String id;
+		@SerializedName("fragment")
+		private boolean isFragment;
+		private String name;
+		private String symbolicName;
+		@SerializedName("stateRaw")
+		private State state; // https://github.com/apache/felix-dev/blob/de64445723e33c400d4e851f2c2a874beb923119/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BundlesServlet.java#L438
+		
+		// https://docs.osgi.org/javadoc/osgi.core/8.0.0/org/osgi/framework/Bundle.html#getState--
+		// https://docs.osgi.org/javadoc/osgi.core/8.0.0/constant-values.html#org.osgi.framework.Bundle.ACTIVE
+		enum State {
+			@SerializedName("1")
+			UNINSTALLED,
+	
+			@SerializedName("2")
+			INSTALLED,
+	
+	        @SerializedName("4")
+			RESOLVED,
+	
+	        @SerializedName("8")
+			STARTING,
+	
+	        @SerializedName("16")
+			STOPPING,
+			@SerializedName("32")
+			ACTIVE;
+		}
+    }
+
+    static class RepositoryAvailableGate implements ServerReadyGate {
+        private final HttpClient client;
+        private final URI baseUrl;
+        private final String authorizationHeaderValue;
+
+        public RepositoryAvailableGate(HttpClient client, URI baseUrl, String authorizationHeaderValue) {
             this.client = client;
+            this.baseUrl = baseUrl;
+            this.authorizationHeaderValue = authorizationHeaderValue;
         }
         
         @Override
         public boolean evaluate() throws Exception {
             
-            for ( String prefix: new String[] { "server", "crx/server"} ) {
-                GetMethod get = new GetMethod(config.getUrl() + prefix + "/default/jcr:root/content");
+            for (String prefix: new String[] { "server", "crx/server"} ) {
+            	HttpRequest request = HttpRequest.newBuilder()
+                		.uri(baseUrl.resolve(prefix+"/default/jcr:root/content"))
+                		.header("Authorization", authorizationHeaderValue)
+                		.build();
                 
-                int status = client.executeMethod(get);
-                logger.debug("repository check call at entry point {}  got status {}", prefix, status);
-                if ( status == 200 ) 
-                    return true;
+                HttpResponse<Void> response = client.send(request, BodyHandlers.discarding());
+                logger.debug("repository check call at entry point {}  got status {}", prefix, response.statusCode());
+                if (response.statusCode() == 200 ) {
+                	return true;
+                }
             }
-            
             return false;
         }
+
+		@Override
+		public String getFailureMessage() {
+			return "WebDAV endpoint never returned a 200 status for repository root";
+		}
     }
 }
diff --git a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/HasFileMatcher.java b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/HasFileMatcher.java
index 7959edd..a3f79e7 100644
--- a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/HasFileMatcher.java
+++ b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/HasFileMatcher.java
@@ -21,7 +21,6 @@
 import java.io.InputStream;
 import java.util.Arrays;
 
-import org.apache.commons.io.IOUtils;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
@@ -76,7 +75,7 @@
         ByteArrayOutputStream out = new ByteArrayOutputStream();
 
         try ( InputStream in = file.getContents()) {
-            IOUtils.copy(in, out);
+            in.transferTo(out);
         } catch (CoreException | IOException e) {
             throw new RuntimeException(e);
         }
diff --git a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/LaunchpadConfig.java b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/LaunchpadConfig.java
index c2ce411..035745a 100644
--- a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/LaunchpadConfig.java
+++ b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/LaunchpadConfig.java
@@ -54,10 +54,9 @@
         return "/";
     }
 
-    public String getUrl() {
+    public URI getUrl() {
         try {
-            return new URI(getProtocol(), null, getHostname(), getPort(), getContextPath(), null, null)
-                    .toString();
+            return new URI(getProtocol(), null, getHostname(), getPort(), getContextPath(), null, null);
         } catch (URISyntaxException e) {
             throw new RuntimeException(e);
         }
diff --git a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/ProjectAdapter.java b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/ProjectAdapter.java
index 483470b..7d705bd 100644
--- a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/ProjectAdapter.java
+++ b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/ProjectAdapter.java
@@ -27,7 +27,6 @@
 import java.util.Set;
 import java.util.jar.Manifest;
 
-import org.apache.commons.io.IOUtils;
 import org.apache.maven.artifact.Artifact;
 import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IFile;
@@ -137,7 +136,11 @@
                 file.create(contents, true, new NullProgressMonitor());
             }
         } finally {
-            IOUtils.closeQuietly(contents);
+            try {
+				contents.close();
+			} catch (IOException e) {
+				// ignore
+			}
         }
 
     }
diff --git a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/RepositoryAccessor.java b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/RepositoryAccessor.java
index a36dd92..1a39259 100644
--- a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/RepositoryAccessor.java
+++ b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/RepositoryAccessor.java
@@ -20,7 +20,14 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.io.InputStream;
+import java.net.http.HttpClient;
+import java.net.http.HttpClient.Version;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.net.http.HttpResponse.BodyHandlers;
+import java.nio.charset.StandardCharsets;
+import java.time.Duration;
+import java.util.Base64;
 
 import javax.jcr.Credentials;
 import javax.jcr.Node;
@@ -28,12 +35,6 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.UsernamePasswordCredentials;
-import org.apache.commons.httpclient.auth.AuthScope;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.io.IOUtils;
 import org.apache.jackrabbit.util.Text;
 import org.apache.sling.ide.jcr.RepositoryUtils;
 import org.apache.sling.ide.transport.RepositoryInfo;
@@ -48,47 +49,43 @@
 
     private final LaunchpadConfig config;
     private final HttpClient client;
+    private final String encodedAuth;
     private Repository repository;
     private Credentials credentials;
 
     public RepositoryAccessor(LaunchpadConfig config) {
         this.config = config;
-
-        client = new HttpClient();
-        client.getParams().setAuthenticationPreemptive(true);
-        client.getState().setCredentials(new AuthScope(config.getHostname(), config.getPort()),
-                new UsernamePasswordCredentials(config.getUsername(), config.getPassword()));
+        encodedAuth = Base64.getEncoder()
+                .encodeToString((config.getUsername() + ":" + config.getPassword()).getBytes(StandardCharsets.UTF_8));
+        client = HttpClient.newBuilder()
+                .version(Version.HTTP_1_1)
+                .connectTimeout(Duration.ofSeconds(10))
+                .build();
     }
 
-    public void assertGetIsSuccessful(String path, String expectedResult) throws HttpException, IOException {
+    HttpRequest.Builder customizeRequest(HttpRequest.Builder builder) {
+    	return builder.header("Authorization", "Basic " + encodedAuth);
+    }
 
-        GetMethod m = new GetMethod(config.getUrl() + path);
-        try {
-            int result = client.executeMethod(m);
-
-            assertThat("Unexpected status call for " + m.getURI(), result, CoreMatchers.equalTo(200));
-
-            try ( InputStream input = m.getResponseBodyAsStream() ) {
-                String responseBody = IOUtils.toString(input, m.getRequestCharSet());
+    public void assertGetIsSuccessful(String path, String expectedResult) throws IOException, InterruptedException {
+    	HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
+    	         .uri(config.getUrl().resolve(path));
+    	HttpRequest request = customizeRequest(requestBuilder).build();
+        HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
+        assertThat("Unexpected status call for " + request, response.statusCode(), CoreMatchers.equalTo(200));
     
-                assertThat("Unexpected response for " + m.getURI(), responseBody,
-                        CoreMatchers.equalTo(expectedResult));
-            }
-        } finally {
-            m.releaseConnection();
-        }
+        assertThat("Unexpected response for " + request, response.body(),
+                    CoreMatchers.equalTo(expectedResult));
+        
     }
 
-    public void assertGetReturns404(String path) throws HttpException, IOException {
+    public void assertGetReturns404(String path) throws IOException, InterruptedException {
 
-        GetMethod m = new GetMethod(config.getUrl() + path);
-        try {
-            int result = client.executeMethod(m);
-
-            assertThat("Unexpected status call for " + m.getURI(), result, CoreMatchers.equalTo(404));
-        } finally {
-            m.releaseConnection();
-        }
+    	HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
+   	         .uri(config.getUrl().resolve(path));
+    	HttpRequest request = customizeRequest(requestBuilder).build();
+        HttpResponse<Void> response = client.send(request, BodyHandlers.discarding());
+        assertThat("Unexpected status call for " + request, response.statusCode(), CoreMatchers.equalTo(404));
     }
 
     public void tryDeleteResource(String path) throws RepositoryException {
diff --git a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/UninstallBundleRule.java b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/UninstallBundleRule.java
index 92fbb24..1070cd4 100644
--- a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/UninstallBundleRule.java
+++ b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/helpers/UninstallBundleRule.java
@@ -16,6 +16,8 @@
  */
 package org.apache.sling.ide.test.impl.helpers;
 
+import java.io.IOException;
+
 import org.apache.sling.ide.osgi.OsgiClient;
 import org.apache.sling.ide.osgi.OsgiClientException;
 import org.apache.sling.ide.test.impl.Activator;
@@ -39,14 +41,13 @@
     
     @Override
     protected void after() {
-        try {
-            RepositoryInfo repositoryInfo = new RepositoryInfo(config.getUsername(), config.getPassword(), config.getUrl());
-            OsgiClient client = Activator.getDefault().getOsgiClientFactory().createOsgiClient(repositoryInfo);
+    	RepositoryInfo repositoryInfo = new RepositoryInfo(config.getUsername(), config.getPassword(), config.getUrl());
+        try (OsgiClient client = Activator.getDefault().getOsgiClientFactory().createOsgiClient(repositoryInfo)) {
             client.uninstallBundle(bundleSymbolicName);
             new Poller().pollUntilTrue(() -> {
                return client.getBundleVersion(bundleSymbolicName) == null; 
             });
-        } catch (OsgiClientException e) {
+        } catch (OsgiClientException|IOException e) {
             throw new RuntimeException(e);
         } catch (InterruptedException e) {
             Thread.currentThread().interrupt();
diff --git a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/ui/sightly/SightlyAutocompletionTest.java b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/ui/sightly/SightlyAutocompletionTest.java
index 60263e2..151a838 100644
--- a/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/ui/sightly/SightlyAutocompletionTest.java
+++ b/eclipse/eclipse-test/src/org/apache/sling/ide/test/impl/ui/sightly/SightlyAutocompletionTest.java
@@ -35,6 +35,7 @@
 import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEclipseEditor;
 import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
 import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
+import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
 import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
@@ -57,6 +58,8 @@
         if ( bot.activeView().getTitle().equals("Welcome") ) {
             bot.activeView().close();
         }
+        // to prevent issues due to missing keyboard layouts: https://wiki.eclipse.org/SWTBot/Keyboard_Layouts
+        SWTBotPreferences.KEYBOARD_LAYOUT = "EN_US";
     }    
 
     @Test
@@ -149,12 +152,13 @@
             prepareEditor(editor);
 
             // gather proposals
-            List<String> proposals = editor.getAutoCompleteProposals("");
-            
-            // close editor, otherwise cleanup can hang due to the dialog
-            editor.saveAndClose();
-
-            return proposals;
+            try {
+            	List<String> proposals = editor.getAutoCompleteProposals("");
+            	return proposals;
+            } finally {
+            	// close editor, otherwise cleanup can hang due to the dialog
+                editor.saveAndClose();
+            }
         }
 
         /**
diff --git a/eclipse/eclipse-ui/.settings/org.eclipse.pde.ds.annotations.prefs b/eclipse/eclipse-ui/.settings/org.eclipse.pde.ds.annotations.prefs
new file mode 100644
index 0000000..38f9eec
--- /dev/null
+++ b/eclipse/eclipse-ui/.settings/org.eclipse.pde.ds.annotations.prefs
@@ -0,0 +1,7 @@
+dsVersion=V1_3
+eclipse.preferences.version=1
+enabled=true
+generateBundleActivationPolicyLazy=true
+path=OSGI-INF
+validationErrorLevel=error
+validationErrorLevel.missingImplicitUnbindMethod=error
diff --git a/eclipse/eclipse-ui/META-INF/MANIFEST.MF b/eclipse/eclipse-ui/META-INF/MANIFEST.MF
index 4d5a614..19b9b1d 100644
--- a/eclipse/eclipse-ui/META-INF/MANIFEST.MF
+++ b/eclipse/eclipse-ui/META-INF/MANIFEST.MF
@@ -5,16 +5,11 @@
 Bundle-SymbolicName: org.apache.sling.ide.eclipse-ui;singleton:=true
 Bundle-Activator: org.apache.sling.ide.eclipse.ui.internal.Activator
 Bundle-Version: 1.2.3.qualifier
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-17
 Bundle-ClassPath: .,
  lib/decentxml-1.4.jar
 Import-Package: javax.jcr,
  javax.jcr.nodetype,
- org.apache.commons.httpclient;version="3.1.0",
- org.apache.commons.httpclient.auth;version="3.1.0",
- org.apache.commons.httpclient.methods;version="3.1.0",
- org.apache.commons.httpclient.methods.multipart;version="3.1.0",
- org.apache.commons.httpclient.params;version="3.1.0",
  org.apache.commons.io;version="2.0.1",
  org.apache.jackrabbit.util,
  org.apache.jackrabbit.vault.fs.io;version="2.4.0",
@@ -27,36 +22,26 @@
  org.apache.sling.ide.serialization,
  org.apache.sling.ide.sync.content,
  org.apache.sling.ide.transport,
- org.apache.sling.ide.util,
  org.eclipse.core.commands,
- org.eclipse.core.commands.operations,
  org.eclipse.core.expressions,
  org.eclipse.core.resources,
  org.eclipse.core.resources.mapping,
  org.eclipse.core.runtime;version="3.4.0",
  org.eclipse.core.runtime.jobs,
  org.eclipse.debug.core,
- org.eclipse.debug.core.model,
  org.eclipse.debug.internal.ui,
- org.eclipse.debug.internal.ui.actions,
  org.eclipse.debug.ui,
  org.eclipse.debug.ui.sourcelookup,
  org.eclipse.jdt.core,
  org.eclipse.jdt.debug.ui.launchConfigurations,
- org.eclipse.jdt.internal.ui.javaeditor,
- org.eclipse.jdt.launching,
- org.eclipse.jdt.ui.actions,
  org.eclipse.jface.action,
  org.eclipse.jface.dialogs,
  org.eclipse.jface.operation,
  org.eclipse.jface.preference,
  org.eclipse.jface.resource,
- org.eclipse.jface.text,
  org.eclipse.jface.viewers,
  org.eclipse.jface.window,
  org.eclipse.jface.wizard,
- org.eclipse.jst.common.project.facet.core,
- org.eclipse.jst.server.core,
  org.eclipse.swt,
  org.eclipse.swt.events,
  org.eclipse.swt.layout,
@@ -66,35 +51,24 @@
  org.eclipse.ui.dialogs,
  org.eclipse.ui.forms,
  org.eclipse.ui.forms.widgets,
- org.eclipse.wst.common.project.facet.core,
  org.eclipse.wst.server.core,
- org.eclipse.wst.server.core.model,
- org.eclipse.wst.server.core.util,
  org.eclipse.wst.server.ui,
  org.eclipse.wst.server.ui.editor,
  org.eclipse.wst.server.ui.internal,
  org.eclipse.wst.server.ui.wizard,
  org.osgi.framework,
- org.osgi.service.component,
- org.osgi.service.event;version="1.3.0",
  org.osgi.util.tracker;version="1.5.0"
 Bundle-ActivationPolicy: lazy
-Require-Bundle: org.eclipse.wst.common.project.facet.ui,
- org.eclipse.ui.navigator;bundle-version="3.5.101",
- org.eclipse.ui.views;bundle-version="3.6.0",
- org.eclipse.ui,
+Require-Bundle: org.eclipse.ui.navigator;bundle-version="3.5.101",
  org.eclipse.core.resources,
  org.eclipse.ui.ide,
  org.eclipse.core.runtime,
  org.eclipse.ui.console,
  org.eclipse.jdt.ui,
  org.apache.sling.ide.eclipse-core,
- org.eclipse.ui.views.properties.tabbed,
- org.eclipse.ui.workbench,
- org.eclipse.jface.text,
- org.eclipse.ui.editors,
- org.eclipse.swt
-Service-Component: OSGI-INF/*.xml
+ org.eclipse.ui.views.properties.tabbed
+Service-Component: ${tycho.ds.path}/org.apache.sling.ide.eclipse.ui.internal.console.SlingConsoleEventListener.xml,
+ OSGI-INF/*.xml
 Export-Package: org.apache.sling.ide.eclipse.ui,
  org.apache.sling.ide.eclipse.ui.browser,
  org.apache.sling.ide.eclipse.ui.console,
diff --git a/eclipse/eclipse-ui/META-INF/NOTICE b/eclipse/eclipse-ui/META-INF/NOTICE
index 74b6e0e..6144569 100644
--- a/eclipse/eclipse-ui/META-INF/NOTICE
+++ b/eclipse/eclipse-ui/META-INF/NOTICE
@@ -1,6 +1,6 @@
 
 Sling IDE Tools: Eclipse UI
-Copyright 2007-2014 The Apache Software Foundation
+Copyright 2007-2022 The Apache Software Foundation
 
 Apache Sling is based on source code originally developed 
 by Day Software (http://www.day.com/).
diff --git a/eclipse/eclipse-ui/OSGI-INF/SlingConsoleEventListener.xml b/eclipse/eclipse-ui/OSGI-INF/SlingConsoleEventListener.xml
deleted file mode 100644
index 3c59aed..0000000
--- a/eclipse/eclipse-ui/OSGI-INF/SlingConsoleEventListener.xml
+++ /dev/null
@@ -1,24 +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.
--->
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
-    <implementation class="org.apache.sling.ide.eclipse.ui.internal.console.SlingConsoleEventListener" />
-    <service>
-        <provide interface="org.osgi.service.event.EventHandler" />
-    </service>
-    <property name="event.topics" value="org/apache/sling/ide/transport" />
-</scr:component>
diff --git a/eclipse/eclipse-ui/pom.xml b/eclipse/eclipse-ui/pom.xml
index fc16640..9e71ed3 100644
--- a/eclipse/eclipse-ui/pom.xml
+++ b/eclipse/eclipse-ui/pom.xml
@@ -78,6 +78,10 @@
                 </execution>
             </executions>
         </plugin>
+        <plugin>
+			<groupId>org.eclipse.tycho</groupId>
+			<artifactId>tycho-ds-plugin</artifactId>
+		</plugin>
     </plugins>
   </build>
 </project>
diff --git a/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/actions/JcrNodeFormatHandler.java b/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/actions/JcrNodeFormatHandler.java
index 043c324..36f2020 100644
--- a/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/actions/JcrNodeFormatHandler.java
+++ b/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/actions/JcrNodeFormatHandler.java
@@ -16,12 +16,9 @@
  */
 package org.apache.sling.ide.eclipse.ui.actions;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
 import org.apache.jackrabbit.vault.fs.io.DocViewFormat;
-import org.apache.jackrabbit.vault.util.xml.serialize.XMLSerializer;
 import org.apache.sling.ide.eclipse.ui.internal.Activator;
 import org.apache.sling.ide.eclipse.ui.internal.SelectionUtils;
 import org.apache.sling.ide.eclipse.ui.nav.model.JcrNode;
@@ -38,10 +35,6 @@
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.ui.handlers.HandlerUtil;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
 
 public class JcrNodeFormatHandler extends AbstractHandler {
     
@@ -66,15 +59,11 @@
             @Override
             protected IStatus run(IProgressMonitor monitor) {
                 try {
-                    ByteArrayOutputStream out = new ByteArrayOutputStream();
-                    XMLSerializer serializer = new XMLSerializer(out, new DocViewFormat().getXmlOutputFormat());
-                    XMLReader reader = XMLReaderFactory.createXMLReader();
-                    reader.setContentHandler(serializer);
-                    reader.setDTDHandler(serializer);
-                    reader.parse(new InputSource(resource.getContents()));
-                    
-                    resource.setContents(new ByteArrayInputStream(out.toByteArray()), false, true, monitor);
-                } catch (SAXException | IOException | CoreException e) {
+                	DocViewFormat docViewFormat = new DocViewFormat();
+                	if (docViewFormat.format(resource.getFullPath().toFile(), true)) {
+                		resource.refreshLocal(0, monitor);
+                	}
+                } catch (IOException | CoreException e) {
                     return new Status(IStatus.ERROR, Activator.PLUGIN_ID, NLS.bind("Failed formatting {0}", resourcePath), e);
                 }
                 
diff --git a/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/Activator.java b/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/Activator.java
index 0fdec2d..6560cb7 100644
--- a/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/Activator.java
+++ b/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/Activator.java
@@ -18,7 +18,6 @@
 
 import org.apache.sling.ide.artifacts.EmbeddedArtifactLocator;
 import org.apache.sling.ide.eclipse.core.Preferences;
-import org.apache.sling.ide.eclipse.core.ServiceUtil;
 import org.apache.sling.ide.filter.FilterLocator;
 import org.apache.sling.ide.log.Logger;
 import org.apache.sling.ide.osgi.OsgiClientFactory;
@@ -29,21 +28,11 @@
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.eclipse.ui.preferences.ScopedPreferenceStore;
 import org.osgi.framework.BundleContext;
-import org.osgi.service.event.EventAdmin;
-import org.osgi.util.tracker.ServiceTracker;
 
 public class Activator extends AbstractUIPlugin {
 
     public static final String PLUGIN_ID = "org.apache.sling.ide.eclipse-core";
     public static Activator INSTANCE;
-
-    private ServiceTracker<SerializationManager, SerializationManager> serializationManager;
-    private ServiceTracker<FilterLocator, FilterLocator> filterLocator;
-    private ServiceTracker<EventAdmin, EventAdmin> eventAdmin;
-    private ServiceTracker<EmbeddedArtifactLocator, EmbeddedArtifactLocator> artifactLocator;
-    private ServiceTracker<OsgiClientFactory, OsgiClientFactory> osgiClientFactory;
-    private ServiceTracker<Logger, Logger> tracer;
-    private ServiceTracker<SyncCommandFactory, SyncCommandFactory> commandFactory;
     
     private ScopedPreferenceStore preferenceStore;
     
@@ -58,73 +47,38 @@
     public void start(BundleContext context) throws Exception {
         super.start(context);
 
-        serializationManager = new ServiceTracker<>(context, SerializationManager.class, null);
-        serializationManager.open();
-
-        filterLocator = new ServiceTracker<>(context, FilterLocator.class, null);
-        filterLocator.open();
-
-        eventAdmin = new ServiceTracker<>(context, EventAdmin.class, null);
-        eventAdmin.open();
-
-        artifactLocator = new ServiceTracker<>(context,
-                EmbeddedArtifactLocator.class, null);
-        artifactLocator.open();
-
-        osgiClientFactory = new ServiceTracker<>(context, OsgiClientFactory.class,
-                null);
-        osgiClientFactory.open();
-
-        tracer = new ServiceTracker<>(context, Logger.class, null);
-        tracer.open();
-        
-        commandFactory = new ServiceTracker<>(context, SyncCommandFactory.class, null);
-        commandFactory.open();        
-
         INSTANCE = this;
     }
 
     @Override
     public void stop(BundleContext context) throws Exception {
         INSTANCE = null;
-        serializationManager.close();
-        filterLocator.close();
-        eventAdmin.close();
-        artifactLocator.close();
-        osgiClientFactory.close();
-        commandFactory.close();
-        tracer.close();
 
         super.stop(context);
     }
 
     public SerializationManager getSerializationManager() {
-        return ServiceUtil.getNotNull(serializationManager);
+        return org.apache.sling.ide.eclipse.core.internal.Activator.getDefault().getSerializationManager();
     }
 
     public FilterLocator getFilterLocator() {
-        return ServiceUtil.getNotNull(filterLocator);
-    }
-
-    public EventAdmin getEventAdmin() {
-        return ServiceUtil.getNotNull(eventAdmin);
+        return org.apache.sling.ide.eclipse.core.internal.Activator.getDefault().getFilterLocator();
     }
 
     public EmbeddedArtifactLocator getArtifactLocator() {
-
-        return ServiceUtil.getNotNull(artifactLocator);
+        return org.apache.sling.ide.eclipse.core.internal.Activator.getDefault().getArtifactLocator();
     }
 
     public OsgiClientFactory getOsgiClientFactory() {
-        return ServiceUtil.getNotNull(osgiClientFactory);
+        return org.apache.sling.ide.eclipse.core.internal.Activator.getDefault().getOsgiClientFactory();
     }
 
     public Logger getPluginLogger() {
-        return (Logger) ServiceUtil.getNotNull(tracer);
+        return org.apache.sling.ide.eclipse.core.internal.Activator.getDefault().getPluginLogger();
     }
     
     public SyncCommandFactory getCommandFactory() {
-        return ServiceUtil.getNotNull(commandFactory);
+        return org.apache.sling.ide.eclipse.core.internal.Activator.getDefault().getCommandFactory();
     }
 
     @Override
diff --git a/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/console/SlingConsoleEventListener.java b/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/console/SlingConsoleEventListener.java
deleted file mode 100644
index a42b7d1..0000000
--- a/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/console/SlingConsoleEventListener.java
+++ /dev/null
@@ -1,152 +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.ide.eclipse.ui.internal.console;
-
-import java.io.IOException;
-import java.io.PrintStream;
-import java.text.DateFormat;
-import java.util.Collections;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Set;
-
-import org.apache.sling.ide.eclipse.ui.console.SlingConsoleFactory;
-import org.apache.sling.ide.eclipse.ui.internal.Activator;
-import org.apache.sling.ide.transport.CommandExecutionProperties;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsole;
-import org.eclipse.ui.console.IConsoleListener;
-import org.eclipse.ui.console.IConsoleManager;
-import org.eclipse.ui.console.MessageConsole;
-import org.eclipse.ui.console.MessageConsoleStream;
-import org.osgi.service.event.Event;
-import org.osgi.service.event.EventHandler;
-
-public class SlingConsoleEventListener implements EventHandler {
-
-    private final Object sync = new Object();
-
-    private final Set<Event> delayedEvents = Collections.newSetFromMap(new LinkedHashMap<Event, Boolean>() {
-        private static final long serialVersionUID = 1L;
-        protected boolean removeEldestEntry(java.util.Map.Entry<Event, Boolean> eldest) {
-            return size() >= 500;
-        };
-    });
-
-    private MessageConsole slingConsole;
-    private IConsoleListener listener;
-
-    @Override
-    public void handleEvent(Event event) {
-
-        synchronized (sync) {
-
-            initSlingConsole();
-
-            if (slingConsole != null) {
-                logEvent(event, slingConsole);
-                return;
-            }
-
-            delayedEvents.add(event);
-
-            final IConsoleManager consoleManager = ConsolePlugin.getDefault().getConsoleManager();
-
-            if (listener == null) {
-                listener = new IConsoleListener() {
-
-                    @Override
-                    public void consolesRemoved(IConsole[] consoles) {
-                        synchronized (sync) {
-                            for (IConsole console : consoles) {
-                                if (console.equals(slingConsole)) {
-                                    slingConsole = null;
-                                }
-                            }
-                        }
-                    }
-
-                    @Override
-                    public void consolesAdded(IConsole[] consoles) {
-                        synchronized (sync) {
-                            for (IConsole console : consoles) {
-                                if (console.getType().equals(SlingConsoleFactory.CONSOLE_TYPE_SLING)) {
-                                    slingConsole = (MessageConsole) console;
-                                    synchronized (delayedEvents) {
-                                        for (Iterator<Event> it = delayedEvents.iterator(); it.hasNext();) {
-                                            logEvent(it.next(), slingConsole);
-                                            it.remove();
-                                        }
-                                    }
-                                    consoleManager.removeConsoleListener(listener);
-                                    listener = null;
-                                    break;
-                                }
-                            }
-                        }
-                    }
-                };
-
-                consoleManager.addConsoleListener(listener);
-            }
-        }
-    }
-
-    private void initSlingConsole() {
-        if (slingConsole == null) {
-            final IConsoleManager consoleManager = ConsolePlugin.getDefault().getConsoleManager();
-            for (IConsole console : consoleManager.getConsoles()) {
-                if (console.getType().equals(SlingConsoleFactory.CONSOLE_TYPE_SLING)) {
-                    slingConsole = (MessageConsole) console;
-                    break;
-                }
-            }
-        }
-    }
-
-    private void logEvent(Event event, MessageConsole console) {
-
-        try (MessageConsoleStream messageStream = console.newMessageStream()) {
-
-            Long start = (Long) event.getProperty(CommandExecutionProperties.TIMESTAMP_START);
-            Long end = (Long) event.getProperty(CommandExecutionProperties.TIMESTAMP_END);
-            String type = (String) event.getProperty(CommandExecutionProperties.ACTION_TYPE);
-            String flags = (String) event.getProperty(CommandExecutionProperties.ACTION_FLAGS);
-            String target = (String) event.getProperty(CommandExecutionProperties.ACTION_TARGET);
-            String result = (String) event.getProperty(CommandExecutionProperties.RESULT_TEXT);
-            Throwable t = (Throwable) event.getProperty(CommandExecutionProperties.RESULT_THROWABLE);
-
-            StringBuilder message = new StringBuilder();
-            DateFormat format = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
-            message.append("[").append(format.format(new Date(start))).append("] ").append(type);
-            if (flags != null && flags.length() > 0) {
-                message.append(" (").append(flags).append(")");
-            }
-            message.append(" -> ").append(target);
-            message.append(" : ").append(result).append(" (").append(end - start).append(" ms)").append('\n');
-
-            messageStream.write(message.toString());
-            if (t != null) {
-                t.printStackTrace(new PrintStream(messageStream));
-            }
-        } catch (IOException e) {
-            Activator.getDefault().getPluginLogger().warn("Failed writing to the console", e);
-        }
-    }
-
-}
diff --git a/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/console/SlingConsoleLogger.java b/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/console/SlingConsoleLogger.java
new file mode 100644
index 0000000..62adb9c
--- /dev/null
+++ b/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/console/SlingConsoleLogger.java
@@ -0,0 +1,121 @@
+/*
+ * 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.ide.eclipse.ui.internal.console;
+
+import java.io.IOException;
+import java.io.PrintStream;
+import java.time.Instant;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+
+import org.apache.sling.ide.eclipse.core.logger.LogSubscriber;
+import org.apache.sling.ide.eclipse.ui.console.SlingConsoleFactory;
+import org.apache.sling.ide.eclipse.ui.internal.Activator;
+import org.eclipse.ui.console.ConsolePlugin;
+import org.eclipse.ui.console.IConsole;
+import org.eclipse.ui.console.IConsoleListener;
+import org.eclipse.ui.console.IConsoleManager;
+import org.eclipse.ui.console.MessageConsole;
+import org.eclipse.ui.console.MessageConsoleStream;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+
+@Component // cannot use DS 1.4 property types due to
+			// https://github.com/eclipse-pde/eclipse.pde/issues/36)
+public class SlingConsoleLogger implements LogSubscriber {
+
+	private final Object sync = new Object();
+
+	private IConsoleManager consoleManager = ConsolePlugin.getDefault().getConsoleManager();
+	private MessageConsole slingConsole;
+	private IConsoleListener listener;
+	
+	@Activate
+	public void activate() {
+		consoleManager = ConsolePlugin.getDefault().getConsoleManager();
+		listener = new IConsoleListener() {
+
+			@Override
+			public void consolesRemoved(IConsole[] consoles) {
+				synchronized (sync) {
+					for (IConsole console : consoles) {
+						if (console.equals(slingConsole)) {
+							slingConsole = null;
+						}
+					}
+				}
+			}
+
+			@Override
+			public void consolesAdded(IConsole[] consoles) {
+				synchronized (sync) {
+					for (IConsole console : consoles) {
+						if (console.getType().equals(SlingConsoleFactory.CONSOLE_TYPE_SLING)) {
+							slingConsole = (MessageConsole) console;
+							break;
+						}
+					}
+				}
+			}
+		};
+
+		consoleManager.addConsoleListener(listener);
+	}
+
+	@Deactivate
+	public void deactivate() {
+		consoleManager.removeConsoleListener(listener);
+	}
+
+	@Override
+	public void log(Severity severity, String message, Throwable t) {
+		synchronized (sync) {
+			initSlingConsole();
+			if (slingConsole != null) {
+				log(severity, message, t, slingConsole);
+			}
+		}
+	}
+
+	private void initSlingConsole() {
+		if (slingConsole == null) {
+			for (IConsole console : consoleManager.getConsoles()) {
+				if (console.getType().equals(SlingConsoleFactory.CONSOLE_TYPE_SLING)) {
+					slingConsole = (MessageConsole) console;
+					return;
+				}
+			}
+		}
+	}
+
+	private void log(Severity severity, String message, Throwable t, MessageConsole console) {
+		try (MessageConsoleStream messageStream = console.newMessageStream()) {
+
+			StringBuilder msgBuilder = new StringBuilder();
+			
+			msgBuilder.append("[").append(DateTimeFormatter.ISO_LOCAL_TIME.format(LocalTime.now())).append("] ").append(message);
+			messageStream.write(message.toString());
+			if (t != null) {
+				t.printStackTrace(new PrintStream(messageStream));
+			}
+		} catch (IOException e) {
+			Activator.getDefault().getPluginLogger().warn("Failed writing to the console", e);
+		}
+	}
+
+}
diff --git a/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/views/DateTimeSupport.java b/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/views/DateTimeSupport.java
index ecda7c1..a236cc2 100644
--- a/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/views/DateTimeSupport.java
+++ b/eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/views/DateTimeSupport.java
@@ -16,12 +16,17 @@
  */
 package org.apache.sling.ide.eclipse.ui.views;
 
-import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
 
-import javax.xml.bind.DatatypeConverter;
+import org.apache.jackrabbit.util.ISO8601;
 
+/**
+ * Converts between {@link Calendar} and {@link String} according to 
+ * <a href="https://developer.adobe.com/experience-manager/reference-materials/spec/jcr/2.0/3_Repository_Model.html#3.6.4.3%20From%20DATE%20To">
+ * JCR Spec 2.0, Chapter 3.6.4</a>
+ *
+ */
 public class DateTimeSupport {
 
     public static Date parseAsDate(String vaultDateTime) {
@@ -29,7 +34,7 @@
     }
     
     public static Calendar parseAsCalendar(String vaultDateTime) {
-        final Calendar result = DatatypeConverter.parseDateTime(vaultDateTime);
+        final Calendar result = ISO8601.parse(vaultDateTime);
         return result;
     }
     
@@ -40,12 +45,6 @@
     }
     
     public static String print(Calendar c) {
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
-        String result = sdf.format(c.getTime());
-        SimpleDateFormat timezone = new SimpleDateFormat("Z");
-        String timezoneStr = timezone.format(c.getTime());
-        //make it ISO_8601 conform
-        timezoneStr = timezoneStr.substring(0, timezoneStr.length()-2) + ":" + timezoneStr.substring(timezoneStr.length()-2);
-        return result+timezoneStr;
+    	return ISO8601.format(c);
     }
 }
diff --git a/eclipse/feature/META-INF/NOTICE b/eclipse/feature/META-INF/NOTICE
index b6aa6c3..2c17f0a 100644
--- a/eclipse/feature/META-INF/NOTICE
+++ b/eclipse/feature/META-INF/NOTICE
@@ -1,6 +1,6 @@
 
 Sling IDE Tools: Eclipse Feature
-Copyright 2007-2014 The Apache Software Foundation
+Copyright 2007-2022 The Apache Software Foundation
 
 Apache Sling is based on source code originally developed 
 by Day Software (http://www.day.com/).
diff --git a/eclipse/feature/feature.xml b/eclipse/feature/feature.xml
index 675439b..a115b7a 100644
--- a/eclipse/feature/feature.xml
+++ b/eclipse/feature/feature.xml
@@ -254,41 +254,6 @@
          unpack="false"/>
 
    <plugin
-         id="org.apache.sling.ide.vlt-wrapper"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.commons.io"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.commons.collections"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.commons.httpclient"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.commons.logging"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
          id="org.slf4j.api"
          download-size="0"
          install-size="0"
@@ -309,4 +274,11 @@
          version="0.0.0"
          unpack="false"/>
 
+   <plugin
+         id="org.apache.httpcomponents.httpclient"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
 </feature>
diff --git a/eclipse/m2e-feature/META-INF/NOTICE b/eclipse/m2e-feature/META-INF/NOTICE
index 060bbe6..b919a4a 100644
--- a/eclipse/m2e-feature/META-INF/NOTICE
+++ b/eclipse/m2e-feature/META-INF/NOTICE
@@ -1,6 +1,6 @@
 
 Sling IDE Tools: M2Eclipse-based Feature
-Copyright 2007-2014 The Apache Software Foundation
+Copyright 2007-2022 The Apache Software Foundation
 
 Apache Sling is based on source code originally developed 
 by Day Software (http://www.day.com/).
diff --git a/eclipse/p2update/pom.xml b/eclipse/p2update/pom.xml
index 33194b5..7a68926 100644
--- a/eclipse/p2update/pom.xml
+++ b/eclipse/p2update/pom.xml
@@ -40,36 +40,14 @@
             <directory>.</directory>
             <includes>
                 <include>category.xml</include>
-                <include>siteTemplate/*</include>
             </includes>
         </resource>
     </resources>
     <plugins>
-      <plugin>
-        <groupId>org.jboss.tools.tycho-plugins</groupId>
-        <artifactId>repository-utils</artifactId>
-        <version>0.22.0</version>
-        <executions>
-          <execution>
-            <id>generate-facade</id>
-            <phase>package</phase>
-            <goals>
-              <goal>generate-repository-facade</goal>
-            </goals>
-            <configuration>
-              <siteTemplateFolder>siteTemplate</siteTemplateFolder>
-              <symbols>
-                <update.site.name>${project.name}</update.site.name>
-                <target.eclipse.version>Kepler or newer</target.eclipse.version>
-              </symbols>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
       <!-- the update site is not expected to contain legal artifacts -->
       <plugin>
-          <groupId>org.codehaus.mojo</groupId>
-          <artifactId>ianal-maven-plugin</artifactId>
+          <groupId>org.apache.geronimo.genesis.plugins</groupId>
+          <artifactId>tools-maven-plugin</artifactId>
           <configuration>
             <skip>true</skip>
           </configuration>
@@ -81,6 +59,32 @@
             <id>codesign</id>
             <build>
                 <plugins>
+                	<plugin>
+          <groupId>net.jsign</groupId>
+          <artifactId>jsign-maven-plugin</artifactId>
+          <version>4.2</version>
+          <executions>
+            <execution>
+              <goals>
+                <goal>sign</goal>
+              </goals>
+              <configuration>
+                <fileSet>
+                  <directory>target/repository</directory>
+                  <includes>
+                  	<include>**/org.apache.sling.*.jar</include>
+                  </includes>
+                </fileSet>
+                <name>Apache Sling IDE Tooling for Eclipse</name>
+                <url>https://sling.apache.org/documentation/development/ide-tooling.html</url>
+                <alias>Sling-PMC-cert-2022-09_4f01e1ed-9fde-4f84-a5ac-adf82e114a3b</alias>
+                <storepass>${settings.server.digicertoneasf.passphrase}|path</storepass>
+                <storetype>DIGICERTONE</storetype>
+              </configuration>
+            </execution>
+          </executions>
+        </plugin>
+        
                     <!-- 
                     This plugin is not yet released. To use this code signing, install the 
                     pluging locally and then run with the 'codesign' profile. See the Sling IDE
@@ -138,28 +142,6 @@
                             </execution>
                         </executions>
                     </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-resources-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>copy-index.html-to-signed-repository</id>
-                                <goals>
-                                    <goal>copy-resources</goal>
-                                </goals>
-                                <phase>package</phase>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <outputDirectory>${project.build.directory}/repository-signed</outputDirectory>
-                            <resources>
-                                <resource>
-                                    <directory>${project.build.directory}/repository</directory>
-                                    <include>index.html</include>
-                                </resource>
-                            </resources>
-                        </configuration>
-                    </plugin>
                 </plugins>
             </build>
         </profile>
diff --git a/eclipse/pom.xml b/eclipse/pom.xml
index a345c35..7081f76 100644
--- a/eclipse/pom.xml
+++ b/eclipse/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache</groupId>
         <artifactId>apache</artifactId>
-        <version>14</version>
+        <version>27</version>
     </parent>
     <groupId>org.apache.sling.ide</groupId>
     <artifactId>sling-ide-tooling</artifactId>
@@ -43,12 +43,12 @@
         <module>feature</module>
         <module>eclipse-m2e-core</module>
         <module>eclipse-m2e-ui</module>
-        <module>eclipse-m2e-test</module>
         <module>m2e-feature</module>
         <module>eclipse-sightly-core</module>
         <module>eclipse-sightly-ui</module>
         <module>sightly-feature</module>
         <module>p2update</module>
+        <!-- test modules activated per profile -->
     </modules>
 
     <build>
@@ -79,9 +79,9 @@
                 <version>${tycho.version}</version>
             </plugin>
             <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>ianal-maven-plugin</artifactId>
-                <version>1.0-alpha-1</version>
+                <groupId>org.apache.geronimo.genesis.plugins</groupId>
+                <artifactId>tools-maven-plugin</artifactId>
+                <version>1.4</version>
                 <executions>
                     <execution>
                         <goals>
@@ -114,12 +114,15 @@
 
                         <!-- prevent failures when eclipse-test is not activated as a submodule -->
                         <exclude>eclipse-test/**</exclude>
+                        <exclude>eclipse-m2e-test/**</exclude>
                         <!-- exclude target file from the source-bundle project since it is not a module -->
                         <exclude>source-bundle/target/**</exclude>
                         <exclude>source-bundle/README.md</exclude>
 
                         <!-- Jenkins Xvfb plugin -->
                         <exclude>.Xauthority-*</exclude>
+                        <exclude>.*</exclude>
+                        <exclude>OSGI-INF/**</exclude>
                     </excludes>
                 </configuration>
                 <executions>
@@ -134,19 +137,24 @@
         </plugins>
         <pluginManagement>
             <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.eclipse.tycho</groupId>
+					<artifactId>tycho-ds-plugin</artifactId>
+					<version>${tycho.version}</version>
+					<configuration>
+						<dsVersion>1.4</dsVersion>
+						<enabled>true</enabled><!-- always generate DS component descriptors even if not enabled in PDE settings -->
+					</configuration>
+				</plugin>
+				<plugin>
+	                <groupId>org.eclipse.tycho</groupId>
+	                <artifactId>tycho-surefire-plugin</artifactId>
+	                <version>${tycho.version}</version>
+	                <configuration>
+	                	<trimStackTrace>false</trimStackTrace>
+	                </configuration>
+	            </plugin>
                 <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself. -->
-                <!--
-                    We embed some bundles that are not available on p2 update sites. To make the build seamless, we copy them early in the process.
-                -->
                 <plugin>
                     <groupId>org.eclipse.m2e</groupId>
                     <artifactId>lifecycle-mapping</artifactId>
@@ -181,26 +189,12 @@
         </pluginManagement>
     </build>
 
-    <pluginRepositories>
-        <pluginRepository>
-            <id>jboss-public-repository-group</id>
-            <name>JBoss Public Repository Group</name>
-            <url>https://repository.jboss.org/nexus/content/groups/public/</url>
-        </pluginRepository>
-    </pluginRepositories>
-
-  <repositories>
-   <repository>
-     <id>sling-ide-tooling-shared-local</id>
-     <layout>p2</layout>
-     <url>file:${basedir}/../../shared/p2/shared-repository/target/repository</url>
-   </repository>
-  </repositories>
-
-
     <properties>
-        <tycho.version>1.0.0</tycho.version>
+        <tycho.version>3.0.0</tycho.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <minimalJavaBuildVersion>17</minimalJavaBuildVersion>
+        <maven.compiler.target>17</maven.compiler.target>
+        <maven.compiler.release>17</maven.compiler.release>
     </properties>
 
     <profiles>
@@ -266,10 +260,14 @@
         <profile>
             <id>eclipse-test</id>
             <activation>
-                <activeByDefault>true</activeByDefault>
+                <os>
+                	<!-- integration tests are unstable on Windows -->
+                	<family>!windows</family>
+                </os>
             </activation>
             <modules>
                 <module>eclipse-test</module>
+                <module>eclipse-m2e-test</module>
             </modules>
         </profile>
     </profiles>
diff --git a/eclipse/sightly-feature/META-INF/NOTICE b/eclipse/sightly-feature/META-INF/NOTICE
index 060bbe6..b919a4a 100644
--- a/eclipse/sightly-feature/META-INF/NOTICE
+++ b/eclipse/sightly-feature/META-INF/NOTICE
@@ -1,6 +1,6 @@
 
 Sling IDE Tools: M2Eclipse-based Feature
-Copyright 2007-2014 The Apache Software Foundation
+Copyright 2007-2022 The Apache Software Foundation
 
 Apache Sling is based on source code originally developed 
 by Day Software (http://www.day.com/).
diff --git a/eclipse/target-definition/README.md b/eclipse/target-definition/README.md
new file mode 100644
index 0000000..504b2fe
--- /dev/null
+++ b/eclipse/target-definition/README.md
@@ -0,0 +1,7 @@
+# Apache Sling IDE Tools Target
+
+The target definition for Eclipse PDE/Tycho against which to build the Eclipse plugins.
+
+The target file references both Eclipse Plugins/Features from P2 repositories (standard Eclipse dependencies) as well as [Maven artifacts](<https://xn--lubisoft-0za.gmbh/en/articles/using-maven-artifacts-in-pde-rcp-and-tycho-builds/>) for custom OSGi bundles.
+
+3rd party dependencies are referenced from [Eclipse Orbit](https://www.eclipse.org/orbit/) (to reuse bundle versions also used by other Eclipse plugins).
diff --git a/eclipse/target-definition/Sling IDE Tooling.launch b/eclipse/target-definition/Sling IDE Tooling.launch
index 94fb6ab..1d2d4bf 100644
--- a/eclipse/target-definition/Sling IDE Tooling.launch
+++ b/eclipse/target-definition/Sling IDE Tooling.launch
@@ -1,392 +1,566 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <launchConfiguration type="org.eclipse.pde.ui.RuntimeWorkbench">
-<setAttribute key="additional_plugins"/>
-<booleanAttribute key="append.args" value="true"/>
-<booleanAttribute key="askclear" value="false"/>
-<booleanAttribute key="automaticAdd" value="false"/>
-<booleanAttribute key="automaticValidate" value="false"/>
-<stringAttribute key="bootstrap" value=""/>
-<stringAttribute key="checked" value="[NONE]"/>
-<booleanAttribute key="clearConfig" value="false"/>
-<booleanAttribute key="clearws" value="true"/>
-<booleanAttribute key="clearwslog" value="true"/>
-<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/Sling IDE Tooling"/>
-<booleanAttribute key="default" value="true"/>
-<stringAttribute key="featureDefaultLocation" value="workspace"/>
-<stringAttribute key="featurePluginResolution" value="workspace"/>
-<booleanAttribute key="includeOptional" value="true"/>
-<stringAttribute key="location" value="${workspace_loc}/../runtime-sling-ide-tooling"/>
-<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
-<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="true"/>
-<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -nosplash"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx768m&#10;-XX:MaxPermSize=256m"/>
-<stringAttribute key="pde.version" value="3.3"/>
-<stringAttribute key="product" value="org.eclipse.platform.ide"/>
-<setAttribute key="selected_features"/>
-<stringAttribute key="selected_target_plugins" value="com.ibm.icu@default:default,com.ning.async-http-client@default:default,javax.annotation@default:default,javax.inject@default:default,javax.servlet@default:default,javax.xml@default:default,org.apache.batik.css@default:default,org.apache.batik.util.gui@default:default,org.apache.batik.util@default:default,org.apache.commons.codec@default:default,org.apache.commons.collections@default:default,org.apache.commons.httpclient@default:default,org.apache.commons.io@default:default,org.apache.commons.logging*1.1.1.v201101211721@default:default,org.apache.lucene.analysis@default:default,org.apache.lucene.core@default:default,org.eclipse.ant.core@default:default,org.eclipse.compare.core@default:default,org.eclipse.compare@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.databinding.observable@default:default,org.eclipse.core.databinding.property@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.filebuffers@default:default,org.eclipse.core.filesystem.linux.x86_64@default:false,org.eclipse.core.filesystem@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.net.linux.x86_64@default:false,org.eclipse.core.net@default:default,org.eclipse.core.resources@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.core.runtime@default:true,org.eclipse.core.variables@default:default,org.eclipse.debug.core@default:default,org.eclipse.debug.ui@default:default,org.eclipse.e4.core.commands@default:default,org.eclipse.e4.core.contexts@default:default,org.eclipse.e4.core.di.extensions@default:default,org.eclipse.e4.core.di@default:default,org.eclipse.e4.core.services@default:default,org.eclipse.e4.ui.bindings@default:default,org.eclipse.e4.ui.css.core@default:default,org.eclipse.e4.ui.css.swt.theme@default:default,org.eclipse.e4.ui.css.swt@default:default,org.eclipse.e4.ui.di@default:default,org.eclipse.e4.ui.model.workbench@default:default,org.eclipse.e4.ui.services@default:default,org.eclipse.e4.ui.widgets@default:default,org.eclipse.e4.ui.workbench.addons.swt@default:default,org.eclipse.e4.ui.workbench.renderers.swt@default:default,org.eclipse.e4.ui.workbench.swt@default:default,org.eclipse.e4.ui.workbench3@default:default,org.eclipse.e4.ui.workbench@default:default,org.eclipse.emf.common@default:default,org.eclipse.emf.ecore.change@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.bidi@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.frameworkadmin.equinox@default:default,org.eclipse.equinox.frameworkadmin@default:default,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.p2.artifact.repository@default:default,org.eclipse.equinox.p2.core@default:default,org.eclipse.equinox.p2.director@default:default,org.eclipse.equinox.p2.engine@default:default,org.eclipse.equinox.p2.jarprocessor@default:default,org.eclipse.equinox.p2.metadata.repository@default:default,org.eclipse.equinox.p2.metadata@default:default,org.eclipse.equinox.p2.operations@default:default,org.eclipse.equinox.p2.publisher.eclipse@default:default,org.eclipse.equinox.p2.publisher@default:default,org.eclipse.equinox.p2.repository@default:default,org.eclipse.equinox.p2.ui@default:default,org.eclipse.equinox.p2.updatesite@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.security.ui@default:default,org.eclipse.equinox.security@default:default,org.eclipse.equinox.simpleconfigurator.manipulator@default:default,org.eclipse.equinox.simpleconfigurator@1:true,org.eclipse.equinox.util@default:default,org.eclipse.help.base@default:default,org.eclipse.help.ui@default:default,org.eclipse.help@default:default,org.eclipse.jdt.compiler.apt@default:false,org.eclipse.jdt.compiler.tool@default:false,org.eclipse.jdt.core.manipulation@default:default,org.eclipse.jdt.core@default:default,org.eclipse.jdt.debug.ui@default:default,org.eclipse.jdt.debug@default:default,org.eclipse.jdt.launching@default:default,org.eclipse.jdt.ui@default:default,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jface.databinding@default:default,org.eclipse.jface.text@default:default,org.eclipse.jface@default:default,org.eclipse.jst.common.project.facet.core@default:default,org.eclipse.jst.server.core@default:default,org.eclipse.ltk.core.refactoring@default:default,org.eclipse.ltk.ui.refactoring@default:default,org.eclipse.m2e.archetype.common@default:default,org.eclipse.m2e.core@default:default,org.eclipse.m2e.maven.indexer@default:default,org.eclipse.m2e.maven.runtime@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.eclipse.platform@default:default,org.eclipse.search@default:default,org.eclipse.swt.gtk.linux.x86_64@default:false,org.eclipse.swt@default:default,org.eclipse.team.core@default:default,org.eclipse.team.ui@default:default,org.eclipse.text@default:default,org.eclipse.ui.browser@default:default,org.eclipse.ui.cheatsheets@default:default,org.eclipse.ui.console@default:default,org.eclipse.ui.editors@default:default,org.eclipse.ui.forms@default:default,org.eclipse.ui.ide.application@default:default,org.eclipse.ui.ide@default:default,org.eclipse.ui.intro@default:default,org.eclipse.ui.navigator.resources@default:default,org.eclipse.ui.navigator@default:default,org.eclipse.ui.trace@default:default,org.eclipse.ui.views.properties.tabbed@default:default,org.eclipse.ui.views@default:default,org.eclipse.ui.workbench.texteditor@default:default,org.eclipse.ui.workbench@default:default,org.eclipse.ui@default:default,org.eclipse.wst.common.core@default:default,org.eclipse.wst.common.project.facet.core@default:default,org.eclipse.wst.common.project.facet.ui@default:default,org.eclipse.wst.internet.monitor.core@default:default,org.eclipse.wst.server.core@default:default,org.eclipse.wst.server.discovery@default:default,org.eclipse.wst.server.ui@default:default,org.hamcrest.core@default:default,org.jboss.netty@default:default,org.json@default:default,org.junit@default:default,org.sat4j.core@default:default,org.sat4j.pb@default:default,org.slf4j.api@default:default,org.w3c.css.sac@default:default,org.w3c.dom.smil@default:default,org.w3c.dom.svg@default:default"/>
-<stringAttribute key="selected_workspace_plugins" value="org.apache.sling.ide.api@default:default,org.apache.sling.ide.artifacts@default:default,org.apache.sling.ide.eclipse-core@default:default,org.apache.sling.ide.eclipse-m2e-test@default:false,org.apache.sling.ide.eclipse-m2e-ui@default:default,org.apache.sling.ide.eclipse-ui@default:default,org.apache.sling.ide.impl-resource@default:default,org.apache.sling.ide.impl-vlt@default:default,org.apache.sling.ide.vlt-wrapper@default:default"/>
-<booleanAttribute key="show_selected_only" value="false"/>
-<stringAttribute key="templateConfig" value="${target_home}/configuration/config.ini"/>
-<booleanAttribute key="tracing" value="false"/>
-<mapAttribute key="tracingOptions">
-<mapEntry key="org.apache.sling.ide.eclipse-core/debug" value="true"/>
-<mapEntry key="org.apache.sling.ide.impl-resource/debug" value="true"/>
-<mapEntry key="org.eclipse.core.contenttype/debug" value="false"/>
-<mapEntry key="org.eclipse.core.expressions/debug/TypeExtensionManager" value="false"/>
-<mapEntry key="org.eclipse.core.expressions/tracePropertyResolving" value="false"/>
-<mapEntry key="org.eclipse.core.jobs/jobs" value="false"/>
-<mapEntry key="org.eclipse.core.jobs/jobs/beginend" value="false"/>
-<mapEntry key="org.eclipse.core.jobs/jobs/errorondeadlock" value="false"/>
-<mapEntry key="org.eclipse.core.jobs/jobs/locks" value="false"/>
-<mapEntry key="org.eclipse.core.jobs/jobs/shutdown" value="false"/>
-<mapEntry key="org.eclipse.core.jobs/jobs/timing" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/delta" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/failure" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/interrupt" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/invoking" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/needbuild" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/needbuildstack" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/stacktrace" value="false"/>
-<mapEntry key="org.eclipse.core.resources/contenttype" value="false"/>
-<mapEntry key="org.eclipse.core.resources/contenttype/cache" value="false"/>
-<mapEntry key="org.eclipse.core.resources/debug" value="false"/>
-<mapEntry key="org.eclipse.core.resources/history" value="false"/>
-<mapEntry key="org.eclipse.core.resources/natures" value="false"/>
-<mapEntry key="org.eclipse.core.resources/perf/builders" value="10000"/>
-<mapEntry key="org.eclipse.core.resources/perf/listeners" value="500"/>
-<mapEntry key="org.eclipse.core.resources/perf/save.participants" value="500"/>
-<mapEntry key="org.eclipse.core.resources/perf/snapshot" value="1000"/>
-<mapEntry key="org.eclipse.core.resources/preferences" value="false"/>
-<mapEntry key="org.eclipse.core.resources/refresh" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore/markers" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore/mastertable" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore/metainfo" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore/snapshots" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore/syncinfo" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore/tree" value="false"/>
-<mapEntry key="org.eclipse.core.resources/save" value="false"/>
-<mapEntry key="org.eclipse.core.resources/save/markers" value="false"/>
-<mapEntry key="org.eclipse.core.resources/save/mastertable" value="false"/>
-<mapEntry key="org.eclipse.core.resources/save/metainfo" value="false"/>
-<mapEntry key="org.eclipse.core.resources/save/syncinfo" value="false"/>
-<mapEntry key="org.eclipse.core.resources/save/tree" value="false"/>
-<mapEntry key="org.eclipse.core.resources/strings" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/compatibility/debug" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/debug" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/debug/context" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/perf" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/perf/success" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/preferences/plugin" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/url/debug" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/url/debug/cachecopy" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/url/debug/cachelookup" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/url/debug/connect" value="false"/>
-<mapEntry key="org.eclipse.debug.core/debug" value="false"/>
-<mapEntry key="org.eclipse.debug.core/debug/commands" value="false"/>
-<mapEntry key="org.eclipse.debug.core/debug/events" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/breadcrumb" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/contextlaunching" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/launchhistory" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/memory/dynamicLoading" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/breakpointDeltas" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/contentProvider" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/deltas" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/model" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/presentationId" value=""/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/stateSaveRestore" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/updateSequence" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/viewer" value="false"/>
-<mapEntry key="org.eclipse.e4.core.contexts/debug" value="false"/>
-<mapEntry key="org.eclipse.e4.core.contexts/debug/listeners" value="false"/>
-<mapEntry key="org.eclipse.e4.core.contexts/debug/names" value="false"/>
-<mapEntry key="org.eclipse.e4.core.di/debug" value="false"/>
-<mapEntry key="org.eclipse.e4.core.di/debug/injector" value="false"/>
-<mapEntry key="org.eclipse.e4.core.services/debug" value="false"/>
-<mapEntry key="org.eclipse.e4.core.services/debug/injector" value="false"/>
-<mapEntry key="org.eclipse.e4.ui.workbench.swt/debug" value="false"/>
-<mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/commands" value="false"/>
-<mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/eclipse.context" value="false"/>
-<mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/eclipse.context.verbose" value="false"/>
-<mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/menus" value="false"/>
-<mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/renderer" value="false"/>
-<mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/workbench" value="false"/>
-<mapEntry key="org.eclipse.e4.ui.workbench/debug" value="false"/>
-<mapEntry key="org.eclipse.e4.ui.workbench/trace/commands" value="false"/>
-<mapEntry key="org.eclipse.e4.ui.workbench/trace/eclipse.context" value="false"/>
-<mapEntry key="org.eclipse.e4.ui.workbench/trace/eclipse.context.verbose" value="false"/>
-<mapEntry key="org.eclipse.e4.ui.workbench/trace/menus" value="false"/>
-<mapEntry key="org.eclipse.e4.ui.workbench/trace/renderer" value="false"/>
-<mapEntry key="org.eclipse.e4.ui.workbench/trace/workbench" value="false"/>
-<mapEntry key="org.eclipse.equinox.ds/debug" value="true"/>
-<mapEntry key="org.eclipse.equinox.ds/instantiate_all" value="true"/>
-<mapEntry key="org.eclipse.equinox.ds/performance" value="false"/>
-<mapEntry key="org.eclipse.equinox.ds/print_on_console" value="true"/>
-<mapEntry key="org.eclipse.equinox.p2.engine/certificatechecker/unsigned" value="false"/>
-<mapEntry key="org.eclipse.equinox.p2.engine/certificatechecker/untrusted" value="false"/>
-<mapEntry key="org.eclipse.equinox.p2.engine/engine/debug" value="false"/>
-<mapEntry key="org.eclipse.equinox.p2.engine/enginesession/debug" value="false"/>
-<mapEntry key="org.eclipse.equinox.p2.engine/profileregistry/debug" value="false"/>
-<mapEntry key="org.eclipse.equinox.preferences/general" value="false"/>
-<mapEntry key="org.eclipse.equinox.preferences/get" value="false"/>
-<mapEntry key="org.eclipse.equinox.preferences/set" value="false"/>
-<mapEntry key="org.eclipse.equinox.registry/debug" value="false"/>
-<mapEntry key="org.eclipse.equinox.registry/debug/events" value="false"/>
-<mapEntry key="org.eclipse.equinox.security.ui/debug" value="false"/>
-<mapEntry key="org.eclipse.equinox.security.ui/debug/storage" value="false"/>
-<mapEntry key="org.eclipse.equinox.security/debug" value="false"/>
-<mapEntry key="org.eclipse.equinox.security/debug/loginFramework" value="false"/>
-<mapEntry key="org.eclipse.help.ui/debug" value="true"/>
-<mapEntry key="org.eclipse.help.ui/debug/embeddedBrowser" value="false"/>
-<mapEntry key="org.eclipse.help.ui/debug/embeddedBrowser/inprocess" value="false"/>
-<mapEntry key="org.eclipse.help.ui/debug/infopop" value="false"/>
-<mapEntry key="org.eclipse.help.webapp/debug" value="true"/>
-<mapEntry key="org.eclipse.help.webapp/debug/workingsets" value="false"/>
-<mapEntry key="org.eclipse.help/debug" value="true"/>
-<mapEntry key="org.eclipse.help/debug/context" value="false"/>
-<mapEntry key="org.eclipse.help/debug/search" value="false"/>
-<mapEntry key="org.eclipse.help/debug/toc" value="false"/>
-<mapEntry key="org.eclipse.jdt.core.manipulation/debug" value="true"/>
-<mapEntry key="org.eclipse.jdt.core/debug" value="true"/>
-<mapEntry key="org.eclipse.jdt.core/debug/buffermanager" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/builder" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/builder/stats" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/compiler" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/completion" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/cpresolution" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/cpresolution/advanced" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/cpresolution/failure" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/formatter" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/hierarchy" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/indexmanager" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/indexmanager/advanced" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/javadelta" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/javadelta/verbose" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/javamodel" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/javamodel/cache" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/postaction" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/resolution" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/search" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/selection" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/sourcemapper" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/zipaccess" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/perf/completion" value="300"/>
-<mapEntry key="org.eclipse.jdt.core/perf/containerinitializer" value="5000"/>
-<mapEntry key="org.eclipse.jdt.core/perf/javadeltalistener" value="500"/>
-<mapEntry key="org.eclipse.jdt.core/perf/reconcile" value="1000"/>
-<mapEntry key="org.eclipse.jdt.core/perf/selection" value="300"/>
-<mapEntry key="org.eclipse.jdt.core/perf/variableinitializer" value="5000"/>
-<mapEntry key="org.eclipse.jdt.debug/debug" value="false"/>
-<mapEntry key="org.eclipse.jdt.debug/debug/astEvaluations" value="false"/>
-<mapEntry key="org.eclipse.jdt.debug/debug/astEvaluations/callingThreads" value="false"/>
-<mapEntry key="org.eclipse.jdt.debug/debug/jdiEvents" value="false"/>
-<mapEntry key="org.eclipse.jdt.debug/debug/jdiRequestTimes" value="false"/>
-<mapEntry key="org.eclipse.jdt.launching/debug" value="false"/>
-<mapEntry key="org.eclipse.jdt.launching/debug/classpath/jreContainer" value="false"/>
-<mapEntry key="org.eclipse.jdt.ui/debug" value="true"/>
-<mapEntry key="org.eclipse.jdt.ui/debug/ASTProvider" value="false"/>
-<mapEntry key="org.eclipse.jdt.ui/debug/BreadcrumbItemDropDown" value="false"/>
-<mapEntry key="org.eclipse.jdt.ui/debug/ResultCollector" value="false"/>
-<mapEntry key="org.eclipse.jdt.ui/debug/TypeConstraints" value="false"/>
-<mapEntry key="org.eclipse.jdt.ui/perf/content_assist/extensions" value="1000"/>
-<mapEntry key="org.eclipse.jdt.ui/perf/content_assist_sorters/extensions" value=""/>
-<mapEntry key="org.eclipse.jdt.ui/perf/explorer/RefactorActionGroup" value="150"/>
-<mapEntry key="org.eclipse.jdt.ui/perf/explorer/createPartControl" value="1300"/>
-<mapEntry key="org.eclipse.jdt.ui/perf/explorer/makeActions" value="1000"/>
-<mapEntry key="org.eclipse.jdt.ui/perf/search/participants" value="300"/>
-<mapEntry key="org.eclipse.jem.util/debug/loglevel" value="WARNING"/>
-<mapEntry key="org.eclipse.jem.util/debug/logtrace" value="false"/>
-<mapEntry key="org.eclipse.jem.util/debug/logtracefile" value="false"/>
-<mapEntry key="org.eclipse.jface.text.source/debug/RevisionRulerColumn" value="false"/>
-<mapEntry key="org.eclipse.jface.text/assert/TextSelection/validConstructorArguments" value="false"/>
-<mapEntry key="org.eclipse.jface.text/debug/AbstractInformationControlManager" value="false"/>
-<mapEntry key="org.eclipse.jface.text/debug/AnnotationPainter" value="false"/>
-<mapEntry key="org.eclipse.jface.text/debug/ContentAssistSubjectAdapters" value="false"/>
-<mapEntry key="org.eclipse.jface.text/debug/FastPartitioner/PositionCache" value="false"/>
-<mapEntry key="org.eclipse.ltk.core.refactoring/perf/participants/checkConditions" value="300"/>
-<mapEntry key="org.eclipse.ltk.core.refactoring/perf/participants/createChanges" value="300"/>
-<mapEntry key="org.eclipse.osgi/debug" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/bundleTime" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/events" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/filter" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/loader" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/manifest" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/messageBundles" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/objectPool/adds" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/objectPool/dups" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/packageadmin" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/security" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/services" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/startlevel" value="false"/>
-<mapEntry key="org.eclipse.osgi/defaultprofile/buffersize" value="256"/>
-<mapEntry key="org.eclipse.osgi/defaultprofile/logfilename" value=""/>
-<mapEntry key="org.eclipse.osgi/defaultprofile/logsynchronously" value="false"/>
-<mapEntry key="org.eclipse.osgi/eclipseadaptor/converter/debug" value="false"/>
-<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug" value="false"/>
-<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/cachedmanifest" value="false"/>
-<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/location" value="false"/>
-<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin" value="false"/>
-<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin/resolver" value="false"/>
-<mapEntry key="org.eclipse.osgi/monitor/activation" value="false"/>
-<mapEntry key="org.eclipse.osgi/monitor/classes" value="false"/>
-<mapEntry key="org.eclipse.osgi/monitor/resources" value="false"/>
-<mapEntry key="org.eclipse.osgi/profile/benchmark" value="false"/>
-<mapEntry key="org.eclipse.osgi/profile/debug" value="false"/>
-<mapEntry key="org.eclipse.osgi/profile/impl" value="org.eclipse.osgi.internal.profile.DefaultProfileLogger"/>
-<mapEntry key="org.eclipse.osgi/profile/startup" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/cycles" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/debug" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/generics" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/imports" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/requires" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/uses" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/wiring" value="false"/>
-<mapEntry key="org.eclipse.osgi/trace/activation" value="false"/>
-<mapEntry key="org.eclipse.osgi/trace/classLoading" value="false"/>
-<mapEntry key="org.eclipse.osgi/trace/filename" value="runtime.traces"/>
-<mapEntry key="org.eclipse.osgi/trace/filters" value="trace.properties"/>
-<mapEntry key="org.eclipse.team.core/backgroundevents" value="false"/>
-<mapEntry key="org.eclipse.team.core/debug" value="false"/>
-<mapEntry key="org.eclipse.team.core/refreshjob" value="false"/>
-<mapEntry key="org.eclipse.team.core/streams" value="false"/>
-<mapEntry key="org.eclipse.team.core/threading" value="false"/>
-<mapEntry key="org.eclipse.ui.browser/debug" value="false"/>
-<mapEntry key="org.eclipse.ui.ide/debug" value="false"/>
-<mapEntry key="org.eclipse.ui.ide/debug/gc" value="false"/>
-<mapEntry key="org.eclipse.ui.ide/debug/internalerror/openDialog" value="false"/>
-<mapEntry key="org.eclipse.ui.ide/debug/markers" value="false"/>
-<mapEntry key="org.eclipse.ui.ide/debug/undomonitor" value="false"/>
-<mapEntry key="org.eclipse.ui.intro.universal/debug" value="true"/>
-<mapEntry key="org.eclipse.ui.intro.universal/trace/logInfo" value="true"/>
-<mapEntry key="org.eclipse.ui.intro.universal/trace/logPerformance" value="false"/>
-<mapEntry key="org.eclipse.ui.intro/debug" value="true"/>
-<mapEntry key="org.eclipse.ui.intro/debug/toolbar" value="false"/>
-<mapEntry key="org.eclipse.ui.intro/flags/noBrowser" value="false"/>
-<mapEntry key="org.eclipse.ui.intro/trace/logInfo" value="true"/>
-<mapEntry key="org.eclipse.ui.intro/trace/logPerformance" value="false"/>
-<mapEntry key="org.eclipse.ui.intro/trace/printHTML" value="false"/>
-<mapEntry key="org.eclipse.ui.navigator/debug" value="false"/>
-<mapEntry key="org.eclipse.ui.navigator/debug/dnd" value="false"/>
-<mapEntry key="org.eclipse.ui.navigator/debug/resolution" value="false"/>
-<mapEntry key="org.eclipse.ui.navigator/debug/setup" value="false"/>
-<mapEntry key="org.eclipse.ui.navigator/debug/sort" value="false"/>
-<mapEntry key="org.eclipse.ui.navigator/debug/viewermap" value="false"/>
-<mapEntry key="org.eclipse.ui.navigator/perf/explorer/createPartControl" value="1300"/>
-<mapEntry key="org.eclipse.ui.workbench/debug" value="false"/>
-<mapEntry key="org.eclipse.ui.workbench/debug/e4" value="false"/>
-<mapEntry key="org.eclipse.ui/debug" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/contributions" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/declaredImages" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/job.stale" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/showAllJobs" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/swtdebug" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/swtdebugglobal" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/workingSets" value="false"/>
-<mapEntry key="org.eclipse.ui/experimental/menus" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPage.IPartListener" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPage.IPartListener2" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPage.IPropertyChangeListener" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPartReference" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPageListener" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPartListener" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPartListener2" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPerspectiveListener" value="false"/>
-<mapEntry key="org.eclipse.ui/perf/contentTypes" value="200"/>
-<mapEntry key="org.eclipse.ui/perf/page.listeners" value="200"/>
-<mapEntry key="org.eclipse.ui/perf/part.activate" value="200"/>
-<mapEntry key="org.eclipse.ui/perf/part.control" value="800"/>
-<mapEntry key="org.eclipse.ui/perf/part.create" value="800"/>
-<mapEntry key="org.eclipse.ui/perf/part.init" value="800"/>
-<mapEntry key="org.eclipse.ui/perf/part.input" value="200"/>
-<mapEntry key="org.eclipse.ui/perf/part.listeners" value="200"/>
-<mapEntry key="org.eclipse.ui/perf/perspective.create" value="800"/>
-<mapEntry key="org.eclipse.ui/perf/perspective.listeners" value="200"/>
-<mapEntry key="org.eclipse.ui/perf/perspective.switch" value="800"/>
-<mapEntry key="org.eclipse.ui/perf/showHeapStatus" value="true"/>
-<mapEntry key="org.eclipse.ui/perf/uijob" value="200"/>
-<mapEntry key="org.eclipse.ui/perf/workbench.restore" value="30000"/>
-<mapEntry key="org.eclipse.ui/perf/workbench.start" value="45000"/>
-<mapEntry key="org.eclipse.ui/trace/commands" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/contexts" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/contexts.performance" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/contexts.verbose" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/graphics" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/handlers" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/handlers.performance" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/handlers.verbose" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/handlers.verbose.commandId" value=""/>
-<mapEntry key="org.eclipse.ui/trace/keyBindings" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/keyBindings.verbose" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/multipageeditor" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/operations" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/operations.verbose" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/perspectives" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/sources" value="false"/>
-<mapEntry key="org.eclipse.update.configurator/debug" value="false"/>
-<mapEntry key="org.eclipse.wst.common.environment/debug" value="true"/>
-<mapEntry key="org.eclipse.wst.common.environment/trace/command" value="true"/>
-<mapEntry key="org.eclipse.wst.common.environment/trace/data" value="true"/>
-<mapEntry key="org.eclipse.wst.common.environment/trace/emitter" value="true"/>
-<mapEntry key="org.eclipse.wst.common.environment/trace/error" value="true"/>
-<mapEntry key="org.eclipse.wst.common.environment/trace/info" value="true"/>
-<mapEntry key="org.eclipse.wst.common.environment/trace/warning" value="true"/>
-<mapEntry key="org.eclipse.wst.common.environment/trace/ws_ant" value="true"/>
-<mapEntry key="org.eclipse.wst.common.environment/trace/ws_dt_cmd_engine" value="true"/>
-<mapEntry key="org.eclipse.wst.common.environment/trace/ws_framework" value="true"/>
-<mapEntry key="org.eclipse.wst.common.project.facet.core/actionSorting" value="false"/>
-<mapEntry key="org.eclipse.wst.common.project.facet.core/activation" value="false"/>
-<mapEntry key="org.eclipse.wst.common.project.facet.core/delegate/calls" value="false"/>
-<mapEntry key="org.eclipse.wst.common.project.facet.core/events/project" value="false"/>
-<mapEntry key="org.eclipse.wst.common.project.facet.core/events/project/stacktrace" value="false"/>
-<mapEntry key="org.eclipse.wst.common.project.facet.ui/propPage/actionConfigValidation" value="false"/>
-<mapEntry key="org.eclipse.wst.internet.monitor.core/config" value="false"/>
-<mapEntry key="org.eclipse.wst.internet.monitor.core/debug" value="true"/>
-<mapEntry key="org.eclipse.wst.internet.monitor.core/finest" value="false"/>
-<mapEntry key="org.eclipse.wst.internet.monitor.core/parsing" value="false"/>
-<mapEntry key="org.eclipse.wst.internet.monitor.core/severe" value="false"/>
-<mapEntry key="org.eclipse.wst.internet.monitor.core/warning" value="false"/>
-<mapEntry key="org.eclipse.wst.server.core/config" value="false"/>
-<mapEntry key="org.eclipse.wst.server.core/debug" value="true"/>
-<mapEntry key="org.eclipse.wst.server.core/extension_point" value="false"/>
-<mapEntry key="org.eclipse.wst.server.core/finer" value="false"/>
-<mapEntry key="org.eclipse.wst.server.core/finest" value="false"/>
-<mapEntry key="org.eclipse.wst.server.core/info" value="false"/>
-<mapEntry key="org.eclipse.wst.server.core/listeners" value="false"/>
-<mapEntry key="org.eclipse.wst.server.core/performance" value="false"/>
-<mapEntry key="org.eclipse.wst.server.core/publishing" value="false"/>
-<mapEntry key="org.eclipse.wst.server.core/resources" value="false"/>
-<mapEntry key="org.eclipse.wst.server.core/runtime_target" value="false"/>
-<mapEntry key="org.eclipse.wst.server.core/severe" value="false"/>
-<mapEntry key="org.eclipse.wst.server.core/warning" value="false"/>
-<mapEntry key="org.eclipse.wst.server.discovery/debug" value="true"/>
-<mapEntry key="org.eclipse.wst.server.ui/config" value="true"/>
-<mapEntry key="org.eclipse.wst.server.ui/debug" value="true"/>
-<mapEntry key="org.eclipse.wst.server.ui/extension_point" value="true"/>
-<mapEntry key="org.eclipse.wst.server.ui/finer" value="true"/>
-<mapEntry key="org.eclipse.wst.server.ui/finest" value="false"/>
-<mapEntry key="org.eclipse.wst.server.ui/info" value="true"/>
-<mapEntry key="org.eclipse.wst.server.ui/performance" value="true"/>
-<mapEntry key="org.eclipse.wst.server.ui/severe" value="true"/>
-<mapEntry key="org.eclipse.wst.server.ui/warning" value="true"/>
-<mapEntry key="org.eclipse.wst.validation/debug" value="true"/>
-<mapEntry key="org.eclipse.wst.validation/extraValDetail" value=""/>
-<mapEntry key="org.eclipse.wst.validation/filter/allExcept" value=""/>
-<mapEntry key="org.eclipse.wst.validation/timings" value="false"/>
-<mapEntry key="org.eclipse.wst.validation/timings/tracefile" value=""/>
-<mapEntry key="org.eclipse.wst.validation/timings/useDoubles" value="false"/>
-<mapEntry key="org.eclipse.wst.validation/trace/level" value=""/>
-<mapEntry key="org.eclipse.wst.validation/v1" value="false"/>
-<mapEntry key="org.eclipse.wtp.common/debug/loglevel" value="WARNING"/>
-<mapEntry key="org.eclipse.wtp.common/debug/logtrace" value="false"/>
-<mapEntry key="org.eclipse.wtp.common/debug/logtracefile" value="false"/>
-</mapAttribute>
-<booleanAttribute key="useCustomFeatures" value="false"/>
-<booleanAttribute key="useDefaultConfig" value="true"/>
-<booleanAttribute key="useDefaultConfigArea" value="true"/>
-<booleanAttribute key="useProduct" value="true"/>
+    <setAttribute key="additional_plugins"/>
+    <booleanAttribute key="append.args" value="true"/>
+    <booleanAttribute key="askclear" value="false"/>
+    <booleanAttribute key="automaticAdd" value="false"/>
+    <booleanAttribute key="automaticValidate" value="false"/>
+    <stringAttribute key="bootstrap" value=""/>
+    <stringAttribute key="checked" value="[NONE]"/>
+    <booleanAttribute key="clearConfig" value="false"/>
+    <booleanAttribute key="clearws" value="true"/>
+    <booleanAttribute key="clearwslog" value="true"/>
+    <stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/Sling IDE Tooling"/>
+    <booleanAttribute key="default" value="true"/>
+    <stringAttribute key="featureDefaultLocation" value="workspace"/>
+    <stringAttribute key="featurePluginResolution" value="workspace"/>
+    <booleanAttribute key="includeOptional" value="true"/>
+    <stringAttribute key="location" value="${workspace_loc}/../runtime-sling-ide-tooling"/>
+    <booleanAttribute key="org.eclipse.debug.core.ATTR_FORCE_SYSTEM_CONSOLE_ENCODING" value="false"/>
+    <booleanAttribute key="org.eclipse.jdt.launching.ATTR_ATTR_USE_ARGFILE" value="false"/>
+    <booleanAttribute key="org.eclipse.jdt.launching.ATTR_SHOW_CODEDETAILS_IN_EXCEPTION_MESSAGES" value="true"/>
+    <booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
+    <listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+        <listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
+    </listAttribute>
+    <booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="true"/>
+    <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+    <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -nosplash"/>
+    <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+    <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx768m&#10;-XX:MaxPermSize=256m"/>
+    <stringAttribute key="pde.version" value="3.3"/>
+    <stringAttribute key="product" value="org.eclipse.platform.ide"/>
+    <setAttribute key="selected_features"/>
+    <setAttribute key="selected_target_bundles">
+        <setEntry value="com.ibm.icu@default:default"/>
+        <setEntry value="com.ning.async-http-client@default:default"/>
+        <setEntry value="javax.annotation@default:default"/>
+        <setEntry value="javax.inject@default:default"/>
+        <setEntry value="javax.servlet@default:default"/>
+        <setEntry value="javax.xml@default:default"/>
+        <setEntry value="org.apache.batik.css@default:default"/>
+        <setEntry value="org.apache.batik.util.gui@default:default"/>
+        <setEntry value="org.apache.batik.util@default:default"/>
+        <setEntry value="org.apache.commons.codec@default:default"/>
+        <setEntry value="org.apache.commons.collections@default:default"/>
+        <setEntry value="org.apache.commons.httpclient@default:default"/>
+        <setEntry value="org.apache.commons.io@default:default"/>
+        <setEntry value="org.apache.commons.logging*1.1.1.v201101211721@default:default"/>
+        <setEntry value="org.apache.lucene.analysis@default:default"/>
+        <setEntry value="org.apache.lucene.core@default:default"/>
+        <setEntry value="org.eclipse.ant.core@default:default"/>
+        <setEntry value="org.eclipse.compare.core@default:default"/>
+        <setEntry value="org.eclipse.compare@default:default"/>
+        <setEntry value="org.eclipse.core.commands@default:default"/>
+        <setEntry value="org.eclipse.core.contenttype@default:default"/>
+        <setEntry value="org.eclipse.core.databinding.observable@default:default"/>
+        <setEntry value="org.eclipse.core.databinding.property@default:default"/>
+        <setEntry value="org.eclipse.core.databinding@default:default"/>
+        <setEntry value="org.eclipse.core.expressions@default:default"/>
+        <setEntry value="org.eclipse.core.filebuffers@default:default"/>
+        <setEntry value="org.eclipse.core.filesystem.linux.x86_64@default:false"/>
+        <setEntry value="org.eclipse.core.filesystem@default:default"/>
+        <setEntry value="org.eclipse.core.jobs@default:default"/>
+        <setEntry value="org.eclipse.core.net.linux.x86_64@default:false"/>
+        <setEntry value="org.eclipse.core.net@default:default"/>
+        <setEntry value="org.eclipse.core.resources@default:default"/>
+        <setEntry value="org.eclipse.core.runtime.compatibility.registry@default:false"/>
+        <setEntry value="org.eclipse.core.runtime@default:true"/>
+        <setEntry value="org.eclipse.core.variables@default:default"/>
+        <setEntry value="org.eclipse.debug.core@default:default"/>
+        <setEntry value="org.eclipse.debug.ui@default:default"/>
+        <setEntry value="org.eclipse.e4.core.commands@default:default"/>
+        <setEntry value="org.eclipse.e4.core.contexts@default:default"/>
+        <setEntry value="org.eclipse.e4.core.di.extensions@default:default"/>
+        <setEntry value="org.eclipse.e4.core.di@default:default"/>
+        <setEntry value="org.eclipse.e4.core.services@default:default"/>
+        <setEntry value="org.eclipse.e4.ui.bindings@default:default"/>
+        <setEntry value="org.eclipse.e4.ui.css.core@default:default"/>
+        <setEntry value="org.eclipse.e4.ui.css.swt.theme@default:default"/>
+        <setEntry value="org.eclipse.e4.ui.css.swt@default:default"/>
+        <setEntry value="org.eclipse.e4.ui.di@default:default"/>
+        <setEntry value="org.eclipse.e4.ui.model.workbench@default:default"/>
+        <setEntry value="org.eclipse.e4.ui.services@default:default"/>
+        <setEntry value="org.eclipse.e4.ui.widgets@default:default"/>
+        <setEntry value="org.eclipse.e4.ui.workbench.addons.swt@default:default"/>
+        <setEntry value="org.eclipse.e4.ui.workbench.renderers.swt@default:default"/>
+        <setEntry value="org.eclipse.e4.ui.workbench.swt@default:default"/>
+        <setEntry value="org.eclipse.e4.ui.workbench3@default:default"/>
+        <setEntry value="org.eclipse.e4.ui.workbench@default:default"/>
+        <setEntry value="org.eclipse.emf.common@default:default"/>
+        <setEntry value="org.eclipse.emf.ecore.change@default:default"/>
+        <setEntry value="org.eclipse.emf.ecore.xmi@default:default"/>
+        <setEntry value="org.eclipse.emf.ecore@default:default"/>
+        <setEntry value="org.eclipse.equinox.app@default:default"/>
+        <setEntry value="org.eclipse.equinox.bidi@default:default"/>
+        <setEntry value="org.eclipse.equinox.common@2:true"/>
+        <setEntry value="org.eclipse.equinox.ds@1:true"/>
+        <setEntry value="org.eclipse.equinox.event@default:default"/>
+        <setEntry value="org.eclipse.equinox.frameworkadmin.equinox@default:default"/>
+        <setEntry value="org.eclipse.equinox.frameworkadmin@default:default"/>
+        <setEntry value="org.eclipse.equinox.http.jetty@default:default"/>
+        <setEntry value="org.eclipse.equinox.http.servlet@default:default"/>
+        <setEntry value="org.eclipse.equinox.p2.artifact.repository@default:default"/>
+        <setEntry value="org.eclipse.equinox.p2.core@default:default"/>
+        <setEntry value="org.eclipse.equinox.p2.director@default:default"/>
+        <setEntry value="org.eclipse.equinox.p2.engine@default:default"/>
+        <setEntry value="org.eclipse.equinox.p2.jarprocessor@default:default"/>
+        <setEntry value="org.eclipse.equinox.p2.metadata.repository@default:default"/>
+        <setEntry value="org.eclipse.equinox.p2.metadata@default:default"/>
+        <setEntry value="org.eclipse.equinox.p2.operations@default:default"/>
+        <setEntry value="org.eclipse.equinox.p2.publisher.eclipse@default:default"/>
+        <setEntry value="org.eclipse.equinox.p2.publisher@default:default"/>
+        <setEntry value="org.eclipse.equinox.p2.repository@default:default"/>
+        <setEntry value="org.eclipse.equinox.p2.ui@default:default"/>
+        <setEntry value="org.eclipse.equinox.p2.updatesite@default:default"/>
+        <setEntry value="org.eclipse.equinox.preferences@default:default"/>
+        <setEntry value="org.eclipse.equinox.registry@default:default"/>
+        <setEntry value="org.eclipse.equinox.security.ui@default:default"/>
+        <setEntry value="org.eclipse.equinox.security@default:default"/>
+        <setEntry value="org.eclipse.equinox.simpleconfigurator.manipulator@default:default"/>
+        <setEntry value="org.eclipse.equinox.simpleconfigurator@1:true"/>
+        <setEntry value="org.eclipse.equinox.util@default:default"/>
+        <setEntry value="org.eclipse.help.base@default:default"/>
+        <setEntry value="org.eclipse.help.ui@default:default"/>
+        <setEntry value="org.eclipse.help@default:default"/>
+        <setEntry value="org.eclipse.jdt.compiler.apt@default:false"/>
+        <setEntry value="org.eclipse.jdt.compiler.tool@default:false"/>
+        <setEntry value="org.eclipse.jdt.core.manipulation@default:default"/>
+        <setEntry value="org.eclipse.jdt.core@default:default"/>
+        <setEntry value="org.eclipse.jdt.debug.ui@default:default"/>
+        <setEntry value="org.eclipse.jdt.debug@default:default"/>
+        <setEntry value="org.eclipse.jdt.launching@default:default"/>
+        <setEntry value="org.eclipse.jdt.ui@default:default"/>
+        <setEntry value="org.eclipse.jetty.continuation@default:default"/>
+        <setEntry value="org.eclipse.jetty.http@default:default"/>
+        <setEntry value="org.eclipse.jetty.io@default:default"/>
+        <setEntry value="org.eclipse.jetty.security@default:default"/>
+        <setEntry value="org.eclipse.jetty.server@default:default"/>
+        <setEntry value="org.eclipse.jetty.servlet@default:default"/>
+        <setEntry value="org.eclipse.jetty.util@default:default"/>
+        <setEntry value="org.eclipse.jface.databinding@default:default"/>
+        <setEntry value="org.eclipse.jface.text@default:default"/>
+        <setEntry value="org.eclipse.jface@default:default"/>
+        <setEntry value="org.eclipse.jst.common.project.facet.core@default:default"/>
+        <setEntry value="org.eclipse.jst.server.core@default:default"/>
+        <setEntry value="org.eclipse.ltk.core.refactoring@default:default"/>
+        <setEntry value="org.eclipse.ltk.ui.refactoring@default:default"/>
+        <setEntry value="org.eclipse.m2e.archetype.common@default:default"/>
+        <setEntry value="org.eclipse.m2e.core@default:default"/>
+        <setEntry value="org.eclipse.m2e.maven.indexer@default:default"/>
+        <setEntry value="org.eclipse.m2e.maven.runtime@default:default"/>
+        <setEntry value="org.eclipse.osgi.services@default:default"/>
+        <setEntry value="org.eclipse.osgi@-1:true"/>
+        <setEntry value="org.eclipse.platform@default:default"/>
+        <setEntry value="org.eclipse.search@default:default"/>
+        <setEntry value="org.eclipse.swt.gtk.linux.x86_64@default:false"/>
+        <setEntry value="org.eclipse.swt@default:default"/>
+        <setEntry value="org.eclipse.team.core@default:default"/>
+        <setEntry value="org.eclipse.team.ui@default:default"/>
+        <setEntry value="org.eclipse.text@default:default"/>
+        <setEntry value="org.eclipse.ui.browser@default:default"/>
+        <setEntry value="org.eclipse.ui.cheatsheets@default:default"/>
+        <setEntry value="org.eclipse.ui.console@default:default"/>
+        <setEntry value="org.eclipse.ui.editors@default:default"/>
+        <setEntry value="org.eclipse.ui.forms@default:default"/>
+        <setEntry value="org.eclipse.ui.ide.application@default:default"/>
+        <setEntry value="org.eclipse.ui.ide@default:default"/>
+        <setEntry value="org.eclipse.ui.intro@default:default"/>
+        <setEntry value="org.eclipse.ui.navigator.resources@default:default"/>
+        <setEntry value="org.eclipse.ui.navigator@default:default"/>
+        <setEntry value="org.eclipse.ui.trace@default:default"/>
+        <setEntry value="org.eclipse.ui.views.properties.tabbed@default:default"/>
+        <setEntry value="org.eclipse.ui.views@default:default"/>
+        <setEntry value="org.eclipse.ui.workbench.texteditor@default:default"/>
+        <setEntry value="org.eclipse.ui.workbench@default:default"/>
+        <setEntry value="org.eclipse.ui@default:default"/>
+        <setEntry value="org.eclipse.wst.common.core@default:default"/>
+        <setEntry value="org.eclipse.wst.common.project.facet.core@default:default"/>
+        <setEntry value="org.eclipse.wst.common.project.facet.ui@default:default"/>
+        <setEntry value="org.eclipse.wst.internet.monitor.core@default:default"/>
+        <setEntry value="org.eclipse.wst.server.core@default:default"/>
+        <setEntry value="org.eclipse.wst.server.discovery@default:default"/>
+        <setEntry value="org.eclipse.wst.server.ui@default:default"/>
+        <setEntry value="org.hamcrest.core@default:default"/>
+        <setEntry value="org.jboss.netty@default:default"/>
+        <setEntry value="org.json@default:default"/>
+        <setEntry value="org.junit@default:default"/>
+        <setEntry value="org.sat4j.core@default:default"/>
+        <setEntry value="org.sat4j.pb@default:default"/>
+        <setEntry value="org.slf4j.api@default:default"/>
+        <setEntry value="org.w3c.css.sac@default:default"/>
+        <setEntry value="org.w3c.dom.smil@default:default"/>
+        <setEntry value="org.w3c.dom.svg@default:default"/>
+    </setAttribute>
+    <setAttribute key="selected_workspace_bundles">
+        <setEntry value="org.apache.sling.ide.api@default:default"/>
+        <setEntry value="org.apache.sling.ide.artifacts@default:default"/>
+        <setEntry value="org.apache.sling.ide.eclipse-core@default:default"/>
+        <setEntry value="org.apache.sling.ide.eclipse-m2e-test@default:false"/>
+        <setEntry value="org.apache.sling.ide.eclipse-m2e-ui@default:default"/>
+        <setEntry value="org.apache.sling.ide.eclipse-ui@default:default"/>
+        <setEntry value="org.apache.sling.ide.impl-resource@default:default"/>
+        <setEntry value="org.apache.sling.ide.impl-vlt@default:default"/>
+        <setEntry value="org.apache.sling.ide.vlt-wrapper@default:default"/>
+    </setAttribute>
+    <booleanAttribute key="show_selected_only" value="false"/>
+    <stringAttribute key="templateConfig" value="${target_home}/configuration/config.ini"/>
+    <booleanAttribute key="tracing" value="false"/>
+    <mapAttribute key="tracingOptions">
+        <mapEntry key="org.apache.sling.ide.eclipse-core/debug" value="true"/>
+        <mapEntry key="org.apache.sling.ide.impl-resource/debug" value="true"/>
+        <mapEntry key="org.eclipse.core.contenttype/debug" value="false"/>
+        <mapEntry key="org.eclipse.core.expressions/debug/TypeExtensionManager" value="false"/>
+        <mapEntry key="org.eclipse.core.expressions/tracePropertyResolving" value="false"/>
+        <mapEntry key="org.eclipse.core.jobs/jobs" value="false"/>
+        <mapEntry key="org.eclipse.core.jobs/jobs/beginend" value="false"/>
+        <mapEntry key="org.eclipse.core.jobs/jobs/errorondeadlock" value="false"/>
+        <mapEntry key="org.eclipse.core.jobs/jobs/locks" value="false"/>
+        <mapEntry key="org.eclipse.core.jobs/jobs/shutdown" value="false"/>
+        <mapEntry key="org.eclipse.core.jobs/jobs/timing" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/build/delta" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/build/failure" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/build/interrupt" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/build/invoking" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/build/needbuild" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/build/needbuildstack" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/build/stacktrace" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/contenttype" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/contenttype/cache" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/debug" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/history" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/natures" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/perf/builders" value="10000"/>
+        <mapEntry key="org.eclipse.core.resources/perf/listeners" value="500"/>
+        <mapEntry key="org.eclipse.core.resources/perf/save.participants" value="500"/>
+        <mapEntry key="org.eclipse.core.resources/perf/snapshot" value="1000"/>
+        <mapEntry key="org.eclipse.core.resources/preferences" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/refresh" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/restore" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/restore/markers" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/restore/mastertable" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/restore/metainfo" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/restore/snapshots" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/restore/syncinfo" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/restore/tree" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/save" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/save/markers" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/save/mastertable" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/save/metainfo" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/save/syncinfo" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/save/tree" value="false"/>
+        <mapEntry key="org.eclipse.core.resources/strings" value="false"/>
+        <mapEntry key="org.eclipse.core.runtime/compatibility/debug" value="false"/>
+        <mapEntry key="org.eclipse.core.runtime/debug" value="false"/>
+        <mapEntry key="org.eclipse.core.runtime/debug/context" value="false"/>
+        <mapEntry key="org.eclipse.core.runtime/perf" value="false"/>
+        <mapEntry key="org.eclipse.core.runtime/perf/success" value="false"/>
+        <mapEntry key="org.eclipse.core.runtime/preferences/plugin" value="false"/>
+        <mapEntry key="org.eclipse.core.runtime/url/debug" value="false"/>
+        <mapEntry key="org.eclipse.core.runtime/url/debug/cachecopy" value="false"/>
+        <mapEntry key="org.eclipse.core.runtime/url/debug/cachelookup" value="false"/>
+        <mapEntry key="org.eclipse.core.runtime/url/debug/connect" value="false"/>
+        <mapEntry key="org.eclipse.debug.core/debug" value="false"/>
+        <mapEntry key="org.eclipse.debug.core/debug/commands" value="false"/>
+        <mapEntry key="org.eclipse.debug.core/debug/events" value="false"/>
+        <mapEntry key="org.eclipse.debug.ui/debug" value="false"/>
+        <mapEntry key="org.eclipse.debug.ui/debug/breadcrumb" value="false"/>
+        <mapEntry key="org.eclipse.debug.ui/debug/contextlaunching" value="false"/>
+        <mapEntry key="org.eclipse.debug.ui/debug/launchhistory" value="false"/>
+        <mapEntry key="org.eclipse.debug.ui/debug/memory/dynamicLoading" value="false"/>
+        <mapEntry key="org.eclipse.debug.ui/debug/viewers/breakpointDeltas" value="false"/>
+        <mapEntry key="org.eclipse.debug.ui/debug/viewers/contentProvider" value="false"/>
+        <mapEntry key="org.eclipse.debug.ui/debug/viewers/deltas" value="false"/>
+        <mapEntry key="org.eclipse.debug.ui/debug/viewers/model" value="false"/>
+        <mapEntry key="org.eclipse.debug.ui/debug/viewers/presentationId" value=""/>
+        <mapEntry key="org.eclipse.debug.ui/debug/viewers/stateSaveRestore" value="false"/>
+        <mapEntry key="org.eclipse.debug.ui/debug/viewers/updateSequence" value="false"/>
+        <mapEntry key="org.eclipse.debug.ui/debug/viewers/viewer" value="false"/>
+        <mapEntry key="org.eclipse.e4.core.contexts/debug" value="false"/>
+        <mapEntry key="org.eclipse.e4.core.contexts/debug/listeners" value="false"/>
+        <mapEntry key="org.eclipse.e4.core.contexts/debug/names" value="false"/>
+        <mapEntry key="org.eclipse.e4.core.di/debug" value="false"/>
+        <mapEntry key="org.eclipse.e4.core.di/debug/injector" value="false"/>
+        <mapEntry key="org.eclipse.e4.core.services/debug" value="false"/>
+        <mapEntry key="org.eclipse.e4.core.services/debug/injector" value="false"/>
+        <mapEntry key="org.eclipse.e4.ui.workbench.swt/debug" value="false"/>
+        <mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/commands" value="false"/>
+        <mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/eclipse.context" value="false"/>
+        <mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/eclipse.context.verbose" value="false"/>
+        <mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/menus" value="false"/>
+        <mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/renderer" value="false"/>
+        <mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/workbench" value="false"/>
+        <mapEntry key="org.eclipse.e4.ui.workbench/debug" value="false"/>
+        <mapEntry key="org.eclipse.e4.ui.workbench/trace/commands" value="false"/>
+        <mapEntry key="org.eclipse.e4.ui.workbench/trace/eclipse.context" value="false"/>
+        <mapEntry key="org.eclipse.e4.ui.workbench/trace/eclipse.context.verbose" value="false"/>
+        <mapEntry key="org.eclipse.e4.ui.workbench/trace/menus" value="false"/>
+        <mapEntry key="org.eclipse.e4.ui.workbench/trace/renderer" value="false"/>
+        <mapEntry key="org.eclipse.e4.ui.workbench/trace/workbench" value="false"/>
+        <mapEntry key="org.eclipse.equinox.ds/debug" value="true"/>
+        <mapEntry key="org.eclipse.equinox.ds/instantiate_all" value="true"/>
+        <mapEntry key="org.eclipse.equinox.ds/performance" value="false"/>
+        <mapEntry key="org.eclipse.equinox.ds/print_on_console" value="true"/>
+        <mapEntry key="org.eclipse.equinox.p2.engine/certificatechecker/unsigned" value="false"/>
+        <mapEntry key="org.eclipse.equinox.p2.engine/certificatechecker/untrusted" value="false"/>
+        <mapEntry key="org.eclipse.equinox.p2.engine/engine/debug" value="false"/>
+        <mapEntry key="org.eclipse.equinox.p2.engine/enginesession/debug" value="false"/>
+        <mapEntry key="org.eclipse.equinox.p2.engine/profileregistry/debug" value="false"/>
+        <mapEntry key="org.eclipse.equinox.preferences/general" value="false"/>
+        <mapEntry key="org.eclipse.equinox.preferences/get" value="false"/>
+        <mapEntry key="org.eclipse.equinox.preferences/set" value="false"/>
+        <mapEntry key="org.eclipse.equinox.registry/debug" value="false"/>
+        <mapEntry key="org.eclipse.equinox.registry/debug/events" value="false"/>
+        <mapEntry key="org.eclipse.equinox.security.ui/debug" value="false"/>
+        <mapEntry key="org.eclipse.equinox.security.ui/debug/storage" value="false"/>
+        <mapEntry key="org.eclipse.equinox.security/debug" value="false"/>
+        <mapEntry key="org.eclipse.equinox.security/debug/loginFramework" value="false"/>
+        <mapEntry key="org.eclipse.help.ui/debug" value="true"/>
+        <mapEntry key="org.eclipse.help.ui/debug/embeddedBrowser" value="false"/>
+        <mapEntry key="org.eclipse.help.ui/debug/embeddedBrowser/inprocess" value="false"/>
+        <mapEntry key="org.eclipse.help.ui/debug/infopop" value="false"/>
+        <mapEntry key="org.eclipse.help.webapp/debug" value="true"/>
+        <mapEntry key="org.eclipse.help.webapp/debug/workingsets" value="false"/>
+        <mapEntry key="org.eclipse.help/debug" value="true"/>
+        <mapEntry key="org.eclipse.help/debug/context" value="false"/>
+        <mapEntry key="org.eclipse.help/debug/search" value="false"/>
+        <mapEntry key="org.eclipse.help/debug/toc" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core.manipulation/debug" value="true"/>
+        <mapEntry key="org.eclipse.jdt.core/debug" value="true"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/buffermanager" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/builder" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/builder/stats" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/compiler" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/completion" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/cpresolution" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/cpresolution/advanced" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/cpresolution/failure" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/formatter" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/hierarchy" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/indexmanager" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/indexmanager/advanced" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/javadelta" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/javadelta/verbose" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/javamodel" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/javamodel/cache" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/postaction" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/resolution" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/search" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/selection" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/sourcemapper" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/debug/zipaccess" value="false"/>
+        <mapEntry key="org.eclipse.jdt.core/perf/completion" value="300"/>
+        <mapEntry key="org.eclipse.jdt.core/perf/containerinitializer" value="5000"/>
+        <mapEntry key="org.eclipse.jdt.core/perf/javadeltalistener" value="500"/>
+        <mapEntry key="org.eclipse.jdt.core/perf/reconcile" value="1000"/>
+        <mapEntry key="org.eclipse.jdt.core/perf/selection" value="300"/>
+        <mapEntry key="org.eclipse.jdt.core/perf/variableinitializer" value="5000"/>
+        <mapEntry key="org.eclipse.jdt.debug/debug" value="false"/>
+        <mapEntry key="org.eclipse.jdt.debug/debug/astEvaluations" value="false"/>
+        <mapEntry key="org.eclipse.jdt.debug/debug/astEvaluations/callingThreads" value="false"/>
+        <mapEntry key="org.eclipse.jdt.debug/debug/jdiEvents" value="false"/>
+        <mapEntry key="org.eclipse.jdt.debug/debug/jdiRequestTimes" value="false"/>
+        <mapEntry key="org.eclipse.jdt.launching/debug" value="false"/>
+        <mapEntry key="org.eclipse.jdt.launching/debug/classpath/jreContainer" value="false"/>
+        <mapEntry key="org.eclipse.jdt.ui/debug" value="true"/>
+        <mapEntry key="org.eclipse.jdt.ui/debug/ASTProvider" value="false"/>
+        <mapEntry key="org.eclipse.jdt.ui/debug/BreadcrumbItemDropDown" value="false"/>
+        <mapEntry key="org.eclipse.jdt.ui/debug/ResultCollector" value="false"/>
+        <mapEntry key="org.eclipse.jdt.ui/debug/TypeConstraints" value="false"/>
+        <mapEntry key="org.eclipse.jdt.ui/perf/content_assist/extensions" value="1000"/>
+        <mapEntry key="org.eclipse.jdt.ui/perf/content_assist_sorters/extensions" value=""/>
+        <mapEntry key="org.eclipse.jdt.ui/perf/explorer/RefactorActionGroup" value="150"/>
+        <mapEntry key="org.eclipse.jdt.ui/perf/explorer/createPartControl" value="1300"/>
+        <mapEntry key="org.eclipse.jdt.ui/perf/explorer/makeActions" value="1000"/>
+        <mapEntry key="org.eclipse.jdt.ui/perf/search/participants" value="300"/>
+        <mapEntry key="org.eclipse.jem.util/debug/loglevel" value="WARNING"/>
+        <mapEntry key="org.eclipse.jem.util/debug/logtrace" value="false"/>
+        <mapEntry key="org.eclipse.jem.util/debug/logtracefile" value="false"/>
+        <mapEntry key="org.eclipse.jface.text.source/debug/RevisionRulerColumn" value="false"/>
+        <mapEntry key="org.eclipse.jface.text/assert/TextSelection/validConstructorArguments" value="false"/>
+        <mapEntry key="org.eclipse.jface.text/debug/AbstractInformationControlManager" value="false"/>
+        <mapEntry key="org.eclipse.jface.text/debug/AnnotationPainter" value="false"/>
+        <mapEntry key="org.eclipse.jface.text/debug/ContentAssistSubjectAdapters" value="false"/>
+        <mapEntry key="org.eclipse.jface.text/debug/FastPartitioner/PositionCache" value="false"/>
+        <mapEntry key="org.eclipse.ltk.core.refactoring/perf/participants/checkConditions" value="300"/>
+        <mapEntry key="org.eclipse.ltk.core.refactoring/perf/participants/createChanges" value="300"/>
+        <mapEntry key="org.eclipse.osgi/debug" value="false"/>
+        <mapEntry key="org.eclipse.osgi/debug/bundleTime" value="false"/>
+        <mapEntry key="org.eclipse.osgi/debug/events" value="false"/>
+        <mapEntry key="org.eclipse.osgi/debug/filter" value="false"/>
+        <mapEntry key="org.eclipse.osgi/debug/loader" value="false"/>
+        <mapEntry key="org.eclipse.osgi/debug/manifest" value="false"/>
+        <mapEntry key="org.eclipse.osgi/debug/messageBundles" value="false"/>
+        <mapEntry key="org.eclipse.osgi/debug/objectPool/adds" value="false"/>
+        <mapEntry key="org.eclipse.osgi/debug/objectPool/dups" value="false"/>
+        <mapEntry key="org.eclipse.osgi/debug/packageadmin" value="false"/>
+        <mapEntry key="org.eclipse.osgi/debug/security" value="false"/>
+        <mapEntry key="org.eclipse.osgi/debug/services" value="false"/>
+        <mapEntry key="org.eclipse.osgi/debug/startlevel" value="false"/>
+        <mapEntry key="org.eclipse.osgi/defaultprofile/buffersize" value="256"/>
+        <mapEntry key="org.eclipse.osgi/defaultprofile/logfilename" value=""/>
+        <mapEntry key="org.eclipse.osgi/defaultprofile/logsynchronously" value="false"/>
+        <mapEntry key="org.eclipse.osgi/eclipseadaptor/converter/debug" value="false"/>
+        <mapEntry key="org.eclipse.osgi/eclipseadaptor/debug" value="false"/>
+        <mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/cachedmanifest" value="false"/>
+        <mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/location" value="false"/>
+        <mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin" value="false"/>
+        <mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin/resolver" value="false"/>
+        <mapEntry key="org.eclipse.osgi/monitor/activation" value="false"/>
+        <mapEntry key="org.eclipse.osgi/monitor/classes" value="false"/>
+        <mapEntry key="org.eclipse.osgi/monitor/resources" value="false"/>
+        <mapEntry key="org.eclipse.osgi/profile/benchmark" value="false"/>
+        <mapEntry key="org.eclipse.osgi/profile/debug" value="false"/>
+        <mapEntry key="org.eclipse.osgi/profile/impl" value="org.eclipse.osgi.internal.profile.DefaultProfileLogger"/>
+        <mapEntry key="org.eclipse.osgi/profile/startup" value="false"/>
+        <mapEntry key="org.eclipse.osgi/resolver/cycles" value="false"/>
+        <mapEntry key="org.eclipse.osgi/resolver/debug" value="false"/>
+        <mapEntry key="org.eclipse.osgi/resolver/generics" value="false"/>
+        <mapEntry key="org.eclipse.osgi/resolver/imports" value="false"/>
+        <mapEntry key="org.eclipse.osgi/resolver/requires" value="false"/>
+        <mapEntry key="org.eclipse.osgi/resolver/uses" value="false"/>
+        <mapEntry key="org.eclipse.osgi/resolver/wiring" value="false"/>
+        <mapEntry key="org.eclipse.osgi/trace/activation" value="false"/>
+        <mapEntry key="org.eclipse.osgi/trace/classLoading" value="false"/>
+        <mapEntry key="org.eclipse.osgi/trace/filename" value="runtime.traces"/>
+        <mapEntry key="org.eclipse.osgi/trace/filters" value="trace.properties"/>
+        <mapEntry key="org.eclipse.team.core/backgroundevents" value="false"/>
+        <mapEntry key="org.eclipse.team.core/debug" value="false"/>
+        <mapEntry key="org.eclipse.team.core/refreshjob" value="false"/>
+        <mapEntry key="org.eclipse.team.core/streams" value="false"/>
+        <mapEntry key="org.eclipse.team.core/threading" value="false"/>
+        <mapEntry key="org.eclipse.ui.browser/debug" value="false"/>
+        <mapEntry key="org.eclipse.ui.ide/debug" value="false"/>
+        <mapEntry key="org.eclipse.ui.ide/debug/gc" value="false"/>
+        <mapEntry key="org.eclipse.ui.ide/debug/internalerror/openDialog" value="false"/>
+        <mapEntry key="org.eclipse.ui.ide/debug/markers" value="false"/>
+        <mapEntry key="org.eclipse.ui.ide/debug/undomonitor" value="false"/>
+        <mapEntry key="org.eclipse.ui.intro.universal/debug" value="true"/>
+        <mapEntry key="org.eclipse.ui.intro.universal/trace/logInfo" value="true"/>
+        <mapEntry key="org.eclipse.ui.intro.universal/trace/logPerformance" value="false"/>
+        <mapEntry key="org.eclipse.ui.intro/debug" value="true"/>
+        <mapEntry key="org.eclipse.ui.intro/debug/toolbar" value="false"/>
+        <mapEntry key="org.eclipse.ui.intro/flags/noBrowser" value="false"/>
+        <mapEntry key="org.eclipse.ui.intro/trace/logInfo" value="true"/>
+        <mapEntry key="org.eclipse.ui.intro/trace/logPerformance" value="false"/>
+        <mapEntry key="org.eclipse.ui.intro/trace/printHTML" value="false"/>
+        <mapEntry key="org.eclipse.ui.navigator/debug" value="false"/>
+        <mapEntry key="org.eclipse.ui.navigator/debug/dnd" value="false"/>
+        <mapEntry key="org.eclipse.ui.navigator/debug/resolution" value="false"/>
+        <mapEntry key="org.eclipse.ui.navigator/debug/setup" value="false"/>
+        <mapEntry key="org.eclipse.ui.navigator/debug/sort" value="false"/>
+        <mapEntry key="org.eclipse.ui.navigator/debug/viewermap" value="false"/>
+        <mapEntry key="org.eclipse.ui.navigator/perf/explorer/createPartControl" value="1300"/>
+        <mapEntry key="org.eclipse.ui.workbench/debug" value="false"/>
+        <mapEntry key="org.eclipse.ui.workbench/debug/e4" value="false"/>
+        <mapEntry key="org.eclipse.ui/debug" value="false"/>
+        <mapEntry key="org.eclipse.ui/debug/contributions" value="false"/>
+        <mapEntry key="org.eclipse.ui/debug/declaredImages" value="false"/>
+        <mapEntry key="org.eclipse.ui/debug/job.stale" value="false"/>
+        <mapEntry key="org.eclipse.ui/debug/showAllJobs" value="false"/>
+        <mapEntry key="org.eclipse.ui/debug/swtdebug" value="false"/>
+        <mapEntry key="org.eclipse.ui/debug/swtdebugglobal" value="false"/>
+        <mapEntry key="org.eclipse.ui/debug/workingSets" value="false"/>
+        <mapEntry key="org.eclipse.ui/experimental/menus" value="false"/>
+        <mapEntry key="org.eclipse.ui/listeners/IWorkbenchPage.IPartListener" value="false"/>
+        <mapEntry key="org.eclipse.ui/listeners/IWorkbenchPage.IPartListener2" value="false"/>
+        <mapEntry key="org.eclipse.ui/listeners/IWorkbenchPage.IPropertyChangeListener" value="false"/>
+        <mapEntry key="org.eclipse.ui/listeners/IWorkbenchPartReference" value="false"/>
+        <mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPageListener" value="false"/>
+        <mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPartListener" value="false"/>
+        <mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPartListener2" value="false"/>
+        <mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPerspectiveListener" value="false"/>
+        <mapEntry key="org.eclipse.ui/perf/contentTypes" value="200"/>
+        <mapEntry key="org.eclipse.ui/perf/page.listeners" value="200"/>
+        <mapEntry key="org.eclipse.ui/perf/part.activate" value="200"/>
+        <mapEntry key="org.eclipse.ui/perf/part.control" value="800"/>
+        <mapEntry key="org.eclipse.ui/perf/part.create" value="800"/>
+        <mapEntry key="org.eclipse.ui/perf/part.init" value="800"/>
+        <mapEntry key="org.eclipse.ui/perf/part.input" value="200"/>
+        <mapEntry key="org.eclipse.ui/perf/part.listeners" value="200"/>
+        <mapEntry key="org.eclipse.ui/perf/perspective.create" value="800"/>
+        <mapEntry key="org.eclipse.ui/perf/perspective.listeners" value="200"/>
+        <mapEntry key="org.eclipse.ui/perf/perspective.switch" value="800"/>
+        <mapEntry key="org.eclipse.ui/perf/showHeapStatus" value="true"/>
+        <mapEntry key="org.eclipse.ui/perf/uijob" value="200"/>
+        <mapEntry key="org.eclipse.ui/perf/workbench.restore" value="30000"/>
+        <mapEntry key="org.eclipse.ui/perf/workbench.start" value="45000"/>
+        <mapEntry key="org.eclipse.ui/trace/commands" value="false"/>
+        <mapEntry key="org.eclipse.ui/trace/contexts" value="false"/>
+        <mapEntry key="org.eclipse.ui/trace/contexts.performance" value="false"/>
+        <mapEntry key="org.eclipse.ui/trace/contexts.verbose" value="false"/>
+        <mapEntry key="org.eclipse.ui/trace/graphics" value="false"/>
+        <mapEntry key="org.eclipse.ui/trace/handlers" value="false"/>
+        <mapEntry key="org.eclipse.ui/trace/handlers.performance" value="false"/>
+        <mapEntry key="org.eclipse.ui/trace/handlers.verbose" value="false"/>
+        <mapEntry key="org.eclipse.ui/trace/handlers.verbose.commandId" value=""/>
+        <mapEntry key="org.eclipse.ui/trace/keyBindings" value="false"/>
+        <mapEntry key="org.eclipse.ui/trace/keyBindings.verbose" value="false"/>
+        <mapEntry key="org.eclipse.ui/trace/multipageeditor" value="false"/>
+        <mapEntry key="org.eclipse.ui/trace/operations" value="false"/>
+        <mapEntry key="org.eclipse.ui/trace/operations.verbose" value="false"/>
+        <mapEntry key="org.eclipse.ui/trace/perspectives" value="false"/>
+        <mapEntry key="org.eclipse.ui/trace/sources" value="false"/>
+        <mapEntry key="org.eclipse.update.configurator/debug" value="false"/>
+        <mapEntry key="org.eclipse.wst.common.environment/debug" value="true"/>
+        <mapEntry key="org.eclipse.wst.common.environment/trace/command" value="true"/>
+        <mapEntry key="org.eclipse.wst.common.environment/trace/data" value="true"/>
+        <mapEntry key="org.eclipse.wst.common.environment/trace/emitter" value="true"/>
+        <mapEntry key="org.eclipse.wst.common.environment/trace/error" value="true"/>
+        <mapEntry key="org.eclipse.wst.common.environment/trace/info" value="true"/>
+        <mapEntry key="org.eclipse.wst.common.environment/trace/warning" value="true"/>
+        <mapEntry key="org.eclipse.wst.common.environment/trace/ws_ant" value="true"/>
+        <mapEntry key="org.eclipse.wst.common.environment/trace/ws_dt_cmd_engine" value="true"/>
+        <mapEntry key="org.eclipse.wst.common.environment/trace/ws_framework" value="true"/>
+        <mapEntry key="org.eclipse.wst.common.project.facet.core/actionSorting" value="false"/>
+        <mapEntry key="org.eclipse.wst.common.project.facet.core/activation" value="false"/>
+        <mapEntry key="org.eclipse.wst.common.project.facet.core/delegate/calls" value="false"/>
+        <mapEntry key="org.eclipse.wst.common.project.facet.core/events/project" value="false"/>
+        <mapEntry key="org.eclipse.wst.common.project.facet.core/events/project/stacktrace" value="false"/>
+        <mapEntry key="org.eclipse.wst.common.project.facet.ui/propPage/actionConfigValidation" value="false"/>
+        <mapEntry key="org.eclipse.wst.internet.monitor.core/config" value="false"/>
+        <mapEntry key="org.eclipse.wst.internet.monitor.core/debug" value="true"/>
+        <mapEntry key="org.eclipse.wst.internet.monitor.core/finest" value="false"/>
+        <mapEntry key="org.eclipse.wst.internet.monitor.core/parsing" value="false"/>
+        <mapEntry key="org.eclipse.wst.internet.monitor.core/severe" value="false"/>
+        <mapEntry key="org.eclipse.wst.internet.monitor.core/warning" value="false"/>
+        <mapEntry key="org.eclipse.wst.server.core/config" value="false"/>
+        <mapEntry key="org.eclipse.wst.server.core/debug" value="true"/>
+        <mapEntry key="org.eclipse.wst.server.core/extension_point" value="false"/>
+        <mapEntry key="org.eclipse.wst.server.core/finer" value="false"/>
+        <mapEntry key="org.eclipse.wst.server.core/finest" value="false"/>
+        <mapEntry key="org.eclipse.wst.server.core/info" value="false"/>
+        <mapEntry key="org.eclipse.wst.server.core/listeners" value="false"/>
+        <mapEntry key="org.eclipse.wst.server.core/performance" value="false"/>
+        <mapEntry key="org.eclipse.wst.server.core/publishing" value="false"/>
+        <mapEntry key="org.eclipse.wst.server.core/resources" value="false"/>
+        <mapEntry key="org.eclipse.wst.server.core/runtime_target" value="false"/>
+        <mapEntry key="org.eclipse.wst.server.core/severe" value="false"/>
+        <mapEntry key="org.eclipse.wst.server.core/warning" value="false"/>
+        <mapEntry key="org.eclipse.wst.server.discovery/debug" value="true"/>
+        <mapEntry key="org.eclipse.wst.server.ui/config" value="true"/>
+        <mapEntry key="org.eclipse.wst.server.ui/debug" value="true"/>
+        <mapEntry key="org.eclipse.wst.server.ui/extension_point" value="true"/>
+        <mapEntry key="org.eclipse.wst.server.ui/finer" value="true"/>
+        <mapEntry key="org.eclipse.wst.server.ui/finest" value="false"/>
+        <mapEntry key="org.eclipse.wst.server.ui/info" value="true"/>
+        <mapEntry key="org.eclipse.wst.server.ui/performance" value="true"/>
+        <mapEntry key="org.eclipse.wst.server.ui/severe" value="true"/>
+        <mapEntry key="org.eclipse.wst.server.ui/warning" value="true"/>
+        <mapEntry key="org.eclipse.wst.validation/debug" value="true"/>
+        <mapEntry key="org.eclipse.wst.validation/extraValDetail" value=""/>
+        <mapEntry key="org.eclipse.wst.validation/filter/allExcept" value=""/>
+        <mapEntry key="org.eclipse.wst.validation/timings" value="false"/>
+        <mapEntry key="org.eclipse.wst.validation/timings/tracefile" value=""/>
+        <mapEntry key="org.eclipse.wst.validation/timings/useDoubles" value="false"/>
+        <mapEntry key="org.eclipse.wst.validation/trace/level" value=""/>
+        <mapEntry key="org.eclipse.wst.validation/v1" value="false"/>
+        <mapEntry key="org.eclipse.wtp.common/debug/loglevel" value="WARNING"/>
+        <mapEntry key="org.eclipse.wtp.common/debug/logtrace" value="false"/>
+        <mapEntry key="org.eclipse.wtp.common/debug/logtracefile" value="false"/>
+    </mapAttribute>
+    <booleanAttribute key="useCustomFeatures" value="false"/>
+    <booleanAttribute key="useDefaultConfig" value="true"/>
+    <booleanAttribute key="useDefaultConfigArea" value="true"/>
+    <booleanAttribute key="useProduct" value="true"/>
 </launchConfiguration>
diff --git a/eclipse/target-definition/org.apache.sling.ide.target-definition.target b/eclipse/target-definition/org.apache.sling.ide.target-definition.target
index efb33dc..7697de5 100644
--- a/eclipse/target-definition/org.apache.sling.ide.target-definition.target
+++ b/eclipse/target-definition/org.apache.sling.ide.target-definition.target
@@ -18,38 +18,51 @@
 <?pde version="3.8"?><target name="Sling IDE Tools" sequenceNumber="53">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="org.eclipse.m2e.feature.feature.group" version="1.6.0.20150526-2032"/>
-<repository location="https://download.eclipse.org/technology/m2e/releases/1.6"/>
+	<repository location="https://download.eclipse.org/releases/2022-09/"/>
+	<unit id="org.eclipse.m2e.feature.feature.group" version="2.0.4.20220904-1703"/>
+	<unit id="org.eclipse.jst.web_ui.feature.feature.group" version="3.27.0.v202206160204"/>
+	<unit id="org.eclipse.jst.enterprise_ui.feature.feature.group" version="3.27.0.v202206160204"/>
 </location>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="com.google.gson" version="2.2.4.v201311231704"/>
-<unit id="org.apache.commons.collections" version="3.2.2.v201511171945"/>
-<unit id="org.apache.commons.httpclient" version="3.1.0.v201012070820"/>
-<unit id="org.apache.commons.io" version="2.2.0.v201405211200"/>
-<unit id="org.apache.commons.lang" version="2.6.0.v201404270220"/>
-<unit id="org.hamcrest.core" version="1.3.0.v201303031735"/>
-<unit id="org.junit" version="4.12.0.v201504281640"/>
-<unit id="org.slf4j.api" version="1.7.10.v20170428-1633"/>
-<unit id="org.slf4j.binding.simple" version="1.7.10.v20160301-1109"/>
-<unit id="org.slf4j.apis.log4j" version="1.7.10.v20160208-0839"/>
-<repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20170516192513/repository/"/>
-</location>
+			<repository location="https://download.eclipse.org/eclipse/updates/4.25/"/><!--Keep in sync with repo-ref in org.eclipse.m2e.repository/category.xml-->
+			<unit id="org.eclipse.sdk.feature.group" version="0.0.0"/>
+			<unit id="org.eclipse.equinox.p2.discovery.feature.feature.group" version="0.0.0"/>
+			<unit id="org.eclipse.ui.tests.harness" version="0.0.0"/>
+			<unit id="org.mockito.mockito-core" version="0.0.0"/>
+			<unit id="org.eclipse.equinox.executable.feature.group" version="0.0.0"/>
+		</location>
+		<!-- need new version due to https://bugs.eclipse.org/bugs/show_bug.cgi?id=580708 -->
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="org.eclipse.jst.enterprise_ui.feature.feature.group" version="3.9.2.v201802121827"/>
-<unit id="org.eclipse.jst.server_adapters.feature.feature.group" version="3.2.400.v201711301708"/>
-<unit id="org.eclipse.jst.server_ui.feature.feature.group" version="3.4.300.v201709251835"/>
-<unit id="org.eclipse.jst.web_ui.feature.feature.group" version="3.9.0.v201802152012"/>
-<unit id="org.eclipse.platform.feature.group" version="4.7.3.v20180301-0715"/>
-<unit id="org.eclipse.wst.server_adapters.feature.feature.group" version="3.2.601.v201711302104"/>
-<unit id="org.eclipse.wst.web_ui.feature.feature.group" version="3.9.2.v201801171858"/>
-<unit id="org.eclipse.wst.xml_ui.feature.feature.group" version="3.9.2.v201801171858"/>
-<repository location="https://download.eclipse.org/releases/oxygen/"/>
+	<unit id="org.eclipse.swtbot.eclipse.feature.group" version="4.1.0.202210031105"/>
+	<repository location="https://download.eclipse.org/technology/swtbot/snapshots/"/>
 </location>
-<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="org.eclipse.swtbot.eclipse.feature.group" version="2.4.0.201604200752"/>
-<unit id="org.eclipse.swtbot.eclipse.test.junit.feature.group" version="2.4.0.201604200752"/>
-<unit id="org.eclipse.swtbot.feature.group" version="2.4.0.201604200752"/>
-<repository location="https://download.eclipse.org/technology/swtbot/releases/2.4.0/"/>
-</location>
+	<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+		<repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20220830213456/repository"/>
+		<unit id="com.google.gson" version="2.9.0.v20220704-0629"/>
+		<unit id="org.apache.httpcomponents.httpclient" version="4.5.13.v20210128-2225"/>
+	</location>
+	<location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven">
+		<dependencies>
+			<dependency>
+				<groupId>org.apache.sling.ide</groupId>
+				<artifactId>org.apache.sling.ide.api</artifactId>
+				<version>1.2.3-SNAPSHOT</version>
+				<type>jar</type>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.sling.ide</groupId>
+				<artifactId>org.apache.sling.ide.artifacts</artifactId>
+				<version>1.2.3-SNAPSHOT</version>
+				<type>jar</type>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.sling.ide</groupId>
+				<artifactId>org.apache.sling.ide.impl-vlt</artifactId>
+				<version>1.2.3-SNAPSHOT</version>
+				<type>jar</type>
+			</dependency>
+		</dependencies>
+	</location>
 </locations>
-</target>
+	<targetJRE path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17"/>
+</target>
\ No newline at end of file
diff --git a/shared/modules/.gitignore b/shared/.gitignore
similarity index 100%
rename from shared/modules/.gitignore
rename to shared/.gitignore
diff --git a/shared/modules/api/.project b/shared/api/.project
similarity index 72%
rename from shared/modules/api/.project
rename to shared/api/.project
index 53aa37e..6b308a6 100644
--- a/shared/modules/api/.project
+++ b/shared/api/.project
@@ -11,16 +11,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/shared/modules/api/README.md b/shared/api/README.md
similarity index 100%
rename from shared/modules/api/README.md
rename to shared/api/README.md
diff --git a/shared/modules/api/bnd.bnd b/shared/api/bnd.bnd
similarity index 100%
rename from shared/modules/api/bnd.bnd
rename to shared/api/bnd.bnd
diff --git a/shared/api/pom.xml b/shared/api/pom.xml
new file mode 100644
index 0000000..9fc914c
--- /dev/null
+++ b/shared/api/pom.xml
@@ -0,0 +1,209 @@
+<?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 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.apache.sling.ide</groupId>
+		<artifactId>sling-ide-shared-parent</artifactId>
+		<version>1.2.3-SNAPSHOT</version>
+		<relativePath>../parent/</relativePath>
+	</parent>
+
+	<artifactId>org.apache.sling.ide.api</artifactId>
+	<name>Apache Sling IDE Tools API</name>
+
+	<scm>
+		<connection>scm:git:https://gitbox.apache.org/repos/asf/sling-ide-tooling.git</connection>
+		<developerConnection>scm:git:https://gitbox.apache.org/repos/asf/sling-ide-tooling.git</developerConnection>
+		<url>https://gitbox.apache.org/repos/asf?p=sling-ide-tooling.git</url>
+	</scm>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-dependency-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>copy</id>
+						<phase>process-test-resources</phase>
+						<goals>
+							<goal>copy</goal>
+						</goals>
+						<configuration>
+							<outputDirectory>target/test-classes</outputDirectory>
+							<stripVersion>true</stripVersion>
+							<artifactItems>
+								<artifactItem>
+									<groupId>org.apache.sling</groupId>
+									<artifactId>org.apache.sling.tooling.support.install</artifactId>
+									<version>1.0.6</version>
+								</artifactItem>
+								<artifactItem>
+									<groupId>org.apache.sling</groupId>
+									<artifactId>org.apache.sling.tooling.support.source</artifactId>
+									<version>1.0.4</version>
+								</artifactItem>
+								<artifactItem>
+									<groupId>org.apache.sling</groupId>
+									<artifactId>org.apache.sling.commons.messaging</artifactId>
+									<version>1.0.2</version>
+								</artifactItem>
+							</artifactItems>
+							<!-- other configurations here -->
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>build-helper-maven-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>reserve-network-port</id>
+						<goals>
+							<goal>reserve-network-port</goal>
+						</goals>
+						<phase>pre-integration-test</phase>
+						<configuration>
+							<portNames>
+								<portName>http.port</portName>
+							</portNames>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-failsafe-plugin</artifactId>
+				<executions>
+					<execution>
+						<goals>
+							<goal>integration-test</goal>
+							<goal>verify</goal>
+						</goals>
+						<configuration>
+							<systemPropertyVariables>
+								<sling.starter.port>${http.port}</sling.starter.port>
+							</systemPropertyVariables>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<!-- launch the Sling instances to test; only oak-tar -->
+			<plugin>
+				<groupId>org.apache.sling</groupId>
+				<artifactId>feature-launcher-maven-plugin</artifactId>
+				<version>0.1.2</version>
+				<configuration>
+					<!-- newer versions don't work due to https://issues.apache.org/jira/browse/SLING-11158 -->
+					<featureLauncherVersion>1.1.26</featureLauncherVersion>
+					<launches>
+						<launch>
+							<id>sling-starter-oak-tar</id>
+							<!-- launch the regular Starter distribution (based on Oak with Segment Node Store) -->
+							<feature>
+								<groupId>org.apache.sling</groupId>
+								<artifactId>org.apache.sling.starter</artifactId>
+								<version>12</version>
+								<classifier>oak_tar</classifier>
+								<type>slingosgifeature</type>
+							</feature>
+							<launcherArguments>
+								<frameworkProperties>
+									<org.osgi.service.http.port>${http.port}</org.osgi.service.http.port>
+								</frameworkProperties>
+							</launcherArguments>
+							<startTimeoutSeconds>${startTimeoutSeconds}</startTimeoutSeconds>
+						</launch>
+					</launches>
+				</configuration>
+				<executions>
+					<execution>
+						<goals>
+							<goal>start</goal>
+							<goal>stop</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+	<dependencies>
+		<dependency>
+			<groupId>javax.jcr</groupId>
+			<artifactId>jcr</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpclient</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpmime</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<!-- gson should be internal -->
+		<dependency>
+			<groupId>com.google.code.gson</groupId>
+			<artifactId>gson</artifactId>
+			<version>2.8.0</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.framework</artifactId>
+			<scope>provided</scope>
+		</dependency>
+
+		<!-- Note that OSGi annotations are OK since they are not retained at compile time -->
+		<dependency>
+			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.annotation.versioning</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.service.component.annotations</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.service.metatype.annotations</artifactId>
+			<scope>provided</scope>
+		</dependency>
+
+		<!-- Test dependencies -->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-simple</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>commons-io</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>2.11.0</version>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+
+	<properties>
+		<startTimeoutSeconds>120</startTimeoutSeconds>
+	</properties>
+</project>
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/filter/Filter.java b/shared/api/src/main/java/org/apache/sling/ide/filter/Filter.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/filter/Filter.java
rename to shared/api/src/main/java/org/apache/sling/ide/filter/Filter.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/filter/FilterLocator.java b/shared/api/src/main/java/org/apache/sling/ide/filter/FilterLocator.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/filter/FilterLocator.java
rename to shared/api/src/main/java/org/apache/sling/ide/filter/FilterLocator.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/filter/FilterResult.java b/shared/api/src/main/java/org/apache/sling/ide/filter/FilterResult.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/filter/FilterResult.java
rename to shared/api/src/main/java/org/apache/sling/ide/filter/FilterResult.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/filter/IgnoredResources.java b/shared/api/src/main/java/org/apache/sling/ide/filter/IgnoredResources.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/filter/IgnoredResources.java
rename to shared/api/src/main/java/org/apache/sling/ide/filter/IgnoredResources.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/filter/package-info.java b/shared/api/src/main/java/org/apache/sling/ide/filter/package-info.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/filter/package-info.java
rename to shared/api/src/main/java/org/apache/sling/ide/filter/package-info.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/log/Logger.java b/shared/api/src/main/java/org/apache/sling/ide/log/Logger.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/log/Logger.java
rename to shared/api/src/main/java/org/apache/sling/ide/log/Logger.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/log/package-info.java b/shared/api/src/main/java/org/apache/sling/ide/log/package-info.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/log/package-info.java
rename to shared/api/src/main/java/org/apache/sling/ide/log/package-info.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/osgi/MavenSourceReference.java b/shared/api/src/main/java/org/apache/sling/ide/osgi/MavenSourceReference.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/osgi/MavenSourceReference.java
rename to shared/api/src/main/java/org/apache/sling/ide/osgi/MavenSourceReference.java
diff --git a/shared/api/src/main/java/org/apache/sling/ide/osgi/OsgiClient.java b/shared/api/src/main/java/org/apache/sling/ide/osgi/OsgiClient.java
new file mode 100644
index 0000000..00b58b8
--- /dev/null
+++ b/shared/api/src/main/java/org/apache/sling/ide/osgi/OsgiClient.java
@@ -0,0 +1,95 @@
+/*
+ * 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.ide.osgi;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.concurrent.TimeoutException;
+
+import org.osgi.framework.Version;
+
+/**
+ * The <tt>OsgiClient</tt> exposes information and actions related to the OSGi subsystem of Sling.
+ * It leverages ReST services exposed from the 
+ * <ol>
+ * <li><a href="https://felix.apache.org/documentation/subprojects/apache-felix-web-console/web-console-restful-api.html">Felix Web Console</a></li>
+ * <li><a href="https://github.com/apache/sling-org-apache-sling-tooling-support-install">Sling Tooling Support Install</a></li>
+ * <li><a href="https://github.com/apache/sling-org-apache-sling-tooling-support-source">Sling Tooling Support Source</a></li>
+ * </ol>
+ */
+public interface OsgiClient extends AutoCloseable {
+
+    Version getBundleVersion(String bundleSymbolicName) throws OsgiClientException;
+
+    void installBundle(InputStream in, String fileName) throws OsgiClientException;
+
+    /**
+     * Installs a bundle from a local directory
+     * 
+     * <p>
+     * The Sling launchpad instance must have filesystem access to the specified <tt>explodedBundleLocation</tt>
+     * </p>
+     * 
+     * @param explodedBundleLocation
+     * @throws OsgiClientException
+     */
+    void installLocalBundle(Path explodedBundleLocation) throws OsgiClientException;
+
+    /**
+     * Installs a local bundle from an already-built jar file
+     * 
+     * @param jarredBundle the contents of the jarred bundle
+     * @param sourceLocation the source location, for informative purposes only
+     * 
+     * @throws OsgiClientException
+     */
+    void installLocalBundle(InputStream jarredBundle, String sourceLocation) throws OsgiClientException;
+    
+    /**
+     * Finds source references for all bundles deployed in the Sling instance
+     * 
+     * @return the source references, possibly empty
+     * @throws OsgiClientException
+     */
+    List<SourceReference> findSourceReferences() throws OsgiClientException;
+    
+    /**
+     * Uninstalls the bundle with the specified Bundle-SymbolicName, if present
+     * 
+     * @param bundleSymbolicName The Bundle-SymbolicName
+     * @return true in case a bundle with that BSN was found and uninstalled, false in case the BSN was not found
+     * @throws OsgiClientException error when trying to uninstall the bundle
+     */
+    boolean uninstallBundle(String bundleSymbolicName) throws OsgiClientException;
+
+	/**
+	 * Wait until the component with the given name is registered. This means the component must be either in state "Registered" or "Active".
+	 * The state registered is called "satisfied" in the Felix DS Web Console
+	 * @param componentName the component's name (by default the 
+	 * @param timeout how long to wait for the component to become registered before throwing a {@code TimeoutException} in milliseconds
+	 * @param delay time to wait between checks of the state in milliseconds
+	 * @throws TimeoutException if the component did not become registered before timeout was reached
+	 * @throws InterruptedException if interrupted
+	 * @see "OSGi Comp. R6, §112.5 Component Life Cycle"
+	 */
+	void waitForComponentRegistered(final String componentName, final long timeout, final long delay)
+			throws TimeoutException, InterruptedException;
+
+	void close() throws IOException;
+}
\ No newline at end of file
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/osgi/OsgiClientException.java b/shared/api/src/main/java/org/apache/sling/ide/osgi/OsgiClientException.java
similarity index 90%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/osgi/OsgiClientException.java
rename to shared/api/src/main/java/org/apache/sling/ide/osgi/OsgiClientException.java
index 6236d69..8bd181d 100644
--- a/shared/modules/api/src/main/java/org/apache/sling/ide/osgi/OsgiClientException.java
+++ b/shared/api/src/main/java/org/apache/sling/ide/osgi/OsgiClientException.java
@@ -17,6 +17,8 @@
 
 package org.apache.sling.ide.osgi;
 
+import java.net.URI;
+
 public class OsgiClientException extends Exception {
 
     private static final long serialVersionUID = 1L;
@@ -37,4 +39,8 @@
         super(cause);
     }
 
+    public OsgiClientException(URI uri, String method, Throwable cause) {
+        super(cause);
+    }
+    
 }
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/osgi/OsgiClientFactory.java b/shared/api/src/main/java/org/apache/sling/ide/osgi/OsgiClientFactory.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/osgi/OsgiClientFactory.java
rename to shared/api/src/main/java/org/apache/sling/ide/osgi/OsgiClientFactory.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/osgi/SourceReference.java b/shared/api/src/main/java/org/apache/sling/ide/osgi/SourceReference.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/osgi/SourceReference.java
rename to shared/api/src/main/java/org/apache/sling/ide/osgi/SourceReference.java
diff --git a/shared/api/src/main/java/org/apache/sling/ide/osgi/impl/HttpOsgiClient.java b/shared/api/src/main/java/org/apache/sling/ide/osgi/impl/HttpOsgiClient.java
new file mode 100644
index 0000000..1637512
--- /dev/null
+++ b/shared/api/src/main/java/org/apache/sling/ide/osgi/impl/HttpOsgiClient.java
@@ -0,0 +1,545 @@
+/*
+ * 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.ide.osgi.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.TimeoutException;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpHost;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.StatusLine;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.AuthCache;
+import org.apache.http.client.CredentialsProvider;
+import org.apache.http.client.HttpResponseException;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.impl.auth.BasicScheme;
+import org.apache.http.impl.client.AbstractResponseHandler;
+import org.apache.http.impl.client.BasicAuthCache;
+import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.apache.sling.ide.log.Logger;
+import org.apache.sling.ide.osgi.OsgiClient;
+import org.apache.sling.ide.osgi.OsgiClientException;
+import org.apache.sling.ide.osgi.SourceReference;
+import org.apache.sling.ide.transport.RepositoryInfo;
+import org.osgi.framework.Version;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonParseException;
+import com.google.gson.annotations.SerializedName;
+import com.google.gson.stream.JsonReader;
+
+public class HttpOsgiClient implements OsgiClient, AutoCloseable {
+
+	private static final int DEFAULT_SOCKET_TIMEOUT_SECONDS = 30;
+	private static final int DEFAULT_CONNECT_TIMEOUT_SECONDS = 15;
+
+	private final RepositoryInfo repositoryInfo;
+	private final AuthCache authCache;
+	private final Logger logger;
+	private final CloseableHttpClient httpClient;
+
+	public HttpOsgiClient(RepositoryInfo repositoryInfo, Logger logger) {
+		this.repositoryInfo = repositoryInfo;
+		this.logger = logger;
+
+		HttpHost targetHost = new HttpHost(repositoryInfo.getUrl().getHost(), repositoryInfo.getUrl().getPort(), repositoryInfo.getUrl().getScheme());
+		CredentialsProvider credsProvider = new BasicCredentialsProvider();
+		credsProvider.setCredentials(
+				new AuthScope(targetHost),
+				new UsernamePasswordCredentials(repositoryInfo.getUsername(), repositoryInfo.getPassword()));
+		// Create AuthCache instance
+		authCache = new BasicAuthCache();
+		// Generate BASIC scheme object and add it to the local auth cache
+		BasicScheme basicAuth = new BasicScheme();
+		authCache.put(targetHost, basicAuth);
+		// set timeouts
+		RequestConfig requestConfig = RequestConfig.custom()
+				.setConnectTimeout(DEFAULT_CONNECT_TIMEOUT_SECONDS * 1000) 
+				.setSocketTimeout(DEFAULT_SOCKET_TIMEOUT_SECONDS * 1000).build();
+		httpClient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider)
+				.setDefaultRequestConfig(requestConfig).build();
+		
+	}
+
+	private static final class BundleInfo {
+		private String symbolicName;
+		private String version;
+		private long id;
+
+		public String getSymbolicName() {
+			return symbolicName;
+		}
+
+		public Version getVersion() {
+			return new Version(version);
+		}
+
+		public long getId() {
+			return id;
+		}
+	}
+
+	private static BundleInfo readBundleInfo(String bundleSymbolicName, Reader reader) throws IOException {
+		Gson gson = new Gson();
+		try (JsonReader jsonReader = new JsonReader(reader)) {
+			// wait for 'data' attribute
+			jsonReader.beginObject();
+			while (jsonReader.hasNext()) {
+				String name = jsonReader.nextName();
+				if (name.equals("data")) {
+					jsonReader.beginArray();
+					while (jsonReader.hasNext()) {
+						// read json for individual bundle
+						BundleInfo bundleInfo = gson.fromJson(jsonReader, BundleInfo.class);
+						if (bundleSymbolicName.equals(bundleInfo.getSymbolicName())) {
+							return bundleInfo;
+						}
+					}
+					jsonReader.endArray();
+				} else {
+					jsonReader.skipValue();
+				}
+			}
+		}
+		return null;
+
+	}
+
+	static Version getBundleVersionFromReader(String bundleSymbolicName, Reader reader) throws IOException {
+		BundleInfo bundleInfo = readBundleInfo(bundleSymbolicName, reader);
+		if (bundleInfo == null) {
+			return null;
+		}
+		return bundleInfo.getVersion();
+	}
+
+	static Long getBundleIdFromReader(String bundleSymbolicName, Reader reader) throws IOException {
+		BundleInfo bundleInfo = readBundleInfo(bundleSymbolicName, reader);
+		if (bundleInfo == null) {
+			return null;
+		}
+		return bundleInfo.getId();
+	}
+
+	@Override
+	public Version getBundleVersion(String bundleSymbolicName) throws OsgiClientException {
+
+		HttpGet method = new HttpGet(repositoryInfo.getUrl().resolve("system/console/bundles.json"));
+
+		try {
+			return httpClient.execute(method, new LoggingAbstractResponseHandler<Version>() {
+
+				@Override
+				public Version handleEntity(HttpEntity entity) throws IOException {
+					try (InputStream input = entity.getContent();
+							Reader reader = new InputStreamReader(input, getCharsetOrDefault(entity))) {
+						return getBundleVersionFromReader(bundleSymbolicName, reader);
+					}
+				}
+
+			}, createContextForPreemptiveBasicAuth());
+
+		} catch (IOException e) {
+			throw new OsgiClientException(e);
+		}
+	}
+
+	public HttpClientContext createContextForPreemptiveBasicAuth() {
+		// Add AuthCache to the execution context
+        HttpClientContext localContext = HttpClientContext.create();
+        localContext.setAuthCache(authCache);
+		return localContext;
+	}
+    
+    @Override
+	public void waitForComponentRegistered(final String componentName, final long timeout, final long delay) throws TimeoutException, InterruptedException {
+        Polling p = new Polling() {
+            @Override
+            public Boolean call() throws Exception {
+                ComponentsInfo info = getComponentsInfo(componentName);
+                if (info != null) {
+                    return ((info.components[0].status == ComponentInfo.Status.SATISFIED) || (info.components[0].status == ComponentInfo.Status.ACTIVE));
+                } else {
+                    logger.trace("Could not get component info for component name {0}", componentName);
+                }
+                return false;
+            }
+
+            @Override
+            protected String message() {
+                return "Component " + componentName + " was not registered in %1$d ms";
+            }
+        };
+        p.poll(timeout, delay);
+    }
+
+    /**
+     * Returns the wrapper for the component info json
+     *
+     * @param id the id of the component
+     * @return the component info
+     * @throws ClientException if the response status does not match any of the expectedStatus
+     */
+    public ComponentsInfo getComponentsInfo(String id) throws OsgiClientException {
+        return executeJsonGetRequest("system/console/components/" + id + ".json", ComponentsInfo.class, "get DS component info");
+    }
+    
+    @Override
+	public void installBundle(InputStream in, String fileName) throws OsgiClientException {
+
+		if (in == null) {
+			throw new IllegalArgumentException("in may not be null");
+		}
+
+		if (fileName == null) {
+			throw new IllegalArgumentException("fileName may not be null");
+		}
+
+		// append pseudo path after root URL to not get redirected for nothing
+		final HttpPost filePost = new HttpPost(repositoryInfo.getUrl().resolve("system/console/install"));
+
+		try {
+			// set referrer
+			filePost.setHeader("referer", "about:blank");
+
+			MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
+			entityBuilder.addTextBody("action", "install");
+			entityBuilder.addTextBody("_noredir_", "_noredir_");
+			entityBuilder.addTextBody("bundlestart", "start");
+			entityBuilder.addBinaryBody("bundlefile", in, ContentType.DEFAULT_BINARY, "bundle.jar");
+
+			filePost.setEntity(entityBuilder.build());
+			logger.trace("Installing bundle {0} via POST to {1}", fileName, filePost.getURI());
+			httpClient.execute(filePost, new BasicLoggingResponseHandler(), createContextForPreemptiveBasicAuth());
+		} catch (IOException e) {
+			throw new OsgiClientException("Error installing bundle " + fileName + " via " + filePost, e);
+		}
+	}
+
+	@Override
+	public boolean uninstallBundle(String bundleSymbolicName) throws OsgiClientException {
+		HttpGet method = new HttpGet(repositoryInfo.getUrl().resolve("system/console/bundles.json"));
+		Long bundleId;
+		try {
+			logger.trace("Retrieving bundle id for bsn {0} via {1}", bundleSymbolicName, method);
+			bundleId = httpClient.execute(method, new LoggingAbstractResponseHandler<Long>() {
+
+				@Override
+				public Long handleEntity(HttpEntity entity) throws IOException {
+					try (Reader reader = new InputStreamReader(entity.getContent(), getCharsetOrDefault(entity))) {
+						return getBundleIdFromReader(bundleSymbolicName, reader);
+					}
+				}
+
+			}, createContextForPreemptiveBasicAuth());
+		} catch (IOException e) {
+			throw new OsgiClientException("Error retrieving bundle id for bundle " + bundleSymbolicName + " via " + method);
+		}
+		// no bundle found with that BSN
+		if (bundleId == null) {
+			logger.trace("No bundle found with bsn {0}, skipping uninstallation", bundleSymbolicName, method);
+			return false;
+		}
+		HttpPost postMethod = new HttpPost(repositoryInfo.getUrl().resolve("system/console/bundles/" + bundleId));
+	    try {
+			List<? extends NameValuePair> parameters = Collections
+					.singletonList(new BasicNameValuePair("action", "uninstall"));
+			postMethod.setEntity(new UrlEncodedFormEntity(parameters));
+			logger.trace("Uninstalling bundle via {0}", postMethod);
+			httpClient.execute(postMethod, new BasicLoggingResponseHandler(),
+					createContextForPreemptiveBasicAuth());
+
+		} catch (IOException e) {
+			throw new OsgiClientException("Error uninstalling bundle " + bundleSymbolicName + " via " + postMethod);
+		}
+	    return true;
+	}
+
+	@Override
+	public void installLocalBundle(final Path explodedBundleLocation) throws OsgiClientException {
+
+		if (explodedBundleLocation == null) {
+			throw new IllegalArgumentException("explodedBundleLocation may not be null");
+		}
+
+		List<? extends NameValuePair> parameters = Collections
+				.singletonList(new BasicNameValuePair("dir", explodedBundleLocation.toString()));
+		try {
+			installLocalBundle(new UrlEncodedFormEntity(parameters), explodedBundleLocation.toString());
+		} catch (UnsupportedEncodingException e) {
+			throw new OsgiClientException("Cannot install local bundle due to unsupported encoding", e);
+		}
+	}
+
+	@Override
+	public void installLocalBundle(final InputStream jarredBundle, String sourceLocation) throws OsgiClientException {
+
+		if (jarredBundle == null) {
+			throw new IllegalArgumentException("jarredBundle may not be null");
+		}
+
+		MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
+		entityBuilder.addBinaryBody("bundle", jarredBundle, ContentType.DEFAULT_BINARY, "bundle.jar");
+		installLocalBundle(entityBuilder.build(), sourceLocation);
+	}
+
+	@Override
+	public List<SourceReference> findSourceReferences() throws OsgiClientException {
+		SourceBundleData[] sourceBundleData = executeJsonGetRequest("system/sling/tooling/sourceReferences.json", SourceBundleData[].class, "find source references");
+		List<SourceReference> res = new ArrayList<>(sourceBundleData.length);
+		for (SourceBundleData sourceData : sourceBundleData) {
+			for (SourceReferenceFromJson ref : sourceData.sourceReferences) {
+				if (ref.isMavenType()) {
+					res.add(ref.getMavenSourceReference());
+				}
+			}
+		}
+
+		return res;
+	}
+
+	@Override
+	public void close() throws IOException {
+		httpClient.close();
+	}
+
+	/**
+	 * Encapsulates the JSON response from the tooling.installer
+	 */
+	private static final class BundleInstallerResult {
+		private String status; // either OK or FAILURE
+		private String message;
+
+		public boolean hasMessage() {
+			if (message != null && message.length() > 0) {
+				return true;
+			}
+			return false;
+		}
+
+		public String getMessage() {
+			return message;
+		}
+
+		public boolean isSuccessful() {
+			return "OK".equalsIgnoreCase(status);
+		}
+	}
+
+	private static final class SourceBundleData {
+
+		@SerializedName("Bundle-SymbolicName")
+		private String bsn;
+		@SerializedName("Bundle-Version")
+		private String version;
+
+		private List<SourceReferenceFromJson> sourceReferences;
+	}
+
+	private static final class SourceReferenceFromJson {
+		@SerializedName("__type__")
+		private String type; // should be "maven"
+		private String groupId;
+		private String artifactId;
+		private String version;
+
+		public boolean isMavenType() {
+			return "maven".equals(type);
+		}
+
+		public MavenSourceReferenceImpl getMavenSourceReference() {
+			if (!isMavenType()) {
+				throw new IllegalStateException("The type is not a Maven source reference but a " + type);
+			}
+			return new MavenSourceReferenceImpl(groupId, artifactId, version);
+		}
+	}
+
+	static final class ComponentsInfo {
+		@SerializedName("data") 
+		ComponentInfo[] components;
+	}
+
+	static final class ComponentInfo {
+		String pid;
+		String name;
+		@SerializedName("state")
+		Status status;
+		
+		public enum Status {
+
+	        // the states being used in the DS Felix WebConsole are listed in https://github.com/apache/felix/blob/6e5cde8471febb36bc72adeba85989edba943188/webconsole-plugins/ds/src/main/java/org/apache/felix/webconsole/plugins/ds/internal/ComponentConfigurationPrinter.java#L374
+			@SerializedName("active")
+			ACTIVE("active"),
+
+			@SerializedName("satisfied")
+	        SATISFIED("satisfied"),
+
+	        @SerializedName("unsatisfied (configuration)")
+	        UNSATISFIED_CONFIGURATION("unsatisfied (configuration)"),
+
+	        @SerializedName("unsatisfied (reference)")
+	        UNSATISFIED_REFERENCE("unsatisfied (reference)"),
+
+	        @SerializedName("failed activation")
+	        FAILED_ACTIVATION("failed activation"),
+
+	        UNKNOWN("unknown");
+
+	        String value;
+
+	        Status(String value) {
+	            this.value = value;
+	        }
+
+	        public static Status value(String o) {
+	            for(Status s : values()) {
+	                if(s.value.equalsIgnoreCase(o)) {
+	                    return s;
+	                }
+	            }
+	            return UNKNOWN;
+	        }
+
+	        public String toString() {
+	            return value;
+	        }
+
+	    }
+
+	}
+
+	void installLocalBundle(HttpEntity httpEntity, String bundleSource) throws OsgiClientException {
+		HttpPost request = new HttpPost(repositoryInfo.getUrl().resolve("system/sling/tooling/install"));
+		request.setEntity(httpEntity);
+		BundleInstallerResult result = executeJsonRequest(request, BundleInstallerResult.class, "install local bundle from " + bundleSource);
+		if (!result.isSuccessful()) {
+			String errorMessage = !result.hasMessage() ? "Bundle deployment failed, please check the Sling logs"
+					: result.getMessage();
+			throw new OsgiClientException(errorMessage);
+		}
+	}
+
+	private <T> T executeJsonGetRequest(String relativePath, Class<T> jsonObjectClass, String requestLabel) throws OsgiClientException {
+		HttpGet request = new HttpGet(repositoryInfo.getUrl().resolve(relativePath));
+		return executeJsonRequest(request, jsonObjectClass, requestLabel);
+	}
+	
+	private <T> T executeJsonRequest(HttpRequestBase request, Class<T> jsonObjectClass, String requestLabel) throws OsgiClientException {
+		try {
+			logger.trace("{0} via {1}", requestLabel, request);
+			return httpClient.execute(request, new LoggingAbstractResponseHandler<T>() {
+
+				@Override
+				public T handleEntity(HttpEntity entity) throws IOException {
+					return parseJson(jsonObjectClass, entity.getContent(), getCharsetOrDefault(entity));
+				}
+				
+			}, createContextForPreemptiveBasicAuth());
+
+		} catch (IOException e) {
+			throw new OsgiClientException("Cannot " + requestLabel + " via " + request, e);
+		}
+	}
+	
+
+	static <T> T parseJson(Class<T> jsonObjectClass, InputStream input, Charset charset) throws IOException {
+		try (JsonReader jsonReader = new JsonReader(
+				new InputStreamReader(input, charset))) {
+			return new Gson().fromJson(jsonReader, jsonObjectClass);
+		} catch (JsonParseException e) {
+			throw new IOException("Error parsing JSON response", e);
+		}
+	}
+	
+	/**
+	 * Slightly extended version of {@link org.apache.http.impl.client.AbstractResponseHandler} which logs the response body in case of status code >= 300.
+	 *
+	 * @param <T>
+	 */
+	public abstract class LoggingAbstractResponseHandler<T> implements ResponseHandler<T> {
+		/**
+		 * Slightly extended version of {@link AbstractResponseHandler#handleResponse(HttpResponse)} which logs the response body for errors
+		 * @param response
+		 * @return
+		 * @throws HttpResponseException
+		 * @throws IOException
+		 */
+	    @Override
+	    public T handleResponse(final HttpResponse response)
+	            throws HttpResponseException, IOException {
+	        final StatusLine statusLine = response.getStatusLine();
+	        final HttpEntity entity = response.getEntity();
+	        if (statusLine.getStatusCode() >= 300) {
+	        	logger.trace("Received failure response " + statusLine  + ":" + EntityUtils.toString(entity));
+	            EntityUtils.consume(entity);
+	            throw new HttpResponseException(statusLine.getStatusCode(),
+	                    statusLine.getReasonPhrase());
+	        }
+	        return entity == null ? null : handleEntity(entity);
+	    }
+	    
+	    /**
+	     * Handle the response entity and transform it into the actual response
+	     * object.
+	     */
+	    public abstract T handleEntity(HttpEntity entity) throws IOException;
+	}
+	
+	public final class BasicLoggingResponseHandler extends LoggingAbstractResponseHandler<String> {
+
+		@Override
+		public String handleEntity(HttpEntity entity) throws IOException {
+			return EntityUtils.toString(entity);
+		}
+		
+	}
+	
+	private static Charset getCharsetOrDefault(HttpEntity entity) {
+		Charset charset = ContentType.getOrDefault(entity).getCharset();
+		if (charset == null) {
+			charset = StandardCharsets.ISO_8859_1;
+		}
+		return charset;
+	}
+}
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientFactory.java b/shared/api/src/main/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientFactory.java
similarity index 61%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientFactory.java
rename to shared/api/src/main/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientFactory.java
index 49285a0..429cbda 100644
--- a/shared/modules/api/src/main/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientFactory.java
+++ b/shared/api/src/main/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientFactory.java
@@ -16,43 +16,26 @@
  */
 package org.apache.sling.ide.osgi.impl;
 
+import org.apache.sling.ide.log.Logger;
 import org.apache.sling.ide.osgi.OsgiClient;
 import org.apache.sling.ide.osgi.OsgiClientFactory;
 import org.apache.sling.ide.transport.RepositoryInfo;
+import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.event.EventAdmin;
 
 @Component(service = OsgiClientFactory.class)
 public class HttpOsgiClientFactory implements OsgiClientFactory {
 
-    @Reference
-    private EventAdmin eventAdmin;
+	private final Logger logger;
 
-    public HttpOsgiClientFactory() {
+    @Activate
+    public HttpOsgiClientFactory(@Reference Logger logger) {
+    	this.logger = logger;
     }
-
-    /**
-     * Constructor to create this instance outside of an OSGi Container
-     *
-     * @param eventAdmin Event Admin for tracing the OSGi Client. If null then there is no tracing.
-     */
-    public HttpOsgiClientFactory(EventAdmin eventAdmin) {
-        bindEventAdmin(eventAdmin);
-    }
-
+    
     public OsgiClient createOsgiClient(RepositoryInfo repositoryInfo) {
-        if (eventAdmin != null) {
-            return new TracingOsgiClient(new HttpOsgiClient(repositoryInfo), eventAdmin);
-        }
-        return new HttpOsgiClient(repositoryInfo);
+        return new HttpOsgiClient(repositoryInfo, logger);
     }
 
-    protected void bindEventAdmin(EventAdmin eventAdmin) {
-        this.eventAdmin = eventAdmin;
-    }
-
-    protected void unbindEventAdmin(EventAdmin eventAdmin) {
-        this.eventAdmin = null;
-    }
 }
\ No newline at end of file
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/osgi/impl/MavenSourceReferenceImpl.java b/shared/api/src/main/java/org/apache/sling/ide/osgi/impl/MavenSourceReferenceImpl.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/osgi/impl/MavenSourceReferenceImpl.java
rename to shared/api/src/main/java/org/apache/sling/ide/osgi/impl/MavenSourceReferenceImpl.java
diff --git a/shared/api/src/main/java/org/apache/sling/ide/osgi/impl/Polling.java b/shared/api/src/main/java/org/apache/sling/ide/osgi/impl/Polling.java
new file mode 100644
index 0000000..d54294a
--- /dev/null
+++ b/shared/api/src/main/java/org/apache/sling/ide/osgi/impl/Polling.java
@@ -0,0 +1,166 @@
+/*
+ * 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.ide.osgi.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * Helper for repeating a call until it returns true, with timeout capabilities.
+ * Subclasses should override the {@link #call()} method.
+ * Can be used with lambda expressions, using the constructor {@link #Polling(Callable c)}.
+ *
+ * @since 1.1.0
+ */
+public class Polling implements Callable<Boolean> {
+
+    /**
+     * Optional object to be used by the default implementation of call()
+     */
+    protected final Callable<Boolean> c;
+
+    /**
+     * Holder for the last exception thrown by call(), to be used for logging
+     */
+    protected Exception lastException;
+
+    /**
+     * List of all the exceptions thrown by call(), to be used for logging
+     */
+    protected List<Exception> exceptions;
+
+    /**
+     * Counter for total waiting time
+     */
+    protected long waited;
+
+    /**
+     * Default constructor to be used in subclasses that override the {@link #call()} method.
+     * Should not be used directly on {@code Polling} instances, but only on extended classes.
+     * If used directly to get a {@code Polling} instance, executing {@link #poll(long timeout, long delay)}
+     * will be equivalent to {@code Thread.sleep(timeout)}
+     */
+    public Polling() {
+        this(null);
+    }
+
+    /**
+     * Creates a new instance that uses the {@code Callable} parameter for polling
+     *
+     * @param c object whose {@code call()} method will be polled
+     */
+    public Polling(Callable<Boolean> c) {
+        this.c = c;
+        lastException = null;
+        this.exceptions = new ArrayList<>();
+        this.waited = 0;
+    }
+
+    /**
+     * <p>Method to be called by {@link #poll(long timeout, long delay)}, potentially multiple times,
+     * until it returns true or timeout is reached.<br>
+     * Subclasses can override it to change the check accordingly. The method should return true
+     * only when the call was successful.<br>
+     * It can return false or throw any {@code Exception} to make the poller try again later.</p>
+     *
+     * <p>The default implementation delegates the call to the {@code Callable c} instance.</p>
+     *
+     * @return {@code true} to end polling
+     * @throws Exception if unable to compute a result
+     */
+    @Override
+    public Boolean call() throws Exception {
+        if (c != null) {
+            return c.call();
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * <p>Tries to execute {@link #call()} until it returns true or until {@code timeout} is reached.
+     * Between retries, it waits using {@code Thread.sleep(delay)}. It means the retry is not at a fixed pace,
+     * but depends on the execution time of the call itself.</p>
+     * <p>The method guarantees that the call() will be executed at least once. If the timeout is 0 or less, then
+     * call() will be executed exactly once.</p>
+     * <p>The timeout is adjusted using {@link TimeoutsProvider} so the final value can be changed using the
+     * system property: {@value org.apache.sling.testing.timeouts.TimeoutsProvider#PROP_TIMEOUT_MULTIPLIER}</p>
+     *
+     * @param timeout max total execution time, in milliseconds
+     * @param delay time to wait between calls, in milliseconds
+     *
+     * @throws TimeoutException if {@code timeout} was reached
+     * @throws InterruptedException if the thread was interrupted while sleeping; caller should throw it further
+     */
+    public void poll(long timeout, long delay) throws TimeoutException, InterruptedException {
+        long start = System.currentTimeMillis();
+        long effectiveTimeout = timeout;//TimeoutsProvider.getInstance().getTimeout(timeout);
+
+        do {
+            try {
+                boolean success = call();
+                if (success) {
+                    waited = System.currentTimeMillis() - start;
+                    return;
+                }
+            } catch (InterruptedException e) {
+                throw e; // Never inhibit InterruptedException
+            } catch (Exception e) {
+                exceptions.add(e);
+                lastException = e;
+            }
+            Thread.sleep(delay);
+        } while (System.currentTimeMillis() < start + effectiveTimeout);
+
+        waited = System.currentTimeMillis() - start;
+        throw new TimeoutException(String.format(message(), effectiveTimeout, delay) +
+                " Last exception was: " + this.getLastException());
+    }
+
+    public long getWaited() {
+        return waited;
+    }
+
+    /**
+     * Returns the string to be used in the {@code TimeoutException}, if needed.
+     * The string is passed to {@code String.format(message(), timeout, delay)}, so it can be a format
+     * including {@code %1$d} and {@code %2$d}. The field {@code lastException} is also available for logging
+     *
+     * @return the format string
+     */
+    protected String message() {
+        return "Call failed to return true in %1$d ms.";
+    }
+
+    /**
+     * Return the last exception while polling or {null}
+     * @return the last exception (can be null)
+     */
+    public Exception getLastException() {
+        return lastException;
+    }
+
+    /**
+     * Return the list of all exceptions while polling
+     * @return the non-null list of exceptions
+     */
+    public List<Exception> getExceptions() {
+        return exceptions;
+    }
+}
\ No newline at end of file
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/osgi/package-info.java b/shared/api/src/main/java/org/apache/sling/ide/osgi/package-info.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/osgi/package-info.java
rename to shared/api/src/main/java/org/apache/sling/ide/osgi/package-info.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/serialization/SerializationData.java b/shared/api/src/main/java/org/apache/sling/ide/serialization/SerializationData.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/serialization/SerializationData.java
rename to shared/api/src/main/java/org/apache/sling/ide/serialization/SerializationData.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/serialization/SerializationDataBuilder.java b/shared/api/src/main/java/org/apache/sling/ide/serialization/SerializationDataBuilder.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/serialization/SerializationDataBuilder.java
rename to shared/api/src/main/java/org/apache/sling/ide/serialization/SerializationDataBuilder.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/serialization/SerializationException.java b/shared/api/src/main/java/org/apache/sling/ide/serialization/SerializationException.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/serialization/SerializationException.java
rename to shared/api/src/main/java/org/apache/sling/ide/serialization/SerializationException.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/serialization/SerializationKind.java b/shared/api/src/main/java/org/apache/sling/ide/serialization/SerializationKind.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/serialization/SerializationKind.java
rename to shared/api/src/main/java/org/apache/sling/ide/serialization/SerializationKind.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/serialization/SerializationKindManager.java b/shared/api/src/main/java/org/apache/sling/ide/serialization/SerializationKindManager.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/serialization/SerializationKindManager.java
rename to shared/api/src/main/java/org/apache/sling/ide/serialization/SerializationKindManager.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/serialization/SerializationManager.java b/shared/api/src/main/java/org/apache/sling/ide/serialization/SerializationManager.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/serialization/SerializationManager.java
rename to shared/api/src/main/java/org/apache/sling/ide/serialization/SerializationManager.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/serialization/package-info.java b/shared/api/src/main/java/org/apache/sling/ide/serialization/package-info.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/serialization/package-info.java
rename to shared/api/src/main/java/org/apache/sling/ide/serialization/package-info.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/NonExistingResources.java b/shared/api/src/main/java/org/apache/sling/ide/sync/content/NonExistingResources.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/NonExistingResources.java
rename to shared/api/src/main/java/org/apache/sling/ide/sync/content/NonExistingResources.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/SyncCommandFactory.java b/shared/api/src/main/java/org/apache/sling/ide/sync/content/SyncCommandFactory.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/SyncCommandFactory.java
rename to shared/api/src/main/java/org/apache/sling/ide/sync/content/SyncCommandFactory.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/WorkspaceDirectory.java b/shared/api/src/main/java/org/apache/sling/ide/sync/content/WorkspaceDirectory.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/WorkspaceDirectory.java
rename to shared/api/src/main/java/org/apache/sling/ide/sync/content/WorkspaceDirectory.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/WorkspaceFile.java b/shared/api/src/main/java/org/apache/sling/ide/sync/content/WorkspaceFile.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/WorkspaceFile.java
rename to shared/api/src/main/java/org/apache/sling/ide/sync/content/WorkspaceFile.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/WorkspacePath.java b/shared/api/src/main/java/org/apache/sling/ide/sync/content/WorkspacePath.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/WorkspacePath.java
rename to shared/api/src/main/java/org/apache/sling/ide/sync/content/WorkspacePath.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/WorkspacePaths.java b/shared/api/src/main/java/org/apache/sling/ide/sync/content/WorkspacePaths.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/WorkspacePaths.java
rename to shared/api/src/main/java/org/apache/sling/ide/sync/content/WorkspacePaths.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/WorkspaceProject.java b/shared/api/src/main/java/org/apache/sling/ide/sync/content/WorkspaceProject.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/WorkspaceProject.java
rename to shared/api/src/main/java/org/apache/sling/ide/sync/content/WorkspaceProject.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/WorkspaceResource.java b/shared/api/src/main/java/org/apache/sling/ide/sync/content/WorkspaceResource.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/WorkspaceResource.java
rename to shared/api/src/main/java/org/apache/sling/ide/sync/content/WorkspaceResource.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/impl/DefaultSyncCommandFactory.java b/shared/api/src/main/java/org/apache/sling/ide/sync/content/impl/DefaultSyncCommandFactory.java
similarity index 98%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/impl/DefaultSyncCommandFactory.java
rename to shared/api/src/main/java/org/apache/sling/ide/sync/content/impl/DefaultSyncCommandFactory.java
index 28cb0d2..d7de2c4 100644
--- a/shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/impl/DefaultSyncCommandFactory.java
+++ b/shared/api/src/main/java/org/apache/sling/ide/sync/content/impl/DefaultSyncCommandFactory.java
@@ -47,20 +47,16 @@
 import org.apache.sling.ide.transport.ResourceAndInfo;
 import org.apache.sling.ide.transport.ResourceProxy;
 import org.apache.sling.ide.util.PathUtil;
+import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
 
 @Component(service = SyncCommandFactory.class)
 public class DefaultSyncCommandFactory implements SyncCommandFactory {
     
-    @Reference
-    private SerializationManager serializationManager;
+    private final SerializationManager serializationManager;
     
-    @Reference
-    private Logger logger;
-
-    public DefaultSyncCommandFactory() {
-    }
+    private final Logger logger;
 
     /**
      * Constructor to create this instance outside of an OSGi Container
@@ -68,7 +64,8 @@
      * @param serializationManager Serialization Manager to be used which must not be null
      * @param logger Sling IDE Logger which must not be null
      */
-    public DefaultSyncCommandFactory(SerializationManager serializationManager, Logger logger) {
+    @Activate
+    public DefaultSyncCommandFactory(@Reference SerializationManager serializationManager, @Reference Logger logger) {
         this.serializationManager = serializationManager;
         this.logger = logger;
     }
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/impl/NonExistingDirectory.java b/shared/api/src/main/java/org/apache/sling/ide/sync/content/impl/NonExistingDirectory.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/impl/NonExistingDirectory.java
rename to shared/api/src/main/java/org/apache/sling/ide/sync/content/impl/NonExistingDirectory.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/impl/NonExistingFile.java b/shared/api/src/main/java/org/apache/sling/ide/sync/content/impl/NonExistingFile.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/impl/NonExistingFile.java
rename to shared/api/src/main/java/org/apache/sling/ide/sync/content/impl/NonExistingFile.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/package-info.java b/shared/api/src/main/java/org/apache/sling/ide/sync/content/package-info.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/sync/content/package-info.java
rename to shared/api/src/main/java/org/apache/sling/ide/sync/content/package-info.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/Batcher.java b/shared/api/src/main/java/org/apache/sling/ide/transport/Batcher.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/Batcher.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/Batcher.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/BatcherFactory.java b/shared/api/src/main/java/org/apache/sling/ide/transport/BatcherFactory.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/BatcherFactory.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/BatcherFactory.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/Command.java b/shared/api/src/main/java/org/apache/sling/ide/transport/Command.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/Command.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/Command.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/CommandContext.java b/shared/api/src/main/java/org/apache/sling/ide/transport/CommandContext.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/CommandContext.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/CommandContext.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/CommandExecutionProperties.java b/shared/api/src/main/java/org/apache/sling/ide/transport/CommandExecutionProperties.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/CommandExecutionProperties.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/CommandExecutionProperties.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/FallbackNodeTypeRegistry.java b/shared/api/src/main/java/org/apache/sling/ide/transport/FallbackNodeTypeRegistry.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/FallbackNodeTypeRegistry.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/FallbackNodeTypeRegistry.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/FileInfo.java b/shared/api/src/main/java/org/apache/sling/ide/transport/FileInfo.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/FileInfo.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/FileInfo.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/NodeTypeRegistry.java b/shared/api/src/main/java/org/apache/sling/ide/transport/NodeTypeRegistry.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/NodeTypeRegistry.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/NodeTypeRegistry.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/ProtectedNodes.java b/shared/api/src/main/java/org/apache/sling/ide/transport/ProtectedNodes.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/ProtectedNodes.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/ProtectedNodes.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/Repository.java b/shared/api/src/main/java/org/apache/sling/ide/transport/Repository.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/Repository.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/Repository.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/RepositoryException.java b/shared/api/src/main/java/org/apache/sling/ide/transport/RepositoryException.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/RepositoryException.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/RepositoryException.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/RepositoryFactory.java b/shared/api/src/main/java/org/apache/sling/ide/transport/RepositoryFactory.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/RepositoryFactory.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/RepositoryFactory.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/RepositoryInfo.java b/shared/api/src/main/java/org/apache/sling/ide/transport/RepositoryInfo.java
similarity index 71%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/RepositoryInfo.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/RepositoryInfo.java
index 2d27ec1..bf1e680 100644
--- a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/RepositoryInfo.java
+++ b/shared/api/src/main/java/org/apache/sling/ide/transport/RepositoryInfo.java
@@ -18,15 +18,13 @@
 
 import java.net.URI;
 
-import org.apache.sling.ide.util.PathUtil;
-
 public class RepositoryInfo {
 	
 	private String username;
 	private String password;
-	private String url;
+	private URI url;
 	
-	public RepositoryInfo(String username, String password, String url) {
+	public RepositoryInfo(String username, String password, URI url) {
 		super();
 		this.username = username;
 		this.password = password;
@@ -44,28 +42,11 @@
 	/**
 	 * Returns the URL for this repository
 	 * 
-	 * <p>If you need to manipulate the URL by appending a path it's recommended to use {@link #appendPath(String)}</p>
-	 * 
 	 * @return the URL for this repository
 	 */
-	public String getUrl() {
+	public URI getUrl() {
 		return url;
 	}
-	
-	public String getHost(){
-		String host=url.substring(7);
-		return host.split(":")[0];
-	}
-	
-	public int getPort(){
-
-        return URI.create(url).getPort();
-	}
-	
-	public String appendPath(String url) {
-	    
-	    return PathUtil.join(this.url, url);
-	}
 
 	@Override
 	public String toString() {
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/RepositoryResponse.java b/shared/api/src/main/java/org/apache/sling/ide/transport/RepositoryResponse.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/RepositoryResponse.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/RepositoryResponse.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/ResourceAndInfo.java b/shared/api/src/main/java/org/apache/sling/ide/transport/ResourceAndInfo.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/ResourceAndInfo.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/ResourceAndInfo.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/ResourceProxy.java b/shared/api/src/main/java/org/apache/sling/ide/transport/ResourceProxy.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/ResourceProxy.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/ResourceProxy.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/Result.java b/shared/api/src/main/java/org/apache/sling/ide/transport/Result.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/Result.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/Result.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/impl/DefaultBatcher.java b/shared/api/src/main/java/org/apache/sling/ide/transport/impl/DefaultBatcher.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/impl/DefaultBatcher.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/impl/DefaultBatcher.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/impl/DefaultBatcherFactory.java b/shared/api/src/main/java/org/apache/sling/ide/transport/impl/DefaultBatcherFactory.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/impl/DefaultBatcherFactory.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/impl/DefaultBatcherFactory.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/package-info.java b/shared/api/src/main/java/org/apache/sling/ide/transport/package-info.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/transport/package-info.java
rename to shared/api/src/main/java/org/apache/sling/ide/transport/package-info.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/util/PathUtil.java b/shared/api/src/main/java/org/apache/sling/ide/util/PathUtil.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/util/PathUtil.java
rename to shared/api/src/main/java/org/apache/sling/ide/util/PathUtil.java
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/util/package-info.java b/shared/api/src/main/java/org/apache/sling/ide/util/package-info.java
similarity index 100%
rename from shared/modules/api/src/main/java/org/apache/sling/ide/util/package-info.java
rename to shared/api/src/main/java/org/apache/sling/ide/util/package-info.java
diff --git a/shared/modules/api/src/test/java/org/apache/sling/ide/filter/IgnoredResourcesTest.java b/shared/api/src/test/java/org/apache/sling/ide/filter/IgnoredResourcesTest.java
similarity index 100%
rename from shared/modules/api/src/test/java/org/apache/sling/ide/filter/IgnoredResourcesTest.java
rename to shared/api/src/test/java/org/apache/sling/ide/filter/IgnoredResourcesTest.java
diff --git a/shared/api/src/test/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientIT.java b/shared/api/src/test/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientIT.java
new file mode 100644
index 0000000..d546626
--- /dev/null
+++ b/shared/api/src/test/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientIT.java
@@ -0,0 +1,131 @@
+/*
+ * 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.ide.osgi.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.TimeoutException;
+import java.util.function.Predicate;
+
+import org.apache.commons.io.file.PathUtils;
+import org.apache.sling.ide.osgi.MavenSourceReference;
+import org.apache.sling.ide.osgi.OsgiClient;
+import org.apache.sling.ide.osgi.OsgiClientException;
+import org.apache.sling.ide.osgi.SourceReference;
+import org.apache.sling.ide.transport.RepositoryInfo;
+import org.apache.sling.ide.util.Slf4jLogger;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.osgi.framework.Version;
+
+public class HttpOsgiClientIT {
+
+	private OsgiClient osgiClient;
+
+	@Rule
+	public TemporaryFolder tmpFolder = new TemporaryFolder();
+	
+	@Before
+	public void setUp() throws URISyntaxException {
+		int port = Objects.requireNonNull(Integer.getInteger("sling.starter.port"), "System property 'sling.starter.port' must be set to a valid integer");
+    	URI url = new URI("http", null, "localhost", port, "/", null, null);
+    	RepositoryInfo repoInfo = new RepositoryInfo("admin", "admin", url);
+        osgiClient = new HttpOsgiClient(repoInfo, new Slf4jLogger());
+	}
+	
+	@After
+	public void tearDown() throws Exception {
+		osgiClient.close();
+	}
+	
+    @Test
+    public void testGetBundleVersion() throws IOException, URISyntaxException, OsgiClientException {
+        assertEquals(new Version("2.24.0"), osgiClient.getBundleVersion("org.apache.sling.api"));
+    }
+
+    @Test
+    public void testInstallBundle() throws IOException, URISyntaxException, OsgiClientException, InterruptedException, TimeoutException {
+    	// create an exploded jar folder
+    	URI jarUri = new URI("jar:" + this.getClass().getResource("/org.apache.sling.commons.messaging.jar").toString());
+    	
+    	Path explodedJarFolder = tmpFolder.newFolder("exploded-jar").toPath();
+    	try (FileSystem zipfs = FileSystems.newFileSystem(jarUri, Collections.emptyMap())) {
+    		for (Path srcRootDirectory : zipfs.getRootDirectories()) {
+    			PathUtils.copyDirectory(srcRootDirectory, explodedJarFolder);
+    		}
+        }
+    	// first install the necessary tooling
+    	try (InputStream input = Objects.requireNonNull(this.getClass().getResourceAsStream("/org.apache.sling.tooling.support.install.jar"))) {
+    		osgiClient.installBundle(input, "org.apache.sling.api");
+    	}
+    	osgiClient.waitForComponentRegistered("org.apache.sling.tooling.support.install.impl.InstallServlet", 20000, 500);
+    	try (InputStream input = Objects.requireNonNull(this.getClass().getResourceAsStream("/org.apache.sling.commons.messaging.jar"))) {
+    		osgiClient.installLocalBundle(input, "commons-messaging.jar");
+    	}
+    	
+    	osgiClient.installLocalBundle(explodedJarFolder);
+        osgiClient.uninstallBundle("org.apache.sling.tooling.support.install");
+    }
+    
+    @Test
+    public void testFindSourceReferences() throws IOException, URISyntaxException, OsgiClientException, InterruptedException, TimeoutException {
+    	// first install the necessary tooling
+    	try (InputStream input = Objects.requireNonNull(this.getClass().getResourceAsStream("/org.apache.sling.tooling.support.source.jar"))) {
+    		osgiClient.installBundle(input, "org.apache.sling.api");
+    	}
+    	osgiClient.waitForComponentRegistered("org.apache.sling.tooling.support.source.impl.SourceReferencesServlet", 20000, 500);
+    	List<SourceReference> sourceReferences = osgiClient.findSourceReferences();
+    	Optional<SourceReference> source = sourceReferences.stream().filter(new MavenSourceRefenceMatchingPredicate("org.apache.sling", "org.apache.sling.api")).findFirst();
+    	assertTrue(source.isPresent());
+    }
+    
+    private static final class MavenSourceRefenceMatchingPredicate implements Predicate<SourceReference> {
+    	private final String groupId;
+    	private final String artifactId;
+    	public MavenSourceRefenceMatchingPredicate(String groupId, String artifactId) {
+    		this.groupId = groupId;
+    		this.artifactId = artifactId;
+    	}
+    	
+		@Override
+		public boolean test(SourceReference source) {
+			if (source instanceof MavenSourceReference) {
+    			MavenSourceReference mavenSource = (MavenSourceReference)source;
+    			if (mavenSource.getGroupId().equals(groupId) &&
+    				mavenSource.getArtifactId().equals(artifactId)) {
+    				return true;
+    			}
+    		}
+			return false;
+		}
+    }
+}
diff --git a/shared/modules/api/src/test/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientTest.java b/shared/api/src/test/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientTest.java
similarity index 78%
rename from shared/modules/api/src/test/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientTest.java
rename to shared/api/src/test/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientTest.java
index 6e76593..2a9507d 100644
--- a/shared/modules/api/src/test/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientTest.java
+++ b/shared/api/src/test/java/org/apache/sling/ide/osgi/impl/HttpOsgiClientTest.java
@@ -18,7 +18,9 @@
 
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertThrows;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -26,9 +28,12 @@
 import java.io.Reader;
 import java.nio.charset.StandardCharsets;
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.sling.ide.osgi.MavenSourceReference;
 import org.apache.sling.ide.osgi.SourceReference;
+import org.apache.sling.ide.osgi.impl.HttpOsgiClient.ComponentInfo;
+import org.apache.sling.ide.osgi.impl.HttpOsgiClient.ComponentsInfo;
 import org.junit.Assert;
 import org.junit.Test;
 import org.osgi.framework.Version;
@@ -36,7 +41,7 @@
 public class HttpOsgiClientTest {
 
     @Test
-    public void testGetBundleVersionFromReader() throws IOException {
+    public void testGetBundleVersionFromReader_notFound() throws IOException {
         try (InputStream input = getClass().getClassLoader().getResourceAsStream("bundles.json");
              Reader reader = new InputStreamReader(input, StandardCharsets.UTF_8)) {
             assertThat(HttpOsgiClient.getBundleVersionFromReader("org.apache.commons.lang4", reader), nullValue());
@@ -44,29 +49,13 @@
     }
 
     @Test
-    public void testGetBundleVersionFromReader_notFound() throws IOException {
+    public void testGetBundleVersionFromReader() throws IOException {
         try (InputStream input = getClass().getClassLoader().getResourceAsStream("bundles.json");
                 Reader reader = new InputStreamReader(input, StandardCharsets.UTF_8)) {
             Assert.assertEquals(new Version("3.4.0"), HttpOsgiClient.getBundleVersionFromReader("org.apache.commons.lang3", reader));
         }
     }
     
-    @Test
-    public void parseSourceReferences() throws IOException {
-        
-        try ( InputStream input = getClass().getClassLoader().getResourceAsStream("sourceReferences.json")) {
-            List<SourceReference> references = HttpOsgiClient.parseSourceReferences(input);
-            assertThat("references.size", references.size(), equalTo(241));
-            
-            SourceReference first = references.get(0);
-            assertThat(first.getType(), equalTo(SourceReference.Type.MAVEN));
-            
-            MavenSourceReference mavenSR = (MavenSourceReference) first;
-            assertThat(mavenSR.getGroupId(), equalTo("org.apache.felix"));
-            assertThat(mavenSR.getArtifactId(), equalTo("org.apache.felix.framework"));
-            assertThat(mavenSR.getVersion(), equalTo("5.6.6"));
-        }
-    }
     
     @Test
     public void testGetBundleIdFromReader() throws IOException {
@@ -83,4 +72,14 @@
             assertThat(HttpOsgiClient.getBundleIdFromReader("org.apache.commons.lang4", reader), nullValue());
         }
     }
+    
+    @Test
+    public void testComponentsInfoJson() throws IOException {
+    	try (InputStream input = Objects.requireNonNull(getClass().getClassLoader().getResourceAsStream("components.json"))) {
+    		ComponentsInfo componentsInfo = HttpOsgiClient.parseJson(ComponentsInfo.class, input, StandardCharsets.UTF_8);
+    		assertEquals(1, componentsInfo.components.length);
+    		assertEquals(ComponentInfo.Status.ACTIVE, componentsInfo.components[0].status);
+    		assertEquals("org.apache.sling.tooling.support.install.impl.InstallServlet", componentsInfo.components[0].pid);
+    	}
+    }
 }
diff --git a/shared/modules/api/src/test/java/org/apache/sling/ide/serialization/NodeTypeResourceBuilder.java b/shared/api/src/test/java/org/apache/sling/ide/serialization/NodeTypeResourceBuilder.java
similarity index 100%
rename from shared/modules/api/src/test/java/org/apache/sling/ide/serialization/NodeTypeResourceBuilder.java
rename to shared/api/src/test/java/org/apache/sling/ide/serialization/NodeTypeResourceBuilder.java
diff --git a/shared/modules/api/src/test/java/org/apache/sling/ide/serialization/SerializationKindManagerTest.java b/shared/api/src/test/java/org/apache/sling/ide/serialization/SerializationKindManagerTest.java
similarity index 100%
rename from shared/modules/api/src/test/java/org/apache/sling/ide/serialization/SerializationKindManagerTest.java
rename to shared/api/src/test/java/org/apache/sling/ide/serialization/SerializationKindManagerTest.java
diff --git a/shared/modules/api/src/test/java/org/apache/sling/ide/serialization/StubRepository.java b/shared/api/src/test/java/org/apache/sling/ide/serialization/StubRepository.java
similarity index 100%
rename from shared/modules/api/src/test/java/org/apache/sling/ide/serialization/StubRepository.java
rename to shared/api/src/test/java/org/apache/sling/ide/serialization/StubRepository.java
diff --git a/shared/modules/api/src/test/java/org/apache/sling/ide/sync/content/WorkspacePathTest.java b/shared/api/src/test/java/org/apache/sling/ide/sync/content/WorkspacePathTest.java
similarity index 100%
rename from shared/modules/api/src/test/java/org/apache/sling/ide/sync/content/WorkspacePathTest.java
rename to shared/api/src/test/java/org/apache/sling/ide/sync/content/WorkspacePathTest.java
diff --git a/shared/modules/api/src/test/java/org/apache/sling/ide/sync/content/WorkspacePathsTest.java b/shared/api/src/test/java/org/apache/sling/ide/sync/content/WorkspacePathsTest.java
similarity index 100%
rename from shared/modules/api/src/test/java/org/apache/sling/ide/sync/content/WorkspacePathsTest.java
rename to shared/api/src/test/java/org/apache/sling/ide/sync/content/WorkspacePathsTest.java
diff --git a/shared/modules/api/src/test/java/org/apache/sling/ide/transport/FallbackNodeTypeRegistryTest.java b/shared/api/src/test/java/org/apache/sling/ide/transport/FallbackNodeTypeRegistryTest.java
similarity index 100%
rename from shared/modules/api/src/test/java/org/apache/sling/ide/transport/FallbackNodeTypeRegistryTest.java
rename to shared/api/src/test/java/org/apache/sling/ide/transport/FallbackNodeTypeRegistryTest.java
diff --git a/shared/modules/api/src/test/java/org/apache/sling/ide/transport/ResourceProxyTest.java b/shared/api/src/test/java/org/apache/sling/ide/transport/ResourceProxyTest.java
similarity index 100%
rename from shared/modules/api/src/test/java/org/apache/sling/ide/transport/ResourceProxyTest.java
rename to shared/api/src/test/java/org/apache/sling/ide/transport/ResourceProxyTest.java
diff --git a/shared/modules/api/src/test/java/org/apache/sling/ide/util/PathUtilTest.java b/shared/api/src/test/java/org/apache/sling/ide/util/PathUtilTest.java
similarity index 100%
rename from shared/modules/api/src/test/java/org/apache/sling/ide/util/PathUtilTest.java
rename to shared/api/src/test/java/org/apache/sling/ide/util/PathUtilTest.java
diff --git a/shared/api/src/test/java/org/apache/sling/ide/util/Slf4jLogger.java b/shared/api/src/test/java/org/apache/sling/ide/util/Slf4jLogger.java
new file mode 100644
index 0000000..e320bb1
--- /dev/null
+++ b/shared/api/src/test/java/org/apache/sling/ide/util/Slf4jLogger.java
@@ -0,0 +1,79 @@
+/*
+ * 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.ide.util;
+
+import org.apache.sling.ide.log.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The <tt>Slf4jLogger</tt> is a debugging implementation of the Logger using Slf4j
+ * 
+ * <p>
+ * It's worth noting that the trace methods log their output at INFO level, so that the output is always discoverable
+ * </p>
+ *
+ */
+public class Slf4jLogger implements Logger {
+
+    private static final long PERF_IGNORE_THRESHOLD = 50;
+
+    private final org.slf4j.Logger wrapped = LoggerFactory.getLogger(Slf4jLogger.class);
+
+    @Override
+    public void warn(String message, Throwable cause) {
+        wrapped.warn(message, cause);
+    }
+
+    @Override
+    public void warn(String message) {
+        wrapped.warn(message);
+    }
+
+    @Override
+    public void trace(String message, Throwable error) {
+        wrapped.info(message, error);
+    }
+
+    @Override
+    public void trace(String message, Object... arguments) {
+
+        // this is probably a horribly slow implementation, but it does not matter
+        for (int i = 0; i < arguments.length; i++) {
+            message = message.replace("{" + i + "}", String.valueOf(arguments[i]));
+        }
+
+        wrapped.info(message);
+    }
+
+    @Override
+    public void error(String message, Throwable cause) {
+        wrapped.error(message, cause);
+    }
+
+    @Override
+    public void error(String message) {
+        wrapped.error(message);
+    }
+
+    @Override
+    public void tracePerformance(String message, long duration, Object... arguments) {
+        if (duration < PERF_IGNORE_THRESHOLD) {
+            return;
+        }
+        trace(message + " took " + duration + " ms", arguments);
+    }
+}
\ No newline at end of file
diff --git a/shared/modules/api/src/test/resources/bundles.json b/shared/api/src/test/resources/bundles.json
similarity index 100%
rename from shared/modules/api/src/test/resources/bundles.json
rename to shared/api/src/test/resources/bundles.json
diff --git a/shared/api/src/test/resources/components.json b/shared/api/src/test/resources/components.json
new file mode 100644
index 0000000..f7491a5
--- /dev/null
+++ b/shared/api/src/test/resources/components.json
@@ -0,0 +1 @@
+{"status":1,"data":[{"id":"3912","bundleId":623,"name":"org.apache.sling.tooling.support.install.impl.InstallServlet","state":"active","stateRaw":8,"pid":"org.apache.sling.tooling.support.install.impl.InstallServlet","props":[{"key":"Bundle","value":"org.apache.sling.tooling.support.install (623)"},{"key":"Implementation Class","value":"org.apache.sling.tooling.support.install.impl.InstallServlet"},{"key":"Default State","value":"enabled"},{"key":"Activation","value":"delayed"},{"key":"Configuration Policy","value":"optional"},{"key":"serviceId","value":8309},{"key":"Service Type","value":"singleton"},{"key":"Services","value":["javax.servlet.Servlet"]},{"key":"PID","value":"org.apache.sling.tooling.support.install.impl.InstallServlet"},{"key":"Reference packageAdmin","value":["Satisfied","Service Name: org.osgi.service.packageadmin.PackageAdmin","Cardinality: 1..1","Policy: static","Policy Option: reluctant","Bound Service ID 2"]},{"key":"Properties","value":["alias = \/system\/sling\/tooling\/install","component.id = 3912","component.name = org.apache.sling.tooling.support.install.impl.InstallServlet","service.vendor = The Apache Software Foundation"]}]}]}
\ No newline at end of file
diff --git a/shared/modules/api/src/test/resources/sourceReferences.json b/shared/api/src/test/resources/sourceReferences.json
similarity index 100%
rename from shared/modules/api/src/test/resources/sourceReferences.json
rename to shared/api/src/test/resources/sourceReferences.json
diff --git a/shared/modules/artifacts/.project b/shared/artifacts/.project
similarity index 72%
rename from shared/modules/artifacts/.project
rename to shared/artifacts/.project
index d0ed5f0..25cf518 100644
--- a/shared/modules/artifacts/.project
+++ b/shared/artifacts/.project
@@ -11,16 +11,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/shared/modules/artifacts/README.md b/shared/artifacts/README.md
similarity index 100%
rename from shared/modules/artifacts/README.md
rename to shared/artifacts/README.md
diff --git a/shared/modules/artifacts/bnd.bnd b/shared/artifacts/bnd.bnd
similarity index 100%
rename from shared/modules/artifacts/bnd.bnd
rename to shared/artifacts/bnd.bnd
diff --git a/shared/modules/artifacts/pom.xml b/shared/artifacts/pom.xml
similarity index 79%
rename from shared/modules/artifacts/pom.xml
rename to shared/artifacts/pom.xml
index de0d1a1..667caef 100644
--- a/shared/modules/artifacts/pom.xml
+++ b/shared/artifacts/pom.xml
@@ -29,30 +29,7 @@
         <url>https://gitbox.apache.org/repos/asf?p=sling-ide-tooling.git</url>
     </scm>
 
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>biz.aQute.bnd</groupId>
-                <artifactId>bnd-maven-plugin</artifactId>
-            </plugin>
-        </plugins>
-    </build>
-
     <dependencies>
-
-        <!-- TODO - must be removed, OSGi deps not allowed here -->
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <!-- TODO - must be removed, OSGi deps not allowed here -->
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>osgi.cmpn</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
         <!-- Note that OSGi annotations are OK since they are not retained 
             at compile time -->
         <dependency>
@@ -86,7 +63,4 @@
             <scope>provided</scope>
         </dependency>
     </dependencies>
-    <properties>
-        <sling.java.version>8</sling.java.version>
-    </properties>
 </project>
diff --git a/shared/modules/artifacts/src/main/java/org/apache/sling/ide/artifacts/EmbeddedArtifact.java b/shared/artifacts/src/main/java/org/apache/sling/ide/artifacts/EmbeddedArtifact.java
similarity index 100%
rename from shared/modules/artifacts/src/main/java/org/apache/sling/ide/artifacts/EmbeddedArtifact.java
rename to shared/artifacts/src/main/java/org/apache/sling/ide/artifacts/EmbeddedArtifact.java
diff --git a/shared/modules/artifacts/src/main/java/org/apache/sling/ide/artifacts/EmbeddedArtifactLocator.java b/shared/artifacts/src/main/java/org/apache/sling/ide/artifacts/EmbeddedArtifactLocator.java
similarity index 100%
rename from shared/modules/artifacts/src/main/java/org/apache/sling/ide/artifacts/EmbeddedArtifactLocator.java
rename to shared/artifacts/src/main/java/org/apache/sling/ide/artifacts/EmbeddedArtifactLocator.java
diff --git a/shared/modules/artifacts/src/main/java/org/apache/sling/ide/artifacts/impl/ArtifactsLocatorImpl.java b/shared/artifacts/src/main/java/org/apache/sling/ide/artifacts/impl/ArtifactsLocatorImpl.java
similarity index 75%
rename from shared/modules/artifacts/src/main/java/org/apache/sling/ide/artifacts/impl/ArtifactsLocatorImpl.java
rename to shared/artifacts/src/main/java/org/apache/sling/ide/artifacts/impl/ArtifactsLocatorImpl.java
index 0b8388e..3dc7496 100644
--- a/shared/modules/artifacts/src/main/java/org/apache/sling/ide/artifacts/impl/ArtifactsLocatorImpl.java
+++ b/shared/artifacts/src/main/java/org/apache/sling/ide/artifacts/impl/ArtifactsLocatorImpl.java
@@ -20,29 +20,23 @@
 
 import org.apache.sling.ide.artifacts.EmbeddedArtifact;
 import org.apache.sling.ide.artifacts.EmbeddedArtifactLocator;
-import org.osgi.framework.BundleContext;
-import org.osgi.service.component.ComponentContext;
 import org.osgi.service.component.annotations.Component;
 
 @Component(service = EmbeddedArtifactLocator.class)
 public class ArtifactsLocatorImpl implements EmbeddedArtifactLocator {
 
-    private ComponentContext context;
-
-    protected void activate(ComponentContext context) {
-        this.context = context;
-    }
+	public ArtifactsLocatorImpl() {
+		
+	}
 
     @Override
     public EmbeddedArtifact loadToolingSupportBundle() {
 
-        BundleContext bundleContext = context.getBundleContext();
-
         String version = "1.0.6"; // TODO - remove version hardcoding
         String artifactId = "org.apache.sling.tooling.support.install";
         String extension = "jar";
 
-        URL jarUrl = loadResource(bundleContext, artifactId + "-" + version
+        URL jarUrl = loadResource(artifactId + "-" + version
                 + "." + extension);
 
         return new EmbeddedArtifact(artifactId + "-" + version + "." + extension, version, jarUrl);
@@ -51,21 +45,19 @@
     @Override
     public EmbeddedArtifact loadSourceSupportBundle() {
         
-        BundleContext bundleContext = context.getBundleContext();
-        
         String version = "1.0.4"; // TODO - remove version hardcoding
         String artifactId = "org.apache.sling.tooling.support.source";
         String extension = "jar";
         
-        URL jarUrl = loadResource(bundleContext, artifactId + "-" + version
+        URL jarUrl = loadResource(artifactId + "-" + version
                 + "." + extension);
         
         return new EmbeddedArtifact(artifactId + "-" + version + "." + extension, version, jarUrl);
     }
 
-    private URL loadResource(BundleContext bundleContext, String resourceLocation) {
+    private URL loadResource(String resourceLocation) {
 
-        URL resourceUrl = bundleContext.getBundle().getResource(resourceLocation);
+        URL resourceUrl = this.getClass().getClassLoader().getResource(resourceLocation);
         if (resourceUrl == null) {
             throw new RuntimeException("Unable to locate bundle resource " + resourceLocation);
         }
diff --git a/shared/modules/artifacts/src/main/java/org/apache/sling/ide/artifacts/package-info.java b/shared/artifacts/src/main/java/org/apache/sling/ide/artifacts/package-info.java
similarity index 100%
rename from shared/modules/artifacts/src/main/java/org/apache/sling/ide/artifacts/package-info.java
rename to shared/artifacts/src/main/java/org/apache/sling/ide/artifacts/package-info.java
diff --git a/shared/modules/impl-resource/.project b/shared/impl-resource/.project
similarity index 72%
rename from shared/modules/impl-resource/.project
rename to shared/impl-resource/.project
index 11534a1..f4e0154 100644
--- a/shared/modules/impl-resource/.project
+++ b/shared/impl-resource/.project
@@ -11,16 +11,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/shared/modules/impl-resource/README.md b/shared/impl-resource/README.md
similarity index 100%
rename from shared/modules/impl-resource/README.md
rename to shared/impl-resource/README.md
diff --git a/shared/modules/impl-resource/bnd.bnd b/shared/impl-resource/bnd.bnd
similarity index 100%
rename from shared/modules/impl-resource/bnd.bnd
rename to shared/impl-resource/bnd.bnd
diff --git a/shared/modules/impl-resource/pom.xml b/shared/impl-resource/pom.xml
similarity index 85%
rename from shared/modules/impl-resource/pom.xml
rename to shared/impl-resource/pom.xml
index 668d063..527ae34 100644
--- a/shared/modules/impl-resource/pom.xml
+++ b/shared/impl-resource/pom.xml
@@ -30,15 +30,6 @@
         <url>https://gitbox.apache.org/repos/asf?p=sling-ide-tooling.git</url>
     </scm>
 
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>biz.aQute.bnd</groupId>
-                <artifactId>bnd-maven-plugin</artifactId>
-            </plugin>
-        </plugins>
-    </build>
-
     <dependencies>
         <dependency>
             <groupId>org.apache.sling.ide</groupId>
@@ -58,12 +49,6 @@
             <version>2.8.0</version>
             <scope>provided</scope>
         </dependency>
-        <!-- TODO - must be removed, OSGi deps not allowed here -->
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.service.event</artifactId>
-            <scope>provided</scope>
-        </dependency>
 
         <!-- Note that OSGi annotations are OK since they are not retained 
             at compile time -->
@@ -85,7 +70,4 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
-    <properties>
-        <sling.java.version>8</sling.java.version>
-    </properties>
 </project>
diff --git a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/filer/SimpleFilter.java b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/filter/SimpleFilter.java
similarity index 96%
rename from shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/filer/SimpleFilter.java
rename to shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/filter/SimpleFilter.java
index 8867d16..1df2fa7 100644
--- a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/filer/SimpleFilter.java
+++ b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/filter/SimpleFilter.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sling.ide.impl.resource.filer;
+package org.apache.sling.ide.impl.resource.filter;
 
 import java.util.List;
 
diff --git a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/filer/SimpleFilterLocator.java b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/filter/SimpleFilterLocator.java
similarity index 97%
rename from shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/filer/SimpleFilterLocator.java
rename to shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/filter/SimpleFilterLocator.java
index 5c0dcc5..5277287 100644
--- a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/filer/SimpleFilterLocator.java
+++ b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/filter/SimpleFilterLocator.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sling.ide.impl.resource.filer;
+package org.apache.sling.ide.impl.resource.filter;
 
 import java.io.BufferedReader;
 import java.io.File;
diff --git a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java
similarity index 100%
rename from shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java
rename to shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManager.java
diff --git a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/AbstractCommand.java b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/AbstractCommand.java
similarity index 97%
rename from shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/AbstractCommand.java
rename to shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/AbstractCommand.java
index a610826..90fb50b 100644
--- a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/AbstractCommand.java
+++ b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/AbstractCommand.java
@@ -46,7 +46,7 @@
 
     private String createFullPath(String relativePath) {
 
-        return PathUtil.join(repositoryInfo.getUrl(), relativePath);
+        return repositoryInfo.getUrl().resolve(relativePath).toString();
     }
 
     protected Result<T> resultForResponseStatus(int responseStatus) {
diff --git a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/AbstractResult.java b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/AbstractResult.java
similarity index 100%
rename from shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/AbstractResult.java
rename to shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/AbstractResult.java
diff --git a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/DeleteNodeCommand.java b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/DeleteNodeCommand.java
similarity index 100%
rename from shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/DeleteNodeCommand.java
rename to shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/DeleteNodeCommand.java
diff --git a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/GetNodeCommand.java b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/GetNodeCommand.java
similarity index 95%
rename from shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/GetNodeCommand.java
rename to shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/GetNodeCommand.java
index 6c56f90..3ca9075 100644
--- a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/GetNodeCommand.java
+++ b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/GetNodeCommand.java
@@ -39,7 +39,7 @@
     		httpClient.getParams().setAuthenticationPreemptive(true);
     	    Credentials defaultcreds = new UsernamePasswordCredentials(repositoryInfo.getUsername(), repositoryInfo.getPassword());
     	    //TODO
-    	    httpClient.getState().setCredentials(new AuthScope(repositoryInfo.getHost(),repositoryInfo.getPort(), AuthScope.ANY_REALM), defaultcreds);
+    	    httpClient.getState().setCredentials(new AuthScope(repositoryInfo.getUrl().getHost(),repositoryInfo.getUrl().getPort(), AuthScope.ANY_REALM), defaultcreds);
     		int responseStatus=httpClient.executeMethod(get);
     		
     		if ( isSuccessStatus(responseStatus) )
diff --git a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/GetNodeContentCommand.java b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/GetNodeContentCommand.java
similarity index 96%
rename from shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/GetNodeContentCommand.java
rename to shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/GetNodeContentCommand.java
index 45e8f95..ea9fefb 100644
--- a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/GetNodeContentCommand.java
+++ b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/GetNodeContentCommand.java
@@ -44,7 +44,7 @@
     	try{
     		httpClient.getParams().setAuthenticationPreemptive(true);
     	    Credentials defaultcreds = new UsernamePasswordCredentials(repositoryInfo.getUsername(), repositoryInfo.getPassword());
-    	    httpClient.getState().setCredentials(new AuthScope(repositoryInfo.getHost(),repositoryInfo.getPort(), AuthScope.ANY_REALM), defaultcreds); 
+    	    httpClient.getState().setCredentials(new AuthScope(repositoryInfo.getUrl().getHost(),repositoryInfo.getUrl().getPort(), AuthScope.ANY_REALM), defaultcreds); 
     		int responseStatus=httpClient.executeMethod(get);
     		//TODO change responseAsString with something like
     		// return EncodingUtil.getString(rawdata, m.getResponseCharSet());
diff --git a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/ListChildrenCommand.java b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/ListChildrenCommand.java
similarity index 97%
rename from shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/ListChildrenCommand.java
rename to shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/ListChildrenCommand.java
index a0364b8..2408ebb 100644
--- a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/ListChildrenCommand.java
+++ b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/ListChildrenCommand.java
@@ -56,7 +56,7 @@
     	try{
     		httpClient.getParams().setAuthenticationPreemptive(true);
     	    Credentials defaultcreds = new UsernamePasswordCredentials(repositoryInfo.getUsername(), repositoryInfo.getPassword());
-    	    httpClient.getState().setCredentials(new AuthScope(repositoryInfo.getHost(),repositoryInfo.getPort(), AuthScope.ANY_REALM), defaultcreds);
+    	    httpClient.getState().setCredentials(new AuthScope(repositoryInfo.getUrl().getHost(),repositoryInfo.getUrl().getPort(), AuthScope.ANY_REALM), defaultcreds);
     		int responseStatus=httpClient.executeMethod(get);
 
     		//TODO change responseAsString with something like
diff --git a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/RepositoryFactoryImpl.java b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/RepositoryFactoryImpl.java
similarity index 72%
rename from shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/RepositoryFactoryImpl.java
rename to shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/RepositoryFactoryImpl.java
index ef73e51..fa5e915 100644
--- a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/RepositoryFactoryImpl.java
+++ b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/RepositoryFactoryImpl.java
@@ -16,13 +16,14 @@
  */
 package org.apache.sling.ide.impl.resource.transport;
 
+import org.apache.sling.ide.log.Logger;
 import org.apache.sling.ide.transport.Repository;
 import org.apache.sling.ide.transport.RepositoryException;
 import org.apache.sling.ide.transport.RepositoryFactory;
 import org.apache.sling.ide.transport.RepositoryInfo;
+import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.event.EventAdmin;
 
 /**
  * The <tt>RepositoryFactoryImpl</tt> creates <tt>RepositoryImpl</tt> instances
@@ -31,32 +32,29 @@
 @Component(service = RepositoryFactory.class)
 public class RepositoryFactoryImpl implements RepositoryFactory {
 
-    @Reference
-    private EventAdmin eventAdmin;
-
-    public RepositoryFactoryImpl() {
-    }
+	private final Logger logger;
 
     /**
-     * Constructor to create this instance outside of an OSGi Container
+     * Constructor to create this instance
      *
-     * @param eventAdmin Event Admin for tracing the Repository. If null then there is no tracing.
+     * @param logger the logger
      */
-    public RepositoryFactoryImpl(EventAdmin eventAdmin) {
-        bindEventAdmin(eventAdmin);
+	@Activate
+    public RepositoryFactoryImpl(@Reference Logger logger) {
+        this.logger = logger;
     }
 
     @Override
     public Repository connectRepository(RepositoryInfo repositoryInfo) throws RepositoryException {
         //TODO: currently not doing repository-caching
-        return new RepositoryImpl(repositoryInfo, eventAdmin);
+        return new RepositoryImpl(repositoryInfo, logger);
     }
     
     @Override
     public Repository getRepository(RepositoryInfo repositoryInfo,
             boolean acceptsDisconnectedRepository) throws RepositoryException {
         //TODO: currently not doing repository-caching
-        return new RepositoryImpl(repositoryInfo, eventAdmin);
+        return new RepositoryImpl(repositoryInfo, logger);
     }
     
     @Override
@@ -64,11 +62,4 @@
         //TODO: not yet implemented
     }
 
-    protected void bindEventAdmin(EventAdmin eventAdmin) {
-        this.eventAdmin = eventAdmin;
-    }
-
-    protected void unbindEventAdmin(EventAdmin eventAdmin) {
-        this.eventAdmin = null;
-    }
 }
diff --git a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/RepositoryImpl.java b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/RepositoryImpl.java
similarity index 73%
rename from shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/RepositoryImpl.java
rename to shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/RepositoryImpl.java
index d98e7ec..204ecbc 100644
--- a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/RepositoryImpl.java
+++ b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/RepositoryImpl.java
@@ -17,6 +17,7 @@
 package org.apache.sling.ide.impl.resource.transport;
 
 import org.apache.commons.httpclient.HttpClient;
+import org.apache.sling.ide.log.Logger;
 import org.apache.sling.ide.transport.Command;
 import org.apache.sling.ide.transport.CommandContext;
 import org.apache.sling.ide.transport.FileInfo;
@@ -25,43 +26,36 @@
 import org.apache.sling.ide.transport.RepositoryInfo;
 import org.apache.sling.ide.transport.ResourceProxy;
 import org.apache.sling.ide.transport.Result;
-import org.apache.sling.ide.transport.TracingCommand;
-import org.osgi.service.event.EventAdmin;
 
 public class RepositoryImpl implements Repository {
 	
     private final HttpClient httpClient = new HttpClient();
     private final RepositoryInfo repositoryInfo;
-    private final EventAdmin eventAdmin;
+    private final Logger logger;
 
-    public RepositoryImpl(RepositoryInfo repositoryInfo, EventAdmin eventAdmin) {
+    public RepositoryImpl(RepositoryInfo repositoryInfo, Logger logger) {
         this.repositoryInfo = repositoryInfo;
-        this.eventAdmin = eventAdmin;
-    }
-
-    private <T> Command<T> wrap(AbstractCommand<T> command) {
-        return new TracingCommand<>(command, eventAdmin);
+        this.logger = logger;
     }
 
 	@Override
     public Command<Void> newDeleteNodeCommand(final String path) {
-        return wrap(new DeleteNodeCommand(path, repositoryInfo, httpClient));
+        return new DeleteNodeCommand(path, repositoryInfo, httpClient);
 	}
 	
 	@Override
     public Command<ResourceProxy> newListChildrenNodeCommand(final String path) {
-        return wrap(new ListChildrenCommand(repositoryInfo, httpClient, path + ".1.json"));
+        return new ListChildrenCommand(repositoryInfo, httpClient, path + ".1.json");
 	}
 
 	@Override
 	public Command<byte[]> newGetNodeCommand(final String path) {
-		
-        return wrap(new GetNodeCommand(repositoryInfo, httpClient, path));
+        return new GetNodeCommand(repositoryInfo, httpClient, path);
 	}
 	
 	@Override
     public Command<ResourceProxy> newGetNodeContentCommand(final String path) {
-        return wrap(new GetNodeContentCommand(repositoryInfo, httpClient, path + ".json"));
+        return new GetNodeContentCommand(repositoryInfo, httpClient, path + ".json");
 	}
 	
 	@Override
@@ -71,19 +65,19 @@
             throw new UnsupportedOperationException("This implementation does not support any flags");
         }
 		
-        return wrap(new UpdateContentCommand(repositoryInfo, httpClient, fileInfo.getRelativeLocation(),
-                resource.getProperties(), fileInfo));
+        return new UpdateContentCommand(repositoryInfo, httpClient, fileInfo.getRelativeLocation(),
+                resource.getProperties(), fileInfo);
 	}
 
     @Override
     public Command<Void> newReorderChildNodesCommand(ResourceProxy resourceProxy) {
-        return wrap(new AbstractCommand<Void>(repositoryInfo, httpClient, resourceProxy.getPath()) {
+        return new AbstractCommand<Void>(repositoryInfo, httpClient, resourceProxy.getPath()) {
             @Override
             public Result<Void> execute() {
                 // TODO - this is a no-op
                 return null;
             }
-        });
+        };
     }
 
     @Override
diff --git a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/UpdateContentCommand.java b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/UpdateContentCommand.java
similarity index 100%
rename from shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/UpdateContentCommand.java
rename to shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/transport/UpdateContentCommand.java
diff --git a/shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/util/Constants.java b/shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/util/Constants.java
similarity index 100%
rename from shared/modules/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/util/Constants.java
rename to shared/impl-resource/src/main/java/org/apache/sling/ide/impl/resource/util/Constants.java
diff --git a/shared/modules/impl-resource/src/test/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.java b/shared/impl-resource/src/test/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.java
similarity index 100%
rename from shared/modules/impl-resource/src/test/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.java
rename to shared/impl-resource/src/test/java/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.java
diff --git a/shared/modules/impl-resource/src/test/resources/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.serializedDataIsEscaped.xml b/shared/impl-resource/src/test/resources/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.serializedDataIsEscaped.xml
similarity index 100%
rename from shared/modules/impl-resource/src/test/resources/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.serializedDataIsEscaped.xml
rename to shared/impl-resource/src/test/resources/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.serializedDataIsEscaped.xml
diff --git a/shared/modules/impl-resource/src/test/resources/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.stringSerializedData.xml b/shared/impl-resource/src/test/resources/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.stringSerializedData.xml
similarity index 100%
rename from shared/modules/impl-resource/src/test/resources/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.stringSerializedData.xml
rename to shared/impl-resource/src/test/resources/org/apache/sling/ide/impl/resource/serialization/SimpleXmlSerializationManagerTest.stringSerializedData.xml
diff --git a/shared/modules/impl-vlt/.project b/shared/impl-vlt/.project
similarity index 72%
rename from shared/modules/impl-vlt/.project
rename to shared/impl-vlt/.project
index a5eecdb..46d0e85 100644
--- a/shared/modules/impl-vlt/.project
+++ b/shared/impl-vlt/.project
@@ -11,16 +11,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/shared/modules/impl-vlt/README.md b/shared/impl-vlt/README.md
similarity index 100%
rename from shared/modules/impl-vlt/README.md
rename to shared/impl-vlt/README.md
diff --git a/shared/impl-vlt/bnd.bnd b/shared/impl-vlt/bnd.bnd
new file mode 100644
index 0000000..b281ccb
--- /dev/null
+++ b/shared/impl-vlt/bnd.bnd
@@ -0,0 +1,47 @@
+Bundle-SymbolicName: org.apache.sling.ide.impl-vlt;singleton:=true
+SlingIDE-PluginLoggerEnabled: true
+Bundle-ActivationPolicy: lazy
+
+Export-Package: \
+javax.jcr; \
+javax.jcr.lock; \
+javax.jcr.nodetype; \
+javax.jcr.observation; \
+javax.jcr.query; \
+javax.jcr.query.qom; \
+javax.jcr.retention; \
+javax.jcr.security; \
+javax.jcr.util; \
+javax.jcr.version; version=2.0
+
+# some generated import-package headers are not necessary
+# imports being generated from org.apache.commons.io.input.BufferedFileChannelInputStream
+Import-Package: \
+ !sun.*, \
+ !org.apache.sling.jcr.api, \
+ *
+
+# disable annotation processing for embedded bundles (neither declarative services nor metatypes necessary for IDE tooling)
+-dsannotations: !org.apache.jackrabbit.*,*
+-metatypeannotations: !org.apache.jackrabbit.*,*
+ 
+ # some dependencies can be kept private
+-includeresource: \
+@commons-collections-3.2.2.jar, \
+@commons-io-2.11.0.jar, \
+@jcr-2.0.jar, \
+@org.apache.jackrabbit.vault-${vault.version}.jar!/!OSGI-INF/*, \
+@vault-davex-${vault.version}.jar, \
+@oak-jackrabbit-api-${oak.version}.jar, \
+@jackrabbit-spi-${jackrabbit.version}.jar, \
+@jackrabbit-spi2dav-${jackrabbit.version}.jar, \
+@jackrabbit-jcr-client-${jackrabbit.version}.jar, \
+@jackrabbit-jcr2spi-${jackrabbit.version}.jar, \
+@jackrabbit-jcr-commons-${jackrabbit.version}.jar, \
+@jackrabbit-spi-commons-${jackrabbit.version}.jar, \
+@jackrabbit-webdav-${jackrabbit.version}.jar \
+
+# whitelist the private reference usage in Packaging.getJcrPackageRegistry(Session)
+-fixupmessages:"Export org.apache.jackrabbit.vault.packaging,  has 1,  private references [org.apache.jackrabbit.vault.packaging.registry.impl]"; \
+    restrict:=warning; \
+    is:=warn
\ No newline at end of file
diff --git a/shared/modules/impl-vlt/pom.xml b/shared/impl-vlt/pom.xml
similarity index 65%
rename from shared/modules/impl-vlt/pom.xml
rename to shared/impl-vlt/pom.xml
index 9187131..79b9b47 100644
--- a/shared/modules/impl-vlt/pom.xml
+++ b/shared/impl-vlt/pom.xml
@@ -32,23 +32,26 @@
 
     <build>
         <plugins>
-            <plugin>
-                <groupId>biz.aQute.bnd</groupId>
-                <artifactId>bnd-maven-plugin</artifactId>
-            </plugin>
-            <plugin>
+        	<plugin>
                 <groupId>org.apache.rat</groupId>
                 <artifactId>apache-rat-plugin</artifactId>
                 <configuration>
                     <excludes>
-                        <exclude>derby.log</exclude>
                         <exclude>**/bin.binary</exclude>
                     </excludes>
                 </configuration>
             </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
+                <artifactId>maven-failsafe-plugin</artifactId>
+                <executions>
+                	<execution>
+			            <goals>
+			                <goal>integration-test</goal>
+			                <goal>verify</goal>
+			            </goals>
+			        </execution>
+                </executions>
                 <configuration>
                     <systemProperties>
                         <org.slf4j.simpleLogger.showDateTime>true</org.slf4j.simpleLogger.showDateTime>
@@ -60,6 +63,15 @@
         </plugins>
     </build>
 
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+  <groupId>commons-io</groupId>
+  <artifactId>commons-io</artifactId>
+  <version>2.11.0</version>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
     <dependencies>
         <dependency>
             <groupId>org.apache.sling.ide</groupId>
@@ -77,30 +89,67 @@
         <dependency>
             <groupId>org.apache.jackrabbit.vault</groupId>
             <artifactId>org.apache.jackrabbit.vault</artifactId>
-            <version>3.1.44</version>
             <scope>provided</scope>
         </dependency>
 
         <dependency>
             <groupId>org.apache.jackrabbit.vault</groupId>
             <artifactId>vault-davex</artifactId>
-            <version>3.1.44</version>
             <scope>provided</scope>
         </dependency>
-
-        <dependency>
-            <groupId>org.apache.jackrabbit</groupId>
-            <artifactId>jackrabbit-spi-commons</artifactId>
-            <version>2.16.0</version>
-            <scope>provided</scope>
-        </dependency>
-
-        <!-- TODO - must be removed, OSGi deps not allowed here -->
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.service.event</artifactId>
-            <scope>provided</scope>
-        </dependency>
+        
+        <!-- START Transitive dependencies of FileVault -->
+		<dependency>
+			<groupId>org.apache.jackrabbit</groupId>
+			<artifactId>oak-jackrabbit-api</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.jackrabbit</groupId>
+			<artifactId>jackrabbit-webdav</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.jackrabbit</groupId>
+			<artifactId>jackrabbit-spi-commons</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.jackrabbit</groupId>
+			<artifactId>jackrabbit-jcr-commons</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.jackrabbit</groupId>
+			<artifactId>jackrabbit-jcr2spi</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.jackrabbit</groupId>
+			<artifactId>jackrabbit-jcr-client</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.jackrabbit</groupId>
+			<artifactId>jackrabbit-spi</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.jackrabbit</groupId>
+			<artifactId>jackrabbit-spi2dav</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpclient</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpmime</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<!-- END Transitive dependencies of FileVault -->
 
         <!-- Note that OSGi annotations are OK since they are not retained 
             at compile time -->
@@ -109,11 +158,18 @@
             <artifactId>org.osgi.annotation.versioning</artifactId>
             <scope>provided</scope>
         </dependency>
+        <!-- only property types used at build time -->
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.service.component</artifactId>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.service.component.annotations</artifactId>
             <scope>provided</scope>
         </dependency>
+        
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.service.metatype.annotations</artifactId>
@@ -146,8 +202,27 @@
         </dependency>
         <dependency>
             <groupId>org.apache.jackrabbit</groupId>
-            <artifactId>jackrabbit-core</artifactId>
-            <version>2.16.0</version>
+            <artifactId>oak-core</artifactId>
+            <version>${oak.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-core</artifactId>
+            <version>${oak.version}</version>
+            <classifier>tests</classifier>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-jcr</artifactId>
+            <version>${oak.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-segment-tar</artifactId>
+            <version>${oak.version}</version>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -156,9 +231,4 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
-    <properties>
-        <sling.java.version>8</sling.java.version>
-        <!-- Jackrabbit is quite verbose on INFO level -->
-        <defaultLogLevel>warn</defaultLogLevel>
-    </properties>
 </project>
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommand.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommand.java
similarity index 96%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommand.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommand.java
index 3f87e82..c04b843 100644
--- a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommand.java
+++ b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommand.java
@@ -20,8 +20,8 @@
 import static org.apache.jackrabbit.vault.util.JcrConstants.JCR_DATA;
 import static org.apache.jackrabbit.vault.util.JcrConstants.JCR_LASTMODIFIED;
 import static org.apache.jackrabbit.vault.util.JcrConstants.JCR_PRIMARYTYPE;
+import static org.apache.jackrabbit.vault.util.JcrConstants.NT_FILE;
 import static org.apache.jackrabbit.vault.util.JcrConstants.NT_RESOURCE;
-import static org.apache.sling.ide.transport.Repository.NT_FILE;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -53,8 +53,8 @@
 import javax.jcr.nodetype.NodeType;
 import javax.jcr.nodetype.PropertyDefinition;
 
+import org.apache.jackrabbit.util.Text;
 import org.apache.jackrabbit.vault.util.JcrConstants;
-import org.apache.jackrabbit.vault.util.Text;
 import org.apache.sling.ide.filter.FilterResult;
 import org.apache.sling.ide.log.Logger;
 import org.apache.sling.ide.transport.CommandContext;
@@ -97,8 +97,12 @@
             getLogger().trace("Found existing node at {0} with primaryType {1}", path,
                     node.getPrimaryNodeType().getName());
         } else {
-            node = createNode(resource, session);
-            getLogger().trace("Created node at {0} with primaryType {1}", path, node.getPrimaryNodeType().getName());
+        	try {
+	            node = createNode(resource, session);
+	            getLogger().trace("Created node at {0} with primaryType {1}", path, node.getPrimaryNodeType().getName());
+        	} catch (RepositoryException e) {
+        		throw new RepositoryException("Could not create node at " + Text.getRelativeParent(resource.getPath(), 1) + " based on resource " + resource, e);
+        	}
         }
 
         if (nodeExists && getFlags().contains(CommandExecutionFlag.CREATE_ONLY_WHEN_MISSING)) {
@@ -163,7 +167,7 @@
         }
 
         if (!session.nodeExists(parentLocation)) {
-            throw new RepositoryException("No parent found at " + parentLocation + " ; it's needed to create node at "
+            throw new RepositoryException("No parent node found at " + parentLocation + "; it's needed to create node at "
                     + resource.getPath());
         }
 
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ConversionUtils.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ConversionUtils.java
similarity index 100%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ConversionUtils.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ConversionUtils.java
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/DeleteNodeCommand.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/DeleteNodeCommand.java
similarity index 100%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/DeleteNodeCommand.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/DeleteNodeCommand.java
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/GetNodeCommand.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/GetNodeCommand.java
similarity index 100%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/GetNodeCommand.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/GetNodeCommand.java
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/GetNodeContentCommand.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/GetNodeContentCommand.java
similarity index 100%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/GetNodeContentCommand.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/GetNodeContentCommand.java
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/JcrCommand.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/JcrCommand.java
similarity index 100%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/JcrCommand.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/JcrCommand.java
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/JcrResult.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/JcrResult.java
similarity index 92%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/JcrResult.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/JcrResult.java
index c2c4efb..c8b272e 100644
--- a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/JcrResult.java
+++ b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/JcrResult.java
@@ -59,12 +59,14 @@
     @Override
     public String toString() {
         StringBuilder out = new StringBuilder();
-        out.append(getClass().getSimpleName()).append("[ success:").append(success);
+        out.append(getClass().getSimpleName()).append(" [success:").append(success);
 
-        if (exception != null)
+        if (exception != null) {
+        	// TODO: stack trace
+        	// TODO: log cause
             out.append(", exception: ").append(exception.getClass().getName()).append(" - ")
                     .append(exception.getMessage());
-
+        }
         out.append(']');
 
         return out.toString();
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ListChildrenCommand.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ListChildrenCommand.java
similarity index 100%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ListChildrenCommand.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ListChildrenCommand.java
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ListTreeCommand.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ListTreeCommand.java
similarity index 67%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ListTreeCommand.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ListTreeCommand.java
index 347853e..1654907 100644
--- a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ListTreeCommand.java
+++ b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ListTreeCommand.java
@@ -16,9 +16,6 @@
  */
 package org.apache.sling.ide.impl.vlt;
 
-import java.util.HashMap;
-import java.util.Map;
-
 import javax.jcr.Credentials;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
@@ -27,21 +24,15 @@
 import javax.jcr.Session;
 
 import org.apache.sling.ide.log.Logger;
-import org.apache.sling.ide.transport.CommandExecutionProperties;
 import org.apache.sling.ide.transport.ResourceProxy;
-import org.osgi.service.event.Event;
-import org.osgi.service.event.EventAdmin;
 
 public class ListTreeCommand extends JcrCommand<ResourceProxy> {
 
     private final int levels;
-    private final EventAdmin eventAdmin;
 
-    public ListTreeCommand(Repository repository, Credentials credentials, String path, int levels,
-            EventAdmin eventAdmin, Logger logger) {
+    public ListTreeCommand(Repository repository, Credentials credentials, String path, int levels, Logger logger) {
         super(repository, credentials, path, logger);
         this.levels = Math.max(1,levels);
-        this.eventAdmin = eventAdmin;
     }
 
     @Override
@@ -61,10 +52,7 @@
             // paranoia check
             throw new IllegalArgumentException("remainingLevels must be >=0, not: "+remainingLevels);
         }
-        final long start = System.currentTimeMillis();
         NodeIterator nodes = node.getNodes();
-        final long end = System.currentTimeMillis();
-        log("ListTreeCommand.child -> "+node.getPath(), start, end);
         while (nodes.hasNext()) {
             Node childNode = nodes.nextNode();
 
@@ -82,16 +70,4 @@
         }
     }
 
-    private void log(String text, long start, long end) {
-        Map<String, Object> props = new HashMap<>();
-        props.put(CommandExecutionProperties.RESULT_TEXT, text);
-        props.put(CommandExecutionProperties.RESULT_STATUS, Boolean.TRUE);
-        props.put(CommandExecutionProperties.ACTION_TYPE, getClass().getSimpleName());
-        props.put(CommandExecutionProperties.ACTION_TARGET, getPath());
-        props.put(CommandExecutionProperties.TIMESTAMP_START, start);
-        props.put(CommandExecutionProperties.TIMESTAMP_END, end);
-        Event event = new Event(CommandExecutionProperties.REPOSITORY_TOPIC, props);
-        eventAdmin.postEvent(event);
-    }
-
 }
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/NoOpCommand.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/NoOpCommand.java
similarity index 100%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/NoOpCommand.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/NoOpCommand.java
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ReorderChildNodesCommand.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ReorderChildNodesCommand.java
similarity index 99%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ReorderChildNodesCommand.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ReorderChildNodesCommand.java
index c6909bf..48460f6 100644
--- a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ReorderChildNodesCommand.java
+++ b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/ReorderChildNodesCommand.java
@@ -31,7 +31,7 @@
 import javax.jcr.Session;
 import javax.jcr.nodetype.NodeType;
 
-import org.apache.jackrabbit.vault.util.Text;
+import org.apache.jackrabbit.util.Text;
 import org.apache.sling.ide.log.Logger;
 import org.apache.sling.ide.transport.ResourceProxy;
 
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VaultFsLocator.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VaultFsLocator.java
similarity index 100%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VaultFsLocator.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VaultFsLocator.java
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VaultFsLocatorImpl.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VaultFsLocatorImpl.java
similarity index 100%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VaultFsLocatorImpl.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VaultFsLocatorImpl.java
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltNodeDefinition.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltNodeDefinition.java
similarity index 100%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltNodeDefinition.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltNodeDefinition.java
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltNodeType.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltNodeType.java
similarity index 100%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltNodeType.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltNodeType.java
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltNodeTypeFactory.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltNodeTypeFactory.java
similarity index 100%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltNodeTypeFactory.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltNodeTypeFactory.java
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltNodeTypeRegistry.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltNodeTypeRegistry.java
similarity index 100%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltNodeTypeRegistry.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltNodeTypeRegistry.java
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltPropertyDefinition.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltPropertyDefinition.java
similarity index 100%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltPropertyDefinition.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltPropertyDefinition.java
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltRepository.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltRepository.java
similarity index 73%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltRepository.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltRepository.java
index c065e22..22548af 100644
--- a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltRepository.java
+++ b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltRepository.java
@@ -28,8 +28,6 @@
 import org.apache.sling.ide.transport.Repository;
 import org.apache.sling.ide.transport.RepositoryInfo;
 import org.apache.sling.ide.transport.ResourceProxy;
-import org.apache.sling.ide.transport.TracingCommand;
-import org.osgi.service.event.EventAdmin;
 
 /**
  * The <tt>VltRepository</tt> is a Repository implementation backed by <tt>FileVault</tt>
@@ -38,7 +36,6 @@
 public class VltRepository implements Repository {
 
     private final RepositoryInfo repositoryInfo;
-    private EventAdmin eventAdmin;
     private NodeTypeRegistry ntRegistry;
 
     private javax.jcr.Repository jcrRepo;
@@ -46,9 +43,8 @@
     private boolean disconnected = false;
     private final Logger logger;
 
-    public VltRepository(RepositoryInfo repositoryInfo, EventAdmin eventAdmin, Logger logger) {
+    public VltRepository(RepositoryInfo repositoryInfo, Logger logger) {
         this.repositoryInfo = repositoryInfo;
-        this.eventAdmin = eventAdmin;
         this.logger = logger;
     }
 
@@ -87,52 +83,36 @@
     @Override
     public Command<Void> newAddOrUpdateNodeCommand(CommandContext context, FileInfo fileInfo, ResourceProxy resource,
             CommandExecutionFlag... flags) {
-        return TracingCommand.wrap(new AddOrUpdateNodeCommand(jcrRepo, credentials, context, fileInfo, resource, logger, flags),
-                eventAdmin);
+        return new AddOrUpdateNodeCommand(jcrRepo, credentials, context, fileInfo, resource, logger, flags);
     }
 
     @Override
     public Command<Void> newReorderChildNodesCommand(ResourceProxy resource) {
-        return TracingCommand.wrap(new ReorderChildNodesCommand(jcrRepo, credentials, resource, logger), eventAdmin);
+        return new ReorderChildNodesCommand(jcrRepo, credentials, resource, logger);
     }
 
     @Override
     public Command<Void> newDeleteNodeCommand(String path) {
-        return TracingCommand.wrap(new DeleteNodeCommand(jcrRepo, credentials, path, logger), eventAdmin);
+        return new DeleteNodeCommand(jcrRepo, credentials, path, logger);
     }
 
     @Override
     public Command<ResourceProxy> newListChildrenNodeCommand(String path) {
-
-        return TracingCommand.wrap(new ListChildrenCommand(jcrRepo, credentials, path, logger), eventAdmin);
+        return new ListChildrenCommand(jcrRepo, credentials, path, logger);
     }
 
     @Override
     public Command<ResourceProxy> newGetNodeContentCommand(String path) {
-
-        return TracingCommand.wrap(new GetNodeContentCommand(jcrRepo, credentials, path, logger), eventAdmin);
+        return new GetNodeContentCommand(jcrRepo, credentials, path, logger);
     }
 
     @Override
     public Command<byte[]> newGetNodeCommand(String path) {
-
-        return TracingCommand.wrap(new GetNodeCommand(jcrRepo, credentials, path, logger), eventAdmin);
+    	return new GetNodeCommand(jcrRepo, credentials, path, logger);
     }
 
-    protected void bindEventAdmin(EventAdmin eventAdmin) {
-
-        this.eventAdmin = eventAdmin;
-    }
-
-    protected void unbindEventAdmin(EventAdmin eventAdmin) {
-
-        this.eventAdmin = null;
-    }
-    
     Command<ResourceProxy> newListTreeNodeCommand(String path, int levels) {
-
-        return TracingCommand.wrap(new ListTreeCommand(jcrRepo, credentials, path, levels, eventAdmin, logger),
-                eventAdmin);
+        return new ListTreeCommand(jcrRepo, credentials, path, levels, logger);
     }
     
     @Override
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltRepositoryFactory.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltRepositoryFactory.java
similarity index 79%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltRepositoryFactory.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltRepositoryFactory.java
index e969f48..939da02 100644
--- a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltRepositoryFactory.java
+++ b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/VltRepositoryFactory.java
@@ -24,37 +24,32 @@
 import org.apache.sling.ide.transport.RepositoryException;
 import org.apache.sling.ide.transport.RepositoryFactory;
 import org.apache.sling.ide.transport.RepositoryInfo;
+import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.event.EventAdmin;
+import org.osgi.service.component.annotations.ReferencePolicyOption;
+import org.osgi.service.component.propertytypes.ServiceRanking;
 
 /**
- * The <tt>VltRepositoryFactory</tt> instatiantes <tt>VltRepository</tt> instances
+ * The <tt>VltRepositoryFactory</tt> instantiates <tt>VltRepository</tt> instances
  * This service should get precedence over {@code org.apache.sling.ide.impl.resource.transport.RepositoryFactoryImpl} in
  * case both are deployed in an OSGi container.
  */
-@Component(service = RepositoryFactory.class, property="service.ranking:Integer=1000")
+@Component(service = RepositoryFactory.class)
+@ServiceRanking(1000)
 public class VltRepositoryFactory implements RepositoryFactory {
 
-    @Reference
-    private EventAdmin eventAdmin;
-    
-    @Reference
-    private Logger logger;
+    private final Logger logger;
     
     private Map<String,VltRepository> repositoryMap = new HashMap<>();
 
-    public VltRepositoryFactory() {
-    }
-
     /**
-     * Constructor to create this instance outside of an OSGi Container
+     * Constructor to create this instance
      *
-     * @param eventAdmin Event Admin for tracing the OSGi Client. If null then there is no tracing.
      * @param logger Sling IDE Logger which must not be null
      */
-    public VltRepositoryFactory(EventAdmin eventAdmin, Logger logger) {
-        bindEventAdmin(eventAdmin);
+    @Activate
+    public VltRepositoryFactory(@Reference Logger logger) {
         this.logger = logger;
     }
 
@@ -88,7 +83,7 @@
                 return repo;
             }
             
-            repo = new VltRepository(repositoryInfo, eventAdmin, logger);
+            repo = new VltRepository(repositoryInfo, logger);
             repo.connect();
             
             repositoryMap.put(key, repo);
@@ -113,12 +108,4 @@
     private String getKey(RepositoryInfo repositoryInfo) {
         return repositoryInfo.getUsername()+":"+repositoryInfo.getPassword()+"@"+repositoryInfo.getUrl();
     }
-
-    protected void bindEventAdmin(EventAdmin eventAdmin) {
-        this.eventAdmin = eventAdmin;
-    }
-
-    protected void unbindEventAdmin(EventAdmin eventAdmin) {
-        this.eventAdmin = null;
-    }
 }
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/filter/VltFilter.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/filter/VltFilter.java
similarity index 100%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/filter/VltFilter.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/filter/VltFilter.java
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/filter/VltFilterLocator.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/filter/VltFilterLocator.java
similarity index 100%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/filter/VltFilterLocator.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/filter/VltFilterLocator.java
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/ContentXmlHandler.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/ResourceProxyParserHandler.java
similarity index 65%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/ContentXmlHandler.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/ResourceProxyParserHandler.java
index 55640fc..79c25f9 100644
--- a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/ContentXmlHandler.java
+++ b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/ResourceProxyParserHandler.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sling.ide.impl.vlt.serialization;
 
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.net.URISyntaxException;
 import java.util.Calendar;
@@ -24,41 +25,28 @@
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.Map;
+import java.util.Optional;
 import java.util.UUID;
 
-import javax.jcr.NamespaceException;
 import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
 
-import org.apache.jackrabbit.spi.commons.conversion.DefaultNamePathResolver;
-import org.apache.jackrabbit.spi.commons.namespace.NamespaceResolver;
+import org.apache.jackrabbit.spi.commons.conversion.NameResolver;
 import org.apache.jackrabbit.util.ISO8601;
-import org.apache.jackrabbit.util.ISO9075;
-import org.apache.jackrabbit.vault.util.DocViewNode;
-import org.apache.jackrabbit.vault.util.DocViewProperty;
-import org.apache.sling.ide.log.Logger;
+import org.apache.jackrabbit.vault.fs.io.DocViewParserHandler;
+import org.apache.jackrabbit.vault.util.DocViewNode2;
+import org.apache.jackrabbit.vault.util.DocViewProperty2;
 import org.apache.sling.ide.transport.ResourceProxy;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
 
-public class ContentXmlHandler extends DefaultHandler implements NamespaceResolver {
+public class ResourceProxyParserHandler implements DocViewParserHandler {
 
-    private static final String JCR_ROOT = "jcr:root";
-    private final ResourceProxy root;
-    private final Deque<ResourceProxy> queue = new LinkedList<>();
+	private ResourceProxy root;
+	
+	private NameResolver nameResolver;
 
-    /** 
-     * map containing fully qualified uris as keys and their defined prefixes as values
-     */
-    private final Map<String, String> uriPrefixMap;
-    
-    /**
-     * the default name path resolver
-     */
-    private final DefaultNamePathResolver npResolver = new DefaultNamePathResolver(this);
-    private Logger logger;
+	private final Deque<ResourceProxy> resourceQueue = new LinkedList<>();
 
-    /**
+	/**
      * all type hint classes in a map (key = type integer value)
      */
     private static final Map<Integer, TypeHint> TYPE_HINT_MAP;
@@ -70,76 +58,46 @@
         }
     }
 
-    public ContentXmlHandler(String rootResourcePath, Logger logger) {
-        root = new ResourceProxy(rootResourcePath);
-        uriPrefixMap = new HashMap<>();
-        
-        this.logger = logger;
-    }
+	public ResourceProxyParserHandler() {
+		
+	}
+	
+	
+	@Override
+	public void setNameResolver(NameResolver nameResolver) {
+		this.nameResolver = nameResolver;
+	}
 
-    @Override
-    public void startPrefixMapping(String prefix, String uri) throws SAXException {
-        uriPrefixMap.put(uri, prefix);
-    }
 
-    @Override
-    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+	@Override
+	public void startDocViewNode(String nodePath, DocViewNode2 docViewNode, Optional<DocViewNode2> parentDocViewNode,
+			int line, int column) throws IOException, RepositoryException {
+		
+		ResourceProxy currentResource = new ResourceProxy(nodePath);
+		for (DocViewProperty2 property: docViewNode.getProperties()) {
+			Object value = TypeHint.convertDocViewPropertyToTypedValue(property);
+			if (value != null) {
+				// always use qualified names (leveraging the namespace declaration from the DocView XML)
+				currentResource.addProperty(nameResolver.getJCRName(property.getName()), value);
+			}
+		}
+		if (root == null) {
+			root = currentResource;
+		} else {
+			ResourceProxy parent = resourceQueue.peekLast();
+            parent.addChild(currentResource);
+		}
+		resourceQueue.add(currentResource); 
+		
+	}
 
-        ResourceProxy current;
-        // name is equal to label except for SNS
-        String label = ISO9075.decode(qName);
-        String name = label;
-        // code mostly taken from {@link org.apache.jackrabbit.vault.fs.impl.io.DocViewSaxImporter}
-        DocViewNode node;
-        try {
-            node = new DocViewNode(name, label, attributes, npResolver);
-            
-            if (qName.equals(JCR_ROOT)) {
-                current = root;
-            } else {
-               ResourceProxy parent = queue.peekLast();
+	@Override
+	public void endDocViewNode(String nodePath, DocViewNode2 docViewNode, Optional<DocViewNode2> parentDocViewNode,
+			int line, int column) throws IOException, RepositoryException {
+		resourceQueue.removeLast();
+	}
 
-                StringBuilder path = new StringBuilder(parent.getPath());
-                if (path.charAt(path.length() - 1) != '/')
-                    path.append('/');
-                path.append(qName);
-
-                current = new ResourceProxy(ISO9075.decode(path.toString()));
-                parent.addChild(current);
-            }
-
-            for (Map.Entry<String, DocViewProperty> entry : node.props.entrySet()) {
-
-                try {
-                    Object typedValue = TypeHint.convertDocViewPropertyToTypedValue(entry.getValue());
-                    
-                    // unsupported
-                    if (typedValue == null) {
-                        continue;
-                    }
-                    current.addProperty(entry.getKey(), typedValue);
-                } catch (Throwable t) {
-                    logger.error("Could not parse property '" + entry.getValue().name, t);
-                }
-            }
-
-            queue.add(current);
-        } catch (NamespaceException e) {
-            logger.error("Could not resolve a JCR namespace.", e);
-        }
-    }
-
-    @Override
-    public void endElement(String uri, String localName, String qName) throws SAXException {
-
-        queue.removeLast();
-    }
-
-    public ResourceProxy getRoot() {
-        return root;
-    }
-    
-    /**
+	/**
      * Each enum implements the {@link TypeHint#parseValues(String[], boolean)} in a way, that the String[] value is converted to the closest underlying type.
      */
     static enum TypeHint {
@@ -292,12 +250,12 @@
             }
         };
 
-        static Object convertDocViewPropertyToTypedValue(DocViewProperty property) {
-            TypeHint hint = TYPE_HINT_MAP.get(property.type);
+        static Object convertDocViewPropertyToTypedValue(DocViewProperty2 property) {
+            TypeHint hint = TYPE_HINT_MAP.get(property.getType());
             if (hint == null) {
-                throw new IllegalArgumentException("Unknown type value '" + property.type + "'");
+                throw new IllegalArgumentException("Unknown type value '" + property.getType() + "'");
             }
-            return hint.parseValues(property.values, property.isMulti);
+            return hint.parseValues(property.getStringValues().toArray(new String[0]), property.isMultiValue());
         }
 
         private final int propertyType;
@@ -315,21 +273,7 @@
 
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    public String getURI(String prefix) throws NamespaceException {
-        throw new UnsupportedOperationException("The method getUri is not implemented as this is not being used");
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getPrefix(String uri) throws NamespaceException {
-       String prefix = uriPrefixMap.get(uri);
-       if (prefix == null) {
-           throw new NamespaceException("Could not find defined prefix for uri " + uri);
-       }
-       return prefix;
-    }
+	public ResourceProxy getRoot() {
+		return root;
+	}
 }
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationDataBuilder.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationDataBuilder.java
similarity index 99%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationDataBuilder.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationDataBuilder.java
index a5c1172..a00e9f0 100644
--- a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationDataBuilder.java
+++ b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationDataBuilder.java
@@ -34,6 +34,7 @@
 import javax.jcr.ValueFormatException;
 import javax.jcr.nodetype.NodeType;
 
+import org.apache.jackrabbit.util.Text;
 import org.apache.jackrabbit.vault.fs.api.Aggregate;
 import org.apache.jackrabbit.vault.fs.api.Aggregator;
 import org.apache.jackrabbit.vault.fs.api.RepositoryAddress;
@@ -47,7 +48,6 @@
 import org.apache.jackrabbit.vault.util.JcrConstants;
 import org.apache.jackrabbit.vault.util.MimeTypes;
 import org.apache.jackrabbit.vault.util.PlatformNameFormat;
-import org.apache.jackrabbit.vault.util.Text;
 import org.apache.sling.ide.impl.vlt.VaultFsLocator;
 import org.apache.sling.ide.jcr.RepositoryUtils;
 import org.apache.sling.ide.log.Logger;
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java
similarity index 85%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java
index d98ae8f..2186fff 100644
--- a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java
+++ b/shared/impl-vlt/src/main/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManager.java
@@ -27,20 +27,17 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
 
+import org.apache.jackrabbit.util.Text;
 import org.apache.jackrabbit.vault.fs.Mounter;
 import org.apache.jackrabbit.vault.fs.api.RepositoryAddress;
-import org.apache.jackrabbit.vault.fs.api.SerializationType;
 import org.apache.jackrabbit.vault.fs.api.VaultFile;
 import org.apache.jackrabbit.vault.fs.api.VaultFileSystem;
-import org.apache.jackrabbit.vault.fs.impl.io.XmlAnalyzer;
+import org.apache.jackrabbit.vault.fs.io.DocViewParser;
+import org.apache.jackrabbit.vault.fs.io.DocViewParser.XmlParseException;
 import org.apache.jackrabbit.vault.util.Constants;
 import org.apache.jackrabbit.vault.util.PlatformNameFormat;
 import org.apache.jackrabbit.vault.util.RepositoryProvider;
-import org.apache.jackrabbit.vault.util.Text;
 import org.apache.sling.ide.impl.vlt.VaultFsLocator;
 import org.apache.sling.ide.log.Logger;
 import org.apache.sling.ide.serialization.SerializationDataBuilder;
@@ -48,21 +45,18 @@
 import org.apache.sling.ide.serialization.SerializationKind;
 import org.apache.sling.ide.serialization.SerializationManager;
 import org.apache.sling.ide.transport.ResourceProxy;
+import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
 import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
 
 @Component(service = SerializationManager.class)
 public class VltSerializationManager implements SerializationManager {
 
     static final String EXTENSION_XML = ".xml";
 
-    @Reference
-    private Logger logger;
-
-    @Reference
-    private VaultFsLocator fsLocator;
+    private final Logger logger;
+    private final VaultFsLocator fsLocator;
 
     public static void main(String[] args) throws RepositoryException, URISyntaxException, IOException {
         RepositoryAddress address = new RepositoryAddress("http://localhost:8080/server/root");
@@ -90,16 +84,15 @@
 
     }
 
-    public VltSerializationManager() {
-    }
-
+  
     /**
-     * Constructor to create this instance outside of an OSGi Container
+     * Constructor to create this instance
      *
      * @param logger Sling IDE Logger which must not be null
      * @param fsLocator Vault File System Locator which must not be null
      */
-    public VltSerializationManager(Logger logger, VaultFsLocator fsLocator) {
+    @Activate
+    public VltSerializationManager(@Reference Logger logger, @Reference VaultFsLocator fsLocator) {
         this.logger = logger;
         this.fsLocator = fsLocator;
     }
@@ -126,8 +119,7 @@
         // TODO - copied from TransactionImpl
         
         try (InputStream in = new BufferedInputStream(new FileInputStream(file))) {
-            SerializationType serType = XmlAnalyzer.analyze(new InputSource(in));
-            return serType == SerializationType.XML_DOCVIEW;
+            return DocViewParser.isDocView(new InputSource(in));
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
@@ -156,8 +148,7 @@
         // TODO - copied from TransactionImpl
         
         try (InputStream in = new BufferedInputStream(new FileInputStream(file))) {
-            SerializationType serType = XmlAnalyzer.analyze(new InputSource(in));
-            if (serType == SerializationType.XML_DOCVIEW) {
+            if (DocViewParser.isDocView(new InputSource(in))) {
                 return getPathWithoutXmlExtension(file);
             }
 
@@ -235,22 +226,17 @@
 
     @Override
     public ResourceProxy readSerializationData(String filePath, InputStream source) throws IOException {
-
         if (source == null)
             return null;
 
         String repositoryPath = getRepositoryPath(filePath);
 
         try {
-            SAXParserFactory factory = SAXParserFactory.newInstance();
-            factory.setNamespaceAware(true);
-            factory.setFeature("http://xml.org/sax/features/namespace-prefixes", false);
-            SAXParser parser = factory.newSAXParser();
-            ContentXmlHandler handler = new ContentXmlHandler(repositoryPath, logger);
-            parser.parse(source, handler);
-
+        	DocViewParser parser = new DocViewParser();
+        	ResourceProxyParserHandler handler = new ResourceProxyParserHandler();
+        	parser.parse(repositoryPath, new InputSource(source), handler);
             return handler.getRoot();
-        } catch (SAXException | ParserConfigurationException e) {
+        } catch (XmlParseException e) {
             // TODO proper error handling
             throw new IOException(e);
         }
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/jcr/RepositoryUtils.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/jcr/RepositoryUtils.java
similarity index 98%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/jcr/RepositoryUtils.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/jcr/RepositoryUtils.java
index 7d40302..bac1529 100644
--- a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/jcr/RepositoryUtils.java
+++ b/shared/impl-vlt/src/main/java/org/apache/sling/ide/jcr/RepositoryUtils.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sling.ide.jcr;
 
+import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.HashMap;
 import java.util.Map;
@@ -60,7 +61,7 @@
         for (String webDavUrlLocation : WEBDAV_URL_LOCATIONS) {
 
             Session session = null;
-            String url = repositoryInfo.appendPath(webDavUrlLocation);
+            URI url = repositoryInfo.getUrl().resolve(webDavUrlLocation);
             try {
                 RepositoryAddress address = new RepositoryAddress(url);
                 Repository repository;
diff --git a/shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/jcr/package-info.java b/shared/impl-vlt/src/main/java/org/apache/sling/ide/jcr/package-info.java
similarity index 100%
rename from shared/modules/impl-vlt/src/main/java/org/apache/sling/ide/jcr/package-info.java
rename to shared/impl-vlt/src/main/java/org/apache/sling/ide/jcr/package-info.java
diff --git a/shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommandIT.java b/shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommandIT.java
new file mode 100644
index 0000000..4e6e001
--- /dev/null
+++ b/shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommandIT.java
@@ -0,0 +1,381 @@
+/*
+ * 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.ide.impl.vlt;
+
+import static org.apache.sling.ide.transport.Repository.CommandExecutionFlag.CREATE_ONLY_WHEN_MISSING;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.Session;
+import javax.jcr.Value;
+
+import org.apache.jackrabbit.vault.util.JcrConstants;
+import org.apache.sling.ide.filter.Filter;
+import org.apache.sling.ide.filter.FilterResult;
+import org.apache.sling.ide.log.Logger;
+import org.apache.sling.ide.transport.CommandContext;
+import org.apache.sling.ide.transport.ResourceProxy;
+import org.hamcrest.Matchers;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class AddOrUpdateNodeCommandIT {
+
+	private static final CommandContext DEFAULT_CONTEXT = new CommandContext(new Filter() {
+		@Override
+		public FilterResult filter(String repositoryPath) {
+			return FilterResult.ALLOW;
+		}
+	});
+
+	@Rule
+	public final RepositoryManager repositoryManager = new RepositoryManager();
+
+	private static final String PROP_NAME = "jcr:title";
+
+	private Logger logger = new Slf4jLogger();
+
+	@Test
+	public void setProperty() throws Exception {
+
+		doPropertyChangeTest(null, "Title");
+	}
+
+	private ResourceProxy newResource(String path, String primaryType) {
+
+		ResourceProxy resource = new ResourceProxy(path);
+		resource.addProperty("jcr:primaryType", primaryType);
+		return resource;
+	}
+
+	
+	private void doPropertyChangeTest(final Object initialPropertyValues, final Object newPropertyValues)
+			throws Exception {
+
+		Session session = repositoryManager.getAdminSession();
+		Node contentNode = session.getRootNode().addNode("content");
+		if (initialPropertyValues instanceof String) {
+			contentNode.setProperty(PROP_NAME, (String) initialPropertyValues);
+		} else if (initialPropertyValues instanceof String[]) {
+			contentNode.setProperty(PROP_NAME, (String[]) initialPropertyValues);
+		}
+
+		session.save();
+
+		ResourceProxy resource = newResource("/content", JcrConstants.NT_UNSTRUCTURED);
+		if (newPropertyValues != null) {
+			resource.addProperty(PROP_NAME, newPropertyValues);
+		}
+
+		AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repositoryManager.getRepository(),
+				repositoryManager.getAdminCredentials(), DEFAULT_CONTEXT, null, resource, logger);
+		cmd.execute().get();
+
+		session.refresh(false);
+
+		if (newPropertyValues == null) {
+			assertThat(session.getNode("/content").hasProperty(PROP_NAME), equalTo(false));
+			return;
+		}
+
+		Property newProp = session.getNode("/content").getProperty(PROP_NAME);
+		if (newPropertyValues instanceof String) {
+			assertThat("property.isMultiple", newProp.isMultiple(), equalTo(Boolean.FALSE));
+			assertThat(newProp.getString(), equalTo((String) newPropertyValues));
+
+		} else {
+
+			String[] expectedValues = (String[]) newPropertyValues;
+			assertThat("property.isMultiple", newProp.isMultiple(), equalTo(Boolean.TRUE));
+
+			Value[] values = session.getNode("/content").getProperty(PROP_NAME).getValues();
+
+			assertThat(values.length, equalTo(expectedValues.length));
+			for (int i = 0; i < values.length; i++) {
+				assertThat(values[i].getString(), equalTo(expectedValues[i]));
+			}
+
+		}
+
+	}
+
+	@Test
+	public void removeProperty() throws Exception {
+
+		doPropertyChangeTest("Title", null);
+	}
+
+	@Test
+	public void singlePropertyToMultiValued() throws Exception {
+
+		doPropertyChangeTest("Title", new String[] { "Title", "Title 2" });
+	}
+
+	@Test
+	public void multiValuesPropertyToSingle() throws Exception {
+
+		doPropertyChangeTest(new String[] { "Title", "Title 2" }, "Title");
+	}
+
+	
+	@Test
+	public void changeNtFolderToSlingFolderWithAddedProperty() throws Exception {
+
+		Session session = repositoryManager.getAdminSession();
+		session.getRootNode().addNode("content", "nt:folder");
+
+		session.save();
+
+		ResourceProxy resource = newResource("/content", "sling:Folder");
+		resource.getProperties().put("newProperty", "some/value");
+
+		AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repositoryManager.getRepository(), repositoryManager.getAdminCredentials(), DEFAULT_CONTEXT, null,
+				resource, logger);
+		cmd.execute().get();
+
+		session.refresh(false);
+
+		Node content = session.getRootNode().getNode("content");
+		assertThat(content.getPrimaryNodeType().getName(), equalTo("sling:Folder"));
+
+	}
+
+	@Test
+	public void changeSlingFolderToNtFolderWithExistingProperty() throws Exception {
+		Session session = repositoryManager.getAdminSession();
+		Node content = session.getRootNode().addNode("content", "sling:Folder");
+		content.setProperty("newProperty", "some/value");
+
+		session.save();
+
+		ResourceProxy resource = newResource("/content", "nt:folder");
+
+		AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repositoryManager.getRepository(), repositoryManager.getAdminCredentials(), DEFAULT_CONTEXT, null,
+				resource, logger);
+		cmd.execute().get();
+
+		session.refresh(false);
+
+		content = session.getRootNode().getNode("content");
+		assertThat(content.getPrimaryNodeType().getName(), equalTo("nt:folder"));
+
+	}
+
+	@Test
+	@Ignore("SLING-4036")
+	public void updateNtUnstructuredToNodeWithRequiredProperty() throws Exception {
+
+		Session session = repositoryManager.getAdminSession();
+		Node content = session.getRootNode().addNode("content", "nt:unstructured");
+
+		session.save();
+
+		ResourceProxy resource = newResource("/content", "custom");
+		resource.getProperties().put("attribute", "some value");
+
+		AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repositoryManager.getRepository(), repositoryManager.getAdminCredentials(), DEFAULT_CONTEXT, null,
+				resource, logger);
+		cmd.execute().get();
+
+		session.refresh(false);
+
+		content = session.getRootNode().getNode("content");
+		assertThat(content.getPrimaryNodeType().getName(), equalTo("custom"));
+
+	}
+
+	@Test
+	public void nodeNotPresentButOutsideOfFilterIsNotRemoved() throws Exception {
+
+		final CommandContext context = new CommandContext(new Filter() {
+
+			@Override
+			public FilterResult filter(String repositoryPath) {
+				if (repositoryPath.equals("/content/not-included-child")) {
+					return FilterResult.DENY;
+				}
+
+				return FilterResult.ALLOW;
+			}
+		});
+
+		Session session = repositoryManager.getAdminSession();
+		Node content = session.getRootNode().addNode("content", "nt:unstructured");
+		content.addNode("included-child");
+		content.addNode("not-included-child");
+
+		session.save();
+
+		ResourceProxy resource = newResource("/content", "nt:unstructured");
+		resource.addChild(newResource("/content/included-child", "nt:unstructured"));
+
+		AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repositoryManager.getRepository(), repositoryManager.getAdminCredentials(), context, null, resource,
+				logger);
+		cmd.execute().get();
+
+		session.refresh(false);
+
+		content = session.getRootNode().getNode("content");
+		content.getNode("included-child");
+		content.getNode("not-included-child");
+
+	}
+
+	
+	@Test
+	public void createIfRequiredFlagSkipsExistingResources() throws Exception {
+
+		Session session = repositoryManager.getAdminSession();
+		Node content = session.getRootNode().addNode("content", "nt:folder");
+
+		session.save();
+
+		ResourceProxy resource = newResource("/content", "nt:unstructured");
+
+		AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repositoryManager.getRepository(), repositoryManager.getAdminCredentials(), DEFAULT_CONTEXT, null,
+				resource, logger, CREATE_ONLY_WHEN_MISSING);
+		cmd.execute().get();
+
+		session.refresh(false);
+
+		content = session.getRootNode().getNode("content");
+		assertThat(content.getPrimaryNodeType().getName(), equalTo("nt:folder"));
+
+	}
+
+	@Test
+	public void createIfRequiredFlagCreatesNeededResources() throws Exception {
+
+		Session session = repositoryManager.getAdminSession();
+		ResourceProxy resource = newResource("/content", "nt:unstructured");
+
+		AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repositoryManager.getRepository(), repositoryManager.getAdminCredentials(), DEFAULT_CONTEXT, null,
+				resource, logger, CREATE_ONLY_WHEN_MISSING);
+		cmd.execute().get();
+
+		session.refresh(false);
+
+		Node content = session.getRootNode().getNode("content");
+		assertThat(content.getPrimaryNodeType().getName(), equalTo("nt:unstructured"));
+
+	}
+
+	@Test
+	public void createIfRequiredFlagCreatesNeededResourcesEvenWhenPrimaryTypeIsMissing() throws Exception {
+
+		Session session = repositoryManager.getAdminSession();
+		ResourceProxy resource = new ResourceProxy("/content");
+
+		AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repositoryManager.getRepository(), repositoryManager.getAdminCredentials(), DEFAULT_CONTEXT, null,
+				resource, logger, CREATE_ONLY_WHEN_MISSING);
+		cmd.execute().get();
+
+		session.refresh(false);
+
+		Node content = session.getRootNode().getNode("content");
+		assertThat(content.getPrimaryNodeType().getName(), equalTo("nt:unstructured"));
+
+	}
+
+	@Test
+	public void autoCreatedPropertiesAreNotRemoved() throws Exception {
+
+		Session session = repositoryManager.getAdminSession();
+		Node content = session.getRootNode().addNode("content", "nt:folder");
+
+		session.save();
+
+		ResourceProxy resource = newResource("/content", "nt:folder");
+		resource.addProperty("jcr:mixinTypes", "mix:lastModified");
+
+		AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repositoryManager.getRepository(), repositoryManager.getAdminCredentials(), DEFAULT_CONTEXT, null,
+				resource, logger);
+		cmd.execute().get();
+		cmd.execute().get(); // second time since mixins are processed after properties so we need two
+								// executions to
+								// expose the problem
+
+		session.refresh(false);
+
+		content = session.getRootNode().getNode("content");
+		assertThat("jcr:lastModified property not present", content.hasProperty("jcr:lastModified"),
+				equalTo(true));
+		assertThat("jcr:lastModifiedBy property not present", content.hasProperty("jcr:lastModifiedBy"),
+				equalTo(true));
+
+	}
+
+	@Test
+	public void autoCreatedPropertiesAreUpdatedIfPresent() throws Exception {
+
+		Session session = repositoryManager.getAdminSession();
+		Node content = session.getRootNode().addNode("content", "nt:folder");
+
+		session.save();
+
+		ResourceProxy resource = newResource("/content", "nt:folder");
+		resource.addProperty("jcr:mixinTypes", "mix:lastModified");
+		resource.addProperty("jcr:lastModifiedBy", "admin2");
+
+		AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repositoryManager.getRepository(), repositoryManager.getAdminCredentials(), DEFAULT_CONTEXT, null,
+				resource, logger);
+		cmd.execute().get();
+		cmd.execute().get(); // second time since mixins are processed after properties so we need two
+								// executions to
+								// expose the problem
+
+		session.refresh(false);
+
+		content = session.getRootNode().getNode("content");
+		assertThat("jcr:lastModifiedBy property not modified",
+				content.getProperty("jcr:lastModifiedBy").getString(), equalTo("admin2"));
+
+	}
+
+	@Test
+	public void setEmptyMixinTypes() throws Exception {
+		setMixinTypes0();
+	}
+
+	private void setMixinTypes0(final String... mixinTypeNames) throws Exception {
+
+		Session session = repositoryManager.getAdminSession();
+		ResourceProxy resource = newResource("/content", "nt:unstructured");
+		resource.addProperty("jcr:mixinTypes", mixinTypeNames);
+
+		AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repositoryManager.getRepository(),
+				repositoryManager.getAdminCredentials(), DEFAULT_CONTEXT, null,
+				resource, logger);
+		cmd.execute().get();
+
+		session.refresh(false);
+
+		Node content = session.getRootNode().getNode("content");
+		assertThat(content.getMixinNodeTypes(), Matchers.arrayWithSize(mixinTypeNames.length));
+
+	}
+
+	@Test
+	public void setMixinTypes() throws Exception {
+
+		setMixinTypes0("mix:created");
+	}
+
+}
diff --git a/shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/ReorderChildNodesCommandTest.java b/shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/ReorderChildNodesCommandIT.java
similarity index 86%
rename from shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/ReorderChildNodesCommandTest.java
rename to shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/ReorderChildNodesCommandIT.java
index f08cac4..25a7e26 100644
--- a/shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/ReorderChildNodesCommandTest.java
+++ b/shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/ReorderChildNodesCommandIT.java
@@ -20,24 +20,25 @@
 import static org.hamcrest.Matchers.equalTo;
 import static org.junit.Assert.assertThat;
 
-import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.Session;
-import javax.jcr.SimpleCredentials;
 
-import org.apache.jackrabbit.core.TransientRepository;
 import org.apache.sling.ide.log.Logger;
 import org.apache.sling.ide.transport.ResourceProxy;
+import org.junit.Rule;
 import org.junit.Test;
 
-public class ReorderChildNodesCommandTest {
+public class ReorderChildNodesCommandIT {
 
     private Logger logger = new Slf4jLogger();
 
+    @Rule
+	public final RepositoryManager repositoryManager = new RepositoryManager();
+  
     @Test
     public void singleReordering() throws Exception {
 
@@ -75,11 +76,7 @@
             expected = resourceNames;
         }
 
-        File out = new File(new File("target"), "jackrabbit");
-
-        TransientRepository repo = new TransientRepository(new File(out, "repository.xml"), new File(out, "repository"));
-        SimpleCredentials credentials = new SimpleCredentials("admin", "admin".toCharArray());
-        Session session = repo.login(credentials);
+        Session session = repositoryManager.getAdminSession();
         List<String> finalOrder;
         try {
             Node content = session.getRootNode().addNode("content");
@@ -96,7 +93,7 @@
                 resource.addChild(newResource("/content/" + resourceName, "nt:unstructured"));
             }
 
-            ReorderChildNodesCommand cmd = new ReorderChildNodesCommand(repo, credentials, resource, logger);
+            ReorderChildNodesCommand cmd = new ReorderChildNodesCommand(repositoryManager.getRepository(), repositoryManager.getAdminCredentials(), resource, logger);
             cmd.execute().get();
 
             session.refresh(false);
diff --git a/shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/RepositoryManager.java b/shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/RepositoryManager.java
new file mode 100644
index 0000000..4c074be
--- /dev/null
+++ b/shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/RepositoryManager.java
@@ -0,0 +1,177 @@
+/*
+ * 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.ide.impl.vlt;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Properties;
+
+import javax.jcr.Credentials;
+import javax.jcr.LoginException;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+import javax.jcr.UnsupportedRepositoryOperationException;
+import javax.jcr.nodetype.InvalidNodeTypeDefinitionException;
+import javax.jcr.nodetype.NodeTypeExistsException;
+
+import org.apache.jackrabbit.api.JackrabbitRepository;
+import org.apache.jackrabbit.commons.cnd.CndImporter;
+import org.apache.jackrabbit.commons.cnd.ParseException;
+import org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
+import org.apache.jackrabbit.oak.jcr.Jcr;
+import org.apache.jackrabbit.oak.plugins.tree.impl.RootProviderService;
+import org.apache.jackrabbit.oak.plugins.tree.impl.TreeProviderService;
+import org.apache.jackrabbit.oak.security.internal.SecurityProviderBuilder;
+import org.apache.jackrabbit.oak.security.user.RandomAuthorizableNodeName;
+import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
+import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
+import org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
+import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
+import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
+import org.apache.jackrabbit.oak.spi.security.user.AuthorizableNodeName;
+import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration;
+import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
+import org.apache.jackrabbit.oak.spi.security.user.action.AccessControlAction;
+import org.apache.jackrabbit.oak.spi.xml.ImportBehavior;
+import org.apache.jackrabbit.oak.spi.xml.ProtectedItemImporter;
+import org.junit.Rule;
+import org.junit.rules.ExternalResource;
+
+/**
+ * Creates an in memory Oak repository.
+ * To be used as JUnit {@link Rule}.
+ */
+public class RepositoryManager extends ExternalResource {
+
+	private Repository repository;
+	private Session adminSession;
+
+	public RepositoryManager() {
+
+	}
+
+	public Repository getRepository() throws RepositoryException, ParseException, IOException {
+		if (repository == null) {
+			repository = createOakRepository();
+		}
+		return repository;
+	}
+
+	/**
+	 * @return the singleton admin session which is automatically closed at the end
+	 *         of the test
+	 * @throws LoginException
+	 * @throws RepositoryException
+	 * @throws IOException 
+	 * @throws ParseException 
+	 */
+	public Session getAdminSession() throws LoginException, RepositoryException, ParseException, IOException {
+		if (adminSession == null) {
+			adminSession = getRepository().login(getAdminCredentials());
+		}
+		return adminSession;
+	}
+
+	/**
+	 * @return a new admin session
+	 * @throws LoginException
+	 * @throws RepositoryException
+	 * @throws IOException 
+	 * @throws ParseException 
+	 */
+	public Session createAdminSession() throws LoginException, RepositoryException, ParseException, IOException {
+		return getRepository().login(getAdminCredentials());
+	}
+
+	public Credentials getAdminCredentials() {
+		return new SimpleCredentials("admin", "admin".toCharArray());
+	}
+
+	Repository createOakRepository() throws RepositoryException, ParseException, IOException {
+		// in-memory repo
+		Jcr jcr = new Jcr();
+
+		// TODO: optimize by disabling JMX with
+		// https://issues.apache.org/jira/browse/OAK-9959
+		Repository repository = jcr.with(createSecurityProvider()).withAtomicCounter().createRepository();
+
+		// setup default read ACL for everyone
+		Session admin = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
+		AccessControlUtils.addAccessControlEntry(admin, "/", EveryonePrincipal.getInstance(),
+				new String[] { "jcr:read" }, true);
+		
+		// add some more node type definitions
+		importNodeTypeDefinitions(admin, "test-definitions.cnd");
+        importNodeTypeDefinitions(admin, "folder.cnd");
+        
+		admin.save();
+		admin.logout();
+
+		return repository;
+	}
+
+	private void importNodeTypeDefinitions(Session session, String cndResourceName)
+			throws InvalidNodeTypeDefinitionException, NodeTypeExistsException, UnsupportedRepositoryOperationException,
+			ParseException, RepositoryException, IOException {
+		try (InputStream cndInput = getClass().getResourceAsStream(cndResourceName)) {
+			if (cndInput == null) {
+				throw new IllegalArgumentException("Unable to read classpath resource " + cndResourceName);
+			}
+			CndImporter.registerNodeTypes(new InputStreamReader(cndInput), session);
+		}
+	}
+
+	static SecurityProvider createSecurityProvider() {
+		SecurityProvider securityProvider = SecurityProviderBuilder.newBuilder()
+				.with(getSecurityConfigurationParameters()).withRootProvider(new RootProviderService())
+				.withTreeProvider(new TreeProviderService()).build();
+		return securityProvider;
+	}
+
+	static ConfigurationParameters getSecurityConfigurationParameters() {
+		Properties userProps = new Properties();
+		AuthorizableNodeName nameGenerator = new RandomAuthorizableNodeName();
+
+		userProps.put(UserConstants.PARAM_USER_PATH, "/home/users");
+		userProps.put(UserConstants.PARAM_GROUP_PATH, "/home/groups");
+		userProps.put(AccessControlAction.USER_PRIVILEGE_NAMES, new String[] { PrivilegeConstants.JCR_ALL });
+		userProps.put(AccessControlAction.GROUP_PRIVILEGE_NAMES, new String[] { PrivilegeConstants.JCR_READ });
+		userProps.put(ProtectedItemImporter.PARAM_IMPORT_BEHAVIOR, ImportBehavior.NAME_BESTEFFORT);
+		userProps.put(UserConstants.PARAM_AUTHORIZABLE_NODE_NAME, nameGenerator);
+		userProps.put("cacheExpiration", 3600 * 1000);
+		Properties authzProps = new Properties();
+		authzProps.put(ProtectedItemImporter.PARAM_IMPORT_BEHAVIOR, ImportBehavior.NAME_BESTEFFORT);
+		return ConfigurationParameters.of(UserConfiguration.NAME, ConfigurationParameters.of(userProps),
+				AuthorizationConfiguration.NAME, ConfigurationParameters.of(authzProps));
+	}
+
+	@Override
+	protected void after() {
+		if (repository != null) {
+			if (adminSession != null && adminSession.isLive()) {
+				adminSession.logout();
+			}
+			if (repository instanceof JackrabbitRepository) {
+				((JackrabbitRepository) repository).shutdown();
+			}
+		}
+	}
+
+}
diff --git a/shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/Slf4jLogger.java b/shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/Slf4jLogger.java
similarity index 100%
rename from shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/Slf4jLogger.java
rename to shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/Slf4jLogger.java
diff --git a/shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/filter/VltFilterTest.java b/shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/filter/VltFilterTest.java
similarity index 100%
rename from shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/filter/VltFilterTest.java
rename to shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/filter/VltFilterTest.java
diff --git a/shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/serialization/ContentXmlHandlerTest.java b/shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/serialization/ResourceProxyParserHandlerTest.java
similarity index 84%
rename from shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/serialization/ContentXmlHandlerTest.java
rename to shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/serialization/ResourceProxyParserHandlerTest.java
index f462a44..8f4dfc5 100644
--- a/shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/serialization/ContentXmlHandlerTest.java
+++ b/shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/serialization/ResourceProxyParserHandlerTest.java
@@ -23,6 +23,7 @@
 import static org.junit.Assert.assertThat;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.math.BigDecimal;
 import java.util.Calendar;
 import java.util.Map;
@@ -31,6 +32,8 @@
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 
+import org.apache.jackrabbit.vault.fs.io.DocViewParser;
+import org.apache.jackrabbit.vault.fs.io.DocViewParser.XmlParseException;
 import org.apache.sling.ide.impl.vlt.Slf4jLogger;
 import org.apache.sling.ide.transport.ResourceProxy;
 import org.hamcrest.Description;
@@ -41,10 +44,10 @@
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
-public class ContentXmlHandlerTest {
+public class ResourceProxyParserHandlerTest {
 
     @Test
-    public void simpleContentXml() throws ParserConfigurationException, SAXException, IOException {
+    public void simpleContentXml() throws IOException, XmlParseException {
 
         Map<String, Object> properties = parseContentXmlFile("simple-content.xml", "/").getProperties();
 
@@ -66,24 +69,19 @@
     }
 
     private ResourceProxy parseContentXmlFile(String fileName, String rootResourcePath)
-            throws ParserConfigurationException, SAXException,
-            IOException {
+            throws IOException, XmlParseException {
 
-        InputSource source = new InputSource(getClass().getResourceAsStream(fileName));
-
-        SAXParserFactory factory = SAXParserFactory.newInstance();
-        factory.setNamespaceAware(true);
-        factory.setFeature("http://xml.org/sax/features/namespace-prefixes", false);
-        SAXParser parser = factory.newSAXParser();
-        ContentXmlHandler handler = new ContentXmlHandler(rootResourcePath, new Slf4jLogger());
-        parser.parse(source, handler);
-
-        return handler.getRoot();
+    	try (InputStream input = getClass().getResourceAsStream(fileName)) {
+        	DocViewParser parser = new DocViewParser();
+        	ResourceProxyParserHandler handler = new ResourceProxyParserHandler();
+        	parser.parse(rootResourcePath, new InputSource(input), handler);
+            return handler.getRoot();
+        }
     }
 
     @Test
     @SuppressWarnings("unchecked")
-    public void parseMultiValuedProperties() throws ParserConfigurationException, SAXException, IOException {
+    public void parseMultiValuedProperties() throws IOException, XmlParseException {
 
         Map<String, Object> properties = parseContentXmlFile("multivalued-properties-content.xml", "/").getProperties();
 
@@ -104,8 +102,7 @@
 
     @Test
     @SuppressWarnings("unchecked")
-    public void parseSingleExplicitMultiValuedProperties() throws ParserConfigurationException, SAXException,
-            IOException {
+    public void parseSingleExplicitMultiValuedProperties() throws IOException, XmlParseException {
 
         Map<String, Object> properties = parseContentXmlFile("single-explicit-multivalued-properties-content.xml", "/")
                 .getProperties();
@@ -126,7 +123,7 @@
     }
 
     @Test
-    public void parseFullCoverageXmlFile() throws ParserConfigurationException, SAXException, IOException {
+    public void parseFullCoverageXmlFile() throws IOException, XmlParseException {
 
         ResourceProxy root = parseContentXmlFile("full-coverage.xml", "/apps/full-coverage");
 
@@ -150,7 +147,7 @@
     }
 
     @Test
-    public void parseRootContentXml() throws ParserConfigurationException, SAXException, IOException {
+    public void parseRootContentXml() throws IOException, XmlParseException {
 
         ResourceProxy root = parseContentXmlFile("root-content.xml", "/");
 
@@ -158,7 +155,7 @@
     }
 
     @Test
-    public void encodedChildContentXml() throws ParserConfigurationException, SAXException, IOException {
+    public void encodedChildContentXml() throws IOException, XmlParseException {
 
         ResourceProxy root = parseContentXmlFile("encoded-child-content.xml", "/ROOT");
 
@@ -166,14 +163,14 @@
     }
 
     @Test
-    public void parseContentXmlWithEscapedNames() throws ParserConfigurationException, SAXException, IOException {
+    public void parseContentXmlWithEscapedNames() throws IOException, XmlParseException {
 
         ResourceProxy root = parseContentXmlFile("full-coverage-escaped-names.xml", "/");
         assertThat("node contains /50-50", root.getChildren(), hasChildPath("/50-50"));
     }
 
     @Test
-    public void parseContentXmlWithBinaryProperty() throws ParserConfigurationException, SAXException, IOException {
+    public void parseContentXmlWithBinaryProperty() throws IOException, XmlParseException {
 
         ResourceProxy root = parseContentXmlFile("binary-property.xml", "/");
 
@@ -181,7 +178,7 @@
     }
 
     @Test
-    public void parseContentXmlWithEscapedValues() throws ParserConfigurationException, SAXException, IOException {
+    public void parseContentXmlWithEscapedValues() throws IOException, XmlParseException {
         ResourceProxy root = parseContentXmlFile("escaped-value-in-property.xml", "/");
 
         assertThat(root.getProperties(), hasEntry("property", 
@@ -189,7 +186,7 @@
     }
 
     @Test
-    public void escapedBraceAtStartOfPropertyValue() throws Exception {
+    public void escapedBraceAtStartOfPropertyValue() throws IOException, XmlParseException {
 
         ResourceProxy root = parseContentXmlFile("escaped-braces-at-start-of-property.xml", "/");
         assertThat("properties[org.apache.sling.commons.log.pattern]",
@@ -198,7 +195,7 @@
     }
 
     @Test
-    public void escapedCommaInMultiValuedProperty() throws Exception {
+    public void escapedCommaInMultiValuedProperty() throws IOException, XmlParseException {
         
         ResourceProxy root = parseContentXmlFile("escaped-comma-in-multi-valued-property.xml", "/");
         assertThat("properties[someProp]", (String[]) root.getProperties().get("someProp"),
@@ -206,7 +203,7 @@
     }
     
     @Test
-    public void emptyMultivaluedProperties() throws Exception {
+    public void emptyMultivaluedProperties() throws IOException, XmlParseException {
         
         ResourceProxy root = parseContentXmlFile("empty-multivalued-property.xml", "/");
         
diff --git a/shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManagerTest.java b/shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManagerTest.java
similarity index 96%
rename from shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManagerTest.java
rename to shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManagerTest.java
index c355822..2840c3f 100644
--- a/shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManagerTest.java
+++ b/shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/serialization/VltSerializationManagerTest.java
@@ -25,6 +25,7 @@
 import java.io.InputStream;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.sling.ide.impl.vlt.Slf4jLogger;
 import org.junit.Assume;
 import org.junit.Before;
 import org.junit.Rule;
@@ -40,7 +41,7 @@
 
     @Before
     public void init() {
-        serializationManager = new VltSerializationManager();
+        serializationManager = new VltSerializationManager(new Slf4jLogger(), null);
     }
 
     @Test
diff --git a/shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/transport/DefaultBatcherTest.java b/shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/transport/DefaultBatcherTest.java
similarity index 100%
rename from shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/transport/DefaultBatcherTest.java
rename to shared/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/transport/DefaultBatcherTest.java
diff --git a/shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/jcr/RepositoryUtilsTest.java b/shared/impl-vlt/src/test/java/org/apache/sling/ide/jcr/RepositoryUtilsTest.java
similarity index 97%
rename from shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/jcr/RepositoryUtilsTest.java
rename to shared/impl-vlt/src/test/java/org/apache/sling/ide/jcr/RepositoryUtilsTest.java
index c88d8e3..b4d53ae 100644
--- a/shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/jcr/RepositoryUtilsTest.java
+++ b/shared/impl-vlt/src/test/java/org/apache/sling/ide/jcr/RepositoryUtilsTest.java
@@ -19,7 +19,6 @@
 import java.net.URISyntaxException;
 
 import org.apache.jackrabbit.vault.fs.api.RepositoryAddress;
-import org.apache.sling.ide.jcr.RepositoryUtils;
 import org.junit.Assert;
 import org.junit.Test;
 
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/filter/filter-deep.xml b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/filter/filter-deep.xml
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/filter/filter-deep.xml
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/filter/filter-deep.xml
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/filter/filter-default.xml b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/filter/filter-default.xml
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/filter/filter-default.xml
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/filter/filter-default.xml
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/filter/filter-with-include.xml b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/filter/filter-with-include.xml
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/filter/filter-with-include.xml
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/filter/filter-with-include.xml
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/folder.cnd b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/folder.cnd
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/folder.cnd
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/folder.cnd
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/bin.binary b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/bin.binary
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/bin.binary
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/bin.binary
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/binary-property.xml b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/binary-property.xml
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/binary-property.xml
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/binary-property.xml
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/empty-multivalued-property.xml b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/empty-multivalued-property.xml
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/empty-multivalued-property.xml
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/empty-multivalued-property.xml
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/encoded-child-content.xml b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/encoded-child-content.xml
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/encoded-child-content.xml
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/encoded-child-content.xml
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/escaped-braces-at-start-of-property.xml b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/escaped-braces-at-start-of-property.xml
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/escaped-braces-at-start-of-property.xml
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/escaped-braces-at-start-of-property.xml
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/escaped-comma-in-multi-valued-property.xml b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/escaped-comma-in-multi-valued-property.xml
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/escaped-comma-in-multi-valued-property.xml
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/escaped-comma-in-multi-valued-property.xml
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/escaped-value-in-property.xml b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/escaped-value-in-property.xml
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/escaped-value-in-property.xml
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/escaped-value-in-property.xml
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/file.xml b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/file.xml
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/file.xml
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/file.xml
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/full-coverage-escaped-names.xml b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/full-coverage-escaped-names.xml
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/full-coverage-escaped-names.xml
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/full-coverage-escaped-names.xml
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/full-coverage.xml b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/full-coverage.xml
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/full-coverage.xml
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/full-coverage.xml
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/multivalued-properties-content.xml b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/multivalued-properties-content.xml
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/multivalued-properties-content.xml
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/multivalued-properties-content.xml
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/root-content.xml b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/root-content.xml
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/root-content.xml
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/root-content.xml
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/simple-content.xml b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/simple-content.xml
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/simple-content.xml
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/simple-content.xml
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/single-explicit-multivalued-properties-content.xml b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/single-explicit-multivalued-properties-content.xml
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/single-explicit-multivalued-properties-content.xml
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/single-explicit-multivalued-properties-content.xml
diff --git a/shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/test-definitions.cnd b/shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/test-definitions.cnd
similarity index 100%
rename from shared/modules/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/test-definitions.cnd
rename to shared/impl-vlt/src/test/resources/org/apache/sling/ide/impl/vlt/test-definitions.cnd
diff --git a/shared/modules/api/pom.xml b/shared/modules/api/pom.xml
deleted file mode 100644
index b82481c..0000000
--- a/shared/modules/api/pom.xml
+++ /dev/null
@@ -1,99 +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
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-    xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.sling.ide</groupId>
-        <artifactId>sling-ide-shared-parent</artifactId>
-        <version>1.2.3-SNAPSHOT</version>
-        <relativePath>../parent/</relativePath>
-    </parent>
-
-    <artifactId>org.apache.sling.ide.api</artifactId>
-    <name>Apache Sling IDE Tools API</name>
-
-    <scm>
-        <connection>scm:git:https://gitbox.apache.org/repos/asf/sling-ide-tooling.git</connection>
-        <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/sling-ide-tooling.git</developerConnection>
-        <url>https://gitbox.apache.org/repos/asf?p=sling-ide-tooling.git</url>
-    </scm>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>biz.aQute.bnd</groupId>
-                <artifactId>bnd-maven-plugin</artifactId>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>javax.jcr</groupId>
-            <artifactId>jcr</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>commons-httpclient</groupId>
-            <artifactId>commons-httpclient</artifactId>
-            <version>3.0</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.google.code.gson</groupId>
-            <artifactId>gson</artifactId>
-            <version>2.8.0</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
-            <version>2.4</version>
-            <scope>provided</scope>
-        </dependency>
-        <!-- TODO - must be removed, OSGi deps not allowed here -->
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <!-- TODO - must be removed, OSGi deps not allowed here -->
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.service.event</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <!-- Note that OSGi annotations are OK since they are not retained at compile time -->        
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.annotation.versioning</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.service.component.annotations</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.service.metatype.annotations</artifactId>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-    <properties>
-        <sling.java.version>8</sling.java.version>
-    </properties>
-</project>
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/osgi/OsgiClient.java b/shared/modules/api/src/main/java/org/apache/sling/ide/osgi/OsgiClient.java
deleted file mode 100644
index f276077..0000000
--- a/shared/modules/api/src/main/java/org/apache/sling/ide/osgi/OsgiClient.java
+++ /dev/null
@@ -1,72 +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.ide.osgi;
-
-import java.io.InputStream;
-import java.util.List;
-
-import org.osgi.framework.Version;
-
-/**
- * The <tt>OsgiClient</tt> exposes information and actions related to the OSGi subsystem of Sling
- * 
- */
-public interface OsgiClient {
-
-    Version getBundleVersion(String bundleSymbolicName) throws OsgiClientException;
-
-    void installBundle(InputStream in, String fileName) throws OsgiClientException;
-
-    /**
-     * Installs a bundle from a local directory
-     * 
-     * <p>
-     * The Sling launchpad instance must have filesystem access to the specified <tt>explodedBundleLocation</tt>
-     * </p>
-     * 
-     * @param explodedBundleLocation
-     * @throws OsgiClientException
-     */
-    void installLocalBundle(String explodedBundleLocation) throws OsgiClientException;
-
-    /**
-     * Installs a local bundle from an already-built jar file
-     * 
-     * @param jarredBundle the contents of the jarred bundle
-     * @param sourceLocation the source location, for informative purposes only
-     * 
-     * @throws OsgiClientException
-     */
-    void installLocalBundle(InputStream jarredBundle, String sourceLocation) throws OsgiClientException;
-    
-    /**
-     * Finds source references for all bundles deployed in the Sling instance
-     * 
-     * @return the source references, possibly empty
-     * @throws OsgiClientException
-     */
-    List<SourceReference> findSourceReferences() throws OsgiClientException;
-    
-    /**
-     * Uninstalls the bundle with the specified Bundle-SymbolicName, if present
-     * 
-     * @param bundleSymbolicName The Bundle-SymbolicName
-     * @throws OsgiClientException error when trying to uninstall the bundle
-     */
-    void uninstallBundle(String bundleSymbolicName) throws OsgiClientException;
-
-}
\ No newline at end of file
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/osgi/impl/HttpOsgiClient.java b/shared/modules/api/src/main/java/org/apache/sling/ide/osgi/impl/HttpOsgiClient.java
deleted file mode 100644
index b21e4f5..0000000
--- a/shared/modules/api/src/main/java/org/apache/sling/ide/osgi/impl/HttpOsgiClient.java
+++ /dev/null
@@ -1,410 +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.ide.osgi.impl;
-
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.httpclient.Credentials;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.HttpStatus;
-import org.apache.commons.httpclient.UsernamePasswordCredentials;
-import org.apache.commons.httpclient.auth.AuthScope;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.methods.multipart.ByteArrayPartSource;
-import org.apache.commons.httpclient.methods.multipart.FilePart;
-import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
-import org.apache.commons.httpclient.methods.multipart.Part;
-import org.apache.commons.httpclient.methods.multipart.PartSource;
-import org.apache.commons.httpclient.methods.multipart.StringPart;
-import org.apache.commons.io.IOUtils;
-import org.apache.sling.ide.osgi.OsgiClient;
-import org.apache.sling.ide.osgi.OsgiClientException;
-import org.apache.sling.ide.osgi.SourceReference;
-import org.apache.sling.ide.transport.RepositoryInfo;
-import org.osgi.framework.Version;
-
-import com.google.gson.Gson;
-import com.google.gson.JsonParseException;
-import com.google.gson.annotations.SerializedName;
-import com.google.gson.stream.JsonReader;
-
-public class HttpOsgiClient implements OsgiClient {
-
-    private static final int DEFAULT_SOCKET_TIMEOUT_SECONDS = 30;
-    private static final int DEFAULT_CONNECT_TIMEOUT_SECONDS = 30;
-
-    private RepositoryInfo repositoryInfo;
-
-    public HttpOsgiClient(RepositoryInfo repositoryInfo) {
-
-        this.repositoryInfo = repositoryInfo;
-    }
-    
-    private static final class BundleInfo {
-        private String symbolicName;
-        private String version;
-        private long id;
-
-        public String getSymbolicName() {
-            return symbolicName;
-        }
-
-        public Version getVersion() {
-            return new Version(version);
-        }
-        
-        public long getId() {
-            return id;
-        }
-    }
-    
-    private static BundleInfo readBundleInfo(String bundleSymbolicName, Reader reader) throws IOException {
-        Gson gson = new Gson();
-        try (JsonReader jsonReader = new JsonReader(reader)) {
-            // wait for 'data' attribute
-            jsonReader.beginObject();
-            while (jsonReader.hasNext()) {
-                String name = jsonReader.nextName();
-                if (name.equals("data")) {
-                    jsonReader.beginArray();
-                    while (jsonReader.hasNext()) {
-                        // read json for individual bundle
-                        BundleInfo bundleInfo = gson.fromJson(jsonReader, BundleInfo.class);
-                        if (bundleSymbolicName.equals(bundleInfo.getSymbolicName())) {
-                            return bundleInfo;
-                        }
-                    }
-                    jsonReader.endArray();
-                } else {
-                    jsonReader.skipValue();
-                }
-            }
-        }
-        return null;
-        
-    }
-
-    static Version getBundleVersionFromReader(String bundleSymbolicName, Reader reader) throws IOException {
-        BundleInfo bundleInfo = readBundleInfo(bundleSymbolicName, reader);
-        if ( bundleInfo == null ) {
-            return null;
-        }
-        return bundleInfo.getVersion();
-    }
-
-    static Long getBundleIdFromReader(String bundleSymbolicName, Reader reader) throws IOException {
-        BundleInfo bundleInfo = readBundleInfo(bundleSymbolicName, reader);
-        if ( bundleInfo == null ) {
-            return null;
-        }
-        return bundleInfo.getId();
-    }
-
-    
-    @Override
-    public Version getBundleVersion(String bundleSymbolicName) throws OsgiClientException {
-
-        GetMethod method = new GetMethod(repositoryInfo.appendPath("system/console/bundles.json"));
-        HttpClient client = getHttpClient();
-
-        try {
-            int result = client.executeMethod(method);
-            if (result != HttpStatus.SC_OK) {
-                throw new HttpException("Got status code " + result + " for call to " + method.getURI());
-            }
-
-            try ( InputStream input = method.getResponseBodyAsStream();
-                  Reader reader = new InputStreamReader(input, StandardCharsets.US_ASCII)) {
-                return getBundleVersionFromReader(bundleSymbolicName, reader);
-            }
-        } catch (IOException e) {
-            throw new OsgiClientException(e);
-        } finally {
-            method.releaseConnection();
-        }
-    }
-
-    private HttpClient getHttpClient() {
-
-        HttpClient client = new HttpClient();
-        client.getHttpConnectionManager().getParams().setConnectionTimeout(DEFAULT_CONNECT_TIMEOUT_SECONDS * 1000);
-        client.getHttpConnectionManager().getParams().setSoTimeout(DEFAULT_SOCKET_TIMEOUT_SECONDS * 1000);
-        client.getParams().setAuthenticationPreemptive(true);
-        Credentials defaultcreds = new UsernamePasswordCredentials(repositoryInfo.getUsername(),
-                repositoryInfo.getPassword());
-        client.getState().setCredentials(
-                new AuthScope(repositoryInfo.getHost(), repositoryInfo.getPort(), AuthScope.ANY_REALM), defaultcreds);
-        return client;
-    }
-
-    @Override
-    public void installBundle(InputStream in, String fileName) throws OsgiClientException {
-
-        if (in == null) {
-            throw new IllegalArgumentException("in may not be null");
-        }
-
-        if (fileName == null) {
-            throw new IllegalArgumentException("fileName may not be null");
-        }
-
-        // append pseudo path after root URL to not get redirected for nothing
-        final PostMethod filePost = new PostMethod(repositoryInfo.appendPath("system/console/install"));
-
-        try {
-            // set referrer
-            filePost.setRequestHeader("referer", "about:blank");
-
-            List<Part> partList = new ArrayList<>();
-            partList.add(new StringPart("action", "install"));
-            partList.add(new StringPart("_noredir_", "_noredir_"));
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            IOUtils.copy(in, baos);
-            PartSource partSource = new ByteArrayPartSource(fileName, baos.toByteArray());
-            partList.add(new FilePart("bundlefile", partSource));
-            partList.add(new StringPart("bundlestart", "start"));
-
-            Part[] parts = partList.toArray(new Part[partList.size()]);
-
-            filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
-
-            int status = getHttpClient().executeMethod(filePost);
-            if (status != 200) {
-                throw new OsgiClientException("Method execution returned status " + status);
-            }
-        } catch (IOException e) {
-            throw new OsgiClientException(e);
-        } finally {
-            filePost.releaseConnection();
-        }
-    }
-
-    @Override
-    public void uninstallBundle(String bundleSymbolicName) throws OsgiClientException {
-        GetMethod method = new GetMethod(repositoryInfo.appendPath("system/console/bundles.json"));
-        HttpClient client = getHttpClient();
-
-        try {
-            int result = client.executeMethod(method);
-            if (result != HttpStatus.SC_OK) {
-                throw new HttpException("Got status code " + result + " for call to " + method.getURI());
-            }
-
-            try ( InputStream input = method.getResponseBodyAsStream();
-                  Reader reader = new InputStreamReader(input, StandardCharsets.US_ASCII)) {
-                Long bundleId = getBundleIdFromReader(bundleSymbolicName, reader);
-                if ( bundleId == null ) {
-                    return;
-                }
-                PostMethod postMethod = new PostMethod(repositoryInfo.appendPath("system/console/bundles/") + bundleId);
-                postMethod.addParameter("action", "uninstall");
-                
-                result = client.executeMethod(postMethod);
-                if ( result != HttpStatus.SC_OK )
-                    throw new HttpException("Got status code " + result + " for call to " + postMethod.getURI());
-            }
-        } catch (IOException e) {
-            throw new OsgiClientException(e);
-        } finally {
-            method.releaseConnection();
-        }
-    }
-    @Override
-    public void installLocalBundle(final String explodedBundleLocation) throws OsgiClientException {
-
-        if (explodedBundleLocation == null) {
-            throw new IllegalArgumentException("explodedBundleLocation may not be null");
-        }
-
-        new LocalBundleInstaller(getHttpClient(), repositoryInfo) {
-
-            @Override
-            void configureRequest(PostMethod method) {
-                method.addParameter("dir", explodedBundleLocation);
-            }
-        }.installBundle();
-    }
-
-    @Override
-    public void installLocalBundle(final InputStream jarredBundle, String sourceLocation) throws OsgiClientException {
-
-        if (jarredBundle == null) {
-            throw new IllegalArgumentException("jarredBundle may not be null");
-        }
-        
-        new LocalBundleInstaller(getHttpClient(), repositoryInfo) {
-
-            @Override
-            void configureRequest(PostMethod method) throws IOException {
-
-                Part[] parts = new Part[] { new FilePart("bundle", new ByteArrayPartSource("bundle.jar",
-                        IOUtils.toByteArray(jarredBundle))) };
-                method.setRequestEntity(new MultipartRequestEntity(parts, method.getParams()));
-            }
-        }.installBundle();        
-    }
-    
-    @Override
-    public List<SourceReference> findSourceReferences() throws OsgiClientException {
-        GetMethod method = new GetMethod(repositoryInfo.appendPath("system/sling/tooling/sourceReferences.json"));
-        HttpClient client = getHttpClient();
-
-        try {
-            int result = client.executeMethod(method);
-            if (result != HttpStatus.SC_OK) {
-                throw new HttpException("Got status code " + result + " for call to " + method.getURI());
-            }
-            return parseSourceReferences(method.getResponseBodyAsStream());
-        } catch (IOException e) {
-            throw new OsgiClientException(e);
-        } finally {
-            method.releaseConnection();
-        }
-    }
-
-    // visible for testing
-    static List<SourceReference> parseSourceReferences(InputStream response) throws IOException {
-
-        try (JsonReader jsonReader = new JsonReader(
-                new InputStreamReader(response, StandardCharsets.US_ASCII))) {
-            
-            SourceBundleData[] refs = new Gson().fromJson(jsonReader, SourceBundleData[].class);
-            List<SourceReference> res = new ArrayList<>(refs.length);
-            for ( SourceBundleData sourceData : refs ) {
-                for (  SourceReferenceFromJson ref : sourceData.sourceReferences ) {
-                    if ( ref.isMavenType() ) {
-                        res.add(ref.getMavenSourceReference());
-                    }
-                }
-            }
-            
-            return res;
-        }
-    }
-
-    /**
-     * Encapsulates the JSON response from the tooling.installer
-     */
-    private static final class BundleInstallerResult {
-        private String status; // either OK or FAILURE
-        private String message;
-        
-        public boolean hasMessage() {
-            if (message != null && message.length() > 0) {
-                return true;
-            }
-            return false;
-        }
-
-        public String getMessage() {
-            return message;
-        }
-        
-        public boolean isSuccessful() {
-            return "OK".equalsIgnoreCase(status);
-        }
-    }
-    
-    private static final class SourceBundleData {
-        
-        @SerializedName("Bundle-SymbolicName")
-        private String bsn;
-        @SerializedName("Bundle-Version")
-        private String version;
-        
-        private List<SourceReferenceFromJson> sourceReferences;
-    }
-    
-    private static final class SourceReferenceFromJson {
-        @SerializedName("__type__")
-        private String type; // should be "maven" 
-        private String groupId;
-        private String artifactId;
-        private String version;
-        
-        public boolean isMavenType() {
-            return "maven".equals(type);
-        }
-        
-        public MavenSourceReferenceImpl getMavenSourceReference() {
-            if (!isMavenType()) {
-                throw new IllegalStateException("The type is not a Maven source reference but a " + type);
-            }
-            return new MavenSourceReferenceImpl(groupId, artifactId, version);
-        }
-    }
-    
-    static abstract class LocalBundleInstaller {
-
-        private final HttpClient httpClient;
-        private final RepositoryInfo repositoryInfo;
-
-        public LocalBundleInstaller(HttpClient httpClient, RepositoryInfo repositoryInfo) {
-            this.httpClient = httpClient;
-            this.repositoryInfo = repositoryInfo;
-        }
-
-        void installBundle() throws OsgiClientException {
-
-            PostMethod method = new PostMethod(repositoryInfo.appendPath("system/sling/tooling/install"));
-
-            try {
-                configureRequest(method);
-                Gson gson = new Gson();
-                int status = httpClient.executeMethod(method);
-                
-                try (JsonReader jsonReader = new JsonReader(
-                        new InputStreamReader(method.getResponseBodyAsStream(), StandardCharsets.UTF_8))) {
-                    BundleInstallerResult result = null;
-                    if (status != 200) {
-                        try {
-                            result = gson.fromJson(jsonReader, BundleInstallerResult.class);
-                            if (result.hasMessage()) {
-                                throw new OsgiClientException(result.getMessage());
-                            }
-                        } catch (JsonParseException e) {
-                            // ignore, fallback to status code reporting
-                        }
-                        throw new OsgiClientException("Method execution returned status " + status);
-                    }
-                    result = gson.fromJson(jsonReader, BundleInstallerResult.class);
-                    if (!result.isSuccessful()) {
-                        String errorMessage = !result.hasMessage() ? "Bundle deployment failed, please check the Sling logs"
-                                : result.getMessage();
-                        throw new OsgiClientException(errorMessage);
-                    }
-                }
-            } catch (IOException e) {
-                throw new OsgiClientException(e);
-            } finally {
-                method.releaseConnection();
-            }
-        }
-
-        abstract void configureRequest(PostMethod method) throws IOException;
-    }
-}
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/osgi/impl/TracingOsgiClient.java b/shared/modules/api/src/main/java/org/apache/sling/ide/osgi/impl/TracingOsgiClient.java
deleted file mode 100644
index 323f6d4..0000000
--- a/shared/modules/api/src/main/java/org/apache/sling/ide/osgi/impl/TracingOsgiClient.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.sling.ide.osgi.impl;
-
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.sling.ide.osgi.OsgiClient;
-import org.apache.sling.ide.osgi.OsgiClientException;
-import org.apache.sling.ide.osgi.SourceReference;
-import org.apache.sling.ide.transport.CommandExecutionProperties;
-import org.osgi.framework.Version;
-import org.osgi.service.event.Event;
-import org.osgi.service.event.EventAdmin;
-
-/**
- * The <tt>TracingOsgiClient</tt> decorates another OsgiClient instance by adding tracing operations
- * 
- */
-public class TracingOsgiClient implements OsgiClient {
-
-    private final OsgiClient osgiClient;
-    private final EventAdmin eventAdmin;
-    
-    public TracingOsgiClient(OsgiClient osgiClient, EventAdmin eventAdmin) {
-        this.osgiClient = osgiClient;
-        this.eventAdmin = eventAdmin;
-    }
-
-    @Override
-    public Version getBundleVersion(String bundleSymbolicName) throws OsgiClientException {
-        return osgiClient.getBundleVersion(bundleSymbolicName);
-    }
-
-    @Override
-    public void installBundle(InputStream in, String fileName) throws OsgiClientException {
-        osgiClient.installBundle(in, fileName);
-    }
-    
-    @Override
-    public void uninstallBundle(String bundleSymbolicName) throws OsgiClientException {
-        osgiClient.uninstallBundle(bundleSymbolicName);
-    }
-
-    @Override
-    public void installLocalBundle(String explodedBundleLocation) throws OsgiClientException {
-
-        logInstallLocalBundle(null, explodedBundleLocation);
-    }
-
-    private void logInstallLocalBundle(InputStream input, String explodedBundleLocation) throws OsgiClientException {
-
-        Map<String, Object> props = new HashMap<>();
-        long start = System.currentTimeMillis();
-        if (input != null) {
-            props.put(CommandExecutionProperties.ACTION_TYPE, "InstallJarredBundle");
-        } else {
-            props.put(CommandExecutionProperties.ACTION_TYPE, "InstallLocalBundle");
-        }
-        props.put(CommandExecutionProperties.ACTION_TARGET, explodedBundleLocation);
-        props.put(CommandExecutionProperties.TIMESTAMP_START, start);
-        try {
-            if (input != null) {
-                osgiClient.installLocalBundle(input, explodedBundleLocation);
-            } else {
-                osgiClient.installLocalBundle(explodedBundleLocation);
-            }
-            props.put(CommandExecutionProperties.RESULT_TEXT, "OK");
-            props.put(CommandExecutionProperties.RESULT_STATUS, Boolean.TRUE);
-        } catch (Throwable t) {
-            props.put(CommandExecutionProperties.RESULT_TEXT, "FAILED");
-            props.put(CommandExecutionProperties.RESULT_STATUS, Boolean.FALSE);
-            props.put(CommandExecutionProperties.RESULT_THROWABLE, t);
-            if (t instanceof OsgiClientException) {
-                throw (OsgiClientException) t;
-            } else if (t instanceof Error) {
-                throw (Error) t;
-            } else if (t instanceof RuntimeException) {
-                throw (RuntimeException) t;
-            } else {
-                // should never happen
-                throw new Error(t);
-            }
-        } finally {
-            props.put(CommandExecutionProperties.TIMESTAMP_END, System.currentTimeMillis());
-            Event event = new Event(CommandExecutionProperties.REPOSITORY_TOPIC, props);
-            eventAdmin.postEvent(event);
-        }
-    }
-
-    @Override
-    public void installLocalBundle(InputStream jarredBundle, String sourceLocation) throws OsgiClientException {
-
-        logInstallLocalBundle(jarredBundle, sourceLocation);
-    }
-    
-    @Override
-    public List<SourceReference> findSourceReferences() throws OsgiClientException {
-        return osgiClient.findSourceReferences();
-    }
-
-}
diff --git a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/TracingCommand.java b/shared/modules/api/src/main/java/org/apache/sling/ide/transport/TracingCommand.java
deleted file mode 100644
index 32f3155..0000000
--- a/shared/modules/api/src/main/java/org/apache/sling/ide/transport/TracingCommand.java
+++ /dev/null
@@ -1,92 +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.ide.transport;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.sling.ide.transport.Repository.CommandExecutionFlag;
-import org.osgi.service.event.Event;
-import org.osgi.service.event.EventAdmin;
-
-public class TracingCommand<T> implements Command<T> {
-
-    public static <T> TracingCommand<T> wrap(Command<T> command, EventAdmin eventAdmin) {
-        return new TracingCommand<>(command, eventAdmin);
-    }
-
-    private final Command<T> command;
-    private final EventAdmin eventAdmin;
-
-    public TracingCommand(Command<T> command, EventAdmin eventAdmin) {
-        this.command = command;
-        this.eventAdmin = eventAdmin;
-    }
-
-    @Override
-    public Result<T> execute() {
-
-        long start = System.currentTimeMillis();
-        Result<T> result = command.execute();
-        long end = System.currentTimeMillis();
-
-        if (eventAdmin != null) {
-            Map<String, Object> props = new HashMap<>();
-            props.put(CommandExecutionProperties.RESULT_TEXT, result.toString());
-            props.put(CommandExecutionProperties.RESULT_STATUS, result.isSuccess());
-            try {
-                result.get();
-            } catch (RepositoryException e) {
-                props.put(CommandExecutionProperties.RESULT_THROWABLE, e);
-            }
-            props.put(CommandExecutionProperties.ACTION_TYPE, command.getClass().getSimpleName());
-            Set<CommandExecutionFlag> flags = command.getFlags();
-            if (!flags.isEmpty()) {
-                StringBuilder flagsString = new StringBuilder();
-                for (CommandExecutionFlag flag : flags) {
-                    flagsString.append(flag).append(',');
-                }
-                flagsString.deleteCharAt(flagsString.length() - 1);
-                props.put(CommandExecutionProperties.ACTION_FLAGS, flagsString.toString());
-            }
-
-            props.put(CommandExecutionProperties.ACTION_TARGET, command.getPath());
-            props.put(CommandExecutionProperties.TIMESTAMP_START, start);
-            props.put(CommandExecutionProperties.TIMESTAMP_END, end);
-            Event event = new Event(CommandExecutionProperties.REPOSITORY_TOPIC, props);
-            eventAdmin.postEvent(event);
-        }
-
-        return result;
-    }
-
-    public String getPath() {
-        return command.getPath();
-    }
-
-    @Override
-    public Set<CommandExecutionFlag> getFlags() {
-        return command.getFlags();
-    }
-    
-    @Override
-    public Kind getKind() {
-        return command.getKind();
-    }
-
-}
\ No newline at end of file
diff --git a/shared/modules/impl-vlt/.options b/shared/modules/impl-vlt/.options
deleted file mode 100644
index 48b2831..0000000
--- a/shared/modules/impl-vlt/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-org.apache.sling.ide.impl-vlt/debug=false
-org.apache.sling.ide.impl-vlt/debug/console=false
\ No newline at end of file
diff --git a/shared/modules/impl-vlt/bnd.bnd b/shared/modules/impl-vlt/bnd.bnd
deleted file mode 100644
index c6f4421..0000000
--- a/shared/modules/impl-vlt/bnd.bnd
+++ /dev/null
@@ -1,3 +0,0 @@
--includeresource: plugin.xml, .options
-Bundle-SymbolicName: org.apache.sling.ide.impl-vlt;singleton:=true
-SlingIDE-PluginLoggerEnabled: true
diff --git a/shared/modules/impl-vlt/plugin.xml b/shared/modules/impl-vlt/plugin.xml
deleted file mode 100644
index 9b79e21..0000000
--- a/shared/modules/impl-vlt/plugin.xml
+++ /dev/null
@@ -1,29 +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.
--->
-<?eclipse version="3.0"?>
-<plugin>
-    <extension
-         point="org.eclipse.ui.trace.traceComponents">
-      <component
-            id="org.eclipse.ui.trace.tracingPrefPage"
-            label="Sling IDE Tooling">
-         <bundle
-               name="org.apache.sling.ide.impl-vlt"></bundle>
-      </component>
-   </extension>
-</plugin>    
\ No newline at end of file
diff --git a/shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommandTest.java b/shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommandTest.java
deleted file mode 100644
index 98d0a7f..0000000
--- a/shared/modules/impl-vlt/src/test/java/org/apache/sling/ide/impl/vlt/AddOrUpdateNodeCommandTest.java
+++ /dev/null
@@ -1,507 +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.ide.impl.vlt;
-
-import static org.apache.sling.ide.transport.Repository.CommandExecutionFlag.CREATE_ONLY_WHEN_MISSING;
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.junit.Assert.assertThat;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.concurrent.Callable;
-
-import javax.jcr.Credentials;
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.SimpleCredentials;
-import javax.jcr.UnsupportedRepositoryOperationException;
-import javax.jcr.Value;
-import javax.jcr.nodetype.InvalidNodeTypeDefinitionException;
-import javax.jcr.nodetype.NodeType;
-import javax.jcr.nodetype.NodeTypeExistsException;
-
-import org.apache.jackrabbit.commons.cnd.CndImporter;
-import org.apache.jackrabbit.commons.cnd.ParseException;
-import org.apache.jackrabbit.core.TransientRepository;
-import org.apache.sling.ide.filter.Filter;
-import org.apache.sling.ide.filter.FilterResult;
-import org.apache.sling.ide.log.Logger;
-import org.apache.sling.ide.transport.CommandContext;
-import org.apache.sling.ide.transport.ResourceProxy;
-import org.hamcrest.Matchers;
-import org.junit.Ignore;
-import org.junit.Test;
-
-public class AddOrUpdateNodeCommandTest {
-    
-    private static final CommandContext DEFAULT_CONTEXT = new CommandContext(new Filter() {
-        @Override
-        public FilterResult filter(String repositoryPath) {
-            return FilterResult.ALLOW;
-        }
-    });
-
-    private static final String PROP_NAME = "jcr:title";
-
-    private Logger logger = new Slf4jLogger();
-
-    @Test
-    public void setProperty() throws Exception {
-
-        doPropertyChangeTest(null, "Title");
-    }
-
-    private void doPropertyChangeTest(final Object initialPropertyValues, final Object newPropertyValues)
-            throws Exception {
-
-        doWithTransientRepository(new CallableWithSession() {
-            @Override
-            public Void call() throws Exception {
-                Node contentNode = session().getRootNode().addNode("content");
-                if (initialPropertyValues instanceof String) {
-                    contentNode.setProperty(PROP_NAME, (String) initialPropertyValues);
-                } else if (initialPropertyValues instanceof String[]) {
-                    contentNode.setProperty(PROP_NAME, (String[]) initialPropertyValues);
-                }
-
-                session().save();
-
-                ResourceProxy resource = newResource("/content", NodeType.NT_UNSTRUCTURED);
-                if (newPropertyValues != null) {
-                    resource.addProperty(PROP_NAME, newPropertyValues);
-                }
-
-                AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repo(), credentials(), DEFAULT_CONTEXT, null, resource, logger);
-                cmd.execute().get();
-
-                session().refresh(false);
-
-                if (newPropertyValues == null) {
-                    assertThat(session().getNode("/content").hasProperty(PROP_NAME), equalTo(false));
-                    return null;
-                }
-
-                Property newProp = session().getNode("/content").getProperty(PROP_NAME);
-                if (newPropertyValues instanceof String) {
-                    assertThat("property.isMultiple", newProp.isMultiple(), equalTo(Boolean.FALSE));
-                    assertThat(newProp.getString(), equalTo((String) newPropertyValues));
-
-                } else {
-
-                    String[] expectedValues = (String[]) newPropertyValues;
-                    assertThat("property.isMultiple", newProp.isMultiple(), equalTo(Boolean.TRUE));
-
-                    Value[] values = session().getNode("/content").getProperty(PROP_NAME).getValues();
-
-                    assertThat(values.length, equalTo(expectedValues.length));
-                    for (int i = 0; i < values.length; i++) {
-                        assertThat(values[i].getString(), equalTo(expectedValues[i]));
-                    }
-
-                }
-
-                return null;
-            }
-        });
-
-    }
-
-    @Test
-    public void removeProperty() throws Exception {
-
-        doPropertyChangeTest("Title", null);
-    }
-
-    @Test
-    public void singlePropertyToMultiValued() throws Exception {
-
-        doPropertyChangeTest("Title", new String[] { "Title", "Title 2" });
-    }
-
-    @Test
-    public void multiValuesPropertyToSingle() throws Exception {
-
-        doPropertyChangeTest(new String[] { "Title", "Title 2" }, "Title");
-    }
-
-    @Test
-    public void changeNtFolderToSlingFolderWithAddedProperty() throws Exception {
-
-        doWithTransientRepository(new CallableWithSession() {
-            @Override
-            public Void call() throws Exception {
-                session().getRootNode().addNode("content", "nt:folder");
-
-                session().save();
-
-                ResourceProxy resource = newResource("/content", "sling:Folder");
-                resource.getProperties().put("newProperty", "some/value");
-
-                AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repo(), credentials(), DEFAULT_CONTEXT, null, resource, logger);
-                cmd.execute().get();
-
-                session().refresh(false);
-
-                Node content = session().getRootNode().getNode("content");
-                assertThat(content.getPrimaryNodeType().getName(), equalTo("sling:Folder"));
-
-                return null;
-            }
-        });
-    }
-
-    @Test
-    public void changeSlingFolderToNtFolderWithExistingProperty() throws Exception {
-        doWithTransientRepository(new CallableWithSession() {
-            @Override
-            public Void call() throws Exception {
-                Node content = session().getRootNode().addNode("content", "sling:Folder");
-                content.setProperty("newProperty", "some/value");
-
-                session().save();
-
-                ResourceProxy resource = newResource("/content", "nt:folder");
-
-                AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repo(), credentials(), DEFAULT_CONTEXT, null, resource, logger);
-                cmd.execute().get();
-
-                session().refresh(false);
-
-                content = session().getRootNode().getNode("content");
-                assertThat(content.getPrimaryNodeType().getName(), equalTo("nt:folder"));
-
-                return null;
-            }
-        });
-    }
-
-    @Test
-    @Ignore("SLING-4036")
-    public void updateNtUnstructuredToNodeWithRequiredProperty() throws Exception {
-
-        doWithTransientRepository(new CallableWithSession() {
-            @Override
-            public Void call() throws Exception {
-                Node content = session().getRootNode().addNode("content", "nt:unstructured");
-
-                session().save();
-
-                ResourceProxy resource = newResource("/content", "custom");
-                resource.getProperties().put("attribute", "some value");
-
-                AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repo(), credentials(), DEFAULT_CONTEXT, null, resource, logger);
-                cmd.execute().get();
-
-                session().refresh(false);
-
-                content = session().getRootNode().getNode("content");
-                assertThat(content.getPrimaryNodeType().getName(), equalTo("custom"));
-
-                return null;
-            }
-        });
-    }
-    
-    @Test
-    public void nodeNotPresentButOutsideOfFilterIsNotRemoved() throws Exception {
-
-        final CommandContext context = new CommandContext(new Filter() {
-            
-            @Override
-            public FilterResult filter(String repositoryPath) {
-                if ( repositoryPath.equals("/content/not-included-child")) {
-                    return FilterResult.DENY;
-                }
-                
-                return FilterResult.ALLOW;
-            }
-        });
-        
-        doWithTransientRepository(new CallableWithSession() {
-            @Override
-            public Void call() throws Exception {
-                Node content = session().getRootNode().addNode("content", "nt:unstructured");
-                content.addNode("included-child");
-                content.addNode("not-included-child");
-                
-                session().save();
-
-                ResourceProxy resource = newResource("/content", "nt:unstructured");
-                resource.addChild(newResource("/content/included-child", "nt:unstructured"));
-
-                AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repo(), credentials(), context, null, resource, logger);
-                cmd.execute().get();
-
-                session().refresh(false);
-
-                content = session().getRootNode().getNode("content");
-                content.getNode("included-child");
-                content.getNode("not-included-child");
-                return null;
-            }
-        });
-        
-    }
-
-    private ResourceProxy newResource(String path, String primaryType) {
-
-        ResourceProxy resource = new ResourceProxy(path);
-        resource.addProperty("jcr:primaryType", primaryType);
-        return resource;
-    }
-
-    @Test
-    public void createIfRequiredFlagSkipsExistingResources() throws Exception {
-
-        doWithTransientRepository(new CallableWithSession() {
-            @Override
-            public Void call() throws Exception {
-                Node content = session().getRootNode().addNode("content", "nt:folder");
-
-                session().save();
-
-                ResourceProxy resource = newResource("/content", "nt:unstructured");
-
-                AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repo(), credentials(), DEFAULT_CONTEXT, null, resource, logger,
-                        CREATE_ONLY_WHEN_MISSING);
-                cmd.execute().get();
-
-                session().refresh(false);
-
-                content = session().getRootNode().getNode("content");
-                assertThat(content.getPrimaryNodeType().getName(), equalTo("nt:folder"));
-
-                return null;
-            }
-        });
-    }
-
-    @Test
-    public void createIfRequiredFlagCreatesNeededResources() throws Exception {
-
-        doWithTransientRepository(new CallableWithSession() {
-            @Override
-            public Void call() throws Exception {
-                ResourceProxy resource = newResource("/content", "nt:unstructured");
-
-                AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repo(), credentials(), DEFAULT_CONTEXT, null, resource, logger,
-                        CREATE_ONLY_WHEN_MISSING);
-                cmd.execute().get();
-
-                session().refresh(false);
-
-                Node content = session().getRootNode().getNode("content");
-                assertThat(content.getPrimaryNodeType().getName(), equalTo("nt:unstructured"));
-
-                return null;
-            }
-        });
-    }
-
-    @Test
-    public void createIfRequiredFlagCreatesNeededResourcesEvenWhenPrimaryTypeIsMissing() throws Exception {
-
-        doWithTransientRepository(new CallableWithSession() {
-            @Override
-            public Void call() throws Exception {
-                ResourceProxy resource = new ResourceProxy("/content");
-
-                AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repo(), credentials(), DEFAULT_CONTEXT, null, resource, logger,
-                        CREATE_ONLY_WHEN_MISSING);
-                cmd.execute().get();
-
-                session().refresh(false);
-
-                Node content = session().getRootNode().getNode("content");
-                assertThat(content.getPrimaryNodeType().getName(), equalTo("nt:unstructured"));
-
-                return null;
-            }
-        });
-    }
-
-    @Test
-    public void autoCreatedPropertiesAreNotRemoved() throws Exception {
-
-        doWithTransientRepository(new CallableWithSession() {
-            @Override
-            public Void call() throws Exception {
-                Node content = session().getRootNode().addNode("content", "nt:folder");
-
-                session().save();
-
-                ResourceProxy resource = newResource("/content", "nt:folder");
-                resource.addProperty("jcr:mixinTypes", "mix:lastModified");
-
-                AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repo(), credentials(), DEFAULT_CONTEXT, null, resource, logger);
-                cmd.execute().get();
-                cmd.execute().get(); // second time since mixins are processed after properties so we need two
-                                     // executions to
-                                     // expose the problem
-
-                session().refresh(false);
-
-                content = session().getRootNode().getNode("content");
-                assertThat("jcr:lastModified property not present", content.hasProperty("jcr:lastModified"),
-                        equalTo(true));
-                assertThat("jcr:lastModifiedBy property not present", content.hasProperty("jcr:lastModifiedBy"),
-                        equalTo(true));
-
-                return null;
-            }
-        });
-    }
-
-    @Test
-    public void autoCreatedPropertiesAreUpdatedIfPresent() throws Exception {
-
-        doWithTransientRepository(new CallableWithSession() {
-            @Override
-            public Void call() throws Exception {
-                Node content = session().getRootNode().addNode("content", "nt:folder");
-
-                session().save();
-
-                ResourceProxy resource = newResource("/content", "nt:folder");
-                resource.addProperty("jcr:mixinTypes", "mix:lastModified");
-                resource.addProperty("jcr:lastModifiedBy", "admin2");
-
-                AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repo(), credentials(), DEFAULT_CONTEXT, null, resource, logger);
-                cmd.execute().get();
-                cmd.execute().get(); // second time since mixins are processed after properties so we need two
-                                     // executions to
-                                     // expose the problem
-
-                session().refresh(false);
-
-                content = session().getRootNode().getNode("content");
-                assertThat("jcr:lastModifiedBy property not modified", content.getProperty("jcr:lastModifiedBy")
-                        .getString(), equalTo("admin2"));
-
-                return null;
-            }
-        });
-    }
-    
-    @Test
-    public void setEmptyMixinTypes() throws Exception {
-        setMixinTypes0();
-    }
-    
-    private void setMixinTypes0(final String... mixinTypeNames) throws Exception {
-        
-        doWithTransientRepository(new CallableWithSession() {
-            @Override
-            public Void call() throws Exception {
-                ResourceProxy resource = newResource("/content", "nt:unstructured");
-                resource.addProperty("jcr:mixinTypes", mixinTypeNames);
-
-                AddOrUpdateNodeCommand cmd = new AddOrUpdateNodeCommand(repo(), credentials(), DEFAULT_CONTEXT, null, resource, logger);
-                cmd.execute().get();
-
-                session().refresh(false);
-
-                Node content = session().getRootNode().getNode("content");
-                assertThat(content.getMixinNodeTypes(), Matchers.arrayWithSize(mixinTypeNames.length));
-
-                return null;
-            }
-        });        
-    }
-
-    @Test
-    public void setMixinTypes() throws Exception {
-        
-        setMixinTypes0("mix:created");
-    }
-
-    private void doWithTransientRepository(CallableWithSession callable) throws Exception {
-
-        File out = new File(new File("target"), "jackrabbit");
-        TransientRepository repo = new TransientRepository(new File(out, "repository.xml"), new File(out, "repository"));
-        SimpleCredentials credentials = new SimpleCredentials("admin", "admin".toCharArray());
-        Session session = repo.login(credentials);
-
-        importNodeTypeDefinitions(session, "test-definitions.cnd");
-        importNodeTypeDefinitions(session, "folder.cnd");
-
-        try {
-            callable.setCredentials(credentials);
-            callable.setSession(session);
-            callable.call();
-        } finally {
-            if (session.itemExists("/content"))
-                session.removeItem("/content");
-            session.save();
-            session.logout();
-        }
-
-    }
-
-    private void importNodeTypeDefinitions(Session session, String cndFile) throws InvalidNodeTypeDefinitionException,
-            NodeTypeExistsException, UnsupportedRepositoryOperationException, ParseException, RepositoryException,
-            IOException {
-        try ( InputStream cndInput = getClass().getResourceAsStream(cndFile) ) {
-            if (cndInput == null) {
-                throw new IllegalArgumentException("Unable to read classpath resource " + cndFile);
-            }
-            CndImporter.registerNodeTypes(new InputStreamReader(cndInput), session);
-        }
-    }
-
-    private static abstract class CallableWithSession implements Callable<Void> {
-
-        private Session session;
-        private Credentials credentials;
-
-        public void setSession(Session session) {
-
-            this.session = session;
-        }
-
-        public void setCredentials(Credentials credentials) {
-
-            this.credentials = credentials;
-        }
-
-        protected Session session() {
-
-            if (session == null)
-                throw new IllegalStateException("session is null");
-
-            return session;
-        }
-
-        protected Credentials credentials() {
-
-            if (credentials == null)
-                throw new IllegalStateException("credentials is null");
-
-            return credentials;
-        }
-
-        protected Repository repo() {
-
-            return session().getRepository();
-        }
-    }
-}
diff --git a/shared/modules/parent/pom.xml b/shared/modules/parent/pom.xml
deleted file mode 100644
index 02c84ac..0000000
--- a/shared/modules/parent/pom.xml
+++ /dev/null
@@ -1,178 +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/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.sling</groupId>
-        <artifactId>sling</artifactId>
-        <version>33</version>
-        <relativePath />
-    </parent>
-
-    <groupId>org.apache.sling.ide</groupId>
-    <artifactId>sling-ide-shared-parent</artifactId>
-    <packaging>pom</packaging>
-    <version>1.2.3-SNAPSHOT</version>
-
-    <name>Apache Sling IDE - Shared Modules Parent</name>
-
-    <scm>
-        <connection>scm:git:https://gitbox.apache.org/repos/asf/sling-ide-tooling.git</connection>
-        <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/sling-ide-tooling.git</developerConnection>
-        <url>https://gitbox.apache.org/repos/asf?p=sling-ide-tooling.git</url>
-    </scm>
-    
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.rat</groupId>
-                <artifactId>apache-rat-plugin</artifactId>
-                <configuration>
-                    <excludes>
-                        <exclude>**/MANIFEST.MF</exclude>
-                        <exclude>**/OSGI-INF/*.xml</exclude>
-                    </excludes>
-                </configuration>
-            </plugin>
-        </plugins>
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <artifactId>maven-resources-plugin</artifactId>
-                    <version>3.1.0</version>
-                </plugin>
-                <plugin>
-                    <!-- TODO: consolidate once sling-parent 35 is released, because most properties are set correctly there -->
-                    <groupId>biz.aQute.bnd</groupId>
-                    <artifactId>bnd-maven-plugin</artifactId>
-                    <version>4.1.0</version>
-                    <executions>
-                        <execution>
-                            <goals>
-                                <goal>bnd-process</goal>
-                            </goals>
-                            <configuration>
-                                <!-- default OSGi headers (mainly for usage within Eclipse) -->
-                                <bnd><![CDATA[
-Bundle-Category: sling
-
-Bundle-Description: "${project.description}"
-
-Bundle-DocURL: https://sling.apache.org/documentation/development/ide-tooling.html
-
-Bundle-License: Apache License, Version 2.0
-
-Bundle-Vendor: The Apache Software Foundation
-
-Bundle-SCM: url=${project.scm.url},connection=${project.scm.connection},developer-connection=${project.scm.developerConnection},tag=${project.scm.tag}
-
-# export all versioned packages by default
--exportcontents: ${packages;VERSIONED}
-
-# overwrite timestamp format used as qualifier for snapshots to make the resolution higher (i.e. make them differ for each build), 
-# compare with https://www.mail-archive.com/dev@sling.apache.org/msg76177.html
--snapshot: ${tstamp;yyyyMMddHHmmssSSS}
-
-Bundle-ActivationPolicy: lazy
-                                ]]></bnd>
-                            </configuration>
-                        </execution>
-                    </executions>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>m2e</id>
-            <!-- This profile is only activated when building in Eclipse 
-                with m2e -->
-            <activation>
-                <property>
-                    <name>m2e.version</name>
-                </property>
-            </activation>
-            <build>
-                <!-- as currently PDE cannot deal with the MANIFEST.MF in the target folder
-                https://bugs.eclipse.org/bugs/show_bug.cgi?id=533263 copy both 
-                Manifest and component descriptors to the project's root -->
-                <plugins>
-                    <plugin>
-                        <artifactId>maven-clean-plugin</artifactId>
-                        <configuration>
-                            <filesets>
-                                <fileset>
-                                    <directory>META-INF</directory>
-                                    <includes>
-                                        <include>*</include>
-                                    </includes>
-                                </fileset>
-                                <fileset>
-                                    <directory>OSGI-INF</directory>
-                                    <includes>
-                                        <include>*</include>
-                                    </includes>
-                                </fileset>
-                            </filesets>
-                        </configuration>
-                    </plugin>
-                    <plugin>
-                        <artifactId>maven-resources-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>copy-manifest-for-pde</id>
-                                <phase>process-test-resources</phase>
-                                <goals>
-                                    <goal>copy-resources</goal>
-                                </goals>
-                                <configuration>
-                                    <overwrite>true</overwrite>
-                                    <outputDirectory>META-INF</outputDirectory>
-                                    <resources>
-                                        <resource>
-                                            <directory>${project.build.outputDirectory}/META-INF</directory>
-                                            <includes>
-                                                <include>MANIFEST.MF</include>
-                                            </includes>
-                                        </resource>
-                                    </resources>
-                                </configuration>
-                            </execution>
-                            <execution>
-                                <id>copy-scr-descriptors-for-pde</id>
-                                <phase>process-test-resources</phase>
-                                <goals>
-                                    <goal>copy-resources</goal>
-                                </goals>
-                                <configuration>
-                                    <outputDirectory>OSGI-INF</outputDirectory>
-                                    <resources>
-                                        <resource>
-                                            <directory>${project.build.outputDirectory}/OSGI-INF</directory>
-                                            <includes>
-                                                <include>*.xml</include>
-                                            </includes>
-                                        </resource>
-                                    </resources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-</project>
diff --git a/shared/p2/pom.xml b/shared/p2/pom.xml
deleted file mode 100644
index edf358f..0000000
--- a/shared/p2/pom.xml
+++ /dev/null
@@ -1,170 +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
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-    xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache</groupId>
-        <artifactId>apache</artifactId>
-        <version>14</version>
-    </parent>
-    <groupId>org.apache.sling</groupId>
-    <artifactId>sling-ide-tooling-p2</artifactId>
-    <version>1.2.3-SNAPSHOT</version>
-    <packaging>pom</packaging>
-    <name>Apache Sling IDE Tools - P2 packaging</name>
-    <url>http://sling.apache.org</url>
-
-    <scm>
-        <connection>scm:git:https://gitbox.apache.org/repos/asf/sling-ide-tooling.git</connection>
-        <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/sling-ide-tooling.git</developerConnection>
-        <url>https://gitbox.apache.org/repos/asf?p=sling-ide-tooling.git</url>
-    </scm>
-
-    <modules>
-        <module>vlt-wrapper</module>
-        <module>shared-feature</module>
-        <module>shared-repository</module>
-    </modules>
-
-    <repositories>
-        <repository>
-            <id>luna</id>
-            <layout>p2</layout>
-            <url>https://download.eclipse.org/releases/oxygen</url>
-        </repository>
-        <repository>
-            <id>orbit</id>
-            <layout>p2</layout>
-            <url>https://download.eclipse.org/tools/orbit/downloads/drops/R20170516192513/repository</url>
-        </repository>    
-    </repositories>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.eclipse.tycho</groupId>
-                <artifactId>tycho-maven-plugin</artifactId>
-                <version>${tycho.version}</version>
-                <extensions>true</extensions>
-            </plugin>
-            <plugin>
-                <groupId>org.eclipse.tycho</groupId>
-                <artifactId>target-platform-configuration</artifactId>
-                <version>${tycho.version}</version>
-                <configuration>
-                    <resolver>p2</resolver>
-                    <pomDependencies>consider</pomDependencies>
-                    <!-- <target> <artifact> <groupId>${project.groupId}</groupId> 
-                        <artifactId>org.apache.sling.ide.target-definition</artifactId> <version>${project.version}</version> 
-                        </artifact> </target> -->
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.eclipse.tycho</groupId>
-                <artifactId>tycho-versions-plugin</artifactId>
-                <version>${tycho.version}</version>
-            </plugin>
-            <!-- <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>ianal-maven-plugin</artifactId> 
-                <version>1.0-alpha-1</version> <executions> <execution> <goals> <goal>verify-legal-files</goal> 
-                </goals> <configuration> <strict>true</strict> </configuration> </execution> 
-                </executions> </plugin> -->
-            <plugin>
-                <groupId>org.apache.rat</groupId>
-                <artifactId>apache-rat-plugin</artifactId>
-                <configuration>
-                    <excludes>
-                        <exclude>derby.log</exclude>
-                        <exclude>.gitignore</exclude>
-                        <exclude>README.md</exclude>
-
-                        <!-- Eclipse build related files -->
-                        <exclude>*.launch</exclude>
-                        <exclude>build.properties</exclude>
-                        <exclude>.options</exclude>
-                        <exclude>META-INF/MANIFEST.MF</exclude>
-
-                        <!-- test data -->
-                        <exclude>**/*.binary</exclude>
-
-                        <!-- prevent failures when eclipse-test is not activated 
-                            as a submodule -->
-                        <exclude>eclipse-test/**</exclude>
-                        <!-- exclude target file from the source-bundle project 
-                            since it is not a module -->
-                        <exclude>source-bundle/target/**</exclude>
-                        <exclude>source-bundle/README.md</exclude>
-
-                        <!-- Jenkins Xvfb plugin -->
-                        <exclude>.Xauthority-*</exclude>
-                    </excludes>
-                </configuration>
-                <!-- <executions> <execution> <goals> <goal>check</goal> 
-                    </goals> <phase>verify</phase> </execution> </executions> -->
-            </plugin>
-        </plugins>
-        <pluginManagement>
-            <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>
-                <!--This plugin's configuration is used to store Eclipse 
-                    m2e settings only. It has no influence on the Maven build itself. -->
-                <!-- We embed some bundles that are not available on p2 update 
-                    sites. To make the build seamless, we copy them early in the process. -->
-                <plugin>
-                    <groupId>org.eclipse.m2e</groupId>
-                    <artifactId>lifecycle-mapping</artifactId>
-                    <version>1.0.0</version>
-                    <configuration>
-                        <lifecycleMappingMetadata>
-                            <pluginExecutions>
-                                <pluginExecution>
-                                    <pluginExecutionFilter>
-                                        <groupId>
-                                            org.apache.maven.plugins
-                                        </groupId>
-                                        <artifactId>
-                                            maven-dependency-plugin
-                                        </artifactId>
-                                        <versionRange>
-                                            [2.8,)
-                                        </versionRange>
-                                        <goals>
-                                            <goal>copy</goal>
-                                        </goals>
-                                    </pluginExecutionFilter>
-                                    <action>
-                                        <ignore></ignore>
-                                    </action>
-                                </pluginExecution>
-                            </pluginExecutions>
-                        </lifecycleMappingMetadata>
-                    </configuration>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-    </build>
-
-    <properties>
-        <tycho.version>1.0.0</tycho.version>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-</project>
diff --git a/shared/p2/shared-feature/build.properties b/shared/p2/shared-feature/build.properties
deleted file mode 100644
index 64f93a9..0000000
--- a/shared/p2/shared-feature/build.properties
+++ /dev/null
@@ -1 +0,0 @@
-bin.includes = feature.xml
diff --git a/shared/p2/shared-feature/feature.xml b/shared/p2/shared-feature/feature.xml
deleted file mode 100644
index 1d0a0e4..0000000
--- a/shared/p2/shared-feature/feature.xml
+++ /dev/null
@@ -1,256 +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.
--->
-<feature
-      id="org.apache.sling.ide.shared.feature"
-      label="Sling IDE Tools - Shared"
-      version="1.2.3.qualifier"
-      provider-name="The Apache Software Foundation">
-
-   <license url="http://www.apache.org/licenses/LICENSE-2.0">
-      Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      &quot;License&quot; shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      &quot;Licensor&quot; shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      &quot;Legal Entity&quot; shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      &quot;control&quot; means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      &quot;You&quot; (or &quot;Your&quot;) shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      &quot;Source&quot; form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      &quot;Object&quot; form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      &quot;Work&quot; shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      &quot;Derivative Works&quot; shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      &quot;Contribution&quot; shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, &quot;submitted&quot;
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as &quot;Not a Contribution.&quot;
-
-      &quot;Contributor&quot; shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a &quot;NOTICE&quot; text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an &quot;AS IS&quot; BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets &quot;[]&quot;
-      replaced with your own identifying information. (Don&apos;t include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same &quot;printed page&quot; as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-   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 &quot;AS IS&quot; 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.
-   </license>
-
-   <plugin
-         id="org.apache.sling.ide.api"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.sling.ide.impl-vlt"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.sling.ide.artifacts"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.sling.ide.vlt-wrapper"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-</feature>
-
diff --git a/shared/p2/shared-feature/pom.xml b/shared/p2/shared-feature/pom.xml
deleted file mode 100644
index a22ba75..0000000
--- a/shared/p2/shared-feature/pom.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<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/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.sling</groupId>
-    <artifactId>sling-ide-tooling-p2</artifactId>
-    <version>1.2.3-SNAPSHOT</version>
-  </parent>
-
-  <artifactId>org.apache.sling.ide.shared.feature</artifactId>
-  <packaging>eclipse-feature</packaging>
-
-  <name>Apache Sling IDE Tooling Shared Features</name>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.sling.ide</groupId>
-      <artifactId>org.apache.sling.ide.api</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.sling.ide</groupId>
-      <artifactId>org.apache.sling.ide.impl-vlt</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.sling.ide</groupId>
-      <artifactId>org.apache.sling.ide.artifacts</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.sling.ide</groupId>
-      <artifactId>org.apache.sling.ide.vlt-wrapper</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-   </dependencies>
-
-</project>
diff --git a/shared/p2/shared-repository/category.xml b/shared/p2/shared-repository/category.xml
deleted file mode 100644
index 242fa40..0000000
--- a/shared/p2/shared-repository/category.xml
+++ /dev/null
@@ -1,23 +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.
--->
-<site>
-   <feature url="features/org.apache.sling.ide.shared.feature_0.0.0.qualifier.jar" id="org.apache.sling.ide.shared.feature" version="0.0.0">
-      <category name="sling"/>
-   </feature>
-   <category-def name="sling" label="Sling"/>
-</site>
diff --git a/shared/p2/shared-repository/pom.xml b/shared/p2/shared-repository/pom.xml
deleted file mode 100644
index 073a363..0000000
--- a/shared/p2/shared-repository/pom.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<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/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.sling</groupId>
-    <artifactId>sling-ide-tooling-p2</artifactId>
-    <version>1.2.3-SNAPSHOT</version>
-  </parent>
-
-  <artifactId>org.apache.sling.ide.shared.repository</artifactId>
-  <packaging>eclipse-repository</packaging>
-
-  <name>Apache Sling IDE Tooling Shared Features P2 repository</name>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.sling.ide</groupId>
-      <artifactId>org.apache.sling.ide.api</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.sling.ide</groupId>
-      <artifactId>org.apache.sling.ide.vlt-wrapper</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.sling.ide</groupId>
-      <artifactId>org.apache.sling.ide.impl-vlt</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.sling.ide</groupId>
-      <artifactId>org.apache.sling.ide.artifacts</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-   </dependencies>
-
-</project>
diff --git a/shared/p2/vlt-wrapper/META-INF/MANIFEST.MF b/shared/p2/vlt-wrapper/META-INF/MANIFEST.MF
deleted file mode 100644
index b2dc0f1..0000000
--- a/shared/p2/vlt-wrapper/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,75 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Vendor: The Apache Software Foundation
-Bundle-Name: Sling IDE Vlt Wrapper
-Bundle-SymbolicName: org.apache.sling.ide.vlt-wrapper
-Bundle-Version: 1.2.3.qualifier
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
-Bundle-ClassPath: .,
- lib/org.apache.jackrabbit.vault-3.2.8.jar,
- lib/vault-davex-3.2.8.jar,
- lib/jcr-2.0.jar,
- lib/guava-15.0.jar,
- lib/jackrabbit-api-2.16.3.jar,
- lib/jackrabbit-spi2dav-2.16.3.jar,
- lib/jackrabbit-spi-2.16.3.jar,
- lib/jackrabbit-jcr-client-2.16.3.jar,
- lib/jackrabbit-jcr2spi-2.16.3.jar,
- lib/jackrabbit-jcr-commons-2.16.3.jar,
- lib/jackrabbit-spi-commons-2.16.3.jar,
- lib/jackrabbit-webdav-2.16.3.jar,
- lib/httpmime-4.5.3.jar,
- lib/httpclient-4.5.3.jar,
- lib/httpcore-4.4.6.jar
-Export-Package: javax.jcr;version="2.0.0",
- javax.jcr.nodetype;version="2.0.0",
- javax.jcr.lock;version="2.0.0",
- javax.jcr.observation;version="2.0.0",
- javax.jcr.query;version="2.0.0",
- javax.jcr.query.qom;version="2.0.0",
- javax.jcr.retention;version="2.0.0",
- javax.jcr.security;version="2.0.0",
- javax.jcr.util;version="2.0.0",
- javax.jcr.version;version="2.0.0",
- org.apache.jackrabbit.api;version="2.16.0",
- org.apache.jackrabbit.api.management;version="2.16.0",
- org.apache.jackrabbit.api.security;version="2.16.0",
- org.apache.jackrabbit.api.security.authorization;version="2.16.0", 
- org.apache.jackrabbit.api.security.principal;version="2.16.0", 
- org.apache.jackrabbit.api.security.user;version="2.16.0", 
- org.apache.jackrabbit.spi.commons.conversion;version="2.16.0",
- org.apache.jackrabbit.spi.commons.namespace;version="2.16.0",
- org.apache.jackrabbit.util;version="2.16.0",
- org.apache.jackrabbit.vault.davex;version="2.4.0",
- org.apache.jackrabbit.vault.fs;version="2.4.0",
- org.apache.jackrabbit.vault.fs.api;version="2.6.0",
- org.apache.jackrabbit.vault.fs.config;version="2.5.0",
- org.apache.jackrabbit.vault.fs.filter;version="2.4.0",
- org.apache.jackrabbit.vault.fs.impl;version="2.4.0",
- org.apache.jackrabbit.vault.fs.impl.aggregator;version="2.4.0",
- org.apache.jackrabbit.vault.fs.impl.io;version="2.4.0",
- org.apache.jackrabbit.vault.fs.impl.io.legacycnd;version="2.4.0",
- org.apache.jackrabbit.vault.fs.io;version="2.4.0",
- org.apache.jackrabbit.vault.fs.spi;version="2.4.0",
- org.apache.jackrabbit.vault.fs.spi.impl.jcr20;version="2.4.0",
- org.apache.jackrabbit.vault.packaging;version="2.4.0",
- org.apache.jackrabbit.vault.packaging.impl;version="2.4.0",
- org.apache.jackrabbit.vault.util;version="2.4.0",
- org.apache.jackrabbit.vault.util.xml.serialize;version="2.4.0",
- org.apache.jackrabbit.vault.util.xml.xerces.dom;version="2.4.0",
- org.apache.jackrabbit.vault.util.xml.xerces.util;version="2.4.0",
- org.apache.jackrabbit.vault.util.xml.xerces.xni;version="2.4.0",
- org.apache.jackrabbit.vault.util.xml.xerces.xni.parser;version="2.4.0"
-Require-Bundle: org.eclipse.core.runtime
-Import-Package: org.apache.commons.collections,
- org.apache.commons.collections.map,
- org.apache.commons.collections.list,
- org.apache.commons.collections.iterators,
- org.apache.commons.logging,
- org.apache.commons.codec,
- org.apache.commons.codec.binary,
- org.apache.commons.io,
- org.apache.commons.io.output,
- org.osgi.framework,
- org.slf4j
diff --git a/shared/p2/vlt-wrapper/README.md b/shared/p2/vlt-wrapper/README.md
deleted file mode 100644
index 16632db..0000000
--- a/shared/p2/vlt-wrapper/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Apache Sling IDE Tools FileVault wrapper
-
-This module is part of the [Apache Sling](https://sling.apache.org) project.
diff --git a/shared/p2/vlt-wrapper/build.properties b/shared/p2/vlt-wrapper/build.properties
deleted file mode 100644
index 82f46e0..0000000
--- a/shared/p2/vlt-wrapper/build.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               lib/org.apache.jackrabbit.vault-3.2.8.jar,\
-               lib/vault-davex-3.2.8.jar,\
-               lib/jcr-2.0.jar,\
-               lib/guava-15.0.jar,\
-               lib/jackrabbit-api-2.16.3.jar,\
-               lib/jackrabbit-spi2dav-2.16.3.jar,\
-               lib/jackrabbit-spi-2.16.3.jar,\
-               lib/jackrabbit-jcr-client-2.16.3.jar,\
-               lib/jackrabbit-jcr2spi-2.16.3.jar,\
-               lib/jackrabbit-jcr-commons-2.16.3.jar,\
-               lib/jackrabbit-spi-commons-2.16.3.jar,\
-               lib/jackrabbit-webdav-2.16.3.jar,\
-               lib/httpmime-4.5.3.jar,\
-               lib/httpclient-4.5.3.jar,\
-               lib/httpcore-4.4.6.jar
diff --git a/shared/p2/vlt-wrapper/lib/.gitignore b/shared/p2/vlt-wrapper/lib/.gitignore
deleted file mode 100644
index f23b948..0000000
--- a/shared/p2/vlt-wrapper/lib/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.jar
\ No newline at end of file
diff --git a/shared/p2/vlt-wrapper/pom.xml b/shared/p2/vlt-wrapper/pom.xml
deleted file mode 100644
index 0cdbc57..0000000
--- a/shared/p2/vlt-wrapper/pom.xml
+++ /dev/null
@@ -1,179 +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 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.sling</groupId>
-        <artifactId>sling-ide-tooling-p2</artifactId>
-        <version>1.2.3-SNAPSHOT</version>
-    </parent>
-    <groupId>org.apache.sling.ide</groupId>
-    <artifactId>org.apache.sling.ide.vlt-wrapper</artifactId>
-    <packaging>eclipse-plugin</packaging>
-    <name>Apache Sling IDE Tools FileVault wrapper</name>
-
-    <scm>
-        <connection>scm:git:https://gitbox.apache.org/repos/asf/sling-ide-tooling.git</connection>
-        <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/sling-ide-tooling.git</developerConnection>
-        <url>https://gitbox.apache.org/repos/asf?p=sling-ide-tooling.git</url>
-    </scm>
-    <build>
-        <!-- ensure that extra files are picked up by the maven-source-plugin -->
-        <resources>
-            <resource>
-                <directory>.</directory>
-                <includes>
-                    <include>build.properties</include>
-                    <include>META-INF/*</include>
-                </includes>
-            </resource>
-        </resources>
-        <plugins>
-            <plugin>
-                <artifactId>maven-clean-plugin</artifactId>
-                <configuration>
-                    <filesets>
-                        <fileset>
-                            <directory>lib</directory>
-                            <includes>
-                                <include>**/*.jar</include>
-                            </includes>
-                        </fileset>
-                    </filesets>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-source-plugin</artifactId>
-                <configuration>
-                    <archive>
-                        <manifestFile>META-INF/MANIFEST.MF</manifestFile>
-                    </archive>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <configuration>
-                    <artifactItems>
-                        <!-- START JCR dependencies -->
-                        <artifactItem>
-                            <groupId>javax.jcr</groupId>
-                            <artifactId>jcr</artifactId>
-                            <version>2.0</version>
-                        </artifactItem>
-                        <!-- END JCR dependencies -->
-
-                        <!-- START Apache Jackrabbit dependencies -->
-                        <artifactItem>
-                            <groupId>org.apache.jackrabbit</groupId>
-                            <artifactId>jackrabbit-api</artifactId>
-                            <version>${jackrabbit.version}</version>
-                        </artifactItem>
-                        <artifactItem>
-                            <groupId>org.apache.jackrabbit</groupId>
-                            <artifactId>jackrabbit-webdav</artifactId>
-                            <version>${jackrabbit.version}</version>
-                        </artifactItem>
-                        <artifactItem>
-                            <groupId>org.apache.jackrabbit</groupId>
-                            <artifactId>jackrabbit-spi-commons</artifactId>
-                            <version>${jackrabbit.version}</version>
-                        </artifactItem>
-                        <artifactItem>
-                            <groupId>org.apache.jackrabbit</groupId>
-                            <artifactId>jackrabbit-jcr-commons</artifactId>
-                            <version>${jackrabbit.version}</version>
-                        </artifactItem>
-                        <!-- transitive dependency of jackrabbit-jcr-commons -->
-                        <artifactItem>
-                            <groupId>com.google.guava</groupId>
-                            <artifactId>guava</artifactId>
-                            <version>15.0</version>
-                        </artifactItem>
-                        <artifactItem>
-                            <groupId>org.apache.jackrabbit</groupId>
-                            <artifactId>jackrabbit-jcr2spi</artifactId>
-                            <version>${jackrabbit.version}</version>
-                        </artifactItem>
-                        <artifactItem>
-                            <groupId>org.apache.jackrabbit</groupId>
-                            <artifactId>jackrabbit-jcr-client</artifactId>
-                            <version>${jackrabbit.version}</version>
-                        </artifactItem>
-                        <artifactItem>
-                            <groupId>org.apache.jackrabbit</groupId>
-                            <artifactId>jackrabbit-spi</artifactId>
-                            <version>${jackrabbit.version}</version>
-                        </artifactItem>
-                        <artifactItem>
-                            <groupId>org.apache.jackrabbit</groupId>
-                            <artifactId>jackrabbit-spi2dav</artifactId>
-                            <version>${jackrabbit.version}</version>
-                        </artifactItem>
-                        <artifactItem>
-                            <groupId>org.apache.httpcomponents</groupId>
-                            <artifactId>httpmime</artifactId>
-                            <version>4.5.3</version>
-                        </artifactItem>
-                        <artifactItem>
-                            <groupId>org.apache.httpcomponents</groupId>
-                            <artifactId>httpclient</artifactId>
-                            <version>4.5.3</version>
-                        </artifactItem>
-                        <artifactItem>
-                            <groupId>org.apache.httpcomponents</groupId>
-                            <artifactId>httpcore</artifactId>
-                            <version>4.4.6</version>
-                        </artifactItem>
-                        <!-- END Apache Jackrabbit dependencies -->
-
-                        <!-- START Apache Jackrabbit FileVault dependencies -->
-                        <artifactItem>
-                            <groupId>org.apache.jackrabbit.vault</groupId>
-                            <artifactId>vault-davex</artifactId>
-                            <version>${vault.version}</version>
-                        </artifactItem>
-                        <artifactItem>
-                            <groupId>org.apache.jackrabbit.vault</groupId>
-                            <artifactId>org.apache.jackrabbit.vault</artifactId>
-                            <version>${vault.version}</version>
-                        </artifactItem>
-                        <!-- END Apache Jackrabbit FileVault dependencies -->
-
-                    </artifactItems>
-                    <outputDirectory>lib</outputDirectory>
-                </configuration>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>copy</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <properties>
-        <!-- must match the version being referenced in the pom.xml of filevault -->
-        <jackrabbit.version>2.16.3</jackrabbit.version>
-        <vault.version>3.2.8</vault.version>
-    </properties>
-</project>
diff --git a/shared/modules/parent/.project b/shared/parent/.project
similarity index 100%
rename from shared/modules/parent/.project
rename to shared/parent/.project
diff --git a/shared/parent/pom.xml b/shared/parent/pom.xml
new file mode 100644
index 0000000..69fef0c
--- /dev/null
+++ b/shared/parent/pom.xml
@@ -0,0 +1,137 @@
+<?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/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.sling</groupId>
+        <artifactId>sling-bundle-parent</artifactId>
+        <version>49</version>
+        <relativePath />
+    </parent>
+
+    <groupId>org.apache.sling.ide</groupId>
+    <artifactId>sling-ide-shared-parent</artifactId>
+    <packaging>pom</packaging>
+    <version>1.2.3-SNAPSHOT</version>
+
+    <name>Apache Sling IDE - Shared Modules Parent</name>
+
+    <scm>
+        <connection>scm:git:https://gitbox.apache.org/repos/asf/sling-ide-tooling.git</connection>
+        <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/sling-ide-tooling.git</developerConnection>
+        <url>https://gitbox.apache.org/repos/asf?p=sling-ide-tooling.git</url>
+    </scm>
+    
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>biz.aQute.bnd</groupId>
+                    <artifactId>bnd-baseline-maven-plugin</artifactId>
+                    <configuration>
+                        <failOnMissing>false</failOnMissing><!-- no release yet -->
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+    <dependencyManagement>
+    	<dependencies>
+    		<!-- START JCR dependencies -->
+			<dependency>
+				<groupId>javax.jcr</groupId>
+				<artifactId>jcr</artifactId>
+				<version>2.0</version>
+			</dependency>
+			<!-- END JCR dependencies -->
+	
+			<!-- START Apache Jackrabbit dependencies -->
+			<dependency>
+				<groupId>org.apache.jackrabbit</groupId>
+				<artifactId>oak-jackrabbit-api</artifactId>
+				<version>${oak.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.jackrabbit</groupId>
+				<artifactId>jackrabbit-webdav</artifactId>
+				<version>${jackrabbit.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.jackrabbit</groupId>
+				<artifactId>jackrabbit-spi-commons</artifactId>
+				<version>${jackrabbit.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.jackrabbit</groupId>
+				<artifactId>jackrabbit-jcr-commons</artifactId>
+				<version>${jackrabbit.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.jackrabbit</groupId>
+				<artifactId>jackrabbit-jcr2spi</artifactId>
+				<version>${jackrabbit.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.jackrabbit</groupId>
+				<artifactId>jackrabbit-jcr-client</artifactId>
+				<version>${jackrabbit.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.jackrabbit</groupId>
+				<artifactId>jackrabbit-spi</artifactId>
+				<version>${jackrabbit.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.jackrabbit</groupId>
+				<artifactId>jackrabbit-spi2dav</artifactId>
+				<version>${jackrabbit.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.httpcomponents</groupId>
+				<artifactId>httpclient</artifactId>
+				<version>4.5.13</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.httpcomponents</groupId>
+				<artifactId>httpmime</artifactId>
+				<version>4.5.13</version>
+			</dependency>
+			<!-- END Apache Jackrabbit dependencies -->
+	
+			<!-- START Apache Jackrabbit FileVault dependencies -->
+			<dependency>
+				<groupId>org.apache.jackrabbit.vault</groupId>
+				<artifactId>vault-davex</artifactId>
+				<version>${vault.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.jackrabbit.vault</groupId>
+				<artifactId>org.apache.jackrabbit.vault</artifactId>
+				<version>${vault.version}</version>
+			</dependency>
+			<!-- END Apache Jackrabbit FileVault dependencies -->
+    	</dependencies>
+    </dependencyManagement>
+    
+    <properties>
+		<sling.java.version>11</sling.java.version>
+		<minimalJavaBuildVersion>11</minimalJavaBuildVersion>
+		<!-- must match the version being referenced in the pom.xml of filevault -->
+		<jackrabbit.version>2.20.6</jackrabbit.version>
+        <oak.version>1.44.0</oak.version>
+		<vault.version>3.6.4</vault.version>
+    </properties>
+</project>
diff --git a/shared/modules/pom.xml b/shared/pom.xml
similarity index 91%
rename from shared/modules/pom.xml
rename to shared/pom.xml
index 1be41e5..8aa2211 100644
--- a/shared/modules/pom.xml
+++ b/shared/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.apache</groupId>
         <artifactId>apache</artifactId>
-        <version>14</version>
+        <version>27</version>
     </parent>
     <groupId>org.apache.sling.ide</groupId>
     <artifactId>sling-ide-tooling-shared</artifactId>
@@ -40,4 +40,9 @@
         <module>artifacts</module>
         <module>sync-fs</module>
     </modules>
+    
+    <properties>
+        <maven.compiler.target>11</maven.compiler.target>
+        <minimalJavaBuildVersion>11</minimalJavaBuildVersion>
+    </properties>
 </project>
diff --git a/shared/modules/sync-fs/.project b/shared/sync-fs/.project
similarity index 72%
rename from shared/modules/sync-fs/.project
rename to shared/sync-fs/.project
index 4c63d87..ba16487 100644
--- a/shared/modules/sync-fs/.project
+++ b/shared/sync-fs/.project
@@ -11,16 +11,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/shared/modules/sync-fs/bnd.bnd b/shared/sync-fs/bnd.bnd
similarity index 100%
rename from shared/modules/sync-fs/bnd.bnd
rename to shared/sync-fs/bnd.bnd
diff --git a/shared/modules/sync-fs/pom.xml b/shared/sync-fs/pom.xml
similarity index 91%
rename from shared/modules/sync-fs/pom.xml
rename to shared/sync-fs/pom.xml
index ce5177b..fa4622f 100644
--- a/shared/modules/sync-fs/pom.xml
+++ b/shared/sync-fs/pom.xml
@@ -30,24 +30,17 @@
         <url>https://gitbox.apache.org/repos/asf?p=sling-ide-tooling.git</url>
     </scm>
 
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>biz.aQute.bnd</groupId>
-                <artifactId>bnd-maven-plugin</artifactId>
-            </plugin>
-        </plugins>
-    </build>
-
     <dependencies>
         <dependency>
             <groupId>org.apache.sling.ide</groupId>
             <artifactId>org.apache.sling.ide.api</artifactId>
             <version>${project.version}</version>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
+            <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
@@ -57,6 +50,7 @@
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
+            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.hamcrest</groupId>
@@ -87,7 +81,4 @@
             <scope>provided</scope>
         </dependency>
     </dependencies>
-    <properties>
-        <sling.java.version>8</sling.java.version>
-    </properties>
 </project>
diff --git a/shared/modules/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/FSResources.java b/shared/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/FSResources.java
similarity index 100%
rename from shared/modules/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/FSResources.java
rename to shared/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/FSResources.java
diff --git a/shared/modules/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceDirectory.java b/shared/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceDirectory.java
similarity index 100%
rename from shared/modules/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceDirectory.java
rename to shared/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceDirectory.java
diff --git a/shared/modules/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceFile.java b/shared/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceFile.java
similarity index 100%
rename from shared/modules/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceFile.java
rename to shared/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceFile.java
diff --git a/shared/modules/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceProject.java b/shared/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceProject.java
similarity index 100%
rename from shared/modules/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceProject.java
rename to shared/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceProject.java
diff --git a/shared/modules/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceResource.java b/shared/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceResource.java
similarity index 100%
rename from shared/modules/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceResource.java
rename to shared/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceResource.java
diff --git a/shared/modules/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/package-info.java b/shared/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/package-info.java
similarity index 100%
rename from shared/modules/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/package-info.java
rename to shared/sync-fs/src/main/java/org/apache/sling/ide/content/sync/fs/package-info.java
diff --git a/shared/modules/sync-fs/src/test/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceDirectoryTest.java b/shared/sync-fs/src/test/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceDirectoryTest.java
similarity index 100%
rename from shared/modules/sync-fs/src/test/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceDirectoryTest.java
rename to shared/sync-fs/src/test/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceDirectoryTest.java
diff --git a/shared/modules/sync-fs/src/test/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceFileTest.java b/shared/sync-fs/src/test/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceFileTest.java
similarity index 100%
rename from shared/modules/sync-fs/src/test/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceFileTest.java
rename to shared/sync-fs/src/test/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceFileTest.java
diff --git a/shared/modules/sync-fs/src/test/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceProjectTest.java b/shared/sync-fs/src/test/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceProjectTest.java
similarity index 100%
rename from shared/modules/sync-fs/src/test/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceProjectTest.java
rename to shared/sync-fs/src/test/java/org/apache/sling/ide/content/sync/fs/impl/FSWorkspaceProjectTest.java
diff --git a/shared/modules/sync-fs/src/test/java/org/apache/sling/ide/content/sync/fs/impl/MockFilterLocator.java b/shared/sync-fs/src/test/java/org/apache/sling/ide/content/sync/fs/impl/MockFilterLocator.java
similarity index 100%
rename from shared/modules/sync-fs/src/test/java/org/apache/sling/ide/content/sync/fs/impl/MockFilterLocator.java
rename to shared/sync-fs/src/test/java/org/apache/sling/ide/content/sync/fs/impl/MockFilterLocator.java