Add `repository`
diff --git a/buildSrc/src/main/groovy/virgo.java-conventions.gradle b/buildSrc/src/main/groovy/virgo.java-conventions.gradle
index 09b7850..7b22688 100644
--- a/buildSrc/src/main/groovy/virgo.java-conventions.gradle
+++ b/buildSrc/src/main/groovy/virgo.java-conventions.gradle
@@ -24,6 +24,9 @@
         implementation "ch.qos.logback:logback-core:${logbackVersion}"
         implementation "ch.qos.logback:logback-classic:${logbackVersion}"
 
+        implementation "org.apache.httpcomponents:httpcore:${httpcoreVersion}"
+        implementation "org.apache.httpcomponents:httpclient:${httpclientVersion}"
+
         // Eclipse Kepler 4.3.2 (SR2) - local Maven mirror
         implementation "org.eclipse.platform:org.eclipse.osgi:${equinoxVersion}"
         implementation "org.eclipse.platform:org.eclipse.osgi.services:${osgiServicesVersion}"
diff --git a/gradle.properties b/gradle.properties
index c641b7a..ce91d58 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -150,13 +150,14 @@
 commonsDbcpVersion = 1.4.0.v201204271417
 # CQ12541 (PB CQ12051) 1.3.2+
 commonsFileuploadVersion = 1.3.3
-# CQ3956 (PB CQ1765)
-commonsHttpClientVersion = 3.1.0
 
-# CQ9555 (PB Orbit CQ8938)
-httpcomponentsCoreVersion = 4.3.3
-# CQ9556 (PB Orbit CQ8934)
-httpcomponentsClientVersion = 4.3.6
+# CQ3956 (PB CQ1765)
+#commonsHttpClientVersion = 3.1.0
+
+# CQ9555 (PB Orbit CQ8938) Version 4.3.3
+httpcoreVersion = 4.4.12
+# CQ9556 (PB Orbit CQ8934) Version 4.3.6
+httpclientVersion = 4.5.10
 
 # CQ13049
 commonsIoVersion = 2.5
diff --git a/packaging/kernel/build.gradle b/packaging/kernel/build.gradle
index ba1be61..5afc144 100644
--- a/packaging/kernel/build.gradle
+++ b/packaging/kernel/build.gradle
@@ -21,3 +21,11 @@
         }
     }
 }
+
+tasks.register('publishVirgoKernel', PublishProduct) {
+    product = 'kernel'
+    productFileLocation = file("${projectDir}/publish_resources/products/${product}/${product}.product")
+    javaProfileLocation = file("${projectDir}/src/main/dist/configuration/java-server.profile")
+}
+
+distZip.dependsOn(['publishVirgoKernel'])
diff --git a/packaging/kernel/build.gradle.inactive b/packaging/kernel/build.gradle.inactive
index 6633cc5..dd4f832 100644
--- a/packaging/kernel/build.gradle.inactive
+++ b/packaging/kernel/build.gradle.inactive
@@ -1,5 +1,11 @@
 import org.apache.tools.ant.filters.ReplaceTokens
 
+//import static VirgoToolsPlugin.DOWNLOAD_VIRGO_BUILD_TOOLS_TASK_NAME
+//import static VirgoToolsPlugin.installProduct
+//import static VirgoToolsPlugin.publishProduct
+
+//import Config
+
 apply plugin: 'distribution'
 
 distributions {
@@ -20,3 +26,53 @@
         }
     }
 }
+
+task ('assembleKernel', dependsOn: [
+    'installProductKernel',
+    'packageResourcesAndProducts'
+]) {
+    installDist.dependsOn(['assembleKernel'])
+    distZip.dependsOn(['assembleKernel'])
+}
+
+task ('packageResourcesAndProducts', dependsOn: [
+//    ':kernel:org.eclipse.virgo.kernel.equinox.extensions:jar',
+//    ':kernel:org.eclipse.virgo.management.console:war',
+    ':nano:org.eclipse.virgo.nano.authentication:jar',
+    ':nano:org.eclipse.virgo.nano.shutdown:jar',
+    ':util:org.eclipse.virgo.util.env:jar',
+]) {
+    doLast {
+        packageConfiguration('lib', configurations.nanoLib, file("${buildDir}/common_resources/lib/"))
+        packageConfiguration('libPersistence', configurations.nanoLibPersistence, file("${buildDir}/common_resources/lib/persistence/"))
+        packageConfiguration('libEndorsed', configurations.nanoLibEndorsed, file("${buildDir}/common_resources/lib/endorsed/"))
+        packageConfiguration('pluginsExtras', configurations.kernelPluginsExtras, file("${buildDir}/common_resources/plugins"))
+        packageConfiguration('repositoryExt', configurations.repositoryExt, file("${buildDir}/common_resources/repository/ext"))
+        packageConfiguration('pickup', configurations.nanoPickup, file("${buildDir}/common_resources/pickup/"))
+    }
+}
+
+task ('publishKernel', dependsOn: [
+    ':org.eclipse.virgo.site:publishBase',
+    ':org.eclipse.virgo.site:publishKernelBase',
+]) {
+    description = "Publishes a product to a p2 repository. The publishing uses ANY environment configurations."
+
+    def product = 'kernel'
+    def productFileLocation = file("${projectDir}/publish_resources/products/${product}/${product}.product")
+    def javaProfileLocation = file("${projectDir}/src/main/dist/configuration/java-server.profile")
+
+    doLast() { publishProduct(project, productFileLocation, javaProfileLocation) }
+}
+
+task ('installProductKernel', dependsOn: ['publishKernel',]) {
+
+    description = "Installs a Virgo product to a desired destination. Default profile(roaming) is VIRGOProfile, the environment cofigurations are ANY."
+
+    def product = 'kernel'
+    def shortProduct = 'VK'
+    def destinationDir = file("${buildDir}/${shortProduct}/${product}")
+    def productIu = "${product}.product"
+
+    doLast() { installProduct(project, productIu, destinationDir) }
+}
diff --git a/repository/build.gradle b/repository/build.gradle.inactive
similarity index 100%
rename from repository/build.gradle
rename to repository/build.gradle.inactive
diff --git a/repository/org.eclipse.virgo.repository/build.gradle b/repository/org.eclipse.virgo.repository/build.gradle
new file mode 100644
index 0000000..42aa152
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/build.gradle
@@ -0,0 +1,35 @@
+plugins {
+	id 'virgo.java-conventions'
+}
+
+project(':repository:org.eclipse.virgo.repository') {
+    dependencies {
+		implementation project(':util:org.eclipse.virgo.util.common')
+		implementation project(':util:org.eclipse.virgo.util.io')
+		implementation project(':util:org.eclipse.virgo.util.jmx')
+		implementation project(':util:org.eclipse.virgo.util.math')
+		implementation project(':util:org.eclipse.virgo.util.osgi')
+		implementation project(':util:org.eclipse.virgo.util.osgi.manifest')
+		implementation project(':medic:org.eclipse.virgo.medic')
+
+        implementation 'org.slf4j:slf4j-api'
+        implementation 'org.eclipse.platform:org.eclipse.osgi'
+
+		implementation 'org.apache.httpcomponents:httpcore'
+		implementation 'org.apache.httpcomponents:httpclient'
+
+//		testimplementation group: 'org.easymock', name: 'easymock', version: easymockVersion
+
+		testImplementation project(':medic:org.eclipse.virgo.medic.test')
+		testImplementation project(':test:org.eclipse.virgo.test.stubs')
+//		testImplementation group: 'org.eclipse.virgo.mirrored', name: 'org.apache.commons.codec', version: commonsCodecVersion, ext: "jar"
+//		testImplementation group: 'org.eclipse.virgo.mirrored', name: 'org.apache.commons.logging', version: commonsLoggingVersion, ext: "jar"
+
+//		testRuntime "org.aspectj:aspectjrt:${project.aspectjVersion}"
+//
+//		if (System.properties['weaving.enabled'] == 'true') {
+//            aspectpath project(':medic:org.eclipse.virgo.medic')
+//            aspectpath project(':util:org.eclipse.virgo.util.jmx')
+//        }
+	}
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/ArtifactDescriptorStoreWatcher.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/ArtifactDescriptorStoreWatcher.java
index f9e65ea..0153a2f 100644
--- a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/ArtifactDescriptorStoreWatcher.java
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/ArtifactDescriptorStoreWatcher.java
@@ -11,18 +11,20 @@
 
 package org.eclipse.virgo.repository.internal.remote;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.zip.GZIPInputStream;
-
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpStatus;
-import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.http.Header;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
 import org.eclipse.virgo.repository.configuration.RemoteRepositoryConfiguration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.zip.GZIPInputStream;
+
 
 final class ArtifactDescriptorStoreWatcher {
 
@@ -42,17 +44,17 @@
 
     static final class StoreUpdaterThread extends Thread {
 
+        private static final Logger LOGGER = LoggerFactory.getLogger(StoreUpdaterThread.class);
+
         private static final String RESPONSE_HEADER_ETAG = "Etag";
-        
-        private static final String REPONSE_HEADER_CONTENT_ENCODING = "Content-Encoding";
-        
+
+        private static final String RESPONSE_HEADER_CONTENT_ENCODING = "Content-Encoding";
+
         private static final String CONTENT_ENCODING_GZIP = "gzip";
 
         private static final String REQUEST_HEADER_IF_NONE_MATCH = "If-None-Match";
 
-        private static final Logger LOGGER = LoggerFactory.getLogger(StoreUpdaterThread.class);
-
-        private final HttpClient httpClient = new HttpClient();
+        private final CloseableHttpClient httpClient = HttpClients.createDefault();
 
         private final long msUpdateInterval;
 
@@ -84,22 +86,23 @@
             DescriptorStore descriptorStore = descriptorStoreFactory.recoverDescriptorStore();
 
             while (this.update) {
-                GetMethod getIndex = new GetMethod(this.repositoryUri);
+                HttpGet getIndex = new HttpGet(this.repositoryUri);
 
                 if (descriptorStore != null) {
-                    getIndex.addRequestHeader(REQUEST_HEADER_IF_NONE_MATCH, descriptorStore.getEtag());
+                    getIndex.addHeader(REQUEST_HEADER_IF_NONE_MATCH, descriptorStore.getEtag());
                 }
 
                 int responseCode;
                 try {
-                    responseCode = this.httpClient.executeMethod(getIndex);
+                    CloseableHttpResponse response = httpClient.execute(getIndex);
+                    responseCode = response.getStatusLine().getStatusCode();
                     if (this.countContiguousHttpClientFailures > 0) {
                         LOGGER.info(String.format("Remote repository '%s' re-accessed after failure.", this.repositoryName));
                         this.countContiguousHttpClientFailures = 0;
                     }
                     if (responseCode == HttpStatus.SC_OK || responseCode == HttpStatus.SC_NOT_MODIFIED) {
                         if (responseCode == HttpStatus.SC_OK) {
-                            descriptorStore = readNewDescriptorStore(getIndex);
+                            descriptorStore = readNewDescriptorStore(response);
                         }
                         this.mutableDepository.setDescriptorStore(descriptorStore);
                     } else {
@@ -134,18 +137,18 @@
                 this.repositoryName));
         }
 
-        private String getETag(GetMethod getIndex) {
-            Header responseHeader = getIndex.getResponseHeader(RESPONSE_HEADER_ETAG);
+        private String getETag(CloseableHttpResponse response) {
+            Header responseHeader = response.getFirstHeader(RESPONSE_HEADER_ETAG);
             return responseHeader == null ? null : responseHeader.getValue();
         }
 
-        private DescriptorStore readNewDescriptorStore(GetMethod getDescriptorStore) {
+        private DescriptorStore readNewDescriptorStore(CloseableHttpResponse response) {
             try {
-                String etag = getETag(getDescriptorStore);
+                String etag = getETag(response);
                 
-                InputStream storeStream = getDescriptorStore.getResponseBodyAsStream();
+                InputStream storeStream = response.getEntity().getContent();
                 
-                Header contentEncodingResponseHeader = getDescriptorStore.getResponseHeader(REPONSE_HEADER_CONTENT_ENCODING);
+                Header contentEncodingResponseHeader = response.getFirstHeader(RESPONSE_HEADER_CONTENT_ENCODING);
                 if (contentEncodingResponseHeader != null && CONTENT_ENCODING_GZIP.equals(contentEncodingResponseHeader.getValue())) {
                     storeStream = new GZIPInputStream(storeStream);
                 }
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/eventlog/DynamicDelegationEventLoggerTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/eventlog/DynamicDelegationEventLoggerTests.java
index cd8f581..8e73d93 100644
--- a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/eventlog/DynamicDelegationEventLoggerTests.java
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/eventlog/DynamicDelegationEventLoggerTests.java
@@ -21,17 +21,13 @@
 import org.eclipse.virgo.medic.eventlog.Level;
 import org.eclipse.virgo.medic.eventlog.LogEvent;
 import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
-import org.eclipse.virgo.repository.internal.eventlog.DynamicDelegationEventLogger;
 import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
 import org.eclipse.virgo.test.stubs.support.ObjectClassFilter;
 
-
-/** 
- */
 public class DynamicDelegationEventLoggerTests {
     
 	@Test
-    public void dynamicDelegation() throws Exception {
+    public void dynamicDelegation() {
         StubBundleContext bundleContext = new StubBundleContext();
         bundleContext.addFilter(new ObjectClassFilter(EventLogger.class));
         
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/remote/RemoteRepositoryTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/remote/RemoteRepositoryTests.java
index 12aabae..98c9cdd 100644
--- a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/remote/RemoteRepositoryTests.java
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/remote/RemoteRepositoryTests.java
@@ -34,7 +34,7 @@
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
-import org.apache.commons.httpclient.HttpStatus;
+import org.apache.http.HttpStatus;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -53,7 +53,6 @@
 import org.eclipse.virgo.repository.configuration.StubRepositoryConfiguration;
 import org.eclipse.virgo.repository.internal.PersistentRepository;
 import org.eclipse.virgo.repository.internal.RepositoryLogEvents;
-import org.eclipse.virgo.repository.internal.remote.RemoteRepository;
 import org.eclipse.virgo.repository.management.RepositoryInfo;
 import org.eclipse.virgo.util.io.FileCopyUtils;
 import org.eclipse.virgo.util.io.NetUtils;
diff --git a/settings.gradle b/settings.gradle
index f4a34c8..b03f191 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -17,7 +17,7 @@
 //include ':medic:org.eclipse.virgo.medic.logbackcorefragment'
 //include ':medic:org.eclipse.virgo.medic.logbackclassicfragment'
 
-//include ':repository:org.eclipse.virgo.repository'
+include ':repository:org.eclipse.virgo.repository'
 
 include ':nano:org.eclipse.virgo.nano.authentication'
 include ':nano:org.eclipse.virgo.nano.core'