You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ud...@apache.org on 2020/07/02 18:10:51 UTC

[geode] 15/29: GEODE-8294 - Integrate ModuleService into Geode.

This is an automated email from the ASF dual-hosted git repository.

udo pushed a commit to branch feature/GEODE-8294
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 3599be653211fbc514eadbc1edb5e401d6fbd5bf
Author: Patrick Johnson <pj...@pivotal.io>
AuthorDate: Thu Jun 11 11:09:03 2020 -0700

    GEODE-8294 - Integrate ModuleService into Geode.
---
 .../src/test/resources/expected-pom.xml            |   30 +
 .../gradle/plugins/DependencyConstraints.groovy    |   11 +-
 geode-assembly/build.gradle                        | 1082 ++++-----
 geode-book/.gitignore                              |    2 -
 geode-book/Gemfile                                 |   22 -
 geode-book/Gemfile.lock                            |  207 --
 geode-book/README.md                               |  115 -
 geode-book/config.yml                              |   48 -
 .../source/archive_menus/_default.erb              |   28 -
 .../source/images/Apache_Geode_logo_symbol.png     |  Bin 13871 -> 0 bytes
 .../images/Apache_Geode_logo_symbol_white.png      |  Bin 21485 -> 0 bytes
 .../master_middleman/source/images/favicon.ico     |  Bin 1317 -> 0 bytes
 .../master_middleman/source/javascripts/book.js    |   31 -
 .../source/javascripts/waypoints/context.js        |  315 ---
 .../source/javascripts/waypoints/group.js          |  120 -
 .../javascripts/waypoints/noframeworkAdapter.js    |  228 --
 .../source/javascripts/waypoints/sticky.js         |   78 -
 .../source/javascripts/waypoints/waypoint.js       |  175 --
 .../source/layouts/_book-footer.erb                |   23 -
 .../source/layouts/_local-header.erb               |   27 -
 .../master_middleman/source/layouts/_title.erb     |   21 -
 .../source/stylesheets/book-styles.scss            |   18 -
 .../stylesheets/partials/_book-base-values.scss    |   14 -
 .../source/stylesheets/partials/_book-vars.scss    |   33 -
 .../source/subnavs/geode-subnav.erb                | 2518 --------------------
 geode-book/redirects.rb                            |   18 -
 geode-common-services/build.gradle                 |   36 -
 .../services/management/ManagementService.java     |    8 +-
 .../geode/services/module/ModuleDescriptor.java    |   19 +-
 .../geode/services/module/ModuleService.java       |   57 +-
 .../apache/geode/services/result/impl/Failure.java |    0
 .../apache/geode/services/result/impl/Success.java |    0
 geode-common/build.gradle                          |   37 -
 geode-connectors/build.gradle                      |    5 +
 geode-core/build.gradle                            |   12 +-
 ...utedSystemBuilderForTestingIntegrationTest.java |   10 +-
 ...nalDistributedSystemBuilderIntegrationTest.java |   14 +-
 .../InternalDistributedSystemJUnitTest.java        |   11 +-
 ...DistributedSystemLockMemoryIntegrationTest.java |   16 +-
 ...alDistributedSystemSecurityIntegrationTest.java |    6 +-
 .../java/org/apache/geode/cache/CacheFactory.java  |    6 +
 .../geode/cache/client/ClientCacheFactory.java     |    4 +-
 .../geode/distributed/DistributedSystem.java       |    4 +-
 .../internal/InternalDistributedSystem.java        |   58 +-
 .../distributed/internal/InternalLocator.java      |    2 +
 .../apache/geode/internal/cache/CacheConfig.java   |   10 +
 .../geode/internal/cache/GemFireCacheImpl.java     |   29 +-
 .../geode/internal/cache/InternalCacheBuilder.java |   11 +-
 ...rnalDistributedSystemStatisticsManagerTest.java |   20 +-
 ...ernalCacheBuilderAllowsMultipleSystemsTest.java |    2 +-
 .../internal/cache/InternalCacheBuilderTest.java   |    4 +-
 .../util/InternalCacheBuilderTestUtil.java         |    5 +-
 geode-core/src/test/resources/expected-pom.xml     |   10 +-
 geode-cq/build.gradle                              |    6 +-
 .../build.gradle                                   |   16 +-
 .../org/apache/geode/graphing/Dependencies.java    |  139 ++
 .../src/test/resources/expected-pom.xml            |   12 +-
 geode-gfsh/build.gradle                            |    9 +-
 geode-http-service/build.gradle                    |    8 +-
 .../src/test/resources/expected-pom.xml            |    5 -
 .../build.gradle                                   |   31 +-
 .../bootstrapping/BootstrappingService.java        |    6 +-
 .../src/test/resources/expected-pom.xml            |    8 +-
 geode-logging/build.gradle                         |    3 +-
 geode-logging/src/test/resources/expected-pom.xml  |   13 +-
 geode-lucene/build.gradle                          |    4 +
 geode-membership/build.gradle                      |    5 +-
 .../membership/gms/messenger/JGroupsMessenger.java |   15 +
 .../build.gradle                                   |   35 +-
 .../impl/BootstrappingServiceImpl.java             |  126 +
 ...ode.services.bootstrapping.BootstrappingService |    1 +
 .../src/test/resources/expected-pom.xml            |   14 +-
 .../build.gradle                                   |   31 +-
 .../management/impl/ManagementServiceImpl.java     |   61 +
 ...che.geode.services.management.ManagementService |    1 +
 .../src/test/resources/expected-pom.xml            |    9 +-
 .../build.gradle                                   |   20 +-
 .../geode/services/module/impl/PrototypeTest.java  |   97 +
 .../geode/services/module/impl/PrototypeTest2.java |   97 +
 .../src/test/resources/expected-pom.xml            |   10 +-
 .../module/impl/JBossModuleServiceImpl.java        |   63 +-
 .../internal/finder/DelegatingModuleFinder.java    |   18 +-
 .../module/internal/loader/GeodeModuleLoader.java  |   30 +-
 .../main/java/org/jboss/modules/GeodeJDKPaths.java |  163 ++
 ...JarModuleFinder.java => GeodeModuleFinder.java} |  136 +-
 ...erviceImplWithoutPopulatedManifestFileTest.java |  117 +-
 ...esServiceImplWithPopulatedManifestFileTest.java |   25 +-
 .../jboss/modules/GeodeJarModuleFinderTest.java    |   31 +-
 geode-old-client-support/build.gradle              |    4 +
 geode-protobuf/build.gradle                        |    8 +-
 geode-redis/build.gradle                           |    5 +
 geode-wan/build.gradle                             |    9 +-
 gradle.properties                                  |    1 +
 settings.gradle                                    |   10 +-
 94 files changed, 1903 insertions(+), 5059 deletions(-)

diff --git a/boms/geode-all-bom/src/test/resources/expected-pom.xml b/boms/geode-all-bom/src/test/resources/expected-pom.xml
index 3807199..1078e67 100644
--- a/boms/geode-all-bom/src/test/resources/expected-pom.xml
+++ b/boms/geode-all-bom/src/test/resources/expected-pom.xml
@@ -554,6 +554,12 @@
         <scope>compile</scope>
       </dependency>
       <dependency>
+        <groupId>org.graphstream</groupId>
+        <artifactId>gs-core</artifactId>
+        <version>1.3</version>
+        <scope>compile</scope>
+      </dependency>
+      <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-annotations</artifactId>
         <version>2.10.1</version>
@@ -957,6 +963,12 @@
       </dependency>
       <dependency>
         <groupId>org.apache.geode</groupId>
+        <artifactId>geode-launcher</artifactId>
+        <version>${version}</version>
+        <scope>compile</scope>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.geode</groupId>
         <artifactId>geode-log4j</artifactId>
         <version>${version}</version>
         <scope>compile</scope>
@@ -993,12 +1005,30 @@
       </dependency>
       <dependency>
         <groupId>org.apache.geode</groupId>
+        <artifactId>geode-module-bootstrapping</artifactId>
+        <version>${version}</version>
+        <scope>compile</scope>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.geode</groupId>
+        <artifactId>geode-module-management</artifactId>
+        <version>${version}</version>
+        <scope>compile</scope>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.geode</groupId>
         <artifactId>geode-modules</artifactId>
         <version>${version}</version>
         <scope>compile</scope>
       </dependency>
       <dependency>
         <groupId>org.apache.geode</groupId>
+        <artifactId>geode-modules-proto</artifactId>
+        <version>${version}</version>
+        <scope>compile</scope>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.geode</groupId>
         <artifactId>geode-old-client-support</artifactId>
         <version>${version}</version>
         <scope>compile</scope>
diff --git a/buildSrc/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraints.groovy b/buildSrc/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraints.groovy
index bb3ea96..3e9757d 100644
--- a/buildSrc/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraints.groovy
+++ b/buildSrc/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraints.groovy
@@ -21,14 +21,14 @@ import org.gradle.api.Project
 class DependencyConstraints implements Plugin<Project> {
   /** By necessity, the version of those plugins used in the build-scripts are defined in the
    * buildscript {} configuration in the root project's build.gradle. */
-  static Map<String,String> disparateDependencies = initExternalDependencies()
+  static Map<String, String> disparateDependencies = initExternalDependencies()
 
   static String get(String name) {
     return disparateDependencies.get(name)
   }
 
   static private Map<String, String> initExternalDependencies() {
-    Map<String,String> deps = new HashMap<>()
+    Map<String, String> deps = new HashMap<>()
     // These versions are consumed beyond the scope of source set dependencies.
 
     deps.put("jboss-modules.version", "1.10.1.Final")
@@ -77,7 +77,7 @@ class DependencyConstraints implements Plugin<Project> {
   void apply(Project project) {
     def dependencySet = { Map<String, String> group_and_version, Closure closure ->
       DependencySetHandler delegate =
-          new DependencySetHandler(group_and_version.get("group"), group_and_version.get("version"), project)
+              new DependencySetHandler(group_and_version.get("group"), group_and_version.get("version"), project)
       closure.setDelegate(delegate)
       closure.call(delegate)
     }
@@ -100,12 +100,12 @@ class DependencyConstraints implements Plugin<Project> {
         api(group: 'com.google.protobuf', name: 'protobuf-java', version: get('protobuf-java.version'))
         api(group: 'com.healthmarketscience.rmiio', name: 'rmiio', version: '2.1.2')
         api(group: 'com.mockrunner', name: 'mockrunner-servlet', version: '2.0.4')
-        api(group: 'com.nimbusds', name:'nimbus-jose-jwt', version:'8.11')
+        api(group: 'com.nimbusds', name: 'nimbus-jose-jwt', version: '8.11')
         api(group: 'com.sun.activation', name: 'javax.activation', version: '1.2.0')
         api(group: 'com.sun.istack', name: 'istack-commons-runtime', version: '3.0.11')
         api(group: 'com.sun.mail', name: 'javax.mail', version: '1.6.2')
         api(group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '2.3.2')
-        api(group: 'com.tngtech.archunit', name:'archunit-junit4', version: '0.12.0')
+        api(group: 'com.tngtech.archunit', name: 'archunit-junit4', version: '0.12.0')
         api(group: 'com.zaxxer', name: 'HikariCP', version: '3.4.2')
         api(group: 'commons-beanutils', name: 'commons-beanutils', version: '1.9.4')
         api(group: 'commons-codec', name: 'commons-codec', version: '1.14')
@@ -172,6 +172,7 @@ class DependencyConstraints implements Plugin<Project> {
         api(group: 'pl.pragmatists', name: 'JUnitParams', version: '1.1.0')
         api(group: 'redis.clients', name: 'jedis', version: '3.2.0')
         api(group: 'xerces', name: 'xercesImpl', version: '2.12.0')
+        api(group: 'org.graphstream', name: 'gs-core', version: '1.3')
       }
     }
 
diff --git a/geode-assembly/build.gradle b/geode-assembly/build.gradle
index 134cbe7..b10d5a1 100755
--- a/geode-assembly/build.gradle
+++ b/geode-assembly/build.gradle
@@ -27,47 +27,50 @@ import java.nio.file.Paths
 
 // This list is used in a loop to defined the /lib copySpec
 def dependentProjectNames = [
-  ':geode-common',
-  ':geode-common-services',
-  ':geode-connectors',
-  ':geode-core',
-  ':geode-cq',
-  ':geode-gfsh',
-  ':geode-log4j',
-  ':geode-logging',
-  ':geode-lucene',
-  ':geode-memcached',
-  ':geode-modules',
-  ':geode-old-client-support',
-  ':geode-protobuf',
-  ':geode-protobuf-messages',
-  ':geode-rebalancer',
-  ':geode-redis',
-  ':geode-serialization',
-  ':geode-tcp-server',
-  ':geode-wan'
+        ':geode-common',
+        ':geode-common-services',
+        ':geode-connectors',
+        ':geode-core',
+        ':geode-cq',
+        ':geode-gfsh',
+        ':geode-log4j',
+        ':geode-logging',
+        ':geode-lucene',
+        ':geode-memcached',
+        ':geode-modules',
+        ':geode-old-client-support',
+        ':geode-protobuf',
+        ':geode-protobuf-messages',
+        ':geode-rebalancer',
+        ':geode-redis',
+        ':geode-serialization',
+        ':geode-tcp-server',
+        ':geode-wan',
+        ':geode-module-management',
+        ':geode-module-bootstrapping',
+        ':geode-launcher'
 ]
 
 // These other dependencies are explicitly referenced throughout other copySpec
 def otherDependentProjectNames = [
-  ':extensions:geode-modules',
-  ':extensions:geode-modules-assembly',
-  ':extensions:geode-modules-session',
-  ':extensions:geode-modules-session',
-  ':extensions:geode-modules-tomcat7',
-  ':extensions:geode-modules-tomcat8',
-  ':extensions:geode-modules-tomcat9',
-  ':geode-experimental-driver',
-  ':geode-management',
-  ':geode-pulse',
-  ':geode-web',
-  ':geode-web-api',
-  ':geode-web-management',
+        ':extensions:geode-modules',
+        ':extensions:geode-modules-assembly',
+        ':extensions:geode-modules-session',
+        ':extensions:geode-modules-session',
+        ':extensions:geode-modules-tomcat7',
+        ':extensions:geode-modules-tomcat8',
+        ':extensions:geode-modules-tomcat9',
+        ':geode-experimental-driver',
+        ':geode-management',
+        ':geode-pulse',
+        ':geode-web',
+        ':geode-web-api',
+        ':geode-web-management',
 ]
 
 evaluationDependsOnChildren()
 (dependentProjectNames + otherDependentProjectNames).each { neighborProjectName ->
-  project.evaluationDependsOn(neighborProjectName)
+    project.evaluationDependsOn(neighborProjectName)
 }
 
 apply plugin: 'distribution'
@@ -79,246 +82,246 @@ apply from: "${rootDir}/${scriptDir}/publish-common.gradle"
 // in the geode-all-bom.
 project.ext.set('constrainVersionInBom', false)
 
-project.ext {artifactName = 'apache-geode'}
+project.ext { artifactName = 'apache-geode' }
 
 configurations {
-  compositeTarget {
-    setDescription("Composite builds wishing to consume this apache-geode@tgz artifact must specify \"targetConfiguration = 'compositeTarget'\" for correct composite task dependency detection.")
-  }
-
-  gfshDependencies
-
-  // Configurations used to download and cache web application servers for session module testing
-  webServerTomcat6
-  webServerTomcat7
-  webServerTomcat8
-  webServerTomcat9
-  webServerJetty
-
-  geodeArchives {
-    setDescription("An 'archives' configuration without the legacy publication implications")
-  }
-
-  javadocOnly {
-    setDescription('Projects that must be included in the JavaDocs.')
-    extendsFrom geodeArchives
-  }
+    compositeTarget {
+        setDescription("Composite builds wishing to consume this apache-geode@tgz artifact must specify \"targetConfiguration = 'compositeTarget'\" for correct composite task dependency detection.")
+    }
+
+    gfshDependencies
+
+    // Configurations used to download and cache web application servers for session module testing
+    webServerTomcat6
+    webServerTomcat7
+    webServerTomcat8
+    webServerTomcat9
+    webServerJetty
+
+    geodeArchives {
+        setDescription("An 'archives' configuration without the legacy publication implications")
+    }
+
+    javadocOnly {
+        setDescription('Projects that must be included in the JavaDocs.')
+        extendsFrom geodeArchives
+    }
 }
 
 publishing {
-  publications {
-    maven(MavenPublication) {
-      artifactId = artifactName
-      artifact source: distTar, extension: 'tgz'
+    publications {
+        maven(MavenPublication) {
+            artifactId = artifactName
+            artifact source: distTar, extension: 'tgz'
+        }
     }
-  }
 }
 
-gradle.taskGraph.whenReady( { graph ->
-  tasks.withType(AbstractArchiveTask).findAll {
-    it.name.toLowerCase().contains("dist")
-  }.each { archive ->
-    archive.doLast {
-      ant.checksum file:"${archive.archivePath}", algorithm:"sha-256", format: 'MD5SUM', fileext: '.sha256'
+gradle.taskGraph.whenReady({ graph ->
+    tasks.withType(AbstractArchiveTask).findAll {
+        it.name.toLowerCase().contains("dist")
+    }.each { archive ->
+        archive.doLast {
+            ant.checksum file: "${archive.archivePath}", algorithm: "sha-256", format: 'MD5SUM', fileext: '.sha256'
+        }
     }
-  }
 })
 
 artifacts {
-  compositeTarget distTar
+    compositeTarget distTar
 }
 
 //This "repository" only exists to download tomcat-6, because the zip for tomcat 6 is
 //not in a maven repo. Later versions of tomcat are.
 repositories {
-  ivy {
-    url 'https://archive.apache.org/'
-    patternLayout {
-      artifact '/dist/tomcat/tomcat-6/v6.0.37/bin/[organisation]-[module]-[revision].[ext]'
-    }
-  }
-  // For gradle tooling dependencies
-  maven {
-    url 'https://repo.gradle.org/gradle/libs-releases'
-  }
-  // docker-compose-rule is published on bintray
-  maven {
-    url 'https://dl.bintray.com/palantir/releases'
-  }
+    ivy {
+        url 'https://archive.apache.org/'
+        patternLayout {
+            artifact '/dist/tomcat/tomcat-6/v6.0.37/bin/[organisation]-[module]-[revision].[ext]'
+        }
+    }
+    // For gradle tooling dependencies
+    maven {
+        url 'https://repo.gradle.org/gradle/libs-releases'
+    }
+    // docker-compose-rule is published on bintray
+    maven {
+        url 'https://dl.bintray.com/palantir/releases'
+    }
 }
 
 def webServersDir = "$buildDir/generated-resources/webservers"
 
 sourceSets {
-  distributedTest {
-    resources {
-      srcDirs webServersDir
+    distributedTest {
+        resources {
+            srcDirs webServersDir
+        }
+        output.dir(webServersDir, builtBy: 'downloadWebServers')
     }
-    output.dir(webServersDir, builtBy: 'downloadWebServers')
-  }
 }
 
-task downloadWebServers(type:Copy) {
-  from {configurations.findAll {it.name.startsWith("webServer")}}
-  into webServersDir
+task downloadWebServers(type: Copy) {
+    from { configurations.findAll { it.name.startsWith("webServer") } }
+    into webServersDir
 }
 
 dependencies {
-  compile(platform(project(':boms:geode-all-bom')))
-  gfshDependencies(platform(project(':boms:geode-all-bom')))
-
-  dependentProjectNames.each {
-    geodeArchives(project(it))
-  }
-  geodeArchives project(':geode-management')
-  geodeArchives project(path: ':geode-web', configuration: 'war')
-  geodeArchives project(path: ':geode-web-api', configuration: 'war')
-  geodeArchives project(path: ':geode-web-management', configuration: 'war')
-
-  javadocOnly project(':extensions:geode-modules')
-  javadocOnly project(':extensions:geode-modules-session')
-  javadocOnly project(':extensions:geode-modules-session')
-  javadocOnly project(':extensions:geode-modules-tomcat7')
-  javadocOnly project(':extensions:geode-modules-tomcat9')
-  javadocOnly project(':extensions:geode-modules-tomcat8')
-  javadocOnly project(':geode-experimental-driver')
-
-  testImplementation(project(':geode-core'))
-  testImplementation(project(':geode-gfsh'))
-  testImplementation(project(':geode-junit')) {
-    exclude module: 'geode-core'
-  }
-  testImplementation(project(':geode-log4j')) {
-    exclude module: 'geode-core'
-  }
-  testRuntime(project(path: ':geode-old-versions', configuration: 'testOutput'))
-
-
-  acceptanceTestRuntimeOnly(project(path: ':geode-old-versions', configuration: 'testOutput'))
-
-
-  integrationTestImplementation(project(':geode-core'))
-  integrationTestImplementation(project(':geode-gfsh'))
-  integrationTestImplementation(project(':geode-log4j')) {
-    exclude module: 'geode-core'
-  }
-  integrationTestImplementation(project(':geode-junit')) {
-    exclude module: 'geode-core'
-  }
-  integrationTestImplementation(project(':geode-dunit')) {
-    exclude module: 'geode-core'
-  }
-  integrationTestImplementation(project(':geode-pulse'))
-  integrationTestImplementation(project(':geode-assembly:geode-assembly-test'))
-  integrationTestImplementation(project(':geode-logging'))
-  integrationTestImplementation('org.apache.httpcomponents:httpclient')
-  integrationTestImplementation('org.springframework:spring-beans')
-  integrationTestImplementation('org.springframework:spring-context')
-  integrationTestImplementation('org.springframework:spring-web')
-  integrationTestImplementation('org.springframework.security:spring-security-oauth2-core')
-  integrationTestImplementation('org.springframework.security:spring-security-oauth2-client')
-  integrationTestImplementation('org.springframework.security:spring-security-oauth2-jose')
-  integrationTestImplementation('javax.annotation:javax.annotation-api')
-  integrationTestImplementation('javax.servlet:javax.servlet-api')
-
-
-  integrationTestRuntimeOnly('io.swagger:swagger-annotations')
-  // these two modules are for testing only
-  integrationTestRuntimeOnly('com.fasterxml.jackson.datatype:jackson-datatype-joda')
-  integrationTestRuntimeOnly('joda-time:joda-time')
-
-
-  distributedTestCompileOnly(platform(project(':boms:geode-all-bom')))
-  distributedTestCompileOnly('io.swagger:swagger-annotations')
-  distributedTestImplementation(project(':geode-gfsh'))
-  distributedTestImplementation(project(':geode-logging'))
-  distributedTestImplementation(project(':geode-membership'))
-  distributedTestImplementation(project(':geode-serialization'))
-  distributedTestImplementation(project(':geode-tcp-server'))
-  distributedTestImplementation(project(':geode-core'))
-  distributedTestImplementation(project(':geode-log4j')) {
-    exclude module: 'geode-core'
-  }
-  distributedTestImplementation(project(':geode-dunit')){
-    exclude module: 'geode-core'
-  }
-  distributedTestImplementation(project(':extensions:session-testing-war'))
-  distributedTestImplementation(project(':geode-assembly:geode-assembly-test'))
-  distributedTestImplementation('org.apache.httpcomponents:httpclient')
-  distributedTestImplementation('org.springframework:spring-web')
-  distributedTestImplementation(project(':geode-management'))
-  distributedTestImplementation(project(':geode-web-management'))
-  distributedTestImplementation('com.arakelian:java-jq')
-  distributedTestImplementation('javax.servlet:javax.servlet-api')
-
-  distributedTestRuntimeOnly(project(':extensions:geode-modules-session-internal')) {
-    exclude group: 'org.apache.tomcat'
-  }
-  distributedTestRuntimeOnly('org.codehaus.cargo:cargo-core-uberjar')
-  distributedTestRuntimeOnly('io.swagger:swagger-annotations')
-  distributedTestRuntimeOnly(project(':geode-wan'))
-
-
-  // geodeArchives is a direct reflection of what is contained in geode-dependencies.jar. To that
-  // end only add _test_ dependencies to acceptanceTestCompile/Runtime. All other product
-  // dependencies should be a part of geodeArchives and should not need to be added as individual
-  // dependencies here.
-  acceptanceTestImplementation(configurations.geodeArchives)
-  acceptanceTestImplementation(project(':geode-dunit')) {
-    exclude module: 'geode-core'
-  }
-  acceptanceTestImplementation(project(':geode-assembly:geode-assembly-test'))
-
-  // This is used by 'gradle within gradle' tests. No need to bump this version; but if you do,
-  // don't have it be the same version as the outer gradle version.
-  acceptanceTestImplementation('org.gradle:gradle-tooling-api:5.1.1')
-
-  acceptanceTestImplementation('com.palantir.docker.compose:docker-compose-rule-core')
-  acceptanceTestImplementation('com.palantir.docker.compose:docker-compose-rule-junit4')
-
-  uiTestImplementation(project(':geode-core'))
-  uiTestImplementation(project(':geode-dunit')) {
-    exclude module: 'geode-core'
-  }
-  uiTestImplementation(project(':geode-pulse'))
-  uiTestImplementation(project(':geode-pulse:geode-pulse-test'))
-  uiTestImplementation(project(':geode-assembly:geode-assembly-test'))
-  uiTestImplementation('org.seleniumhq.selenium:selenium-api')
-  uiTestImplementation('org.seleniumhq.selenium:selenium-remote-driver')
-  uiTestImplementation('org.seleniumhq.selenium:selenium-support')
-
-  uiTestRuntimeOnly(project(':geode-core'))
-  uiTestRuntimeOnly('org.seleniumhq.selenium:selenium-chrome-driver')
-
-  upgradeTestImplementation(project(':geode-gfsh'))
-  upgradeTestImplementation(project(':geode-logging'))
-  upgradeTestImplementation(project(':geode-serialization'))
-  upgradeTestImplementation(project(':geode-core'))
-  upgradeTestImplementation(project(':geode-dunit')) {
-    exclude module: 'geode-core'
-  }
-  upgradeTestImplementation(project(':geode-assembly:geode-assembly-test'))
-
-  upgradeTestCompileOnly(platform(project(':boms:geode-all-bom')))
-  upgradeTestCompileOnly('io.swagger:swagger-annotations')
-
-  upgradeTestRuntimeOnly(project(path: ':geode-old-versions', configuration: 'testOutput'))
-  upgradeTestRuntimeOnly(project(':extensions:session-testing-war'))
-  upgradeTestRuntimeOnly('org.codehaus.cargo:cargo-core-uberjar')
-  upgradeTestRuntimeOnly('org.apache.httpcomponents:httpclient')
-  upgradeTestRuntime files({ downloadWebServers } )
-
-  //Web servers used for session module testing
-  webServerTomcat6('apache:tomcat:' + DependencyConstraints.get('tomcat6.version') + '@zip')
-  webServerTomcat7('org.apache.tomcat:tomcat:' + DependencyConstraints.get('tomcat7.version') + '@zip')
-  webServerTomcat8('org.apache.tomcat:tomcat:' + DependencyConstraints.get('tomcat8.version') + '@zip')
-  webServerTomcat9('org.apache.tomcat:tomcat:' + DependencyConstraints.get('tomcat9.version') + '@zip')
-  webServerJetty('org.eclipse.jetty:jetty-distribution:' + DependencyConstraints.get('jetty.version') + '@zip')
-
-  gfshDependencies ('org.springframework:spring-web') {
-    exclude module: 'spring-core'
-    exclude module: 'commons-logging'
-  }
+    compile(platform(project(':boms:geode-all-bom')))
+    gfshDependencies(platform(project(':boms:geode-all-bom')))
+
+    dependentProjectNames.each {
+        geodeArchives(project(it))
+    }
+    geodeArchives project(':geode-management')
+    geodeArchives project(path: ':geode-web', configuration: 'war')
+    geodeArchives project(path: ':geode-web-api', configuration: 'war')
+    geodeArchives project(path: ':geode-web-management', configuration: 'war')
+
+    javadocOnly project(':extensions:geode-modules')
+    javadocOnly project(':extensions:geode-modules-session')
+    javadocOnly project(':extensions:geode-modules-session')
+    javadocOnly project(':extensions:geode-modules-tomcat7')
+    javadocOnly project(':extensions:geode-modules-tomcat9')
+    javadocOnly project(':extensions:geode-modules-tomcat8')
+    javadocOnly project(':geode-experimental-driver')
+
+    testImplementation(project(':geode-core'))
+    testImplementation(project(':geode-gfsh'))
+    testImplementation(project(':geode-junit')) {
+        exclude module: 'geode-core'
+    }
+    testImplementation(project(':geode-log4j')) {
+        exclude module: 'geode-core'
+    }
+    testRuntime(project(path: ':geode-old-versions', configuration: 'testOutput'))
+
+
+    acceptanceTestRuntimeOnly(project(path: ':geode-old-versions', configuration: 'testOutput'))
+
+
+    integrationTestImplementation(project(':geode-core'))
+    integrationTestImplementation(project(':geode-gfsh'))
+    integrationTestImplementation(project(':geode-log4j')) {
+        exclude module: 'geode-core'
+    }
+    integrationTestImplementation(project(':geode-junit')) {
+        exclude module: 'geode-core'
+    }
+    integrationTestImplementation(project(':geode-dunit')) {
+        exclude module: 'geode-core'
+    }
+    integrationTestImplementation(project(':geode-pulse'))
+    integrationTestImplementation(project(':geode-assembly:geode-assembly-test'))
+    integrationTestImplementation(project(':geode-logging'))
+    integrationTestImplementation('org.apache.httpcomponents:httpclient')
+    integrationTestImplementation('org.springframework:spring-beans')
+    integrationTestImplementation('org.springframework:spring-context')
+    integrationTestImplementation('org.springframework:spring-web')
+    integrationTestImplementation('org.springframework.security:spring-security-oauth2-core')
+    integrationTestImplementation('org.springframework.security:spring-security-oauth2-client')
+    integrationTestImplementation('org.springframework.security:spring-security-oauth2-jose')
+    integrationTestImplementation('javax.annotation:javax.annotation-api')
+    integrationTestImplementation('javax.servlet:javax.servlet-api')
+
+
+    integrationTestRuntimeOnly('io.swagger:swagger-annotations')
+    // these two modules are for testing only
+    integrationTestRuntimeOnly('com.fasterxml.jackson.datatype:jackson-datatype-joda')
+    integrationTestRuntimeOnly('joda-time:joda-time')
+
+
+    distributedTestCompileOnly(platform(project(':boms:geode-all-bom')))
+    distributedTestCompileOnly('io.swagger:swagger-annotations')
+    distributedTestImplementation(project(':geode-gfsh'))
+    distributedTestImplementation(project(':geode-logging'))
+    distributedTestImplementation(project(':geode-membership'))
+    distributedTestImplementation(project(':geode-serialization'))
+    distributedTestImplementation(project(':geode-tcp-server'))
+    distributedTestImplementation(project(':geode-core'))
+    distributedTestImplementation(project(':geode-log4j')) {
+        exclude module: 'geode-core'
+    }
+    distributedTestImplementation(project(':geode-dunit')) {
+        exclude module: 'geode-core'
+    }
+    distributedTestImplementation(project(':extensions:session-testing-war'))
+    distributedTestImplementation(project(':geode-assembly:geode-assembly-test'))
+    distributedTestImplementation('org.apache.httpcomponents:httpclient')
+    distributedTestImplementation('org.springframework:spring-web')
+    distributedTestImplementation(project(':geode-management'))
+    distributedTestImplementation(project(':geode-web-management'))
+    distributedTestImplementation('com.arakelian:java-jq')
+    distributedTestImplementation('javax.servlet:javax.servlet-api')
+
+    distributedTestRuntimeOnly(project(':extensions:geode-modules-session-internal')) {
+        exclude group: 'org.apache.tomcat'
+    }
+    distributedTestRuntimeOnly('org.codehaus.cargo:cargo-core-uberjar')
+    distributedTestRuntimeOnly('io.swagger:swagger-annotations')
+    distributedTestRuntimeOnly(project(':geode-wan'))
+
+
+    // geodeArchives is a direct reflection of what is contained in geode-dependencies.jar. To that
+    // end only add _test_ dependencies to acceptanceTestCompile/Runtime. All other product
+    // dependencies should be a part of geodeArchives and should not need to be added as individual
+    // dependencies here.
+    acceptanceTestImplementation(configurations.geodeArchives)
+    acceptanceTestImplementation(project(':geode-dunit')) {
+        exclude module: 'geode-core'
+    }
+    acceptanceTestImplementation(project(':geode-assembly:geode-assembly-test'))
+
+    // This is used by 'gradle within gradle' tests. No need to bump this version; but if you do,
+    // don't have it be the same version as the outer gradle version.
+    acceptanceTestImplementation('org.gradle:gradle-tooling-api:5.1.1')
+
+    acceptanceTestImplementation('com.palantir.docker.compose:docker-compose-rule-core')
+    acceptanceTestImplementation('com.palantir.docker.compose:docker-compose-rule-junit4')
+
+    uiTestImplementation(project(':geode-core'))
+    uiTestImplementation(project(':geode-dunit')) {
+        exclude module: 'geode-core'
+    }
+    uiTestImplementation(project(':geode-pulse'))
+    uiTestImplementation(project(':geode-pulse:geode-pulse-test'))
+    uiTestImplementation(project(':geode-assembly:geode-assembly-test'))
+    uiTestImplementation('org.seleniumhq.selenium:selenium-api')
+    uiTestImplementation('org.seleniumhq.selenium:selenium-remote-driver')
+    uiTestImplementation('org.seleniumhq.selenium:selenium-support')
+
+    uiTestRuntimeOnly(project(':geode-core'))
+    uiTestRuntimeOnly('org.seleniumhq.selenium:selenium-chrome-driver')
+
+    upgradeTestImplementation(project(':geode-gfsh'))
+    upgradeTestImplementation(project(':geode-logging'))
+    upgradeTestImplementation(project(':geode-serialization'))
+    upgradeTestImplementation(project(':geode-core'))
+    upgradeTestImplementation(project(':geode-dunit')) {
+        exclude module: 'geode-core'
+    }
+    upgradeTestImplementation(project(':geode-assembly:geode-assembly-test'))
+
+    upgradeTestCompileOnly(platform(project(':boms:geode-all-bom')))
+    upgradeTestCompileOnly('io.swagger:swagger-annotations')
+
+    upgradeTestRuntimeOnly(project(path: ':geode-old-versions', configuration: 'testOutput'))
+    upgradeTestRuntimeOnly(project(':extensions:session-testing-war'))
+    upgradeTestRuntimeOnly('org.codehaus.cargo:cargo-core-uberjar')
+    upgradeTestRuntimeOnly('org.apache.httpcomponents:httpclient')
+    upgradeTestRuntime files({ downloadWebServers })
+
+    //Web servers used for session module testing
+    webServerTomcat6('apache:tomcat:' + DependencyConstraints.get('tomcat6.version') + '@zip')
+    webServerTomcat7('org.apache.tomcat:tomcat:' + DependencyConstraints.get('tomcat7.version') + '@zip')
+    webServerTomcat8('org.apache.tomcat:tomcat:' + DependencyConstraints.get('tomcat8.version') + '@zip')
+    webServerTomcat9('org.apache.tomcat:tomcat:' + DependencyConstraints.get('tomcat9.version') + '@zip')
+    webServerJetty('org.eclipse.jetty:jetty-distribution:' + DependencyConstraints.get('jetty.version') + '@zip')
+
+    gfshDependencies('org.springframework:spring-web') {
+        exclude module: 'spring-core'
+        exclude module: 'commons-logging'
+    }
 }
 
 acceptanceTest {
@@ -327,298 +330,301 @@ acceptanceTest {
 }
 
 tasks.register('defaultDistributionConfig', JavaExec) {
-  inputs.files {
-    project(':geode-core').sourceSets.main.runtimeClasspath
-  }
-  outputs.file file("$buildDir/gemfire.properties")
-  main 'org.apache.geode.distributed.internal.DefaultPropertiesGenerator'
-  classpath project(':geode-core').sourceSets.main.runtimeClasspath
-  workingDir buildDir
-
-  doFirst {
-    buildDir.mkdirs()
-  }
+    inputs.files {
+        project(':geode-core').sourceSets.main.runtimeClasspath
+    }
+    outputs.file file("$buildDir/gemfire.properties")
+    main 'org.apache.geode.distributed.internal.DefaultPropertiesGenerator'
+    classpath project(':geode-core').sourceSets.main.runtimeClasspath
+    workingDir buildDir
+
+    doFirst {
+        buildDir.mkdirs()
+    }
 }
 
 tasks.register('defaultCacheConfig', JavaExec) {
-  inputs.files {
-    project(':geode-core').sourceSets.main.runtimeClasspath
-  }
-  outputs.file file("$buildDir/cache.xml")
-  main 'org.apache.geode.internal.cache.xmlcache.CacheXmlGenerator'
-  classpath project(':geode-core').sourceSets.main.runtimeClasspath
-  workingDir buildDir
-
-  doFirst {
-    buildDir.mkdirs()
-  }
+    inputs.files {
+        project(':geode-core').sourceSets.main.runtimeClasspath
+    }
+    outputs.file file("$buildDir/cache.xml")
+    main 'org.apache.geode.internal.cache.xmlcache.CacheXmlGenerator'
+    classpath project(':geode-core').sourceSets.main.runtimeClasspath
+    workingDir buildDir
+
+    doFirst {
+        buildDir.mkdirs()
+    }
 }
 
 // This closure sets the geode classpath.  If we add another jar to the classpath it must
 // be included in the filter logic below.
 def cp = {
-  // first add all the dependent project jars
-  def jars = configurations.geodeArchives.dependencies.collect { it.dependencyProject }
-    .findAll { !(it.name.contains('geode-web') || it.name.contains('geode-pulse')) }
-    .collect { it.jar.archiveName }
-
-  // then add all the dependencies of the dependent jars
-  def depJars = configurations.geodeArchives.dependencies.collect {
-    it.dependencyProject.findAll {
-      !(it.name.contains('geode-web') ||
-        it.name.contains('geode-pulse'))
-    }.collect {
-      it.configurations.runtimeClasspath.collect { it.getName() }.findAll { !(
-          it.contains('geode-all-bom') ||
-
-            // exclude mx4j, once the deprecated code is deleted we can remove these entirely
-            it.contains('commons-digester') ||
-            it.contains('commons-modeler') ||
-            it.contains('javax.mail-api') ||
-            it.contains('mx4j') ||
-
-            // misc jars, these should be removed from the lib dir
-            it.contains('findbugs-annotations') ||
-            it.contains('geode-dependencies') ||
-            it.contains('geode-jca') ||
-            it.contains('geode-web') ||
-            it.contains('gfsh-dependencies') ||
-            it.contains('ra.jar') ||
-
-            // spring web deps that shouldn't be here either
-            it.contains('spring-aop') ||
-            it.contains('spring-beans') ||
-            it.contains('spring-context') ||
-            it.contains('spring-expression') ||
-            it.contains('spring-web')
-        )}
-    }
-  }.flatten()
-
-  return jars.plus(depJars).unique().join(' ')
+    // first add all the dependent project jars
+    def jars = configurations.geodeArchives.dependencies.collect { it.dependencyProject }
+            .findAll { !(it.name.contains('geode-web') || it.name.contains('geode-pulse')) }
+            .collect { it.jar.archiveName }
+
+    // then add all the dependencies of the dependent jars
+    def depJars = configurations.geodeArchives.dependencies.collect {
+        it.dependencyProject.findAll {
+            !(it.name.contains('geode-web') ||
+                    it.name.contains('geode-pulse'))
+        }.collect {
+            it.configurations.runtimeClasspath.collect { it.getName() }.findAll {
+                !(
+                        it.contains('geode-all-bom') ||
+
+                                // exclude mx4j, once the deprecated code is deleted we can remove these entirely
+                                it.contains('commons-digester') ||
+                                it.contains('commons-modeler') ||
+                                it.contains('javax.mail-api') ||
+                                it.contains('mx4j') ||
+
+                                // misc jars, these should be removed from the lib dir
+                                it.contains('findbugs-annotations') ||
+                                it.contains('geode-dependencies') ||
+                                it.contains('geode-jca') ||
+                                it.contains('geode-web') ||
+                                it.contains('gfsh-dependencies') ||
+                                it.contains('ra.jar') ||
+
+                                // spring web deps that shouldn't be here either
+                                it.contains('spring-aop') ||
+                                it.contains('spring-beans') ||
+                                it.contains('spring-context') ||
+                                it.contains('spring-expression') ||
+                                it.contains('spring-web')
+                )
+            }
+        }
+    }.flatten()
+
+    return jars.plus(depJars).unique().join(' ')
 }
 
 tasks.register('configureDepsJar') {
-  inputs.files {
-    configurations.geodeArchives
-  }
-
-  def output = project.buildDir.toPath().resolve('reports').resolve('deps_jar_cp.txt')
-  outputs.file {
-    output
-  }
-  doLast {
-    output.write(cp())
-  }
+    inputs.files {
+        configurations.geodeArchives
+    }
+
+    def output = project.buildDir.toPath().resolve('reports').resolve('deps_jar_cp.txt')
+    outputs.file {
+        output
+    }
+    doLast {
+        output.write(cp())
+    }
 }
 
 tasks.register('configureGfshDepsJar') {
-  inputs.files {
-    configurations.gfshDependencies
-  }
-
-  inputs.files {
-    configureDepsJar
-  }
-
-  def output = project.buildDir.toPath().resolve('reports').resolve('gfsh_deps_jar_cp.txt')
-  outputs.file {
-    output
-  }
-  doLast {
-    def classpath = configureDepsJar.outputs.files.singleFile.text + ' ' +
-        configurations.gfshDependencies.collect { it.getName() }.findAll {
-          !it.contains('geode-all-bom')
-        }.flatten().unique().join(' ')
-    output.write(classpath)
-  }
+    inputs.files {
+        configurations.gfshDependencies
+    }
+
+    inputs.files {
+        configureDepsJar
+    }
+
+    def output = project.buildDir.toPath().resolve('reports').resolve('gfsh_deps_jar_cp.txt')
+    outputs.file {
+        output
+    }
+    doLast {
+        def classpath = configureDepsJar.outputs.files.singleFile.text + ' ' +
+                configurations.gfshDependencies.collect { it.getName() }.findAll {
+                    !it.contains('geode-all-bom')
+                }.flatten().unique().join(' ')
+        output.write(classpath)
+    }
 }
 
 // Configure the manifest contents in a separate always-running task to ensure correctness of
 // these dependency jars
 tasks.register('depsJar', Jar) {
-  inputs.files {
-    configureDepsJar
-  }
-  description 'Assembles the jar archive that defines the gemfire classpath.'
-  archiveName 'geode-dependencies.jar'
-  doFirst {
-    manifest {
-      attributes("Class-Path": configureDepsJar.outputs.files.singleFile.text)
-    }
-  }
+    inputs.files {
+        configureDepsJar
+    }
+    description 'Assembles the jar archive that defines the gemfire classpath.'
+    archiveName 'geode-dependencies.jar'
+    doFirst {
+        manifest {
+            attributes("Class-Path": configureDepsJar.outputs.files.singleFile.text)
+        }
+    }
 }
 
 tasks.register('gfshDepsJar', Jar) {
-  inputs.files {
-    configureGfshDepsJar
-  }
-  description 'Assembles the jar archive that defines the gfsh classpath.'
-  archiveName 'gfsh-dependencies.jar'
-  doFirst {
-    manifest {
-      attributes("Class-Path": configureGfshDepsJar.outputs.files.singleFile.text)
-    }
-  }
+    inputs.files {
+        configureGfshDepsJar
+    }
+    description 'Assembles the jar archive that defines the gfsh classpath.'
+    archiveName 'gfsh-dependencies.jar'
+    doFirst {
+        manifest {
+            attributes("Class-Path": configureGfshDepsJar.outputs.files.singleFile.text)
+        }
+    }
 }
 
 tasks.register('docs', Javadoc) {
-  def docsDir = file("$buildDir/javadocs")
-  options.addStringOption('Xdoclint:none', '-quiet')
-  options.links("https://lucene.apache.org/core/6_4_1/core/")
-  options.links("https://lucene.apache.org/core/6_4_1/queryparser/")
-  options.links("https://docs.oracle.com/javase/8/docs/api/")
-  options.encoding = 'UTF-8'
-  title = "${productName} ${project.version}"
-  destinationDir = docsDir
-
-  configurations.getByName("javadocOnly").allDependencies.each() { proj ->
-    proj.dependencyProject.tasks.withType(Javadoc).findAll { it.enabled }.each { javadocTask ->
-      source += javadocTask.source
-      classpath += javadocTask.classpath
-      excludes += javadocTask.excludes
-      includes += javadocTask.includes
-    }
-  }
-
-  include 'org/apache/geode/**/'
-
-  doLast {
-    rootProject.subprojects.each { project ->
-      copy {
-        if (project.hasProperty('sourceSets')) {
-          from project.sourceSets.main.resources.srcDirs
+    def docsDir = file("$buildDir/javadocs")
+    options.addStringOption('Xdoclint:none', '-quiet')
+    options.links("https://lucene.apache.org/core/6_4_1/core/")
+    options.links("https://lucene.apache.org/core/6_4_1/queryparser/")
+    options.links("https://docs.oracle.com/javase/8/docs/api/")
+    options.encoding = 'UTF-8'
+    title = "${productName} ${project.version}"
+    destinationDir = docsDir
+
+    configurations.getByName("javadocOnly").allDependencies.each() { proj ->
+        proj.dependencyProject.tasks.withType(Javadoc).findAll { it.enabled }.each { javadocTask ->
+            source += javadocTask.source
+            classpath += javadocTask.classpath
+            excludes += javadocTask.excludes
+            includes += javadocTask.includes
+        }
+    }
+
+    include 'org/apache/geode/**/'
+
+    doLast {
+        rootProject.subprojects.each { project ->
+            copy {
+                if (project.hasProperty('sourceSets')) {
+                    from project.sourceSets.main.resources.srcDirs
+                }
+                include 'javadoc-images/*'
+                into docsDir
+            }
         }
-        include 'javadoc-images/*'
-        into docsDir
-      }
     }
-  }
 }
 
 distributions {
-  src {
-    baseName = 'apache-geode'
-    contents {
-      from rootProject.tasks.writeBuildInfo
-      from (rootDir) {
-        exclude 'KEYS'
-        exclude '**/gradlew'
-        exclude '**/gradlew.bat'
-        exclude '**/gradle/wrapper/gradle-wrapper.jar'
-        exclude '**/.gradle'
-        exclude '**/.project'
-        exclude '**/.classpath'
-        exclude '**/.settings/**'
-        exclude '**/build-eclipse/**'
-        exclude '**/.idea/**'
-        exclude '**/*.iml'
-        exclude '**/*.ipr'
-        exclude '**/*.iws'
-        exclude '**/.travis.yml'
-        exclude '**/tags'
-
-        //These directories are generated on the jenkins server by gradle
-        exclude 'caches'
-        exclude 'daemon'
-        exclude 'native'
-        exclude 'wrapper'
-
-        // These exclude the 'build' and 'out' artifact directories from Gradle and IntelliJ for each project
-        exclude 'buildSrc/build'
-        exclude 'buildSrc/out'
-        rootProject.allprojects.each {
-          def relPath = Paths.get(rootDir.getPath()).relativize(Paths.get(it.projectDir.getPath()))
-          def relOut = relPath.resolve("out").toString()
-          def relBuild = relPath.resolve("build").toString()
-          exclude relOut
-          exclude relBuild
-        }
-      }
-    }
-  }
-  named('main') {
-    baseName = 'apache-geode'
-    contents {
-      duplicatesStrategy 'exclude'
-      exclude '*.asc'
-
-      exclude '*.asc'
-      exclude '*-sources.jar'
-      exclude '*-javadoc.jar'
-
-      from rootProject.file('README.md')
-
-      from "${projectDir}/src/main/dist/"
-
-      with copySpec {
-        into('config')
-        from {defaultCacheConfig}
-        from {defaultDistributionConfig}
-        from {
-          (project(':geode-log4j').sourceSets.main.resources.files.find {
-            it.name == 'log4j2.xml'
-          })
+    src {
+        baseName = 'apache-geode'
+        contents {
+            from rootProject.tasks.writeBuildInfo
+            from(rootDir) {
+                exclude 'KEYS'
+                exclude '**/gradlew'
+                exclude '**/gradlew.bat'
+                exclude '**/gradle/wrapper/gradle-wrapper.jar'
+                exclude '**/.gradle'
+                exclude '**/.project'
+                exclude '**/.classpath'
+                exclude '**/.settings/**'
+                exclude '**/build-eclipse/**'
+                exclude '**/.idea/**'
+                exclude '**/*.iml'
+                exclude '**/*.ipr'
+                exclude '**/*.iws'
+                exclude '**/.travis.yml'
+                exclude '**/tags'
+
+                //These directories are generated on the jenkins server by gradle
+                exclude 'caches'
+                exclude 'daemon'
+                exclude 'native'
+                exclude 'wrapper'
+
+                // These exclude the 'build' and 'out' artifact directories from Gradle and IntelliJ for each project
+                exclude 'buildSrc/build'
+                exclude 'buildSrc/out'
+                rootProject.allprojects.each {
+                    def relPath = Paths.get(rootDir.getPath()).relativize(Paths.get(it.projectDir.getPath()))
+                    def relOut = relPath.resolve("out").toString()
+                    def relBuild = relPath.resolve("build").toString()
+                    exclude relOut
+                    exclude relBuild
+                }
+            }
         }
-      }
-
-      with copySpec {
-        into('lib')
-        from { dependentProjectNames.collect {
-            [
-              project(':'.concat(it)).configurations.runtimeClasspath,
-              project(':'.concat(it)).configurations.archives.allArtifacts.files
-            ]
-          }.flatten()
+    }
+    named('main') {
+        baseName = 'apache-geode'
+        contents {
+            duplicatesStrategy 'exclude'
+            exclude '*.asc'
+
+            exclude '*.asc'
+            exclude '*-sources.jar'
+            exclude '*-javadoc.jar'
+
+            from rootProject.file('README.md')
+
+            from "${projectDir}/src/main/dist/"
+
+            with copySpec {
+                into('config')
+                from { defaultCacheConfig }
+                from { defaultDistributionConfig }
+                from {
+                    (project(':geode-log4j').sourceSets.main.resources.files.find {
+                        it.name == 'log4j2.xml'
+                    })
+                }
+            }
+
+            with copySpec {
+                into('lib')
+                from {
+                    dependentProjectNames.collect {
+                        [
+                                project(':'.concat(it)).configurations.runtimeClasspath,
+                                project(':'.concat(it)).configurations.archives.allArtifacts.files
+                        ]
+                    }.flatten()
+                }
+
+                from configurations.gfshDependencies
+
+                //These tasks are included as closures (wrapped in {}) because gradle may evaluate
+                //this CopySpec before it evaluates the geode-core build file.
+                from { project(':geode-core').tasks.named('raJar') }
+                from { project(':geode-core').tasks.named('jcaJar') }
+
+                // dependency jars
+                from tasks.named('depsJar')
+                from tasks.named('gfshDepsJar')
+            }
+
+            with copySpec {
+                into('tools/Extensions')
+
+                from { project(':geode-web').configurations.archives.allArtifacts.files }
+                from { project(':geode-web-api').configurations.archives.allArtifacts.files }
+                from { project(':geode-web-management').configurations.archives.allArtifacts.files }
+
+                exclude '*.jar'
+            }
+
+            with copySpec {
+                into('tools/ClientProtocol')
+                from { project(':geode-protobuf-messages').zip.outputs.files }
+            }
+
+            with copySpec {
+                into('javadoc')
+                from { docs }
+            }
+
+            with copySpec {
+                into('tools/Pulse')
+                from { project(':geode-pulse').configurations.archives.allArtifacts.files }
+            }
+
+            with copySpec {
+                into('tools/Modules')
+
+                from { project(':extensions:geode-modules-assembly').distTcServer }
+                from { project(':extensions:geode-modules-assembly').distTcServer30 }
+                from { project(':extensions:geode-modules-assembly').distTomcat }
+                from { project(':extensions:geode-modules-assembly').distAppServer }
+            }
         }
-
-        from configurations.gfshDependencies
-
-        //These tasks are included as closures (wrapped in {}) because gradle may evaluate
-        //this CopySpec before it evaluates the geode-core build file.
-        from {project(':geode-core').tasks.named('raJar')}
-        from {project(':geode-core').tasks.named('jcaJar')}
-
-        // dependency jars
-        from tasks.named('depsJar')
-        from tasks.named('gfshDepsJar')
-      }
-
-      with copySpec {
-        into('tools/Extensions')
-
-        from {project(':geode-web').configurations.archives.allArtifacts.files}
-        from {project(':geode-web-api').configurations.archives.allArtifacts.files}
-        from {project(':geode-web-management').configurations.archives.allArtifacts.files}
-
-        exclude '*.jar'
-      }
-
-      with copySpec {
-        into('tools/ClientProtocol')
-        from {project(':geode-protobuf-messages').zip.outputs.files}
-      }
-
-      with copySpec {
-        into('javadoc')
-        from { docs }
-      }
-
-      with copySpec {
-        into('tools/Pulse')
-        from {project(':geode-pulse').configurations.archives.allArtifacts.files}
-      }
-
-      with copySpec {
-        into('tools/Modules')
-
-        from { project(':extensions:geode-modules-assembly').distTcServer }
-        from { project(':extensions:geode-modules-assembly').distTcServer30 }
-        from { project(':extensions:geode-modules-assembly').distTomcat }
-        from { project(':extensions:geode-modules-assembly').distAppServer }
-      }
     }
-  }
 
 }
 // Distribution plugin does not allow configuring of the task, only the contents. So we set
@@ -626,27 +632,27 @@ distributions {
 [tasks.named('distTar'),
  tasks.named('srcDistTar'),
 ]*.configure {
-  compression Compression.GZIP
-  extension 'tgz'
-  build.dependsOn(it)
+    compression Compression.GZIP
+    extension 'tgz'
+    build.dependsOn(it)
 }
 // Make build final task to generate all test and product resources
 build.dependsOn(installDist)
 
 tasks.named('srcDistTar').configure {
-  classifier 'src'
+    classifier 'src'
 }
 
 [tasks.named('distZip'),
  tasks.named('srcDistZip'),
  tasks.named('dockerfileZip'),
- ]*.configure {
-  enabled = false
+]*.configure {
+    enabled = false
 }
 
 tasks.withType(Test) {
-  dependsOn installDist
-  environment 'GEODE_HOME', "$buildDir/install/${distributions.main.baseName}"
+    dependsOn installDist
+    environment 'GEODE_HOME', "$buildDir/install/${distributions.main.baseName}"
 }
 
 
@@ -659,43 +665,43 @@ upgradeTest.dependsOn ':geode-old-versions:build'
 
 /**Print the names of all jar files in a fileTree */
 def printJars(tree) {
-  tree.matching {include("**/*.jar")}.visit{ file ->
-    if(!file.isDirectory()) {
-      println file.name
+    tree.matching { include("**/*.jar") }.visit { file ->
+        if (!file.isDirectory()) {
+            println file.name
+        }
     }
-  }
 }
 
 task dumpInstalledJars(dependsOn: installDist) {
-  doLast {
-    description "Dump a list of all of the jars shipped with the binary distribution, for validation purposes"
-
-    FileTree installDir = fileTree(dir: installDist.destinationDir)
-
-    println("Jars in the binary install")
-    println("==========================")
-    printJars(installDir)
-
-    installDir.include("**/*.war").visit{ file ->
-      if(!file.isDirectory()) {
-          FileTree warContents = zipTree(file.file)
-          println ""
-          println file.name
-          println("==========================")
-          printJars(warContents)
-      }
+    doLast {
+        description "Dump a list of all of the jars shipped with the binary distribution, for validation purposes"
+
+        FileTree installDir = fileTree(dir: installDist.destinationDir)
+
+        println("Jars in the binary install")
+        println("==========================")
+        printJars(installDir)
+
+        installDir.include("**/*.war").visit { file ->
+            if (!file.isDirectory()) {
+                FileTree warContents = zipTree(file.file)
+                println ""
+                println file.name
+                println("==========================")
+                printJars(warContents)
+            }
+        }
     }
-  }
 }
 
 docker {
-  dependsOn(tasks.installDist)
-  name geodeDockerImageName
-  copySpec.from(tasks.installDist.outputs).into('geode')
+    dependsOn(tasks.installDist)
+    name geodeDockerImageName
+    copySpec.from(tasks.installDist.outputs).into('geode')
 }
 
 acceptanceTest {
-  dependsOn(tasks.docker)
+    dependsOn(tasks.docker)
 }
 
 apply from: Paths.get("${rootDir}", 'gradle', 'japicmp.gradle')
diff --git a/geode-book/.gitignore b/geode-book/.gitignore
deleted file mode 100644
index 30545a4..0000000
--- a/geode-book/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-output/
-final_app/
diff --git a/geode-book/Gemfile b/geode-book/Gemfile
deleted file mode 100644
index ea05ef5..0000000
--- a/geode-book/Gemfile
+++ /dev/null
@@ -1,22 +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.
-
-source "https://rubygems.org"
-
-gem 'bookbindery', '10.1.14'
-
-gem 'libv8'
diff --git a/geode-book/Gemfile.lock b/geode-book/Gemfile.lock
deleted file mode 100644
index 9b60758..0000000
--- a/geode-book/Gemfile.lock
+++ /dev/null
@@ -1,207 +0,0 @@
-GEM
-  remote: https://rubygems.org/
-  specs:
-    activesupport (4.2.11.1)
-      i18n (~> 0.7)
-      minitest (~> 5.1)
-      thread_safe (~> 0.3, >= 0.3.4)
-      tzinfo (~> 1.1)
-    addressable (2.6.0)
-      public_suffix (>= 2.0.2, < 4.0)
-    ansi (1.5.0)
-    backports (3.15.0)
-    bookbindery (10.1.14)
-      ansi (~> 1.4)
-      css_parser
-      elasticsearch
-      fog-aws (~> 0.7.1)
-      font-awesome-sass (= 4.7.0)
-      git (~> 1.2.8)
-      middleman (= 4.1.10)
-      middleman-compass
-      middleman-livereload
-      middleman-sprockets
-      middleman-syntax (= 2.1.0)
-      nokogiri (= 1.8.2)
-      puma
-      rack-rewrite
-      redcarpet (~> 3.2.3)
-      rouge (!= 1.9.1)
-      therubyracer
-      thor (= 0.19.1)
-    builder (3.2.3)
-    chunky_png (1.3.11)
-    coffee-script (2.4.1)
-      coffee-script-source
-      execjs
-    coffee-script-source (1.12.2)
-    compass (1.0.3)
-      chunky_png (~> 1.2)
-      compass-core (~> 1.0.2)
-      compass-import-once (~> 1.0.5)
-      rb-fsevent (>= 0.9.3)
-      rb-inotify (>= 0.9)
-      sass (>= 3.3.13, < 3.5)
-    compass-core (1.0.3)
-      multi_json (~> 1.0)
-      sass (>= 3.3.0, < 3.5)
-    compass-import-once (1.0.5)
-      sass (>= 3.2, < 3.5)
-    concurrent-ruby (1.1.5)
-    contracts (0.13.0)
-    css_parser (1.7.0)
-      addressable
-    dotenv (2.7.5)
-    elasticsearch (7.3.0)
-      elasticsearch-api (= 7.3.0)
-      elasticsearch-transport (= 7.3.0)
-    elasticsearch-api (7.3.0)
-      multi_json
-    elasticsearch-transport (7.3.0)
-      faraday
-      multi_json
-    em-websocket (0.5.1)
-      eventmachine (>= 0.12.9)
-      http_parser.rb (~> 0.6.0)
-    erubis (2.7.0)
-    eventmachine (1.2.7)
-    excon (0.71.0)
-    execjs (2.7.0)
-    faraday (0.15.4)
-      multipart-post (>= 1.2, < 3)
-    fast_blank (1.0.0)
-    fastimage (2.1.5)
-    ffi (1.11.1)
-    fog-aws (0.7.6)
-      fog-core (~> 1.27)
-      fog-json (~> 1.0)
-      fog-xml (~> 0.1)
-      ipaddress (~> 0.8)
-    fog-core (1.45.0)
-      builder
-      excon (~> 0.58)
-      formatador (~> 0.2)
-    fog-json (1.2.0)
-      fog-core
-      multi_json (~> 1.10)
-    fog-xml (0.1.3)
-      fog-core
-      nokogiri (>= 1.5.11, < 2.0.0)
-    font-awesome-sass (4.7.0)
-      sass (>= 3.2)
-    formatador (0.2.5)
-    git (1.2.9.1)
-    haml (5.1.1)
-      temple (>= 0.8.0)
-      tilt
-    hamster (3.0.0)
-      concurrent-ruby (~> 1.0)
-    hashie (3.6.0)
-    http_parser.rb (0.6.0)
-    i18n (0.7.0)
-    ipaddress (0.8.3)
-    kramdown (1.17.0)
-    libv8 (3.16.14.19)
-    listen (3.0.8)
-      rb-fsevent (~> 0.9, >= 0.9.4)
-      rb-inotify (~> 0.9, >= 0.9.7)
-    memoist (0.16.0)
-    middleman (4.1.10)
-      coffee-script (~> 2.2)
-      compass-import-once (= 1.0.5)
-      haml (>= 4.0.5)
-      kramdown (~> 1.2)
-      middleman-cli (= 4.1.10)
-      middleman-core (= 4.1.10)
-      sass (>= 3.4.0, < 4.0)
-    middleman-cli (4.1.10)
-      thor (>= 0.17.0, < 2.0)
-    middleman-compass (4.0.1)
-      compass (>= 1.0.0, < 2.0.0)
-      middleman-core (>= 4.0.0)
-    middleman-core (4.1.10)
-      activesupport (~> 4.2)
-      addressable (~> 2.3)
-      backports (~> 3.6)
-      bundler (~> 1.1)
-      contracts (~> 0.13.0)
-      dotenv
-      erubis
-      execjs (~> 2.0)
-      fast_blank
-      fastimage (~> 2.0)
-      hamster (~> 3.0)
-      hashie (~> 3.4)
-      i18n (~> 0.7.0)
-      listen (~> 3.0.0)
-      memoist (~> 0.14)
-      padrino-helpers (~> 0.13.0)
-      parallel
-      rack (>= 1.4.5, < 2.0)
-      sass (>= 3.4)
-      servolux
-      tilt (~> 1.4.1)
-      uglifier (~> 3.0)
-    middleman-livereload (3.4.6)
-      em-websocket (~> 0.5.1)
-      middleman-core (>= 3.3)
-      rack-livereload (~> 0.3.15)
-    middleman-sprockets (4.1.1)
-      middleman-core (~> 4.0)
-      sprockets (>= 3.0)
-    middleman-syntax (2.1.0)
-      middleman-core (>= 3.2)
-      rouge (~> 1.0)
-    mini_portile2 (2.3.0)
-    minitest (5.11.3)
-    multi_json (1.13.1)
-    multipart-post (2.1.1)
-    nio4r (2.4.0)
-    nokogiri (1.8.2)
-      mini_portile2 (~> 2.3.0)
-    padrino-helpers (0.13.3.4)
-      i18n (~> 0.6, >= 0.6.7)
-      padrino-support (= 0.13.3.4)
-      tilt (>= 1.4.1, < 3)
-    padrino-support (0.13.3.4)
-      activesupport (>= 3.1)
-    parallel (1.17.0)
-    public_suffix (3.1.1)
-    puma (4.0.1)
-      nio4r (~> 2.0)
-    rack (1.6.11)
-    rack-livereload (0.3.17)
-      rack
-    rack-rewrite (1.5.1)
-    rb-fsevent (0.10.3)
-    rb-inotify (0.10.0)
-      ffi (~> 1.0)
-    redcarpet (3.2.3)
-    ref (2.0.0)
-    rouge (1.11.1)
-    sass (3.4.25)
-    servolux (0.13.0)
-    sprockets (3.7.2)
-      concurrent-ruby (~> 1.0)
-      rack (> 1, < 3)
-    temple (0.8.1)
-    therubyracer (0.12.3)
-      libv8 (~> 3.16.14.15)
-      ref
-    thor (0.19.1)
-    thread_safe (0.3.6)
-    tilt (1.4.1)
-    tzinfo (1.2.5)
-      thread_safe (~> 0.1)
-    uglifier (3.2.0)
-      execjs (>= 0.3.0, < 3)
-
-PLATFORMS
-  ruby
-
-DEPENDENCIES
-  bookbindery (= 10.1.14)
-  libv8
-
-BUNDLED WITH
-   1.17.3
diff --git a/geode-book/README.md b/geode-book/README.md
deleted file mode 100644
index c9d4dce..0000000
--- a/geode-book/README.md
+++ /dev/null
@@ -1,115 +0,0 @@
-# Apache Geode User Guide
-
-This document contains instructions for building and viewing the Apache Geode User Guide locally and moving the built guide to the Apache Geode website for publication.
-
-- [About](#about)
-- [Automatic build](#automatic-build)
-- [Manual build](#manual-build)
- - [Prerequisites](#prerequisites)
- - [Bookbinder Usage](#bookbinder-usage)
- - [Building the Documentation](#building-the-documentation)
-- [Publishing the User Guide to the Geode Website](#publishing-the-user-guide-to-the-geode-website)
-
-## About
-
-Apache Geode provides the full source for the Apache Geode User Guide in markdown format (see `{geode-project-dir}/geode-docs/CONTRIBUTE.md`). For every Apache Geode release the user guide is built and published to http://geode.apache.org/docs/. Users can build the markdown into an HTML user guide using [Bookbinder](https://github.com/pivotal-cf/bookbinder) and the instructions below.
-
-Bookbinder is a Ruby gem that binds  a unified documentation web application from markdown, html, and/or DITA source material. The source material for bookbinder must be stored either in local directories or in GitHub repositories. Bookbinder runs [Middleman](http://middlemanapp.com/) to produce a Rackup app that can be deployed locally or as a web application.
-
-## Automatic build
-
-Documentation can be built and previewed using the utility scripts at [dev-tools/docker/docs](https://github.com/apache/geode/tree/develop/dev-tools/docker/docs). These scripts use Docker, removing the requirement of installing Ruby and Bookbinder. They are based on the instructions described in the [Manual build](#manual-build) chapter.
-
-## Manual build
-
-### Prerequisites
-
-Bookbinder requires Ruby version 2.0.0-p195 or higher.
-
-Follow the instructions below to install Bookbinder:
-
-1. Add gem "bookbindery" to your Gemfile.
-2. Run `bundle install` to install the dependencies specified in your Gemfile.
-
-### Bookbinder Usage
-
-Bookbinder is meant to be used from within a project called a **book**. The book includes a configuration file that describes which documentation repositories to use as source materials. Bookbinder provides a set of scripts to aggregate those repositories and publish them to various locations.
-
-For Geode, a preconfigured **book** is provided in the directory `{geode-project-dir}/geode-book`, which gathers content from the directory `{geode-project-dir}/geode-docs`. You can use this configuration to build an HTML version of the Apache Geode User Guide on your local system.
-
-### Building the Documentation
-
-1. The GemFile in the `geode-book` directory already defines the `gem "bookbindery"` dependency. Make sure you are in the `{geode-project-dir}/geode-book` directory and enter:
-
-    ```
-    $ bundle install
-    ```
-
-   Note: You will not have to run `bundle install` on subsequent builds.
-
-2. To build the documentation locally using the installed `config.yml` file, enter:
-
-    ```
-    $ bundle exec bookbinder bind local
-    ```
-
-   Bookbinder converts the markdown source into HTML, which it puts in the `final_app` directory.
-
-3. Navigate to `{geode-project-dir}/geode-book/final_app/` and enter:
-
-    ```
-    $ bundle install
-    ```
-
-   Note: You will not have to run `bundle install` on subsequent builds. If you see errors during this step regarding the inability to install libv8, try running the command:
-    ```
-    $ gem install libv8 -v '3.16.14.15' --  --with-system-v8
-    ```
-   This can help you avoid errors with the default GCC compiler provided by Xcode on MacOS. This will only help circumvent the use of GCC to install libv8, so if you're on
-   an operating system where you do not have access to a system install of libv8 this may not be possible or necessary.
-
-
-4. To start a local website of the Apache Geode User Guide, enter:
-
-    ```
-    $ rackup
-    ```
-
-   You can now view the local documentation at <http://localhost:9292>.
-
-## Publishing the User Guide to the Geode Website
-
-Once you have reviewed your local build of the User Guide, you can publish it by copying it to the Apache Geode website. The target directory should contain a Geode version number.
-
-To copy the User Guide to the website repo:
-
-1. Create the destination directory by navigating to the geode-site repo. Check out the *master* branch and create a destination directory for the User Guide. The naming convention is:
-
-    ```
-{geode-site}/website/content/docs/guide/XY
-    ```
-where `XY` is the product version of your documentation (e.g., `{geode-site}/website/content/docs/guide/12` if you are publishing the documentation for Apache Geode 1.2).
-
-2. Navigate to the User Guide you have built in the Geode repository: `{geode-project-dir}/geode-book/final_app/public/docs/guide/XY`.
-
-3. Use `tar` to copy the directory in order to preserve links and other filesystem niceties.
-
-  a. Create the tarfile in your Desktop for easy access on the retrieval side.
-
-    ```
-    $ tar cvf ~/Desktop/new-guide-content.tar .
-    ```
-  b. Create the destination directory in the `geode-site` repo:
-
-    ```
-    $ mkdir -p {geode-site}/website/content/docs/guide/XY
-    ```
-
-  c. Navigate to the target directory and un-tar the userguide archive:
-
-    ```
-    $ cd {geode-site}/website/content/docs/guide/XY
-    $ tar xvf ~/Desktop/new-guide-content.tar
-    ```
-
-4. Follow the instructions in the README.md file on the *master* branch of the geode-site repo (`{geode-site}/README.md`) to build, review, and publish the Apache Geode website. You can also view the geode-site README.md file on [github: https://github.com/apache/geode-site](https://github.com/apache/geode-site).
diff --git a/geode-book/config.yml b/geode-book/config.yml
deleted file mode 100644
index 3c1c5d3..0000000
--- a/geode-book/config.yml
+++ /dev/null
@@ -1,48 +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.
-
-book_repo: apache/geode/geode-book
-public_host: localhost
-
-sections:
-- repository:
-    name: geode-docs
-  directory: docs/guide/114
-  subnav_template: geode-subnav
-
-template_variables:
-  product_name_long: Apache Geode
-  product_name: Geode
-  product_name_lowercase: geode
-  product_version: '1.14'
-  product_version_nodot: '114'
-  product_version_geode: '1.14'
-  min_java_version: '8'
-  min_java_update: '121'
-  support_url: http://geode.apache.org/community
-  product_url: http://geode.apache.org/
-  book_title: Apache Geode Documentation
-  support_link: <a href="http://geode.apache.org/community" target="_blank">Community</a>
-  support_call_to_action: <a href="http://geode.apache.org/community" target="_blank">Need Help?</a>
-  changelog_href: https://cwiki.apache.org/confluence/display/GEODE/Release+Notes
-  product_link: <div class="header-item"><a href="http://geode.apache.org/">Back to Geode Page</a></div>
-  domain_name: apache.org
-  book_title_short: Geode Docs
-  local_header_title: Apache Geode
-  local_header_img: /images/Apache_Geode_logo_symbol.png
-
-broken_link_exclusions: iefix|using_custom_classes|arrowhead|cppdocs|DotNetDocs
diff --git a/geode-book/master_middleman/source/archive_menus/_default.erb b/geode-book/master_middleman/source/archive_menus/_default.erb
deleted file mode 100644
index f728985..0000000
--- a/geode-book/master_middleman/source/archive_menus/_default.erb
+++ /dev/null
@@ -1,28 +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.
--->
-<div class="header-dropdown">
-  <a class="header-dropdown-link" >
-    <%= menu_title %>
-  </a>
-  <div class="header-dropdown-content">
-    <ul>
-      <% for link in dropdown_links %>
-        <li><a href="<%= link.values.first %>"><%= link.keys.first %></a></li>
-      <% end %>
-    </ul>
-  </div>
-</div>
diff --git a/geode-book/master_middleman/source/images/Apache_Geode_logo_symbol.png b/geode-book/master_middleman/source/images/Apache_Geode_logo_symbol.png
deleted file mode 100644
index 88f3996..0000000
Binary files a/geode-book/master_middleman/source/images/Apache_Geode_logo_symbol.png and /dev/null differ
diff --git a/geode-book/master_middleman/source/images/Apache_Geode_logo_symbol_white.png b/geode-book/master_middleman/source/images/Apache_Geode_logo_symbol_white.png
deleted file mode 100644
index 01d286c..0000000
Binary files a/geode-book/master_middleman/source/images/Apache_Geode_logo_symbol_white.png and /dev/null differ
diff --git a/geode-book/master_middleman/source/images/favicon.ico b/geode-book/master_middleman/source/images/favicon.ico
deleted file mode 100644
index 00aa630..0000000
Binary files a/geode-book/master_middleman/source/images/favicon.ico and /dev/null differ
diff --git a/geode-book/master_middleman/source/javascripts/book.js b/geode-book/master_middleman/source/javascripts/book.js
deleted file mode 100644
index 16edd95..0000000
--- a/geode-book/master_middleman/source/javascripts/book.js
+++ /dev/null
@@ -1,31 +0,0 @@
-//Licensed to the Apache Software Foundation (ASF) under one or more
-//contributor license agreements.  See the NOTICE file distributed with
-//this work for additional information regarding copyright ownership.
-//The ASF licenses this file to You under the Apache License, Version 2.0
-//(the "License"); you may not use this file except in compliance with
-//the License.  You may obtain a copy of the License at
-//
-//http://www.apache.org/licenses/LICENSE-2.0
-//
-//Unless required by applicable law or agreed to in writing, software
-//distributed under the License is distributed on an "AS IS" BASIS,
-//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
-//express or implied. See the License for the specific language governing
-//permissions and limitations under the License.
-
-// Declare your book-specific javascript overrides in this file.
-//= require 'waypoints/waypoint'
-//= require 'waypoints/context'
-//= require 'waypoints/group'
-//= require 'waypoints/noframeworkAdapter'
-//= require 'waypoints/sticky'
-
-window.onload = function() {
-  Bookbinder.boot();
-  var sticky = new Waypoint.Sticky({
-    element: document.querySelector('#js-to-top'),
-    wrapper: '<div class="sticky-wrapper" />',
-    stuckClass: 'sticky',
-    offset: 100
-  });
-}
diff --git a/geode-book/master_middleman/source/javascripts/waypoints/context.js b/geode-book/master_middleman/source/javascripts/waypoints/context.js
deleted file mode 100644
index d005cb3..0000000
--- a/geode-book/master_middleman/source/javascripts/waypoints/context.js
+++ /dev/null
@@ -1,315 +0,0 @@
-//Licensed to the Apache Software Foundation (ASF) under one or more
-//contributor license agreements.  See the NOTICE file distributed with
-//this work for additional information regarding copyright ownership.
-//The ASF licenses this file to You under the Apache License, Version 2.0
-//(the "License"); you may not use this file except in compliance with
-//the License.  You may obtain a copy of the License at
-//
-//http://www.apache.org/licenses/LICENSE-2.0
-//
-//Unless required by applicable law or agreed to in writing, software
-//distributed under the License is distributed on an "AS IS" BASIS,
-//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
-//express or implied. See the License for the specific language governing
-//permissions and limitations under the License.
-
-(function() {
-  'use strict'
-
-  function requestAnimationFrameShim(callback) {
-    window.setTimeout(callback, 1000 / 60)
-  }
-
-  var keyCounter = 0
-  var contexts = {}
-  var Waypoint = window.Waypoint
-  var oldWindowLoad = window.onload
-
-  /* http://imakewebthings.com/waypoints/api/context */
-  function Context(element) {
-    this.element = element
-    this.Adapter = Waypoint.Adapter
-    this.adapter = new this.Adapter(element)
-    this.key = 'waypoint-context-' + keyCounter
-    this.didScroll = false
-    this.didResize = false
-    this.oldScroll = {
-      x: this.adapter.scrollLeft(),
-      y: this.adapter.scrollTop()
-    }
-    this.waypoints = {
-      vertical: {},
-      horizontal: {}
-    }
-
-    element.waypointContextKey = this.key
-    contexts[element.waypointContextKey] = this
-    keyCounter += 1
-
-    this.createThrottledScrollHandler()
-    this.createThrottledResizeHandler()
-  }
-
-  /* Private */
-  Context.prototype.add = function(waypoint) {
-    var axis = waypoint.options.horizontal ? 'horizontal' : 'vertical'
-    this.waypoints[axis][waypoint.key] = waypoint
-    this.refresh()
-  }
-
-  /* Private */
-  Context.prototype.checkEmpty = function() {
-    var horizontalEmpty = this.Adapter.isEmptyObject(this.waypoints.horizontal)
-    var verticalEmpty = this.Adapter.isEmptyObject(this.waypoints.vertical)
-    if (horizontalEmpty && verticalEmpty) {
-      this.adapter.off('.waypoints')
-      delete contexts[this.key]
-    }
-  }
-
-  /* Private */
-  Context.prototype.createThrottledResizeHandler = function() {
-    var self = this
-
-    function resizeHandler() {
-      self.handleResize()
-      self.didResize = false
-    }
-
-    this.adapter.on('resize.waypoints', function() {
-      if (!self.didResize) {
-        self.didResize = true
-        Waypoint.requestAnimationFrame(resizeHandler)
-      }
-    })
-  }
-
-  /* Private */
-  Context.prototype.createThrottledScrollHandler = function() {
-    var self = this
-    function scrollHandler() {
-      self.handleScroll()
-      self.didScroll = false
-    }
-
-    this.adapter.on('scroll.waypoints', function() {
-      if (!self.didScroll || Waypoint.isTouch) {
-        self.didScroll = true
-        Waypoint.requestAnimationFrame(scrollHandler)
-      }
-    })
-  }
-
-  /* Private */
-  Context.prototype.handleResize = function() {
-    Waypoint.Context.refreshAll()
-  }
-
-  /* Private */
-  Context.prototype.handleScroll = function() {
-    var triggeredGroups = {}
-    var axes = {
-      horizontal: {
-        newScroll: this.adapter.scrollLeft(),
-        oldScroll: this.oldScroll.x,
-        forward: 'right',
-        backward: 'left'
-      },
-      vertical: {
-        newScroll: this.adapter.scrollTop(),
-        oldScroll: this.oldScroll.y,
-        forward: 'down',
-        backward: 'up'
-      }
-    }
-
-    for (var axisKey in axes) {
-      var axis = axes[axisKey]
-      var isForward = axis.newScroll > axis.oldScroll
-      var direction = isForward ? axis.forward : axis.backward
-
-      for (var waypointKey in this.waypoints[axisKey]) {
-        var waypoint = this.waypoints[axisKey][waypointKey]
-        var wasBeforeTriggerPoint = axis.oldScroll < waypoint.triggerPoint
-        var nowAfterTriggerPoint = axis.newScroll >= waypoint.triggerPoint
-        var crossedForward = wasBeforeTriggerPoint && nowAfterTriggerPoint
-        var crossedBackward = !wasBeforeTriggerPoint && !nowAfterTriggerPoint
-        if (crossedForward || crossedBackward) {
-          waypoint.queueTrigger(direction)
-          triggeredGroups[waypoint.group.id] = waypoint.group
-        }
-      }
-    }
-
-    for (var groupKey in triggeredGroups) {
-      triggeredGroups[groupKey].flushTriggers()
-    }
-
-    this.oldScroll = {
-      x: axes.horizontal.newScroll,
-      y: axes.vertical.newScroll
-    }
-  }
-
-  /* Private */
-  Context.prototype.innerHeight = function() {
-    /*eslint-disable eqeqeq */
-    if (this.element == this.element.window) {
-      return Waypoint.viewportHeight()
-    }
-    /*eslint-enable eqeqeq */
-    return this.adapter.innerHeight()
-  }
-
-  /* Private */
-  Context.prototype.remove = function(waypoint) {
-    delete this.waypoints[waypoint.axis][waypoint.key]
-    this.checkEmpty()
-  }
-
-  /* Private */
-  Context.prototype.innerWidth = function() {
-    /*eslint-disable eqeqeq */
-    if (this.element == this.element.window) {
-      return Waypoint.viewportWidth()
-    }
-    /*eslint-enable eqeqeq */
-    return this.adapter.innerWidth()
-  }
-
-  /* Public */
-  /* http://imakewebthings.com/waypoints/api/context-destroy */
-  Context.prototype.destroy = function() {
-    var allWaypoints = []
-    for (var axis in this.waypoints) {
-      for (var waypointKey in this.waypoints[axis]) {
-        allWaypoints.push(this.waypoints[axis][waypointKey])
-      }
-    }
-    for (var i = 0, end = allWaypoints.length; i < end; i++) {
-      allWaypoints[i].destroy()
-    }
-  }
-
-  /* Public */
-  /* http://imakewebthings.com/waypoints/api/context-refresh */
-  Context.prototype.refresh = function() {
-    /*eslint-disable eqeqeq */
-    var isWindow = this.element == this.element.window
-    /*eslint-enable eqeqeq */
-    var contextOffset = isWindow ? undefined : this.adapter.offset()
-    var triggeredGroups = {}
-    var axes
-
-    this.handleScroll()
-    axes = {
-      horizontal: {
-        contextOffset: isWindow ? 0 : contextOffset.left,
-        contextScroll: isWindow ? 0 : this.oldScroll.x,
-        contextDimension: this.innerWidth(),
-        oldScroll: this.oldScroll.x,
-        forward: 'right',
-        backward: 'left',
-        offsetProp: 'left'
-      },
-      vertical: {
-        contextOffset: isWindow ? 0 : contextOffset.top,
-        contextScroll: isWindow ? 0 : this.oldScroll.y,
-        contextDimension: this.innerHeight(),
-        oldScroll: this.oldScroll.y,
-        forward: 'down',
-        backward: 'up',
-        offsetProp: 'top'
-      }
-    }
-
-    for (var axisKey in axes) {
-      var axis = axes[axisKey]
-      for (var waypointKey in this.waypoints[axisKey]) {
-        var waypoint = this.waypoints[axisKey][waypointKey]
-        var adjustment = waypoint.options.offset
-        var oldTriggerPoint = waypoint.triggerPoint
-        var elementOffset = 0
-        var freshWaypoint = oldTriggerPoint == null
-        var contextModifier, wasBeforeScroll, nowAfterScroll
-        var triggeredBackward, triggeredForward
-
-        if (waypoint.element !== waypoint.element.window) {
-          elementOffset = waypoint.adapter.offset()[axis.offsetProp]
-        }
-
-        if (typeof adjustment === 'function') {
-          adjustment = adjustment.apply(waypoint)
-        }
-        else if (typeof adjustment === 'string') {
-          adjustment = parseFloat(adjustment)
-          if (waypoint.options.offset.indexOf('%') > - 1) {
-            adjustment = Math.ceil(axis.contextDimension * adjustment / 100)
-          }
-        }
-
-        contextModifier = axis.contextScroll - axis.contextOffset
-        waypoint.triggerPoint = elementOffset + contextModifier - adjustment
-        wasBeforeScroll = oldTriggerPoint < axis.oldScroll
-        nowAfterScroll = waypoint.triggerPoint >= axis.oldScroll
-        triggeredBackward = wasBeforeScroll && nowAfterScroll
-        triggeredForward = !wasBeforeScroll && !nowAfterScroll
-
-        if (!freshWaypoint && triggeredBackward) {
-          waypoint.queueTrigger(axis.backward)
-          triggeredGroups[waypoint.group.id] = waypoint.group
-        }
-        else if (!freshWaypoint && triggeredForward) {
-          waypoint.queueTrigger(axis.forward)
-          triggeredGroups[waypoint.group.id] = waypoint.group
-        }
-        else if (freshWaypoint && axis.oldScroll >= waypoint.triggerPoint) {
-          waypoint.queueTrigger(axis.forward)
-          triggeredGroups[waypoint.group.id] = waypoint.group
-        }
-      }
-    }
-
-    Waypoint.requestAnimationFrame(function() {
-      for (var groupKey in triggeredGroups) {
-        triggeredGroups[groupKey].flushTriggers()
-      }
-    })
-
-    return this
-  }
-
-  /* Private */
-  Context.findOrCreateByElement = function(element) {
-    return Context.findByElement(element) || new Context(element)
-  }
-
-  /* Private */
-  Context.refreshAll = function() {
-    for (var contextId in contexts) {
-      contexts[contextId].refresh()
-    }
-  }
-
-  /* Public */
-  /* http://imakewebthings.com/waypoints/api/context-find-by-element */
-  Context.findByElement = function(element) {
-    return contexts[element.waypointContextKey]
-  }
-
-  window.onload = function() {
-    if (oldWindowLoad) {
-      oldWindowLoad()
-    }
-    Context.refreshAll()
-  }
-
-  Waypoint.requestAnimationFrame = function(callback) {
-    var requestFn = window.requestAnimationFrame ||
-      window.mozRequestAnimationFrame ||
-      window.webkitRequestAnimationFrame ||
-      requestAnimationFrameShim
-    requestFn.call(window, callback)
-  }
-  Waypoint.Context = Context
-}())
diff --git a/geode-book/master_middleman/source/javascripts/waypoints/group.js b/geode-book/master_middleman/source/javascripts/waypoints/group.js
deleted file mode 100644
index 3f14d7c..0000000
--- a/geode-book/master_middleman/source/javascripts/waypoints/group.js
+++ /dev/null
@@ -1,120 +0,0 @@
-//Licensed to the Apache Software Foundation (ASF) under one or more
-//contributor license agreements.  See the NOTICE file distributed with
-//this work for additional information regarding copyright ownership.
-//The ASF licenses this file to You under the Apache License, Version 2.0
-//(the "License"); you may not use this file except in compliance with
-//the License.  You may obtain a copy of the License at
-//
-//http://www.apache.org/licenses/LICENSE-2.0
-//
-//Unless required by applicable law or agreed to in writing, software
-//distributed under the License is distributed on an "AS IS" BASIS,
-//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
-//express or implied. See the License for the specific language governing
-//permissions and limitations under the License.
-
-(function() {
-  'use strict'
-
-  function byTriggerPoint(a, b) {
-    return a.triggerPoint - b.triggerPoint
-  }
-
-  function byReverseTriggerPoint(a, b) {
-    return b.triggerPoint - a.triggerPoint
-  }
-
-  var groups = {
-    vertical: {},
-    horizontal: {}
-  }
-  var Waypoint = window.Waypoint
-
-  /* http://imakewebthings.com/waypoints/api/group */
-  function Group(options) {
-    this.name = options.name
-    this.axis = options.axis
-    this.id = this.name + '-' + this.axis
-    this.waypoints = []
-    this.clearTriggerQueues()
-    groups[this.axis][this.name] = this
-  }
-
-  /* Private */
-  Group.prototype.add = function(waypoint) {
-    this.waypoints.push(waypoint)
-  }
-
-  /* Private */
-  Group.prototype.clearTriggerQueues = function() {
-    this.triggerQueues = {
-      up: [],
-      down: [],
-      left: [],
-      right: []
-    }
-  }
-
-  /* Private */
-  Group.prototype.flushTriggers = function() {
-    for (var direction in this.triggerQueues) {
-      var waypoints = this.triggerQueues[direction]
-      var reverse = direction === 'up' || direction === 'left'
-      waypoints.sort(reverse ? byReverseTriggerPoint : byTriggerPoint)
-      for (var i = 0, end = waypoints.length; i < end; i += 1) {
-        var waypoint = waypoints[i]
-        if (waypoint.options.continuous || i === waypoints.length - 1) {
-          waypoint.trigger([direction])
-        }
-      }
-    }
-    this.clearTriggerQueues()
-  }
-
-  /* Private */
-  Group.prototype.next = function(waypoint) {
-    this.waypoints.sort(byTriggerPoint)
-    var index = Waypoint.Adapter.inArray(waypoint, this.waypoints)
-    var isLast = index === this.waypoints.length - 1
-    return isLast ? null : this.waypoints[index + 1]
-  }
-
-  /* Private */
-  Group.prototype.previous = function(waypoint) {
-    this.waypoints.sort(byTriggerPoint)
-    var index = Waypoint.Adapter.inArray(waypoint, this.waypoints)
-    return index ? this.waypoints[index - 1] : null
-  }
-
-  /* Private */
-  Group.prototype.queueTrigger = function(waypoint, direction) {
-    this.triggerQueues[direction].push(waypoint)
-  }
-
-  /* Private */
-  Group.prototype.remove = function(waypoint) {
-    var index = Waypoint.Adapter.inArray(waypoint, this.waypoints)
-    if (index > -1) {
-      this.waypoints.splice(index, 1)
-    }
-  }
-
-  /* Public */
-  /* http://imakewebthings.com/waypoints/api/first */
-  Group.prototype.first = function() {
-    return this.waypoints[0]
-  }
-
-  /* Public */
-  /* http://imakewebthings.com/waypoints/api/last */
-  Group.prototype.last = function() {
-    return this.waypoints[this.waypoints.length - 1]
-  }
-
-  /* Private */
-  Group.findOrCreate = function(options) {
-    return groups[options.axis][options.name] || new Group(options)
-  }
-
-  Waypoint.Group = Group
-}())
diff --git a/geode-book/master_middleman/source/javascripts/waypoints/noframeworkAdapter.js b/geode-book/master_middleman/source/javascripts/waypoints/noframeworkAdapter.js
deleted file mode 100644
index 4c55ca9..0000000
--- a/geode-book/master_middleman/source/javascripts/waypoints/noframeworkAdapter.js
+++ /dev/null
@@ -1,228 +0,0 @@
-//Licensed to the Apache Software Foundation (ASF) under one or more
-//contributor license agreements.  See the NOTICE file distributed with
-//this work for additional information regarding copyright ownership.
-//The ASF licenses this file to You under the Apache License, Version 2.0
-//(the "License"); you may not use this file except in compliance with
-//the License.  You may obtain a copy of the License at
-//
-//http://www.apache.org/licenses/LICENSE-2.0
-//
-//Unless required by applicable law or agreed to in writing, software
-//distributed under the License is distributed on an "AS IS" BASIS,
-//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
-//express or implied. See the License for the specific language governing
-//permissions and limitations under the License.
-
-(function() {
-  'use strict'
-
-  var Waypoint = window.Waypoint
-
-  function isWindow(element) {
-    return element === element.window
-  }
-
-  function getWindow(element) {
-    if (isWindow(element)) {
-      return element
-    }
-    return element.defaultView
-  }
-
-  function classNameRegExp(className) {
-    return new RegExp("\\b" + className + "\\b");
-  }
-
-  function NoFrameworkAdapter(element) {
-    this.element = element
-    this.handlers = {}
-  }
-
-  NoFrameworkAdapter.prototype.innerHeight = function() {
-    var isWin = isWindow(this.element)
-    return isWin ? this.element.innerHeight : this.element.clientHeight
-  }
-
-  NoFrameworkAdapter.prototype.innerWidth = function() {
-    var isWin = isWindow(this.element)
-    return isWin ? this.element.innerWidth : this.element.clientWidth
-  }
-
-  NoFrameworkAdapter.prototype.off = function(event, handler) {
-    function removeListeners(element, listeners, handler) {
-      for (var i = 0, end = listeners.length - 1; i < end; i++) {
-        var listener = listeners[i]
-        if (!handler || handler === listener) {
-          element.removeEventListener(listener)
-        }
-      }
-    }
-
-    var eventParts = event.split('.')
-    var eventType = eventParts[0]
-    var namespace = eventParts[1]
-    var element = this.element
-
-    if (namespace && this.handlers[namespace] && eventType) {
-      removeListeners(element, this.handlers[namespace][eventType], handler)
-      this.handlers[namespace][eventType] = []
-    }
-    else if (eventType) {
-      for (var ns in this.handlers) {
-        removeListeners(element, this.handlers[ns][eventType] || [], handler)
-        this.handlers[ns][eventType] = []
-      }
-    }
-    else if (namespace && this.handlers[namespace]) {
-      for (var type in this.handlers[namespace]) {
-        removeListeners(element, this.handlers[namespace][type], handler)
-      }
-      this.handlers[namespace] = {}
-    }
-  }
-
-  /* Adapted from jQuery 1.x offset() */
-  NoFrameworkAdapter.prototype.offset = function() {
-    if (!this.element.ownerDocument) {
-      return null
-    }
-
-    var documentElement = this.element.ownerDocument.documentElement
-    var win = getWindow(this.element.ownerDocument)
-    var rect = {
-      top: 0,
-      left: 0
-    }
-
-    if (this.element.getBoundingClientRect) {
-      rect = this.element.getBoundingClientRect()
-    }
-
-    return {
-      top: rect.top + win.pageYOffset - documentElement.clientTop,
-      left: rect.left + win.pageXOffset - documentElement.clientLeft
-    }
-  }
-
-  NoFrameworkAdapter.prototype.on = function(event, handler) {
-    var eventParts = event.split('.')
-    var eventType = eventParts[0]
-    var namespace = eventParts[1] || '__default'
-    var nsHandlers = this.handlers[namespace] = this.handlers[namespace] || {}
-    var nsTypeList = nsHandlers[eventType] = nsHandlers[eventType] || []
-
-    nsTypeList.push(handler)
-    this.element.addEventListener(eventType, handler)
-  }
-
-  NoFrameworkAdapter.prototype.outerHeight = function(includeMargin) {
-    var height = this.innerHeight()
-    var computedStyle
-
-    if (includeMargin && !isWindow(this.element)) {
-      computedStyle = window.getComputedStyle(this.element)
-      height += parseInt(computedStyle.marginTop, 10)
-      height += parseInt(computedStyle.marginBottom, 10)
-    }
-
-    return height
-  }
-
-  NoFrameworkAdapter.prototype.outerWidth = function(includeMargin) {
-    var width = this.innerWidth()
-    var computedStyle
-
-    if (includeMargin && !isWindow(this.element)) {
-      computedStyle = window.getComputedStyle(this.element)
-      width += parseInt(computedStyle.marginLeft, 10)
-      width += parseInt(computedStyle.marginRight, 10)
-    }
-
-    return width
-  }
-
-  NoFrameworkAdapter.prototype.scrollLeft = function() {
-    var win = getWindow(this.element)
-    return win ? win.pageXOffset : this.element.scrollLeft
-  }
-
-  NoFrameworkAdapter.prototype.scrollTop = function() {
-    var win = getWindow(this.element)
-    return win ? win.pageYOffset : this.element.scrollTop
-  }
-
-  NoFrameworkAdapter.prototype.height = function(newHeight) {
-    this.element.style.height = newHeight;
-  }
-
-  NoFrameworkAdapter.prototype.removeClass = function(className) {
-    this.element.className = this.element.className.replace(classNameRegExp(className), '');
-  }
-
-  NoFrameworkAdapter.prototype.toggleClass = function(className, addClass) {
-    var check = classNameRegExp(className);
-    if (check.test(this.element.className)) {
-      if (!addClass) {
-        this.removeClass(className);
-      }
-    } else {
-      this.element.className += ' ' + className;
-    }
-  }
-
-  NoFrameworkAdapter.prototype.parent = function() {
-    return new NoFrameworkAdapter(this.element.parentNode);
-  }
-
-  NoFrameworkAdapter.prototype.wrap = function(wrapper) {
-    this.element.insertAdjacentHTML('beforebegin', wrapper)
-    var wrapperNode = this.element.previousSibling
-    this.element.parentNode.removeChild(this.element)
-    wrapperNode.appendChild(this.element)
-  }
-
-  NoFrameworkAdapter.extend = function() {
-    var args = Array.prototype.slice.call(arguments)
-
-    function merge(target, obj) {
-      if (typeof target === 'object' && typeof obj === 'object') {
-        for (var key in obj) {
-          if (obj.hasOwnProperty(key)) {
-            target[key] = obj[key]
-          }
-        }
-      }
-
-      return target
-    }
-
-    for (var i = 1, end = args.length; i < end; i++) {
-      merge(args[0], args[i])
-    }
-    return args[0]
-  }
-
-  NoFrameworkAdapter.inArray = function(element, array, i) {
-    return array == null ? -1 : array.indexOf(element, i)
-  }
-
-  NoFrameworkAdapter.isEmptyObject = function(obj) {
-    /* eslint no-unused-vars: 0 */
-    for (var name in obj) {
-      return false
-    }
-    return true
-  }
-
-  NoFrameworkAdapter.proxy = function(func, obj) {
-    return function() {
-      return func.apply(obj, arguments);
-    }
-  }
-
-  Waypoint.adapters.push({
-    name: 'noframework',
-    Adapter: NoFrameworkAdapter
-  })
-  Waypoint.Adapter = NoFrameworkAdapter
-}())
diff --git a/geode-book/master_middleman/source/javascripts/waypoints/sticky.js b/geode-book/master_middleman/source/javascripts/waypoints/sticky.js
deleted file mode 100644
index 371cac0..0000000
--- a/geode-book/master_middleman/source/javascripts/waypoints/sticky.js
+++ /dev/null
@@ -1,78 +0,0 @@
-//Licensed to the Apache Software Foundation (ASF) under one or more
-//contributor license agreements.  See the NOTICE file distributed with
-//this work for additional information regarding copyright ownership.
-//The ASF licenses this file to You under the Apache License, Version 2.0
-//(the "License"); you may not use this file except in compliance with
-//the License.  You may obtain a copy of the License at
-//
-//http://www.apache.org/licenses/LICENSE-2.0
-//
-//Unless required by applicable law or agreed to in writing, software
-//distributed under the License is distributed on an "AS IS" BASIS,
-//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
-//express or implied. See the License for the specific language governing
-//permissions and limitations under the License.
-
-(function() {
-  'use strict'
-
-  var Waypoint = window.Waypoint;
-  var adapter = Waypoint.Adapter;
-
-  /* http://imakewebthings.com/waypoints/shortcuts/sticky-elements */
-  function Sticky(options) {
-    this.options = adapter.extend({}, Waypoint.defaults, Sticky.defaults, options)
-    this.element = this.options.element
-    this.$element = new adapter(this.element)
-    this.createWrapper()
-    this.createWaypoint()
-  }
-
-  /* Private */
-  Sticky.prototype.createWaypoint = function() {
-    var originalHandler = this.options.handler
-
-    this.waypoint = new Waypoint(adapter.extend({}, this.options, {
-      element: this.wrapper,
-      handler: adapter.proxy(function(direction) {
-        var shouldBeStuck = this.options.direction.indexOf(direction) > -1
-        var wrapperHeight = shouldBeStuck ? this.$element.outerHeight(true) : ''
-
-        this.$wrapper.height(wrapperHeight)
-        this.$element.toggleClass(this.options.stuckClass, shouldBeStuck)
-
-        if (originalHandler) {
-          originalHandler.call(this, direction)
-        }
-      }, this)
-    }))
-  }
-
-  /* Private */
-  Sticky.prototype.createWrapper = function() {
-    if (this.options.wrapper) {
-      this.$element.wrap(this.options.wrapper)
-    }
-    this.$wrapper = this.$element.parent()
-    this.wrapper = this.$wrapper.element
-  }
-
-  /* Public */
-  Sticky.prototype.destroy = function() {
-    if (this.$element.parent().element === this.wrapper) {
-      this.waypoint.destroy()
-      this.$element.removeClass(this.options.stuckClass)
-      if (this.options.wrapper) {
-        this.$element.unwrap()
-      }
-    }
-  }
-
-  Sticky.defaults = {
-    wrapper: '<div class="sticky-wrapper" />',
-    stuckClass: 'stuck',
-    direction: 'down right'
-  }
-
-  Waypoint.Sticky = Sticky
-}())
diff --git a/geode-book/master_middleman/source/javascripts/waypoints/waypoint.js b/geode-book/master_middleman/source/javascripts/waypoints/waypoint.js
deleted file mode 100644
index 0196b04..0000000
--- a/geode-book/master_middleman/source/javascripts/waypoints/waypoint.js
+++ /dev/null
@@ -1,175 +0,0 @@
-//Licensed to the Apache Software Foundation (ASF) under one or more
-//contributor license agreements.  See the NOTICE file distributed with
-//this work for additional information regarding copyright ownership.
-//The ASF licenses this file to You under the Apache License, Version 2.0
-//(the "License"); you may not use this file except in compliance with
-//the License.  You may obtain a copy of the License at
-//
-//http://www.apache.org/licenses/LICENSE-2.0
-//
-//Unless required by applicable law or agreed to in writing, software
-//distributed under the License is distributed on an "AS IS" BASIS,
-//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
-//express or implied. See the License for the specific language governing
-//permissions and limitations under the License.
-
-(function() {
-  'use strict'
-
-  var keyCounter = 0
-  var allWaypoints = {}
-
-  /* http://imakewebthings.com/waypoints/api/waypoint */
-  function Waypoint(options) {
-    if (!options) {
-      throw new Error('No options passed to Waypoint constructor')
-    }
-    if (!options.element) {
-      throw new Error('No element option passed to Waypoint constructor')
-    }
-    if (!options.handler) {
-      throw new Error('No handler option passed to Waypoint constructor')
-    }
-
-    this.key = 'waypoint-' + keyCounter
-    this.options = Waypoint.Adapter.extend({}, Waypoint.defaults, options)
-    this.element = this.options.element
-    this.adapter = new Waypoint.Adapter(this.element)
-    this.callback = options.handler
-    this.axis = this.options.horizontal ? 'horizontal' : 'vertical'
-    this.enabled = this.options.enabled
-    this.triggerPoint = null
-    this.group = Waypoint.Group.findOrCreate({
-      name: this.options.group,
-      axis: this.axis
-    })
-    this.context = Waypoint.Context.findOrCreateByElement(this.options.context)
-
-    if (Waypoint.offsetAliases[this.options.offset]) {
-      this.options.offset = Waypoint.offsetAliases[this.options.offset]
-    }
-    this.group.add(this)
-    this.context.add(this)
-    allWaypoints[this.key] = this
-    keyCounter += 1
-  }
-
-  /* Private */
-  Waypoint.prototype.queueTrigger = function(direction) {
-    this.group.queueTrigger(this, direction)
-  }
-
-  /* Private */
-  Waypoint.prototype.trigger = function(args) {
-    if (!this.enabled) {
-      return
-    }
-    if (this.callback) {
-      this.callback.apply(this, args)
-    }
-  }
-
-  /* Public */
-  /* http://imakewebthings.com/waypoints/api/destroy */
-  Waypoint.prototype.destroy = function() {
-    this.context.remove(this)
-    this.group.remove(this)
-    delete allWaypoints[this.key]
-  }
-
-  /* Public */
-  /* http://imakewebthings.com/waypoints/api/disable */
-  Waypoint.prototype.disable = function() {
-    this.enabled = false
-    return this
-  }
-
-  /* Public */
-  /* http://imakewebthings.com/waypoints/api/enable */
-  Waypoint.prototype.enable = function() {
-    this.context.refresh()
-    this.enabled = true
-    return this
-  }
-
-  /* Public */
-  /* http://imakewebthings.com/waypoints/api/next */
-  Waypoint.prototype.next = function() {
-    return this.group.next(this)
-  }
-
-  /* Public */
-  /* http://imakewebthings.com/waypoints/api/previous */
-  Waypoint.prototype.previous = function() {
-    return this.group.previous(this)
-  }
-
-  /* Private */
-  Waypoint.invokeAll = function(method) {
-    var allWaypointsArray = []
-    for (var waypointKey in allWaypoints) {
-      allWaypointsArray.push(allWaypoints[waypointKey])
-    }
-    for (var i = 0, end = allWaypointsArray.length; i < end; i++) {
-      allWaypointsArray[i][method]()
-    }
-  }
-
-  /* Public */
-  /* http://imakewebthings.com/waypoints/api/destroy-all */
-  Waypoint.destroyAll = function() {
-    Waypoint.invokeAll('destroy')
-  }
-
-  /* Public */
-  /* http://imakewebthings.com/waypoints/api/disable-all */
-  Waypoint.disableAll = function() {
-    Waypoint.invokeAll('disable')
-  }
-
-  /* Public */
-  /* http://imakewebthings.com/waypoints/api/enable-all */
-  Waypoint.enableAll = function() {
-    Waypoint.invokeAll('enable')
-  }
-
-  /* Public */
-  /* http://imakewebthings.com/waypoints/api/refresh-all */
-  Waypoint.refreshAll = function() {
-    Waypoint.Context.refreshAll()
-  }
-
-  /* Public */
-  /* http://imakewebthings.com/waypoints/api/viewport-height */
-  Waypoint.viewportHeight = function() {
-    return window.innerHeight || document.documentElement.clientHeight
-  }
-
-  /* Public */
-  /* http://imakewebthings.com/waypoints/api/viewport-width */
-  Waypoint.viewportWidth = function() {
-    return document.documentElement.clientWidth
-  }
-
-  Waypoint.adapters = []
-
-  Waypoint.defaults = {
-    context: window,
-    continuous: true,
-    enabled: true,
-    group: 'default',
-    horizontal: false,
-    offset: 0
-  }
-
-  Waypoint.offsetAliases = {
-    'bottom-in-view': function() {
-      return this.context.innerHeight() - this.adapter.outerHeight()
-    },
-    'right-in-view': function() {
-      return this.context.innerWidth() - this.adapter.outerWidth()
-    }
-  }
-
-  window.Waypoint = Waypoint
-}())
diff --git a/geode-book/master_middleman/source/layouts/_book-footer.erb b/geode-book/master_middleman/source/layouts/_book-footer.erb
deleted file mode 100644
index c3b93f6..0000000
--- a/geode-book/master_middleman/source/layouts/_book-footer.erb
+++ /dev/null
@@ -1,23 +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.
--->
-<div class="copyright">
-  <a href='/'>Apache Geode Documentation</a>
-  &copy; <%= Time.now.year %> <a href='http://www.apache.org/'>The Apache Software Foundation</a>.
-</div>
-<div class="support">
-  Need help? <a href="<%=vars.support_url%>" target="_blank">Visit the Community</a>
-</div>
diff --git a/geode-book/master_middleman/source/layouts/_local-header.erb b/geode-book/master_middleman/source/layouts/_local-header.erb
deleted file mode 100644
index 3c98674..0000000
--- a/geode-book/master_middleman/source/layouts/_local-header.erb
+++ /dev/null
@@ -1,27 +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.
--->
-<span style="font-weight:200;font-size:31px;" style="float:left;">
-  <% if vars.local_header_img %>
-    <img src="<%=vars.local_header_img%>" style="height:26px;">
-  <% end %>
-  <%= vars.local_header_title %>
-</span>
-<% if vars.changelog_href %>
-  <span class="local-header version-info" style="float:right;">
-    <a href="<%= vars.changelog_href %>">CHANGELOG</a>
-  </span>
-<% end %>
diff --git a/geode-book/master_middleman/source/layouts/_title.erb b/geode-book/master_middleman/source/layouts/_title.erb
deleted file mode 100644
index e9a0956..0000000
--- a/geode-book/master_middleman/source/layouts/_title.erb
+++ /dev/null
@@ -1,21 +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.
--->
-<% if current_page.data.title %>
-  <h1 class="title-container" <%= current_page.data.dita ? 'style="display: none;"' : '' %>>
-    <%= current_page.data.title %>
-  </h1>
-<% end %>
diff --git a/geode-book/master_middleman/source/stylesheets/book-styles.scss b/geode-book/master_middleman/source/stylesheets/book-styles.scss
deleted file mode 100644
index a7ab274..0000000
--- a/geode-book/master_middleman/source/stylesheets/book-styles.scss
+++ /dev/null
@@ -1,18 +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.
-
-* {
-  box-sizing: border-box;
-}
diff --git a/geode-book/master_middleman/source/stylesheets/partials/_book-base-values.scss b/geode-book/master_middleman/source/stylesheets/partials/_book-base-values.scss
deleted file mode 100644
index 93562f4..0000000
--- a/geode-book/master_middleman/source/stylesheets/partials/_book-base-values.scss
+++ /dev/null
@@ -1,14 +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.
diff --git a/geode-book/master_middleman/source/stylesheets/partials/_book-vars.scss b/geode-book/master_middleman/source/stylesheets/partials/_book-vars.scss
deleted file mode 100644
index e2c5e3f..0000000
--- a/geode-book/master_middleman/source/stylesheets/partials/_book-vars.scss
+++ /dev/null
@@ -1,33 +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.
-
-$navy: #243640;
-$blue1: #2185c5;
-$blue2: #a7cae1;
-$bluegray1: #4b6475;
-$teal1: #03786D;
-$teal2: #00a79d;
-
-$color-accent: $teal1;
-$color-accent-bright: $teal2;
-
-// link colors
-$color-link: $blue1;
-$color-link-border: $blue2;
-
-$color-border-tip: $blue2;
-
-$color-bg-header: $navy;
-$color-bg-dark: $bluegray1;
diff --git a/geode-book/master_middleman/source/subnavs/geode-subnav.erb b/geode-book/master_middleman/source/subnavs/geode-subnav.erb
deleted file mode 100644
index 0493253..0000000
--- a/geode-book/master_middleman/source/subnavs/geode-subnav.erb
+++ /dev/null
@@ -1,2518 +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.
--->
-<div id="sub-nav" class="js-sidenav nav-container" role="navigation">
-    <a class="sidenav-title" data-behavior="SubMenuMobile">
-        Doc Index
-    </a>
-    <div class="nav-content">
-        <ul>
-            <li>
-                <a href="/docs/guide/<%=vars.product_version_nodot%>/about_geode.html">Apache Geode Documentation</a>
-            </li>
-            <li class="has_submenu">
-                <a href="/docs/guide/<%=vars.product_version_nodot%>/getting_started/book_intro.html">Getting Started with Apache Geode</a>
-                <ul>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/getting_started/geode_overview.html">About Apache Geode</a>
-                    </li>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/getting_started/product_intro.html">Main Features of Apache Geode</a>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/prereq_and_install.html">Prerequisites and Installation Instructions</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/getting_started/system_requirements/host_machine.html">Host Machine Requirements</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/getting_started/installation/install_standalone.html">How to Install</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/getting_started/setup_classpath.html">Setting Up the CLASSPATH</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/getting_started/uninstall_geode.html">How to Uninstall</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/getting_started/15_minute_quickstart_gfsh.html">Apache Geode in 15 Minutes or Less</a>
-                    </li>
-                </ul>
-            </li>
-            <li class="has_submenu">
-                <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/chapter_overview.html">Configuring and Running a Cluster</a>
-                <ul>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/cluster_config/gfsh_persist.html">Overview of the Cluster Configuration Service</a>
-                    </li>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/cluster_config/persisting_configurations.html">Tutorial—Creating and Using a Cluster Configuration</a>
-                    </li>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/cluster_config/deploying_application_jars.html">Deploying Application JARs to Apache Geode Members</a>
-                    </li>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/cluster_config/using_member_groups.html">Using Member Groups</a>
-                    </li>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/cluster_config/export-import.html">Exporting and Importing Cluster Configurations</a>
-                    </li>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/cluster_config/gfsh_config_troubleshooting.html">Cluster Configuration Files and Troubleshooting</a>
-                    </li>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/cluster_config/gfsh_remote.html">Using gfsh to Manage a Remote Cluster Over HTTP or HTTPS</a>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/running/deploying_config_files.html">Deploying Configuration Files without the Cluster Configuration Service</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/running/deploy_config_files_intro.html">Main Steps to Deploying Configuration Files</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/running/default_file_specs.html">Default File Specifications and Search Locations</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/running/change_file_spec.html">Changing the File Specifications</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/running/deploying_config_jar_files.html">Deploying Configuration Files in JAR Files</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/running/starting_up_shutting_down.html">Starting Up and Shutting Down Your System</a>
-                    </li>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/running/running_the_locator.html">Running Geode Locator Processes</a>
-                    </li>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/running/running_the_cacheserver.html">Running Geode Server Processes</a>
-                    </li>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/running/managing_output_files.html">Managing System Output Files</a>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/running/firewall_ports_config.html">Firewall Considerations</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/running/firewalls_connections.html">Firewalls and Connections</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/running/firewalls_ports.html">Firewalls and Ports</a>
-                            </li>
-                        </ul>
-                    </li>
-                <li>
-                    <a href="/docs/guide/<%=vars.product_version_nodot%>/configuring/running/cluster-management-service.html">Cluster Management Service (Experimental)</a>
-                </li>
-                </ul>
-            </li>
-            <li class="has_submenu">
-                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/book_intro.html">Basic Configuration and Programming</a>
-                <ul>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/config_concepts/chapter_overview.html">
-                            Cluster and Cache Configuration</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/config_concepts/distributed_system_member_configuration.html">Cluster Members</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/gemfire_properties/setting_distributed_properties.html">Setting Properties</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/the_cache/setting_cache_properties.html">Options for Configuring the Cache and Data Regions
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/config_concepts/local_vs_remote.html">Local and Remote Membership and Caching</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/the_cache/chapter_overview.html">Cache Management</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/the_cache/intro_cache_management.html">Introduction to Cache Management</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/the_cache/managing_a_peer_server_cache.html">Managing a Peer or Server Cache</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/the_cache/managing_a_client_cache.html">Managing a Client Cache</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/the_cache/managing_a_secure_cache.html">Managing a Cache in a Secure System</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/the_cache/managing_a_multiuser_cache.html">Managing RegionServices for Multiple Secure Users</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/the_cache/setting_cache_initializer.html">Launching an Application after Initializing the Cache</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/data_regions/chapter_overview.html">Data Regions</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/data_regions/managing_data_regions.html">Region Management</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/data_regions/region_naming.html">Region Naming</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/data_regions/region_shortcuts.html">Region Shortcuts and Custom Named Region Attributes</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/data_regions/store_retrieve_region_shortcuts.html">Storing and Retrieving Region Shortcuts and Custom Named Region Attributes</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/data_regions/managing_region_attributes.html">Managing Region Attributes</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/data_regions/creating_custom_attributes.html">Creating Custom Attributes for Regions and Entries</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/data_regions/new_region_existing_data.html">Building a New Region with Existing Content</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/data_entries_custom_classes/chapter_overview.html">
-                            Data Entries
-                        </a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/data_entries_custom_classes/managing_data_entries.html">Managing Data Entries</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/basic_config/data_entries_custom_classes/using_custom_classes.html">Requirements for Using Custom Classes in Data Caching</a>
-                            </li>
-                        </ul>
-                    </li>
-                </ul>
-            </li>
-            <li class="has_submenu">
-                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/book_intro.html">Topologies and Communication</a>
-                <ul>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/topology_concepts/chapter_overview.html">Topology and Communication General Concepts</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/topology_concepts/topology_types.html">Topology Types</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/topology_concepts/member_communication.html">Planning Topology and Communication
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/topology_concepts/how_member_discovery_works.html">How Member Discovery Works</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/topology_concepts/how_communication_works.html">How Communication Works</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/topology_concepts/using_bind_addresses.html">Using Bind Addresses</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/topology_concepts/IPv4_and_IPv6.html">Choosing Between IPv4 and IPv6</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/p2p_configuration/chapter_overview.html">Peer-to-Peer Configuration</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/p2p_configuration/setting_up_a_p2p_system.html">Configuring Peer-to-Peer Discovery</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/p2p_configuration/setting_up_peer_communication.html">Configuring Peer Communication</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/p2p_configuration/configuring_peer_member_groups.html">Organizing Peers into Logical Member Groups</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/cs_configuration/chapter_overview.html">Client/Server Configuration</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/cs_configuration/standard_client_server_deployment.html">Standard Client/Server Deployment</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/topology_concepts/how_server_discovery_works.html">How Server Discovery Works</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/topology_concepts/how_the_pool_manages_connections.html">How Client/Server Connections Work</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/cs_configuration/setting_up_a_client_server_system.html">Configuring a Client/Server System</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/cs_configuration/configure_servers_into_logical_groups.html">Organizing Servers Into Logical Member Groups</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/cs_configuration/client_server_example_configurations.html">Client/Server Example Configurations</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/cs_configuration/client_server_whats_next.html">Fine-Tuning Your Client/Server Configuration</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/multi_site_configuration/chapter_overview.html">Multi-site (WAN) Configuration</a>
-                        <ul>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/topology_concepts/how_multisite_systems_work.html">How Multi-site (WAN) Systems Work</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/topology_concepts/multisite_overview.html#topic_70045702D3994BC692E75102CE01BD7C">
-                                            Overview of Multi-site Caching</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/topology_concepts/multisite_overview.html#topic_C74A0961937640B199396DC925D8D782">Consistency for WAN Updates</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/topology_concepts/multisite_overview.html#topic_1742957C8D4B4F7590847EB8DB6CD4F7">Discovery for Multi-Site Systems</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/topology_concepts/multisite_overview.html#topic_9AA37B43642D4DE19072CA3367C849BA">Gateway Senders</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/topology_concepts/multisite_overview.html#topic_4DB3D9CF01AD4F4899457D1250468D00">Gateway Receivers</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/multi_site_configuration/multisite_topologies.html">Multi-site (WAN) Topologies</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/topologies_and_comm/multi_site_configuration/setting_up_a_multisite_system.html">Configuring a Multi-site (WAN) System</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/filtering_multisite_events.html">Filtering Events for Multi-Site (WAN) Distribution</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/resolving_multisite_conflicts.html">Resolving Conflicting Events</a>
-                            </li>
-                        </ul>
-                    </li>
-                </ul>
-            </li>
-            <li class="has_submenu">
-                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/book_intro.html">Managing Apache Geode</a>
-                <ul>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/management_and_monitoring.html">Apache Geode Management and Monitoring</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/management_and_monitoring_features.html">Management and Monitoring Features</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/mm_overview.html">Overview of Geode Management and Monitoring Tools</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/management_system_overview.html">
-                                    Architecture and Components</a>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/jmx_manager_node.html">JMX Manager Operations</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/jmx_manager_operations.html">Starting a JMX Manager</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/jmx_manager_operations.html#topic_263072624B8D4CDBAD18B82E07AA44B6">Configuring a JMX Manager</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/jmx_manager_operations.html#topic_5B6DF783A14241399DC25C6EE8D0048A">Stopping a JMX Manager</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/mbean_architecture.html">Federated MBean Architecture</a>
-                                <ul>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/list_of_mbeans.html">List of Geode JMX MBeans</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/list_of_mbeans_full.html">JMX Manager MBeans</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/list_of_mbeans_full.html#topic_48194A5BDF3F40F68E95A114DD702413">Managed Node MBeans</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/mbeans_jconsole.html">Browsing Geode MBeans through JConsole</a>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/mbean_notifications.html">Geode JMX MBean Notifications</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/notification_federation_and_alerts.html">Notification Federation</a>
-                                            </li>
-                                            <li class="has_submenu">
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/list_of_mbean_notifications.html">List of JMX MBean Notifications</a>
-                                                <ul>
-                                                    <li>
-                                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/list_of_mbean_notifications.html#reference_czt_hq2_vj">MemberMXBean Notifications</a>
-                                                    </li>
-                                                    <li>
-                                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/list_of_mbean_notifications.html#reference_dzt_hq2_vj">MemberMXBean Gateway Notifications</a>
-                                                    </li>
-                                                    <li>
-                                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/list_of_mbean_notifications.html#cacheservermxbean_notifications">CacheServerMXBean Notifications</a>
-                                                    </li>
-                                                    <li>
-                                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/list_of_mbean_notifications.html#distributedsystemmxbean_notifications">DistributedSystemMXBean Notifications</a>
-                                                    </li>
-                                                </ul>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/configuring_rmi_connector.html">Configuring RMI Registry Ports and RMI Connectors</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/management/gfsh_and_management_api.html">Executing gfsh Commands through the Management API</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/heap_use/heap_and_off_heap_management.html">Managing Heap and Off-heap Memory</a>
-                        <ul>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/heap_use/heap_management.html">Managing Heap Memory</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/heap_use/heap_management.html#how_the_resource_manager_works">Using the Geode Resource Manager</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/heap_use/heap_management.html#how_the_resource_manager_works__section_EA5E52E65923486488A71E3E6F0DE9DA">How Background Eviction Is Performed</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/heap_use/heap_management.html#configuring_resource_manager_controlling_heap_use">Controlling Heap Use with the Resource Manager</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/heap_use/heap_management.html#configuring_resource_manager__section_4949882892DA46F6BB8588FA97037F45">Configure Geode for Heap LRU Management</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/heap_use/heap_management.html#tuning_jvm_gc_parameters">Tuning the JVM's Garbage Collection Parameters</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/heap_use/heap_management.html#configuring_resource_manager__section_DE1CC494C2B547B083AA00821250972A">Monitor and Tune Heap LRU Configurations</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/heap_use/heap_management.html#resource_manager_example_configurations">Resource Manager Example Configurations</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/heap_use/off_heap_management.html">Managing Off-Heap Memory</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/heap_use/lock_memory.html">Locking Memory (Linux Systems Only)</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/chapter_overview.html">Disk Storage</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/how_disk_stores_work.html">How Disk Stores Work</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/file_names_and_extensions.html">Disk Store File Names and Extensions</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/operation_logs.html">Disk Store Operation Logs</a>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/overview_using_disk_stores.html">Configuring Disk Stores</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/using_disk_stores.html">Designing and Configuring Disk Stores</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/disk_store_configuration_params.html">Disk Store Configuration Parameters</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/using_the_default_disk_store.html">Modifying the Default Disk Store</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/optimize_availability_and_performance.html">
-                                    Optimizing a System with Disk Stores</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/starting_system_with_disk_stores.html">Start Up and Shut Down with Disk Stores</a>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/managing_disk_stores.html">Disk Store Management</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/managing_disk_stores_cmds.html">Disk Store Management Commands and Operations</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/validating_disk_store.html">Validating a Disk Store</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/compacting_disk_stores.html">Running Compaction on Disk Store Log Files</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/keeping_offline_disk_store_in_sync.html">Keeping a Disk Store Synchronized with the Cache</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/disk_free_space_monitoring.html">Configuring Disk Free Space Monitoring
-                                        </a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/handling_missing_disk_stores.html">Handling Missing Disk Stores</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/managing_disk_buffer_flushes.html">Altering When Buffers Are Flushed to Disk</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/disk_storage/backup_restore_disk_store.html">Creating Backups for System Recovery and Operational Management</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/cache_snapshots/chapter_overview.html">Cache and Region Snapshots</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/cache_snapshots/using_cache_and_region_snapshots.html">Usage and Performance Notes</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/cache_snapshots/exporting_a_snapshot.html">Exporting Cache and Region Snapshots</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/cache_snapshots/importing_a_snapshot.html">Importing Cache and Region Snapshots</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/cache_snapshots/filtering_snapshot_entries.html">Filtering Entries During Import or Export</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/cache_snapshots/read_snapshots_programmatically.html">Reading Snapshots Programmatically</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/region_compression.html">Region Compression</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/region_compression.html#concept_a2c_rhc_gl">Guidelines on Using Compression</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/region_compression.html#topic_inm_whc_gl">How to Enable Compression in a Region</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/region_compression.html#topic_hqf_syj_g4">Working with Compressors
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/region_compression.html#topic_omw_j3c_gl">Comparing Performance of Compressed and Non-Compressed Regions</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/network_partitioning/chapter_overview.html">Network Partitioning</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/network_partitioning/how_network_partitioning_management_works.html">How Network Partitioning Management Works</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/network_partitioning/failure_detection.html">Failure Detection and Membership Views</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/network_partitioning/membership_coordinators_lead_members_and_weighting.html">Membership Coordinators, Lead Members and Member Weighting</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/network_partitioning/network_partitioning_scenarios.html">Network Partitioning Scenarios</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/network_partitioning/handling_network_partitioning.html">Configure Apache Geode to Handle Network Partitioning</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/network_partitioning/preventing_network_partitions.html">Preventing Network Partitions</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/chapter_overview.html">Security</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/implementing_security.html">Security Implementation Introduction and Overview</a>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/security_audit_overview.html">Security Detail Considerations</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/security-audit.html">External Interfaces, Ports, and Services</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/security-audit.html#topic_263072624B8D4CDBAD18B82E07AA44B6">Resources That Must Be Protected</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/security-audit.html#topic_5B6DF783A14241399DC25C6EE8D0048A">Log File Locations</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/properties_file.html">Where to Place Security Configuration Settings</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/enable_security.html">Enable Security with Property Definitions</a>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/authentication_overview.html">Authentication</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/implementing_authentication.html">Implementing Authentication</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/authentication_examples.html">Authentication Example</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/authorization_overview.html">Authorization</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/implementing_authorization.html">Implementing Authorization</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/method_invocation_authorizers.html">Method Invocation Authorizers</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/authorization_example.html">Authorization Examples</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/post_processing.html">Post Processing of Region Data</a>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/ssl_overview.html">SSL</a>
-                                <ul>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/implementing_ssl.html">Configuring SSL</a>
-                                    <ul>
-                                        <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/implementing_ssl.html#ssl_configurable_components">SSL-Configurable Components</a>
-                                        </li>
-                                        <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/implementing_ssl.html#ssl_configuration_properties">SSL Configuration Properties</a>
-                                        </li>
-                                        <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/implementing_ssl.html#ssl_property_reference_tables">SSL Property Reference Tables</a>
-                                        </li>
-                                        <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/implementing_ssl.html#implementing_ssl__sec_ssl_impl_proc">Procedure</a>
-                                        </li>
-                                    </ul>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/security/ssl_example.html">SSL Sample Implementation</a>
-                                    </li>
-                                </ul>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/chapter_overview.html">Performance Tuning and Configuration</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/disabling_tcp_syn_cookies.html">Disabling TCP SYN Cookies</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/performance_on_vsphere.html">Improving Performance on vSphere</a>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/performance_controls.html">Performance Controls</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/performance_controls_data_serialization.html">Data Serialization</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/performance_controls_setting_cache_timeouts.html">Setting Cache Timeouts</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/performance_controls_controlling_socket_use.html">Controlling Socket Use</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/performance_controls_managing_slow_receivers.html">Management of Slow Receivers</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/performance_controls_increasing_cache_hits.html">Increasing the Ratio of Cache Hits</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/system_member_performance.html">System Member Performance</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/system_member_performance_distributed_system_member.html">Member Properties</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/system_member_performance_jvm_mem_settings.html">JVM Memory Settings and System Performance</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/system_member_performance_garbage.html">Garbage Collection and System Performance</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/system_member_performance_connection_thread_settings.html">Connection Thread Settings and Performance</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/slow_receivers.html">Slow Receivers with TCP/IP</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/slow_receivers_preventing_problems.html">Preventing Slow Receivers</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/slow_receivers_managing.html">Managing Slow Receivers</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/slow_messages.html">Slow distributed-ack Messages</a>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/socket_communication.html">Socket Communication</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/socket_communication_setting_socket_buffer_sizes.html">Setting Socket Buffer Sizes</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/socket_communication_ephemeral_tcp_port_limits.html">Ephemeral TCP Port Limits</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/socket_communication_have_enough_sockets.html">Making Sure You Have Enough Sockets</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/socket_tcp_keepalive.html">TCP/IP KeepAlive Configuration</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/socket_communication_tcpip_p2p_handshake_timeouts.html">TCP/IP Peer-to-Peer Handshake Timeouts</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/sockets_and_gateways.html">Configuring Sockets in Multi-Site (WAN) Deployments</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/udp_communication.html">UDP Communication</a>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/multicast_communication.html">Multicast Communication</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/multicast_communication_provisioning_bandwidth.html">Provisioning Bandwidth for Multicast</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/multicast_communication_testing_multicast_speed_limits.html">Testing Multicast Speed Limits</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/multicast_communication_configuring_speed_limits.html">Configuring Multicast Speed Limits</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/multicast_communication_runtime_considerations.html">Run-time Considerations for Multicast</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/multicast_communication_troubleshooting.html">Troubleshooting the Multicast Tuning Process</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/monitor_tune/cache_consistency.html">Maintaining Cache Consistency</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/logging/logging.html">Logging</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/logging/how_logging_works.html">How Geode Logging Works</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/logging/logging_categories.html">Understanding Log Messages and Their Categories</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/logging/logging_whats_next.html">Naming, Searching, and Creating Log Files</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/logging/setting_up_logging.html">Set Up Logging</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/logging/configuring_log4j2.html">Advanced Users—Configuring Log4j 2 for Geode</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/statistics/chapter_overview.html">Statistics</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/statistics/how_statistics_work.html">How Statistics Work</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/statistics/transient_region_and_entry_statistics.html">Transient Region and Entry Statistics</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/statistics/application_defined_statistics.html">Application-Defined and Custom Statistics</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/statistics/setting_up_statistics.html">Configuring and Using Statistics</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/statistics/viewing_statistics.html">Viewing Archived Statistics</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/troubleshooting/chapter_overview.html">Troubleshooting and System Recovery</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/troubleshooting/producing_troubleshooting_artifacts.html">Producing Artifacts for Troubleshooting</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/troubleshooting/diagnosing_system_probs.html">Diagnosing System Problems</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/troubleshooting/system_failure_and_recovery.html">System Failure and Recovery</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/member-reconnect.html">Handling Forced Cache Disconnection Using Autoreconnect</a>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/troubleshooting/recovering_from_app_crashes.html">Recovering from Application and Cache Server Crashes</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/troubleshooting/recovering_from_p2p_crashes.html">Recovering from Crashes with a Peer-to-Peer Configuration</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/troubleshooting/recovering_from_cs_crashes.html">Recovering from Crashes with a Client/Server Configuration</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/troubleshooting/recovering_from_machine_crashes.html">Recovering from Machine Crashes</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/troubleshooting/recovering_conflicting_data_exceptions.html">Recovering from ConfictingPersistentDataExceptions</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/troubleshooting/prevent_and_recover_disk_full_errors.html">Preventing and Recovering from Disk Full Errors</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/managing/troubleshooting/recovering_from_network_outages.html">Understanding and Recovering from Network Outages</a>
-                            </li>
-                        </ul>
-                    </li>
-                </ul>
-            </li>
-            <li class="has_submenu">
-                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/book_intro.html">Developing with Apache Geode</a>
-                <ul>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/region_options/chapter_overview.html">
-                            Region Data Storage and Distribution</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/region_options/storage_distribution_options.html">
-                                    Storage and Distribution Options</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/region_options/region_types.html">Region Types</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/region_options/data_hosts_and_accessors.html">Region Data Stores and Data Accessors</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/region_options/dynamic_region_creation.html">Creating Regions Dynamically</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/chapter_overview.html">Partitioned Regions</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/how_partitioning_works.html">Understanding Partitioning</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/managing_partitioned_regions.html">Configuring Partitioned Regions</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/configuring_bucket_for_pr.html">Configuring the Number of Buckets for a Partitioned Region</a>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/overview_custom_partitioning_and_data_colocation.html">Custom-Partitioning and Colocating Data</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/custom_partitioning_and_data_colocation.html">Understanding Custom Partitioning and Data Colocation</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/standard_custom_partitioning.html">Standard Custom Partitioning</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/fixed_custom_partitioning.html">Fixed Custom Partitioning</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/colocating_partitioned_region_data.html">Colocate Data from Different Partitioned Regions</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/overview_how_pr_ha_works.html">Configuring High Availability for Partitioned Regions</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/how_pr_ha_works.html">Understanding High Availability for Partitioned Regions</a>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/configuring_ha_for_pr.html">Configure High Availability for a Partitioned Region</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/set_pr_redundancy.html">Set the Number of Redundant Copies</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/set_redundancy_zones.html">Configure Redundancy Zones for Members</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/set_enforce_unique_host.html">Set Enforce Unique Host</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/set_crash_redundancy_recovery.html">Configure Member Crash Redundancy Recovery for a Partitioned Region</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/set_join_redundancy_recovery.html">Configure Member Join Redundancy Recovery for a Partitioned Region</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/overview_how_pr_single_hop_works.html">Configuring Single-Hop Client Access to Server-Partitioned Regions</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/how_pr_single_hop_works.html">Understanding Client Single-Hop Access to Server-Partitioned Regions</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/configure_pr_single_hop.html">Configure Client Single-Hop Access to Server-Partitioned Regions</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/rebalancing_pr_data.html">Rebalancing Partitioned Region Data</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/checking_region_redundancy.html">Checking Redundancy in Partitioned Regions</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/restoring_region_redundancy.html">Restoring Redundancy in Partitioned Regions</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/moving_partitioned_data.html">Moving Partitioned Region Data to Another Member</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/distributed_regions/chapter_overview.html">
-                            Distributed and Replicated Regions</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/distributed_regions/how_distribution_works.html">How Distribution Works</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/distributed_regions/choosing_level_of_dist.html">Options for Region Distribution</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/distributed_regions/how_replication_works.html">How Replication and Preloading Work</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/distributed_regions/managing_distributed_regions.html">Configure Distributed, Replicated, and Preloaded Regions</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/distributed_regions/locking_in_global_regions.html">Locking in Global Regions</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/distributed_regions/region_entry_versions.html">Consistency for Region Updates</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/distributed_regions/how_region_versioning_works.html#topic_7A4B6C6169BD4B1ABD356294F744D236">
-                                    Consistency Checking by Region Type</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/distributed_regions/how_region_versioning_works.html#topic_B64891585E7F4358A633C792F10FA23E">Configuring Consistency Checking</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/distributed_regions/how_region_versioning_works.html#topic_0BDACA590B2C4974AC9C450397FE70B2">Overhead for Consistency Checks</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/distributed_regions/how_region_versioning_works.html#topic_C5B74CCDD909403C815639339AA03758">How Consistency Checking Works for Replicated Regions</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/distributed_regions/how_region_versioning_works.html#topic_321B05044B6641FCAEFABBF5066BD399">How Destroy and Clear Operations Are Resolved</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/distributed_regions/how_region_versioning_works.html#topic_32ACFA5542C74F3583ECD30467F352B0">Transactions with Consistent Regions</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/general_region_data_management.html">General Region Data Management</a>
-                        <ul>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/storing_data_on_disk/chapter_overview.html">Persistence and Overflow</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/storing_data_on_disk/how_persist_overflow_work.html">How Persistence and Overflow Work</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/storing_data_on_disk/storing_data_on_disk.html">Configure Region Persistence and Overflow</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/storing_data_on_disk/overflow_config_examples.html">Overflow Configuration Examples</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/eviction/chapter_overview.html">Eviction</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/eviction/how_eviction_works.html">How Eviction Works</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/eviction/configuring_data_eviction.html">Configure Data Eviction</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/expiration/chapter_overview.html">Expiration</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/expiration/how_expiration_works.html">How Expiration Works</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/expiration/configuring_data_expiration.html">Configure Data Expiration</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/outside_data_sources/sync_outside_data.html">Keeping the Cache in Sync with Outside Data Sources</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/outside_data_sources/chapter_overview.html">Overview of Outside Data Sources</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/outside_data_sources/configuring_db_connections_using_JNDI.html">Configuring Database Connections Using JNDI</a>
-                                    </li>
-
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/outside_data_sources/how_data_loaders_work.html">How Data Loaders Work</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/outside_data_sources/implementing_data_loaders.html">Implement a Data Loader</a>
-                                    </li>
-                                </ul>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/data_serialization/chapter_overview.html">Data Serialization</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/data_serialization/data_serialization_options.html">Overview of Data Serialization</a>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/data_serialization/gemfire_pdx_serialization.html">Geode PDX Serialization</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/data_serialization/PDX_Serialization_Features.html">Geode PDX Serialization Features</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/data_serialization/use_pdx_high_level_steps.html">High Level Steps for Using PDX Serialization
-                                        </a>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/data_serialization/auto_serialization.html">Using Automatic Reflection-Based PDX Serialization</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/data_serialization/autoserialization_with_class_pattern_strings.html">Customizing Serialization with Class Pattern Strings</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/data_serialization/extending_the_autoserializer.html">Extending the ReflectionBasedAutoSerializer</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/data_serialization/use_pdx_serializer.html">Serializing Your Domain Object with a PdxSerializer</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/data_serialization/use_pdx_serializable.html">Implementing PdxSerializable in Your Domain Object</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/data_serialization/program_application_for_pdx.html">Programming Your Application to Use PdxInstances</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/data_serialization/jsonformatter_pdxinstances.html">Adding JSON Documents to the Geode Cache</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/data_serialization/using_PdxInstanceFactory.html">Using PdxInstanceFactory to Create PdxInstances</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/data_serialization/persist_pdx_metadata_to_disk.html">Persisting PDX Metadata to Disk</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/data_serialization/using_pdx_region_entry_keys.html">Using PDX Objects as Region Entry Keys</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/data_serialization/gemfire_data_serialization.html">Geode Data Serialization (DataSerializable and DataSerializer)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/data_serialization/java_serialization.html">Standard Java Serialization</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/chapter_overview.html">Events and Event Handling</a>
-                        <ul>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/how_events_work.html">How Events Work</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/how_cache_events_work.html">Peer-to-Peer Event Distribution</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/how_client_server_distribution_works.html">Client-to-Server Event Distribution</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/how_multisite_distribution_works.html">
-                                            Multi-Site (WAN) Event Distribution</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/list_of_event_handlers_and_events.html">List of Event Handlers and Events</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/event_handler_overview.html">Implementing Geode Event Handlers</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/implementing_cache_event_handlers.html">Implementing Cache Event Handlers</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/implementing_write_behind_event_handler.html">Implementing an AsyncEventListener for Write-Behind Cache Event Handling</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/writing_callbacks_that_modify_the_cache.html">How to Safely Modify the Cache from an Event Handler Callback</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/cache_event_handler_examples.html">Cache Event Handler Examples</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/configure_p2p_event_messaging.html">Configuring Peer-to-Peer Event Messaging</a>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/configure_client_server_event_messaging.html">Configuring Client/Server Event Messaging
-                                </a>
-                                <ul>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/configuring_highly_available_servers.html">Configuring Highly Available Servers</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/ha_event_messaging_whats_next.html">Highly Available Client/Server Event Messaging</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/implementing_durable_client_server_messaging.html">Implementing Durable Client/Server Messaging</a>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/tune_client_server_event_messaging.html">Tuning Client/Server Event Messaging</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/conflate_server_subscription_queue.html">Conflate the Server Subscription Queue</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/limit_server_subscription_queue_size.html">Limit the Server's Subscription Queue Memory Use
-                                                </a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/tune_client_message_tracking_timeout.html">Tune the Client's Subscription Message Tracking Timeout</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/configure_multisite_event_messaging.html">Configuring Multi-Site (WAN) Event Queues</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/configuring_highly_available_gateway_queues.html">Persisting an Event Queue</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/configuring_gateway_concurrency_levels.html">Configuring Dispatcher Threads and Order Policy for Event Distribution</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/events/conflate_multisite_gateway_queue.html">Conflating Events in a Queue</a>
-                                    </li>
-                                </ul>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/delta_propagation/chapter_overview.html">
-                            Delta Propagation</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/delta_propagation/how_delta_propagation_works.html">How Delta Propagation Works</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/delta_propagation/when_to_use_delta_prop.html">When to Avoid Delta Propagation</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/delta_propagation/delta_propagation_properties.html">Delta Propagation Properties</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/delta_propagation/implementing_delta_propagation.html">Implementing Delta Propagation</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/delta_propagation/errors_in_delta_propagation.html">Errors In Delta Propagation</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/delta_propagation/delta_propagation_example.html">Delta Propagation Example</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/querying_basics/chapter_overview.html">Querying</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/getting_started/querying_quick_reference.html">Querying FAQ and Examples</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/querying_basics/query_basics.html">Querying with OQL</a>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/querying_basics/running_a_query.html">Writing and Executing a Query in OQL</a>
-                                <ul>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/querying_basics/what_is_a_query_string.html">Building a Query String</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_select/the_import_statement.html">IMPORT Statement</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_select/the_from_clause.html">FROM Clause</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_select/the_where_clause.html">WHERE Clause</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_select/the_select_statement.html">SELECT Statement</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_select/aggregates.html">OQL Aggregate Functions</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_additional/query_language_features.html">OQL Syntax and Semantics</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/querying_basics/supported_character_sets.html">Supported Character Sets</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_additional/supported_keywords.html">Supported Keywords</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_additional/case_sensitivity.html">Case Sensitivity</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/querying_basics/comments_in_query_strings.html">Comments in Query Strings</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/querying_basics/query_grammar_and_reserved_words.html">Query Language Grammar</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_additional/operators.html">Operators</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/querying_basics/reserved_words.html">Reserved Words</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_additional/literals.html">Supported Literals</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/querying_basics/restrictions_and_unsupported_features.html">Query Language Restrictions and Unsupported Features</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_additional/advanced_querying.html">Advanced Querying</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/querying_basics/performance_considerations.html">Performance Considerations</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/querying_basics/monitor_queries_for_low_memory.html">Monitoring Low Memory When Querying</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_additional/query_timeout.html">Timeouts for Long-Running Queries</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_additional/using_query_bind_parameters.html">Using Query Bind Parameters</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_additional/querying-a-specific-member.html">Querying a Specific Member</a>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/querying_basics/querying_partitioned_regions.html">
-                                            Querying Partitioned Regions</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_additional/order_by_on_partitioned_regions.html">Using ORDER BY on Partitioned Regions</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_additional/query_on_a_single_node.html">Querying a Partitioned Region on a Single Node</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_additional/partitioned_region_key_or_field_value.html">Optimizing Queries on Data Partitioned by a Key or Field Value</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/partitioned_regions/join_query_partitioned_regions.html">Performing an Equi-Join Query on Partitioned Regions</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_additional/partitioned_region_query_restrictions.html">Partitioned Region Query Restrictions</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_additional/query_debugging.html">Query Debugging</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_index/query_index.html">Working with Indexes</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_index/indexing_guidelines.html">Tips and Guidelines on Using Indexes</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_index/creating_an_index.html">Creating, Listing and Removing Indexes</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_index/creating_key_indexes.html">Creating Key Indexes</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_index/creating_hash_indexes.html">Creating Hash Indexes</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_index/creating_map_indexes.html">Creating Indexes on Map Fields ("Map Indexes")</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_index/create_multiple_indexes.html">Creating Multiple Indexes at Once</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_index/maintaining_indexes.html">Maintaining Indexes (Synchronously or Asynchronously) and Index Storage</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_index/query_index_hints.html">Using Query Index Hints</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_index/indexes_on_single_region_queries.html">Using Indexes on Single Region Queries</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_index/using_indexes_with_equijoin_queries.html">Using Indexes with Equi-Join Queries</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_index/indexes_with_overflow_regions.html">Using Indexes with Overflow Regions</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_index/using_indexes_with_equijoin_queries_multiple_regions.html">Using Indexes on Equi-Join Queries using Multiple Regions</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/query_index/index_samples.html">Index Samples</a>
-                                    </li>
-                                </ul>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/continuous_querying/chapter_overview.html">
-                            Continuous Querying</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/continuous_querying/how_continuous_querying_works.html">How Continuous Querying Works</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/continuous_querying/implementing_continuous_querying.html">Implementing Continuous Querying</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/continuous_querying/continuous_querying_whats_next.html">Managing Continuous Querying</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/transactions/chapter_overview.html">Transactions</a>
-                        <ul>
-                           <li>
-                           <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/transactions/transactions_intro.html">Adherence to ACID Promises</a>
-                           </li>
-                           <li>
-                           <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/transactions/directed_example.html">Code Examples</a>
-                           </li>
-                           <li>
-                           <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/transactions/design_considerations.html">Design Considerations</a>
-                           </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/function_exec/chapter_overview.html">Function Execution</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/function_exec/how_function_execution_works.html">How Function Execution Works</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/developing/function_exec/function_execution.html">Executing a Function in Apache Geode</a>
-                            </li>
-                        </ul>
-                    </li>
-                </ul>
-            </li>
-            <li class="has_submenu">
-                <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/book_intro.html">Developing REST Applications for Apache Geode</a>
-                <ul>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/chapter_overview.html">Geode REST API Overview</a>
-                    </li>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/rest_prereqs.html">Prerequisites and Limitations for Writing REST Applications</a>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/setup_config.html">Setup and Configuration</a>
-                        <ul>
-                        <li><a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/setup_config.html#setup_config_enabling_rest">Enabling the REST API</a></li>
-                        <li><a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/setup_config.html#setup_config_starting_rest">Starting the REST API Service</a></li>
-                        <li><a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/setup_config.html#setup_config_implementing_auth">Implementing Authentication</a></li>
-                        <li><a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/setup_config.html#setup_config_implementing_auth">Programmatic Startup</a></li>
-                        </ul>
-                    </li>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/using_swagger.html">Using the Swagger UI to Browse REST APIs</a>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/develop_rest_apps.html">Developing REST Applications</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/develop_rest_apps.html#topic_qhs_f25_m4">Working with Regions</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/develop_rest_apps.html#topic_fcn_g25_m4">Working with Queries</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/develop_rest_apps.html#topic_rbc_h25_m4">Working with Functions</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/rest_examples.html">Sample REST Applications</a>
-                    </li>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/troubleshooting.html">Troubleshooting and FAQ</a>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/rest_api_reference.html">Apache Geode REST API Reference</a>
-                        <ul>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/rest_regions.html">Region Endpoints</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/get_regions.html">GET /geode/v1</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/get_region_data.html">GET /geode/v1/{region}</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/get_region_keys.html">GET /geode/v1/{region}/keys</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/get_region_key_data.html">GET /geode/v1/{region}/{key}</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/get_region_data_for_multiple_keys.html">GET /geode/v1/{region}/{key1},{key2},...,{keyN}</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/head_region_size.html">HEAD /geode/v1/{region}</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/post_if_absent_data.html">POST /geode/v1/{region}?key=&lt;key&gt;</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/put_update_data.html">PUT /geode/v1/{region}/{key}</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/put_multiple_values_for_keys.html">PUT /geode/v1/{region}/{key1},{key2},...{keyN}</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/put_replace_data.html">PUT /geode/v1/{region}/{key}?op=REPLACE</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/put_update_cas_data.html">PUT /geode/v1/{region}/{key}?op=CAS</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/delete_all_data.html">DELETE /geode/v1/{region}</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/delete_data_for_key.html">DELETE /geode/v1/{region}/{key}</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/delete_data_for_multiple_keys.html">DELETE /geode/v1/{region}/{key1},{key2},...{keyN}</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/rest_queries.html">Query Endpoints</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/get_queries.html">GET /geode/v1/queries</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/post_create_query.html">POST /geode/v1/queries?id=&lt;queryId&gt;&amp;q=&lt;OQL-statement&gt;</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/post_execute_query.html">POST /geode/v1/queries/{queryId}</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/put_update_query.html">PUT /geode/v1/queries/{queryId}</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/delete_named_query.html">DELETE /geode/v1/queries/{queryId}</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/get_execute_adhoc_query.html">GET /geode/v1/queries/adhoc?q=&lt;OQL-statement&gt;</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/rest_functions.html">Function Endpoints</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/get_functions.html">GET /geode/v1/functions</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/post_execute_functions.html">POST /geode/v1/functions/{functionId}</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/rest_admin.html">Administrative Endpoints</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/ping_service.html">[HEAD | GET] /geode/v1/ping</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/rest_apps/get_servers.html">GET /geode/v1/servers</a>
-                                    </li>
-                                </ul>
-                            </li>
-                        </ul>
-                    </li>
-                </ul>
-            </li>
-            <li class="has_submenu">
-                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/book_intro.html">Tools and Modules</a>
-                <ul>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/chapter_overview.html">
-gfsh</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/about_gfsh.html">What You Can Do with gfsh</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/starting_gfsh.html">Starting gfsh</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/configuring_gfsh.html">Configuring the gfsh Environment</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/useful_gfsh_shell_variables.html">Useful gfsh Shell Variables</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/getting_started_gfsh.html">Basic Shell Features and Command-Line Usage</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/json_in_gfsh.html">Specifying JSON within Command-Line Options</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/tour_of_gfsh.html">Tutorial—Performing Common Tasks with gfsh</a>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/gfsh_quick_reference.html">Quick Reference of gfsh Commands by Functional Area</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/quick_ref_commands_by_area.html#topic_77DA6E3929404EB4AC24230CC7C21493">Basic Geode gfsh Commands</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/quick_ref_commands_by_area.html#topic_EB854534301A477BB01058B3B142AE1D">Configuration Commands</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/quick_ref_commands_by_area.html#topic_C7DB8A800D6244AE8FF3ADDCF139DCE4">Data Commands</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/quick_ref_commands_by_area.html#topic_1B47A0E120124EB6BF08A467EB510412">Deployment Commands</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/quick_ref_commands_by_area.html#topic_1ACC91B493EE446E89EC7DBFBBAE00EA">Disk Store Commands</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/quick_ref_commands_by_area.html#topic_10613D4850F04A3EB507F6B441AD3413">Durable CQ and Client Commands</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/quick_ref_commands_by_area.html#topic_8BB061D1A7A9488C819FE2B7881A1278">Function Execution Commands</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/quick_ref_commands_by_area.html#topic_F0AE5CE40D6D49BF92247F5EF4F871D2">Gateway (WAN) Commands</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/quick_ref_commands_by_area.html#topic_B742E9E862BA457082E2346581C97D03">Geode Monitoring Commands</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/quick_ref_commands_by_area.html#topic_688C66526B4649AFA51C0F72F34FA45E">Index Commands</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/quick_ref_commands_by_area.html#topic_2A6DA4078E4E496A9F725A29BC4CFD0D">JMX Connection Commands</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/quick_ref_commands_by_area.html#topic_1C82E6F1B2AF4A65A8DA6B3C846BAC13">Locator Commands</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/quick_ref_commands_by_area.html#topic_lucene_commands">Lucene Commands</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/quick_ref_commands_by_area.html#topic_cvg_bls_5q">PDX Commands</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/quick_ref_commands_by_area.html#topic_EF03129A40EE492984F3B6248596E1DD">Region Commands</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/quick_ref_commands_by_area.html#topic_8A341FF86958466E9E64CF06CD21FED9">Server Commands</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/gfsh_command_index.html">gfsh Command Help</a>
-                                <ul>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/alter.html">alter</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/alter.html#topic_alter_async_event_queue">alter async-event-queue</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/alter.html#topic_99BCAD98BDB5470189662D2F308B68EB">alter disk-store</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/alter.html#topic_alter_query_service">alter query-service</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/alter.html#topic_E74ED23CB60342538B2175C326E7D758">alter region</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/alter.html#topic_7E6B7E1B972D4F418CB45354D1089C2B">alter runtime</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/backup.html">backup disk-store</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/change.html">change loglevel</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/clear.html">clear defined indexes</a>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/close.html">close</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/close.html#topic_4125AAAB9FE44CD787166E48B694C41D">close durable-client</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/close.html#topic_1BC15B3132BA480DB227921A9B3ABDD1">close durable-cq</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/compact.html">compact</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/compact.html#topic_F123C95C076F424E9AA8AC4F1F6324CC">compact disk-store</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/compact.html#topic_9CCFCB2FA2154E16BD775439C8ABC8FB">compact offline-disk-store</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/configure.html">configure</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/connect.html">connect</a>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/create.html">create</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/create.html#topic_ryz_pb1_dk">create async-event-queue</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/create.html#topic_w2t_l3m_qq">create defined indexes</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/create.html#topic_bkn_zty_ck">create disk-store</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/create.html#topic_a4x_pb1_dk">create gateway-receiver</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/create.html#topic_hg2_bjz_ck">create gateway-sender</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/create.html#topic_960A5B6FD3D84E1881EE128E299DD12D">create index</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/create.html#create_jndi-binding">create jndi-binding</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/create.html#create_lucene_index">create lucene index</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/create.html#topic_54B0985FEC5241CA9D26B0CE0A5EA863">create region</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/debug.html">debug</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/define.html">define index</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/deploy.html">deploy</a>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/describe.html">describe</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/describe.html#topic_gyr_jgz_ck">describe client</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/describe.html#topic_3C2C817D999C4E40AF788808B7B6AF99">describe config</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/describe.html#topic_591DC6B781B641268E6173E69AC6D201">describe connection
-                                                </a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/describe.html#topic_C635B500BE6A4F1D9572D0BC98A224F2">describe disk-store</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/describe.html#describe_jndi-binding">describe jndi-binding</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/describe.html#describe_lucene_index">describe lucene index</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/describe.html#topic_D62F3D42B1D84CF68F03D54D5122806A">describe member</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/describe.html#topic_kys_yvk_2l">describe offline-disk-store</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/describe.html#topic_describe_query_service">describe query-service</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/describe.html#topic_DECF7D3D33F54071B6B8AD4EA7E3F90B">describe region
-                                                </a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/destroy.html">destroy</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/destroy.html#topic_destroy-async-event-queue">destroy async-event-queue</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/destroy.html#topic_yfr_l2z_ck">destroy disk-store</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/destroy.html#topic_E48C2DF809054C12A162026D8A2139BB">destroy function</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/destroy.html#destroy-gr">destroy gateway-receiver</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/destroy.html#destroy-gs">destroy gateway-sender</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/destroy.html#topic_D00219CCD6F64C1582A0802AC5CDF3F3">destroy index</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/destroy.html#destroy_jndi-binding">destroy jndi-binding</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/destroy.html#destroy_lucene_index">destroy lucene index</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/destroy.html#topic_BEDACECF4599407794ACBC0E56B30F65">destroy region</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/disconnect.html">disconnect</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/echo.html">echo</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/execute.html">execute function</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/exit.html">exit</a>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/export.html">export</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/export.html#topic_mdv_jgz_ck">export cluster-configuration
-                                                </a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/export.html#topic_C7C69306F93743459E65D46537F4A1EE">export config</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/export.html#topic_263B70069BFC4A7185F86B3272011734">export data</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/export.html#topic_B80978CC659244AE91E2B8CE56EBDFE3">export logs</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/export.html#topic_sjg_bvt_gq">export offline-disk-store</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/export.html#topic_195D27B8B2B64A4E84CF2256636D54BD">export stack-traces</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/gc.html">gc</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/get.html">get</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/help.html">help</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/hint.html">hint</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/history.html">history</a>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/import.html">import</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/import.html#topic_vnv_grz_ck">import cluster-configuration</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/import.html#topic_jw2_2ld_2l">import data</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/list.html">list</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/list.html#topic_j22_kzk_2l">list async-event-queues</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/list.html#topic_ts1_qb1_dk">list clients</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/list.html#topic_59DF60DE71AD4097B281749425254BFF">list deployed
-                                                </a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/list.html#topic_BC14AD57EA304FB3845766898D01BD04">list disk-stores</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/list.html#topic_66016A698C334F4EBA19B99F51B0204B">list durable-cqs</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/list.html#topic_DCC7CCBBEF5942B783A8F2A4A5B2FABF">list functions</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/list.html#topic_B1D89671C7B74074899C7D52F15849ED">list gateways</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/list.html#topic_B3B51B6DEA484EE086C4F657EC9831F2">list indexes</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/list.html#list_jndi-binding">list jndi-binding</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/list.html#list_lucene_indexes">list lucene indexes</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/list.html#topic_5B5BFB2E5F314210858641BE3A689637">list members</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/list.html#topic_F0ECEFF26086474498598035DD83C588">list regions</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/load-balance.html">load-balance gateway-sender</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/locate.html">locate entry</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/netstat.html">netstat</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/pause.html">pause gateway-sender</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/pdx.html">pdx rename</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/put.html">put</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/query.html">query</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/rebalance.html">rebalance</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/remove.html">remove</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/restore.html">restore redundancy</a>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/resume.html">resume</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/resume.html#topic_resume_async_event_queue_dispatcher">resume async-event-queue-dispatcher</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/resume.html#topic_resume_gateway_sender">resume gateway-sender</a>
-                                            </li>
-                                        </ul>
-                                        </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/revoke.html">revoke missing-disk-store</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/run.html">run</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/search.html">search lucene</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/set.html">set variable</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/sh.html">sh</a>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/show.html">show</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/show.html#topic_1225347FAD6541DF995C9999650165B1">show dead-locks</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/show.html#topic_45AAEDAC3AFF46EC9BB68B24FC9A32B3">show log</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/show.html#topic_6EB786C63AEB46179EEE8FA18624295A">show metrics</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/show.html#topic_7B3D624D5B4F41D1A0F8A9C3C8B2E780">show missing-disk-stores</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/show.html#topic_395C96B500AD430CBF3D3C8886A4CD2E">show subscription-queue-size</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/shutdown.html">shutdown</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/sleep.html">sleep</a>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/start.html">start</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/start.html#topic_67738A5B68E84DEE95D1C92DAB2E26E5">start gateway-receiver</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/start.html#topic_AB8BA3F42B9645A8BE9BD97CE2F839A8">start gateway-sender</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/start.html#topic_D00507416F3944DFAB48D2FA2B9E4A31">start jconsole</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/start.html#topic_5B5BF8BEE905463D8B7762B89E2D65E7">start jvisualvm
-                                                </a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/start.html#topic_591260CF25D64562A0EDD7260D2AC6D4">start locator</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/start.html#topic_E906BA7D9E7F4C5890FEFA7ECD40DD77">start pulse</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/start.html#topic_3764EE2DB18B4AE4A625E0354471738A">start server</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/status.html">status</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/status.html#topic_ts1_qb1_dk2">status cluster-config-service</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/status.html#topic_B0F45DC2D5F64FB1A2F738206BC6539E">status gateway-receiver</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/status.html#topic_6F539877F0564F05AF264A9E704EC842">status gateway-sender</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/status.html#topic_E96D0EFA513C4CD79B833FCCDD69C832">status locator</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/status.html#topic_status_redundancy">status redundancy</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/status.html#topic_E5DB49044978404D9D6B1971BF5D400D">status server</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/stop.html">stop</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/stop.html#topic_CD1D526FD6F84A7B80B25C741229ED30">stop gateway-receiver
-                                                </a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/stop.html#topic_0BBDD4B3B8A44A65A610F766C9E85519">stop gateway-sender</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/stop.html#topic_EF61C54B35BA4AB7B14E58CF912F283E">stop locator</a>
-                                            </li>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/stop.html#topic_723EE395A63A40D6819618AFC2902125">stop server</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/undeploy.html">undeploy</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/validate.html">validate offline-disk-store</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command-pages/version.html">version</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/command_scripting.html">Creating and Running gfsh Command Scripts</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/os_command_line_execution.html">Running gfsh Commands on the OS Command Line</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gfsh/cache_xml_2_gfsh.html">Mapping cache.xml Elements to gfsh Configuration Commands</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gemcached/chapter_overview.html">Gemcached</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gemcached/about_gemcached.html">How Gemcached Works</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gemcached/deploying_gemcached.html">Deploying and Configuring a Gemcached Server</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/gemcached/advantages.html">Advantages of Gemcached over Memcached</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/chapter_overview.html">HTTP Session Management Modules</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/quick_start.html">HTTP Session Management Quick Start</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/http_why_use_gemfire.html">Advantages of Using Geode for Session Management</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/common_gemfire_topologies.html">Common Topologies for HTTP Session Management</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/tc_additional_info.html">General Information on HTTP Session Management</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/session_state_log_files.html">Session State Log Files</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/configuring_non_sticky_sessions.html">Configuring Non-Sticky Sessions</a>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/session_mgmt_tcserver.html">HTTP Session Management Module for Pivotal tc Server</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/tc_installing_the_module.html">Installing the HTTP Module for tc Server</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/tc_setting_up_the_module.html">Setting Up the HTTP Module for tc Server</a>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/tc_changing_gf_default_cfg.html">Changing the Default Geode Configuration in the tc Server Module</a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/interactive_mode_ref.html">Interactive Configuration Reference for the tc Server Module
-                                                </a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/session_mgmt_tomcat.html">HTTP Session Management Module for Tomcat</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/tomcat_installing_the_module.html">Installing the HTTP Module for Tomcat</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/tomcat_setting_up_the_module.html">Setting Up the HTTP Module for Tomcat</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/tomcat_changing_gf_default_cfg.html">Changing the Default Geode Configuration in the Tomcat Module</a>
-                                    </li>
-                                </ul>
-                            </li>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/session_mgmt_weblogic.html">HTTP Session Management Module for AppServers</a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/weblogic_setting_up_the_module.html">Setting Up the HTTP Module for AppServers
-                                        </a>
-                                    </li>
-                                    <li class="has_submenu">
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/weblogic_changing_gf_default_cfg.html">Changing the Default Geode Configuration in the AppServers Module
-                                        </a>
-                                        <ul>
-                                            <li>
-                                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/http_session_mgmt/weblogic_common_configuration_changes.html">Common Geode Configuration Changes for AppServers</a>
-                                            </li>
-                                        </ul>
-                                    </li>
-                                </ul>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/pulse/pulse-overview.html">Geode Pulse</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/pulse/pulse-requirements.html">Pulse System Requirements</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/pulse/pulse-embedded.html">Running Pulse in Embedded Mode (Quick Start)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/pulse/pulse-hosted.html">Hosting Pulse on a Web Application Server</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/pulse/pulse-auth.html">Configuring Pulse Authentication</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/pulse/pulse-views.html">Using Pulse Views</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/redis_api_for_geode.html">Redis API for <%=vars.product_name%></a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/redis_api_for_geode.html#using-the-api">Using the Redis API for <%=vars.product_name%></a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/redis_api_for_geode.html#included-commands">Included Redis Commands</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/redis_api_for_geode.html#advantages-over-redis">Advantages of <%=vars.product_name%> over Redis</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/redis_api_for_geode.html#expiration-accuracy">Expiration Accuracy</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/lucene_integration.html">Apache Lucene Integration</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/lucene_integration.html#using-the-apache-lucene-integration">Using the Apache Lucene Integration</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/lucene_integration.html#LuceneRandC">Requirements and Caveats</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/micrometer/micrometer-overview.html">Micrometer</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/micrometer/micrometer-configuration.html">Configuration and Publishing</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/tools_modules/micrometer/micrometer-meters.html">Micrometer Meters and Tags</a>
-                            </li>
-                        </ul>
-                    </li>
-                </ul>
-            </li>
-            <li class="has_submenu">
-                <a href="/docs/guide/<%=vars.product_version_nodot%>/use_cases/book_intro.html">Use Cases</a>
-                <ul>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/use_cases/inline-cache.html">The Inline Cache</a>
-                    </li>
-                </ul>
-            </li>
-            <li class="has_submenu">
-                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/book_intro.html">Reference</a>
-                <ul>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/gemfire_properties.html">gemfire.properties and gfsecurity.properties (Geode Properties)</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/non-ascii_strings_in_config_files.html">Using Non-ASCII Strings in Apache Geode Property Files</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/chapter_overview_cache_xml.html">cache.xml
-                        </a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/elements_ref.html">cache.xml Quick Reference</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/cache-elements-list.html">&lt;cache&gt; Element Hierarchy</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/cache_xml.html">&lt;cache&gt; Element Reference</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/client-cache-elements-list.html">
-                                    &lt;client-cache&gt; Element Hierarchy</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/client-cache.html">&lt;client-cache&gt; Element Reference</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/chapter_overview_regionshortcuts.html">Region Shortcuts</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_table.html">Region Shortcuts Quick Reference</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_w2h_3cd_lk">
-                                    LOCAL
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_wd5_lpy_lk">
-                                    LOCAL_HEAP_LRU
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_adk_y4y_lk">
-                                    LOCAL_OVERFLOW
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_l5r_y4y_lk">
-                                    LOCAL_PERSISTENT
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_a45_y4y_lk">
-                                    LOCAL_PERSISTENT_OVERFLOW
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_ow5_4qy_lk">
-                                    PARTITION
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_twx_y4y_lk">
-                                    PARTITION_HEAP_LRU
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_js1_z4y_lk">
-                                    PARTITION_OVERFLOW
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_d4k_jpy_lk">
-                                    PARTITION_PERSISTENT
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_v5l_jpy_lk">
-                                    PARTITION_PERSISTENT_OVERFLOW
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_v4m_jpy_lk">
-                                    PARTITION_PROXY
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_c1n_jpy_lk">
-                                    PARTITION_PROXY_REDUNDANT
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_shn_jpy_lk">
-                                    PARTITION_REDUNDANT
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_m4n_jpy_lk">
-                                    PARTITION_REDUNDANT_HEAP_LRU
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_own_jpy_lk">
-                                    PARTITION_REDUNDANT_OVERFLOW
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_bd4_jpy_lk">
-                                    PARTITION_REDUNDANT_PERSISTENT
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_xqq_tvc_lk">
-                                    PARTITION_REDUNDANT_PERSISTENT_OVERFLOW
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_wq4_jpy_lk">
-                                    REPLICATE
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_xx4_jpy_lk">
-                                    REPLICATE_HEAP_LRU
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_t2p_jpy_lk">
-                                    REPLICATE_OVERFLOW
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_emp_jpy_lk">
-                                    REPLICATE_PERSISTENT
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_tsp_jpy_lk">
-                                    REPLICATE_PERSISTENT_OVERFLOW
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/region_shortcuts_reference.html#reference_n1q_jpy_lk">
-                                    REPLICATE_PROXY
-                                </a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/handling_exceptions_and_failures.html">
-                            Exceptions and System Failures</a>
-                    </li>
-                    <li>
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/memory_requirements_for_cache_data.html">Memory Requirements for Cached Data</a>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html">Geode Statistics List</a>
-                        <ul>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_DEF8D3644D3246AB8F06FE09A37DC5C8">Cache Performance (CachePerfStats)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_EF5C2C59BFC74FFB8607F9571AB9A471">Cache Server (CacheServerStats)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_B08C0783BBF9489E8BB48B4AEC597C62">Client-Side Notifications (CacheClientUpdaterStats)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_04B7D7387E584712B7710B5ED1E876BB">Client-to-Server Messaging Performance (ClientStats)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_6C247F61DB834C079A16BE92789D4692">Client Connection Pool (PoolStats)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_66C0E7748501480B85209D57D24256D5">Continuous Querying (CQStatistics)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_D4ABED3FF94245C0BEE0F6FC9481E867">Delta Propagation (DeltaPropagationStatistics)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_6C2BECC63A83456190B029DEDB8F4BE3">Disk Space Usage (DiskDirStatistics)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_983BFC6D53C74829A04A91C39E06315F">Disk Usage and Performance (DiskRegionStatistics)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_ACB4161F10D64BC0B15871D003FF6FDF">Distributed System Messaging (DistributionStats)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_78D346A580724E1EA645E31626EECE40">Distributed Lock Services (DLockStats)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_5E212DDB0E8640689AD0A4659512E17A">Function Execution (FunctionServiceStatistics)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_C4199A541B1F4B82B6178C416C0FAE4B">Gateway Queue (GatewayStatistics)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_86A61860024B480592DAC67FFB882538">Indexes (IndexStats)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_607C3867602E410CAE5FAB26A7FF1CB9">JVM Performance</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_C48B654F973E4B44AD825D459C23A6CD">Locator (LocatorStatistics)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#LuceneStats">Lucene Indexes (LuceneIndexStats)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#topic_ohc_tjk_w5">Off-Heap (OffHeapMemoryStats)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_923B28F01BC3416786D3AFBD87F22A5E">Operating System Statistics - Linux</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_35AC170770C944C3A336D9AEC2D2F7C5">Partitioned Regions (PartitionedRegion&lt;partitioned_region_name&gt;Statistics)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_374FBD92A3B74F6FA08AA23047929B4F">Region Entry Eviction – Count-Based (LRUStatistics)
-                                </a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_3D2AA2BCE5B6485699A7B6ADD1C49FF7">Region Entry Eviction – Size-based (LRUStatistics)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_5362EF9AECBC48D69475697109ABEDFA">Server Notifications for All Clients (CacheClientNotifierStatistics)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_E03865F509E543D9B8F9462B3DA6255E">Server Notifications for Single Client (CacheClientProxyStatistics)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_3AB1C0AA55014163A2BBF68E13D25E3A">Server-to-Client Messaging Performance (ClientSubscriptionStats)</a>
-                            </li>
-                            <li>
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/statistics_list.html#section_55F3AF6413474317902845EE4996CC21">Statistics Collection (StatSampler)</a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="has_submenu">
-                        <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/archive_transactions/chapter_overview.html">Transaction Reference Material</a>
-                        <ul>
-                            <li class="has_submenu">
-                                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/archive_transactions/JTA_transactions.html">JTA Global Transactions with Geode
-                                </a>
-                                <ul>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/archive_transactions/JTA_transactions.html#concept_cp1_zx1_wk">Coordinating with External JTA Transaction Managers</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/archive_transactions/JTA_transactions.html#concept_csy_vfb_wk">Using Geode as the "Last Resource" in a Container-Managed JTA Transaction</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/archive_transactions/cache_plugins_with_jta.html">Behavior of Geode Cache Writers and Loaders Under JTA</a>
-                                    </li>
-                                    <li>
-                                        <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/archive_transactions/turning_off_jta.html">Turning Off JTA Transactions
-                                        </a>
-                                    </li>
-                                </ul>
-                            </li>
-                        </ul>
-                    </li>
-                </ul>
-            </li>
-            <li>
-                <a href="/docs/guide/<%=vars.product_version_nodot%>/reference/topics/glossary.html">Glossary</a>
-            </li>
-        </ul>
-    </div>
-</div>
diff --git a/geode-book/redirects.rb b/geode-book/redirects.rb
deleted file mode 100644
index a0b36c9..0000000
--- a/geode-book/redirects.rb
+++ /dev/null
@@ -1,18 +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.
-
-r301 %r{/releases/latest/javadoc/(.*)}, 'http://geode.apache.org/releases/latest/javadoc/$1'
-rewrite '/', '/docs/guide/114/about_geode.html'
-rewrite '/index.html', '/docs/guide/114/about_geode.html'
diff --git a/geode-common-services/build.gradle b/geode-common-services/build.gradle
index 6225974..bef9c5d 100644
--- a/geode-common-services/build.gradle
+++ b/geode-common-services/build.gradle
@@ -31,39 +31,3 @@ dependencies {
 
     compile(project(':geode-common'))
 }
-
-def geodeProjects = ['geode-common-services', 'geode-common']
-
-jar {
-    doFirst {
-        def projectDependencies = []
-        def runtimeList = []
-
-        configurations.runtimeClasspath
-                .collect { it.name - ".jar" }
-                .each { dependency ->
-                    if (dependency.startsWith("geode-")) {
-                        projectDependencies.add(dependency)
-                    } else {
-                        runtimeList.add(dependency)
-                    }
-                }
-
-        projectDependencies.each { projectDependency ->
-            geodeProjects.each { geodeProject ->
-                if (projectDependency.contains(geodeProject)) {
-                    def parentProject = project(":$geodeProject")
-                    if (parentProject != null) {
-                        def collect = parentProject.configurations.runtimeClasspath.collect { it.name - ".jar" }
-                        runtimeList.removeAll(collect)
-                        projectDependencies.removeAll(collect)
-                    }
-                }
-            }
-        }
-        manifest {
-            attributes("Class-Path": runtimeList.join(' '))
-            attributes("Dependent-Modules": projectDependencies.join(' '))
-        }
-    }
-}
diff --git a/geode-common-services/src/main/java/org/apache/geode/services/management/ManagementService.java b/geode-common-services/src/main/java/org/apache/geode/services/management/ManagementService.java
index 5ae23c5..7cc3f39 100644
--- a/geode-common-services/src/main/java/org/apache/geode/services/management/ManagementService.java
+++ b/geode-common-services/src/main/java/org/apache/geode/services/management/ManagementService.java
@@ -15,7 +15,11 @@
 
 package org.apache.geode.services.management;
 
+import java.util.Properties;
+
 import org.apache.geode.annotations.Experimental;
+import org.apache.geode.services.module.ModuleService;
+import org.apache.geode.services.result.ModuleServiceResult;
 
 /**
  * Entry point for creating a cache and bootstrapping Geode using the BootstrappingService
@@ -25,6 +29,8 @@ import org.apache.geode.annotations.Experimental;
 @Experimental
 public interface ManagementService {
 
+  void init(ModuleService moduleService);
+
   /**
    * Creates a Geode Cache given some configuration.
    *
@@ -32,5 +38,5 @@ public interface ManagementService {
    *
    * @throws Exception is Cache cannot be created.
    */
-  // Cache createCache(Properties properties) throws Exception;
+  ModuleServiceResult<Boolean> createCache(Properties properties);
 }
diff --git a/geode-common-services/src/main/java/org/apache/geode/services/module/ModuleDescriptor.java b/geode-common-services/src/main/java/org/apache/geode/services/module/ModuleDescriptor.java
index dc8182d..dd7918d 100644
--- a/geode-common-services/src/main/java/org/apache/geode/services/module/ModuleDescriptor.java
+++ b/geode-common-services/src/main/java/org/apache/geode/services/module/ModuleDescriptor.java
@@ -46,12 +46,15 @@ public class ModuleDescriptor {
   // A collection of module names on which this module depends on
   private final Set<String> dependencies;
 
+  private final boolean requiresJDKPaths;
+
   private ModuleDescriptor(String name, String version, Set<String> resourceJarPaths,
-      Set<String> dependencies) {
+      Set<String> dependencies, boolean requiresJDKPaths) {
     this.name = name;
     this.version = version;
     this.resourceJarPaths = resourceJarPaths;
     this.dependencies = dependencies;
+    this.requiresJDKPaths = requiresJDKPaths;
   }
 
   /**
@@ -82,6 +85,10 @@ public class ModuleDescriptor {
     return name + (version != null ? "-" + version : "");
   }
 
+  public boolean requiresJDKPaths() {
+    return requiresJDKPaths;
+  }
+
   /**
    * A Builder used to construct a {@link ModuleDescriptor}
    */
@@ -91,6 +98,7 @@ public class ModuleDescriptor {
     private final String version;
     private final Set<String> dependencies = new HashSet<>();
     private final Set<String> sources = new HashSet<>();
+    private boolean requiresJDKPaths = false;
 
     public Builder(String name) {
       this(name, null);
@@ -116,7 +124,7 @@ public class ModuleDescriptor {
     }
 
     public Builder dependsOnModules(String... dependencies) {
-      return this.dependsOnModules(Arrays.asList(dependencies));
+      return dependsOnModules(Arrays.asList(dependencies));
     }
 
     public Builder dependsOnModules(Collection<String> dependencies) {
@@ -124,8 +132,13 @@ public class ModuleDescriptor {
       return this;
     }
 
+    public Builder requiresJDKPaths(boolean requiresJDKPaths) {
+      this.requiresJDKPaths = requiresJDKPaths;
+      return this;
+    }
+
     public ModuleDescriptor build() {
-      return new ModuleDescriptor(name, version, sources, dependencies);
+      return new ModuleDescriptor(name, version, sources, dependencies, requiresJDKPaths);
     }
   }
 }
diff --git a/geode-common-services/src/main/java/org/apache/geode/services/module/ModuleService.java b/geode-common-services/src/main/java/org/apache/geode/services/module/ModuleService.java
index e6c693c..29b7fd4 100644
--- a/geode-common-services/src/main/java/org/apache/geode/services/module/ModuleService.java
+++ b/geode-common-services/src/main/java/org/apache/geode/services/module/ModuleService.java
@@ -15,11 +15,16 @@
 
 package org.apache.geode.services.module;
 
-import java.util.Map;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.ServiceLoader;
 import java.util.Set;
 
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.services.result.ModuleServiceResult;
+import org.apache.geode.services.result.impl.Failure;
+import org.apache.geode.services.result.impl.Success;
 
 /**
  * Loads and unloads modules and services in a classloader-isolated manner.
@@ -29,6 +34,52 @@ import org.apache.geode.services.result.ModuleServiceResult;
 @Experimental
 public interface ModuleService {
 
+  static ModuleService getDefaultModuleService() {
+    return new ModuleService() {
+      @Override
+      public ModuleServiceResult<Boolean> loadModule(ModuleDescriptor moduleDescriptor) {
+        return Failure.of("This features is not implemented for a default ModuleService");
+      }
+
+      @Override
+      public ModuleServiceResult<Boolean> registerModule(ModuleDescriptor moduleDescriptor) {
+        return Failure.of("This features is not implemented for a default ModuleService");
+      }
+
+      @Override
+      public ModuleServiceResult<Boolean> unloadModule(String moduleName) {
+        return Failure.of("This features is not implemented for a default ModuleService");
+      }
+
+      @Override
+      public <T> ModuleServiceResult<Set<T>> loadService(Class<T> service) {
+        Set<T> result = new HashSet<>();
+        try {
+          ServiceLoader.load(service).forEach(result::add);
+        } catch (Exception e) {
+          return Failure.of(e.toString());
+        }
+        return Success.of(result);
+      }
+
+      @Override
+      public ModuleServiceResult<Class<?>> loadClass(String className,
+          ModuleDescriptor moduleDescriptor) {
+        return Failure.of("This features is not implemented for a default ModuleService");
+      }
+
+      @Override
+      public ModuleServiceResult<List<Class<?>>> loadClass(String className) {
+        try {
+          return Success.of(Collections.singletonList(
+              this.getClass().getClassLoader().loadClass(className)));
+        } catch (ClassNotFoundException e) {
+          return Failure.of(e.toString());
+        }
+      }
+    };
+  }
+
   /**
    * Loads a module from a resource.
    *
@@ -90,7 +141,7 @@ public interface ModuleService {
    *         used {@link ModuleServiceResult#getErrorMessage()} to get the error message of the
    *         failure.
    */
-  <T> ModuleServiceResult<Map<String, Set<T>>> loadService(Class<T> service);
+  <T> ModuleServiceResult<Set<T>> loadService(Class<T> service);
 
   /**
    * Returns the Class for the provided name for a specific module.
@@ -120,5 +171,5 @@ public interface ModuleService {
    *         used {@link ModuleServiceResult#getErrorMessage()} to get the error message of the
    *         failure.
    */
-  ModuleServiceResult<Map<String, Class<?>>> loadClass(String className);
+  ModuleServiceResult<List<Class<?>>> loadClass(String className);
 }
diff --git a/geode-modules/src/main/java/org/apache/geode/services/result/impl/Failure.java b/geode-common-services/src/main/java/org/apache/geode/services/result/impl/Failure.java
similarity index 100%
rename from geode-modules/src/main/java/org/apache/geode/services/result/impl/Failure.java
rename to geode-common-services/src/main/java/org/apache/geode/services/result/impl/Failure.java
diff --git a/geode-modules/src/main/java/org/apache/geode/services/result/impl/Success.java b/geode-common-services/src/main/java/org/apache/geode/services/result/impl/Success.java
similarity index 100%
rename from geode-modules/src/main/java/org/apache/geode/services/result/impl/Success.java
rename to geode-common-services/src/main/java/org/apache/geode/services/result/impl/Success.java
diff --git a/geode-common/build.gradle b/geode-common/build.gradle
index a8b59b3..52007bd 100755
--- a/geode-common/build.gradle
+++ b/geode-common/build.gradle
@@ -26,40 +26,3 @@ dependencies {
   testImplementation('junit:junit')
   testImplementation('org.assertj:assertj-core')
 }
-
-def geodeProjects = ['geode-common-services','geode-common']
-
-jar {
-  doFirst {
-    def projectDependencies = []
-    def runtimeList = []
-
-    configurations.runtimeClasspath
-            .collect { it.name - ".jar" }
-            .each { dependency ->
-              if (dependency.startsWith("geode-")) {
-                projectDependencies.add(dependency)
-              } else {
-                runtimeList.add(dependency)
-              }
-            }
-
-    projectDependencies.each { projectDependency ->
-      geodeProjects.each { geodeProject ->
-        if (projectDependency.contains(geodeProject)) {
-          def childProject = project(":$geodeProject")
-
-          if (childProject != null) {
-            def collect = childProject.configurations.runtimeClasspath.collect { it.name - ".jar" }
-            runtimeList.removeAll(collect)
-            projectDependencies.removeAll(collect)
-          }
-        }
-      }
-    }
-    manifest {
-      attributes("Class-Path": runtimeList.join(' '))
-      attributes("Dependent-Modules": projectDependencies.join(' '))
-    }
-  }
-}
diff --git a/geode-connectors/build.gradle b/geode-connectors/build.gradle
index 285c425..c0fed4d 100644
--- a/geode-connectors/build.gradle
+++ b/geode-connectors/build.gradle
@@ -57,6 +57,11 @@ dependencies {
   implementation('org.apache.httpcomponents:httpcore')
   implementation('com.fasterxml.jackson.core:jackson-databind')
 
+  testImplementation(project(":geode-modules"))
+  integrationTestImplementation(project(":geode-modules"))
+  acceptanceTestImplementation(project(":geode-modules"))
+  distributedTestImplementation(project(":geode-modules"))
+
   testImplementation(project(':geode-membership'))
   testImplementation(project(':geode-junit')) {
     exclude module: 'geode-core'
diff --git a/geode-core/build.gradle b/geode-core/build.gradle
index 1f3c407..51ce652 100755
--- a/geode-core/build.gradle
+++ b/geode-core/build.gradle
@@ -185,9 +185,15 @@ dependencies {
     //Commons IO is used in persistence and management
     api('commons-io:commons-io')
 
-    //tools.jar seems to be used by gfsh is some cases to control processes using
-    //the sun attach API? But this code path may not even be used?
-    compileOnly(files("${System.getProperty('java.home')}/../lib/tools.jar"))
+  compileOnly(project(":geode-modules"))
+  testImplementation(project(":geode-modules"))
+  integrationTestImplementation(project(":geode-modules"))
+  acceptanceTestImplementation(project(":geode-modules"))
+  distributedTestImplementation(project(":geode-modules"))
+
+  //tools.jar seems to be used by gfsh is some cases to control processes using
+  //the sun attach API? But this code path may not even be used?
+  compileOnly(files("${System.getProperty('java.home')}/../lib/tools.jar"))
 
     //Find bugs is used in multiple places in the code to suppress findbugs warnings
     compileOnly('com.github.stephenc.findbugs:findbugs-annotations')
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemBuilderForTestingIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemBuilderForTestingIntegrationTest.java
index 7a1ae86..acbd405 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemBuilderForTestingIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemBuilderForTestingIntegrationTest.java
@@ -28,6 +28,7 @@ import org.junit.Test;
 import org.apache.geode.CancelCriterion;
 import org.apache.geode.internal.statistics.StatisticsManager;
 import org.apache.geode.internal.statistics.StatisticsManagerFactory;
+import org.apache.geode.services.module.ModuleService;
 
 public class InternalDistributedSystemBuilderForTestingIntegrationTest {
 
@@ -44,10 +45,11 @@ public class InternalDistributedSystemBuilderForTestingIntegrationTest {
         .thenReturn(statisticsManager);
 
     InternalDistributedSystem system =
-        new InternalDistributedSystem.BuilderForTesting(configProperties)
-            .setDistributionManager(distributionManager)
-            .setStatisticsManagerFactory(statisticsManagerFactory)
-            .build();
+        new InternalDistributedSystem.BuilderForTesting(configProperties,
+            ModuleService.getDefaultModuleService())
+                .setDistributionManager(distributionManager)
+                .setStatisticsManagerFactory(statisticsManagerFactory)
+                .build();
 
     assertThat(system.isConnected()).isTrue();
     assertThat(system.getDistributionManager()).isSameAs(distributionManager);
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemBuilderIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemBuilderIntegrationTest.java
index 5bb5ebe..cfcd2f6 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemBuilderIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemBuilderIntegrationTest.java
@@ -29,6 +29,7 @@ import org.junit.Test;
 import org.apache.geode.metrics.internal.MetricsService;
 import org.apache.geode.security.PostProcessor;
 import org.apache.geode.security.SecurityManager;
+import org.apache.geode.services.module.ModuleService;
 
 public class InternalDistributedSystemBuilderIntegrationTest {
 
@@ -52,8 +53,10 @@ public class InternalDistributedSystemBuilderIntegrationTest {
     Properties configProperties = new Properties();
     configProperties.setProperty(NAME, theName);
 
-    system = new InternalDistributedSystem.Builder(configProperties, metricsSessionBuilder)
-        .build();
+    system =
+        new InternalDistributedSystem.Builder(configProperties, metricsSessionBuilder, ModuleService
+            .getDefaultModuleService())
+                .build();
 
     assertThat(system.isConnected()).isTrue();
     assertThat(system.getName()).isEqualTo(theName);
@@ -67,9 +70,10 @@ public class InternalDistributedSystemBuilderIntegrationTest {
     SecurityConfig securityConfig = new SecurityConfig(theSecurityManager, thePostProcessor);
     Properties configProperties = new Properties();
 
-    system = new InternalDistributedSystem.Builder(configProperties, metricsSessionBuilder)
-        .setSecurityConfig(securityConfig)
-        .build();
+    system = new InternalDistributedSystem.Builder(configProperties, metricsSessionBuilder,
+        ModuleService.getDefaultModuleService())
+            .setSecurityConfig(securityConfig)
+            .build();
 
     assertThat(system.getSecurityService().getSecurityManager())
         .isSameAs(theSecurityManager);
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemJUnitTest.java
index eb36865..c634a7a 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemJUnitTest.java
@@ -75,6 +75,7 @@ import org.apache.geode.internal.Config;
 import org.apache.geode.internal.ConfigSource;
 import org.apache.geode.internal.logging.InternalLogWriter;
 import org.apache.geode.metrics.internal.MetricsService;
+import org.apache.geode.services.module.ModuleService;
 import org.apache.geode.test.junit.categories.MembershipTest;
 import org.apache.geode.util.internal.GeodeGlossary;
 
@@ -93,8 +94,9 @@ public class InternalDistributedSystemJUnitTest {
 
   private InternalDistributedSystem createSystem(Properties props,
       MetricsService.Builder metricsSessionBuilder) {
-    this.system = new InternalDistributedSystem.Builder(props, metricsSessionBuilder)
-        .build();
+    this.system = new InternalDistributedSystem.Builder(props, metricsSessionBuilder,
+        ModuleService.getDefaultModuleService())
+            .build();
     return this.system;
   }
 
@@ -659,8 +661,9 @@ public class InternalDistributedSystemJUnitTest {
     MetricsService.Builder metricsSessionBuilder = mock(MetricsService.Builder.class);
     when(metricsSessionBuilder.build(any())).thenReturn(mock(MetricsService.class));
     InternalDistributedSystem sys =
-        new InternalDistributedSystem.Builder(config1.toProperties(), metricsSessionBuilder)
-            .build();
+        new InternalDistributedSystem.Builder(config1.toProperties(), metricsSessionBuilder,
+            ModuleService.getDefaultModuleService())
+                .build();
     try {
 
       props.put(MCAST_PORT, "1");
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemLockMemoryIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemLockMemoryIntegrationTest.java
index 075ad0b..f1a0855 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemLockMemoryIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemLockMemoryIntegrationTest.java
@@ -33,6 +33,7 @@ import org.junit.Test;
 import org.junit.contrib.java.lang.system.RestoreSystemProperties;
 
 import org.apache.geode.metrics.internal.MetricsService;
+import org.apache.geode.services.module.ModuleService;
 import org.apache.geode.util.internal.GeodeGlossary;
 
 public class InternalDistributedSystemLockMemoryIntegrationTest {
@@ -59,7 +60,8 @@ public class InternalDistributedSystemLockMemoryIntegrationTest {
   @Test
   public void lockMemoryAllowedIfAllowMemoryOverCommitIsSet() {
     System.setProperty(GeodeGlossary.GEMFIRE_PREFIX + "Cache.ALLOW_MEMORY_OVERCOMMIT", "true");
-    system = spy(new InternalDistributedSystem.Builder(new Properties(), builder).build());
+    system = spy(new InternalDistributedSystem.Builder(new Properties(), builder,
+        ModuleService.getDefaultModuleService()).build());
     doNothing().when(system).lockMemory();
 
     system.lockMemory(100, 200);
@@ -71,7 +73,8 @@ public class InternalDistributedSystemLockMemoryIntegrationTest {
   public void lockMemoryAvoidedIfAvoidMemoryLockWhenOverCommitIsSet() {
     System.setProperty(
         GeodeGlossary.GEMFIRE_PREFIX + "Cache.AVOID_MEMORY_LOCK_WHEN_OVERCOMMIT", "true");
-    system = spy(new InternalDistributedSystem.Builder(new Properties(), builder).build());
+    system = spy(new InternalDistributedSystem.Builder(new Properties(), builder,
+        ModuleService.getDefaultModuleService()).build());
 
     system.lockMemory(100, 200);
 
@@ -83,7 +86,8 @@ public class InternalDistributedSystemLockMemoryIntegrationTest {
     System.setProperty(GeodeGlossary.GEMFIRE_PREFIX + "Cache.ALLOW_MEMORY_OVERCOMMIT", "true");
     System.setProperty(
         GeodeGlossary.GEMFIRE_PREFIX + "Cache.AVOID_MEMORY_LOCK_WHEN_OVERCOMMIT", "true");
-    system = spy(new InternalDistributedSystem.Builder(new Properties(), builder).build());
+    system = spy(new InternalDistributedSystem.Builder(new Properties(), builder,
+        ModuleService.getDefaultModuleService()).build());
 
     system.lockMemory(100, 200);
 
@@ -93,7 +97,8 @@ public class InternalDistributedSystemLockMemoryIntegrationTest {
 
   @Test
   public void lockMemoryThrowsIfMemoryOverCommit() {
-    system = spy(new InternalDistributedSystem.Builder(new Properties(), builder).build());
+    system = spy(new InternalDistributedSystem.Builder(new Properties(), builder,
+        ModuleService.getDefaultModuleService()).build());
 
     Throwable caughtException = catchThrowable(() -> system.lockMemory(100, 200));
 
@@ -103,7 +108,8 @@ public class InternalDistributedSystemLockMemoryIntegrationTest {
 
   @Test
   public void locksMemoryIfMemoryNotOverCommit() {
-    system = spy(new InternalDistributedSystem.Builder(new Properties(), builder).build());
+    system = spy(new InternalDistributedSystem.Builder(new Properties(), builder,
+        ModuleService.getDefaultModuleService()).build());
     doNothing().when(system).lockMemory();
 
     system.lockMemory(200, 100);
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemSecurityIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemSecurityIntegrationTest.java
index 61286a9..4fb1130 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemSecurityIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/InternalDistributedSystemSecurityIntegrationTest.java
@@ -29,6 +29,7 @@ import org.junit.experimental.categories.Category;
 import org.apache.geode.metrics.internal.MetricsService;
 import org.apache.geode.security.PostProcessor;
 import org.apache.geode.security.SecurityManager;
+import org.apache.geode.services.module.ModuleService;
 import org.apache.geode.test.junit.categories.SecurityTest;
 
 @Category(SecurityTest.class)
@@ -58,7 +59,7 @@ public class InternalDistributedSystemSecurityIntegrationTest {
 
     system =
         InternalDistributedSystem.connectInternal(configProperties, securityConfig,
-            metricsSessionBuilder);
+            metricsSessionBuilder, ModuleService.getDefaultModuleService());
 
     system.disconnect();
 
@@ -74,7 +75,8 @@ public class InternalDistributedSystemSecurityIntegrationTest {
     Properties configProperties = new Properties();
 
     system = InternalDistributedSystem.connectInternal(
-        configProperties, securityConfig, metricsSessionBuilder);
+        configProperties, securityConfig, metricsSessionBuilder,
+        ModuleService.getDefaultModuleService());
 
     system.disconnect();
 
diff --git a/geode-core/src/main/java/org/apache/geode/cache/CacheFactory.java b/geode-core/src/main/java/org/apache/geode/cache/CacheFactory.java
index 2179a94..0e62353 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/CacheFactory.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/CacheFactory.java
@@ -31,6 +31,7 @@ import org.apache.geode.security.AuthenticationFailedException;
 import org.apache.geode.security.AuthenticationRequiredException;
 import org.apache.geode.security.PostProcessor;
 import org.apache.geode.security.SecurityManager;
+import org.apache.geode.services.module.ModuleService;
 
 /**
  * Factory class used to create the singleton {@link Cache cache} and connect to the GemFire
@@ -404,4 +405,9 @@ public class CacheFactory {
   public static String getVersion() {
     return GemFireVersion.getGemFireVersion();
   }
+
+  public CacheFactory setModuleService(ModuleService moduleService) {
+    internalCacheBuilder.setModuleService(moduleService);
+    return this;
+  }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/cache/client/ClientCacheFactory.java b/geode-core/src/main/java/org/apache/geode/cache/client/ClientCacheFactory.java
index ffaced9..8a1939d 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/client/ClientCacheFactory.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/client/ClientCacheFactory.java
@@ -41,6 +41,7 @@ import org.apache.geode.pdx.PdxInstance;
 import org.apache.geode.pdx.PdxSerializer;
 import org.apache.geode.security.AuthenticationFailedException;
 import org.apache.geode.security.AuthenticationRequiredException;
+import org.apache.geode.services.module.ModuleService;
 
 /**
  * Factory class used to create the singleton {@link ClientCache client cache} and connect to one or
@@ -279,7 +280,8 @@ public class ClientCacheFactory {
     MetricsService.Builder metricsServiceBuilder =
         new InternalDistributedSystemMetricsService.Builder()
             .setIsClient(true);
-    return InternalDistributedSystem.connectInternal(dsProps, null, metricsServiceBuilder);
+    return InternalDistributedSystem.connectInternal(dsProps, null, metricsServiceBuilder,
+        ModuleService.getDefaultModuleService());
   }
 
   private PoolFactory getPoolFactory() {
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/DistributedSystem.java b/geode-core/src/main/java/org/apache/geode/distributed/DistributedSystem.java
index 303abc1..96b976d 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/DistributedSystem.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/DistributedSystem.java
@@ -43,6 +43,7 @@ import org.apache.geode.internal.ClassPathLoader;
 import org.apache.geode.internal.tcp.ConnectionTable;
 import org.apache.geode.internal.util.IOUtils;
 import org.apache.geode.metrics.internal.InternalDistributedSystemMetricsService;
+import org.apache.geode.services.module.ModuleService;
 import org.apache.geode.util.internal.GeodeGlossary;
 
 /**
@@ -157,7 +158,8 @@ public abstract class DistributedSystem implements StatisticsFactory {
    */
   public static DistributedSystem connect(Properties config) {
     return InternalDistributedSystem.connectInternal(config, null,
-        new InternalDistributedSystemMetricsService.Builder());
+        new InternalDistributedSystemMetricsService.Builder(),
+        ModuleService.getDefaultModuleService());
   }
 
   protected static void addSystem(InternalDistributedSystem newSystem) {
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java
index 5f3b5d9..dbb5aba 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java
@@ -34,7 +34,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Properties;
-import java.util.ServiceLoader;
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.StringTokenizer;
@@ -125,6 +124,8 @@ import org.apache.geode.pdx.internal.TypeRegistry;
 import org.apache.geode.security.GemFireSecurityException;
 import org.apache.geode.security.PostProcessor;
 import org.apache.geode.security.SecurityManager;
+import org.apache.geode.services.module.ModuleService;
+import org.apache.geode.services.result.ModuleServiceResult;
 
 /**
  * The concrete implementation of {@link DistributedSystem} that provides internal-only
@@ -202,6 +203,8 @@ public class InternalDistributedSystem extends DistributedSystem
   // captured in initialize() when starting so that we can hand it to new instance when restarting
   private MembershipLocator<InternalDistributedMember> membershipLocator;
 
+  private ModuleService moduleService;
+
   /**
    * If the experimental multiple-system feature is enabled, always create a new system.
    *
@@ -212,8 +215,8 @@ public class InternalDistributedSystem extends DistributedSystem
   public static InternalDistributedSystem connectInternal(
       Properties config,
       SecurityConfig securityConfig,
-      MetricsService.Builder metricsSessionBuilder) {
-    return connectInternal(config, securityConfig, metricsSessionBuilder, null);
+      MetricsService.Builder metricsSessionBuilder, ModuleService moduleService) {
+    return connectInternal(config, securityConfig, metricsSessionBuilder, moduleService, null);
   }
 
   /**
@@ -227,13 +230,15 @@ public class InternalDistributedSystem extends DistributedSystem
       Properties config,
       SecurityConfig securityConfig,
       MetricsService.Builder metricsSessionBuilder,
+      ModuleService moduleService,
       final MembershipLocator<InternalDistributedMember> locator) {
+
     if (config == null) {
       config = new Properties();
     }
 
     if (Boolean.getBoolean(ALLOW_MULTIPLE_SYSTEMS_PROPERTY)) {
-      return new Builder(config, metricsSessionBuilder)
+      return new Builder(config, metricsSessionBuilder, moduleService)
           .setSecurityConfig(securityConfig)
           .setLocator(locator)
           .build();
@@ -284,10 +289,11 @@ public class InternalDistributedSystem extends DistributedSystem
       }
 
       // Make a new connection to the distributed system
-      InternalDistributedSystem newSystem = new Builder(config, metricsSessionBuilder)
-          .setSecurityConfig(securityConfig)
-          .setLocator(locator)
-          .build();
+      InternalDistributedSystem newSystem =
+          new Builder(config, metricsSessionBuilder, moduleService)
+              .setSecurityConfig(securityConfig)
+              .setLocator(locator)
+              .build();
       addSystem(newSystem);
       return newSystem;
     }
@@ -568,7 +574,8 @@ public class InternalDistributedSystem extends DistributedSystem
    */
   private InternalDistributedSystem(ConnectionConfig config,
       StatisticsManagerFactory statisticsManagerFactory,
-      FunctionStatsManager.Factory functionStatsManagerFactory) {
+      FunctionStatsManager.Factory functionStatsManagerFactory,
+      ModuleService moduleService) {
     alertingSession = AlertingSession.create();
     alertingService = new InternalAlertingServiceFactory().create();
     LoggingUncaughtExceptionHandler
@@ -577,6 +584,7 @@ public class InternalDistributedSystem extends DistributedSystem
     originalConfig = config.distributionConfig();
     isReconnectingDS = config.isReconnecting();
     quorumChecker = config.quorumChecker();
+    this.moduleService = moduleService;
 
     // throws IllegalStateEx
     ((DistributionConfigImpl) originalConfig).checkForDisallowedDefaults();
@@ -661,12 +669,15 @@ public class InternalDistributedSystem extends DistributedSystem
    * mechanism.
    */
   private void initializeServices() {
-    ServiceLoader<DistributedSystemService> loader =
-        ServiceLoader.load(DistributedSystemService.class);
-    for (DistributedSystemService service : loader) {
-      service.init(this);
-      services.put(service.getInterface(), service);
-    }
+    ModuleServiceResult<Set<DistributedSystemService>> loadService =
+        moduleService.loadService(DistributedSystemService.class);
+    loadService
+        .ifSuccessful(distributedSystemServices -> distributedSystemServices.stream()
+            .forEach(distributedSystemService -> {
+              distributedSystemService.init(this);
+              services.put(distributedSystemService.getInterface(), distributedSystemService);
+            }));
+    loadService.ifFailure(errorMessage -> logger.info(errorMessage));
   }
 
 
@@ -2603,7 +2614,7 @@ public class InternalDistributedSystem extends DistributedSystem
           try {
 
             newDS = connectInternal(configProps, null, metricsService.getRebuilder(),
-                membershipLocator);
+                moduleService, membershipLocator);
 
           } catch (CancelException e) {
             if (isReconnectCancelled()) {
@@ -2998,9 +3009,13 @@ public class InternalDistributedSystem extends DistributedSystem
 
     private MembershipLocator<InternalDistributedMember> locator;
 
-    public Builder(Properties configProperties, MetricsService.Builder metricsServiceBuilder) {
+    private ModuleService moduleService;
+
+    public Builder(Properties configProperties, MetricsService.Builder metricsServiceBuilder,
+        ModuleService moduleService) {
       this.configProperties = configProperties;
       this.metricsServiceBuilder = metricsServiceBuilder;
+      this.moduleService = moduleService;
     }
 
     public Builder setSecurityConfig(SecurityConfig securityConfig) {
@@ -3029,7 +3044,7 @@ public class InternalDistributedSystem extends DistributedSystem
         InternalDistributedSystem newSystem =
             new InternalDistributedSystem(new ConnectionConfigImpl(
                 configProperties), defaultStatisticsManagerFactory(),
-                FunctionStatsManager::new);
+                FunctionStatsManager::new, moduleService);
         newSystem
             .initialize(securityConfig.getSecurityManager(), securityConfig.getPostProcessor(),
                 metricsServiceBuilder, locator);
@@ -3052,8 +3067,11 @@ public class InternalDistributedSystem extends DistributedSystem
     private DistributionManager distributionManager;
     private StatisticsManagerFactory statisticsManagerFactory = defaultStatisticsManagerFactory();
 
-    public BuilderForTesting(Properties configProperties) {
+    private ModuleService moduleService;
+
+    public BuilderForTesting(Properties configProperties, ModuleService moduleService) {
       this.configProperties = configProperties;
+      this.moduleService = moduleService;
     }
 
     public BuilderForTesting setDistributionManager(DistributionManager distributionManager) {
@@ -3075,7 +3093,7 @@ public class InternalDistributedSystem extends DistributedSystem
 
       InternalDistributedSystem internalDistributedSystem =
           new InternalDistributedSystem(connectionConfig, statisticsManagerFactory,
-              FunctionStatsManager::new);
+              FunctionStatsManager::new, moduleService);
 
       internalDistributedSystem.config =
           new RuntimeDistributionConfigImpl(internalDistributedSystem);
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java
index 52dad50..f2eafc9 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java
@@ -113,6 +113,7 @@ import org.apache.geode.management.internal.configuration.messages.SharedConfigu
 import org.apache.geode.management.internal.configuration.messages.SharedConfigurationStatusResponse;
 import org.apache.geode.metrics.internal.InternalDistributedSystemMetricsService;
 import org.apache.geode.security.AuthTokenEnabledComponents;
+import org.apache.geode.services.module.ModuleService;
 
 /**
  * Provides the implementation of a distribution {@code Locator} as well as internal-only
@@ -742,6 +743,7 @@ public class InternalLocator extends Locator implements ConnectListener, LogConf
           InternalDistributedSystem
               .connectInternal(distributedSystemProperties, null,
                   new InternalDistributedSystemMetricsService.Builder(),
+                  ModuleService.getDefaultModuleService(),
                   membershipLocator);
 
       if (peerLocator) {
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/CacheConfig.java b/geode-core/src/main/java/org/apache/geode/internal/cache/CacheConfig.java
index 3870247..f638dbe 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/CacheConfig.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/CacheConfig.java
@@ -23,6 +23,7 @@ import org.apache.geode.pdx.PdxSerializer;
 import org.apache.geode.pdx.ReflectionBasedAutoSerializer;
 import org.apache.geode.security.PostProcessor;
 import org.apache.geode.security.SecurityManager;
+import org.apache.geode.services.module.ModuleService;
 
 /**
  * This is helper class used by CacheFactory to pass the cache configuration values to cache
@@ -75,6 +76,8 @@ public class CacheConfig {
   public boolean pdxIgnoreUnreadFields = DEFAULT_PDX_IGNORE_UNREAD_FIELDS;
   public boolean pdxIgnoreUnreadFieldsUserSet = false;
 
+  private ModuleService moduleService;
+
 
 
   public boolean isPdxReadSerialized() {
@@ -254,4 +257,11 @@ public class CacheConfig {
     }
   }
 
+  public void setModuleService(ModuleService moduleService) {
+    this.moduleService = moduleService;
+  }
+
+  public ModuleService getModuleService() {
+    return this.moduleService;
+  }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java b/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java
index fe6798f..38f4b0e 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java
@@ -80,7 +80,6 @@ import java.util.Map.Entry;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Properties;
-import java.util.ServiceLoader;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.concurrent.CancellationException;
@@ -276,6 +275,8 @@ import org.apache.geode.pdx.internal.InternalPdxInstance;
 import org.apache.geode.pdx.internal.PdxInstanceFactoryImpl;
 import org.apache.geode.pdx.internal.PdxInstanceImpl;
 import org.apache.geode.pdx.internal.TypeRegistry;
+import org.apache.geode.services.module.ModuleService;
+import org.apache.geode.services.result.ModuleServiceResult;
 
 /**
  * GemFire's implementation of a distributed {@link Cache}.
@@ -725,6 +726,8 @@ public class GemFireCacheImpl implements InternalCache, InternalClientCache, Has
 
   private ConcurrentMap<String, CountDownLatch> diskStoreLatches = new ConcurrentHashMap();
 
+  private final ModuleService modulesService;
+
   static {
     // this works around jdk bug 6427854
     String propertyName = "sun.nio.ch.bugLevel";
@@ -954,6 +957,7 @@ public class GemFireCacheImpl implements InternalCache, InternalClientCache, Has
     this.functionServiceRegisterFunction = functionServiceRegisterFunction;
     this.systemTimerFactory = systemTimerFactory;
     this.replyProcessor21Factory = replyProcessor21Factory;
+    this.modulesService = cacheConfig.getModuleService();
 
     // Synchronized to prevent a new cache from being created before an old one finishes closing
     synchronized (GemFireCacheImpl.class) {
@@ -1478,16 +1482,23 @@ public class GemFireCacheImpl implements InternalCache, InternalClientCache, Has
    * Initialize any services provided as extensions to the cache using service loader.
    */
   private void initializeServices() {
-    ServiceLoader<CacheService> loader = ServiceLoader.load(CacheService.class);
-    for (CacheService service : loader) {
-      try {
-        if (service.init(this)) {
-          services.put(service.getInterface(), service);
-          logger.info("Initialized cache service {}", service.getClass().getName());
+    ModuleServiceResult<Set<CacheService>> loadedServices =
+        modulesService.loadService(CacheService.class);
+    if (loadedServices.isSuccessful()) {
+      // ServiceLoader<CacheService> loader = ServiceLoader.load(CacheService.class);
+      for (CacheService service : loadedServices.getMessage()) {
+        try {
+          if (service.init(this)) {
+            this.services.put(service.getInterface(), service);
+            logger.info("Initialized cache service {}", service.getClass().getName());
+          }
+        } catch (Exception ex) {
+          logger.warn("Cache service " + service.getClass().getName() + " failed to initialize",
+              ex);
         }
-      } catch (Exception ex) {
-        logger.warn("Cache service " + service.getClass().getName() + " failed to initialize", ex);
       }
+    } else {
+      logger.warn(loadedServices.getErrorMessage());
     }
   }
 
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/InternalCacheBuilder.java b/geode-core/src/main/java/org/apache/geode/internal/cache/InternalCacheBuilder.java
index 14bf280..be298fc 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/InternalCacheBuilder.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/InternalCacheBuilder.java
@@ -49,6 +49,7 @@ import org.apache.geode.security.AuthenticationRequiredException;
 import org.apache.geode.security.GemFireSecurityException;
 import org.apache.geode.security.PostProcessor;
 import org.apache.geode.security.SecurityManager;
+import org.apache.geode.services.module.ModuleService;
 
 public class InternalCacheBuilder {
   private static final Logger logger = LogService.getLogger();
@@ -343,7 +344,8 @@ public class InternalCacheBuilder {
         cacheConfig.getPostProcessor());
 
     return internalDistributedSystemConstructor
-        .construct(configProperties, securityConfig, metricsSessionBuilder);
+        .construct(configProperties, securityConfig, metricsSessionBuilder,
+            cacheConfig.getModuleService());
   }
 
   private InternalCache existingCache(Supplier<? extends InternalCache> systemCacheSupplier,
@@ -404,6 +406,11 @@ public class InternalCacheBuilder {
     return Boolean.getBoolean(ALLOW_MULTIPLE_SYSTEMS_PROPERTY);
   }
 
+  public InternalCacheBuilder setModuleService(ModuleService moduleService) {
+    cacheConfig.setModuleService(moduleService);
+    return this;
+  }
+
 
   @VisibleForTesting
   public interface InternalCacheConstructor {
@@ -415,6 +422,6 @@ public class InternalCacheBuilder {
   @VisibleForTesting
   public interface InternalDistributedSystemConstructor {
     InternalDistributedSystem construct(Properties configProperties, SecurityConfig securityConfig,
-        MetricsService.Builder metricsSessionBuilder);
+        MetricsService.Builder metricsSessionBuilder, ModuleService moduleService);
   }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/distributed/internal/InternalDistributedSystemStatisticsManagerTest.java b/geode-core/src/test/java/org/apache/geode/distributed/internal/InternalDistributedSystemStatisticsManagerTest.java
index 50c119e..88a03f2 100644
--- a/geode-core/src/test/java/org/apache/geode/distributed/internal/InternalDistributedSystemStatisticsManagerTest.java
+++ b/geode-core/src/test/java/org/apache/geode/distributed/internal/InternalDistributedSystemStatisticsManagerTest.java
@@ -38,6 +38,7 @@ import org.apache.geode.Statistics;
 import org.apache.geode.StatisticsType;
 import org.apache.geode.internal.statistics.StatisticsManager;
 import org.apache.geode.internal.statistics.StatisticsManagerFactory;
+import org.apache.geode.services.module.ModuleService;
 
 /**
  * Unit tests for {@link InternalDistributedSystem}.
@@ -67,10 +68,12 @@ public class InternalDistributedSystemStatisticsManagerTest {
     initMocks(this);
     when(statisticsManagerFactory.create(any(), anyLong(), anyBoolean()))
         .thenReturn(statisticsManager);
-    internalDistributedSystem = new InternalDistributedSystem.BuilderForTesting(new Properties())
-        .setDistributionManager(distributionManager)
-        .setStatisticsManagerFactory(statisticsManagerFactory)
-        .build();
+    internalDistributedSystem =
+        new InternalDistributedSystem.BuilderForTesting(new Properties(), ModuleService
+            .getDefaultModuleService())
+                .setDistributionManager(distributionManager)
+                .setStatisticsManagerFactory(statisticsManagerFactory)
+                .build();
   }
 
   @Test
@@ -84,10 +87,11 @@ public class InternalDistributedSystemStatisticsManagerTest {
             .thenReturn(statisticsManagerCreatedByFactory);
 
     InternalDistributedSystem result =
-        new InternalDistributedSystem.BuilderForTesting(new Properties())
-            .setDistributionManager(distributionManager)
-            .setStatisticsManagerFactory(statisticsManagerFactory)
-            .build();
+        new InternalDistributedSystem.BuilderForTesting(new Properties(),
+            ModuleService.getDefaultModuleService())
+                .setDistributionManager(distributionManager)
+                .setStatisticsManagerFactory(statisticsManagerFactory)
+                .build();
 
     assertThat(result.getStatisticsManager())
         .isSameAs(statisticsManagerCreatedByFactory);
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/InternalCacheBuilderAllowsMultipleSystemsTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/InternalCacheBuilderAllowsMultipleSystemsTest.java
index a9c0edb..604a4af 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/InternalCacheBuilderAllowsMultipleSystemsTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/InternalCacheBuilderAllowsMultipleSystemsTest.java
@@ -109,7 +109,7 @@ public class InternalCacheBuilderAllowsMultipleSystemsTest {
 
     internalCacheBuilder.create();
 
-    verify(systemConstructor).construct(same(configProperties), any(), any());
+    verify(systemConstructor).construct(same(configProperties), any(), any(), any());
   }
 
   @Test
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/InternalCacheBuilderTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/InternalCacheBuilderTest.java
index 76d9331..dbff890 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/InternalCacheBuilderTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/InternalCacheBuilderTest.java
@@ -163,7 +163,7 @@ public class InternalCacheBuilderTest {
     internalCacheBuilder
         .create();
 
-    verify(systemConstructor).construct(same(configProperties), any(), any());
+    verify(systemConstructor).construct(same(configProperties), any(), any(), any());
   }
 
   @Test
@@ -192,7 +192,7 @@ public class InternalCacheBuilderTest {
 
     internalCacheBuilder.create();
 
-    verify(systemConstructor).construct(any(), any(), same(theMetricsServiceBuilder));
+    verify(systemConstructor).construct(any(), any(), same(theMetricsServiceBuilder), any());
   }
 
   @Test
diff --git a/geode-core/src/test/java/org/apache/geode/internal/util/InternalCacheBuilderTestUtil.java b/geode-core/src/test/java/org/apache/geode/internal/util/InternalCacheBuilderTestUtil.java
index eed9a21..ce5cead 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/util/InternalCacheBuilderTestUtil.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/util/InternalCacheBuilderTestUtil.java
@@ -104,7 +104,8 @@ public class InternalCacheBuilderTestUtil {
       InternalDistributedSystem constructedSystem) {
     InternalDistributedSystemConstructor constructor =
         mock(InternalDistributedSystemConstructor.class, "internal distributed system constructor");
-    when(constructor.construct(any(), any(), any())).thenReturn(constructedSystem);
+    when(constructor.construct(any(), any(), any(), any()))
+        .thenReturn(constructedSystem);
     return constructor;
   }
 
@@ -137,7 +138,7 @@ public class InternalCacheBuilderTestUtil {
       };
 
   public static final InternalDistributedSystemConstructor THROWING_SYSTEM_CONSTRUCTOR =
-      (configProperties, securityConfig, userMeterRegistries) -> {
+      (configProperties, securityConfig, userMeterRegistries, moduleService) -> {
         throw new AssertionError("throwing system constructor");
       };
 
diff --git a/geode-core/src/test/resources/expected-pom.xml b/geode-core/src/test/resources/expected-pom.xml
index 47ae85a..c483f75 100644
--- a/geode-core/src/test/resources/expected-pom.xml
+++ b/geode-core/src/test/resources/expected-pom.xml
@@ -47,6 +47,11 @@
   </dependencyManagement>
   <dependencies>
     <dependency>
+      <groupId>org.apache.geode</groupId>
+      <artifactId>geode-logging</artifactId>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
       <groupId>antlr</groupId>
       <artifactId>antlr</artifactId>
       <scope>compile</scope>
@@ -214,11 +219,6 @@
     </dependency>
     <dependency>
       <groupId>org.apache.geode</groupId>
-      <artifactId>geode-logging</artifactId>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.geode</groupId>
       <artifactId>geode-membership</artifactId>
       <scope>runtime</scope>
     </dependency>
diff --git a/geode-cq/build.gradle b/geode-cq/build.gradle
index 26a3e25..8feae60 100644
--- a/geode-cq/build.gradle
+++ b/geode-cq/build.gradle
@@ -29,8 +29,12 @@ dependencies {
   implementation('org.apache.logging.log4j:log4j-api')
 
 
-  testImplementation(project(':geode-junit'))
+  testImplementation(project(":geode-modules"))
+  integrationTestImplementation(project(":geode-modules"))
+  acceptanceTestImplementation(project(":geode-modules"))
+  distributedTestImplementation(project(":geode-modules"))
 
+  testImplementation(project(':geode-junit'))
 
   integrationTestImplementation(project(':geode-dunit'))
   integrationTestImplementation(project(':geode-junit'))
diff --git a/geode-old-client-support/build.gradle b/geode-dep-graph/build.gradle
similarity index 74%
copy from geode-old-client-support/build.gradle
copy to geode-dep-graph/build.gradle
index 1ceb25a..feba051 100644
--- a/geode-old-client-support/build.gradle
+++ b/geode-dep-graph/build.gradle
@@ -18,18 +18,16 @@
 apply from: "${rootDir}/${scriptDir}/standard-subproject-configuration.gradle"
 
 apply from: "${project.projectDir}/../gradle/publish-java.gradle"
+apply from: "${project.projectDir}/../gradle/warnings.gradle"
 
+repositories {
+    mavenCentral()
+}
 
 dependencies {
-  implementation(platform(project(':boms:geode-all-bom')))
-  implementation(project(':geode-core'))
-  implementation(project(':geode-logging'))
-  implementation(project(':geode-serialization'))
-  distributedTestImplementation(project(':geode-dunit')){
-    exclude module: 'geode-core'
-  }
+    implementation(platform(project(':boms:geode-all-bom')))
 
+    implementation('org.apache.commons:commons-lang3')
+    implementation('org.graphstream:gs-core')
 
-  distributedTestImplementation('junit:junit')
 }
-
diff --git a/geode-dep-graph/src/main/java/org/apache/geode/graphing/Dependencies.java b/geode-dep-graph/src/main/java/org/apache/geode/graphing/Dependencies.java
new file mode 100644
index 0000000..cb0df3e
--- /dev/null
+++ b/geode-dep-graph/src/main/java/org/apache/geode/graphing/Dependencies.java
@@ -0,0 +1,139 @@
+/*
+ * 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.geode.graphing;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.graphstream.graph.Graph;
+import org.graphstream.graph.IdAlreadyInUseException;
+import org.graphstream.graph.Node;
+import org.graphstream.graph.implementations.MultiGraph;
+import org.graphstream.ui.layout.Layout;
+import org.graphstream.ui.layout.Layouts;
+import org.graphstream.ui.spriteManager.Sprite;
+import org.graphstream.ui.spriteManager.SpriteManager;
+import org.graphstream.ui.swingViewer.GraphRenderer;
+import org.graphstream.ui.swingViewer.ViewPanel;
+import org.graphstream.ui.view.Viewer;
+
+public class Dependencies {
+  public static void main(String args[]) {
+
+    Graph graph = new MultiGraph("Tutorial 1");
+    SpriteManager spriteManager = new SpriteManager(graph);
+    graph.addAttribute("ui.stylesheet", "node { fill-mode: dyn-plain;fill-color: green, red; }");
+
+    String rootPath =
+        "/Users/ukohlmeyer/projects/geode/geode-assembly/build/install/apache-geode/lib";
+
+    String version = "1.14.0-build.0";
+
+    File file = new File(rootPath);
+    List<File> files =
+        Arrays.stream(file.listFiles())
+            .filter(file1 -> file1.getName().startsWith("geode-"))
+            .filter(file1 -> !file1.getName().contains("geode-dependencies"))
+            .filter(file1 -> !file1.getName().contains("gfsh-dependencies"))
+            .filter(file1 -> !file1.getName().contains("geode-module-bootstrapping"))
+            .collect(
+                Collectors.toList());
+    Map<String, List<String>> depsMap = new HashMap<>();
+
+    files.forEach(file1 -> {
+      try {
+        JarFile jarFile = new JarFile(file1, true);
+        Manifest manifest = jarFile.getManifest();
+        String moduleName = manifest.getMainAttributes().getValue("Module-Name");
+        try {
+          String id = moduleName + "-" + version;
+          Node node = graph.addNode(id);
+          node.addAttribute("ui.label", id);
+          node.addAttribute("ui.color", 0.1);
+          Sprite sprite = spriteManager.addSprite(moduleName);
+          sprite.attachToNode(id);
+        } catch (IdAlreadyInUseException e) {
+        }
+        String depModules = manifest.getMainAttributes().getValue("Dependent-Modules");
+        String depClassPath = manifest.getMainAttributes().getValue("Class-Path");
+
+        ArrayList<String> arrayList = new ArrayList<>();
+        arrayList.add(depClassPath);
+        arrayList.add(depModules);
+        depsMap.put(moduleName + "-" + version, arrayList);
+        jarFile.close();
+      } catch (IOException e) {
+        e.printStackTrace();
+      }
+    });
+
+    depsMap.forEach((name, deps) -> {
+      String[] classPathDeps = new String[] {};
+      // String[] classPathDeps =
+      // !StringUtils.isEmpty(deps.get(0)) ? deps.get(0).split(" ") : new String[] {};
+      String[] moduleDeps =
+          !StringUtils.isEmpty(deps.get(1)) ? deps.get(1).split(" ") : new String[] {};
+
+      Arrays.stream(moduleDeps)
+          .forEach(moduleDep -> graph.addEdge(name + "-" + moduleDep, name, moduleDep, true));
+
+      Arrays.stream(classPathDeps).forEach(classPathDep -> {
+        try {
+          String id = classPathDep;
+          Node node = graph.addNode(id);
+          node.addAttribute("ui.label", id);
+          node.addAttribute("ui.color", 1);
+          Sprite sprite = spriteManager.addSprite(id.replaceAll(".", "_"));
+          sprite.attachToNode(id);
+        } catch (IdAlreadyInUseException e) {
+        }
+        graph.addEdge(name + "-" + classPathDep, name, classPathDep, true);
+      });
+
+    });
+
+    graph.addAttribute("ui.antialias");
+
+    Viewer viewer = new Viewer(graph,
+        Viewer.ThreadingModel.GRAPH_IN_ANOTHER_THREAD);
+    GraphRenderer renderer = Viewer.newGraphRenderer();
+    viewer.addView(Viewer.DEFAULT_VIEW_ID, renderer);
+    Layout layout = Layouts.newLayoutAlgorithm();
+    ViewPanel view = viewer.getDefaultView();
+    view.setAutoscrolls(true);
+    view.resizeFrame(1600, 1200);
+    // view.getCamera().setViewPercent(0.8);
+    viewer.enableAutoLayout(layout);
+    // viewer.disableAutoLayout();
+    viewer.enableXYZfeedback(true);
+
+  }
+}
diff --git a/geode-logging/src/test/resources/expected-pom.xml b/geode-dep-graph/src/test/resources/expected-pom.xml
similarity index 90%
copy from geode-logging/src/test/resources/expected-pom.xml
copy to geode-dep-graph/src/test/resources/expected-pom.xml
index cb933ff..204d106 100644
--- a/geode-logging/src/test/resources/expected-pom.xml
+++ b/geode-dep-graph/src/test/resources/expected-pom.xml
@@ -18,7 +18,7 @@
   -->
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.apache.geode</groupId>
-  <artifactId>geode-logging</artifactId>
+  <artifactId>geode-dep-graph</artifactId>
   <version>${version}</version>
   <name>Apache Geode</name>
   <description>Apache Geode provides a database-like consistency model, reliable transaction processing and a shared-nothing architecture to maintain very low latency performance with high concurrency processing</description>
@@ -47,13 +47,13 @@
   </dependencyManagement>
   <dependencies>
     <dependency>
-      <groupId>org.apache.geode</groupId>
-      <artifactId>geode-common</artifactId>
-      <scope>compile</scope>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+      <scope>runtime</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.logging.log4j</groupId>
-      <artifactId>log4j-api</artifactId>
+      <groupId>org.graphstream</groupId>
+      <artifactId>gs-core</artifactId>
       <scope>runtime</scope>
     </dependency>
   </dependencies>
diff --git a/geode-gfsh/build.gradle b/geode-gfsh/build.gradle
index 212b9d9..e779f41 100644
--- a/geode-gfsh/build.gradle
+++ b/geode-gfsh/build.gradle
@@ -35,6 +35,11 @@ dependencies {
     implementation('com.healthmarketscience.rmiio:rmiio')
     implementation('com.fasterxml.jackson.core:jackson-databind')
 
+    testImplementation(project(":geode-modules"))
+    integrationTestImplementation(project(":geode-modules"))
+    acceptanceTestImplementation(project(":geode-modules"))
+    distributedTestImplementation(project(":geode-modules"))
+
 //    //Find bugs is used in multiple places in the code to suppress findbugs warnings
     testImplementation('com.github.stephenc.findbugs:findbugs-annotations')
     testImplementation('org.springframework:spring-test')
@@ -45,7 +50,7 @@ dependencies {
     integrationTestImplementation(project(':geode-dunit'))
     integrationTestImplementation('pl.pragmatists:JUnitParams')
     integrationTestRuntimeOnly('org.apache.derby:derby')
-    
+
     distributedTestImplementation(project(':geode-dunit'))
     distributedTestImplementation('pl.pragmatists:JUnitParams')
     distributedTestRuntimeOnly('org.apache.derby:derby')
@@ -75,4 +80,4 @@ dependencies {
         exclude module: 'spring-context-support'
         exclude module: 'spring-core'
     }
-}
\ No newline at end of file
+}
diff --git a/geode-http-service/build.gradle b/geode-http-service/build.gradle
index c9e0580..ec304c1 100755
--- a/geode-http-service/build.gradle
+++ b/geode-http-service/build.gradle
@@ -24,16 +24,20 @@ dependencies {
   compile(platform(project(':boms:geode-all-bom')))
   implementation(project(':geode-logging'))
 
-  implementation('org.apache.logging.log4j:log4j-api')
   implementation('org.eclipse.jetty:jetty-webapp')
   implementation('org.eclipse.jetty:jetty-server')
   implementation('org.apache.commons:commons-lang3')
-  
+
   compileOnly(project(':geode-core'))
   compileOnly(project(':geode-common')) {
     exclude module: 'junit'
   }
 
+  testImplementation(project(":geode-modules"))
+  integrationTestImplementation(project(":geode-modules"))
+  acceptanceTestImplementation(project(":geode-modules"))
+  distributedTestImplementation(project(":geode-modules"))
+
   testImplementation(project(':geode-core'))
   testImplementation(project(':geode-common'))
   testImplementation(project(':geode-junit'))
diff --git a/geode-http-service/src/test/resources/expected-pom.xml b/geode-http-service/src/test/resources/expected-pom.xml
index 2768c89..37164cd 100644
--- a/geode-http-service/src/test/resources/expected-pom.xml
+++ b/geode-http-service/src/test/resources/expected-pom.xml
@@ -52,11 +52,6 @@
       <scope>runtime</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.logging.log4j</groupId>
-      <artifactId>log4j-api</artifactId>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-webapp</artifactId>
       <scope>runtime</scope>
diff --git a/geode-common-services/src/main/java/org/apache/geode/services/management/ManagementService.java b/geode-launcher/build.gradle
similarity index 59%
copy from geode-common-services/src/main/java/org/apache/geode/services/management/ManagementService.java
copy to geode-launcher/build.gradle
index 5ae23c5..b357aa6 100644
--- a/geode-common-services/src/main/java/org/apache/geode/services/management/ManagementService.java
+++ b/geode-launcher/build.gradle
@@ -13,24 +13,19 @@
  * the License.
  */
 
-package org.apache.geode.services.management;
+plugins {
+    id 'me.champeau.gradle.jmh' version '0.4.8'
+}
 
-import org.apache.geode.annotations.Experimental;
+apply from: "${rootDir}/${scriptDir}/standard-subproject-configuration.gradle"
 
-/**
- * Entry point for creating a cache and bootstrapping Geode using the BootstrappingService
- *
- * @since Geode 1.13.0
- */
-@Experimental
-public interface ManagementService {
+apply from: "${project.projectDir}/../gradle/publish-java.gradle"
+apply from: "${project.projectDir}/../gradle/warnings.gradle"
 
-  /**
-   * Creates a Geode Cache given some configuration.
-   *
-   * @param properties system properties to use when creating the Cache.
-   *
-   * @throws Exception is Cache cannot be created.
-   */
-  // Cache createCache(Properties properties) throws Exception;
-}
+dependencies {
+    compile(platform(project(':boms:geode-all-bom')))
+
+    compile(project(':geode-common'))
+    compile(project(':geode-common-services'))
+
+}
\ No newline at end of file
diff --git a/geode-common-services/src/main/java/org/apache/geode/services/bootstrapping/BootstrappingService.java b/geode-launcher/src/main/java/org/apache/geode/services/bootstrapping/BootstrappingService.java
similarity index 90%
rename from geode-common-services/src/main/java/org/apache/geode/services/bootstrapping/BootstrappingService.java
rename to geode-launcher/src/main/java/org/apache/geode/services/bootstrapping/BootstrappingService.java
index d23acc7..0a2c79a 100644
--- a/geode-common-services/src/main/java/org/apache/geode/services/bootstrapping/BootstrappingService.java
+++ b/geode-launcher/src/main/java/org/apache/geode/services/bootstrapping/BootstrappingService.java
@@ -18,6 +18,7 @@ package org.apache.geode.services.bootstrapping;
 import java.util.Properties;
 
 import org.apache.geode.annotations.Experimental;
+import org.apache.geode.services.module.ModuleService;
 
 /**
  * Service responsible for bootstrapping the environment and Geode components.
@@ -30,15 +31,16 @@ public interface BootstrappingService {
   /**
    * Start and initialize Geode.
    *
+   *
    * @param properties system properties to use when bootstrapping the environment.
    * @throws Exception - thrown if unable to bootstrap system.
    */
-  void init(Properties properties) throws Exception;
+  void init(ModuleService moduleService, Properties properties);
 
   /**
    * Shuts down the environment and previously bootstrapped Geode components.
    *
    * @throws Exception - thrown if unable to shutdown.
    */
-  void shutdown() throws Exception;
+  void shutdown();
 }
diff --git a/geode-logging/src/test/resources/expected-pom.xml b/geode-launcher/src/test/resources/expected-pom.xml
similarity index 93%
copy from geode-logging/src/test/resources/expected-pom.xml
copy to geode-launcher/src/test/resources/expected-pom.xml
index cb933ff..ff65bff 100644
--- a/geode-logging/src/test/resources/expected-pom.xml
+++ b/geode-launcher/src/test/resources/expected-pom.xml
@@ -18,7 +18,7 @@
   -->
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.apache.geode</groupId>
-  <artifactId>geode-logging</artifactId>
+  <artifactId>geode-launcher</artifactId>
   <version>${version}</version>
   <name>Apache Geode</name>
   <description>Apache Geode provides a database-like consistency model, reliable transaction processing and a shared-nothing architecture to maintain very low latency performance with high concurrency processing</description>
@@ -52,9 +52,9 @@
       <scope>compile</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.logging.log4j</groupId>
-      <artifactId>log4j-api</artifactId>
-      <scope>runtime</scope>
+      <groupId>org.apache.geode</groupId>
+      <artifactId>geode-common-services</artifactId>
+      <scope>compile</scope>
     </dependency>
   </dependencies>
 </project>
diff --git a/geode-logging/build.gradle b/geode-logging/build.gradle
index ca5f40f..8c09b1b 100644
--- a/geode-logging/build.gradle
+++ b/geode-logging/build.gradle
@@ -26,7 +26,8 @@ dependencies {
     // Geode-common has annotations and other pieces used by geode-logging
     api(project(':geode-common'))
 
-    implementation('org.apache.logging.log4j:log4j-api')
+    compile('org.apache.logging.log4j:log4j-api')
+    compile('org.apache.logging.log4j:log4j-core')
 
     testImplementation(project(':geode-junit')) {
         exclude module: 'geode-logging'
diff --git a/geode-logging/src/test/resources/expected-pom.xml b/geode-logging/src/test/resources/expected-pom.xml
index cb933ff..89a7000 100644
--- a/geode-logging/src/test/resources/expected-pom.xml
+++ b/geode-logging/src/test/resources/expected-pom.xml
@@ -47,14 +47,19 @@
   </dependencyManagement>
   <dependencies>
     <dependency>
-      <groupId>org.apache.geode</groupId>
-      <artifactId>geode-common</artifactId>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
       <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.logging.log4j</groupId>
-      <artifactId>log4j-api</artifactId>
-      <scope>runtime</scope>
+      <artifactId>log4j-core</artifactId>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.geode</groupId>
+      <artifactId>geode-common</artifactId>
+      <scope>compile</scope>
     </dependency>
   </dependencies>
 </project>
diff --git a/geode-lucene/build.gradle b/geode-lucene/build.gradle
index d664f9f..f463b98 100644
--- a/geode-lucene/build.gradle
+++ b/geode-lucene/build.gradle
@@ -43,6 +43,10 @@ dependencies {
 
   runtimeOnly('org.apache.lucene:lucene-analyzers-phonetic')
 
+  testImplementation(project(":geode-modules"))
+  integrationTestImplementation(project(":geode-modules"))
+  acceptanceTestImplementation(project(":geode-modules"))
+  distributedTestImplementation(project(":geode-modules"))
 
   testImplementation(project(':geode-junit'))
   testImplementation(project(':geode-lucene:geode-lucene-test'))
diff --git a/geode-membership/build.gradle b/geode-membership/build.gradle
index ac70c93..6f4e737 100644
--- a/geode-membership/build.gradle
+++ b/geode-membership/build.gradle
@@ -20,6 +20,8 @@ apply from: "${rootDir}/${scriptDir}/standard-subproject-configuration.gradle"
 apply from: "${project.projectDir}/../gradle/publish-java.gradle"
 
 dependencies {
+
+    compileOnly('org.jboss.modules:jboss-modules')
     compile(platform(project(':boms:geode-all-bom')))
 
     // Geode-common has annotations and other pieces used by geode-logging
@@ -59,7 +61,8 @@ dependencies {
     testImplementation('com.tngtech.archunit:archunit-junit4')
 
     integrationTestImplementation('com.tngtech.archunit:archunit-junit4')
-  
+
+    compileOnly('org.jboss.modules:jboss-modules')
 }
 
 distributedTest {
diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessenger.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessenger.java
index da67d36..7cff066 100644
--- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessenger.java
+++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessenger.java
@@ -49,6 +49,7 @@ import java.util.stream.Collectors;
 
 import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
 import org.apache.logging.log4j.Logger;
+import org.jboss.modules.ModuleClassLoader;
 import org.jgroups.Address;
 import org.jgroups.Channel;
 import org.jgroups.Event;
@@ -217,17 +218,31 @@ public class JGroupsMessenger<ID extends MemberIdentifier> implements Messenger<
     if (contextClassLoader != null) {
       is = contextClassLoader.getResourceAsStream(r);
     }
+
     if (is == null) {
       is = getClass().getResourceAsStream(r);
     }
     if (is == null) {
       is = ClassLoader.getSystemResourceAsStream(r);
     }
+
+    if (is == null) {
+      if (this.getClass().getClassLoader() instanceof ModuleClassLoader) {
+        ModuleClassLoader classLoader = (ModuleClassLoader) this.getClass().getClassLoader();
+        is = classLoader.findResourceAsStream(r, false);
+      }
+    }
+
     if (is == null) {
       throw new MembershipConfigurationException(
           String.format("Cannot find %s", r));
     }
 
+    if (this.getClass().getClassLoader() instanceof ModuleClassLoader) {
+      ModuleClassLoader classLoader = (ModuleClassLoader) this.getClass().getClassLoader();
+
+    }
+
     String properties;
     try {
       StringBuilder sb = new StringBuilder(3000);
diff --git a/geode-common-services/src/main/java/org/apache/geode/services/management/ManagementService.java b/geode-module-bootstrapping/build.gradle
similarity index 59%
copy from geode-common-services/src/main/java/org/apache/geode/services/management/ManagementService.java
copy to geode-module-bootstrapping/build.gradle
index 5ae23c5..58e768d 100644
--- a/geode-common-services/src/main/java/org/apache/geode/services/management/ManagementService.java
+++ b/geode-module-bootstrapping/build.gradle
@@ -13,24 +13,23 @@
  * the License.
  */
 
-package org.apache.geode.services.management;
+plugins {
+    id 'me.champeau.gradle.jmh' version '0.4.8'
+}
+
+apply from: "${rootDir}/${scriptDir}/standard-subproject-configuration.gradle"
+
+apply from: "${project.projectDir}/../gradle/publish-java.gradle"
+apply from: "${project.projectDir}/../gradle/warnings.gradle"
+
+dependencies {
+    compile(platform(project(':boms:geode-all-bom')))
+
+    compileOnly(project(':geode-common'))
+    compileOnly(project(':geode-common-services'))
+
+    compileOnly(project(':geode-launcher'))
+    compileOnly(project(':geode-modules'))
 
-import org.apache.geode.annotations.Experimental;
 
-/**
- * Entry point for creating a cache and bootstrapping Geode using the BootstrappingService
- *
- * @since Geode 1.13.0
- */
-@Experimental
-public interface ManagementService {
-
-  /**
-   * Creates a Geode Cache given some configuration.
-   *
-   * @param properties system properties to use when creating the Cache.
-   *
-   * @throws Exception is Cache cannot be created.
-   */
-  // Cache createCache(Properties properties) throws Exception;
 }
diff --git a/geode-module-bootstrapping/src/main/java/org/apache/geode/services/bootstrapping/impl/BootstrappingServiceImpl.java b/geode-module-bootstrapping/src/main/java/org/apache/geode/services/bootstrapping/impl/BootstrappingServiceImpl.java
new file mode 100644
index 0000000..0214833
--- /dev/null
+++ b/geode-module-bootstrapping/src/main/java/org/apache/geode/services/bootstrapping/impl/BootstrappingServiceImpl.java
@@ -0,0 +1,126 @@
+/*
+ * 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.geode.services.bootstrapping.impl;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.geode.services.bootstrapping.BootstrappingService;
+import org.apache.geode.services.management.ManagementService;
+import org.apache.geode.services.module.ModuleDescriptor;
+import org.apache.geode.services.module.ModuleService;
+import org.apache.geode.services.result.ModuleServiceResult;
+
+public class BootstrappingServiceImpl implements BootstrappingService {
+
+  private static final String rootPath =
+      System.getProperty("user.dir") + "/geode-assembly/build/install/apache-geode/lib/";
+  private final String gemFireVersion = "1.14.0-build.0";
+
+  private final String[] projects = new String[] {
+      "geode-common",
+      // "geode-connectors",
+      "geode-core",
+      // "geode-cq",
+      "geode-gfsh",
+      "geode-http-service",
+      "geode-log4j",
+      "geode-logging",
+      // "geode-lucene",
+      "geode-management",
+      "geode-membership",
+      // "geode-memcached",
+      // "geode-old-client-support",
+      // "geode-protobuf",
+      // "geode-protobuf-messages",
+      "geode-rebalancer",
+      // "geode-redis",
+      "geode-serialization",
+      "geode-tcp-server",
+      "geode-unsafe",
+      // "geode-wan",
+      "geode-module-management"};
+
+
+  private ModuleService moduleService;
+
+  @Override
+  public void init(ModuleService moduleService, Properties properties) {
+    this.moduleService = moduleService;
+
+    registerModules(moduleService);
+
+    moduleService.loadService(ManagementService.class).ifSuccessful(managementServices -> {
+      for (ManagementService managementService : managementServices) {
+        managementService.init(moduleService);
+
+        ModuleServiceResult<Boolean> cacheResult = managementService.createCache(properties);
+
+        if (!cacheResult.isSuccessful()) {
+          System.err.println(cacheResult.getErrorMessage());
+        }
+      }
+    });
+
+  }
+
+  private void registerModules(ModuleService moduleService) {
+    // ------------------- Register Modules
+    List<String> registeredModules = new ArrayList<>();
+
+    Arrays.stream(projects).forEach(project -> {
+      ModuleDescriptor moduleDescriptor = new ModuleDescriptor.Builder(project, gemFireVersion)
+          .fromResourcePaths(rootPath + project + "-" + gemFireVersion + ".jar")
+          .dependsOnModules("geode")
+          .build();
+
+      ModuleServiceResult<Boolean> registerModule =
+          moduleService.registerModule(moduleDescriptor);
+      registerModule.ifFailure(System.err::println);
+      registerModule.ifSuccessful(aBoolean -> registeredModules.add(moduleDescriptor.getName()));
+    });
+
+    ModuleDescriptor geodeDescriptor =
+        new ModuleDescriptor.Builder("geode")
+            .dependsOnModules(registeredModules)
+            .requiresJDKPaths(true)
+            .build();
+
+    ModuleServiceResult<Boolean> registerModule = moduleService.registerModule(geodeDescriptor);
+
+    // ------------------- Load Modules
+    registerModule.ifSuccessful(aBoolean -> {
+      ModuleServiceResult<Boolean> loadModuleResult =
+          moduleService.loadModule(geodeDescriptor);
+      loadModuleResult.ifFailure(System.err::println);
+    });
+    registerModule.ifFailure(System.err::println);
+
+    Arrays.stream(projects).forEach(project -> {
+      ModuleServiceResult<Boolean> loadModuleResult =
+          moduleService.loadModule(new ModuleDescriptor.Builder(project, gemFireVersion).build());
+      loadModuleResult.ifFailure(System.err::println);
+    });
+  }
+
+  @Override
+  public void shutdown() {
+
+  }
+}
diff --git a/geode-module-bootstrapping/src/main/resources/META-INF/services/org.apache.geode.services.bootstrapping.BootstrappingService b/geode-module-bootstrapping/src/main/resources/META-INF/services/org.apache.geode.services.bootstrapping.BootstrappingService
new file mode 100644
index 0000000..b412550
--- /dev/null
+++ b/geode-module-bootstrapping/src/main/resources/META-INF/services/org.apache.geode.services.bootstrapping.BootstrappingService
@@ -0,0 +1 @@
+org.apache.geode.services.bootstrapping.impl.BootstrappingServiceImpl
\ No newline at end of file
diff --git a/geode-logging/src/test/resources/expected-pom.xml b/geode-module-bootstrapping/src/test/resources/expected-pom.xml
similarity index 85%
copy from geode-logging/src/test/resources/expected-pom.xml
copy to geode-module-bootstrapping/src/test/resources/expected-pom.xml
index cb933ff..2f654c4 100644
--- a/geode-logging/src/test/resources/expected-pom.xml
+++ b/geode-module-bootstrapping/src/test/resources/expected-pom.xml
@@ -18,7 +18,7 @@
   -->
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.apache.geode</groupId>
-  <artifactId>geode-logging</artifactId>
+  <artifactId>geode-module-bootstrapping</artifactId>
   <version>${version}</version>
   <name>Apache Geode</name>
   <description>Apache Geode provides a database-like consistency model, reliable transaction processing and a shared-nothing architecture to maintain very low latency performance with high concurrency processing</description>
@@ -45,16 +45,4 @@
       </dependency>
     </dependencies>
   </dependencyManagement>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.geode</groupId>
-      <artifactId>geode-common</artifactId>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.logging.log4j</groupId>
-      <artifactId>log4j-api</artifactId>
-      <scope>runtime</scope>
-    </dependency>
-  </dependencies>
 </project>
diff --git a/geode-common-services/src/main/java/org/apache/geode/services/management/ManagementService.java b/geode-module-management/build.gradle
similarity index 59%
copy from geode-common-services/src/main/java/org/apache/geode/services/management/ManagementService.java
copy to geode-module-management/build.gradle
index 5ae23c5..3bed08f 100644
--- a/geode-common-services/src/main/java/org/apache/geode/services/management/ManagementService.java
+++ b/geode-module-management/build.gradle
@@ -13,24 +13,19 @@
  * the License.
  */
 
-package org.apache.geode.services.management;
+plugins {
+    id 'me.champeau.gradle.jmh' version '0.4.8'
+}
 
-import org.apache.geode.annotations.Experimental;
+apply from: "${rootDir}/${scriptDir}/standard-subproject-configuration.gradle"
 
-/**
- * Entry point for creating a cache and bootstrapping Geode using the BootstrappingService
- *
- * @since Geode 1.13.0
- */
-@Experimental
-public interface ManagementService {
+apply from: "${project.projectDir}/../gradle/publish-java.gradle"
+apply from: "${project.projectDir}/../gradle/warnings.gradle"
 
-  /**
-   * Creates a Geode Cache given some configuration.
-   *
-   * @param properties system properties to use when creating the Cache.
-   *
-   * @throws Exception is Cache cannot be created.
-   */
-  // Cache createCache(Properties properties) throws Exception;
-}
+dependencies {
+    compile(platform(project(':boms:geode-all-bom')))
+
+    compileOnly(project(':geode-launcher'))
+    compileOnly(project(':geode-modules'))
+    compile(project(':geode-core'))
+}
\ No newline at end of file
diff --git a/geode-module-management/src/main/java/org/apache/geode/services/management/impl/ManagementServiceImpl.java b/geode-module-management/src/main/java/org/apache/geode/services/management/impl/ManagementServiceImpl.java
new file mode 100644
index 0000000..1b12bde
--- /dev/null
+++ b/geode-module-management/src/main/java/org/apache/geode/services/management/impl/ManagementServiceImpl.java
@@ -0,0 +1,61 @@
+/*
+ * 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.geode.services.management.impl;
+
+import java.util.Properties;
+
+import org.apache.geode.cache.Cache;
+import org.apache.geode.cache.CacheFactory;
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionShortcut;
+import org.apache.geode.cache.server.CacheServer;
+import org.apache.geode.services.management.ManagementService;
+import org.apache.geode.services.module.ModuleService;
+import org.apache.geode.services.result.ModuleServiceResult;
+import org.apache.geode.services.result.impl.Failure;
+import org.apache.geode.services.result.impl.Success;
+
+public class ManagementServiceImpl implements ManagementService {
+  private ModuleService moduleService;
+
+  @Override
+  public void init(ModuleService moduleService) {
+    this.moduleService = moduleService;
+  }
+
+  @Override
+  public ModuleServiceResult<Boolean> createCache(Properties properties) {
+    try {
+      Cache cache = new CacheFactory(properties)
+          .setModuleService(moduleService)
+          .create();
+
+      CacheServer cacheServer = cache.addCacheServer();
+      cacheServer.setPort(0);
+
+      cacheServer.start();
+
+      Region<Object, Object> test =
+          cache.createRegionFactory(RegionShortcut.PARTITION).create("Test");
+
+      return Success.of(true);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return Failure.of(e.getMessage());
+    }
+  }
+}
diff --git a/geode-module-management/src/main/resources/META-INF/services/org.apache.geode.services.management.ManagementService b/geode-module-management/src/main/resources/META-INF/services/org.apache.geode.services.management.ManagementService
new file mode 100644
index 0000000..85474f8
--- /dev/null
+++ b/geode-module-management/src/main/resources/META-INF/services/org.apache.geode.services.management.ManagementService
@@ -0,0 +1 @@
+org.apache.geode.services.management.impl.ManagementServiceImpl
\ No newline at end of file
diff --git a/geode-logging/src/test/resources/expected-pom.xml b/geode-module-management/src/test/resources/expected-pom.xml
similarity index 90%
copy from geode-logging/src/test/resources/expected-pom.xml
copy to geode-module-management/src/test/resources/expected-pom.xml
index cb933ff..c25e6b3 100644
--- a/geode-logging/src/test/resources/expected-pom.xml
+++ b/geode-module-management/src/test/resources/expected-pom.xml
@@ -18,7 +18,7 @@
   -->
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.apache.geode</groupId>
-  <artifactId>geode-logging</artifactId>
+  <artifactId>geode-module-management</artifactId>
   <version>${version}</version>
   <name>Apache Geode</name>
   <description>Apache Geode provides a database-like consistency model, reliable transaction processing and a shared-nothing architecture to maintain very low latency performance with high concurrency processing</description>
@@ -48,13 +48,8 @@
   <dependencies>
     <dependency>
       <groupId>org.apache.geode</groupId>
-      <artifactId>geode-common</artifactId>
+      <artifactId>geode-core</artifactId>
       <scope>compile</scope>
     </dependency>
-    <dependency>
-      <groupId>org.apache.logging.log4j</groupId>
-      <artifactId>log4j-api</artifactId>
-      <scope>runtime</scope>
-    </dependency>
   </dependencies>
 </project>
diff --git a/geode-old-client-support/build.gradle b/geode-modules-proto/build.gradle
similarity index 73%
copy from geode-old-client-support/build.gradle
copy to geode-modules-proto/build.gradle
index 1ceb25a..8c1aaff 100644
--- a/geode-old-client-support/build.gradle
+++ b/geode-modules-proto/build.gradle
@@ -18,18 +18,18 @@
 apply from: "${rootDir}/${scriptDir}/standard-subproject-configuration.gradle"
 
 apply from: "${project.projectDir}/../gradle/publish-java.gradle"
+apply from: "${project.projectDir}/../gradle/warnings.gradle"
 
+repositories {
+    mavenCentral()
+}
 
 dependencies {
-  implementation(platform(project(':boms:geode-all-bom')))
-  implementation(project(':geode-core'))
-  implementation(project(':geode-logging'))
-  implementation(project(':geode-serialization'))
-  distributedTestImplementation(project(':geode-dunit')){
-    exclude module: 'geode-core'
-  }
-
+    testCompile(group: 'junit', name: 'junit', version: '4.12')
+    testImplementation('org.assertj:assertj-core')
 
-  distributedTestImplementation('junit:junit')
-}
+    compile(platform(project(':boms:geode-all-bom')))
 
+    compile(project(':geode-modules'))
+    compile(project(':geode-launcher'))
+}
\ No newline at end of file
diff --git a/geode-modules-proto/src/main/java/org/apache/geode/services/module/impl/PrototypeTest.java b/geode-modules-proto/src/main/java/org/apache/geode/services/module/impl/PrototypeTest.java
new file mode 100644
index 0000000..1b4318e
--- /dev/null
+++ b/geode-modules-proto/src/main/java/org/apache/geode/services/module/impl/PrototypeTest.java
@@ -0,0 +1,97 @@
+/*
+ * 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.geode.services.module.impl;
+
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.apache.geode.services.bootstrapping.BootstrappingService;
+import org.apache.geode.services.module.ModuleDescriptor;
+import org.apache.geode.services.module.ModuleService;
+import org.apache.geode.services.result.ModuleServiceResult;
+
+public class PrototypeTest {
+
+  private static final String rootPath =
+      System.getProperty("user.dir") + "/geode-assembly/build/install/apache-geode/lib/";
+  private final String gemFireVersion = "1.14.0-build.0";
+  private ModuleService moduleService;
+  private BootstrappingService bootstrappingService;
+
+  private void setup() {
+    // String property = System.getProperty("sun.boot.class.path");
+    Set<String> packages =
+        // GeodeJDKPaths.getListPackagesFromJars(property);
+        new TreeSet<>();
+    packages.add("javax.management");
+    packages.add("java.lang.management");
+
+    System.setProperty("jboss.modules.system.pkgs",
+        processPackagesIntoJBossPackagesNames(packages));
+
+    moduleService = new JBossModuleServiceImpl();
+
+    ModuleDescriptor moduleManagementBootStrappingDescriptor =
+        new ModuleDescriptor.Builder("bootStrapping", gemFireVersion)
+            .fromResourcePaths(rootPath + "geode-module-bootstrapping-" + gemFireVersion + ".jar")
+            .build();
+
+    ModuleServiceResult<Boolean> registerModule =
+        moduleService.registerModule(moduleManagementBootStrappingDescriptor);
+    registerModule.ifSuccessful(result -> {
+      ModuleServiceResult<Boolean> loadModule =
+          moduleService.loadModule(moduleManagementBootStrappingDescriptor);
+      loadModule.ifSuccessful(loadResult -> {
+        ModuleServiceResult<Set<BootstrappingService>> serviceLoadResult =
+            moduleService.loadService(BootstrappingService.class);
+        serviceLoadResult.ifSuccessful(serviceLoad -> {
+          for (BootstrappingService service : serviceLoadResult.getMessage()) {
+            bootstrappingService = service;
+            break;
+          }
+        });
+      });
+      loadModule.ifFailure(System.err::println);
+    });
+    registerModule.ifFailure(System.err::println);
+  }
+
+  private String processPackagesIntoJBossPackagesNames(Set<String> packages) {
+    StringBuilder stringBuilder = new StringBuilder();
+    packages.forEach(packageName -> stringBuilder.append(packageName + ","));
+    if (stringBuilder.length() > 0) {
+      stringBuilder.deleteCharAt(stringBuilder.length() - 1);
+    }
+    return stringBuilder.toString();
+  }
+
+  public static void main(String[] args) {
+    PrototypeTest prototypeTest = new PrototypeTest();
+
+    prototypeTest.setup();
+    Properties properties = new Properties();
+    properties.setProperty("name", "whatever");
+    properties.setProperty("mcast-port", "0");
+    properties.setProperty("start-locator", "localhost[10334]");
+    properties.setProperty("jmx-manager-start", "true");
+    properties.setProperty("jmx-manager", "true");
+
+    if (prototypeTest.bootstrappingService != null) {
+      prototypeTest.bootstrappingService.init(prototypeTest.moduleService, properties);
+    }
+  }
+}
diff --git a/geode-modules-proto/src/main/java/org/apache/geode/services/module/impl/PrototypeTest2.java b/geode-modules-proto/src/main/java/org/apache/geode/services/module/impl/PrototypeTest2.java
new file mode 100644
index 0000000..87000b9
--- /dev/null
+++ b/geode-modules-proto/src/main/java/org/apache/geode/services/module/impl/PrototypeTest2.java
@@ -0,0 +1,97 @@
+/*
+ * 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.geode.services.module.impl;
+
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.apache.geode.services.bootstrapping.BootstrappingService;
+import org.apache.geode.services.module.ModuleDescriptor;
+import org.apache.geode.services.module.ModuleService;
+import org.apache.geode.services.result.ModuleServiceResult;
+
+public class PrototypeTest2 {
+
+  private static String rootPath =
+      System.getProperty("user.dir") + "/geode-assembly/build/install/apache-geode/lib/";
+  private final String gemFireVersion = "1.14.0-build.0";
+  private ModuleService moduleService;
+  private BootstrappingService bootstrappingService;
+
+  private void setup() {
+    // String property = System.getProperty("sun.boot.class.path");
+    Set<String> packages =
+        // GeodeJDKPaths.getListPackagesFromJars(property);
+        new TreeSet<>();
+    packages.add("javax.management");
+    packages.add("java.lang.management");
+
+    System.setProperty("jboss.modules.system.pkgs",
+        processPackagesIntoJBossPackagesNames(packages));
+
+    moduleService = new JBossModuleServiceImpl();
+
+    ModuleDescriptor moduleManagementBootStrappingDescriptor =
+        new ModuleDescriptor.Builder("bootStrapping", gemFireVersion)
+            .fromResourcePaths(rootPath + "geode-module-bootstrapping-" + gemFireVersion + ".jar")
+            .build();
+
+    ModuleServiceResult<Boolean> registerModule =
+        moduleService.registerModule(moduleManagementBootStrappingDescriptor);
+    registerModule.ifSuccessful(result -> {
+      ModuleServiceResult<Boolean> loadModule =
+          moduleService.loadModule(moduleManagementBootStrappingDescriptor);
+      loadModule.ifSuccessful(loadResult -> {
+        ModuleServiceResult<Set<BootstrappingService>> serviceLoadResult =
+            moduleService.loadService(BootstrappingService.class);
+        serviceLoadResult.ifSuccessful(serviceLoad -> {
+          for (BootstrappingService service : serviceLoadResult.getMessage()) {
+            bootstrappingService = service;
+            break;
+          }
+        });
+      });
+      loadModule.ifFailure(System.err::println);
+    });
+    registerModule.ifFailure(System.err::println);
+  }
+
+  private String processPackagesIntoJBossPackagesNames(Set<String> packages) {
+    StringBuilder stringBuilder = new StringBuilder();
+    packages.forEach(packageName -> stringBuilder.append(packageName + ","));
+    if (stringBuilder.length() > 0) {
+      stringBuilder.deleteCharAt(stringBuilder.length() - 1);
+    }
+    return stringBuilder.toString();
+  }
+
+  public static void main(String[] args) {
+    PrototypeTest2 prototypeTest = new PrototypeTest2();
+
+    prototypeTest.setup();
+    Properties properties = new Properties();
+    properties.setProperty("name", "whatever2");
+    properties.setProperty("mcast-port", "0");
+    properties.setProperty("locators", "localhost[10334]");
+    // properties.setProperty("jmx-manager-start", "true");
+    // properties.setProperty("jmx-manager", "true");
+
+    if (prototypeTest.bootstrappingService != null) {
+      prototypeTest.bootstrappingService.init(prototypeTest.moduleService, properties);
+    }
+  }
+}
diff --git a/geode-logging/src/test/resources/expected-pom.xml b/geode-modules-proto/src/test/resources/expected-pom.xml
similarity index 91%
copy from geode-logging/src/test/resources/expected-pom.xml
copy to geode-modules-proto/src/test/resources/expected-pom.xml
index cb933ff..0128169 100644
--- a/geode-logging/src/test/resources/expected-pom.xml
+++ b/geode-modules-proto/src/test/resources/expected-pom.xml
@@ -18,7 +18,7 @@
   -->
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.apache.geode</groupId>
-  <artifactId>geode-logging</artifactId>
+  <artifactId>geode-modules-proto</artifactId>
   <version>${version}</version>
   <name>Apache Geode</name>
   <description>Apache Geode provides a database-like consistency model, reliable transaction processing and a shared-nothing architecture to maintain very low latency performance with high concurrency processing</description>
@@ -48,13 +48,13 @@
   <dependencies>
     <dependency>
       <groupId>org.apache.geode</groupId>
-      <artifactId>geode-common</artifactId>
+      <artifactId>geode-modules</artifactId>
       <scope>compile</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.logging.log4j</groupId>
-      <artifactId>log4j-api</artifactId>
-      <scope>runtime</scope>
+      <groupId>org.apache.geode</groupId>
+      <artifactId>geode-launcher</artifactId>
+      <scope>compile</scope>
     </dependency>
   </dependencies>
 </project>
diff --git a/geode-modules/src/main/java/org/apache/geode/services/module/impl/JBossModuleServiceImpl.java b/geode-modules/src/main/java/org/apache/geode/services/module/impl/JBossModuleServiceImpl.java
index bf0b347..505103f 100644
--- a/geode-modules/src/main/java/org/apache/geode/services/module/impl/JBossModuleServiceImpl.java
+++ b/geode-modules/src/main/java/org/apache/geode/services/module/impl/JBossModuleServiceImpl.java
@@ -15,14 +15,13 @@
 
 package org.apache.geode.services.module.impl;
 
-import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
 
-import org.apache.logging.log4j.Logger;
 import org.jboss.modules.Module;
 import org.jboss.modules.ModuleClassLoader;
 import org.jboss.modules.ModuleLoadException;
@@ -51,11 +50,12 @@ public class JBossModuleServiceImpl implements ModuleService {
 
   private final GeodeModuleLoader moduleLoader;
 
-  private final Logger logger;
+  // private final Logger logger;
 
-  public JBossModuleServiceImpl(Logger logger) {
-    this.logger = logger;
-    this.moduleLoader = new GeodeModuleLoader(logger);
+  // public JBossModuleServiceImpl(Logger logger) {
+  public JBossModuleServiceImpl() {
+    // this.logger = logger;
+    this.moduleLoader = new GeodeModuleLoader();
   }
 
   /**
@@ -76,11 +76,11 @@ public class JBossModuleServiceImpl implements ModuleService {
     }
 
     String versionedName = moduleDescriptor.getName();
-    logger.debug(String.format("Beginning to load module %s", versionedName));
+    // logger.debug(String.format("Beginning to load module %s", versionedName));
 
     if (modules.containsKey(versionedName)) {
       String errorMessage = String.format("Module %s is already loaded.", versionedName);
-      logger.warn(errorMessage);
+      // logger.warn(errorMessage);
       return Failure.of(errorMessage);
     }
 
@@ -103,8 +103,8 @@ public class JBossModuleServiceImpl implements ModuleService {
       modules.put(versionedName, moduleLoader.loadModule(versionedName));
       return Success.of(true);
     } catch (ModuleLoadException e) {
-      logger.error(e.getMessage(), e);
-      return Failure.of(e.getMessage());
+      // logger.error(e.getMessage(), e);
+      return Failure.of(e.toString());
     }
   }
 
@@ -113,11 +113,11 @@ public class JBossModuleServiceImpl implements ModuleService {
    */
   @Override
   public ModuleServiceResult<Boolean> unloadModule(String moduleName) {
-    logger.debug(String.format("Unloading module %s", moduleName));
+    // logger.debug(String.format("Unloading module %s", moduleName));
     if (!modules.containsKey(moduleName)) {
       String errorMessage =
           String.format("Module %s could not be unloaded because it is not loaded", moduleName);
-      logger.warn(errorMessage);
+      // logger.warn(errorMessage);
       return Failure.of(errorMessage);
     }
 
@@ -125,7 +125,7 @@ public class JBossModuleServiceImpl implements ModuleService {
         moduleLoader.unloadModule(modules.get(moduleName));
     if (unloadModuleResult.isSuccessful()) {
       modules.remove(moduleName);
-      logger.debug(String.format("Module %s was successfully unloaded", moduleName));
+      // logger.debug(String.format("Module %s was successfully unloaded", moduleName));
     }
 
     return unloadModuleResult;
@@ -133,23 +133,17 @@ public class JBossModuleServiceImpl implements ModuleService {
 
   /**
    * {@inheritDoc}
+   *
    */
   @Override
-  public <T> ModuleServiceResult<Map<String, Set<T>>> loadService(Class<T> service) {
-    Map<String, Set<T>> serviceImpls = new HashMap<>();
+  public <T> ModuleServiceResult<Set<T>> loadService(Class<T> service) {
+    Set<T> result = createTreeSetWithClassLoaderComparator();
 
     // Iterate over all the modules looking for implementations of service.
-    modules.values().forEach((module) -> {
-      module.loadService(service).forEach((serviceImpl) -> {
-        String moduleName = ((ModuleClassLoader) serviceImpl.getClass().getClassLoader()).getName();
-        Set<T> listOfServices = Optional.ofNullable(serviceImpls.get(moduleName))
-            .orElseGet(() -> createTreeSetWithClassLoaderComparator());
-        listOfServices.add(serviceImpl);
-        serviceImpls.put(moduleName, listOfServices);
-      });
-    });
+    modules.values().forEach((module) -> module.loadService(service).forEach(result::add));
+
+    return Success.of(result);
 
-    return Success.of(serviceImpls);
   }
 
   /**
@@ -194,7 +188,7 @@ public class JBossModuleServiceImpl implements ModuleService {
         module = moduleLoader.loadModule(moduleDescriptor.getName());
         return loadClassFromModule(className, module);
       } catch (ModuleLoadException e) {
-        logger.error(e);
+        // logger.error(e);
         return Failure.of(e.getMessage());
       }
     }
@@ -220,7 +214,7 @@ public class JBossModuleServiceImpl implements ModuleService {
       String errorMessage =
           String.format("Could not find class for name: %s in module: %s", className,
               module.getName());
-      logger.debug(errorMessage);
+      // logger.debug(errorMessage);
       return Failure.of(errorMessage);
     }
   }
@@ -229,18 +223,17 @@ public class JBossModuleServiceImpl implements ModuleService {
    * {@inheritDoc}
    */
   @Override
-  public ModuleServiceResult<Map<String, Class<?>>> loadClass(String className) {
-    Map<String, Class<?>> classes = new HashMap<>();
+  public ModuleServiceResult<List<Class<?>>> loadClass(String className) {
+    List<Class<?>> result = new ArrayList<>();
     modules.values().forEach((module) -> {
       try {
-        Class<?> loadedClass = module.getClassLoader().loadClass(className);
-        classes.put(module.getName(), loadedClass);
+        result.add(module.getClassLoader().loadClass(className));
       } catch (ClassNotFoundException e) {
-        logger.debug(String.format("Could not find class for name: %s in module: %s", className,
-            module.getName()));
+        // logger.debug(String.format("Could not find class for name: %s in module: %s", className,
+        // module.getName()));
       }
     });
 
-    return Success.of(classes);
+    return Success.of(result);
   }
 }
diff --git a/geode-modules/src/main/java/org/apache/geode/services/module/internal/finder/DelegatingModuleFinder.java b/geode-modules/src/main/java/org/apache/geode/services/module/internal/finder/DelegatingModuleFinder.java
index ef727aa..e803f57 100644
--- a/geode-modules/src/main/java/org/apache/geode/services/module/internal/finder/DelegatingModuleFinder.java
+++ b/geode-modules/src/main/java/org/apache/geode/services/module/internal/finder/DelegatingModuleFinder.java
@@ -18,7 +18,7 @@ package org.apache.geode.services.module.internal.finder;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
-import org.apache.logging.log4j.Logger;
+import org.jboss.modules.JDKModuleFinder;
 import org.jboss.modules.ModuleFinder;
 import org.jboss.modules.ModuleLoadException;
 import org.jboss.modules.ModuleLoader;
@@ -38,17 +38,21 @@ import org.jboss.modules.ModuleSpec;
  * @see ModuleSpec
  */
 public class DelegatingModuleFinder implements ModuleFinder {
-  private final Logger logger;
+  // private final Logger logger;
 
   private final List<ModuleFinder> finders = new CopyOnWriteArrayList<>();
 
-  public DelegatingModuleFinder(Logger logger) {
-    this.logger = logger;
+  public DelegatingModuleFinder() {
+    finders.add(JDKModuleFinder.getInstance());
   }
 
+  // public DelegatingModuleFinder(Logger logger) {
+  // this.logger = logger;
+  // }
+
   public void addModuleFinder(ModuleFinder finder) {
     finders.add(finder);
-    logger.debug("Added finder " + finder);
+    // logger.debug("Added finder " + finder);
   }
 
   @Override
@@ -57,11 +61,11 @@ public class DelegatingModuleFinder implements ModuleFinder {
     for (ModuleFinder finder : finders) {
       ModuleSpec moduleSpec = finder.findModule(name, delegateLoader);
       if (moduleSpec != null) {
-        logger.debug(String.format("Found module specification for module named: %s ", name));
+        // logger.debug(String.format("Found module specification for module named: %s ", name));
         return moduleSpec;
       }
     }
-    logger.debug(String.format("No module specification for module named: %s found", name));
+    // logger.debug(String.format("No module specification for module named: %s found", name));
     return null;
   }
 }
diff --git a/geode-modules/src/main/java/org/apache/geode/services/module/internal/loader/GeodeModuleLoader.java b/geode-modules/src/main/java/org/apache/geode/services/module/internal/loader/GeodeModuleLoader.java
index 9ea0668..fa11f5e 100644
--- a/geode-modules/src/main/java/org/apache/geode/services/module/internal/loader/GeodeModuleLoader.java
+++ b/geode-modules/src/main/java/org/apache/geode/services/module/internal/loader/GeodeModuleLoader.java
@@ -20,9 +20,8 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.logging.log4j.Logger;
 import org.jboss.modules.DelegatingModuleLoader;
-import org.jboss.modules.GeodeJarModuleFinder;
+import org.jboss.modules.GeodeModuleFinder;
 import org.jboss.modules.Module;
 import org.jboss.modules.ModuleFinder;
 import org.jboss.modules.ModuleLoadException;
@@ -60,25 +59,31 @@ import org.apache.geode.services.result.impl.Success;
 public class GeodeModuleLoader extends DelegatingModuleLoader {
   private final DelegatingModuleFinder moduleFinder;
   private final Map<String, ModuleSpec> moduleSpecs = new ConcurrentHashMap<>();
-  private final Logger logger;
+  // private final Logger logger;
 
-  public GeodeModuleLoader(Logger logger) {
-    this(new DelegatingModuleFinder(logger), logger);
+  // public GeodeModuleLoader(Logger logger) {
+  // this(new DelegatingModuleFinder(logger), logger);
+  // }
+  public GeodeModuleLoader() {
+    this(new DelegatingModuleFinder());
   }
 
-  private GeodeModuleLoader(DelegatingModuleFinder moduleFinder, Logger logger) {
+  // private GeodeModuleLoader(DelegatingModuleFinder moduleFinder, Logger logger) {
+  private GeodeModuleLoader(DelegatingModuleFinder moduleFinder) {
     super(Module.getSystemModuleLoader(), moduleFinder);
     this.moduleFinder = moduleFinder;
-    this.logger = logger;
+    // this.logger = logger;
   }
 
+
+
   public ModuleServiceResult<Boolean> unloadModule(Module module) {
     if (module != null && !StringUtils.isEmpty(module.getName())) {
       return unloadModuleAndRemoveSpec(module);
     } else {
       String errorMessage =
           "Module could not be unloaded because either the module or module name is null";
-      logger.debug(errorMessage);
+      // logger.debug(errorMessage);
       return Failure.of(errorMessage);
     }
   }
@@ -90,11 +95,11 @@ public class GeodeModuleLoader extends DelegatingModuleLoader {
         return Success.of(true);
       } else {
         String errorMessage = "Module could not be unloaded because it does not exist";
-        logger.debug(errorMessage);
+        // logger.debug(errorMessage);
         return Failure.of(errorMessage);
       }
     } catch (SecurityException e) {
-      logger.error(e);
+      // logger.error(e);
       return Failure.of(String.format("Unloading of module: %s  failed due to exception: %s",
           module.getName(), e.getMessage()));
     }
@@ -102,9 +107,10 @@ public class GeodeModuleLoader extends DelegatingModuleLoader {
 
   public ModuleServiceResult<Boolean> registerModuleDescriptor(ModuleDescriptor descriptor) {
     try {
-      moduleFinder.addModuleFinder(new GeodeJarModuleFinder(logger, descriptor));
+      moduleFinder.addModuleFinder(new GeodeModuleFinder(descriptor));
+      // moduleFinder.addModuleFinder(new GeodeJarModuleFinder(logger, descriptor));
     } catch (IOException e) {
-      logger.error(e);
+      // logger.error(e);
       return Failure.of(String.format("Registering module: %s failed with error: %s",
           descriptor.getName(), e.getMessage()));
     }
diff --git a/geode-modules/src/main/java/org/jboss/modules/GeodeJDKPaths.java b/geode-modules/src/main/java/org/jboss/modules/GeodeJDKPaths.java
new file mode 100644
index 0000000..3a60d32
--- /dev/null
+++ b/geode-modules/src/main/java/org/jboss/modules/GeodeJDKPaths.java
@@ -0,0 +1,163 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2014 Red Hat, Inc., and individual contributors
+ * as indicated by the @author tags.
+ *
+ * Licensed 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.jboss.modules;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+/**
+ * A utility class which maintains the set of JDK paths. Makes certain assumptions about the
+ * disposition of the
+ * class loader used to load JBoss Modules; thus this class should only be used when booted up via
+ * the "-jar" or "-cp"
+ * switches.
+ *
+ * @author <a href="mailto:david.lloyd@redhat.com">David M. Lloyd</a>
+ * @author <a href="mailto:ropalka@redhat.com">Richard Opalka</a>
+ */
+public final class GeodeJDKPaths {
+  static final Set<String> JDK;
+
+  static {
+    Set<String> result = new TreeSet<>();
+    processClassPathItem(System.getProperty("java.class.path"), result);
+    if (result.size() == 0)
+      throw new IllegalStateException("Something went wrong with system paths set up");
+    JDK = Collections.unmodifiableSet(result);
+  }
+
+  private GeodeJDKPaths() {}
+
+  static void processJar(final Set<String> pathSet, final File file) throws IOException {
+    try (final ZipFile zipFile = new ZipFile(file)) {
+      final Enumeration<? extends ZipEntry> entries = zipFile.entries();
+      while (entries.hasMoreElements()) {
+        final ZipEntry entry = entries.nextElement();
+        final String name = entry.getName();
+        final int lastSlash = name.lastIndexOf('/');
+        if (lastSlash != -1) {
+          pathSet.add(name.substring(0, lastSlash));
+        }
+      }
+    }
+  }
+
+  public static void processClassPathItem(final String classPath, final Set<String> pathSet) {
+    if (classPath == null)
+      return;
+    int start = 0, end;
+    do {
+      end = classPath.indexOf(File.pathSeparatorChar, start);
+      String item = end == -1 ? classPath.substring(start) : classPath.substring(start, end);
+      // if (! jarSet.contains(item)) {
+      final File file = new File(item);
+      if (file.isDirectory()) {
+        processDirectory(pathSet, file);
+      } else {
+        try {
+          processJar(pathSet, file);
+        } catch (IOException ex) {
+          // ignore
+        }
+      }
+      // }
+      start = end + 1;
+    } while (end != -1);
+  }
+
+  static void processDirectory(final Set<String> pathSet, final File file) {
+    for (File entry : file.listFiles()) {
+      if (entry.isDirectory()) {
+        processDirectory1(pathSet, entry, file.getPath());
+      } else {
+        final String parent = entry.getParent();
+        if (parent != null)
+          pathSet.add(parent);
+      }
+    }
+  }
+
+  private static void processDirectory1(final Set<String> pathSet, final File file,
+      final String pathBase) {
+    for (File entry : file.listFiles()) {
+      if (entry.isDirectory()) {
+        processDirectory1(pathSet, entry, pathBase);
+      } else {
+        String packagePath = entry.getParent();
+        if (packagePath != null) {
+          packagePath = packagePath.substring(pathBase.length()).replace('\\', '/');
+          if (packagePath.startsWith("/")) {
+            packagePath = packagePath.substring(1);
+          }
+          pathSet.add(packagePath);
+        }
+      }
+    }
+  }
+
+  public static Set<String> getListPackagesFromJars(String classPathString) {
+    Set<String> packageNames = new TreeSet<>();
+    if (classPathString == null) {
+      return packageNames;
+    }
+    String[] classPaths = classPathString.split(File.pathSeparator);
+    Arrays.stream(classPaths).forEach(classPath -> {
+      final File file = new File(classPath);
+      if (!file.isDirectory()) {
+        try {
+          processJarForPackageNames(packageNames, file);
+        } catch (IOException ex) {
+          // ignore
+        }
+      }
+    });
+    return packageNames;
+  }
+
+  private static void processJarForPackageNames(Set<String> packageNames, File file)
+      throws IOException {
+    try (JarFile jarFile = new JarFile(file)) {
+      try {
+        Enumeration<JarEntry> entries = jarFile.entries();
+        while (entries.hasMoreElements()) {
+          JarEntry jarEntry = entries.nextElement();
+          if (jarEntry == null) {
+            break;
+          }
+          if ((jarEntry.getName().endsWith(".class"))) {
+            String className = jarEntry.getName().replaceAll("/", "\\.");
+            String myClass = className.substring(0, className.lastIndexOf('.'));
+            packageNames.add(myClass.substring(0, myClass.lastIndexOf(".")));
+          }
+        }
+      } catch (Exception e) {
+        System.out.println("Oops.. Encounter an issue while parsing jar" + e.toString());
+      }
+    }
+  }
+}
diff --git a/geode-modules/src/main/java/org/jboss/modules/GeodeJarModuleFinder.java b/geode-modules/src/main/java/org/jboss/modules/GeodeModuleFinder.java
similarity index 68%
rename from geode-modules/src/main/java/org/jboss/modules/GeodeJarModuleFinder.java
rename to geode-modules/src/main/java/org/jboss/modules/GeodeModuleFinder.java
index ec4d200..4254ee9 100644
--- a/geode-modules/src/main/java/org/jboss/modules/GeodeJarModuleFinder.java
+++ b/geode-modules/src/main/java/org/jboss/modules/GeodeModuleFinder.java
@@ -29,27 +29,25 @@ import java.util.jar.Manifest;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.Logger;
+import org.jboss.modules.filter.PathFilters;
 
 import org.apache.geode.services.module.ModuleDescriptor;
 
 /**
- * A custom implementation of a {@link ModuleFinder}. This implementation is based on
- * {@link JarModuleFinder}
- * which creates a {@link ModuleSpec} from a {@link ModuleDescriptor}
- * The {@link ModuleDescriptor} defines the module name, a set of {@link JarFile}s and/or dependent
- * module names for Module.
- *
+ * A custom implementation of a {@link ModuleFinder}. This implementation is based on {@link
+ * JarModuleFinder} which creates a {@link ModuleSpec} from a {@link ModuleDescriptor} The {@link
+ * ModuleDescriptor} defines the module name, a set of {@link JarFile}s and/or dependent module
+ * names for Module.
+ * <p>
  * This {@link ModuleFinder} has the ability to set both resource paths and dependent module names
- * from either
- * the {@link ModuleDescriptor} or from a {@link Manifest} file within the {@link JarFile}.
- *
+ * from either the {@link ModuleDescriptor} or from a {@link Manifest} file within the {@link
+ * JarFile}.
+ * <p>
  * {@link Manifest} file must contain the attribute {@link Attributes.Name#CLASS_PATH} for resource
- * paths and "Dependent-Modules"
- * for a list of modules this modules depends on.
- *
- * In the case of both values being set on the {@link ModuleDescriptor} and within the
- * {@link Manifest} file,
- * the rule of addition is followed rather than failure.
+ * paths and "Dependent-Modules" for a list of modules this modules depends on.
+ * <p>
+ * In the case of both values being set on the {@link ModuleDescriptor} and within the {@link
+ * Manifest} file, the rule of addition is followed rather than failure.
  *
  * @see ModuleDescriptor
  * @see ModuleSpec
@@ -57,34 +55,34 @@ import org.apache.geode.services.module.ModuleDescriptor;
  * @see JarModuleFinder
  * @see JarFile
  * @see Manifest
- *
  * @since 1.14.0
- *
  */
-public class GeodeJarModuleFinder implements ModuleFinder {
+public class GeodeModuleFinder implements ModuleFinder {
 
   private final ModuleDescriptor moduleDescriptor;
   private final String moduleName;
   private final List<JarFile> sourceJarFiles;
-  private final Logger logger;
+  private final List<File> sourceFiles;
+  // private final Logger logger;
 
   private static final String[] EMPTY_STRING_ARRAY = new String[0];
   private static final String DEPENDENT_MODULES = "Dependent-Modules";
   private static final List<String> EMPTY_LIST = new ArrayList<>();
 
   /**
-   * Constructs a {@link GeodeJarModuleFinder} using a {@link Logger} and {@link ModuleDescriptor}.
+   * Constructs a {@link GeodeModuleFinder} using a {@link Logger} and {@link ModuleDescriptor}.
    * In the the case of incorrect/missing resource paths an {@link IOException} will be thrown.
    *
-   * @param logger a Logger to log messages
    * @param moduleDescriptor the {@link ModuleDescriptor} describing the module
    * @throws IOException is thrown in the case of incorrect/missing resource paths.
    */
-  public GeodeJarModuleFinder(final Logger logger, final ModuleDescriptor moduleDescriptor)
+  // public GeodeJarModuleFinder(final Logger logger, final ModuleDescriptor moduleDescriptor)
+  public GeodeModuleFinder(final ModuleDescriptor moduleDescriptor)
       throws IOException {
     this.moduleName = moduleDescriptor.getName();
     this.sourceJarFiles = parseSourcesIntoJarFiles(moduleDescriptor);
-    this.logger = logger;
+    this.sourceFiles = parseSourcesIntoPathFiles(moduleDescriptor);
+    // this.logger = logger;
     this.moduleDescriptor = moduleDescriptor;
   }
 
@@ -99,7 +97,26 @@ public class GeodeJarModuleFinder implements ModuleFinder {
       throws IOException {
     List<JarFile> results = new LinkedList<>();
     for (String sourcePath : moduleDescriptor.getResourceJarPaths()) {
-      results.add(new JarFile(sourcePath, true));
+      if (sourcePath.endsWith(".jar")) {
+        results.add(new JarFile(sourcePath, true));
+      }
+    }
+    return results;
+  }
+
+  /**
+   * Processes the {@link ModuleDescriptor} resource paths into a collection of {@link JarFile}
+   *
+   * @param moduleDescriptor the {@link ModuleDescriptor} for the module
+   * @return a collection of {@link JarFile} from the {@link ModuleDescriptor}
+   * @throws IOException is thrown in the case of incorrect/missing resources
+   */
+  private List<File> parseSourcesIntoPathFiles(ModuleDescriptor moduleDescriptor) {
+    List<File> results = new LinkedList<>();
+    for (String sourcePath : moduleDescriptor.getResourceJarPaths()) {
+      if (!sourcePath.endsWith(".jar")) {
+        results.add(new File(sourcePath));
+      }
     }
     return results;
   }
@@ -117,9 +134,9 @@ public class GeodeJarModuleFinder implements ModuleFinder {
   }
 
   /**
-   * Create a {@link ModuleSpec} for the registered Module.
-   * It creates a {@link ModuleSpec} for the name, processes each of the {@link JarFile} in the
-   * {@link #sourceJarFiles} collection and adds dependencies to other modules.
+   * Create a {@link ModuleSpec} for the registered Module. It creates a {@link ModuleSpec} for the
+   * name, processes each of the {@link JarFile} in the {@link #sourceJarFiles} collection and adds
+   * dependencies to other modules.
    *
    * @param name the module name
    * @return a {@link ModuleSpec} from the corresponding {@link ModuleDescriptor}
@@ -130,8 +147,21 @@ public class GeodeJarModuleFinder implements ModuleFinder {
     for (JarFile jarFile : sourceJarFiles) {
       registerJarFile(moduleSpecBuilder, jarFile);
     }
+
+    for (File file : sourceFiles) {
+      registerFilePath(moduleSpecBuilder, file);
+    }
     createDependenciesForModules(moduleSpecBuilder, moduleDescriptor.getDependedOnModules());
-    moduleSpecBuilder.addDependency(DependencySpec.createSystemDependencySpec(JDKPaths.JDK));
+    if (moduleDescriptor.requiresJDKPaths()) {
+      moduleSpecBuilder.addDependency(new LocalDependencySpecBuilder()
+          .setImportFilter(PathFilters.acceptAll())
+          .setExport(true)
+          .setLocalLoader(ClassLoaderLocalLoader.SYSTEM)
+          .setLoaderPaths(JDKPaths.JDK)
+          .build());
+    }
+    moduleSpecBuilder
+        .addDependency(DependencySpec.createSystemDependencySpec(GeodeJDKPaths.JDK));
     return moduleSpecBuilder.create();
   }
 
@@ -152,8 +182,21 @@ public class GeodeJarModuleFinder implements ModuleFinder {
   }
 
   /**
-   * Processes a collection of modules and adds them to the dependent modules list for the
-   * {@link ModuleSpec}
+   * Processes a single {@link JarFile}. Processes the optionally included {@link Manifest} and adds
+   * itself to the {@link ModuleSpec} as a source resource.
+   *
+   * @param moduleSpecBuilder the builder for the {@link ModuleSpec}
+   * @param file the {@link File} to be processed
+   * @throws ModuleLoadException in case of failure loading resource paths
+   */
+  private void registerFilePath(ModuleSpec.Builder moduleSpecBuilder, File file) {
+    moduleSpecBuilder.addResourceRoot(ResourceLoaderSpec
+        .createResourceLoaderSpec(ResourceLoaders.createPathResourceLoader(file.toPath())));
+  }
+
+  /**
+   * Processes a collection of modules and adds them to the dependent modules list for the {@link
+   * ModuleSpec}
    *
    * @param moduleSpecBuilder the builder for the {@link ModuleSpec}
    * @param modulesDependencies a list of module names on which this module depends on
@@ -232,9 +275,9 @@ public class GeodeJarModuleFinder implements ModuleFinder {
               .createResourceLoaderSpec(
                   ResourceLoaders.createJarResourceLoader(new JarFile(file, true))));
         } catch (IOException e) {
-          logger.error(String.format(
-              "File for name: %s could not be loaded as a dependent jar file at location: %s",
-              classpathEntry, file.getName()));
+          // logger.error(String.format(
+          // "File for name: %s could not be loaded as a dependent jar file at location: %s",
+          // classpathEntry, file.getName()));
           throw new ModuleLoadException(e);
         }
       }
@@ -242,8 +285,8 @@ public class GeodeJarModuleFinder implements ModuleFinder {
   }
 
   /**
-   * Returns a {@link File} for the path = rootPath + fileName.
-   * Checks if the fileName includes ".jar" and adds it if it is not included.
+   * Returns a {@link File} for the path = rootPath + fileName. Checks if the fileName includes
+   * ".jar" and adds it if it is not included.
    *
    * @param rootPath the root path where the file is to be located
    * @param fileName the filename of the {@link JarFile} within the rootPath
@@ -264,9 +307,24 @@ public class GeodeJarModuleFinder implements ModuleFinder {
    * @return a {@link ModuleSpec.Builder}
    */
   private ModuleSpec.Builder getModuleSpec(String name) {
+
+    // PathFilter metainfChild = PathFilters.isChildOf("META-INF");
+    // PathFilter metainf = PathFilters.is("META-INF");
+    // PathFilter metainfServices = PathFilters.is("META-INF/services");
+    // PathFilter metainfServicesChild = PathFilters.isChildOf("META-INF/services");
+    // PathFilter childOfSlash = PathFilters.isChildOf("/");
+    // MultiplePathFilterBuilder multiplePathFilterBuilder =
+    // PathFilters.multiplePathFilterBuilder(true);
+    // multiplePathFilterBuilder.addFilter(metainfChild, true);
+    // multiplePathFilterBuilder.addFilter(metainf, true);
+    // multiplePathFilterBuilder.addFilter(metainfServicesChild, true);
+    // multiplePathFilterBuilder.addFilter(metainfServices, true);
+    // multiplePathFilterBuilder.addFilter(childOfSlash, true);
+
     ModuleSpec.Builder builder = ModuleSpec.build(name);
     builder.addDependency(new LocalDependencySpecBuilder()
         .setImportServices(true)
+        // .setImportFilter(multiplePathFilterBuilder.create())
         .setExport(true)
         .build());
 
@@ -278,15 +336,15 @@ public class GeodeJarModuleFinder implements ModuleFinder {
    *
    * @param jarFile the {@link JarFile} from which to retrieve the {@link Manifest} file
    * @return an {@link Optional} containing a {@link Manifest} file from the {@link JarFile}. In the
-   *         case of no {@link Manifest} file
-   *         being present, an {@link Optional#empty()} shall be returned.
+   *         case of no {@link Manifest} file being present, an {@link Optional#empty()} shall be
+   *         returned.
    */
   private Optional<Manifest> getManifestFromJar(JarFile jarFile) {
     try {
       return Optional.ofNullable(jarFile.getManifest());
     } catch (IOException e) {
-      logger.info(
-          String.format("Unable to find manifest file for jar ile name: %s", jarFile.getName()));
+      // logger.info(
+      // String.format("Unable to find manifest file for jar ile name: %s", jarFile.getName()));
     }
     return Optional.empty();
   }
diff --git a/geode-modules/src/test/java/org/apache/geode/services/module/impl/JBossModuleServiceImplWithoutPopulatedManifestFileTest.java b/geode-modules/src/test/java/org/apache/geode/services/module/impl/JBossModuleServiceImplWithoutPopulatedManifestFileTest.java
index 3756506..5b0c0d7 100644
--- a/geode-modules/src/test/java/org/apache/geode/services/module/impl/JBossModuleServiceImplWithoutPopulatedManifestFileTest.java
+++ b/geode-modules/src/test/java/org/apache/geode/services/module/impl/JBossModuleServiceImplWithoutPopulatedManifestFileTest.java
@@ -18,14 +18,10 @@ package org.apache.geode.services.module.impl;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.AssertionsForClassTypes.assertThatExceptionOfType;
 
-import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import org.apache.logging.log4j.LogManager;
 import org.jboss.modules.ModuleClassLoader;
 import org.junit.After;
 import org.junit.Before;
@@ -33,12 +29,15 @@ import org.junit.Test;
 
 import org.apache.geode.InvalidService;
 import org.apache.geode.TestService;
+import org.apache.geode.internal.GemFireVersion;
 import org.apache.geode.services.module.ModuleDescriptor;
 import org.apache.geode.services.module.ModuleService;
 import org.apache.geode.services.result.ModuleServiceResult;
 
 public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
 
+  private static final String gemFireVersion = GemFireVersion.getGemFireVersion();
+
   private static final String MODULE1_PATH =
       System.getProperty("user.dir") + "/../libs/module1WithoutManifest-1.0.jar";
   private static final String MODULE2_PATH =
@@ -47,6 +46,10 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
       System.getProperty("user.dir") + "/../libs/module3WithoutManifest-1.0.jar";
   private static final String MODULE4_PATH =
       System.getProperty("user.dir") + "/../libs/module4WithoutManifest-1.0.jar";
+  private static final String GEODE_COMMONS_SERVICES_PATH =
+      System.getProperty("user.dir") + "/../libs/geode-common-services-" + gemFireVersion + ".jar";
+  private static final String GEODE_COMMONS_PATH =
+      System.getProperty("user.dir") + "/../libs/geode-common-" + gemFireVersion + ".jar";
 
   private static final String MODULE1_MESSAGE = "Hello from Module1!";
   private static final String MODULE2_MESSAGE = "Hello from Module2!";
@@ -55,7 +58,19 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
 
   @Before
   public void setup() {
-    moduleService = new JBossModuleServiceImpl(LogManager.getLogger());
+    moduleService = new JBossModuleServiceImpl();
+    ModuleDescriptor geodeCommonsServiceDescriptor =
+        new ModuleDescriptor.Builder("geode-common-services", gemFireVersion)
+            .fromResourcePaths(GEODE_COMMONS_SERVICES_PATH)
+            .build();
+
+    ModuleDescriptor geodeCommonDescriptor =
+        new ModuleDescriptor.Builder("geode-common", gemFireVersion)
+            .fromResourcePaths(GEODE_COMMONS_PATH)
+            .build();
+
+    moduleService.registerModule(geodeCommonDescriptor);
+    moduleService.registerModule(geodeCommonsServiceDescriptor);
   }
 
   @After
@@ -65,7 +80,7 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
 
   @Test
   public void modulesNotAccessibleFromSystemClassloaderNoModulesLoaded() {
-    ModuleServiceResult<Map<String, Class<?>>> mapModuleServiceResult = moduleService
+    ModuleServiceResult<List<Class<?>>> mapModuleServiceResult = moduleService
         .loadClass("org.apache.geode.ModuleService1");
     assertThat(mapModuleServiceResult.isSuccessful()).isEqualTo(true);
     assertThat(mapModuleServiceResult.getMessage().size()).isEqualTo(0);
@@ -215,6 +230,7 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
             .dependsOnModules(module1Descriptor.getName())
             .build();
 
+
     assertThat(moduleService.registerModule(module2Descriptor).isSuccessful()).isTrue();
     assertThat(moduleService.registerModule(module1Descriptor).isSuccessful()).isTrue();
 
@@ -459,7 +475,7 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
 
   @Test
   public void loadServiceNoModulesLoaded() {
-    ModuleServiceResult<Map<String, Set<TestService>>> loadServiceResult =
+    ModuleServiceResult<Set<TestService>> loadServiceResult =
         moduleService.loadService(TestService.class);
     assertThat(loadServiceResult.isSuccessful()).isTrue();
     assertThat(loadServiceResult.getMessage()).isEmpty();
@@ -467,7 +483,7 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
 
   @Test
   public void loadServiceNoModulesImplementService() {
-    ModuleServiceResult<Map<String, Set<InvalidService>>> loadServiceResult =
+    ModuleServiceResult<Set<InvalidService>> loadServiceResult =
         moduleService.loadService(InvalidService.class);
     assertThat(loadServiceResult.isSuccessful()).isTrue();
     assertThat(loadServiceResult.getMessage()).isEmpty();
@@ -483,11 +499,11 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
     assertThat(moduleService.registerModule(module1Descriptor).isSuccessful()).isTrue();
     assertThat(moduleService.loadModule(module1Descriptor).isSuccessful()).isTrue();
 
-    ModuleServiceResult<Map<String, Set<TestService>>> serviceList =
+    ModuleServiceResult<Set<TestService>> serviceList =
         moduleService.loadService(TestService.class);
     assertThat(serviceList.isSuccessful()).isTrue();
     assertThat(serviceList.getMessage().size()).isEqualTo(1);
-    assertThat(serviceList.getMessage().get(module1Descriptor.getName()).stream()
+    assertThat(serviceList.getMessage().stream()
         .map(TestService::sayHello).findFirst().orElse("Error")).isEqualTo(MODULE1_MESSAGE);
   }
 
@@ -508,15 +524,12 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
     assertThat(moduleService.loadModule(module1Descriptor).isSuccessful()).isTrue();
     assertThat(moduleService.loadModule(module2Descriptor).isSuccessful()).isTrue();
 
-    ModuleServiceResult<Map<String, Set<TestService>>> serviceList =
+    ModuleServiceResult<Set<TestService>> serviceList =
         moduleService.loadService(TestService.class);
     assertThat(serviceList.isSuccessful()).isTrue();
     assertThat(serviceList.getMessage().size()).isEqualTo(2);
-    Collection<Set<TestService>> values = serviceList.getMessage().values();
-    List<String> results = new ArrayList<>();
-    for (Set<TestService> services : values) {
-      results.addAll(services.stream().map(TestService::sayHello).collect(Collectors.toList()));
-    }
+    List<String> results =
+        serviceList.getMessage().stream().map(TestService::sayHello).collect(Collectors.toList());
     assertThat(results).contains(MODULE1_MESSAGE, MODULE2_MESSAGE);
   }
 
@@ -530,18 +543,13 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
     assertThat(moduleService.registerModule(moduleDescriptor).isSuccessful()).isTrue();
     assertThat(moduleService.loadModule(moduleDescriptor).isSuccessful()).isTrue();
 
-    ModuleServiceResult<Map<String, Set<TestService>>> serviceList =
+    ModuleServiceResult<Set<TestService>> serviceList =
         moduleService.loadService(TestService.class);
     assertThat(serviceList.isSuccessful()).isTrue();
-    assertThat(serviceList.getMessage().size()).isEqualTo(1);
-    assertThat(serviceList.getMessage().get(moduleDescriptor.getName()).size())
-        .isEqualTo(2);
-
-    Collection<Set<TestService>> values = serviceList.getMessage().values();
-    List<String> results = new ArrayList<>();
-    for (Set<TestService> services : values) {
-      results.addAll(services.stream().map(TestService::sayHello).collect(Collectors.toList()));
-    }
+    assertThat(serviceList.getMessage().size()).isEqualTo(2);
+
+    List<String> results =
+        serviceList.getMessage().stream().map(TestService::sayHello).collect(Collectors.toList());
     assertThat(results).contains(MODULE1_MESSAGE, MODULE2_MESSAGE);
   }
 
@@ -564,20 +572,13 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
     assertThat(moduleService.loadModule(module2Descriptor).isSuccessful()).isTrue();
     assertThat(moduleService.loadModule(module1Descriptor).isSuccessful()).isTrue();
 
-    ModuleServiceResult<Map<String, Set<TestService>>> serviceList =
+    ModuleServiceResult<Set<TestService>> serviceList =
         moduleService.loadService(TestService.class);
     assertThat(serviceList.isSuccessful()).isTrue();
     assertThat(serviceList.getMessage().size()).isEqualTo(2);
-    assertThat(serviceList.getMessage().get(module1Descriptor.getName()).size())
-        .isEqualTo(1);
-    assertThat(serviceList.getMessage().get(module2Descriptor.getName()).size())
-        .isEqualTo(1);
 
-    Collection<Set<TestService>> values = serviceList.getMessage().values();
-    List<String> results = new ArrayList<>();
-    for (Set<TestService> services : values) {
-      results.addAll(services.stream().map(TestService::sayHello).collect(Collectors.toList()));
-    }
+    List<String> results =
+        serviceList.getMessage().stream().map(TestService::sayHello).collect(Collectors.toList());
     assertThat(results).contains(MODULE1_MESSAGE, MODULE2_MESSAGE);
   }
 
@@ -592,11 +593,11 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
 
     assertThat(moduleService.loadModule(module1Descriptor).isSuccessful()).isTrue();
 
-    ModuleServiceResult<Map<String, Set<TestService>>> serviceList =
+    ModuleServiceResult<Set<TestService>> serviceList =
         moduleService.loadService(TestService.class);
     assertThat(serviceList.isSuccessful()).isTrue();
     assertThat(serviceList.getMessage().size()).isEqualTo(1);
-    assertThat(serviceList.getMessage().get(module1Descriptor.getName()).stream()
+    assertThat(serviceList.getMessage().stream()
         .map(TestService::sayHello).findFirst().orElse("Error")).isEqualTo(MODULE1_MESSAGE);
   }
 
@@ -610,7 +611,7 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
     assertThat(moduleService.registerModule(module1Descriptor).isSuccessful()).isTrue();
     assertThat(moduleService.loadModule(module1Descriptor).isSuccessful()).isTrue();
 
-    ModuleServiceResult<Map<String, Set<TestService>>> loadServiceResult =
+    ModuleServiceResult<Set<TestService>> loadServiceResult =
         moduleService.loadService(TestService.class);
     assertThat(loadServiceResult.isSuccessful()).isTrue();
     assertThat(loadServiceResult.getMessage().size()).isEqualTo(1);
@@ -633,10 +634,10 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
     assertThat(moduleService.registerModule(moduleDescriptor).isSuccessful()).isTrue();
     assertThat(moduleService.loadModule(moduleDescriptor).isSuccessful()).isTrue();
 
-    ModuleServiceResult<Map<String, Set<TestService>>> loadServiceResult =
+    ModuleServiceResult<Set<TestService>> loadServiceResult =
         moduleService.loadService(TestService.class);
     assertThat(loadServiceResult.isSuccessful()).isTrue();
-    assertThat(loadServiceResult.getMessage().size()).isEqualTo(1);
+    assertThat(loadServiceResult.getMessage().size()).isEqualTo(2);
 
     assertThat(moduleService.unloadModule(moduleDescriptor.getName()).isSuccessful())
         .isTrue();
@@ -663,14 +664,10 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
     assertThat(moduleService.loadModule(module1Descriptor).isSuccessful()).isTrue();
     assertThat(moduleService.loadModule(module2Descriptor).isSuccessful()).isTrue();
 
-    ModuleServiceResult<Map<String, Set<TestService>>> loadServiceResult =
+    ModuleServiceResult<Set<TestService>> loadServiceResult =
         moduleService.loadService(TestService.class);
     assertThat(loadServiceResult.isSuccessful()).isTrue();
     assertThat(loadServiceResult.getMessage().size()).isEqualTo(2);
-    assertThat(loadServiceResult.getMessage().get(module1Descriptor.getName()).size())
-        .isEqualTo(1);
-    assertThat(loadServiceResult.getMessage().get(module2Descriptor.getName()).size())
-        .isEqualTo(1);
 
     assertThat(moduleService.unloadModule(module1Descriptor.getName()).isSuccessful())
         .isTrue();
@@ -680,8 +677,6 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
     loadServiceResult = moduleService.loadService(TestService.class);
     assertThat(loadServiceResult.isSuccessful()).isTrue();
     assertThat(loadServiceResult.getMessage().size()).isEqualTo(1);
-    assertThat(loadServiceResult.getMessage().get(module2Descriptor.getName()).size())
-        .isEqualTo(1);
   }
 
   @Test
@@ -700,12 +695,10 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
 
     assertThat(moduleService.loadModule(module1Descriptor).isSuccessful()).isTrue();
 
-    ModuleServiceResult<Map<String, Set<TestService>>> loadServiceResult =
+    ModuleServiceResult<Set<TestService>> loadServiceResult =
         moduleService.loadService(TestService.class);
     assertThat(loadServiceResult.isSuccessful()).isTrue();
     assertThat(loadServiceResult.getMessage().size()).isEqualTo(1);
-    assertThat(loadServiceResult.getMessage().get(module1Descriptor.getName()).size())
-        .isEqualTo(1);
 
     assertThat(moduleService.unloadModule(module1Descriptor.getName()).isSuccessful())
         .isTrue();
@@ -719,8 +712,7 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
     loadServiceResult = moduleService.loadService(TestService.class);
     assertThat(loadServiceResult.isSuccessful()).isTrue();
     assertThat(loadServiceResult.getMessage().size()).isEqualTo(1);
-    assertThat(loadServiceResult.getMessage().get(module1Descriptor.getName()).size())
-        .isEqualTo(1);
+    assertThat(loadServiceResult.getMessage().size()).isEqualTo(1);
   }
 
   @Test
@@ -742,14 +734,10 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
     assertThat(moduleService.loadModule(module1Descriptor).isSuccessful()).isTrue();
     assertThat(moduleService.loadModule(module2Descriptor).isSuccessful()).isTrue();
 
-    ModuleServiceResult<Map<String, Set<TestService>>> loadServiceResult =
+    ModuleServiceResult<Set<TestService>> loadServiceResult =
         moduleService.loadService(TestService.class);
     assertThat(loadServiceResult.isSuccessful()).isTrue();
     assertThat(loadServiceResult.getMessage().size()).isEqualTo(2);
-    assertThat(loadServiceResult.getMessage().get(module1Descriptor.getName()).size())
-        .isEqualTo(1);
-    assertThat(loadServiceResult.getMessage().get(module2Descriptor.getName()).size())
-        .isEqualTo(1);
 
     assertThat(moduleService.unloadModule(module2Descriptor.getName()).isSuccessful())
         .isTrue();
@@ -759,7 +747,7 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
     loadServiceResult = moduleService.loadService(TestService.class);
     assertThat(loadServiceResult.isSuccessful()).isTrue();
     assertThat(loadServiceResult.getMessage().size()).isEqualTo(1);
-    assertThat(loadServiceResult.getMessage().get(module1Descriptor.getName()).size())
+    assertThat(loadServiceResult.getMessage().size())
         .isEqualTo(1);
   }
 
@@ -802,17 +790,12 @@ public class JBossModuleServiceImplWithoutPopulatedManifestFileTest {
     loadClassAndAssert("org.apache.geode.ModuleService2", module2Descriptor);
     loadClassAndAssert("org.apache.geode.ModuleService3", module2Descriptor);
 
-    ModuleServiceResult<Map<String, Set<TestService>>> loadServiceResult =
+    ModuleServiceResult<Set<TestService>> loadServiceResult =
         moduleService.loadService(TestService.class);
     assertThat(loadServiceResult.isSuccessful()).isTrue();
-    assertThat(loadServiceResult.getMessage().size()).isEqualTo(1);
-    assertThat(loadServiceResult.getMessage().keySet().toArray()[0])
-        .isEqualTo(module2Descriptor.getName());
 
-    Set<TestService> testServices =
-        loadServiceResult.getMessage().get(module2Descriptor.getName());
-    assertThat(testServices.size()).isEqualTo(2);
-    assertThat(testServices.stream().map(service -> service.getClass().getName()))
+    assertThat(loadServiceResult.getMessage().size()).isEqualTo(2);
+    assertThat(loadServiceResult.getMessage().stream().map(service -> service.getClass().getName()))
         .containsExactlyInAnyOrder("org.apache.geode.ModuleService2",
             "org.apache.geode.ModuleService3");
   }
diff --git a/geode-modules/src/test/java/org/apache/geode/services/module/impl/JBossModulesServiceImplWithPopulatedManifestFileTest.java b/geode-modules/src/test/java/org/apache/geode/services/module/impl/JBossModulesServiceImplWithPopulatedManifestFileTest.java
index 8e5d43d..36ff3ed 100644
--- a/geode-modules/src/test/java/org/apache/geode/services/module/impl/JBossModulesServiceImplWithPopulatedManifestFileTest.java
+++ b/geode-modules/src/test/java/org/apache/geode/services/module/impl/JBossModulesServiceImplWithPopulatedManifestFileTest.java
@@ -18,10 +18,9 @@ package org.apache.geode.services.module.impl;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.util.Arrays;
-import java.util.Map;
+import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import org.apache.logging.log4j.LogManager;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -33,7 +32,7 @@ import org.apache.geode.services.result.impl.Failure;
 
 public class JBossModulesServiceImplWithPopulatedManifestFileTest {
 
-  private static String gemFireVersion = GemFireVersion.getGemFireVersion();
+  private static final String gemFireVersion = GemFireVersion.getGemFireVersion();
 
   private static final String MODULE1_PATH =
       System.getProperty("user.dir") + "/../libs/module1WithManifest-1.0.jar";
@@ -56,7 +55,7 @@ public class JBossModulesServiceImplWithPopulatedManifestFileTest {
 
   @Before
   public void setup() {
-    moduleService = new JBossModuleServiceImpl(LogManager.getLogger());
+    moduleService = new JBossModuleServiceImpl();
     geodeCommonsServiceDescriptor =
         new ModuleDescriptor.Builder("geode-common-services", gemFireVersion)
             .fromResourcePaths(GEODE_COMMONS_SERVICES_PATH)
@@ -86,14 +85,13 @@ public class JBossModulesServiceImplWithPopulatedManifestFileTest {
     loadModuleAndAssert(module1Descriptor);
     loadModuleAndAssert(module2Descriptor);
 
-    ModuleServiceResult<Map<String, Class<?>>> loadClassResult =
+    ModuleServiceResult<List<Class<?>>> loadClassResult =
         moduleService.loadClass("com.google.common.base.Strings");
 
     assertThat(loadClassResult.isSuccessful()).isTrue();
 
-    Map<String, Class<?>> message = loadClassResult.getMessage();
+    List<Class<?>> message = loadClassResult.getMessage();
     assertThat(message.size()).isEqualTo(1);
-    assertThat(message.keySet().toArray()[0]).isEqualTo(module1Descriptor.getName());
   }
 
   private void loadModuleAndAssert(ModuleDescriptor descriptor) {
@@ -113,7 +111,7 @@ public class JBossModulesServiceImplWithPopulatedManifestFileTest {
     assertThat(moduleService.registerModule(module1Descriptor).isSuccessful()).isTrue();
     loadModuleAndAssert(module1Descriptor);
 
-    ModuleServiceResult<Map<String, Class<?>>> loadClassResult =
+    ModuleServiceResult<List<Class<?>>> loadClassResult =
         moduleService.loadClass(".ocm.this.should.not.Exist");
     assertThat(loadClassResult.isSuccessful()).isTrue();
     assertThat(loadClassResult.getMessage().size()).isEqualTo(0);
@@ -133,15 +131,20 @@ public class JBossModulesServiceImplWithPopulatedManifestFileTest {
 
     String[] errorMessageSnippet =
         new String[] {"java.io.FileNotFoundException:", "java.nio.file.NoSuchFileException:"};
-    assertMessageContains(loadModuleResult.getErrorMessage(), errorMessageSnippet);
+    assertMessageContainsAny(loadModuleResult.getErrorMessage(), errorMessageSnippet);
     assertThat(loadModuleResult.getErrorMessage())
         .contains("libs/invalidjar.jar");
   }
 
-  private void assertMessageContains(String errorMessage, String[] errorMessageSnippet) {
+  private void assertMessageContainsAny(String errorMessage, String[] errorMessageSnippet) {
     AtomicBoolean containsString = new AtomicBoolean();
     Arrays.stream(errorMessageSnippet)
-        .forEach(errorSnippet -> containsString.set(errorMessage.contains(errorMessage)));
+        .forEach(errorSnippet -> {
+          boolean contains = errorMessage.contains(errorSnippet);
+          if (contains) {
+            containsString.set(true);
+          }
+        });
     assertThat(containsString.get()).isTrue();
   }
 }
diff --git a/geode-modules/src/test/java/org/jboss/modules/GeodeJarModuleFinderTest.java b/geode-modules/src/test/java/org/jboss/modules/GeodeJarModuleFinderTest.java
index 6111a25..bd9bc42 100644
--- a/geode-modules/src/test/java/org/jboss/modules/GeodeJarModuleFinderTest.java
+++ b/geode-modules/src/test/java/org/jboss/modules/GeodeJarModuleFinderTest.java
@@ -22,7 +22,6 @@ import java.util.Arrays;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import org.apache.logging.log4j.LogManager;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -70,7 +69,7 @@ public class GeodeJarModuleFinderTest {
         new ModuleDescriptor.Builder("module1WithManifest", "1.0").fromResourcePaths(MODULE1_PATH)
             .build();
 
-    ModuleFinder moduleFinder = new GeodeJarModuleFinder(LogManager.getLogger(), moduleDescriptor);
+    ModuleFinder moduleFinder = new GeodeModuleFinder(moduleDescriptor);
     ConcreteModuleSpec moduleSpec = (ConcreteModuleSpec) moduleFinder
         .findModule(moduleDescriptor.getName(), Module.getSystemModuleLoader());
 
@@ -89,7 +88,7 @@ public class GeodeJarModuleFinderTest {
             .fromResourcePaths(MODULE1_PATH, MODULE2_PATH)
             .build();
 
-    ModuleFinder moduleFinder = new GeodeJarModuleFinder(LogManager.getLogger(), moduleDescriptor);
+    ModuleFinder moduleFinder = new GeodeModuleFinder(moduleDescriptor);
     ConcreteModuleSpec moduleSpec = (ConcreteModuleSpec) moduleFinder
         .findModule(moduleDescriptor.getName(), Module.getSystemModuleLoader());
 
@@ -129,7 +128,7 @@ public class GeodeJarModuleFinderTest {
             .dependsOnModules("exampleModule")
             .build();
 
-    ModuleFinder moduleFinder = new GeodeJarModuleFinder(LogManager.getLogger(), moduleDescriptor);
+    ModuleFinder moduleFinder = new GeodeModuleFinder(moduleDescriptor);
     ConcreteModuleSpec moduleSpec = (ConcreteModuleSpec) moduleFinder
         .findModule(moduleDescriptor.getName(), Module.getSystemModuleLoader());
 
@@ -149,12 +148,9 @@ public class GeodeJarModuleFinderTest {
 
     ModuleLoader moduleLoader = new TestModuleLoader(Module.getSystemModuleLoader(),
         new ModuleFinder[] {
-            new GeodeJarModuleFinder(LogManager.getLogger(),
-                moduleDescriptor),
-            new GeodeJarModuleFinder(LogManager.getLogger(),
-                geodeCommonsServiceDescriptor),
-            new GeodeJarModuleFinder(LogManager.getLogger(),
-                geodeCommonDescriptor)
+            new GeodeModuleFinder(moduleDescriptor),
+            new GeodeModuleFinder(geodeCommonsServiceDescriptor),
+            new GeodeModuleFinder(geodeCommonDescriptor)
         });
     Module module = moduleLoader.loadModule(moduleDescriptor.getName());
     assertThat(module).isNotNull();
@@ -169,9 +165,9 @@ public class GeodeJarModuleFinderTest {
 
     ModuleLoader moduleLoader = new TestModuleLoader(Module.getSystemModuleLoader(),
         new ModuleFinder[] {
-            new GeodeJarModuleFinder(LogManager.getLogger(), moduleDescriptor),
-            new GeodeJarModuleFinder(LogManager.getLogger(), geodeCommonsServiceDescriptor),
-            new GeodeJarModuleFinder(LogManager.getLogger(), geodeCommonDescriptor)
+            new GeodeModuleFinder(moduleDescriptor),
+            new GeodeModuleFinder(geodeCommonsServiceDescriptor),
+            new GeodeModuleFinder(geodeCommonDescriptor)
         });
     Module module = moduleLoader.loadModule(moduleDescriptor.getName());
     assertThat(module).isNotNull();
@@ -191,11 +187,10 @@ public class GeodeJarModuleFinderTest {
 
     ModuleLoader moduleLoader = new TestModuleLoader(Module.getSystemModuleLoader(),
         new ModuleFinder[] {
-            new GeodeJarModuleFinder(LogManager.getLogger(), geodeCommonDescriptor),
-            new GeodeJarModuleFinder(LogManager.getLogger(), geodeCommonsServiceDescriptor),
-            new GeodeJarModuleFinder(LogManager.getLogger(),
-                module1Descriptor),
-            new GeodeJarModuleFinder(LogManager.getLogger(), module2Descriptor)
+            new GeodeModuleFinder(geodeCommonDescriptor),
+            new GeodeModuleFinder(geodeCommonsServiceDescriptor),
+            new GeodeModuleFinder(module1Descriptor),
+            new GeodeModuleFinder(module2Descriptor)
         });
 
     assertThat(moduleLoader.loadModule(geodeCommonDescriptor.getName())).isNotNull();
diff --git a/geode-old-client-support/build.gradle b/geode-old-client-support/build.gradle
index 1ceb25a..99e826c 100644
--- a/geode-old-client-support/build.gradle
+++ b/geode-old-client-support/build.gradle
@@ -29,6 +29,10 @@ dependencies {
     exclude module: 'geode-core'
   }
 
+  testImplementation(project(":geode-modules"))
+  integrationTestImplementation(project(":geode-modules"))
+  acceptanceTestImplementation(project(":geode-modules"))
+  distributedTestImplementation(project(":geode-modules"))
 
   distributedTestImplementation('junit:junit')
 }
diff --git a/geode-protobuf/build.gradle b/geode-protobuf/build.gradle
index 2fac747..a9c7eed 100644
--- a/geode-protobuf/build.gradle
+++ b/geode-protobuf/build.gradle
@@ -29,6 +29,12 @@ dependencies {
   implementation(project(':geode-membership'))
   compile(project(':geode-core'))
   compile(project(':geode-protobuf-messages'))
+
+  testImplementation(project(":geode-modules"))
+  integrationTestImplementation(project(":geode-modules"))
+  acceptanceTestImplementation(project(":geode-modules"))
+  distributedTestImplementation(project(":geode-modules"))
+
   testImplementation(project(':geode-core'))
   testImplementation(project(':geode-junit')) {
     exclude module: 'geode-core'
@@ -41,7 +47,7 @@ dependencies {
     exclude module: 'geode-core'
   }
   integrationTestImplementation(project(':geode-protobuf:geode-protobuf-test'))
-  distributedTestImplementation(project(':geode-dunit')){
+  distributedTestImplementation(project(':geode-dunit')) {
     exclude module: 'geode-core'
   }
   distributedTestImplementation(project(':geode-junit')) {
diff --git a/geode-redis/build.gradle b/geode-redis/build.gradle
index 6932b29..08562a7 100644
--- a/geode-redis/build.gradle
+++ b/geode-redis/build.gradle
@@ -39,6 +39,11 @@ dependencies {
   implementation('org.apache.logging.log4j:log4j-api')
   implementation('commons-codec:commons-codec')
 
+  testImplementation(project(":geode-modules"))
+  integrationTestImplementation(project(":geode-modules"))
+  acceptanceTestImplementation(project(":geode-modules"))
+  distributedTestImplementation(project(":geode-modules"))
+
   testImplementation(project(':geode-junit'))
   testImplementation('org.mockito:mockito-core')
 
diff --git a/geode-wan/build.gradle b/geode-wan/build.gradle
index 97c6c02..0a30b22 100644
--- a/geode-wan/build.gradle
+++ b/geode-wan/build.gradle
@@ -23,7 +23,6 @@ apply from: "${project.projectDir}/../gradle/publish-java.gradle"
 dependencies {
   compile(platform(project(':boms:geode-all-bom')))
 
-
   implementation(project(':geode-logging'))
   implementation(project(':geode-membership'))
   implementation(project(':geode-serialization'))
@@ -31,7 +30,12 @@ dependencies {
   implementation(project(':geode-core'))
 
   compileOnly('org.apache.logging.log4j:log4j-api:2.13.1')
-  
+
+  testImplementation(project(":geode-modules"))
+  integrationTestImplementation(project(":geode-modules"))
+  acceptanceTestImplementation(project(":geode-modules"))
+  distributedTestImplementation(project(":geode-modules"))
+
   testImplementation(project(':geode-junit'))
   testImplementation('org.assertj:assertj-core')
   testImplementation('junit:junit')
@@ -41,7 +45,6 @@ dependencies {
   integrationTestImplementation('org.assertj:assertj-core')
   integrationTestImplementation('junit:junit')
 
-
   distributedTestImplementation(project(':geode-gfsh'))
   distributedTestImplementation(project(':geode-dunit'))
   distributedTestImplementation(project(':geode-junit'))
diff --git a/gradle.properties b/gradle.properties
index e1c01f0..752b5b3 100755
--- a/gradle.properties
+++ b/gradle.properties
@@ -79,6 +79,7 @@ org.gradle.configureondemand = false
 org.gradle.daemon = true
 org.gradle.jvmargs = -Xmx3g
 org.gradle.parallel = true
+org.gradle.workers.max = 2
 
 org.gradle.internal.http.socketTimeout=120000
 org.gradle.internal.http.connectionTimeout=120000
diff --git a/settings.gradle b/settings.gradle
index cefea67..5740f5d 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -70,6 +70,9 @@ include 'boms:geode-all-bom'
 include 'static-analysis:pmd-rules'
 include 'geode-common-services'
 include 'geode-modules'
+include 'geode-modules-proto'
+include 'geode-launcher'
+include 'geode-module-management'
 
 
 ['1.0.0-incubating',
@@ -88,11 +91,11 @@ include 'geode-modules'
  '1.10.0',
  '1.11.0',
  '1.12.0'].each {
-  include 'geode-old-versions:'.concat(it)
+    include 'geode-old-versions:'.concat(it)
 }
 
 if (GradleVersion.current() < GradleVersion.version(minimumGradleVersion)) {
-  throw new GradleException('Running with unsupported Gradle Version. Use Gradle Wrapper or with Gradle version >= ' + minimumGradleVersion)
+    throw new GradleException('Running with unsupported Gradle Version. Use Gradle Wrapper or with Gradle version >= ' + minimumGradleVersion)
 }
 
 buildCache {
@@ -100,3 +103,6 @@ buildCache {
     enabled = true
   }
 }
+include 'geode-module-bootstrapping'
+include 'geode-dep-graph'
+