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

klund pushed a commit to branch 
GEODE-7513-PersistentColocatedPartitionedRegionDistributedTest-debugging
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 4f3a001ff9a886981246d5a91c1a6a22b037337e
Author: Darrel Schneider <dschnei...@pivotal.io>
AuthorDate: Mon Feb 24 15:40:15 2020 -0800

    GEODE-7803: provide undeprecated internal region create (#4722)
    
    You can now use InternalRegionFactory to create a region configured with 
InternalRegionArguments. No need to use the deprecated AttributesFactory.
    InternalRegionFactory used to be named RegionFactoryImpl.
---
 .../geode/modules/util/CreateRegionFunction.java   |  37 +---
 .../geode/cache30/TXDistributedDUnitTest.java      |  36 +--
 ...ingGiiOplogWithMissingCreateRegressionTest.java |  23 +-
 .../GiiDiskAccessExceptionRegressionTest.java      |  28 +--
 .../LRUClearWithDiskRegionOpRegressionTest.java    |  11 +-
 .../apache/geode/internal/cache/PRTXJUnitTest.java |  14 +-
 .../apache/geode/cache/DynamicRegionFactory.java   |  50 ++---
 .../java/org/apache/geode/cache/RegionFactory.java |  20 +-
 .../org/apache/geode/cache/RegionShortcut.java     |  21 +-
 .../InternalConfigurationPersistenceService.java   |  23 +-
 .../admin/ClientHealthMonitoringRegion.java        |  18 +-
 .../geode/internal/cache/CacheFactoryStatics.java  |   2 +-
 .../geode/internal/cache/CacheServerImpl.java      |  33 +--
 .../geode/internal/cache/GemFireCacheImpl.java     |   8 +-
 .../apache/geode/internal/cache/InternalCache.java |   9 +
 .../internal/cache/InternalRegionArguments.java    |   3 +
 .../internal/cache/InternalRegionFactory.java      | 242 +++++++++++++++++++++
 .../internal/cache/PartitionedRegionHelper.java    |  22 +-
 .../geode/internal/cache/RegionFactoryImpl.java    |  74 -------
 .../internal/cache/wan/AbstractGatewaySender.java  |  24 +-
 .../wan/parallel/ParallelGatewaySenderQueue.java   | 115 +++++-----
 .../cache/wan/serial/SerialGatewaySenderQueue.java |  50 ++---
 .../internal/cache/xmlcache/CacheCreation.java     |  10 +-
 .../management/internal/FederatingManager.java     |  61 ++----
 .../geode/management/internal/LocalManager.java    |  57 ++---
 .../geode/management/internal/RestAgent.java       |  34 +--
 .../operation/RegionOperationStateStore.java       |  16 +-
 .../geode/pdx/internal/PeerTypeRegistration.java   |  25 +--
 .../internal/SerialAsyncEventQueueImplTest.java    |   6 +-
 ...mplTest.java => InternalRegionFactoryTest.java} |  46 +++-
 .../ParallelGatewaySenderQueueJUnitTest.java       |   5 +-
 .../management/internal/FederatingManagerTest.java |  46 ++--
 .../management/internal/LocalManagerTest.java      |  43 ++--
 .../operation/RegionOperationStateStoreTest.java   |   6 +-
 .../pdx/internal/PeerTypeRegistrationTest.java     |  18 +-
 .../commands/ExportLogsDistributedTestBase.java    |   2 +-
 .../experimental/driver/AuthorizationTest.java     |  20 +-
 .../ExportLogsFunctionIntegrationTest.java         |   4 +-
 .../internal/cli/functions/ExportLogsFunction.java |  25 +--
 .../PartitionedRepositoryManagerJUnitTest.java     |   5 +-
 .../org/apache/geode/redis/GeodeRedisServer.java   |  50 ++---
 41 files changed, 683 insertions(+), 659 deletions(-)

diff --git 
a/extensions/geode-modules/src/main/java/org/apache/geode/modules/util/CreateRegionFunction.java
 
b/extensions/geode-modules/src/main/java/org/apache/geode/modules/util/CreateRegionFunction.java
index 70967e4..f4ca315 100644
--- 
a/extensions/geode-modules/src/main/java/org/apache/geode/modules/util/CreateRegionFunction.java
+++ 
b/extensions/geode-modules/src/main/java/org/apache/geode/modules/util/CreateRegionFunction.java
@@ -24,23 +24,20 @@ import java.util.Collection;
 import java.util.Collections;
 
 import org.apache.geode.DataSerializable;
-import org.apache.geode.InternalGemFireError;
-import org.apache.geode.cache.Cache;
-import org.apache.geode.cache.CacheFactory;
-import org.apache.geode.cache.DataPolicy;
 import org.apache.geode.cache.Declarable;
 import org.apache.geode.cache.EvictionAction;
 import org.apache.geode.cache.EvictionAttributes;
 import org.apache.geode.cache.Region;
 import org.apache.geode.cache.RegionAttributes;
-import org.apache.geode.cache.Scope;
+import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.cache.execute.Function;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.cache.partition.PartitionRegionHelper;
 import org.apache.geode.distributed.DistributedLockService;
 import org.apache.geode.distributed.internal.locks.DistributedMemberLock;
-import org.apache.geode.internal.cache.GemFireCacheImpl;
-import org.apache.geode.internal.cache.InternalRegionArguments;
+import org.apache.geode.internal.cache.CacheFactoryStatics;
+import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.cache.PartitionedRegion;
 import org.apache.geode.internal.cache.xmlcache.CacheXmlGenerator;
 import org.apache.geode.internal.cache.xmlcache.RegionAttributesCreation;
@@ -55,11 +52,11 @@ public class CreateRegionFunction implements Function, 
Declarable, DataSerializa
   static final String REGION_CONFIGURATION_METADATA_REGION =
       "__regionConfigurationMetadata";
 
-  private final Cache cache;
+  private final InternalCache cache;
   private final Region<String, RegionConfiguration> regionConfigurationsRegion;
 
   public CreateRegionFunction() {
-    this.cache = CacheFactory.getAnyInstance();
+    this.cache = CacheFactoryStatics.getAnyInstance();
     this.regionConfigurationsRegion = 
createRegionConfigurationMetadataRegion();
   }
 
@@ -251,7 +248,6 @@ public class CreateRegionFunction implements Function, 
Declarable, DataSerializa
     PartitionRegionHelper.assignBucketsToPartitions(region);
   }
 
-  @SuppressWarnings("unchecked")
   private Region<String, RegionConfiguration> 
createRegionConfigurationMetadataRegion() {
     // a sessionFactory in hibernate could have been re-started
     // so, it is possible that this region exists already
@@ -262,22 +258,11 @@ public class CreateRegionFunction implements Function, 
Declarable, DataSerializa
       return region;
     }
 
-    GemFireCacheImpl gemFireCache = (GemFireCacheImpl) cache;
-    InternalRegionArguments ira = new 
InternalRegionArguments().setInternalRegion(true);
-    RegionAttributesCreation regionAttributesCreation = new 
RegionAttributesCreation();
-    regionAttributesCreation.setScope(Scope.DISTRIBUTED_ACK);
-    regionAttributesCreation.setDataPolicy(DataPolicy.REPLICATE);
-    regionAttributesCreation.addCacheListener(new 
RegionConfigurationCacheListener());
-
-    try {
-      return gemFireCache.createVMRegion(REGION_CONFIGURATION_METADATA_REGION,
-          regionAttributesCreation, ira);
-    } catch (IOException | ClassNotFoundException e) {
-      InternalGemFireError assErr = new InternalGemFireError("unexpected 
exception");
-      assErr.initCause(e);
-
-      throw assErr;
-    }
+    InternalRegionFactory<String, RegionConfiguration> regionFactory =
+        cache.createInternalRegionFactory(RegionShortcut.REPLICATE);
+    regionFactory.addCacheListener(new RegionConfigurationCacheListener());
+    regionFactory.setInternalRegion(true);
+    return regionFactory.create(REGION_CONFIGURATION_METADATA_REGION);
   }
 
   private void writeCacheXml() {
diff --git 
a/geode-core/src/distributedTest/java/org/apache/geode/cache30/TXDistributedDUnitTest.java
 
b/geode-core/src/distributedTest/java/org/apache/geode/cache30/TXDistributedDUnitTest.java
index afe88f1..4b1958b 100644
--- 
a/geode-core/src/distributedTest/java/org/apache/geode/cache30/TXDistributedDUnitTest.java
+++ 
b/geode-core/src/distributedTest/java/org/apache/geode/cache30/TXDistributedDUnitTest.java
@@ -33,7 +33,6 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import java.io.IOException;
 import java.io.Serializable;
 import java.util.HashSet;
 import java.util.List;
@@ -59,7 +58,6 @@ import org.apache.geode.cache.Operation;
 import org.apache.geode.cache.Region;
 import org.apache.geode.cache.RegionAttributes;
 import org.apache.geode.cache.Scope;
-import org.apache.geode.cache.TimeoutException;
 import org.apache.geode.distributed.internal.ResourceEvent;
 import org.apache.geode.distributed.internal.ResourceEventsListener;
 import org.apache.geode.distributed.internal.locks.DLockBatch;
@@ -68,7 +66,7 @@ import 
org.apache.geode.distributed.internal.membership.InternalDistributedMembe
 import 
org.apache.geode.distributed.internal.membership.api.MembershipManagerHelper;
 import org.apache.geode.internal.cache.CommitReplyException;
 import org.apache.geode.internal.cache.GemFireCacheImpl;
-import org.apache.geode.internal.cache.InternalRegionArguments;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.cache.LocalRegion;
 import org.apache.geode.internal.cache.RegionEntry;
 import org.apache.geode.internal.cache.TXManagerImpl;
@@ -1434,27 +1432,17 @@ public class TXDistributedDUnitTest extends 
JUnit4CacheTestCase {
           new CacheSerializableRunnable("Initialize regions that cause 
trouble") {
             @Override
             public void run2() {
-              GemFireCacheImpl gfc = (GemFireCacheImpl) getCache();
-              InternalRegionArguments ira =
-                  new InternalRegionArguments().setTestCallable(new 
TXTroubleMaker());
-              try {
-                getCache().createDiskStoreFactory().setDiskDirs(getDiskDirs())
-                    .create(diskStoreName);
-                TXManagerImpl.ALLOW_PERSISTENT_TRANSACTIONS = true;
-                AttributesFactory af = new AttributesFactory();
-                af.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE);
-                af.setScope(Scope.DISTRIBUTED_ACK);
-                af.setDiskStoreName(diskStoreName);
-                gfc.createVMRegion(rgnName1, af.create(), ira);
-                gfc.createVMRegion(rgnName2, af.create(), ira);
-                gfc.getInternalDistributedSystem().addResourceListener(new 
ShutdownListener());
-              } catch (IOException ioe) {
-                fail(ioe.toString());
-              } catch (TimeoutException e) {
-                fail(e.toString());
-              } catch (ClassNotFoundException e) {
-                fail(e.toString());
-              }
+              getCache().createDiskStoreFactory().setDiskDirs(getDiskDirs())
+                  .create(diskStoreName);
+              TXManagerImpl.ALLOW_PERSISTENT_TRANSACTIONS = true;
+              InternalRegionFactory factory = 
getCache().createInternalRegionFactory();
+              factory.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE);
+              factory.setScope(Scope.DISTRIBUTED_ACK);
+              factory.setDiskStoreName(diskStoreName);
+              factory.setTestCallable(new TXTroubleMaker());
+              factory.create(rgnName1);
+              factory.create(rgnName2);
+              
getCache().getInternalDistributedSystem().addResourceListener(new 
ShutdownListener());
             }
           };
       trouble1.invoke(initTroulbeRegions);
diff --git 
a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ClearDuringGiiOplogWithMissingCreateRegressionTest.java
 
b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ClearDuringGiiOplogWithMissingCreateRegressionTest.java
index 1d70bfd..d11cf9f 100644
--- 
a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ClearDuringGiiOplogWithMissingCreateRegressionTest.java
+++ 
b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ClearDuringGiiOplogWithMissingCreateRegressionTest.java
@@ -31,6 +31,7 @@ import org.apache.geode.cache.DataPolicy;
 import org.apache.geode.cache.DiskStore;
 import org.apache.geode.cache.DiskStoreFactory;
 import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.cache.Scope;
 import 
org.apache.geode.internal.cache.entries.VersionedThinDiskRegionEntryHeapObjectKey;
 import org.apache.geode.test.dunit.VM;
@@ -140,22 +141,22 @@ public class 
ClearDuringGiiOplogWithMissingCreateRegressionTest extends CacheTes
 
     DiskStore diskStore = dsf.create(uniqueName);
 
-    AttributesFactory factory = new AttributesFactory();
-    factory.setScope(Scope.DISTRIBUTED_ACK);
-    factory.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE);
+    InternalRegionFactory factory =
+        
getCache().createInternalRegionFactory(RegionShortcut.REPLICATE_PERSISTENT);
     factory.setDiskSynchronous(false);
     factory.setDiskStoreName(diskStore.getName());
 
-    DistributedRegion distRegion = new DistributedRegion(regionName, 
factory.create(), null,
-        getCache(), new 
InternalRegionArguments().setDestroyLockFlag(true).setRecreateFlag(false)
-            .setSnapshotInputStream(null).setImageTarget(null),
-        disabledClock());
+    DistributedRegion distRegion =
+        new DistributedRegion(regionName, factory.getCreateAttributes(), null,
+            getCache(),
+            new 
InternalRegionArguments().setDestroyLockFlag(true).setRecreateFlag(false)
+                .setSnapshotInputStream(null).setImageTarget(null),
+            disabledClock());
 
     distRegion.entries.setEntryFactory(new TestableDiskRegionEntryFactory());
-
-    getCache().createVMRegion(regionName, factory.create(),
-        new 
InternalRegionArguments().setInternalMetaRegion(distRegion).setDestroyLockFlag(true)
-            .setSnapshotInputStream(null).setImageTarget(null));
+    factory.setInternalMetaRegion(distRegion).setDestroyLockFlag(true)
+        .setSnapshotInputStream(null).setImageTarget(null);
+    factory.create(regionName);
   }
 
   /**
diff --git 
a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/GiiDiskAccessExceptionRegressionTest.java
 
b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/GiiDiskAccessExceptionRegressionTest.java
index 0a011e7..d2d4512 100644
--- 
a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/GiiDiskAccessExceptionRegressionTest.java
+++ 
b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/GiiDiskAccessExceptionRegressionTest.java
@@ -110,13 +110,13 @@ public class GiiDiskAccessExceptionRegressionTest extends 
CacheTestCase {
 
     DiskStore diskStore = diskStoreFactory.create(uniqueName);
 
-    AttributesFactory factory = new AttributesFactory();
+    InternalRegionFactory factory = getCache().createInternalRegionFactory();
     factory.setScope(Scope.DISTRIBUTED_ACK);
     factory.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE);
     factory.setDiskSynchronous(false);
     factory.setDiskStoreName(diskStore.getName());
 
-    Region<Integer, Integer> region = getCache().createRegion(uniqueName, 
factory.create());
+    Region<Integer, Integer> region = factory.create(uniqueName);
 
     // Now put entries in the disk region
     for (int i = 0; i < 100; ++i) {
@@ -129,22 +129,22 @@ public class GiiDiskAccessExceptionRegressionTest extends 
CacheTestCase {
     // Now recreate the region but set the factory such that disk region entry 
object
     // used is customized by us to throw exception while writing to disk
 
-    DistributedRegion distributedRegion = new DistributedRegion(uniqueName, 
factory.create(), null,
-        getCache(), new 
InternalRegionArguments().setDestroyLockFlag(true).setRecreateFlag(false)
-            .setSnapshotInputStream(null).setImageTarget(null),
-        disabledClock());
+    DistributedRegion distributedRegion =
+        new DistributedRegion(uniqueName, factory.getCreateAttributes(), null,
+            getCache(),
+            new 
InternalRegionArguments().setDestroyLockFlag(true).setRecreateFlag(false)
+                .setSnapshotInputStream(null).setImageTarget(null),
+            disabledClock());
 
     distributedRegion.entries.setEntryFactory(new 
DiskRegionEntryThrowsFactory());
 
-    InternalRegionArguments internalRegionArguments = new 
InternalRegionArguments();
-    internalRegionArguments.setInternalMetaRegion(distributedRegion);
-    internalRegionArguments.setDestroyLockFlag(true);
-    internalRegionArguments.setSnapshotInputStream(null);
-    internalRegionArguments.setImageTarget(null);
+    factory.setInternalMetaRegion(distributedRegion);
+    factory.setDestroyLockFlag(true);
+    factory.setSnapshotInputStream(null);
+    factory.setImageTarget(null);
 
-    assertThatThrownBy(
-        () -> getCache().createVMRegion(uniqueName, factory.create(), 
internalRegionArguments))
-            .isInstanceOf(DiskAccessException.class);
+    assertThatThrownBy(() -> factory.create(uniqueName))
+        .isInstanceOf(DiskAccessException.class);
   }
 
   /**
diff --git 
a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/LRUClearWithDiskRegionOpRegressionTest.java
 
b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/LRUClearWithDiskRegionOpRegressionTest.java
index 70812c4..3a2e3de 100644
--- 
a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/LRUClearWithDiskRegionOpRegressionTest.java
+++ 
b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/LRUClearWithDiskRegionOpRegressionTest.java
@@ -26,7 +26,6 @@ import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 import org.junit.rules.TestName;
 
-import org.apache.geode.cache.AttributesFactory;
 import org.apache.geode.cache.CacheFactory;
 import org.apache.geode.cache.DataPolicy;
 import org.apache.geode.cache.DiskStoreFactory;
@@ -63,7 +62,7 @@ public class LRUClearWithDiskRegionOpRegressionTest {
 
     cache = (InternalCache) new CacheFactory().set("locators", 
"").set("mcast-port", "0").create();
 
-    AttributesFactory<Integer, Integer> factory = new AttributesFactory();
+    InternalRegionFactory<Integer, Integer> factory = 
cache.createInternalRegionFactory();
 
     DiskStoreFactory diskStoreFactory = cache.createDiskStoreFactory();
     diskStoreFactory.setDiskDirsAndSizes(new File[] {dir}, new int[] 
{Integer.MAX_VALUE});
@@ -78,7 +77,7 @@ public class LRUClearWithDiskRegionOpRegressionTest {
     factory.setEvictionAttributes(
         EvictionAttributes.createLRUEntryAttributes(1, 
EvictionAction.OVERFLOW_TO_DISK));
 
-    RegionAttributes<Integer, Integer> regionAttributes = factory.create();
+    RegionAttributes<Integer, Integer> regionAttributes = 
factory.getCreateAttributes();
 
     InternalRegionArguments args = new 
InternalRegionArguments().setDestroyLockFlag(true)
         
.setRecreateFlag(false).setSnapshotInputStream(null).setImageTarget(null);
@@ -86,9 +85,9 @@ public class LRUClearWithDiskRegionOpRegressionTest {
     DistributedRegion distributedRegion =
         new DistributedRegion(regionName, regionAttributes, null, cache, args, 
disabledClock());
 
-    region = cache.createVMRegion(regionName, regionAttributes,
-        new InternalRegionArguments().setInternalMetaRegion(distributedRegion)
-            
.setDestroyLockFlag(true).setSnapshotInputStream(null).setImageTarget(null));
+    factory.setInternalMetaRegion(distributedRegion)
+        
.setDestroyLockFlag(true).setSnapshotInputStream(null).setImageTarget(null);
+    region = factory.create(regionName);
   }
 
   @After
diff --git 
a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PRTXJUnitTest.java
 
b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PRTXJUnitTest.java
index b0bc5d9..8900ebe 100644
--- 
a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PRTXJUnitTest.java
+++ 
b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/PRTXJUnitTest.java
@@ -34,15 +34,17 @@ public class PRTXJUnitTest extends TXJUnitTest {
 
   @Override
   protected void createRegion() throws Exception {
-    AttributesFactory attributesFactory = new AttributesFactory();
+    InternalRegionFactory regionFactory = cache.createInternalRegionFactory();
     // test validation expects this behavior
-    attributesFactory.setConcurrencyChecksEnabled(false);
-    attributesFactory
+    regionFactory.setConcurrencyChecksEnabled(false);
+    regionFactory
         .setPartitionAttributes(new 
PartitionAttributesFactory().setTotalNumBuckets(3).create());
+    regionFactory.setDestroyLockFlag(true).setRecreateFlag(false)
+        .setSnapshotInputStream(null).setImageTarget(null);
 
-    this.region = new PRWithLocalOps(getClass().getSimpleName(), 
attributesFactory.create(), null,
-        this.cache, new 
InternalRegionArguments().setDestroyLockFlag(true).setRecreateFlag(false)
-            .setSnapshotInputStream(null).setImageTarget(null));
+    this.region =
+        new PRWithLocalOps(getClass().getSimpleName(), 
regionFactory.getCreateAttributes(), null,
+            this.cache, regionFactory.getInternalRegionArguments());
 
     ((PartitionedRegion) this.region).initialize(null, null, null);
     ((PartitionedRegion) this.region).postCreateRegion();
diff --git 
a/geode-core/src/main/java/org/apache/geode/cache/DynamicRegionFactory.java 
b/geode-core/src/main/java/org/apache/geode/cache/DynamicRegionFactory.java
index c145a37..9b00cda 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/DynamicRegionFactory.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/DynamicRegionFactory.java
@@ -15,7 +15,6 @@
 package org.apache.geode.cache;
 
 import java.io.File;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
@@ -24,7 +23,6 @@ import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
 
-import org.apache.geode.InternalGemFireError;
 import org.apache.geode.SystemFailure;
 import org.apache.geode.annotations.internal.MakeNotStatic;
 import org.apache.geode.cache.client.Pool;
@@ -44,6 +42,7 @@ import org.apache.geode.internal.cache.InitialImageOperation;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.InternalRegion;
 import org.apache.geode.internal.cache.InternalRegionArguments;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.cache.LocalRegion;
 import org.apache.geode.internal.cache.RegionEntry;
 import org.apache.geode.internal.cache.RegionEventImpl;
@@ -246,21 +245,21 @@ public abstract class DynamicRegionFactory {
       this.dynamicRegionList = theCache.getRegion(DYNAMIC_REGION_LIST_NAME);
       final boolean isClient = this.config.getPoolName() != null;
       if (this.dynamicRegionList == null) {
-        InternalRegionArguments ira = new 
InternalRegionArguments().setDestroyLockFlag(true)
-            
.setInternalRegion(true).setSnapshotInputStream(null).setImageTarget(null);
-        AttributesFactory af = new AttributesFactory();
+        InternalRegionFactory factory = cache.createInternalRegionFactory();
+        
factory.setDestroyLockFlag(true).setInternalRegion(true).setSnapshotInputStream(null)
+            .setImageTarget(null);
         if (this.config.getPersistBackup()) {
-          af.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE);
-          af.setDiskWriteAttributes(new DiskWriteAttributesFactory().create());
+          factory.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE);
+          factory.setDiskWriteAttributes(new 
DiskWriteAttributesFactory().create());
           if (this.config.getDiskDir() != null) {
-            af.setDiskDirs(new File[] {this.config.getDiskDir()});
+            factory.setDiskDirs(new File[] {this.config.getDiskDir()});
           }
         }
 
         if (isClient) {
-          af.setScope(Scope.LOCAL);
-          af.setDataPolicy(DataPolicy.NORMAL);
-          af.setStatisticsEnabled(true);
+          factory.setScope(Scope.LOCAL);
+          factory.setDataPolicy(DataPolicy.NORMAL);
+          factory.setStatisticsEnabled(true);
           String cpName = this.config.getPoolName();
           if (cpName != null) {
             Pool cp = PoolManager.find(cpName);
@@ -273,38 +272,27 @@ public abstract class DynamicRegionFactory {
                 throw new IllegalStateException(
                     "The client pool of a DynamicRegionFactory must be 
configured with queue-enabled set to true.");
               }
-              af.setPoolName(cpName);
+              factory.setPoolName(cpName);
             }
           }
-          ira.setInternalMetaRegion(new LocalMetaRegion(af.create(), ira));
+          factory.setInternalMetaRegion(new 
LocalMetaRegion(factory.getCreateAttributes(),
+              factory.getInternalRegionArguments()));
         } else {
-          af.setScope(Scope.DISTRIBUTED_ACK);
-          af.setValueConstraint(DynamicRegionAttributes.class);
+          factory.setScope(Scope.DISTRIBUTED_ACK);
+          factory.setValueConstraint(DynamicRegionAttributes.class);
 
           if (!this.config.getPersistBackup()) { // if persistBackup, the data 
policy has already
                                                  // been set
-            af.setDataPolicy(DataPolicy.REPLICATE);
+            factory.setDataPolicy(DataPolicy.REPLICATE);
           }
 
           for (GatewaySender gs : this.cache.getGatewaySenders()) {
             if (!gs.isParallel())
-              af.addGatewaySenderId(gs.getId());
+              factory.addGatewaySenderId(gs.getId());
           }
-          ira.setInternalMetaRegion(new DistributedMetaRegion(af.create())); 
// bug fix 35432
-        }
-
-        try {
-          this.dynamicRegionList =
-              theCache.createVMRegion(DYNAMIC_REGION_LIST_NAME, af.create(), 
ira);
-        } catch (IOException e) {
-          // only if loading snapshot, not here
-          throw new InternalGemFireError(
-              "unexpected exception", e);
-        } catch (ClassNotFoundException e) {
-          // only if loading snapshot, not here
-          throw new InternalGemFireError(
-              "unexpected exception", e);
+          factory.setInternalMetaRegion(new 
DistributedMetaRegion(factory.getCreateAttributes()));
         }
+        this.dynamicRegionList = factory.create(DYNAMIC_REGION_LIST_NAME);
         if (isClient) {
           this.dynamicRegionList.registerInterest("ALL_KEYS");
         }
diff --git a/geode-core/src/main/java/org/apache/geode/cache/RegionFactory.java 
b/geode-core/src/main/java/org/apache/geode/cache/RegionFactory.java
index 7f4451b..bd5562b 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/RegionFactory.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/RegionFactory.java
@@ -108,8 +108,8 @@ public class RegionFactory<K, V> {
    */
   @VisibleForTesting
   protected RegionFactory(RegionFactory<K, V> regionFactory) {
-    this.attrsFactory = new 
AttributesFactory<>(regionFactory.attrsFactory.create());
-    this.cache = regionFactory.cache;
+    this.attrsFactory = new 
AttributesFactory<>(regionFactory.getRegionAttributes());
+    this.cache = regionFactory.getCache();
   }
 
   /**
@@ -244,10 +244,10 @@ public class RegionFactory<K, V> {
   }
 
   /**
-   * Returns the Region attributes used by this Region factory.
+   * Returns the attributes used by this factory to create a region.
    */
   protected RegionAttributes<K, V> getRegionAttributes() {
-    return this.attrsFactory.create();
+    return attrsFactory.create();
   }
 
   /**
@@ -767,12 +767,10 @@ public class RegionFactory<K, V> {
    *         region in another cache in the distributed system (see {@link 
AttributesFactory} for
    *         compatibility rules)
    */
-  @SuppressWarnings("unchecked")
+  @SuppressWarnings("deprecation")
   public Region<K, V> create(String name)
       throws CacheExistsException, RegionExistsException, 
CacheWriterException, TimeoutException {
-    @SuppressWarnings("deprecation")
-    RegionAttributes<K, V> ra = this.attrsFactory.create();
-    return getCache().createRegion(name, ra);
+    return getCache().createRegion(name, getRegionAttributes());
   }
 
   /**
@@ -789,12 +787,10 @@ public class RegionFactory<K, V> {
    * @throws CacheClosedException if the cache is closed
    * @since GemFire 7.0
    */
-  @SuppressWarnings("unchecked")
+  @SuppressWarnings({"deprecation", "unchecked"})
   public Region<K, V> createSubregion(Region<?, ?> parent, String name)
       throws RegionExistsException {
-    @SuppressWarnings("deprecation")
-    RegionAttributes<K, V> ra = this.attrsFactory.create();
-    return ((InternalRegion) parent).createSubregion(name, ra);
+    return ((InternalRegion) parent).createSubregion(name, 
getRegionAttributes());
   }
 
   /**
diff --git 
a/geode-core/src/main/java/org/apache/geode/cache/RegionShortcut.java 
b/geode-core/src/main/java/org/apache/geode/cache/RegionShortcut.java
index 45254f0..1d7fe0b 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/RegionShortcut.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/RegionShortcut.java
@@ -157,30 +157,32 @@ public enum RegionShortcut {
 
   /**
    * A LOCAL region only has local state and never sends operations to others. 
The actual
-   * RegionAttributes for a LOCAL region set the {@code DataPolicy} to {@code 
DataPolicy.NORMAL}.
+   * RegionAttributes for a LOCAL region set the {@code Scope} to {@code 
Scope.LOCAL}
+   * and the {@code DataPolicy} to {@code DataPolicy.NORMAL}.
    */
   LOCAL,
   /**
    * A LOCAL_PERSISTENT region only has local state and never sends operations 
to others but it does
    * write its state to disk and can recover that state when the region is 
created. The actual
-   * RegionAttributes for a LOCAL_PERSISTENT region set the {@code DataPolicy} 
to
-   * {@code DataPolicy.PERSISTENT_REPLICATE}.
+   * RegionAttributes for a LOCAL_PERSISTENT region set the {@code Scope} to 
{@code Scope.LOCAL}
+   * and the {@code DataPolicy} to {@code DataPolicy.PERSISTENT_REPLICATE}.
    */
   LOCAL_PERSISTENT,
 
   /**
    * A LOCAL_HEAP_LRU region only has local state and never sends operations 
to others. It will also
    * destroy entries once it detects that the java vm is running low of 
memory. The actual
-   * RegionAttributes for a LOCAL_HEAP_LRU region set the {@code DataPolicy} to
-   * {@code DataPolicy.NORMAL} and {@code EvictionAttributes} are set to
+   * RegionAttributes for a LOCAL_HEAP_LRU region set the the {@code Scope} to 
{@code Scope.LOCAL},
+   * the {@code DataPolicy} to {@code DataPolicy.NORMAL}, and {@code 
EvictionAttributes} are set to
    * {@code EvictionAlgorithm.LRU_HEAP} with {@code 
EvictionAction.LOCAL_DESTROY}.
    */
   LOCAL_HEAP_LRU,
   /**
    * A LOCAL_OVERFLOW region only has local state and never sends operations 
to others. It will also
    * move the values of entries to disk once it detects that the java vm is 
running low of memory.
-   * The actual RegionAttributes for a LOCAL_OVERFLOW region set the {@code 
DataPolicy} to
-   * {@code DataPolicy.NORMAL} and {@code EvictionAttributes} are set to
+   * The actual RegionAttributes for a LOCAL_OVERFLOW region set
+   * the {@code Scope} to {@code Scope.LOCAL},
+   * the {@code DataPolicy} to {@code DataPolicy.NORMAL}, and {@code 
EvictionAttributes} are set to
    * {@code EvictionAlgorithm.LRU_HEAP} with {@code 
EvictionAction.OVERFLOW_TO_DISK}.
    */
   LOCAL_OVERFLOW,
@@ -188,8 +190,9 @@ public enum RegionShortcut {
    * A LOCAL_PERSISTENT_OVERFLOW region only has local state and never sends 
operations to others
    * but it does write its state to disk and can recover that state when the 
region is created. It
    * will also remove the values of entries from memory once it detects that 
the java vm is running
-   * low of memory. The actual RegionAttributes for a 
LOCAL_PERSISTENT_OVERFLOW region set the
-   * {@code DataPolicy} to {@code DataPolicy.PERSISTENT_REPLICATE} and {@code 
EvictionAttributes}
+   * low of memory. The actual RegionAttributes for a 
LOCAL_PERSISTENT_OVERFLOW region set
+   * the {@code Scope} to {@code Scope.LOCAL}, the
+   * {@code DataPolicy} to {@code DataPolicy.PERSISTENT_REPLICATE}, and {@code 
EvictionAttributes}
    * are set to {@code EvictionAlgorithm.LRU_HEAP} with {@code 
EvictionAction.OVERFLOW_TO_DISK}.
    */
   LOCAL_PERSISTENT_OVERFLOW,
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalConfigurationPersistenceService.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalConfigurationPersistenceService.java
index a6d4e23..f838e0a 100644
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalConfigurationPersistenceService.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalConfigurationPersistenceService.java
@@ -59,11 +59,9 @@ import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
 
 import org.apache.geode.annotations.VisibleForTesting;
-import org.apache.geode.cache.AttributesFactory;
-import org.apache.geode.cache.DataPolicy;
 import org.apache.geode.cache.DiskStore;
 import org.apache.geode.cache.Region;
-import org.apache.geode.cache.Scope;
+import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.cache.configuration.CacheConfig;
 import org.apache.geode.distributed.ConfigurationPersistenceService;
 import org.apache.geode.distributed.DistributedLockService;
@@ -73,7 +71,7 @@ import 
org.apache.geode.distributed.internal.locks.DLockService;
 import org.apache.geode.internal.JarDeployer;
 import org.apache.geode.internal.cache.ClusterConfigurationLoader;
 import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.internal.cache.InternalRegionArguments;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.cache.persistence.PersistentMemberID;
 import org.apache.geode.internal.cache.persistence.PersistentMemberManager;
 import org.apache.geode.internal.cache.persistence.PersistentMemberPattern;
@@ -806,17 +804,12 @@ public class InternalConfigurationPersistenceService 
implements ConfigurationPer
       cache.createDiskStoreFactory().setDiskDirs(diskDirs).setAutoCompact(true)
           .setMaxOplogSize(10).create(CLUSTER_CONFIG_DISK_STORE_NAME);
 
-      AttributesFactory<String, Configuration> regionAttrsFactory = new 
AttributesFactory<>();
-      regionAttrsFactory.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE);
-      regionAttrsFactory.setCacheListener(new 
ConfigurationChangeListener(this, cache));
-      regionAttrsFactory.setDiskStoreName(CLUSTER_CONFIG_DISK_STORE_NAME);
-      regionAttrsFactory.setScope(Scope.DISTRIBUTED_ACK);
-      InternalRegionArguments internalArgs = new InternalRegionArguments();
-      internalArgs.setIsUsedForMetaRegion(true);
-      internalArgs.setMetaRegionWithTransactions(false);
-
-      return cache.createVMRegion(CONFIG_REGION_NAME, 
regionAttrsFactory.create(),
-          internalArgs);
+      InternalRegionFactory<String, Configuration> regionFactory =
+          
cache.createInternalRegionFactory(RegionShortcut.REPLICATE_PERSISTENT);
+      regionFactory.addCacheListener(new ConfigurationChangeListener(this, 
cache));
+      regionFactory.setDiskStoreName(CLUSTER_CONFIG_DISK_STORE_NAME);
+      
regionFactory.setIsUsedForMetaRegion(true).setMetaRegionWithTransactions(false);
+      return regionFactory.create(CONFIG_REGION_NAME);
     } catch (RuntimeException e) {
       status.set(SharedConfigurationStatus.STOPPED);
       // throw RuntimeException as is
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/admin/ClientHealthMonitoringRegion.java
 
b/geode-core/src/main/java/org/apache/geode/internal/admin/ClientHealthMonitoringRegion.java
index c9a53bd..e463bc8 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/admin/ClientHealthMonitoringRegion.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/admin/ClientHealthMonitoringRegion.java
@@ -17,17 +17,15 @@ package org.apache.geode.internal.admin;
 import org.apache.logging.log4j.Logger;
 
 import org.apache.geode.annotations.internal.MakeNotStatic;
-import org.apache.geode.cache.AttributesFactory;
 import org.apache.geode.cache.CacheListener;
 import org.apache.geode.cache.ExpirationAction;
 import org.apache.geode.cache.ExpirationAttributes;
 import org.apache.geode.cache.Region;
-import org.apache.geode.cache.RegionAttributes;
-import org.apache.geode.cache.Scope;
+import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.cache.util.CacheListenerAdapter;
 import org.apache.geode.internal.admin.remote.ClientHealthStats;
 import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.internal.cache.InternalRegionArguments;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.logging.internal.log4j.api.LogService;
 
 /**
@@ -76,8 +74,7 @@ public class ClientHealthMonitoringRegion {
    */
   private static void initialize(InternalCache cache) {
     try {
-      AttributesFactory factory = new AttributesFactory();
-      factory.setScope(Scope.LOCAL);
+      InternalRegionFactory factory = 
cache.createInternalRegionFactory(RegionShortcut.LOCAL);
       factory.setEntryTimeToLive(
           new ExpirationAttributes(ADMIN_REGION_EXPIRY_INTERVAL, 
ExpirationAction.DESTROY));
       if (logger.isDebugEnabled()) {
@@ -86,13 +83,8 @@ public class ClientHealthMonitoringRegion {
       factory.addCacheListener(prepareCacheListener());
       factory.setValueConstraint(ClientHealthStats.class);
       factory.setStatisticsEnabled(true);
-      RegionAttributes regionAttrs = factory.create();
-
-      InternalRegionArguments internalArgs = new InternalRegionArguments();
-      internalArgs.setIsUsedForMetaRegion(true);
-      internalArgs.setIsUsedForPartitionedRegionAdmin(false);
-
-      currentInstance = cache.createVMRegion(ADMIN_REGION_NAME, regionAttrs, 
internalArgs);
+      
factory.setIsUsedForMetaRegion(true).setIsUsedForPartitionedRegionAdmin(false);
+      currentInstance = factory.create(ADMIN_REGION_NAME);
     } catch (Exception ex) {
       logger.error("Error while creating an admin region", ex);
     }
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/CacheFactoryStatics.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/CacheFactoryStatics.java
index 9b0f989..2e70db4 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/CacheFactoryStatics.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/CacheFactoryStatics.java
@@ -80,7 +80,7 @@ public class CacheFactoryStatics {
    * @throws CacheClosedException if a cache has not been created or the only 
created one is
    *         {@link Cache#isClosed closed}
    */
-  public static Cache getAnyInstance() {
+  public static InternalCache getAnyInstance() {
     synchronized (InternalCacheBuilder.class) {
       InternalCache instance = GemFireCacheImpl.getInstance();
       if (instance == null) {
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/CacheServerImpl.java 
b/geode-core/src/main/java/org/apache/geode/internal/cache/CacheServerImpl.java
index 3e46a88..19d262e 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/CacheServerImpl.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/CacheServerImpl.java
@@ -34,7 +34,6 @@ import org.apache.geode.GemFireIOException;
 import org.apache.geode.InternalGemFireError;
 import org.apache.geode.InvalidValueException;
 import org.apache.geode.annotations.internal.MakeNotStatic;
-import org.apache.geode.cache.AttributesFactory;
 import org.apache.geode.cache.ClientSession;
 import org.apache.geode.cache.DataPolicy;
 import org.apache.geode.cache.DiskStoreFactory;
@@ -42,7 +41,6 @@ import org.apache.geode.cache.DynamicRegionFactory;
 import org.apache.geode.cache.EvictionAction;
 import org.apache.geode.cache.EvictionAttributes;
 import org.apache.geode.cache.InterestRegistrationListener;
-import org.apache.geode.cache.RegionAttributes;
 import org.apache.geode.cache.RegionExistsException;
 import org.apache.geode.cache.Scope;
 import org.apache.geode.cache.server.CacheServer;
@@ -593,17 +591,15 @@ public class CacheServerImpl extends AbstractCacheServer 
implements Distribution
    */
   public static String clientMessagesRegion(InternalCache cache, String 
ePolicy, int capacity,
       int port, String overFlowDir, boolean isDiskStore) {
-    AttributesFactory factory =
-        getAttribFactoryForClientMessagesRegion(cache, ePolicy, capacity, 
overFlowDir, isDiskStore);
-    RegionAttributes attr = factory.create();
-
-    return createClientMessagesRegion(attr, cache, capacity, port);
+    InternalRegionFactory factory =
+        getRegionFactoryForClientMessagesRegion(cache, ePolicy, capacity, 
overFlowDir, isDiskStore);
+    return createClientMessagesRegion(factory, port);
   }
 
-  public static AttributesFactory 
getAttribFactoryForClientMessagesRegion(InternalCache cache,
+  private static InternalRegionFactory 
getRegionFactoryForClientMessagesRegion(InternalCache cache,
       String ePolicy, int capacity, String overflowDir, boolean isDiskStore)
       throws InvalidValueException, GemFireIOException {
-    AttributesFactory factory = new AttributesFactory();
+    InternalRegionFactory factory = cache.createInternalRegionFactory();
     factory.setScope(Scope.LOCAL);
 
     if (isDiskStore) {
@@ -655,28 +651,17 @@ public class CacheServerImpl extends AbstractCacheServer 
implements Distribution
     return factory;
   }
 
-  private static String createClientMessagesRegion(RegionAttributes attr, 
InternalCache cache,
-      int capacity, int port) {
+  private static String createClientMessagesRegion(InternalRegionFactory 
factory, int port) {
     // generating unique name in VM for ClientMessagesRegion
     String regionName = generateNameForClientMsgsRegion(port);
     try {
-      cache.createVMRegion(regionName, attr,
-          new 
InternalRegionArguments().setDestroyLockFlag(true).setRecreateFlag(false)
-              
.setSnapshotInputStream(null).setImageTarget(null).setIsUsedForMetaRegion(true));
+      factory.setDestroyLockFlag(true).setRecreateFlag(false)
+          
.setSnapshotInputStream(null).setImageTarget(null).setIsUsedForMetaRegion(true);
+      factory.create(regionName);
     } catch (RegionExistsException ree) {
       InternalGemFireError assErr = new InternalGemFireError("unexpected 
exception");
       assErr.initCause(ree);
       throw assErr;
-    } catch (IOException e) {
-      // only if loading snapshot, not here
-      InternalGemFireError assErr = new InternalGemFireError("unexpected 
exception");
-      assErr.initCause(e);
-      throw assErr;
-    } catch (ClassNotFoundException e) {
-      // only if loading snapshot, not here
-      InternalGemFireError assErr = new InternalGemFireError("unexpected 
exception");
-      assErr.initCause(e);
-      throw assErr;
     }
     return regionName;
   }
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 88be1f8..06ceb62 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
@@ -4325,25 +4325,25 @@ public class GemFireCacheImpl implements InternalCache, 
InternalClientCache, Has
   @Override
   public <K, V> RegionFactory<K, V> createRegionFactory(RegionShortcut 
shortcut) {
     throwIfClient();
-    return new RegionFactoryImpl<>(this, shortcut);
+    return new InternalRegionFactory<>(this, shortcut);
   }
 
   @Override
   public <K, V> RegionFactory<K, V> createRegionFactory() {
     throwIfClient();
-    return new RegionFactoryImpl<>(this);
+    return new InternalRegionFactory<>(this);
   }
 
   @Override
   public <K, V> RegionFactory<K, V> createRegionFactory(String 
regionAttributesId) {
     throwIfClient();
-    return new RegionFactoryImpl<>(this, regionAttributesId);
+    return new InternalRegionFactory<>(this, regionAttributesId);
   }
 
   @Override
   public <K, V> RegionFactory<K, V> createRegionFactory(RegionAttributes<K, V> 
regionAttributes) {
     throwIfClient();
-    return new RegionFactoryImpl<>(this, regionAttributes);
+    return new InternalRegionFactory<>(this, regionAttributes);
   }
 
   /**
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/InternalCache.java 
b/geode-core/src/main/java/org/apache/geode/internal/cache/InternalCache.java
index 4d42272..ca7d632 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/InternalCache.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/InternalCache.java
@@ -37,6 +37,7 @@ import org.apache.geode.cache.DiskStoreFactory;
 import org.apache.geode.cache.Region;
 import org.apache.geode.cache.RegionAttributes;
 import org.apache.geode.cache.RegionExistsException;
+import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.cache.TimeoutException;
 import org.apache.geode.cache.asyncqueue.AsyncEventQueue;
 import org.apache.geode.cache.asyncqueue.internal.AsyncEventQueueImpl;
@@ -572,4 +573,12 @@ public interface InternalCache extends Cache, 
Extensible<Cache>, CacheTime, Inte
   void saveCacheXmlForReconnect();
 
   InternalQueryService getInternalQueryService();
+
+  default <K, V> InternalRegionFactory<K, V> createInternalRegionFactory() {
+    return (InternalRegionFactory) createRegionFactory();
+  }
+
+  default <K, V> InternalRegionFactory<K, V> 
createInternalRegionFactory(RegionShortcut shortcut) {
+    return (InternalRegionFactory) createRegionFactory(shortcut);
+  }
 }
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/InternalRegionArguments.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/InternalRegionArguments.java
index 966e16f..d4431e1 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/InternalRegionArguments.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/InternalRegionArguments.java
@@ -69,6 +69,9 @@ public class InternalRegionArguments {
 
   private Set<String> internalAsyncEventQueueIds;
 
+
+  public InternalRegionArguments() {}
+
   /* methods that set and retrieve internal state used to configure a Region */
 
   public InternalRegionArguments setIsUsedForPartitionedRegionAdmin(boolean 
adminFlag) {
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/InternalRegionFactory.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/InternalRegionFactory.java
new file mode 100644
index 0000000..efbf73b
--- /dev/null
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/InternalRegionFactory.java
@@ -0,0 +1,242 @@
+/*
+ * 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.internal.cache;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+
+import org.apache.geode.InternalGemFireError;
+import org.apache.geode.cache.CacheExistsException;
+import org.apache.geode.cache.CacheWriterException;
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionAttributes;
+import org.apache.geode.cache.RegionExistsException;
+import org.apache.geode.cache.RegionFactory;
+import org.apache.geode.cache.RegionShortcut;
+import org.apache.geode.cache.TimeoutException;
+import 
org.apache.geode.distributed.internal.membership.InternalDistributedMember;
+import org.apache.geode.internal.cache.partitioned.RegionAdvisor;
+import org.apache.geode.internal.cache.persistence.PersistenceAdvisor;
+import org.apache.geode.internal.cache.wan.AbstractGatewaySender;
+
+/**
+ * {@code InternalRegionFactory} extends RegionFactory adding {@link 
RegionShortcut} support.
+ * It also supports setting {@link InternalRegionArguments}.
+ *
+ * @since GemFire 6.5
+ */
+public class InternalRegionFactory<K, V> extends RegionFactory<K, V> {
+  private InternalRegionArguments internalRegionArguments;
+
+  public InternalRegionFactory(InternalCache cache) {
+    super(cache);
+  }
+
+  public InternalRegionFactory(InternalCache cache, RegionShortcut pra) {
+    super(cache, pra);
+  }
+
+  public InternalRegionFactory(InternalCache cache, RegionAttributes<K, V> ra) 
{
+    super(cache, ra);
+  }
+
+  public InternalRegionFactory(InternalCache cache, String regionAttributesId) 
{
+    super(cache, regionAttributesId);
+  }
+
+  public InternalRegionFactory(RegionFactory<K, V> regionFactory) {
+    super(regionFactory);
+  }
+
+  /**
+   * Returns the region attributes that would currently be used to create the 
region.
+   */
+  public RegionAttributes<K, V> getCreateAttributes() {
+    return getRegionAttributes();
+  }
+
+  @Override
+  public Region<K, V> create(String name)
+      throws CacheExistsException, RegionExistsException, 
CacheWriterException, TimeoutException {
+    if (internalRegionArguments == null) {
+      return super.create(name);
+    }
+    try {
+      return getCache().createVMRegion(name, getRegionAttributes(), 
internalRegionArguments);
+    } catch (IOException | ClassNotFoundException e) {
+      throw new InternalGemFireError("unexpected exception", e);
+    }
+  }
+
+  @Override
+  @SuppressWarnings("unchecked")
+  public Region<K, V> createSubregion(Region<?, ?> parent, String name)
+      throws RegionExistsException {
+    if (internalRegionArguments == null) {
+      return super.createSubregion(parent, name);
+    }
+    try {
+      return ((InternalRegion) parent).createSubregion(name, 
getRegionAttributes(),
+          internalRegionArguments);
+    } catch (IOException | ClassNotFoundException e) {
+      throw new InternalGemFireError("unexpected exception", e);
+    }
+  }
+
+  public InternalRegionArguments getInternalRegionArguments() {
+    return internalRegionArguments;
+  }
+
+  public InternalRegionFactory<K, V> 
setIsUsedForPartitionedRegionAdmin(boolean adminFlag) {
+    makeInternal().setIsUsedForPartitionedRegionAdmin(adminFlag);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setPartitionedRegionBucketRedundancy(int 
redundancy) {
+    makeInternal().setPartitionedRegionBucketRedundancy(redundancy);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setPartitionedRegionAdvisor(RegionAdvisor 
advisor) {
+    makeInternal().setPartitionedRegionAdvisor(advisor);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setBucketAdvisor(BucketAdvisor advisor) {
+    makeInternal().setBucketAdvisor(advisor);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setPersistenceAdvisor(PersistenceAdvisor 
persistenceAdvisor) {
+    makeInternal().setPersistenceAdvisor(persistenceAdvisor);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setDiskRegion(DiskRegion diskRegion) {
+    makeInternal().setDiskRegion(diskRegion);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setIsUsedForMetaRegion(boolean 
isMetaRegion) {
+    makeInternal().setIsUsedForMetaRegion(isMetaRegion);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setMetaRegionWithTransactions(
+      boolean metaRegionWithTransactions) {
+    makeInternal().setMetaRegionWithTransactions(metaRegionWithTransactions);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setLoaderHelperFactory(
+      LoaderHelperFactory loaderHelperFactory) {
+    makeInternal().setLoaderHelperFactory(loaderHelperFactory);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setDestroyLockFlag(boolean 
getDestoryLock) {
+    makeInternal().setDestroyLockFlag(getDestoryLock);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setSnapshotInputStream(InputStream 
snapshotInputStream) {
+    makeInternal().setSnapshotInputStream(snapshotInputStream);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setImageTarget(InternalDistributedMember 
imageTarget) {
+    makeInternal().setImageTarget(imageTarget);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setRecreateFlag(boolean recreate) {
+    makeInternal().setRecreateFlag(recreate);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setInternalMetaRegion(LocalRegion r) {
+    makeInternal().setInternalMetaRegion(r);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setCachePerfStatsHolder(
+      HasCachePerfStats cachePerfStatsHolder) {
+    makeInternal().setCachePerfStatsHolder(cachePerfStatsHolder);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setPartitionedRegion(PartitionedRegion 
partitionedRegion) {
+    makeInternal().setPartitionedRegion(partitionedRegion);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setTestCallable(LocalRegion.TestCallable 
c) {
+    makeInternal().setTestCallable(c);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setUserAttribute(Object userAttr) {
+    makeInternal().setUserAttribute(userAttr);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> 
setIsUsedForSerialGatewaySenderQueue(boolean queueFlag) {
+    makeInternal().setIsUsedForSerialGatewaySenderQueue(queueFlag);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> 
setIsUsedForParallelGatewaySenderQueue(boolean queueFlag) {
+    makeInternal().setIsUsedForParallelGatewaySenderQueue(queueFlag);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> 
setParallelGatewaySender(AbstractGatewaySender pgSender) {
+    makeInternal().setParallelGatewaySender(pgSender);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> 
setSerialGatewaySender(AbstractGatewaySender serialSender) {
+    makeInternal().setSerialGatewaySender(serialSender);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setIndexes(List indexes) {
+    makeInternal().setIndexes(indexes);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> 
addCacheServiceProfile(CacheServiceProfile profile) {
+    makeInternal().addCacheServiceProfile(profile);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> addInternalAsyncEventQueueId(String 
aeqId) {
+    makeInternal().addInternalAsyncEventQueueId(aeqId);
+    return this;
+  }
+
+  public InternalRegionFactory<K, V> setInternalRegion(final boolean 
internalRegion) {
+    makeInternal().setInternalRegion(internalRegion);
+    return this;
+  }
+
+  private InternalRegionArguments makeInternal() {
+    if (internalRegionArguments == null) {
+      internalRegionArguments = new InternalRegionArguments();
+    }
+    return internalRegionArguments;
+  }
+}
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionHelper.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionHelper.java
index 0b20500..1c2707c 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionHelper.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionHelper.java
@@ -16,7 +16,6 @@ package org.apache.geode.internal.cache;
 
 import static 
org.apache.geode.internal.cache.LocalRegion.InitializationLevel.ANY_INIT;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -30,7 +29,6 @@ import org.apache.logging.log4j.Logger;
 
 import org.apache.geode.CancelException;
 import org.apache.geode.annotations.Immutable;
-import org.apache.geode.cache.AttributesFactory;
 import org.apache.geode.cache.Cache;
 import org.apache.geode.cache.CacheWriterException;
 import org.apache.geode.cache.DataPolicy;
@@ -43,9 +41,8 @@ import org.apache.geode.cache.FixedPartitionResolver;
 import org.apache.geode.cache.Operation;
 import org.apache.geode.cache.PartitionResolver;
 import org.apache.geode.cache.Region;
-import org.apache.geode.cache.RegionAttributes;
 import org.apache.geode.cache.RegionExistsException;
-import org.apache.geode.cache.Scope;
+import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.cache.partition.PartitionNotAvailableException;
 import org.apache.geode.cache.util.CacheListenerAdapter;
 import org.apache.geode.cache.util.CacheWriterAdapter;
@@ -210,9 +207,7 @@ public class PartitionedRegionHelper {
         logger.debug("Creating root Partitioned Admin Region {}",
             PartitionedRegionHelper.PR_ROOT_REGION_NAME);
       }
-      AttributesFactory factory = new AttributesFactory();
-      factory.setScope(Scope.DISTRIBUTED_ACK);
-      factory.setDataPolicy(DataPolicy.REPLICATE);
+      InternalRegionFactory factory = 
cache.createInternalRegionFactory(RegionShortcut.REPLICATE);
       factory.addCacheListener(new FixedPartitionAttributesListener());
       if (Boolean.getBoolean(GeodeGlossary.GEMFIRE_PREFIX + "PRDebug")) {
         factory.addCacheListener(new CacheListenerAdapter() {
@@ -263,7 +258,6 @@ public class PartitionedRegionHelper {
         });
       }
 
-      RegionAttributes ra = factory.create();
       // Create anonymous stats holder for Partitioned Region meta data
       final HasCachePerfStats prMetaStatsHolder = new HasCachePerfStats() {
         @Override
@@ -273,18 +267,16 @@ public class PartitionedRegionHelper {
         }
       };
 
+      factory.setIsUsedForPartitionedRegionAdmin(true);
+      factory.setInternalRegion(true);
+      factory.setCachePerfStatsHolder(prMetaStatsHolder);
+
       try {
-        root = (DistributedRegion) cache.createVMRegion(PR_ROOT_REGION_NAME, 
ra,
-            new 
InternalRegionArguments().setIsUsedForPartitionedRegionAdmin(true)
-                
.setInternalRegion(true).setCachePerfStatsHolder(prMetaStatsHolder));
+        root = (DistributedRegion) factory.create(PR_ROOT_REGION_NAME);
         root.getDistributionAdvisor().addMembershipListener(new 
MemberFailureListener(cache));
       } catch (RegionExistsException ignore) {
         // we avoid this before hand, but yet we have to catch it
         root = (DistributedRegion) cache.getRegion(PR_ROOT_REGION_NAME, true);
-      } catch (IOException ieo) {
-        Assert.assertTrue(false, "IOException creating Partitioned Region 
root: " + ieo);
-      } catch (ClassNotFoundException cne) {
-        Assert.assertTrue(false, "ClassNotFoundExcpetion creating Partitioned 
Region root: " + cne);
       }
     }
     Assert.assertTrue(root != null,
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/RegionFactoryImpl.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/RegionFactoryImpl.java
deleted file mode 100644
index 1968950..0000000
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/RegionFactoryImpl.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license
- * agreements. See the NOTICE file distributed with this work for additional 
information regarding
- * copyright ownership. The ASF licenses this file to You under the Apache 
License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the 
License. You may obtain a
- * copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software 
distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
KIND, either express
- * or implied. See the License for the specific language governing permissions 
and limitations under
- * the License.
- */
-package org.apache.geode.internal.cache;
-
-import java.io.IOException;
-
-import org.apache.geode.InternalGemFireError;
-import org.apache.geode.cache.CacheExistsException;
-import org.apache.geode.cache.CacheWriterException;
-import org.apache.geode.cache.Region;
-import org.apache.geode.cache.RegionAttributes;
-import org.apache.geode.cache.RegionExistsException;
-import org.apache.geode.cache.RegionFactory;
-import org.apache.geode.cache.RegionShortcut;
-import org.apache.geode.cache.TimeoutException;
-
-/**
- * {@code RegionFactoryImpl} extends RegionFactory adding {@link 
RegionShortcut} support.
- *
- * @since GemFire 6.5
- */
-public class RegionFactoryImpl<K, V> extends RegionFactory<K, V> {
-  private InternalRegionArguments internalRegionArguments;
-
-  public RegionFactoryImpl(InternalCache cache) {
-    super(cache);
-  }
-
-  public RegionFactoryImpl(InternalCache cache, RegionShortcut pra) {
-    super(cache, pra);
-  }
-
-  public RegionFactoryImpl(InternalCache cache, RegionAttributes<K, V> ra) {
-    super(cache, ra);
-  }
-
-  public RegionFactoryImpl(InternalCache cache, String regionAttributesId) {
-    super(cache, regionAttributesId);
-  }
-
-  public RegionFactoryImpl(RegionFactory<K, V> regionFactory) {
-    super(regionFactory);
-  }
-
-  public void setInternalRegionArguments(
-      InternalRegionArguments internalRegionArguments) {
-    this.internalRegionArguments = internalRegionArguments;
-  }
-
-  @Override
-  public Region<K, V> create(String name)
-      throws CacheExistsException, RegionExistsException, 
CacheWriterException, TimeoutException {
-    if (internalRegionArguments == null) {
-      return super.create(name);
-    }
-    try {
-      return getCache().createVMRegion(name, getRegionAttributes(), 
internalRegionArguments);
-    } catch (IOException | ClassNotFoundException e) {
-      throw new InternalGemFireError("unexpected exception", e);
-    }
-  }
-}
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySender.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySender.java
index e7dd8b9..dfcc6dc 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySender.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySender.java
@@ -34,14 +34,12 @@ import org.apache.geode.InternalGemFireError;
 import org.apache.geode.annotations.Immutable;
 import org.apache.geode.annotations.VisibleForTesting;
 import org.apache.geode.annotations.internal.MutableForTesting;
-import org.apache.geode.cache.AttributesFactory;
 import org.apache.geode.cache.CacheException;
 import org.apache.geode.cache.DataPolicy;
 import org.apache.geode.cache.Region;
-import org.apache.geode.cache.RegionAttributes;
 import org.apache.geode.cache.RegionDestroyedException;
 import org.apache.geode.cache.RegionExistsException;
-import org.apache.geode.cache.Scope;
+import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.cache.asyncqueue.AsyncEventListener;
 import org.apache.geode.cache.client.internal.LocatorDiscoveryCallback;
 import org.apache.geode.cache.client.internal.PoolImpl;
@@ -64,7 +62,7 @@ import org.apache.geode.internal.cache.EnumListenerEvent;
 import org.apache.geode.internal.cache.HasCachePerfStats;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.InternalRegion;
-import org.apache.geode.internal.cache.InternalRegionArguments;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.cache.LocalRegion;
 import org.apache.geode.internal.cache.PartitionedRegion;
 import org.apache.geode.internal.cache.RegionQueue;
@@ -1294,17 +1292,13 @@ public abstract class AbstractGatewaySender implements 
InternalGatewaySender, Di
     return this.eventIdIndexMetaDataRegion;
   }
 
-  @SuppressWarnings({"rawtypes", "unchecked", "deprecation"})
   private static synchronized Region<String, Integer> 
initializeEventIdIndexMetaDataRegion(
       AbstractGatewaySender sender) {
     final InternalCache cache = sender.getCache();
     Region<String, Integer> region = cache.getRegion(META_DATA_REGION_NAME);
     if (region == null) {
-      // Create region attributes (must be done this way to use 
InternalRegionArguments)
-      AttributesFactory factory = new AttributesFactory();
-      factory.setScope(Scope.DISTRIBUTED_ACK);
-      factory.setDataPolicy(DataPolicy.REPLICATE);
-      RegionAttributes ra = factory.create();
+      InternalRegionFactory<String, Integer> factory =
+          cache.createInternalRegionFactory(RegionShortcut.REPLICATE);
 
       // Create a stats holder for the meta data stats
       final HasCachePerfStats statsHolder = new HasCachePerfStats() {
@@ -1314,14 +1308,10 @@ public abstract class AbstractGatewaySender implements 
InternalGatewaySender, Di
               "RegionStats-" + META_DATA_REGION_NAME, sender.statisticsClock);
         }
       };
-
-      // Create internal region arguments
-      InternalRegionArguments ira = new 
InternalRegionArguments().setIsUsedForMetaRegion(true)
-          .setCachePerfStatsHolder(statsHolder);
-
-      // Create the region
+      factory.setIsUsedForMetaRegion(true);
+      factory.setCachePerfStatsHolder(statsHolder);
       try {
-        region = cache.createVMRegion(META_DATA_REGION_NAME, ra, ira);
+        region = factory.create(META_DATA_REGION_NAME);
       } catch (RegionExistsException e) {
         region = cache.getRegion(META_DATA_REGION_NAME);
       } catch (Exception e) {
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderQueue.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderQueue.java
index a4a9a28..a62eae6 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderQueue.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderQueue.java
@@ -17,7 +17,6 @@ package org.apache.geode.internal.cache.wan.parallel;
 import static org.apache.geode.cache.wan.GatewaySender.DEFAULT_BATCH_SIZE;
 import static 
org.apache.geode.internal.cache.LocalRegion.InitializationLevel.BEFORE_INITIAL_IMAGE;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -41,7 +40,6 @@ import org.apache.logging.log4j.Logger;
 import org.apache.geode.CancelException;
 import org.apache.geode.SystemFailure;
 import org.apache.geode.annotations.internal.MutableForTesting;
-import org.apache.geode.cache.AttributesFactory;
 import org.apache.geode.cache.AttributesMutator;
 import org.apache.geode.cache.Cache;
 import org.apache.geode.cache.CacheException;
@@ -54,6 +52,7 @@ import org.apache.geode.cache.PartitionAttributesFactory;
 import org.apache.geode.cache.Region;
 import org.apache.geode.cache.RegionAttributes;
 import org.apache.geode.cache.RegionDestroyedException;
+import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.cache.asyncqueue.internal.AsyncEventQueueImpl;
 import org.apache.geode.distributed.internal.DistributionManager;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
@@ -70,6 +69,7 @@ import org.apache.geode.internal.cache.EntryEventImpl;
 import org.apache.geode.internal.cache.ForceReattemptException;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.InternalRegionArguments;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.cache.LocalRegion;
 import org.apache.geode.internal.cache.LocalRegion.InitializationLevel;
 import org.apache.geode.internal.cache.PartitionedRegion;
@@ -320,8 +320,7 @@ public class ParallelGatewaySenderQueue implements 
RegionQueue {
       final String prQName = getQueueName(sender.getId(), 
userRegion.getFullPath());
       prQ = (PartitionedRegion) cache.getRegion(prQName);
       if (prQ == null) {
-        // TODO:REF:Avoid deprecated apis
-        AttributesFactory fact = new AttributesFactory();
+        InternalRegionFactory fact = cache.createInternalRegionFactory();
         // Fix for 48621 - don't enable concurrency checks
         // for queue buckets., event with persistence
         fact.setConcurrencyChecksEnabled(false);
@@ -355,7 +354,7 @@ public class ParallelGatewaySenderQueue implements 
RegionQueue {
         fact.setEvictionAttributes(ea);
         fact.setPartitionAttributes(pfact.create());
 
-        final RegionAttributes ra = fact.create();
+        final RegionAttributes ra = fact.getCreateAttributes();
 
         if (logger.isDebugEnabled()) {
           logger.debug("{}: Attempting to create queue region: {}", this, 
prQName);
@@ -365,40 +364,30 @@ public class ParallelGatewaySenderQueue implements 
RegionQueue {
             new ParallelGatewaySenderQueueMetaRegion(prQName, ra, null, cache, 
sender,
                 sender.getStatisticsClock());
 
-        try {
-          prQ = (PartitionedRegion) cache.createVMRegion(prQName, ra,
-              new 
InternalRegionArguments().setInternalMetaRegion(meta).setDestroyLockFlag(true)
-                  .setSnapshotInputStream(null).setImageTarget(null));
+        fact.setInternalMetaRegion(meta).setDestroyLockFlag(true)
+            .setSnapshotInputStream(null).setImageTarget(null);
+        prQ = (PartitionedRegion) fact.create(prQName);
 
-          if (logger.isDebugEnabled()) {
-            logger.debug("Region created  : {} partition Attributes : {}", prQ,
-                prQ.getPartitionAttributes());
-          }
+        if (logger.isDebugEnabled()) {
+          logger.debug("Region created  : {} partition Attributes : {}", prQ,
+              prQ.getPartitionAttributes());
+        }
 
-          // TODO This should not be set on the PR but on the GatewaySender
-          prQ.enableConflation(sender.isBatchConflationEnabled());
-
-          // Before going ahead, make sure all the buckets of shadowPR are
-          // loaded
-          // and primary nodes have been decided.
-          // This is required in case of persistent PR and sender.
-          if (prQ.getLocalMaxMemory() != 0) {
-            Iterator<Integer> itr = 
prQ.getRegionAdvisor().getBucketSet().iterator();
-            while (itr.hasNext()) {
-              itr.next();
-            }
+        // TODO This should not be set on the PR but on the GatewaySender
+        prQ.enableConflation(sender.isBatchConflationEnabled());
+
+        // Before going ahead, make sure all the buckets of shadowPR are
+        // loaded
+        // and primary nodes have been decided.
+        // This is required in case of persistent PR and sender.
+        if (prQ.getLocalMaxMemory() != 0) {
+          Iterator<Integer> itr = 
prQ.getRegionAdvisor().getBucketSet().iterator();
+          while (itr.hasNext()) {
+            itr.next();
           }
-          // In case of Replicated Region it may not be necessary.
-
-        } catch (IOException veryUnLikely) {
-          logger.fatal("Unexpected Exception during init of " +
-              this.getClass(),
-              veryUnLikely);
-        } catch (ClassNotFoundException alsoUnlikely) {
-          logger.fatal("Unexpected Exception during init of " +
-              this.getClass(),
-              alsoUnlikely);
         }
+        // In case of Replicated Region it may not be necessary.
+
         if (logger.isDebugEnabled()) {
           logger.debug("{}: Created queue region: {}", this, prQ);
         }
@@ -469,9 +458,14 @@ public class ParallelGatewaySenderQueue implements 
RegionQueue {
       final String prQName = sender.getId() + QSTRING + 
convertPathToName(userPR.getFullPath());
       prQ = (PartitionedRegion) cache.getRegion(prQName);
       if (prQ == null) {
-        // TODO:REF:Avoid deprecated apis
+        RegionShortcut regionShortcut;
+        if (sender.isPersistenceEnabled() && !isAccessor) {
+          regionShortcut = RegionShortcut.PARTITION_PERSISTENT;
+        } else {
+          regionShortcut = RegionShortcut.PARTITION;
+        }
+        InternalRegionFactory fact = 
cache.createInternalRegionFactory(regionShortcut);
 
-        AttributesFactory fact = new AttributesFactory();
         fact.setConcurrencyChecksEnabled(false);
         PartitionAttributesFactory pfact = new PartitionAttributesFactory();
         pfact.setTotalNumBuckets(userPR.getTotalNumberOfBuckets());
@@ -486,10 +480,6 @@ public class ParallelGatewaySenderQueue implements 
RegionQueue {
         
pfact.setStartupRecoveryDelay(userPR.getPartitionAttributes().getStartupRecoveryDelay());
         
pfact.setRecoveryDelay(userPR.getPartitionAttributes().getRecoveryDelay());
 
-        if (sender.isPersistenceEnabled() && !isAccessor) {
-          fact.setDataPolicy(DataPolicy.PERSISTENT_PARTITION);
-        }
-
         fact.setDiskStoreName(sender.getDiskStoreName());
 
         // if persistence is enabled, set the diskSyncronous to whatever user 
has set
@@ -507,7 +497,7 @@ public class ParallelGatewaySenderQueue implements 
RegionQueue {
         fact.setEvictionAttributes(ea);
         fact.setPartitionAttributes(pfact.create());
 
-        final RegionAttributes ra = fact.create();
+        final RegionAttributes ra = fact.getCreateAttributes();
 
         if (logger.isDebugEnabled()) {
           logger.debug("{}: Attempting to create queue region: {}", this, 
prQName);
@@ -516,28 +506,25 @@ public class ParallelGatewaySenderQueue implements 
RegionQueue {
         ParallelGatewaySenderQueueMetaRegion meta =
             metaRegionFactory.newMetataRegion(cache, prQName, ra, sender);
 
-        try {
-          prQ = (PartitionedRegion) cache.createVMRegion(prQName, ra,
-              new 
InternalRegionArguments().setInternalMetaRegion(meta).setDestroyLockFlag(true)
-                  
.setInternalRegion(true).setSnapshotInputStream(null).setImageTarget(null));
-          // at this point we should be able to assert prQ == meta;
-
-          // TODO This should not be set on the PR but on the GatewaySender
-          prQ.enableConflation(sender.isBatchConflationEnabled());
-          if (isAccessor)
-            return; // return from here if accessor node
-
-          // Add the overflow statistics to the mbean
-          addOverflowStatisticsToMBean(cache, prQ);
-
-          // Wait for buckets to be recovered.
-          prQ.shadowPRWaitForBucketRecovery();
-
-        } catch (IOException | ClassNotFoundException veryUnLikely) {
-          logger.fatal("Unexpected Exception during init of " +
-              this.getClass(),
-              veryUnLikely);
-        }
+        fact.setInternalMetaRegion(meta);
+        fact.setDestroyLockFlag(true);
+        fact.setInternalRegion(true);
+        fact.setSnapshotInputStream(null);
+        fact.setImageTarget(null);
+        prQ = (PartitionedRegion) fact.create(prQName);
+        // at this point we should be able to assert prQ == meta;
+
+        // TODO This should not be set on the PR but on the GatewaySender
+        prQ.enableConflation(sender.isBatchConflationEnabled());
+        if (isAccessor)
+          return; // return from here if accessor node
+
+        // Add the overflow statistics to the mbean
+        addOverflowStatisticsToMBean(cache, prQ);
+
+        // Wait for buckets to be recovered.
+        prQ.shadowPRWaitForBucketRecovery();
+
         if (logger.isDebugEnabled()) {
           logger.debug("{}: Created queue region: {}", this, prQ);
         }
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/serial/SerialGatewaySenderQueue.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/serial/SerialGatewaySenderQueue.java
index 0e19ebb..243fe73 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/serial/SerialGatewaySenderQueue.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/serial/SerialGatewaySenderQueue.java
@@ -16,7 +16,6 @@ package org.apache.geode.internal.cache.wan.serial;
 
 import static org.apache.geode.cache.wan.GatewaySender.DEFAULT_BATCH_SIZE;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Deque;
 import java.util.HashMap;
@@ -33,7 +32,6 @@ import org.apache.logging.log4j.Logger;
 import org.apache.geode.CancelException;
 import org.apache.geode.SystemFailure;
 import org.apache.geode.annotations.Immutable;
-import org.apache.geode.cache.AttributesFactory;
 import org.apache.geode.cache.AttributesMutator;
 import org.apache.geode.cache.Cache;
 import org.apache.geode.cache.CacheException;
@@ -47,6 +45,7 @@ import org.apache.geode.cache.Operation;
 import org.apache.geode.cache.Region;
 import org.apache.geode.cache.RegionAttributes;
 import org.apache.geode.cache.RegionDestroyedException;
+import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.cache.Scope;
 import org.apache.geode.cache.TimeoutException;
 import org.apache.geode.cache.asyncqueue.AsyncEvent;
@@ -58,6 +57,7 @@ import org.apache.geode.internal.cache.DistributedRegion;
 import org.apache.geode.internal.cache.EntryEventImpl;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.InternalRegionArguments;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.cache.LocalRegion;
 import org.apache.geode.internal.cache.RegionQueue;
 import org.apache.geode.internal.cache.Token;
@@ -847,10 +847,17 @@ public class SerialGatewaySenderQueue implements 
RegionQueue {
     final InternalCache gemCache = sender.getCache();
     this.region = gemCache.getRegion(this.regionName);
     if (this.region == null) {
-      AttributesFactory<Long, AsyncEvent> factory = new 
AttributesFactory<Long, AsyncEvent>();
-      factory.setScope(NO_ACK ? Scope.DISTRIBUTED_NO_ACK : 
Scope.DISTRIBUTED_ACK);
-      factory.setDataPolicy(
-          this.enablePersistence ? DataPolicy.PERSISTENT_REPLICATE : 
DataPolicy.REPLICATE);
+      RegionShortcut regionShortcut;
+      if (enablePersistence) {
+        regionShortcut = RegionShortcut.REPLICATE_PERSISTENT;
+      } else {
+        regionShortcut = RegionShortcut.REPLICATE;
+      }
+      InternalRegionFactory<Long, AsyncEvent> factory =
+          gemCache.createInternalRegionFactory(regionShortcut);
+      if (NO_ACK) {
+        factory.setScope(Scope.DISTRIBUTED_NO_ACK);
+      }
       if (logger.isDebugEnabled()) {
         logger.debug("The policy of region is {}",
             (this.enablePersistence ? DataPolicy.PERSISTENT_REPLICATE : 
DataPolicy.REPLICATE));
@@ -876,29 +883,22 @@ public class SerialGatewaySenderQueue implements 
RegionQueue {
       if (logger.isDebugEnabled()) {
         logger.debug("{}: Attempting to create queue region: {}", this, 
this.regionName);
       }
-      final RegionAttributes<Long, AsyncEvent> ra = factory.create();
+      final RegionAttributes<Long, AsyncEvent> ra = 
factory.getCreateAttributes();
       try {
         SerialGatewaySenderQueueMetaRegion meta =
             new SerialGatewaySenderQueueMetaRegion(this.regionName, ra, null, 
gemCache, sender,
                 sender.getStatisticsClock());
-        try {
-          this.region = gemCache.createVMRegion(this.regionName, ra,
-              new 
InternalRegionArguments().setInternalMetaRegion(meta).setDestroyLockFlag(true)
-                  .setSnapshotInputStream(null).setImageTarget(null)
-                  
.setIsUsedForSerialGatewaySenderQueue(true).setInternalRegion(true)
-                  .setSerialGatewaySender(sender));
-
-          // Add overflow statistics to the mbean
-          addOverflowStatisticsToMBean(gemCache, sender);
-        } catch (IOException veryUnLikely) {
-          logger.fatal(String.format("Unexpected Exception during init of %s",
-              this.getClass()),
-              veryUnLikely);
-        } catch (ClassNotFoundException alsoUnlikely) {
-          logger.fatal(String.format("Unexpected Exception during init of %s",
-              this.getClass()),
-              alsoUnlikely);
-        }
+        factory
+            .setInternalMetaRegion(meta)
+            .setDestroyLockFlag(true)
+            .setSnapshotInputStream(null)
+            .setImageTarget(null)
+            .setIsUsedForSerialGatewaySenderQueue(true)
+            .setInternalRegion(true)
+            .setSerialGatewaySender(sender);
+        region = factory.create(regionName);
+        // Add overflow statistics to the mbean
+        addOverflowStatisticsToMBean(gemCache, sender);
         if (logger.isDebugEnabled()) {
           logger.debug("{}: Created queue region: {}", this, this.region);
         }
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/xmlcache/CacheCreation.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/xmlcache/CacheCreation.java
index 324a6ef..930a21c 100755
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/xmlcache/CacheCreation.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/xmlcache/CacheCreation.java
@@ -134,11 +134,11 @@ import 
org.apache.geode.internal.cache.InternalCacheForClientAccess;
 import org.apache.geode.internal.cache.InternalCacheServer;
 import org.apache.geode.internal.cache.InternalRegion;
 import org.apache.geode.internal.cache.InternalRegionArguments;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.cache.LocalRegion;
 import org.apache.geode.internal.cache.PartitionedRegion;
 import org.apache.geode.internal.cache.PoolFactoryImpl;
 import org.apache.geode.internal.cache.PoolManagerImpl;
-import org.apache.geode.internal.cache.RegionFactoryImpl;
 import org.apache.geode.internal.cache.RegionListener;
 import org.apache.geode.internal.cache.TXEntryStateFactory;
 import org.apache.geode.internal.cache.TXManagerImpl;
@@ -1111,25 +1111,25 @@ public class CacheCreation implements InternalCache {
   @Override
   public <K, V> RegionFactory<K, V> createRegionFactory(RegionShortcut 
shortcut) {
     throwIfClient();
-    return new RegionFactoryImpl<>(this, shortcut);
+    return new InternalRegionFactory<>(this, shortcut);
   }
 
   @Override
   public <K, V> RegionFactory<K, V> createRegionFactory() {
     throwIfClient();
-    return new RegionFactoryImpl<>(this);
+    return new InternalRegionFactory<>(this);
   }
 
   @Override
   public <K, V> RegionFactory<K, V> createRegionFactory(String 
regionAttributesId) {
     throwIfClient();
-    return new RegionFactoryImpl<>(this, regionAttributesId);
+    return new InternalRegionFactory<>(this, regionAttributesId);
   }
 
   @Override
   public <K, V> RegionFactory<K, V> createRegionFactory(RegionAttributes<K, V> 
regionAttributes) {
     throwIfClient();
-    return new RegionFactoryImpl<>(this, regionAttributes);
+    return new InternalRegionFactory<>(this, regionAttributes);
   }
 
   @Override
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/FederatingManager.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/FederatingManager.java
index bc3fe34..714c9cb 100755
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/FederatingManager.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/FederatingManager.java
@@ -14,7 +14,6 @@
  */
 package org.apache.geode.management.internal;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -36,12 +35,10 @@ import org.apache.logging.log4j.Logger;
 import org.apache.geode.CancelException;
 import org.apache.geode.StatisticsFactory;
 import org.apache.geode.annotations.VisibleForTesting;
-import org.apache.geode.cache.AttributesFactory;
 import org.apache.geode.cache.DataPolicy;
 import org.apache.geode.cache.EvictionAction;
 import org.apache.geode.cache.EvictionAttributes;
 import org.apache.geode.cache.Region;
-import org.apache.geode.cache.RegionAttributes;
 import org.apache.geode.cache.RegionDestroyedException;
 import org.apache.geode.cache.RegionExistsException;
 import org.apache.geode.cache.Scope;
@@ -52,7 +49,7 @@ import 
org.apache.geode.distributed.internal.membership.InternalDistributedMembe
 import org.apache.geode.internal.cache.CachePerfStats;
 import org.apache.geode.internal.cache.HasCachePerfStats;
 import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.internal.cache.InternalRegionArguments;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.statistics.StatisticsClock;
 import org.apache.geode.logging.internal.log4j.api.LogService;
 import org.apache.geode.management.ManagementException;
@@ -388,10 +385,6 @@ public class FederatingManager extends Manager {
         // GII wont start at all if its interrupted
         if (!Thread.currentThread().isInterrupted()) {
 
-          // as the regions will be internal regions
-          InternalRegionArguments internalRegionArguments = new 
InternalRegionArguments();
-          internalRegionArguments.setIsUsedForMetaRegion(true);
-
           // Create anonymous stats holder for Management Regions
           HasCachePerfStats monitoringRegionStats = new HasCachePerfStats() {
 
@@ -407,49 +400,42 @@ public class FederatingManager extends Manager {
             }
           };
 
-          
internalRegionArguments.setCachePerfStatsHolder(monitoringRegionStats);
-
           // Monitoring region for member is created
-          AttributesFactory<String, Object> monitorAttributesFactory = new 
AttributesFactory<>();
-          monitorAttributesFactory.setScope(Scope.DISTRIBUTED_NO_ACK);
-          monitorAttributesFactory.setDataPolicy(DataPolicy.REPLICATE);
-          monitorAttributesFactory.setConcurrencyChecksEnabled(false);
+          InternalRegionFactory<String, Object> monitorFactory =
+              cache.createInternalRegionFactory();
+          monitorFactory.setScope(Scope.DISTRIBUTED_NO_ACK);
+          monitorFactory.setDataPolicy(DataPolicy.REPLICATE);
+          monitorFactory.setConcurrencyChecksEnabled(false);
           ManagementCacheListener managementCacheListener =
               new ManagementCacheListener(proxyFactory);
-          monitorAttributesFactory.addCacheListener(managementCacheListener);
-
-          RegionAttributes<String, Object> monitoringRegionAttrs =
-              monitorAttributesFactory.create();
+          monitorFactory.addCacheListener(managementCacheListener);
+          monitorFactory.setIsUsedForMetaRegion(true);
+          monitorFactory.setCachePerfStatsHolder(monitoringRegionStats);
 
           // Notification region for member is created
-          AttributesFactory<NotificationKey, Notification> 
notificationAttributesFactory =
-              new AttributesFactory<>();
-          notificationAttributesFactory.setScope(Scope.DISTRIBUTED_NO_ACK);
-          notificationAttributesFactory.setDataPolicy(DataPolicy.REPLICATE);
-          notificationAttributesFactory.setConcurrencyChecksEnabled(false);
+          InternalRegionFactory<NotificationKey, Notification> 
notificationFactory =
+              cache.createInternalRegionFactory();
+          notificationFactory.setScope(Scope.DISTRIBUTED_NO_ACK);
+          notificationFactory.setDataPolicy(DataPolicy.REPLICATE);
+          notificationFactory.setConcurrencyChecksEnabled(false);
 
           // Fix for issue #49638, evict the internal region 
_notificationRegion
-          notificationAttributesFactory
+          notificationFactory
               
.setEvictionAttributes(EvictionAttributes.createLRUEntryAttributes(
                   ManagementConstants.NOTIF_REGION_MAX_ENTRIES, 
EvictionAction.LOCAL_DESTROY));
 
           NotificationCacheListener notifListener = new 
NotificationCacheListener(proxyFactory);
-          notificationAttributesFactory.addCacheListener(notifListener);
-
-          RegionAttributes<NotificationKey, Notification> notifRegionAttrs =
-              notificationAttributesFactory.create();
+          notificationFactory.addCacheListener(notifListener);
+          notificationFactory.setIsUsedForMetaRegion(true);
+          notificationFactory.setCachePerfStatsHolder(monitoringRegionStats);
 
           Region<String, Object> proxyMonitoringRegion;
           try {
             if (!running) {
               return;
             }
-            proxyMonitoringRegion =
-                cache.createInternalRegion(monitoringRegionName, 
monitoringRegionAttrs,
-                    internalRegionArguments);
-
-          } catch (TimeoutException | RegionExistsException | IOException
-              | ClassNotFoundException e) {
+            proxyMonitoringRegion = 
monitorFactory.create(monitoringRegionName);
+          } catch (TimeoutException | RegionExistsException e) {
             if (logger.isDebugEnabled()) {
               logger.debug("Error During Internal Region creation", e);
             }
@@ -462,12 +448,9 @@ public class FederatingManager extends Manager {
             if (!running) {
               return;
             }
-            proxyNotificationRegion =
-                cache.createInternalRegion(notificationRegionName, 
notifRegionAttrs,
-                    internalRegionArguments);
+            proxyNotificationRegion = 
notificationFactory.create(notificationRegionName);
             proxyNotificationRegionCreated = true;
-          } catch (TimeoutException | RegionExistsException | IOException
-              | ClassNotFoundException e) {
+          } catch (TimeoutException | RegionExistsException e) {
             if (logger.isDebugEnabled()) {
               logger.debug("Error During Internal Region creation", e);
             }
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/LocalManager.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/LocalManager.java
index 556a913..b67d8f5 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/LocalManager.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/LocalManager.java
@@ -14,7 +14,6 @@
  */
 package org.apache.geode.management.internal;
 
-import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
@@ -33,10 +32,8 @@ import org.apache.geode.GemFireException;
 import org.apache.geode.StatisticsFactory;
 import org.apache.geode.SystemFailure;
 import org.apache.geode.annotations.VisibleForTesting;
-import org.apache.geode.cache.AttributesFactory;
 import org.apache.geode.cache.CacheListener;
 import org.apache.geode.cache.DataPolicy;
-import org.apache.geode.cache.RegionAttributes;
 import org.apache.geode.cache.RegionExistsException;
 import org.apache.geode.cache.Scope;
 import org.apache.geode.cache.TimeoutException;
@@ -44,7 +41,7 @@ import 
org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.internal.cache.CachePerfStats;
 import org.apache.geode.internal.cache.HasCachePerfStats;
 import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.internal.cache.InternalRegionArguments;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.statistics.StatisticsClock;
 import org.apache.geode.logging.internal.executors.LoggingExecutors;
 import org.apache.geode.logging.internal.log4j.api.LogService;
@@ -113,12 +110,6 @@ public class LocalManager extends Manager {
         logger.debug("Creating  Management Region :");
       }
 
-      /*
-       * Sharing the same Internal Argument for both notification region and 
monitoring region
-       */
-      InternalRegionArguments internalArgs = new InternalRegionArguments();
-      internalArgs.setIsUsedForMetaRegion(true);
-
       // Create anonymous stats holder for Management Regions
       HasCachePerfStats monitoringRegionStats = new HasCachePerfStats() {
 
@@ -134,46 +125,38 @@ public class LocalManager extends Manager {
         }
       };
 
-      internalArgs.setCachePerfStatsHolder(monitoringRegionStats);
-
-      AttributesFactory<String, Object> monitorRegionAttributeFactory =
-          new AttributesFactory<>();
-      monitorRegionAttributeFactory.setScope(Scope.DISTRIBUTED_NO_ACK);
-      monitorRegionAttributeFactory.setDataPolicy(DataPolicy.REPLICATE);
-      monitorRegionAttributeFactory.setConcurrencyChecksEnabled(false);
+      InternalRegionFactory<String, Object> monitorFactory = 
cache.createInternalRegionFactory();
+      monitorFactory.setScope(Scope.DISTRIBUTED_NO_ACK);
+      monitorFactory.setDataPolicy(DataPolicy.REPLICATE);
+      monitorFactory.setConcurrencyChecksEnabled(false);
       CacheListener<String, Object> localListener = new 
MonitoringRegionCacheListener(service);
-      monitorRegionAttributeFactory.addCacheListener(localListener);
-
-      RegionAttributes<String, Object> monitoringRegionAttrs =
-          monitorRegionAttributeFactory.create();
-
-      AttributesFactory<NotificationKey, Notification> 
notificationRegionAttributeFactory =
-          new AttributesFactory<>();
-      notificationRegionAttributeFactory.setScope(Scope.DISTRIBUTED_NO_ACK);
-      notificationRegionAttributeFactory.setDataPolicy(DataPolicy.EMPTY);
-      notificationRegionAttributeFactory.setConcurrencyChecksEnabled(false);
-
-      RegionAttributes<NotificationKey, Notification> notifRegionAttrs =
-          notificationRegionAttributeFactory.create();
+      monitorFactory.addCacheListener(localListener);
+      monitorFactory.setIsUsedForMetaRegion(true);
+      monitorFactory.setCachePerfStatsHolder(monitoringRegionStats);
+
+      InternalRegionFactory<NotificationKey, Notification> notificationFactory 
=
+          cache.createInternalRegionFactory();
+      notificationFactory.setScope(Scope.DISTRIBUTED_NO_ACK);
+      notificationFactory.setDataPolicy(DataPolicy.EMPTY);
+      notificationFactory.setConcurrencyChecksEnabled(false);
+      notificationFactory.setIsUsedForMetaRegion(true);
+      notificationFactory.setCachePerfStatsHolder(monitoringRegionStats);
 
       String appender = 
MBeanJMXAdapter.getUniqueIDForMember(system.getDistributedMember());
 
       try {
         repo.setLocalMonitoringRegion(
-            cache.createInternalRegion(ManagementConstants.MONITORING_REGION + 
"_" + appender,
-                monitoringRegionAttrs, internalArgs));
-
-      } catch (TimeoutException | RegionExistsException | 
ClassNotFoundException | IOException e) {
+            monitorFactory.create(ManagementConstants.MONITORING_REGION + "_" 
+ appender));
+      } catch (TimeoutException | RegionExistsException e) {
         throw new ManagementException(e);
       }
 
       boolean notifRegionCreated = false;
       try {
         repo.setLocalNotificationRegion(
-            cache.createInternalRegion(ManagementConstants.NOTIFICATION_REGION 
+ "_" + appender,
-                notifRegionAttrs, internalArgs));
+            notificationFactory.create(ManagementConstants.NOTIFICATION_REGION 
+ "_" + appender));
         notifRegionCreated = true;
-      } catch (TimeoutException | ClassNotFoundException | IOException | 
RegionExistsException e) {
+      } catch (TimeoutException | RegionExistsException e) {
         throw new ManagementException(e);
       } finally {
         if (!notifRegionCreated) {
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/RestAgent.java 
b/geode-core/src/main/java/org/apache/geode/management/internal/RestAgent.java
index 84cce29..286061a 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/RestAgent.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/RestAgent.java
@@ -24,16 +24,13 @@ import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.Logger;
 
-import org.apache.geode.cache.AttributesFactory;
-import org.apache.geode.cache.CacheFactory;
-import org.apache.geode.cache.DataPolicy;
-import org.apache.geode.cache.RegionAttributes;
-import org.apache.geode.cache.Scope;
+import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.cache.internal.HttpService;
 import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.internal.GemFireVersion;
+import org.apache.geode.internal.cache.CacheFactoryStatics;
 import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.internal.cache.InternalRegionArguments;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.inet.LocalHostUtil;
 import org.apache.geode.internal.security.SecurityService;
 import org.apache.geode.logging.internal.log4j.api.LogService;
@@ -151,23 +148,16 @@ public class RestAgent {
       if (logger.isDebugEnabled()) {
         logger.debug("Starting creation of  __ParameterizedQueries__ region");
       }
-      InternalCache cache = (InternalCache) CacheFactory.getAnyInstance();
+      InternalCache cache = CacheFactoryStatics.getAnyInstance();
       if (cache != null) {
-        final InternalRegionArguments regionArguments = new 
InternalRegionArguments();
-        regionArguments.setIsUsedForMetaRegion(true);
-        final AttributesFactory<String, String> attributesFactory =
-            new AttributesFactory<String, String>();
-
-        attributesFactory.setConcurrencyChecksEnabled(false);
-        attributesFactory.setDataPolicy(DataPolicy.REPLICATE);
-        attributesFactory.setKeyConstraint(String.class);
-        attributesFactory.setScope(Scope.DISTRIBUTED_ACK);
-        attributesFactory.setStatisticsEnabled(false);
-        attributesFactory.setValueConstraint(String.class);
-
-        final RegionAttributes<String, String> regionAttributes = 
attributesFactory.create();
-
-        cache.createVMRegion("__ParameterizedQueries__", regionAttributes, 
regionArguments);
+        InternalRegionFactory<String, String> factory =
+            cache.createInternalRegionFactory(RegionShortcut.REPLICATE);
+        factory.setConcurrencyChecksEnabled(false);
+        factory.setKeyConstraint(String.class);
+        factory.setStatisticsEnabled(false);
+        factory.setValueConstraint(String.class);
+        factory.setIsUsedForMetaRegion(true);
+        factory.create("__ParameterizedQueries__");
         if (logger.isDebugEnabled()) {
           logger.debug("Successfully created __ParameterizedQueries__ region");
         }
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/operation/RegionOperationStateStore.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/operation/RegionOperationStateStore.java
index 038184f..cc76049 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/operation/RegionOperationStateStore.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/operation/RegionOperationStateStore.java
@@ -23,11 +23,9 @@ import java.util.function.Supplier;
 
 import org.apache.geode.annotations.VisibleForTesting;
 import org.apache.geode.cache.Region;
-import org.apache.geode.cache.RegionFactory;
 import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.internal.cache.InternalRegionArguments;
-import org.apache.geode.internal.cache.RegionFactoryImpl;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.management.api.ClusterManagementOperation;
 import org.apache.geode.management.runtime.OperationResult;
 
@@ -64,14 +62,10 @@ public class RegionOperationStateStore
       return region;
     }
 
-    RegionFactory<String, 
OperationState<ClusterManagementOperation<OperationResult>, OperationResult>> 
regionFactory =
-        cache.createRegionFactory(RegionShortcut.REPLICATE);
-
-    InternalRegionArguments internalArgs = new InternalRegionArguments();
-    internalArgs.setIsUsedForMetaRegion(true);
-    internalArgs.setMetaRegionWithTransactions(false);
-    ((RegionFactoryImpl) 
regionFactory).setInternalRegionArguments(internalArgs);
-
+    InternalRegionFactory<String, 
OperationState<ClusterManagementOperation<OperationResult>, OperationResult>> 
regionFactory =
+        cache.createInternalRegionFactory(RegionShortcut.REPLICATE);
+    regionFactory.setIsUsedForMetaRegion(true);
+    regionFactory.setMetaRegionWithTransactions(false);
     return regionFactory.create(OPERATION_STATE_REGION_NAME);
   }
 
diff --git 
a/geode-core/src/main/java/org/apache/geode/pdx/internal/PeerTypeRegistration.java
 
b/geode-core/src/main/java/org/apache/geode/pdx/internal/PeerTypeRegistration.java
index 52b480f..74f6a8e 100644
--- 
a/geode-core/src/main/java/org/apache/geode/pdx/internal/PeerTypeRegistration.java
+++ 
b/geode-core/src/main/java/org/apache/geode/pdx/internal/PeerTypeRegistration.java
@@ -15,7 +15,6 @@
 
 package org.apache.geode.pdx.internal;
 
-import java.io.IOException;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -27,12 +26,10 @@ import org.apache.logging.log4j.Logger;
 import org.apache.geode.InternalGemFireError;
 import org.apache.geode.InternalGemFireException;
 import org.apache.geode.annotations.VisibleForTesting;
-import org.apache.geode.cache.AttributesFactory;
 import org.apache.geode.cache.CacheWriterException;
 import org.apache.geode.cache.DataPolicy;
 import org.apache.geode.cache.EntryEvent;
 import org.apache.geode.cache.Region;
-import org.apache.geode.cache.RegionAttributes;
 import org.apache.geode.cache.RegionExistsException;
 import org.apache.geode.cache.Scope;
 import org.apache.geode.cache.TimeoutException;
@@ -51,7 +48,7 @@ import 
org.apache.geode.distributed.internal.locks.DLockService;
 import org.apache.geode.internal.CopyOnWriteHashSet;
 import org.apache.geode.internal.cache.GemFireCacheImpl;
 import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.internal.cache.InternalRegionArguments;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.cache.TXManagerImpl;
 import org.apache.geode.internal.cache.TXStateProxy;
 import org.apache.geode.internal.util.concurrent.CopyOnWriteHashMap;
@@ -140,8 +137,7 @@ public class PeerTypeRegistration implements 
TypeRegistration {
       logger.debug("Flushing TypeRegistry");
     }
 
-    @SuppressWarnings("deprecation")
-    AttributesFactory<Object, Object> factory = getAttributesFactory();
+    InternalRegionFactory factory = cache.createInternalRegionFactory();
 
     factory.setScope(Scope.DISTRIBUTED_ACK);
     if (cache.getPdxPersistent()) {
@@ -198,14 +194,11 @@ public class PeerTypeRegistration implements 
TypeRegistration {
 
     });
 
-    RegionAttributes<Object, Object> regionAttrs = factory.create();
-
-    InternalRegionArguments internalArgs = new InternalRegionArguments();
-    internalArgs.setIsUsedForMetaRegion(true);
-    internalArgs.setMetaRegionWithTransactions(true);
+    factory.setIsUsedForMetaRegion(true);
+    factory.setMetaRegionWithTransactions(true);
     try {
-      idToType = cache.createVMRegion(REGION_NAME, regionAttrs, internalArgs);
-    } catch (IOException | TimeoutException | RegionExistsException | 
ClassNotFoundException ex) {
+      idToType = factory.create(REGION_NAME);
+    } catch (TimeoutException | RegionExistsException ex) {
       throw new PdxInitializationException("Could not create pdx registry", 
ex);
     }
 
@@ -781,12 +774,6 @@ public class PeerTypeRegistration implements 
TypeRegistration {
   }
 
   @VisibleForTesting
-  @SuppressWarnings("deprecation")
-  protected AttributesFactory<Object, Object> getAttributesFactory() {
-    return new AttributesFactory<>();
-  }
-
-  @VisibleForTesting
   public int getTypeToIdSize() {
     return reverseMap.typeToIdSize();
   }
diff --git 
a/geode-core/src/test/java/org/apache/geode/cache/asyncqueue/internal/SerialAsyncEventQueueImplTest.java
 
b/geode-core/src/test/java/org/apache/geode/cache/asyncqueue/internal/SerialAsyncEventQueueImplTest.java
index 4c4aa2e..c6763ac 100644
--- 
a/geode-core/src/test/java/org/apache/geode/cache/asyncqueue/internal/SerialAsyncEventQueueImplTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/cache/asyncqueue/internal/SerialAsyncEventQueueImplTest.java
@@ -33,6 +33,7 @@ import org.apache.geode.Statistics;
 import org.apache.geode.StatisticsFactory;
 import org.apache.geode.distributed.DistributedLockService;
 import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.cache.LocalRegion;
 import org.apache.geode.internal.cache.wan.AbstractGatewaySenderEventProcessor;
 import org.apache.geode.internal.cache.wan.GatewaySenderAdvisor;
@@ -53,12 +54,15 @@ public class SerialAsyncEventQueueImplTest {
   private StatisticsFactory statisticsFactory;
   private GatewaySenderAttributes gatewaySenderAttributes;
   private StatisticsClock statisticsClock;
+  private InternalRegionFactory regionFactory;
 
   @Before
   public void setUp() throws Exception {
     cache = Fakes.cache();
     when(cache.getRegion(any())).thenReturn(null);
-    when(cache.createVMRegion(any(), any(), 
any())).thenReturn(mock(LocalRegion.class));
+    regionFactory = mock(InternalRegionFactory.class);
+    when(regionFactory.create(any())).thenReturn(mock(LocalRegion.class));
+    when(cache.createInternalRegionFactory(any())).thenReturn(regionFactory);
 
     statisticsFactory = mock(StatisticsFactory.class);
     when(statisticsFactory.createAtomicStatistics(any(), 
any())).thenReturn(mock(Statistics.class));
diff --git 
a/geode-core/src/test/java/org/apache/geode/internal/cache/RegionFactoryImplTest.java
 
b/geode-core/src/test/java/org/apache/geode/internal/cache/InternalRegionFactoryTest.java
similarity index 54%
rename from 
geode-core/src/test/java/org/apache/geode/internal/cache/RegionFactoryImplTest.java
rename to 
geode-core/src/test/java/org/apache/geode/internal/cache/InternalRegionFactoryTest.java
index d881f58..89e3531 100644
--- 
a/geode-core/src/test/java/org/apache/geode/internal/cache/RegionFactoryImplTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/internal/cache/InternalRegionFactoryTest.java
@@ -27,7 +27,7 @@ import org.junit.Test;
 
 import org.apache.geode.cache.Region;
 
-public class RegionFactoryImplTest {
+public class InternalRegionFactoryTest {
   private InternalCache cache;
 
   @Before
@@ -37,21 +37,22 @@ public class RegionFactoryImplTest {
 
   @Test
   public void createWithInternalRegionArgumentsCallsCreateVMRegion() throws 
Exception {
-    RegionFactoryImpl<Object, Object> regionFactory = new 
RegionFactoryImpl<>(cache);
-    InternalRegionArguments internalRegionArguments = 
mock(InternalRegionArguments.class);
-    regionFactory.setInternalRegionArguments(internalRegionArguments);
+    InternalRegionFactory<Object, Object> regionFactory = new 
InternalRegionFactory<>(cache);
+    regionFactory.setInternalRegion(true);
+    InternalRegionArguments internalRegionArguments = 
regionFactory.getInternalRegionArguments();
     String regionName = "regionName";
 
     regionFactory.create(regionName);
 
+    assertThat(internalRegionArguments).isNotNull();
     verify(cache).createVMRegion(same(regionName), any(), 
same(internalRegionArguments));
   }
 
   @Test
   public void createWithInternalRegionArgumentsReturnsRegion() throws 
Exception {
-    RegionFactoryImpl<Object, Object> regionFactory = new 
RegionFactoryImpl<>(cache);
-    InternalRegionArguments internalRegionArguments = 
mock(InternalRegionArguments.class);
-    regionFactory.setInternalRegionArguments(internalRegionArguments);
+    InternalRegionFactory<Object, Object> regionFactory = new 
InternalRegionFactory<>(cache);
+    regionFactory.setInternalRegion(true);
+    InternalRegionArguments internalRegionArguments = 
regionFactory.getInternalRegionArguments();
     String regionName = "regionName";
     Region<Object, Object> expectedRegion = mock(Region.class);
     when(cache.createVMRegion(same(regionName), any(), 
same(internalRegionArguments)))
@@ -64,12 +65,39 @@ public class RegionFactoryImplTest {
 
   @Test
   public void createWithoutInternalRegionArgumentsCallsCreateRegion() throws 
Exception {
-    RegionFactoryImpl<Object, Object> regionFactory = new 
RegionFactoryImpl<>(cache);
-    regionFactory.setInternalRegionArguments(null);
+    InternalRegionFactory<Object, Object> regionFactory = new 
InternalRegionFactory<>(cache);
     String regionName = "regionName";
 
     regionFactory.create(regionName);
 
     verify(cache).createRegion(same(regionName), any());
   }
+
+  @Test
+  public void createSubregionWithInternalRegionArgumentsReturnsRegion() throws 
Exception {
+    InternalRegionFactory<Object, Object> regionFactory = new 
InternalRegionFactory<>(cache);
+    regionFactory.setInternalRegion(true);
+    InternalRegionArguments internalRegionArguments = 
regionFactory.getInternalRegionArguments();
+    String regionName = "regionName";
+    Region<Object, Object> expectedRegion = mock(Region.class);
+    InternalRegion parent = mock(InternalRegion.class);
+    when(parent.createSubregion(same(regionName), any(), 
same(internalRegionArguments)))
+        .thenReturn(expectedRegion);
+
+    Region<Object, Object> region = regionFactory.createSubregion(parent, 
regionName);
+
+    assertThat(region).isSameAs(expectedRegion);
+  }
+
+  @Test
+  public void 
createSubregionWithoutInternalRegionArgumentsCallsParentCreateSubregion()
+      throws Exception {
+    InternalRegionFactory<Object, Object> regionFactory = new 
InternalRegionFactory<>(cache);
+    String regionName = "regionName";
+    Region<?, ?> parent = mock(InternalRegion.class);
+
+    regionFactory.createSubregion(parent, regionName);
+
+    verify(parent).createSubregion(same(regionName), any());
+  }
 }
diff --git 
a/geode-core/src/test/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderQueueJUnitTest.java
 
b/geode-core/src/test/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderQueueJUnitTest.java
index 88c3e45..e7ca1a3 100644
--- 
a/geode-core/src/test/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderQueueJUnitTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderQueueJUnitTest.java
@@ -42,6 +42,7 @@ import 
org.apache.geode.internal.cache.AbstractBucketRegionQueue;
 import org.apache.geode.internal.cache.BucketRegionQueue;
 import org.apache.geode.internal.cache.DistributedRegion;
 import org.apache.geode.internal.cache.GemFireCacheImpl;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.cache.PartitionedRegion;
 import org.apache.geode.internal.cache.PartitionedRegionDataStore;
 import org.apache.geode.internal.cache.wan.AbstractGatewaySender;
@@ -150,7 +151,9 @@ public class ParallelGatewaySenderQueueJUnitTest {
     when(mockMetaRegion.getDataStore()).thenReturn(dataStore);
     when(dataStore.getSizeOfLocalPrimaryBuckets()).thenReturn(3);
     when(metaRegionFactory.newMetataRegion(any(), any(), any(), 
any())).thenReturn(mockMetaRegion);
-    when(cache.createVMRegion(any(), any(), any())).thenReturn(mockMetaRegion);
+    InternalRegionFactory regionFactory = mock(InternalRegionFactory.class);
+    when(regionFactory.create(any())).thenReturn(mockMetaRegion);
+    when(cache.createInternalRegionFactory(any())).thenReturn(regionFactory);
 
     queue.addShadowPartitionedRegionForUserPR(mockPR("region1"));
 
diff --git 
a/geode-core/src/test/java/org/apache/geode/management/internal/FederatingManagerTest.java
 
b/geode-core/src/test/java/org/apache/geode/management/internal/FederatingManagerTest.java
index e6f9601..1b89f79 100644
--- 
a/geode-core/src/test/java/org/apache/geode/management/internal/FederatingManagerTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/management/internal/FederatingManagerTest.java
@@ -42,9 +42,10 @@ import 
org.apache.geode.distributed.DistributedSystemDisconnectedException;
 import org.apache.geode.distributed.internal.DistributionManager;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import 
org.apache.geode.distributed.internal.membership.InternalDistributedMember;
+import org.apache.geode.internal.cache.HasCachePerfStats;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.InternalCacheForClientAccess;
-import org.apache.geode.internal.cache.InternalRegionArguments;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.statistics.StatisticsClock;
 import org.apache.geode.management.DistributedSystemMXBean;
 import org.apache.geode.test.junit.categories.JMXTest;
@@ -63,6 +64,8 @@ public class FederatingManagerTest {
   private StatisticsFactory statisticsFactory;
   private StatisticsClock statisticsClock;
   private InternalDistributedSystem system;
+  private InternalRegionFactory regionFactory1;
+  private InternalRegionFactory regionFactory2;
 
   @Before
   public void setUp() throws Exception {
@@ -77,13 +80,17 @@ public class FederatingManagerTest {
     statisticsClock = mock(StatisticsClock.class);
     statisticsFactory = mock(StatisticsFactory.class);
     system = mock(InternalDistributedSystem.class);
+    regionFactory1 = mock(InternalRegionFactory.class);
+    regionFactory2 = mock(InternalRegionFactory.class);
 
     DistributedSystemMXBean distributedSystemMXBean = 
mock(DistributedSystemMXBean.class);
 
     when(cache.getCacheForProcessingClientRequests())
         .thenReturn(cacheForClientAccess);
-    when(cacheForClientAccess.createInternalRegion(any(), any(), any()))
-        .thenReturn(mock(Region.class));
+    
when(cacheForClientAccess.createInternalRegionFactory()).thenReturn(regionFactory1)
+        .thenReturn(regionFactory2);
+    when(regionFactory1.create(any())).thenReturn(mock(Region.class));
+    when(regionFactory2.create(any())).thenReturn(mock(Region.class));
     when(distributedSystemMXBean.getAlertLevel())
         .thenReturn(AlertLevel.WARNING.name());
     when(jmxAdapter.getDistributedSystemMXBean())
@@ -100,8 +107,7 @@ public class FederatingManagerTest {
 
     federatingManager.addMemberArtifacts(member(1, 20));
 
-    verify(cacheForClientAccess)
-        .createInternalRegion(eq("_monitoringRegion_null<v1>20"), any(), 
any());
+    verify(regionFactory1).create(eq("_monitoringRegion_null<v1>20"));
   }
 
   @Test
@@ -112,43 +118,35 @@ public class FederatingManagerTest {
 
     federatingManager.addMemberArtifacts(member(2, 40));
 
-    ArgumentCaptor<InternalRegionArguments> captor =
-        ArgumentCaptor.forClass(InternalRegionArguments.class);
-    verify(cacheForClientAccess)
-        .createInternalRegion(eq("_monitoringRegion_null<v2>40"), any(), 
captor.capture());
-    boolean hasOwnStats = 
captor.getValue().getCachePerfStatsHolder().hasOwnStats();
-    assertThat(hasOwnStats)
-        .isTrue();
+    ArgumentCaptor<HasCachePerfStats> captor =
+        ArgumentCaptor.forClass(HasCachePerfStats.class);
+    verify(regionFactory1).setCachePerfStatsHolder(captor.capture());
+    assertThat(captor.getValue().hasOwnStats()).isTrue();
   }
 
   @Test
-  public void addMemberArtifactsCreatesNotificationRegion() throws Exception {
+  public void addMemberArtifactsCreatesNotificationRegion() {
     FederatingManager federatingManager = new FederatingManager(repo, system, 
service, cache,
         statisticsFactory, statisticsClock, proxyFactory, messenger, 
executorService);
     federatingManager.startManager();
 
     federatingManager.addMemberArtifacts(member(3, 60));
 
-    verify(cacheForClientAccess)
-        .createInternalRegion(eq("_notificationRegion_null<v3>60"), any(), 
any());
+    verify(regionFactory2).create(eq("_notificationRegion_null<v3>60"));
   }
 
   @Test
-  public void addMemberArtifactsCreatesNotificationRegionWithHasOwnStats() 
throws Exception {
+  public void addMemberArtifactsCreatesNotificationRegionWithHasOwnStats() {
     FederatingManager federatingManager = new FederatingManager(repo, system, 
service, cache,
         statisticsFactory, statisticsClock, proxyFactory, messenger, 
executorService);
     federatingManager.startManager();
 
     federatingManager.addMemberArtifacts(member(4, 80));
 
-    ArgumentCaptor<InternalRegionArguments> captor =
-        ArgumentCaptor.forClass(InternalRegionArguments.class);
-    verify(cacheForClientAccess)
-        .createInternalRegion(eq("_notificationRegion_null<v4>80"), any(), 
captor.capture());
-
-    InternalRegionArguments internalRegionArguments = captor.getValue();
-    assertThat(internalRegionArguments.getCachePerfStatsHolder().hasOwnStats())
-        .isTrue();
+    ArgumentCaptor<HasCachePerfStats> captor =
+        ArgumentCaptor.forClass(HasCachePerfStats.class);
+    verify(regionFactory2).setCachePerfStatsHolder(captor.capture());
+    assertThat(captor.getValue().hasOwnStats()).isTrue();
   }
 
   @Test
diff --git 
a/geode-core/src/test/java/org/apache/geode/management/internal/LocalManagerTest.java
 
b/geode-core/src/test/java/org/apache/geode/management/internal/LocalManagerTest.java
index 451cc9a..a39c8d0 100644
--- 
a/geode-core/src/test/java/org/apache/geode/management/internal/LocalManagerTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/management/internal/LocalManagerTest.java
@@ -16,7 +16,6 @@ package org.apache.geode.management.internal;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.powermock.api.mockito.PowerMockito.when;
@@ -37,7 +36,7 @@ import 
org.apache.geode.distributed.internal.membership.InternalDistributedMembe
 import org.apache.geode.internal.cache.HasCachePerfStats;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.InternalCacheForClientAccess;
-import org.apache.geode.internal.cache.InternalRegionArguments;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.statistics.StatisticsClock;
 import org.apache.geode.management.DistributedSystemMXBean;
 
@@ -47,6 +46,8 @@ public class LocalManagerTest {
   private InternalDistributedSystem system;
   private SystemManagementService service;
   private InternalCache cache;
+  private InternalRegionFactory regionFactory1;
+  private InternalRegionFactory regionFactory2;
   private StatisticsFactory statisticsFactory;
   private StatisticsClock statisticsClock;
   private InternalCacheForClientAccess cacheForClientAccess;
@@ -57,6 +58,8 @@ public class LocalManagerTest {
     system = mock(InternalDistributedSystem.class);
     service = mock(SystemManagementService.class);
     cache = mock(InternalCache.class);
+    regionFactory1 = mock(InternalRegionFactory.class);
+    regionFactory2 = mock(InternalRegionFactory.class);
     statisticsFactory = mock(StatisticsFactory.class);
     statisticsClock = mock(StatisticsClock.class);
     cacheForClientAccess = mock(InternalCacheForClientAccess.class);
@@ -65,8 +68,10 @@ public class LocalManagerTest {
 
     when(cache.getCacheForProcessingClientRequests())
         .thenReturn(cacheForClientAccess);
-    when(cacheForClientAccess.createInternalRegion(any(), any(), any()))
-        .thenReturn(mock(Region.class));
+    when(cacheForClientAccess.createInternalRegionFactory())
+        .thenReturn(regionFactory1).thenReturn(regionFactory2);
+    when(regionFactory1.create(any())).thenReturn(mock(Region.class));
+    when(regionFactory2.create(any())).thenReturn(mock(Region.class));
     when(config.getJmxManagerUpdateRate())
         .thenReturn(Integer.MAX_VALUE);
     when(distributedSystemMXBean.getAlertLevel())
@@ -86,8 +91,7 @@ public class LocalManagerTest {
 
     localManager.startManager();
 
-    
verify(cacheForClientAccess).createInternalRegion(eq("_monitoringRegion_null<v1>20"),
 any(),
-        any());
+    verify(regionFactory1).create("_monitoringRegion_null<v1>20");
   }
 
   @Test
@@ -99,14 +103,10 @@ public class LocalManagerTest {
 
     localManager.startManager();
 
-    ArgumentCaptor<InternalRegionArguments> captor =
-        ArgumentCaptor.forClass(InternalRegionArguments.class);
-    
verify(cacheForClientAccess).createInternalRegion(eq("_monitoringRegion_null<v2>40"),
 any(),
-        captor.capture());
-
-    InternalRegionArguments internalRegionArguments = captor.getValue();
-    HasCachePerfStats hasCachePerfStats = 
internalRegionArguments.getCachePerfStatsHolder();
-    assertThat(hasCachePerfStats.hasOwnStats()).isTrue();
+    ArgumentCaptor<HasCachePerfStats> captor =
+        ArgumentCaptor.forClass(HasCachePerfStats.class);
+    verify(regionFactory1).setCachePerfStatsHolder(captor.capture());
+    assertThat(captor.getValue().hasOwnStats()).isTrue();
   }
 
   @Test
@@ -118,8 +118,7 @@ public class LocalManagerTest {
 
     localManager.startManager();
 
-    
verify(cacheForClientAccess).createInternalRegion(eq("_notificationRegion_null<v3>60"),
 any(),
-        any());
+    verify(regionFactory2).create("_notificationRegion_null<v3>60");
   }
 
   @Test
@@ -131,14 +130,10 @@ public class LocalManagerTest {
 
     localManager.startManager();
 
-    ArgumentCaptor<InternalRegionArguments> captor =
-        ArgumentCaptor.forClass(InternalRegionArguments.class);
-    
verify(cacheForClientAccess).createInternalRegion(eq("_notificationRegion_null<v4>80"),
 any(),
-        captor.capture());
-
-    InternalRegionArguments internalRegionArguments = captor.getValue();
-    HasCachePerfStats hasCachePerfStats = 
internalRegionArguments.getCachePerfStatsHolder();
-    assertThat(hasCachePerfStats.hasOwnStats()).isTrue();
+    ArgumentCaptor<HasCachePerfStats> captor =
+        ArgumentCaptor.forClass(HasCachePerfStats.class);
+    verify(regionFactory2).setCachePerfStatsHolder(captor.capture());
+    assertThat(captor.getValue().hasOwnStats()).isTrue();
   }
 
   private InternalDistributedMember member(int viewId, int port) {
diff --git 
a/geode-core/src/test/java/org/apache/geode/management/internal/operation/RegionOperationStateStoreTest.java
 
b/geode-core/src/test/java/org/apache/geode/management/internal/operation/RegionOperationStateStoreTest.java
index 5a0676f..9f47b1e 100644
--- 
a/geode-core/src/test/java/org/apache/geode/management/internal/operation/RegionOperationStateStoreTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/management/internal/operation/RegionOperationStateStoreTest.java
@@ -38,7 +38,7 @@ import org.apache.geode.cache.DiskStoreFactory;
 import org.apache.geode.cache.Region;
 import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.internal.cache.RegionFactoryImpl;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.management.api.ClusterManagementOperation;
 import org.apache.geode.management.runtime.OperationResult;
 
@@ -159,8 +159,8 @@ public class RegionOperationStateStoreTest {
     when(diskStoreFactory.setDiskDirs(any())).thenReturn(diskStoreFactory);
     when(diskStoreFactory.setAutoCompact(true)).thenReturn(diskStoreFactory);
     when(diskStoreFactory.setMaxOplogSize(10)).thenReturn(diskStoreFactory);
-    RegionFactoryImpl regionFactory = mock(RegionFactoryImpl.class);
-    
when(cache.createRegionFactory(eq(RegionShortcut.REPLICATE))).thenReturn(regionFactory);
+    InternalRegionFactory regionFactory = mock(InternalRegionFactory.class);
+    
when(cache.createInternalRegionFactory(eq(RegionShortcut.REPLICATE))).thenReturn(regionFactory);
     Region region = mock(Region.class);
     when(regionFactory.create(OPERATION_STATE_REGION_NAME)).thenReturn(region);
 
diff --git 
a/geode-core/src/test/java/org/apache/geode/pdx/internal/PeerTypeRegistrationTest.java
 
b/geode-core/src/test/java/org/apache/geode/pdx/internal/PeerTypeRegistrationTest.java
index 9729841..cc59d08 100644
--- 
a/geode-core/src/test/java/org/apache/geode/pdx/internal/PeerTypeRegistrationTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/pdx/internal/PeerTypeRegistrationTest.java
@@ -38,15 +38,16 @@ import org.mockito.internal.util.reflection.FieldSetter;
 import org.apache.geode.CancelCriterion;
 import org.apache.geode.Statistics;
 import org.apache.geode.StatisticsType;
-import org.apache.geode.cache.AttributesFactory;
 import org.apache.geode.cache.DataPolicy;
 import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionExistsException;
 import org.apache.geode.distributed.DistributedLockService;
 import org.apache.geode.distributed.internal.DistributionManager;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.internal.cache.CacheConfig;
 import org.apache.geode.internal.cache.DiskStoreImpl;
 import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.cache.TXManagerImpl;
 import org.apache.geode.internal.cache.TXStateProxy;
 import org.apache.geode.internal.statistics.StatisticsManager;
@@ -64,8 +65,7 @@ public class PeerTypeRegistrationTest {
   @SuppressWarnings("unchecked")
   private final Region<Object, Object> region = mock(Region.class);
   private final TXManagerImpl txManager = mock(TXManagerImpl.class);
-  @SuppressWarnings("deprecation")
-  private final AttributesFactory factory = mock(AttributesFactory.class);
+  private final InternalRegionFactory factory = 
mock(InternalRegionFactory.class);
 
   @Before
   public void setUp() throws IOException, ClassNotFoundException {
@@ -74,8 +74,8 @@ public class PeerTypeRegistrationTest {
     when(statisticsManager.createAtomicStatistics(any(), 
any())).thenReturn(statistics);
     
when(internalDistributedSystem.getStatisticsManager()).thenReturn(statisticsManager);
     
when(internalCache.getInternalDistributedSystem()).thenReturn(internalDistributedSystem);
-    when(internalCache.createVMRegion(eq(PeerTypeRegistration.REGION_NAME), 
any(), any()))
-        .thenReturn(region);
+    when(internalCache.createInternalRegionFactory()).thenReturn(factory);
+    
when(factory.create(eq(PeerTypeRegistration.REGION_NAME))).thenReturn(region);
     when(region.getRegionService()).thenReturn(internalCache);
     when(internalCache.getCacheTransactionManager()).thenReturn(txManager);
   }
@@ -124,7 +124,7 @@ public class PeerTypeRegistrationTest {
   @Test
   public void pdxPersistenceIsSetWithUserDefinedDiskStore() throws 
NoSuchFieldException {
     PeerTypeRegistration peerTypeRegistration = spy(new 
PeerTypeRegistration(internalCache));
-    doReturn(factory).when(peerTypeRegistration).getAttributesFactory();
+    doReturn(factory).when(internalCache).createRegionFactory();
     when(internalCache.getPdxPersistent()).thenReturn(true);
     CacheConfig config = mock(CacheConfig.class);
     when(internalCache.getCacheConfig()).thenReturn(config);
@@ -142,7 +142,7 @@ public class PeerTypeRegistrationTest {
   @Test
   public void pdxPersistenceIsSetWithDefaultDiskStore() {
     PeerTypeRegistration peerTypeRegistration = spy(new 
PeerTypeRegistration(internalCache));
-    doReturn(factory).when(peerTypeRegistration).getAttributesFactory();
+    doReturn(factory).when(internalCache).createRegionFactory();
     when(internalCache.getPdxPersistent()).thenReturn(true);
     CacheConfig config = mock(CacheConfig.class);
     when(internalCache.getCacheConfig()).thenReturn(config);
@@ -161,7 +161,7 @@ public class PeerTypeRegistrationTest {
   @Test
   public void pdxPersistenceIsNotSetWhenPdxPersistenceIsFalse() {
     PeerTypeRegistration peerTypeRegistration = spy(new 
PeerTypeRegistration(internalCache));
-    doReturn(factory).when(peerTypeRegistration).getAttributesFactory();
+    doReturn(factory).when(internalCache).createRegionFactory();
 
     peerTypeRegistration.initialize();
 
@@ -172,7 +172,7 @@ public class PeerTypeRegistrationTest {
   @Test(expected = PdxInitializationException.class)
   public void 
pdxInitializationExceptionIsThrownInInitializeWhenRegionCreationFails()
       throws IOException, ClassNotFoundException {
-    doThrow(new IOException()).when(internalCache).createVMRegion(any(), 
any(), any());
+    doThrow(new RegionExistsException(region)).when(factory).create(any());
     PeerTypeRegistration peerTypeRegistration = new 
PeerTypeRegistration(internalCache);
     peerTypeRegistration.initialize();
   }
diff --git 
a/geode-dunit/src/main/java/org/apache/geode/management/internal/cli/commands/ExportLogsDistributedTestBase.java
 
b/geode-dunit/src/main/java/org/apache/geode/management/internal/cli/commands/ExportLogsDistributedTestBase.java
index 7fb86bb..f9d4c44 100644
--- 
a/geode-dunit/src/main/java/org/apache/geode/management/internal/cli/commands/ExportLogsDistributedTestBase.java
+++ 
b/geode-dunit/src/main/java/org/apache/geode/management/internal/cli/commands/ExportLogsDistributedTestBase.java
@@ -248,7 +248,7 @@ public class ExportLogsDistributedTestBase {
   }
 
   @Test
-  public void exportLogsRegionIsCleanedUpProperly() throws IOException, 
ClassNotFoundException {
+  public void exportLogsRegionIsCleanedUpProperly() {
     locator.invoke(() -> {
       GemFireCacheImpl cache = GemFireCacheImpl.getInstance();
       ExportLogsFunction.createOrGetExistingExportLogsRegion(true, cache);
diff --git 
a/geode-experimental-driver/src/integrationTest/java/org/apache/geode/experimental/driver/AuthorizationTest.java
 
b/geode-experimental-driver/src/integrationTest/java/org/apache/geode/experimental/driver/AuthorizationTest.java
index 44f2fe5..b6ba552 100644
--- 
a/geode-experimental-driver/src/integrationTest/java/org/apache/geode/experimental/driver/AuthorizationTest.java
+++ 
b/geode-experimental-driver/src/integrationTest/java/org/apache/geode/experimental/driver/AuthorizationTest.java
@@ -29,15 +29,14 @@ import org.junit.experimental.categories.Category;
 
 import org.apache.geode.cache.Cache;
 import org.apache.geode.cache.CacheFactory;
-import org.apache.geode.cache.RegionAttributes;
 import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.cache.server.CacheServer;
 import org.apache.geode.distributed.ConfigurationProperties;
 import org.apache.geode.distributed.Locator;
 import org.apache.geode.examples.SimpleSecurityManager;
-import org.apache.geode.internal.cache.GemFireCacheImpl;
-import org.apache.geode.internal.cache.InternalRegionArguments;
-import org.apache.geode.internal.cache.LocalRegion;
+import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.internal.cache.InternalRegion;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.test.junit.categories.ClientServerTest;
 
 @Category({ClientServerTest.class})
@@ -76,14 +75,11 @@ public class AuthorizationTest {
   @Test
   public void performOperationsOnInternalRegion() throws Exception {
     // we need to use internal APIs to create an "internal" region
-    GemFireCacheImpl serverCache = (GemFireCacheImpl) cache;
-    InternalRegionArguments internalRegionArguments = new 
InternalRegionArguments();
-    internalRegionArguments.setIsUsedForPartitionedRegionAdmin(true);
-    RegionAttributes<String, String> attributes =
-        serverCache.getRegionAttributes(RegionShortcut.REPLICATE.toString());
-    LocalRegion serverRegion =
-        (LocalRegion) serverCache.createVMRegion("internalRegion", attributes,
-            internalRegionArguments);
+    InternalCache serverCache = (InternalCache) cache;
+    InternalRegionFactory<String, String> regionFactory =
+        serverCache.createInternalRegionFactory(RegionShortcut.REPLICATE);
+    regionFactory.setIsUsedForPartitionedRegionAdmin(true);
+    InternalRegion serverRegion = (InternalRegion) 
regionFactory.create("internalRegion");
     assertThat(serverRegion.isInternalRegion()).isTrue();
 
     CacheServer server = cache.addCacheServer();
diff --git 
a/geode-gfsh/src/integrationTest/java/org/apache/geode/management/internal/cli/functions/ExportLogsFunctionIntegrationTest.java
 
b/geode-gfsh/src/integrationTest/java/org/apache/geode/management/internal/cli/functions/ExportLogsFunctionIntegrationTest.java
index c19205b..7a678de 100644
--- 
a/geode-gfsh/src/integrationTest/java/org/apache/geode/management/internal/cli/functions/ExportLogsFunctionIntegrationTest.java
+++ 
b/geode-gfsh/src/integrationTest/java/org/apache/geode/management/internal/cli/functions/ExportLogsFunctionIntegrationTest.java
@@ -64,14 +64,14 @@ public class ExportLogsFunctionIntegrationTest {
   }
 
   @Test
-  public void createOrGetExistingExportLogsRegionDoesNotBlowUp() throws 
Exception {
+  public void createOrGetExistingExportLogsRegionDoesNotBlowUp() {
     GemFireCacheImpl cache = GemFireCacheImpl.getInstance();
     ExportLogsFunction.createOrGetExistingExportLogsRegion(false, cache);
     
assertThat(cache.getRegion(ExportLogsFunction.EXPORT_LOGS_REGION)).isNotNull();
   }
 
   @Test
-  public void destroyExportLogsRegionWorksAsExpectedForInitiatingMember() 
throws Exception {
+  public void destroyExportLogsRegionWorksAsExpectedForInitiatingMember() {
     GemFireCacheImpl cache = GemFireCacheImpl.getInstance();
     ExportLogsFunction.createOrGetExistingExportLogsRegion(true, cache);
     
assertThat(cache.getRegion(ExportLogsFunction.EXPORT_LOGS_REGION)).isNotNull();
diff --git 
a/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/functions/ExportLogsFunction.java
 
b/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/functions/ExportLogsFunction.java
index 2706deb..3e07dcb 100644
--- 
a/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/functions/ExportLogsFunction.java
+++ 
b/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/functions/ExportLogsFunction.java
@@ -17,7 +17,6 @@ package org.apache.geode.management.internal.cli.functions;
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.IOException;
 import java.io.Serializable;
 import java.nio.file.Path;
 import java.text.ParseException;
@@ -30,15 +29,13 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Logger;
 
-import org.apache.geode.cache.AttributesFactory;
-import org.apache.geode.cache.DataPolicy;
 import org.apache.geode.cache.Region;
-import org.apache.geode.cache.Scope;
+import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.InternalCacheForClientAccess;
-import org.apache.geode.internal.cache.InternalRegionArguments;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.cache.execute.InternalFunction;
 import org.apache.geode.logging.internal.log4j.LogLevel;
 import org.apache.geode.logging.internal.log4j.api.LogService;
@@ -46,7 +43,6 @@ import 
org.apache.geode.management.internal.cli.commands.ExportLogsCommand;
 import org.apache.geode.management.internal.cli.util.ExportLogsCacheWriter;
 import org.apache.geode.management.internal.cli.util.LogExporter;
 import org.apache.geode.management.internal.cli.util.LogFilter;
-import org.apache.geode.management.internal.configuration.domain.Configuration;
 
 /**
  * this function extracts the logs using a LogExporter which creates a zip 
file, and then writes the
@@ -120,23 +116,18 @@ public class ExportLogsFunction implements 
InternalFunction {
   }
 
   public static Region createOrGetExistingExportLogsRegion(boolean 
isInitiatingMember,
-      InternalCache cache) throws IOException, ClassNotFoundException {
+      InternalCache cache) {
 
     InternalCacheForClientAccess cacheForClientAccess = 
cache.getCacheForProcessingClientRequests();
     Region exportLogsRegion = 
cacheForClientAccess.getInternalRegion(EXPORT_LOGS_REGION);
     if (exportLogsRegion == null) {
-      AttributesFactory<String, Configuration> regionAttrsFactory = new 
AttributesFactory<>();
-      regionAttrsFactory.setDataPolicy(DataPolicy.EMPTY);
-      regionAttrsFactory.setScope(Scope.DISTRIBUTED_ACK);
-
+      InternalRegionFactory<Object, Object> regionFactory =
+          
cacheForClientAccess.createInternalRegionFactory(RegionShortcut.REPLICATE_PROXY);
       if (isInitiatingMember) {
-        regionAttrsFactory.setCacheWriter(new ExportLogsCacheWriter());
+        regionFactory.setCacheWriter(new ExportLogsCacheWriter());
       }
-      InternalRegionArguments internalArgs = new InternalRegionArguments();
-      internalArgs.setIsUsedForMetaRegion(true);
-      exportLogsRegion =
-          cacheForClientAccess.createInternalRegion(EXPORT_LOGS_REGION, 
regionAttrsFactory.create(),
-              internalArgs);
+      regionFactory.setIsUsedForMetaRegion(true);
+      exportLogsRegion = regionFactory.create(EXPORT_LOGS_REGION);
     }
 
     return exportLogsRegion;
diff --git 
a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/PartitionedRepositoryManagerJUnitTest.java
 
b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/PartitionedRepositoryManagerJUnitTest.java
index ab99a3a..4a166a4 100644
--- 
a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/PartitionedRepositoryManagerJUnitTest.java
+++ 
b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/PartitionedRepositoryManagerJUnitTest.java
@@ -60,6 +60,7 @@ import org.apache.geode.internal.cache.BucketRegion;
 import org.apache.geode.internal.cache.CacheDistributionAdvisor;
 import org.apache.geode.internal.cache.DistributedRegion;
 import org.apache.geode.internal.cache.GemFireCacheImpl;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.cache.PartitionRegionConfig;
 import org.apache.geode.internal.cache.PartitionedRegion;
 import org.apache.geode.internal.cache.PartitionedRegion.RetryTimeKeeper;
@@ -136,7 +137,9 @@ public class PartitionedRepositoryManagerJUnitTest {
     CacheDistributionAdvisor cda = mock(CacheDistributionAdvisor.class);
     when(prRoot.getDistributionAdvisor()).thenReturn(cda);
     doNothing().when(cda).addMembershipListener(any());
-    when(cache.createVMRegion(eq(PR_ROOT_REGION_NAME), any(), 
any())).thenReturn(prRoot);
+    InternalRegionFactory regionFactory = mock(InternalRegionFactory.class);
+    when(regionFactory.create(eq(PR_ROOT_REGION_NAME))).thenReturn(prRoot);
+    when(cache.createInternalRegionFactory(any())).thenReturn(regionFactory);
 
     prConfig = Mockito.mock(PartitionRegionConfig.class);
     when(prConfig.isColocationComplete()).thenReturn(true);
diff --git 
a/geode-redis/src/main/java/org/apache/geode/redis/GeodeRedisServer.java 
b/geode-redis/src/main/java/org/apache/geode/redis/GeodeRedisServer.java
index 0c639e5..27748de 100644
--- a/geode-redis/src/main/java/org/apache/geode/redis/GeodeRedisServer.java
+++ b/geode-redis/src/main/java/org/apache/geode/redis/GeodeRedisServer.java
@@ -46,7 +46,6 @@ import io.netty.channel.socket.nio.NioServerSocketChannel;
 import io.netty.channel.socket.oio.OioServerSocketChannel;
 import io.netty.util.concurrent.Future;
 
-import org.apache.geode.InternalGemFireError;
 import org.apache.geode.LogWriter;
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.annotations.internal.MakeNotStatic;
@@ -62,8 +61,7 @@ import org.apache.geode.cache.util.CacheListenerAdapter;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.internal.cache.GemFireCacheImpl;
 import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.internal.cache.InternalRegionArguments;
-import org.apache.geode.internal.cache.xmlcache.RegionAttributesCreation;
+import org.apache.geode.internal.cache.InternalRegionFactory;
 import org.apache.geode.internal.hll.HyperLogLogPlus;
 import org.apache.geode.internal.inet.LocalHostUtil;
 import org.apache.geode.redis.internal.ByteArrayWrapper;
@@ -420,35 +418,25 @@ public class GeodeRedisServer {
       Region<ByteArrayWrapper, ByteArrayWrapper> stringsRegion;
 
       Region<ByteArrayWrapper, HyperLogLogPlus> hLLRegion;
-      Region<String, RedisDataType> redisMetaData;
+      Region redisMetaData;
       InternalCache gemFireCache = (InternalCache) cache;
-      try {
-        if ((stringsRegion = cache.getRegion(STRING_REGION)) == null) {
-          RegionFactory<ByteArrayWrapper, ByteArrayWrapper> regionFactory =
-              gemFireCache.createRegionFactory(this.DEFAULT_REGION_TYPE);
-          stringsRegion = regionFactory.create(STRING_REGION);
-        }
-        if ((hLLRegion = cache.getRegion(HLL_REGION)) == null) {
-          RegionFactory<ByteArrayWrapper, HyperLogLogPlus> regionFactory =
-              gemFireCache.createRegionFactory(this.DEFAULT_REGION_TYPE);
-          hLLRegion = regionFactory.create(HLL_REGION);
-        }
-        if ((redisMetaData = cache.getRegion(REDIS_META_DATA_REGION)) == null) 
{
-          RegionAttributesCreation regionAttributesCreation = new 
RegionAttributesCreation();
-          regionAttributesCreation.addCacheListener(metaListener);
-          regionAttributesCreation.setDataPolicy(DataPolicy.REPLICATE);
-          InternalRegionArguments ira =
-              new 
InternalRegionArguments().setInternalRegion(true).setIsUsedForMetaRegion(true);
-          redisMetaData =
-              gemFireCache.createVMRegion(REDIS_META_DATA_REGION, 
regionAttributesCreation, ira);
-        }
-
-      } catch (IOException | ClassNotFoundException e) {
-        // only if loading snapshot, not here
-        InternalGemFireError assErr = new InternalGemFireError(
-            "unexpected exception");
-        assErr.initCause(e);
-        throw assErr;
+      if ((stringsRegion = cache.getRegion(STRING_REGION)) == null) {
+        RegionFactory<ByteArrayWrapper, ByteArrayWrapper> regionFactory =
+            gemFireCache.createRegionFactory(this.DEFAULT_REGION_TYPE);
+        stringsRegion = regionFactory.create(STRING_REGION);
+      }
+      if ((hLLRegion = cache.getRegion(HLL_REGION)) == null) {
+        RegionFactory<ByteArrayWrapper, HyperLogLogPlus> regionFactory =
+            gemFireCache.createRegionFactory(this.DEFAULT_REGION_TYPE);
+        hLLRegion = regionFactory.create(HLL_REGION);
+      }
+      if ((redisMetaData = cache.getRegion(REDIS_META_DATA_REGION)) == null) {
+        InternalRegionFactory<String, RedisDataType> redisMetaDataFactory =
+            gemFireCache.createInternalRegionFactory();
+        redisMetaDataFactory.addCacheListener(metaListener);
+        redisMetaDataFactory.setDataPolicy(DataPolicy.REPLICATE);
+        
redisMetaDataFactory.setInternalRegion(true).setIsUsedForMetaRegion(true);
+        redisMetaData = redisMetaDataFactory.create(REDIS_META_DATA_REGION);
       }
       this.keyRegistrar = new KeyRegistrar(redisMetaData);
       this.pubSub = new PubSubImpl(new Subscriptions());

Reply via email to