You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jl...@apache.org on 2023/05/11 05:41:02 UTC

[cassandra] branch trunk updated: Moved system properties and envs to CassandraRelevantProperties and CassandraRelevantEnv respectively

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

jlewandowski pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/trunk by this push:
     new f650908648 Moved system properties and envs to CassandraRelevantProperties and CassandraRelevantEnv respectively
f650908648 is described below

commit f6509086483983176f82a4b72912927693b6e573
Author: Maxim Muzafarov <ma...@gmail.com>
AuthorDate: Wed May 3 12:15:37 2023 +0200

    Moved system properties and envs to CassandraRelevantProperties and CassandraRelevantEnv respectively
    
    Patch by Maxim Muzafarov; reviewed by Stefan Miklosovic and Jacek Lewandowski for CASSANDRA-17797
---
 CHANGES.txt                                        |   1 +
 checkstyle.xml                                     |  18 +
 checkstyle_test.xml                                |  20 +-
 src/java/org/apache/cassandra/auth/AuthCache.java  |  20 +-
 .../org/apache/cassandra/auth/AuthKeyspace.java    |   3 +-
 .../cassandra/auth/CassandraRoleManager.java       |  16 +-
 .../apache/cassandra/batchlog/BatchlogManager.java |   3 +-
 .../org/apache/cassandra/concurrent/SEPWorker.java |   3 +-
 .../cassandra/config/CassandraRelevantEnv.java     |  17 +-
 .../config/CassandraRelevantProperties.java        | 757 +++++++++++++--------
 src/java/org/apache/cassandra/config/Config.java   |  13 +-
 .../cassandra/config/DatabaseDescriptor.java       |  72 +-
 .../cassandra/config/YamlConfigurationLoader.java  |   9 +-
 .../cql3/CustomPayloadMirroringQueryHandler.java   |   3 +-
 .../cql3/functions/UDFExecutorService.java         |   3 +-
 .../statements/schema/AlterKeyspaceStatement.java  |   8 +-
 .../statements/schema/CreateViewStatement.java     |   3 +-
 .../db/ExpirationDateOverflowHandling.java         |   9 +-
 src/java/org/apache/cassandra/db/Keyspace.java     |   5 +-
 src/java/org/apache/cassandra/db/ReadCommand.java  |   2 +-
 src/java/org/apache/cassandra/db/StorageHook.java  |   4 +-
 .../cassandra/db/commitlog/CommitLogReplayer.java  |  15 +-
 .../db/commitlog/CommitLogSegmentReader.java       |   5 +-
 .../db/compaction/AbstractCompactionStrategy.java  |   2 +-
 .../db/compaction/CompactionController.java        |  22 +-
 .../cassandra/db/compaction/CompactionLogger.java  |   3 +-
 .../db/compaction/LeveledCompactionStrategy.java   |   5 +-
 .../db/compaction/LeveledGenerations.java          |   4 +-
 .../TimeWindowCompactionStrategyOptions.java       |  12 +-
 .../db/guardrails/GuardrailsConfigProvider.java    |  13 +-
 .../org/apache/cassandra/db/marshal/EmptyType.java |   7 +-
 .../org/apache/cassandra/db/marshal/UserType.java  |   9 +-
 .../db/memtable/AbstractShardedMemtable.java       |   9 +-
 .../cassandra/db/monitoring/MonitoringTask.java    |  11 +-
 .../cassandra/db/repair/PendingAntiCompaction.java |   5 +-
 .../db/streaming/CassandraStreamReceiver.java      |   4 +-
 .../org/apache/cassandra/db/view/ViewManager.java  |   4 +-
 .../db/virtual/SystemPropertiesTable.java          |   8 +-
 .../org/apache/cassandra/gms/FailureDetector.java  |  75 +-
 src/java/org/apache/cassandra/gms/Gossiper.java    |  72 +-
 src/java/org/apache/cassandra/hints/Hint.java      |   3 +-
 .../apache/cassandra/hints/HintsBufferPool.java    |   4 +-
 .../cassandra/index/SecondaryIndexManager.java     |   3 +-
 .../org/apache/cassandra/io/sstable/SSTable.java   |   2 +-
 .../cassandra/io/sstable/SSTableHeaderFix.java     |   8 +-
 .../sstable/indexsummary/IndexSummaryBuilder.java  |   5 +-
 .../io/util/BufferedDataOutputStreamPlus.java      |   5 +-
 .../apache/cassandra/io/util/DataOutputBuffer.java |   7 +-
 .../cassandra/io/util/DataOutputStreamPlus.java    |   6 +-
 .../org/apache/cassandra/io/util/PathUtils.java    |   2 +-
 .../cassandra/locator/DynamicEndpointSnitch.java   |   4 +-
 .../apache/cassandra/locator/SnitchProperties.java |   6 +-
 .../DecayingEstimatedHistogramReservoir.java       |   3 +-
 .../cassandra/net/OutboundConnectionSettings.java  |   4 +-
 .../apache/cassandra/net/OutboundConnections.java  |   5 +-
 .../org/apache/cassandra/net/SocketFactory.java    |   4 +-
 .../cassandra/repair/consistent/LocalSessions.java |  16 +-
 .../apache/cassandra/schema/CompactionParams.java  |   9 +-
 .../schema/DefaultSchemaUpdateHandler.java         |   2 +-
 .../cassandra/schema/MigrationCoordinator.java     |   5 +-
 .../apache/cassandra/schema/SchemaKeyspace.java    |  10 +-
 .../schema/SchemaUpdateHandlerFactoryProvider.java |  11 +-
 .../security/AbstractSslContextFactory.java        |  10 +-
 .../org/apache/cassandra/security/SSLFactory.java  |   5 +-
 .../cassandra/service/ActiveRepairService.java     |  23 +-
 .../apache/cassandra/service/CassandraDaemon.java  |  17 +-
 .../org/apache/cassandra/service/ClientState.java  |   6 +-
 .../apache/cassandra/service/LoadBroadcaster.java  |   4 +-
 .../cassandra/service/NativeTransportService.java  |   4 +-
 .../apache/cassandra/service/StartupChecks.java    |   7 +-
 .../apache/cassandra/service/StorageService.java   |  65 +-
 .../org/apache/cassandra/service/paxos/Paxos.java  |   6 +-
 .../cassandra/service/paxos/PaxosCommit.java       |   3 +-
 .../cassandra/service/paxos/PaxosRepair.java       |   3 +-
 .../service/paxos/PaxosRequestCallback.java        |   2 +-
 .../apache/cassandra/service/paxos/PaxosState.java |   3 +-
 .../service/paxos/cleanup/PaxosCleanupSession.java |   3 +-
 .../paxos/uncommitted/PaxosStateTracker.java       |  21 +-
 .../paxos/uncommitted/PaxosUncommittedTracker.java |   9 +-
 .../service/reads/range/RangeCommands.java         |   4 +-
 .../service/reads/repair/BlockingReadRepairs.java  |   6 +-
 .../reads/thresholds/CoordinatorWarnings.java      |   4 +-
 .../org/apache/cassandra/streaming/StreamHook.java |   4 +-
 .../apache/cassandra/streaming/StreamSession.java  |   3 +-
 .../async/StreamingMultiplexedChannel.java         |   6 +-
 .../org/apache/cassandra/tools/HashPassword.java   |   2 +-
 src/java/org/apache/cassandra/tools/NodeProbe.java |   7 +-
 .../apache/cassandra/tools/StandaloneScrubber.java |   3 +-
 .../apache/cassandra/tools/StandaloneSplitter.java |   3 +-
 .../apache/cassandra/tools/StandaloneUpgrader.java |   3 +-
 .../apache/cassandra/tools/StandaloneVerifier.java |   3 +-
 src/java/org/apache/cassandra/tools/Util.java      |   1 -
 .../apache/cassandra/tracing/TraceStateImpl.java   |   4 +-
 src/java/org/apache/cassandra/tracing/Tracing.java |   6 +-
 .../org/apache/cassandra/transport/CBUtil.java     |   5 +-
 .../cassandra/transport/PipelineConfigurator.java  |   3 +-
 .../cassandra/utils/DiagnosticSnapshotService.java |   8 +-
 .../org/apache/cassandra/utils/FBUtilities.java    |  17 +-
 .../org/apache/cassandra/utils/GuidGenerator.java  |   2 +-
 .../org/apache/cassandra/utils/JMXServerUtils.java |  15 +-
 .../cassandra/utils/JVMStabilityInspector.java     |   4 +-
 .../org/apache/cassandra/utils/MBeanWrapper.java   |   4 +-
 .../org/apache/cassandra/utils/MonotonicClock.java |   8 +-
 src/java/org/apache/cassandra/utils/SyncUtil.java  |   9 +-
 src/java/org/apache/cassandra/utils/TimeUUID.java  |   6 +-
 .../org/apache/cassandra/utils/binlog/BinLog.java  |   3 +-
 .../org/apache/cassandra/utils/btree/BTree.java    |   3 +-
 .../org/apache/cassandra/utils/concurrent/Ref.java |   3 +-
 .../org/apache/cassandra/utils/LongBTreeTest.java  |   3 +-
 .../cassandra/distributed/action/GossipHelper.java |  14 +-
 .../cassandra/distributed/fuzz/HarryHelper.java    |  27 +-
 .../distributed/impl/AbstractCluster.java          |   2 +-
 .../cassandra/distributed/impl/Instance.java       |  15 +-
 .../cassandra/distributed/impl/TracingUtil.java    |  11 -
 .../cassandra/distributed/shared/Byteman.java      |   4 +-
 .../cassandra/distributed/shared/ClusterUtils.java |   9 +-
 .../distributed/shared/WithProperties.java         |  71 +-
 .../cassandra/distributed/test/AlterTest.java      |   3 +-
 .../test/BootstrapBinaryDisabledTest.java          |  13 +-
 .../distributed/test/CASContentionTest.java        |   3 +-
 .../apache/cassandra/distributed/test/CASTest.java |   3 +-
 .../test/DataResurrectionCheckTest.java            |   6 +-
 .../test/FailingResponseDoesNotLogTest.java        |   6 +-
 .../distributed/test/FailingTruncationTest.java    |   7 +-
 .../cassandra/distributed/test/GossipTest.java     |   3 +-
 .../distributed/test/IPMembershipTest.java         |   4 +-
 .../distributed/test/MessageForwardingTest.java    |  11 +-
 .../distributed/test/MigrationCoordinatorTest.java |  16 +-
 .../cassandra/distributed/test/MoveTest.java       |   3 +-
 .../distributed/test/NativeMixedVersionTest.java   |   6 +-
 .../distributed/test/NativeProtocolTest.java       |   3 +-
 .../distributed/test/PartitionDenylistTest.java    |   9 +-
 .../distributed/test/PaxosRepair2Test.java         |  16 +-
 .../distributed/test/PaxosRepairTest.java          |   2 +-
 .../cassandra/distributed/test/ReadRepairTest.java |   4 +-
 .../distributed/test/RepairCoordinatorBase.java    |   4 +-
 .../cassandra/distributed/test/TestBaseImpl.java   |   5 +-
 .../distributed/test/TimeoutAbortTest.java         |   3 +-
 .../test/UpdateSystemAuthAfterDCExpansionTest.java |   4 +-
 .../distributed/test/VirtualTableLogsTest.java     |   9 +-
 .../test/hostreplacement/FailedBootstrapTest.java  |   3 +-
 .../distributed/test/jmx/JMXGetterCheckTest.java   |   4 +-
 .../distributed/test/metric/TableMetricTest.java   |   4 +-
 .../distributed/test/ring/BootstrapTest.java       |  13 +-
 .../distributed/test/ring/CleanupFailureTest.java  |   3 +-
 .../distributed/test/ring/PendingWritesTest.java   |   4 +-
 .../LongLeveledCompactionStrategyCQLTest.java      |   4 +-
 .../cassandra/simulator/asm/InterceptAgent.java    |   2 +
 .../cassandra/simulator/asm/MethodLogger.java      |   2 +
 .../apache/cassandra/simulator/ActionSchedule.java |   3 +-
 .../cassandra/simulator/SimulationRunner.java      |  17 +-
 .../cassandra/simulator/paxos/PaxosSimulation.java |  10 +-
 .../cassandra/AbstractSerializationsTester.java    |   7 +-
 .../CassandraBriefJUnitResultFormatter.java        |   7 +-
 .../CassandraXMLJUnitResultFormatter.java          |   9 +-
 .../apache/cassandra/LogbackStatusListener.java    |  12 +-
 test/unit/org/apache/cassandra/SchemaLoader.java   |  11 +-
 .../cassandra/audit/AuditLoggerAuthTest.java       |   3 +-
 .../cassandra/audit/AuditLoggerCleanupTest.java    |   4 +-
 .../org/apache/cassandra/auth/AuthCacheTest.java   |   6 +-
 .../cassandra/auth/PasswordAuthenticatorTest.java  |  12 +-
 .../org/apache/cassandra/auth/jmx/JMXAuthTest.java |  12 +-
 .../config/CassandraRelevantPropertiesTest.java    |  94 ++-
 .../cassandra/config/DatabaseDescriptorTest.java   |  19 +-
 .../LoadOldYAMLBackwardCompatibilityTest.java      |   3 +-
 .../config/OverrideConfigurationLoader.java        |   4 +-
 .../config/YamlConfigurationLoaderTest.java        |  18 +-
 test/unit/org/apache/cassandra/cql3/CQLTester.java | 112 ++-
 .../unit/org/apache/cassandra/cql3/PagingTest.java |   3 +-
 .../apache/cassandra/cql3/ViewFiltering1Test.java  |   6 +-
 .../cql3/validation/entities/UFSecurityTest.java   |   4 +-
 .../cql3/validation/operations/TTLTest.java        |   6 +-
 .../unit/org/apache/cassandra/db/RowCacheTest.java |   3 +-
 .../db/commitlog/CommitLogFailurePolicyTest.java   |   4 +-
 .../cassandra/db/commitlog/CommitLogTest.java      | 171 +++--
 .../db/compaction/CompactionIteratorTest.java      |   3 +-
 .../cassandra/db/compaction/CompactionsTest.java   |   2 +-
 .../compaction/LeveledCompactionStrategyTest.java  |   2 +-
 .../cassandra/db/compaction/NeverPurgeTest.java    |   3 +-
 .../SizeTieredCompactionStrategyTest.java          |   2 +-
 .../cassandra/db/compaction/TTLExpiryTest.java     |   2 +-
 .../TimeWindowCompactionStrategyTest.java          |   6 +-
 .../apache/cassandra/db/rows/RowsMergingTest.java  |   4 +-
 .../db/transform/DuplicateRowCheckerTest.java      |   3 +-
 .../cassandra/db/virtual/LogMessagesTableTest.java |  10 +-
 .../db/virtual/SystemPropertiesTableTest.java      |   4 +-
 .../apache/cassandra/gms/FailureDetectorTest.java  |   3 +-
 .../org/apache/cassandra/gms/GossiperTest.java     |   3 +-
 .../gms/PendingRangeCalculatorServiceTest.java     |   3 +-
 .../org/apache/cassandra/gms/ShadowRoundTest.java  |  24 +-
 .../apache/cassandra/hints/HintWriteTTLTest.java   |   4 +-
 .../apache/cassandra/index/sasi/SASIIndexTest.java |   3 +-
 .../index/sasi/disk/PerSSTableIndexWriterTest.java |   4 +-
 .../cassandra/index/sasi/plan/OperationTest.java   |   4 +-
 .../cassandra/io/sstable/LegacySSTableTest.java    |   7 +-
 .../org/apache/cassandra/io/sstable/ScrubTest.java |  10 +-
 .../io/sstable/indexsummary/IndexSummaryTest.java  |   7 +-
 .../cassandra/locator/AlibabaCloudSnitchTest.java  |   3 +-
 .../cassandra/locator/CloudstackSnitchTest.java    |   3 +-
 .../apache/cassandra/locator/EC2SnitchTest.java    |   3 +-
 .../cassandra/locator/GoogleCloudSnitchTest.java   |   3 +-
 .../cassandra/locator/PropertyFileSnitchTest.java  |   3 +-
 .../cassandra/metrics/TrieMemtableMetricsTest.java |   4 +-
 .../org/apache/cassandra/net/ConnectionTest.java   |  10 +-
 .../net/MessageSerializationPropertyTest.java      |   9 +-
 .../schema/RemoveWithoutDroppingTest.java          |   3 +-
 .../CustomSslContextFactoryConfigTest.java         |   6 +-
 .../CustomSslContextFactoryInvalidConfigTest.java  |   6 +-
 .../security/DefaultSslContextFactoryTest.java     |   6 +-
 .../security/FileBasedSslContextFactoryTest.java   |   6 +-
 .../PEMBasedSslContextFactoryConfigTest.java       |   6 +-
 ...tFactoryConfigWithMismatchingPasswordsTest.java |   6 +-
 ...ontextFactoryConfigWithUnencryptedKeysTest.java |  10 +-
 ...PEMBasedSslContextFactoryInvalidConfigTest.java |   6 +-
 .../security/PEMBasedSslContextFactoryTest.java    |   5 +-
 .../PEMJKSSslContextFactoryConfigTest.java         |   6 +-
 .../AbstractFilesystemOwnershipCheckTest.java      |   8 +-
 .../apache/cassandra/service/ClientStateTest.java  |   5 +-
 .../cassandra/service/StartupChecksTest.java       |  14 +-
 .../service/StorageServiceServerM3PTest.java       |   4 +-
 .../service/StorageServiceServerTest.java          |  12 +-
 ...ropertiesBasedFileSystemOwnershipCheckTest.java |   4 +-
 .../service/paxos/PaxosRepairHistoryTest.java      |   3 +-
 .../paxos/uncommitted/PaxosStateTrackerTest.java   |  36 +-
 .../service/reads/range/RangeCommandsTest.java     |   5 +-
 .../apache/cassandra/tools/OfflineToolUtils.java   |   3 +-
 .../cassandra/tools/StandaloneSplitterTest.java    |   3 +-
 .../tools/StandaloneSplitterWithCQLTesterTest.java |   3 +-
 .../tools/StandaloneUpgraderOnSStablesTest.java    |   5 +-
 .../tools/StandaloneVerifierOnSSTablesTest.java    |   8 +-
 .../cassandra/tools/nodetool/ClientStatsTest.java  |   3 +-
 .../cassandra/tools/nodetool/ScrubToolTest.java    |   3 +-
 .../cassandra/transport/CQLUserAuditTest.java      |   3 +-
 .../org/apache/cassandra/utils/Generators.java     |   4 +-
 .../cassandra/utils/btree/BTreeRemovalTest.java    |   3 +-
 .../apache/cassandra/utils/btree/BTreeTest.java    |   3 +-
 236 files changed, 1768 insertions(+), 1217 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 656508064d..abeb753658 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 5.0
+ * Moved system properties and envs to CassandraRelevantProperties and CassandraRelevantEnv respectively (CASSANDRA-17797)
  * Add sstablepartitions offline tool to find large partitions in sstables (CASSANDRA-8720)
  * Replace usages of json-simple dependency by Jackson (CASSANDRA-16855)
  * When decommissioning should set Severity to limit traffic (CASSANDRA-18430)
diff --git a/checkstyle.xml b/checkstyle.xml
index 0f648d8bf4..fc77fdd4cd 100644
--- a/checkstyle.xml
+++ b/checkstyle.xml
@@ -149,6 +149,24 @@
       <property name="message" value="Avoid Short() and use Short.valueOf()" />
     </module>
 
+    <module name="SuppressionCommentFilter">
+      <property name="offCommentFormat" value="checkstyle: suppress below '([\w\|]+)'"/>
+      <property name="idFormat" value="$1"/>
+    </module>
+
+    <module name="SuppressWithNearbyCommentFilter">
+      <property name="commentFormat" value="checkstyle: suppress nearby '([\w\|]+)'"/>
+      <property name="idFormat" value="$1"/>
+      <property name="influenceFormat" value="0"/>
+    </module>
+
+    <module name="RegexpSinglelineJava">
+      <property name="id" value="blockSystemPropertyUsage"/>
+      <property name="format" value="(System\.getenv)|(System\.(getProperty|setProperty))|(Integer\.getInteger)|(Long\.getLong)|(Boolean\.getBoolean)"/>
+      <property name="ignoreComments" value="true"/>
+      <property name="message" value="Use the CassandraRelevantProperties or CassandraRelevantEnv instead." />
+    </module>
+
     <module name="RedundantImport"/>
     <module name="UnusedImports"/>
   </module>
diff --git a/checkstyle_test.xml b/checkstyle_test.xml
index aeeb31fd1f..d487a16c4c 100644
--- a/checkstyle_test.xml
+++ b/checkstyle_test.xml
@@ -99,7 +99,25 @@
       <property name="ignoreComments" value="true"/>
       <property name="message" value="Avoid Short() and use Short.valueOf()" />
     </module>
-       
+
+    <module name="SuppressionCommentFilter">
+      <property name="offCommentFormat" value="checkstyle: suppress below '([\w\|]+)'"/>
+      <property name="idFormat" value="$1"/>
+    </module>
+
+    <module name="SuppressWithNearbyCommentFilter">
+      <property name="commentFormat" value="checkstyle: suppress nearby '([\w\|]+)'"/>
+      <property name="idFormat" value="$1"/>
+      <property name="influenceFormat" value="0"/>
+    </module>
+
+    <module name="RegexpSinglelineJava">
+      <property name="id" value="blockSystemPropertyUsage"/>
+      <property name="format" value="(System\.getenv)|(System\.(getProperty|setProperty))|(Integer\.getInteger)|(Long\.getLong)|(Boolean\.getBoolean)"/>
+      <property name="ignoreComments" value="true"/>
+      <property name="message" value="Use the CassandraRelevantProperties or CassandraRelevantEnv instead." />
+    </module>
+
     <module name="RedundantImport"/>
     <module name="UnusedImports"/>
   </module>
diff --git a/src/java/org/apache/cassandra/auth/AuthCache.java b/src/java/org/apache/cassandra/auth/AuthCache.java
index 66a2a4fe5c..7d3a164cb4 100644
--- a/src/java/org/apache/cassandra/auth/AuthCache.java
+++ b/src/java/org/apache/cassandra/auth/AuthCache.java
@@ -48,6 +48,9 @@ import org.apache.cassandra.utils.MBeanWrapper;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.config.CassandraRelevantProperties.AUTH_CACHE_WARMING_MAX_RETRIES;
+import static org.apache.cassandra.config.CassandraRelevantProperties.AUTH_CACHE_WARMING_RETRY_INTERVAL_MS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.DISABLE_AUTH_CACHES_REMOTE_CONFIGURATION;
 
 public class AuthCache<K, V> implements AuthCacheMBean, Shutdownable
 {
@@ -55,11 +58,6 @@ public class AuthCache<K, V> implements AuthCacheMBean, Shutdownable
 
     public static final String MBEAN_NAME_BASE = "org.apache.cassandra.auth:type=";
 
-    // We expect default values on cache retries and interval to be sufficient for everyone but have this escape hatch
-    // just in case.
-    static final String CACHE_LOAD_RETRIES_PROPERTY = "cassandra.auth_cache.warming.max_retries";
-    static final String CACHE_LOAD_RETRY_INTERVAL_PROPERTY = "cassandra.auth_cache.warming.retry_interval_ms";
-
     private volatile ScheduledFuture cacheRefresher = null;
 
     // Keep a handle on created instances so their executors can be terminated cleanly
@@ -254,7 +252,7 @@ public class AuthCache<K, V> implements AuthCacheMBean, Shutdownable
      */
     public synchronized void setValidity(int validityPeriod)
     {
-        if (Boolean.getBoolean("cassandra.disable_auth_caches_remote_configuration"))
+        if (DISABLE_AUTH_CACHES_REMOTE_CONFIGURATION.getBoolean())
             throw new UnsupportedOperationException("Remote configuration of auth caches is disabled");
 
         setValidityDelegate.accept(validityPeriod);
@@ -272,7 +270,7 @@ public class AuthCache<K, V> implements AuthCacheMBean, Shutdownable
      */
     public synchronized void setUpdateInterval(int updateInterval)
     {
-        if (Boolean.getBoolean("cassandra.disable_auth_caches_remote_configuration"))
+        if (DISABLE_AUTH_CACHES_REMOTE_CONFIGURATION.getBoolean())
             throw new UnsupportedOperationException("Remote configuration of auth caches is disabled");
 
         setUpdateIntervalDelegate.accept(updateInterval);
@@ -290,7 +288,7 @@ public class AuthCache<K, V> implements AuthCacheMBean, Shutdownable
      */
     public synchronized void setMaxEntries(int maxEntries)
     {
-        if (Boolean.getBoolean("cassandra.disable_auth_caches_remote_configuration"))
+        if (DISABLE_AUTH_CACHES_REMOTE_CONFIGURATION.getBoolean())
             throw new UnsupportedOperationException("Remote configuration of auth caches is disabled");
 
         setMaxEntriesDelegate.accept(maxEntries);
@@ -309,7 +307,7 @@ public class AuthCache<K, V> implements AuthCacheMBean, Shutdownable
 
     public synchronized void setActiveUpdate(boolean update)
     {
-        if (Boolean.getBoolean("cassandra.disable_auth_caches_remote_configuration"))
+        if (DISABLE_AUTH_CACHES_REMOTE_CONFIGURATION.getBoolean())
             throw new UnsupportedOperationException("Remote configuration of auth caches is disabled");
 
         setActiveUpdate.accept(update);
@@ -409,8 +407,8 @@ public class AuthCache<K, V> implements AuthCacheMBean, Shutdownable
             return;
         }
 
-        int retries = Integer.getInteger(CACHE_LOAD_RETRIES_PROPERTY, 10);
-        long retryInterval = Long.getLong(CACHE_LOAD_RETRY_INTERVAL_PROPERTY, 1000);
+        int retries = AUTH_CACHE_WARMING_MAX_RETRIES.getInt(10);
+        long retryInterval = AUTH_CACHE_WARMING_RETRY_INTERVAL_MS.getLong(1000);
 
         while (retries-- > 0)
         {
diff --git a/src/java/org/apache/cassandra/auth/AuthKeyspace.java b/src/java/org/apache/cassandra/auth/AuthKeyspace.java
index 67fc9c1a06..f0a3da891c 100644
--- a/src/java/org/apache/cassandra/auth/AuthKeyspace.java
+++ b/src/java/org/apache/cassandra/auth/AuthKeyspace.java
@@ -30,6 +30,7 @@ import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.Tables;
 
 import static java.lang.String.format;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SUPERUSER_SETUP_DELAY_MS;
 
 public final class AuthKeyspace
 {
@@ -55,7 +56,7 @@ public final class AuthKeyspace
     public static final String RESOURCE_ROLE_INDEX = "resource_role_permissons_index";
     public static final String NETWORK_PERMISSIONS = "network_permissions";
 
-    public static final long SUPERUSER_SETUP_DELAY = Long.getLong("cassandra.superuser_setup_delay_ms", 10000);
+    public static final long SUPERUSER_SETUP_DELAY = SUPERUSER_SETUP_DELAY_MS.getLong();
 
     private static final TableMetadata Roles =
         parse(ROLES,
diff --git a/src/java/org/apache/cassandra/auth/CassandraRoleManager.java b/src/java/org/apache/cassandra/auth/CassandraRoleManager.java
index 5f9548f6fa..37bda4eac4 100644
--- a/src/java/org/apache/cassandra/auth/CassandraRoleManager.java
+++ b/src/java/org/apache/cassandra/auth/CassandraRoleManager.java
@@ -34,7 +34,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.concurrent.ScheduledExecutors;
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.cql3.*;
@@ -49,6 +48,7 @@ import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.mindrot.jbcrypt.BCrypt;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.AUTH_BCRYPT_GENSALT_LOG2_ROUNDS;
 import static org.apache.cassandra.service.QueryState.forInternalCalls;
 import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
@@ -113,19 +113,15 @@ public class CassandraRoleManager implements IRoleManager
         }
     };
 
-    // 2 ** GENSALT_LOG2_ROUNDS rounds of hashing will be performed.
-    @VisibleForTesting
-    public static final String GENSALT_LOG2_ROUNDS_PROPERTY = Config.PROPERTY_PREFIX + "auth_bcrypt_gensalt_log2_rounds";
     private static final int GENSALT_LOG2_ROUNDS = getGensaltLogRounds();
 
     static int getGensaltLogRounds()
     {
-         int rounds = Integer.getInteger(GENSALT_LOG2_ROUNDS_PROPERTY, 10);
-         if (rounds < 4 || rounds > 30)
-         throw new ConfigurationException(String.format("Bad value for system property -D%s." +
-                                                        "Please use a value between 4 and 30 inclusively",
-                                                        GENSALT_LOG2_ROUNDS_PROPERTY));
-         return rounds;
+        int rounds = AUTH_BCRYPT_GENSALT_LOG2_ROUNDS.getInt(10);
+        if (rounds < 4 || rounds > 30)
+            throw new ConfigurationException(String.format("Bad value for system property %s." +
+                                                           "Please use a value between 4 and 30 inclusively", AUTH_BCRYPT_GENSALT_LOG2_ROUNDS.getKey()));
+        return rounds;
     }
 
     private SelectStatement loadRoleStatement;
diff --git a/src/java/org/apache/cassandra/batchlog/BatchlogManager.java b/src/java/org/apache/cassandra/batchlog/BatchlogManager.java
index 6d102b01c0..b7b25cb7b2 100644
--- a/src/java/org/apache/cassandra/batchlog/BatchlogManager.java
+++ b/src/java/org/apache/cassandra/batchlog/BatchlogManager.java
@@ -77,6 +77,7 @@ import org.apache.cassandra.utils.MBeanWrapper;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.config.CassandraRelevantProperties.BATCHLOG_REPLAY_TIMEOUT_IN_MS;
 import static org.apache.cassandra.cql3.QueryProcessor.executeInternal;
 import static org.apache.cassandra.cql3.QueryProcessor.executeInternalWithPaging;
 import static org.apache.cassandra.net.Verb.MUTATION_REQ;
@@ -91,7 +92,7 @@ public class BatchlogManager implements BatchlogManagerMBean
 
     private static final Logger logger = LoggerFactory.getLogger(BatchlogManager.class);
     public static final BatchlogManager instance = new BatchlogManager();
-    public static final long BATCHLOG_REPLAY_TIMEOUT = Long.getLong("cassandra.batchlog.replay_timeout_in_ms", DatabaseDescriptor.getWriteRpcTimeout(MILLISECONDS) * 2);
+    public static final long BATCHLOG_REPLAY_TIMEOUT = BATCHLOG_REPLAY_TIMEOUT_IN_MS.getLong(DatabaseDescriptor.getWriteRpcTimeout(MILLISECONDS) * 2);
 
     private volatile long totalBatchesReplayed = 0; // no concurrency protection necessary as only written by replay thread.
     private volatile TimeUUID lastReplayedUuid = TimeUUID.minAtUnixMillis(0);
diff --git a/src/java/org/apache/cassandra/concurrent/SEPWorker.java b/src/java/org/apache/cassandra/concurrent/SEPWorker.java
index fe16c950df..93c01fa7a3 100644
--- a/src/java/org/apache/cassandra/concurrent/SEPWorker.java
+++ b/src/java/org/apache/cassandra/concurrent/SEPWorker.java
@@ -30,12 +30,13 @@ import org.apache.cassandra.utils.JVMStabilityInspector;
 
 import static org.apache.cassandra.concurrent.SEPExecutor.TakeTaskPermitResult.RETURNED_WORK_PERMIT;
 import static org.apache.cassandra.concurrent.SEPExecutor.TakeTaskPermitResult.TOOK_PERMIT;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SET_SEP_THREAD_NAME;
 import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 final class SEPWorker extends AtomicReference<SEPWorker.Work> implements Runnable
 {
     private static final Logger logger = LoggerFactory.getLogger(SEPWorker.class);
-    private static final boolean SET_THREAD_NAME = Boolean.parseBoolean(System.getProperty("cassandra.set_sep_thread_name", "true"));
+    private static final boolean SET_THREAD_NAME = SET_SEP_THREAD_NAME.getBoolean();
 
     final Long workerId;
     final Thread thread;
diff --git a/src/java/org/apache/cassandra/config/CassandraRelevantEnv.java b/src/java/org/apache/cassandra/config/CassandraRelevantEnv.java
index 4960374495..0fdcd6c819 100644
--- a/src/java/org/apache/cassandra/config/CassandraRelevantEnv.java
+++ b/src/java/org/apache/cassandra/config/CassandraRelevantEnv.java
@@ -18,13 +18,19 @@
 
 package org.apache.cassandra.config;
 
+// checkstyle: suppress below 'blockSystemPropertyUsage'
+
 public enum CassandraRelevantEnv
 {
     /**
      * Searching in the JAVA_HOME is safer than searching into System.getProperty("java.home") as the Oracle
      * JVM might use the JRE which do not contains jmap.
      */
-    JAVA_HOME ("JAVA_HOME");
+    JAVA_HOME ("JAVA_HOME"),
+    CIRCLECI("CIRCLECI"),
+    CASSANDRA_SKIP_SYNC("CASSANDRA_SKIP_SYNC")
+
+    ;
 
     CassandraRelevantEnv(String key)
     {
@@ -38,6 +44,15 @@ public enum CassandraRelevantEnv
         return System.getenv(key);
     }
 
+    /**
+     * Gets the value of a system env as a boolean.
+     * @return System env boolean value if it exists, false otherwise.
+     */
+    public boolean getBoolean()
+    {
+        return Boolean.parseBoolean(System.getenv(key));
+    }
+
     public String getKey() {
         return key;
     }
diff --git a/src/java/org/apache/cassandra/config/CassandraRelevantProperties.java b/src/java/org/apache/cassandra/config/CassandraRelevantProperties.java
index 73aa67b9a5..78e199292c 100644
--- a/src/java/org/apache/cassandra/config/CassandraRelevantProperties.java
+++ b/src/java/org/apache/cassandra/config/CassandraRelevantProperties.java
@@ -18,349 +18,493 @@
 
 package org.apache.cassandra.config;
 
+import java.util.HashSet;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
+import javax.annotation.Nullable;
+
+import com.google.common.primitives.Ints;
+
 import org.apache.cassandra.db.virtual.LogMessagesTable;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.service.FileSystemOwnershipCheck;
 
+// checkstyle: suppress below 'blockSystemPropertyUsage'
+
 /** A class that extracts system properties for the cassandra node it runs within. */
 public enum CassandraRelevantProperties
 {
-    //base JVM properties
-    JAVA_HOME("java.home"),
-    CASSANDRA_PID_FILE ("cassandra-pidfile"),
-
+    ACQUIRE_RETRY_SECONDS("cassandra.acquire_retry_seconds", "60"),
+    ACQUIRE_SLEEP_MS("cassandra.acquire_sleep_ms", "1000"),
+    ALLOCATE_TOKENS_FOR_KEYSPACE("cassandra.allocate_tokens_for_keyspace"),
+    ALLOW_ALTER_RF_DURING_RANGE_MOVEMENT("cassandra.allow_alter_rf_during_range_movement"),
+    /** If we should allow having duplicate keys in the config file, default to true for legacy reasons */
+    ALLOW_DUPLICATE_CONFIG_KEYS("cassandra.allow_duplicate_config_keys", "true"),
+    /** If we should allow having both new (post CASSANDRA-15234) and old config keys for the same config item in the yaml */
+    ALLOW_NEW_OLD_CONFIG_KEYS("cassandra.allow_new_old_config_keys"),
+    ALLOW_UNLIMITED_CONCURRENT_VALIDATIONS("cassandra.allow_unlimited_concurrent_validations"),
+    ALLOW_UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION("cassandra.allow_unsafe_aggressive_sstable_expiration"),
+    ALLOW_UNSAFE_JOIN("cassandra.allow_unsafe_join"),
+    ALLOW_UNSAFE_REPLACE("cassandra.allow_unsafe_replace"),
+    ALLOW_UNSAFE_TRANSIENT_CHANGES("cassandra.allow_unsafe_transient_changes"),
+    APPROXIMATE_TIME_PRECISION_MS("cassandra.approximate_time_precision_ms", "2"),
+    /** 2 ** GENSALT_LOG2_ROUNDS rounds of hashing will be performed. */
+    AUTH_BCRYPT_GENSALT_LOG2_ROUNDS("cassandra.auth_bcrypt_gensalt_log2_rounds"),
+    /** We expect default values on cache retries and interval to be sufficient for everyone but have this escape hatch just in case. */
+    AUTH_CACHE_WARMING_MAX_RETRIES("cassandra.auth_cache.warming.max_retries"),
+    AUTH_CACHE_WARMING_RETRY_INTERVAL_MS("cassandra.auth_cache.warming.retry_interval_ms"),
+    AUTOCOMPACTION_ON_STARTUP_ENABLED("cassandra.autocompaction_on_startup_enabled", "true"),
+    AUTO_BOOTSTRAP("cassandra.auto_bootstrap"),
+    AUTO_REPAIR_FREQUENCY_SECONDS("cassandra.auto_repair_frequency_seconds", convertToString(TimeUnit.MINUTES.toSeconds(5))),
+    BATCHLOG_REPLAY_TIMEOUT_IN_MS("cassandra.batchlog.replay_timeout_in_ms"),
+    BATCH_COMMIT_LOG_SYNC_INTERVAL("cassandra.batch_commitlog_sync_interval_millis", "1000"),
     /**
-     * Indicates the temporary directory used by the Java Virtual Machine (JVM)
-     * to create and store temporary files.
+     * When bootstraping how long to wait for schema versions to be seen.
      */
-    JAVA_IO_TMPDIR ("java.io.tmpdir"),
-
+    BOOTSTRAP_SCHEMA_DELAY_MS("cassandra.schema_delay_ms"),
     /**
-     * Path from which to load native libraries.
-     * Default is absolute path to lib directory.
+     * When bootstraping we wait for all schema versions found in gossip to be seen, and if not seen in time we fail
+     * the bootstrap; this property will avoid failing and allow bootstrap to continue if set to true.
      */
-    JAVA_LIBRARY_PATH ("java.library.path"),
-
-    JAVA_SECURITY_EGD ("java.security.egd"),
-
-    /** Java Runtime Environment version */
-    JAVA_VERSION ("java.version"),
-
-    /** Java Virtual Machine implementation name */
-    JAVA_VM_NAME ("java.vm.name"),
-
-    /** Line separator ("\n" on UNIX). */
-    LINE_SEPARATOR ("line.separator"),
-
-    /** Java class path. */
-    JAVA_CLASS_PATH ("java.class.path"),
-
-    /** Operating system architecture. */
-    OS_ARCH ("os.arch"),
-
-    /** Operating system name. */
-    OS_NAME ("os.name"),
-
-    /** User's home directory. */
-    USER_HOME ("user.home"),
-
-    /** Platform word size sun.arch.data.model. Examples: "32", "64", "unknown"*/
-    SUN_ARCH_DATA_MODEL ("sun.arch.data.model"),
-
-    //JMX properties
+    BOOTSTRAP_SKIP_SCHEMA_CHECK("cassandra.skip_schema_check"),
+    BROADCAST_INTERVAL_MS("cassandra.broadcast_interval_ms", "60000"),
+    BTREE_BRANCH_SHIFT("cassandra.btree.branchshift", "5"),
+    BTREE_FAN_FACTOR("cassandra.btree.fanfactor"),
+    /** Represents the maximum size (in bytes) of a serialized mutation that can be cached **/
+    CACHEABLE_MUTATION_SIZE_LIMIT("cassandra.cacheable_mutation_size_limit_bytes", convertToString(1_000_000)),
+    CASSANDRA_ALLOW_SIMPLE_STRATEGY("cassandra.allow_simplestrategy"),
+    CASSANDRA_AVAILABLE_PROCESSORS("cassandra.available_processors"),
+    /** The classpath storage configuration file. */
+    CASSANDRA_CONFIG("cassandra.config", "cassandra.yaml"),
     /**
-     * The value of this property represents the host name string
-     * that should be associated with remote stubs for locally created remote objects,
-     * in order to allow clients to invoke methods on the remote object.
+     * The cassandra-foreground option will tell CassandraDaemon whether
+     * to close stdout/stderr, but it's up to us not to background.
+     * yes/null
      */
-    JAVA_RMI_SERVER_HOSTNAME ("java.rmi.server.hostname"),
-
+    CASSANDRA_FOREGROUND("cassandra-foreground"),
+    CASSANDRA_JMX_AUTHORIZER("cassandra.jmx.authorizer"),
+    CASSANDRA_JMX_LOCAL_PORT("cassandra.jmx.local.port"),
+    CASSANDRA_JMX_REMOTE_LOGIN_CONFIG("cassandra.jmx.remote.login.config"),
+    /** Cassandra jmx remote and local port */
+    CASSANDRA_JMX_REMOTE_PORT("cassandra.jmx.remote.port"),
+    CASSANDRA_MAX_HINT_TTL("cassandra.maxHintTTL", convertToString(Integer.MAX_VALUE)),
+    CASSANDRA_MINIMUM_REPLICATION_FACTOR("cassandra.minimum_replication_factor"),
+    CASSANDRA_NETTY_USE_HEAP_ALLOCATOR("cassandra.netty_use_heap_allocator"),
+    CASSANDRA_PID_FILE("cassandra-pidfile"),
+    CASSANDRA_RACKDC_PROPERTIES("cassandra-rackdc.properties"),
+    CASSANDRA_SKIP_AUTOMATIC_UDT_FIX("cassandra.skipautomaticudtfix"),
+    CASSANDRA_STREAMING_DEBUG_STACKTRACE_LIMIT("cassandra.streaming.debug_stacktrace_limit", "2"),
+    CASSANDRA_UNSAFE_TIME_UUID_NODE("cassandra.unsafe.timeuuidnode"),
+    CASSANDRA_VERSION("cassandra.version"),
+    /** default heartbeating period is 1 minute */
+    CHECK_DATA_RESURRECTION_HEARTBEAT_PERIOD("check_data_resurrection_heartbeat_period_milli", "60000"),
+    CHRONICLE_ANNOUNCER_DISABLE("chronicle.announcer.disable"),
+    CLOCK_GLOBAL("cassandra.clock"),
+    CLOCK_MONOTONIC_APPROX("cassandra.monotonic_clock.approx"),
+    CLOCK_MONOTONIC_PRECISE("cassandra.monotonic_clock.precise"),
+    COMMITLOG_ALLOW_IGNORE_SYNC_CRC("cassandra.commitlog.allow_ignore_sync_crc"),
+    COMMITLOG_IGNORE_REPLAY_ERRORS("cassandra.commitlog.ignorereplayerrors"),
+    COMMITLOG_MAX_OUTSTANDING_REPLAY_BYTES("cassandra.commitlog_max_outstanding_replay_bytes", convertToString(1024 * 1024 * 64)),
+    COMMITLOG_MAX_OUTSTANDING_REPLAY_COUNT("cassandra.commitlog_max_outstanding_replay_count", "1024"),
+    COMMITLOG_STOP_ON_ERRORS("cassandra.commitlog.stop_on_errors"),
     /**
-     * If this value is true, object identifiers for remote objects exported by this VM will be generated by using
-     * a cryptographically secure random number generator. The default value is false.
+     * Entities to replay mutations for upon commit log replay, property is meant to contain
+     * comma-separated entities which are either names of keyspaces or keyspaces and tables or their mix.
+     * Examples:
+     * just keyspaces
+     * -Dcassandra.replayList=ks1,ks2,ks3
+     * specific tables
+     * -Dcassandra.replayList=ks1.tb1,ks2.tb2
+     * mix of tables and keyspaces
+     * -Dcassandra.replayList=ks1.tb1,ks2
+     *
+     * If only keyspaces are specified, mutations for all tables in such keyspace will be replayed
+     * */
+    COMMIT_LOG_REPLAY_LIST("cassandra.replayList"),
+    /**
+     * This property indicates the location for the access file. If com.sun.management.jmxremote.authenticate is false,
+     * then this property and the password and access files, are ignored. Otherwise, the access file must exist and
+     * be in the valid format. If the access file is empty or nonexistent, then no access is allowed.
      */
-    JAVA_RMI_SERVER_RANDOM_ID ("java.rmi.server.randomIDs"),
-
+    COM_SUN_MANAGEMENT_JMXREMOTE_ACCESS_FILE("com.sun.management.jmxremote.access.file"),
     /**
      * This property indicates whether password authentication for remote monitoring is
      * enabled. By default it is disabled - com.sun.management.jmxremote.authenticate
      */
-    COM_SUN_MANAGEMENT_JMXREMOTE_AUTHENTICATE ("com.sun.management.jmxremote.authenticate"),
-
+    COM_SUN_MANAGEMENT_JMXREMOTE_AUTHENTICATE("com.sun.management.jmxremote.authenticate"),
+    /** This property indicates the path to the password file - com.sun.management.jmxremote.password.file */
+    COM_SUN_MANAGEMENT_JMXREMOTE_PASSWORD_FILE("com.sun.management.jmxremote.password.file"),
+    /** Port number to enable JMX RMI connections - com.sun.management.jmxremote.port */
+    COM_SUN_MANAGEMENT_JMXREMOTE_PORT("com.sun.management.jmxremote.port"),
     /**
      * The port number to which the RMI connector will be bound - com.sun.management.jmxremote.rmi.port.
      * An Integer object that represents the value of the second argument is returned
      * if there is no port specified, if the port does not have the correct numeric format,
      * or if the specified name is empty or null.
      */
-    COM_SUN_MANAGEMENT_JMXREMOTE_RMI_PORT ("com.sun.management.jmxremote.rmi.port", "0"),
-
-    /** Cassandra jmx remote and local port */
-    CASSANDRA_JMX_REMOTE_PORT("cassandra.jmx.remote.port"),
-    CASSANDRA_JMX_LOCAL_PORT("cassandra.jmx.local.port"),
-
+    COM_SUN_MANAGEMENT_JMXREMOTE_RMI_PORT("com.sun.management.jmxremote.rmi.port", "0"),
     /** This property  indicates whether SSL is enabled for monitoring remotely. Default is set to false. */
-    COM_SUN_MANAGEMENT_JMXREMOTE_SSL ("com.sun.management.jmxremote.ssl"),
-
-    /**
-     * This property indicates whether SSL client authentication is enabled - com.sun.management.jmxremote.ssl.need.client.auth.
-     * Default is set to false.
-     */
-    COM_SUN_MANAGEMENT_JMXREMOTE_SSL_NEED_CLIENT_AUTH ("com.sun.management.jmxremote.ssl.need.client.auth"),
-
-    /**
-     * This property indicates the location for the access file. If com.sun.management.jmxremote.authenticate is false,
-     * then this property and the password and access files, are ignored. Otherwise, the access file must exist and
-     * be in the valid format. If the access file is empty or nonexistent, then no access is allowed.
-     */
-    COM_SUN_MANAGEMENT_JMXREMOTE_ACCESS_FILE ("com.sun.management.jmxremote.access.file"),
-
-    /** This property indicates the path to the password file - com.sun.management.jmxremote.password.file */
-    COM_SUN_MANAGEMENT_JMXREMOTE_PASSWORD_FILE ("com.sun.management.jmxremote.password.file"),
-
-    /** Port number to enable JMX RMI connections - com.sun.management.jmxremote.port */
-    COM_SUN_MANAGEMENT_JMXREMOTE_PORT ("com.sun.management.jmxremote.port"),
-
-    /**
-     * A comma-delimited list of SSL/TLS protocol versions to enable.
-     * Used in conjunction with com.sun.management.jmxremote.ssl - com.sun.management.jmxremote.ssl.enabled.protocols
-     */
-    COM_SUN_MANAGEMENT_JMXREMOTE_SSL_ENABLED_PROTOCOLS ("com.sun.management.jmxremote.ssl.enabled.protocols"),
-
+    COM_SUN_MANAGEMENT_JMXREMOTE_SSL("com.sun.management.jmxremote.ssl"),
     /**
      * A comma-delimited list of SSL/TLS cipher suites to enable.
      * Used in conjunction with com.sun.management.jmxremote.ssl - com.sun.management.jmxremote.ssl.enabled.cipher.suites
      */
-    COM_SUN_MANAGEMENT_JMXREMOTE_SSL_ENABLED_CIPHER_SUITES ("com.sun.management.jmxremote.ssl.enabled.cipher.suites"),
-
-    /** mx4jaddress */
-    MX4JADDRESS ("mx4jaddress"),
-
-    /** mx4jport */
-    MX4JPORT ("mx4jport"),
-
-    RING_DELAY("cassandra.ring_delay_ms"),
-
+    COM_SUN_MANAGEMENT_JMXREMOTE_SSL_ENABLED_CIPHER_SUITES("com.sun.management.jmxremote.ssl.enabled.cipher.suites"),
     /**
-     * When bootstraping we wait for all schema versions found in gossip to be seen, and if not seen in time we fail
-     * the bootstrap; this property will avoid failing and allow bootstrap to continue if set to true.
+     * A comma-delimited list of SSL/TLS protocol versions to enable.
+     * Used in conjunction with com.sun.management.jmxremote.ssl - com.sun.management.jmxremote.ssl.enabled.protocols
      */
-    BOOTSTRAP_SKIP_SCHEMA_CHECK("cassandra.skip_schema_check"),
-
+    COM_SUN_MANAGEMENT_JMXREMOTE_SSL_ENABLED_PROTOCOLS("com.sun.management.jmxremote.ssl.enabled.protocols"),
     /**
-     * When bootstraping how long to wait for schema versions to be seen.
+     * This property indicates whether SSL client authentication is enabled - com.sun.management.jmxremote.ssl.need.client.auth.
+     * Default is set to false.
      */
-    BOOTSTRAP_SCHEMA_DELAY_MS("cassandra.schema_delay_ms"),
-
+    COM_SUN_MANAGEMENT_JMXREMOTE_SSL_NEED_CLIENT_AUTH("com.sun.management.jmxremote.ssl.need.client.auth"),
+    /** Defaults to false for 4.1 but plan to switch to true in a later release the thinking is that environments
+     * may not work right off the bat so safer to add this feature disabled by default */
+    CONFIG_ALLOW_SYSTEM_PROPERTIES("cassandra.config.allow_system_properties"),
+    CONFIG_LOADER("cassandra.config.loader"),
+    CONSISTENT_DIRECTORY_LISTINGS("cassandra.consistent_directory_listings"),
+    CONSISTENT_RANGE_MOVEMENT("cassandra.consistent.rangemovement", "true"),
+    CONSISTENT_SIMULTANEOUS_MOVES_ALLOW("cassandra.consistent.simultaneousmoves.allow"),
+    CUSTOM_GUARDRAILS_CONFIG_PROVIDER_CLASS("cassandra.custom_guardrails_config_provider_class"),
+    CUSTOM_QUERY_HANDLER_CLASS("cassandra.custom_query_handler_class"),
+    CUSTOM_TRACING_CLASS("cassandra.custom_tracing_class"),
+    /** Controls the type of bufffer (heap/direct) used for shared scratch buffers */
+    DATA_OUTPUT_BUFFER_ALLOCATE_TYPE("cassandra.dob.allocate_type"),
+    DATA_OUTPUT_STREAM_PLUS_TEMP_BUFFER_SIZE("cassandra.data_output_stream_plus_temp_buffer_size", "8192"),
+    DECAYING_ESTIMATED_HISTOGRAM_RESERVOIR_STRIPE_COUNT("cassandra.dehr_stripe_count", "2"),
+    DEFAULT_PROVIDE_OVERLAPPING_TOMBSTONES("default.provide.overlapping.tombstones"),
+    /** determinism properties for testing */
+    DETERMINISM_SSTABLE_COMPRESSION_DEFAULT("cassandra.sstable_compression_default", "true"),
+    DETERMINISM_UNSAFE_UUID_NODE("cassandra.unsafe.deterministicuuidnode"),
+    DIAGNOSTIC_SNAPSHOT_INTERVAL_NANOS("cassandra.diagnostic_snapshot_interval_nanos", "60000000000"),
+    DISABLE_AUTH_CACHES_REMOTE_CONFIGURATION("cassandra.disable_auth_caches_remote_configuration"),
+    /** properties to disable certain behaviours for testing */
+    DISABLE_GOSSIP_ENDPOINT_REMOVAL("cassandra.gossip.disable_endpoint_removal"),
+    DISABLE_PAXOS_AUTO_REPAIRS("cassandra.disable_paxos_auto_repairs"),
+    DISABLE_PAXOS_STATE_FLUSH("cassandra.disable_paxos_state_flush"),
+    DISABLE_SSTABLE_ACTIVITY_TRACKING("cassandra.sstable_activity_tracking", "true"),
+    DISABLE_STCS_IN_L0("cassandra.disable_stcs_in_l0"),
+    DISABLE_TCACTIVE_OPENSSL("cassandra.disable_tcactive_openssl"),
+    /** property for the rate of the scheduled task that monitors disk usage */
+    DISK_USAGE_MONITOR_INTERVAL_MS("cassandra.disk_usage.monitor_interval_ms", convertToString(TimeUnit.SECONDS.toMillis(30))),
+    /** property for the interval on which the repeated client warnings and diagnostic events about disk usage are ignored */
+    DISK_USAGE_NOTIFY_INTERVAL_MS("cassandra.disk_usage.notify_interval_ms", convertToString(TimeUnit.MINUTES.toMillis(30))),
+    DOB_DOUBLING_THRESHOLD_MB("cassandra.DOB_DOUBLING_THRESHOLD_MB", "64"),
+    DOB_MAX_RECYCLE_BYTES("cassandra.dob_max_recycle_bytes", convertToString(1024 * 1024)),
     /**
-     * Whether we reset any found data from previously run bootstraps.
+     * When draining, how long to wait for mutating executors to shutdown.
      */
-    RESET_BOOTSTRAP_PROGRESS("cassandra.reset_bootstrap_progress"),
-
+    DRAIN_EXECUTOR_TIMEOUT_MS("cassandra.drain_executor_timeout_ms", convertToString(TimeUnit.MINUTES.toMillis(5))),
+    DROP_OVERSIZED_READ_REPAIR_MUTATIONS("cassandra.drop_oversized_readrepair_mutations"),
+    DTEST_API_LOG_TOPOLOGY("cassandra.dtest.api.log.topology"),
+    ENABLE_DC_LOCAL_COMMIT("cassandra.enable_dc_local_commit", "true"),
     /**
-     * When draining, how long to wait for mutating executors to shutdown.
+     * Whether {@link org.apache.cassandra.db.ConsistencyLevel#NODE_LOCAL} should be allowed.
      */
-    DRAIN_EXECUTOR_TIMEOUT_MS("cassandra.drain_executor_timeout_ms", String.valueOf(TimeUnit.MINUTES.toMillis(5))),
-
+    ENABLE_NODELOCAL_QUERIES("cassandra.enable_nodelocal_queries"),
+    EXPIRATION_DATE_OVERFLOW_POLICY("cassandra.expiration_date_overflow_policy"),
+    EXPIRATION_OVERFLOW_WARNING_INTERVAL_MINUTES("cassandra.expiration_overflow_warning_interval_minutes", "5"),
+    FAILURE_LOGGING_INTERVAL_SECONDS("cassandra.request_failure_log_interval_seconds", "60"),
+    FD_INITIAL_VALUE_MS("cassandra.fd_initial_value_ms"),
+    FD_MAX_INTERVAL_MS("cassandra.fd_max_interval_ms"),
+    FILE_CACHE_ENABLED("cassandra.file_cache_enabled"),
+    /** @deprecated should be removed in favor of enable flag of relevant startup check (FileSystemOwnershipCheck) */
+    @Deprecated
+    FILE_SYSTEM_CHECK_ENABLE("cassandra.enable_fs_ownership_check"),
+    /** @deprecated should be removed in favor of flags in relevant startup check (FileSystemOwnershipCheck) */
+    @Deprecated
+    FILE_SYSTEM_CHECK_OWNERSHIP_FILENAME("cassandra.fs_ownership_filename", FileSystemOwnershipCheck.DEFAULT_FS_OWNERSHIP_FILENAME),
+    /** @deprecated should be removed in favor of flags in relevant startup check (FileSystemOwnershipCheck) */
+    @Deprecated
+    FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN(FileSystemOwnershipCheck.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN),
+    FORCE_DEFAULT_INDEXING_PAGE_SIZE("cassandra.force_default_indexing_page_size"),
+    /** Used when running in Client mode and the system and schema keyspaces need to be initialized outside of their normal initialization path **/
+    FORCE_LOAD_LOCAL_KEYSPACES("cassandra.schema.force_load_local_keyspaces"),
+    FORCE_PAXOS_STATE_REBUILD("cassandra.force_paxos_state_rebuild"),
+    GIT_SHA("cassandra.gitSHA"),
     /**
      * Gossip quarantine delay is used while evaluating membership changes and should only be changed with extreme care.
      */
     GOSSIPER_QUARANTINE_DELAY("cassandra.gossip_quarantine_delay_ms"),
-
     GOSSIPER_SKIP_WAITING_TO_SETTLE("cassandra.skip_wait_for_gossip_to_settle", "-1"),
-
-    IGNORED_SCHEMA_CHECK_VERSIONS("cassandra.skip_schema_check_for_versions"),
-
+    GOSSIP_DISABLE_THREAD_VALIDATION("cassandra.gossip.disable_thread_validation"),
     IGNORED_SCHEMA_CHECK_ENDPOINTS("cassandra.skip_schema_check_for_endpoints"),
-
-    SHUTDOWN_ANNOUNCE_DELAY_IN_MS("cassandra.shutdown_announce_in_ms", "2000"),
-
+    IGNORED_SCHEMA_CHECK_VERSIONS("cassandra.skip_schema_check_for_versions"),
+    IGNORE_CORRUPTED_SCHEMA_TABLES("cassandra.ignore_corrupted_schema_tables"),
+    /** @deprecated should be removed in favor of enable flag of relevant startup check (checkDatacenter) */
+    @Deprecated
+    IGNORE_DC("cassandra.ignore_dc"),
+    IGNORE_DYNAMIC_SNITCH_SEVERITY("cassandra.ignore_dynamic_snitch_severity"),
+    IGNORE_MISSING_NATIVE_FILE_HINTS("cassandra.require_native_file_hints"),
+    /** @deprecated should be removed in favor of enable flag of relevant startup check (checkRack) */
+    @Deprecated
+    IGNORE_RACK("cassandra.ignore_rack"),
+    INDEX_SUMMARY_EXPECTED_KEY_SIZE("cassandra.index_summary_expected_key_size", "64"),
+    INITIAL_TOKEN("cassandra.initial_token"),
+    INTERNODE_EVENT_THREADS("cassandra.internode-event-threads"),
+    IO_NETTY_EVENTLOOP_THREADS("io.netty.eventLoopThreads"),
+    IO_NETTY_TRANSPORT_ESTIMATE_SIZE_ON_SUBMIT("io.netty.transport.estimateSizeOnSubmit"),
+    JAVAX_RMI_SSL_CLIENT_ENABLED_CIPHER_SUITES("javax.rmi.ssl.client.enabledCipherSuites"),
+    JAVAX_RMI_SSL_CLIENT_ENABLED_PROTOCOLS("javax.rmi.ssl.client.enabledProtocols"),
+    /** Java class path. */
+    JAVA_CLASS_PATH("java.class.path"),
+    JAVA_HOME("java.home"),
     /**
-     * When doing a host replacement its possible that the gossip state is "empty" meaning that the endpoint is known
-     * but the current state isn't known.  If the host replacement is needed to repair this state, this property must
-     * be true.
+     * Indicates the temporary directory used by the Java Virtual Machine (JVM)
+     * to create and store temporary files.
      */
-    REPLACEMENT_ALLOW_EMPTY("cassandra.allow_empty_replace_address", "true"),
-
+    JAVA_IO_TMPDIR("java.io.tmpdir"),
+    /**
+     * Path from which to load native libraries.
+     * Default is absolute path to lib directory.
+     */
+    JAVA_LIBRARY_PATH("java.library.path"),
+    /**
+     * The value of this property represents the host name string
+     * that should be associated with remote stubs for locally created remote objects,
+     * in order to allow clients to invoke methods on the remote object.
+     */
+    JAVA_RMI_SERVER_HOSTNAME("java.rmi.server.hostname"),
+    /**
+     * If this value is true, object identifiers for remote objects exported by this VM will be generated by using
+     * a cryptographically secure random number generator. The default value is false.
+     */
+    JAVA_RMI_SERVER_RANDOM_ID("java.rmi.server.randomIDs"),
+    JAVA_SECURITY_AUTH_LOGIN_CONFIG("java.security.auth.login.config"),
+    JAVA_SECURITY_EGD("java.security.egd"),
+    /** Java Runtime Environment version */
+    JAVA_VERSION("java.version"),
+    /** Java Virtual Machine implementation name */
+    JAVA_VM_NAME("java.vm.name"),
+    JOIN_RING("cassandra.join_ring", "true"),
+    /** startup checks properties */
+    LIBJEMALLOC("cassandra.libjemalloc"),
+    /** Line separator ("\n" on UNIX). */
+    LINE_SEPARATOR("line.separator"),
+    /** Load persistence ring state. Default value is {@code true}. */
+    LOAD_RING_STATE("cassandra.load_ring_state", "true"),
+    LOG4J2_DISABLE_JMX("log4j2.disableJmx"),
+    LOG4J2_DISABLE_JMX_LEGACY("log4j2.disable.jmx"),
+    LOG4J_SHUTDOWN_HOOK_ENABLED("log4j.shutdownHookEnabled"),
+    LOGBACK_CONFIGURATION_FILE("logback.configurationFile"),
+    /** Maximum number of rows in system_views.logs table */
+    LOGS_VIRTUAL_TABLE_MAX_ROWS("cassandra.virtual.logs.max.rows", convertToString(LogMessagesTable.LOGS_VIRTUAL_TABLE_DEFAULT_ROWS)),
     /**
      * Directory where Cassandra puts its logs, defaults to "." which is current directory.
      */
     LOG_DIR("cassandra.logdir", "."),
-
     /**
      * Directory where Cassandra persists logs from audit logging. If this property is not set, the audit log framework
      * will set it automatically to {@link CassandraRelevantProperties#LOG_DIR} + "/audit".
      */
     LOG_DIR_AUDIT("cassandra.logdir.audit"),
-
-    CONSISTENT_DIRECTORY_LISTINGS("cassandra.consistent_directory_listings", "false"),
-    CLOCK_GLOBAL("cassandra.clock", null),
-    CLOCK_MONOTONIC_APPROX("cassandra.monotonic_clock.approx", null),
-    CLOCK_MONOTONIC_PRECISE("cassandra.monotonic_clock.precise", null),
-
-    /*
-     * Whether {@link org.apache.cassandra.db.ConsistencyLevel#NODE_LOCAL} should be allowed.
-     */
-    ENABLE_NODELOCAL_QUERIES("cassandra.enable_nodelocal_queries", "false"),
-
-    //cassandra properties (without the "cassandra." prefix)
-
-    /**
-     * The cassandra-foreground option will tell CassandraDaemon whether
-     * to close stdout/stderr, but it's up to us not to background.
-     * yes/null
-     */
-    CASSANDRA_FOREGROUND ("cassandra-foreground"),
-
-    DEFAULT_PROVIDE_OVERLAPPING_TOMBSTONES ("default.provide.overlapping.tombstones"),
-    ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION ("org.apache.cassandra.disable_mbean_registration"),
-
-    /** This property indicates whether disable_mbean_registration is true */
-    IS_DISABLED_MBEAN_REGISTRATION("org.apache.cassandra.disable_mbean_registration"),
-
-    /** snapshots ttl cleanup period in seconds */
-    SNAPSHOT_CLEANUP_PERIOD_SECONDS("cassandra.snapshot.ttl_cleanup_period_seconds", "60"),
-
-    /** snapshots ttl cleanup initial delay in seconds */
-    SNAPSHOT_CLEANUP_INITIAL_DELAY_SECONDS("cassandra.snapshot.ttl_cleanup_initial_delay_seconds", "5"),
-
-    /** minimum allowed TTL for snapshots */
-    SNAPSHOT_MIN_ALLOWED_TTL_SECONDS("cassandra.snapshot.min_allowed_ttl_seconds", "60"),
-
+    /** Loosen the definition of "empty" for gossip state, for use during host replacements if things go awry */
+    LOOSE_DEF_OF_EMPTY_ENABLED(Config.PROPERTY_PREFIX + "gossiper.loose_empty_enabled"),
+    MAX_CONCURRENT_RANGE_REQUESTS("cassandra.max_concurrent_range_requests"),
+    MAX_HINT_BUFFERS("cassandra.MAX_HINT_BUFFERS", "3"),
+    MAX_LOCAL_PAUSE_IN_MS("cassandra.max_local_pause_in_ms", "5000"),
     /** what class to use for mbean registeration */
     MBEAN_REGISTRATION_CLASS("org.apache.cassandra.mbean_registration_class"),
-
-    BATCH_COMMIT_LOG_SYNC_INTERVAL("cassandra.batch_commitlog_sync_interval_millis", "1000"),
-
-    SYSTEM_AUTH_DEFAULT_RF("cassandra.system_auth.default_rf", "1"),
-    SYSTEM_TRACES_DEFAULT_RF("cassandra.system_traces.default_rf", "2"),
-    SYSTEM_DISTRIBUTED_DEFAULT_RF("cassandra.system_distributed.default_rf", "3"),
-
-    /** Represents the maximum size (in bytes) of a serialized mutation that can be cached **/
-    CACHEABLE_MUTATION_SIZE_LIMIT("cassandra.cacheable_mutation_size_limit_bytes", Long.toString(1_000_000)),
-
-    MEMTABLE_OVERHEAD_SIZE("cassandra.memtable.row_overhead_size", "-1"),
     MEMTABLE_OVERHEAD_COMPUTE_STEPS("cassandra.memtable_row_overhead_computation_step", "100000"),
+    MEMTABLE_OVERHEAD_SIZE("cassandra.memtable.row_overhead_size", "-1"),
+    MEMTABLE_SHARD_COUNT("cassandra.memtable.shard.count"),
     MEMTABLE_TRIE_SIZE_LIMIT("cassandra.trie_size_limit_mb"),
+    METRICS_REPORTER_CONFIG_FILE("cassandra.metricsReporterConfigFile"),
     MIGRATION_DELAY("cassandra.migration_delay_ms", "60000"),
-    /** Defines how often schema definitions are pulled from the other nodes */
-    SCHEMA_PULL_INTERVAL_MS("cassandra.schema_pull_interval_ms", "60000"),
-
+    /** Defines the maximum number of unique timed out queries that will be reported in the logs. Use a negative number to remove any limit. */
+    MONITORING_MAX_OPERATIONS("cassandra.monitoring_max_operations", "50"),
+    /** Defines the interval for reporting any operations that have timed out. */
+    MONITORING_REPORT_INTERVAL_MS("cassandra.monitoring_report_interval_ms", "5000"),
+    MV_ALLOW_FILTERING_NONKEY_COLUMNS_UNSAFE("cassandra.mv.allow_filtering_nonkey_columns_unsafe"),
+    MV_ENABLE_COORDINATOR_BATCHLOG("cassandra.mv_enable_coordinator_batchlog"),
+    /** mx4jaddress */
+    MX4JADDRESS("mx4jaddress"),
+    /** mx4jport */
+    MX4JPORT("mx4jport"),
+    NANOTIMETOMILLIS_TIMESTAMP_UPDATE_INTERVAL("cassandra.NANOTIMETOMILLIS_TIMESTAMP_UPDATE_INTERVAL", "10000"),
+    NATIVE_EPOLL_ENABLED("cassandra.native.epoll.enabled", "true"),
+    /** This is the port used with RPC address for the native protocol to communicate with clients. Now that thrift RPC is no longer in use there is no RPC port. */
+    NATIVE_TRANSPORT_PORT("cassandra.native_transport_port"),
+    NEVER_PURGE_TOMBSTONES("cassandra.never_purge_tombstones"),
+    NIO_DATA_OUTPUT_STREAM_PLUS_BUFFER_SIZE("cassandra.nio_data_output_stream_plus_buffer_size", convertToString(32 * 1024)),
+    NODETOOL_JMX_NOTIFICATION_POLL_INTERVAL_SECONDS("cassandra.nodetool.jmx_notification_poll_interval_seconds", convertToString(TimeUnit.SECONDS.convert(5, TimeUnit.MINUTES))),
+    /** If set, {@link org.apache.cassandra.net.MessagingService} is shutdown abrtuptly without waiting for anything.
+     * This is an optimization used in unit tests becuase we never restart a node there. The only node is stopoped
+     * when the JVM terminates. Therefore, we can use such optimization and not wait unnecessarily. */
+    NON_GRACEFUL_SHUTDOWN("cassandra.test.messagingService.nonGracefulShutdown"),
+    /** for specific tests */
+    /** This property indicates whether disable_mbean_registration is true */
+    ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION("org.apache.cassandra.disable_mbean_registration"),
+    /** Operating system architecture. */
+    OS_ARCH("os.arch"),
+    /** Operating system name. */
+    OS_NAME("os.name"),
+    OTCP_LARGE_MESSAGE_THRESHOLD("cassandra.otcp_large_message_threshold", convertToString(1024 * 64)),
+    /** Enabled/disable TCP_NODELAY for intradc connections. Defaults is enabled. */
+    OTC_INTRADC_TCP_NODELAY("cassandra.otc_intradc_tcp_nodelay", "true"),
+    OVERRIDE_DECOMMISSION("cassandra.override_decommission"),
+    PARENT_REPAIR_STATUS_CACHE_SIZE("cassandra.parent_repair_status_cache_size", "100000"),
+    PARENT_REPAIR_STATUS_EXPIRY_SECONDS("cassandra.parent_repair_status_expiry_seconds", convertToString(TimeUnit.SECONDS.convert(1, TimeUnit.DAYS))),
+    PARTITIONER("cassandra.partitioner"),
+    PAXOS_CLEANUP_SESSION_TIMEOUT_SECONDS("cassandra.paxos_cleanup_session_timeout_seconds", convertToString(TimeUnit.HOURS.toSeconds(2))),
+    PAXOS_DISABLE_COORDINATOR_LOCKING("cassandra.paxos.disable_coordinator_locking"),
+    PAXOS_LOG_TTL_LINEARIZABILITY_VIOLATIONS("cassandra.paxos.log_ttl_linearizability_violations", "true"),
+    PAXOS_MODERN_RELEASE("cassandra.paxos.modern_release", "4.1"),
+    PAXOS_REPAIR_ALLOW_MULTIPLE_PENDING_UNSAFE("cassandra.paxos_repair_allow_multiple_pending_unsafe"),
+    PAXOS_REPAIR_ON_TOPOLOGY_CHANGE_RETRIES("cassandra.paxos_repair_on_topology_change_retries", "10"),
+    PAXOS_REPAIR_ON_TOPOLOGY_CHANGE_RETRY_DELAY_SECONDS("cassandra.paxos_repair_on_topology_change_retry_delay_seconds", "10"),
     PAXOS_REPAIR_RETRY_TIMEOUT_IN_MS("cassandra.paxos_repair_retry_timeout_millis", "60000"),
-
-    /** If we should allow having duplicate keys in the config file, default to true for legacy reasons */
-    ALLOW_DUPLICATE_CONFIG_KEYS("cassandra.allow_duplicate_config_keys", "true"),
-    /** If we should allow having both new (post CASSANDRA-15234) and old config keys for the same config item in the yaml */
-    ALLOW_NEW_OLD_CONFIG_KEYS("cassandra.allow_new_old_config_keys", "false"),
-
-    // startup checks properties
-    LIBJEMALLOC("cassandra.libjemalloc"),
-    @Deprecated // should be removed in favor of enable flag of relevant startup check (checkDatacenter)
-    IGNORE_DC("cassandra.ignore_dc"),
-    @Deprecated // should be removed in favor of enable flag of relevant startup check (checkRack)
-    IGNORE_RACK("cassandra.ignore_rack"),
-    @Deprecated // should be removed in favor of enable flag of relevant startup check (FileSystemOwnershipCheck)
-    FILE_SYSTEM_CHECK_ENABLE("cassandra.enable_fs_ownership_check"),
-    @Deprecated // should be removed in favor of flags in relevant startup check (FileSystemOwnershipCheck)
-    FILE_SYSTEM_CHECK_OWNERSHIP_FILENAME("cassandra.fs_ownership_filename", FileSystemOwnershipCheck.DEFAULT_FS_OWNERSHIP_FILENAME),
-    @Deprecated // should be removed in favor of flags in relevant startup check (FileSystemOwnershipCheck)
-    FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN(FileSystemOwnershipCheck.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN),
-    // default heartbeating period is 1 minute
-    CHECK_DATA_RESURRECTION_HEARTBEAT_PERIOD("check_data_resurrection_heartbeat_period_milli", "60000"),
-
-    // defaults to false for 4.1 but plan to switch to true in a later release
-    // the thinking is that environments may not work right off the bat so safer to add this feature disabled by default
-    CONFIG_ALLOW_SYSTEM_PROPERTIES("cassandra.config.allow_system_properties", "false"),
-
-    // properties for debugging simulator ASM output
-    TEST_SIMULATOR_PRINT_ASM("cassandra.test.simulator.print_asm", "none"),
-    TEST_SIMULATOR_PRINT_ASM_TYPES("cassandra.test.simulator.print_asm_types", ""),
-    TEST_SIMULATOR_LIVENESS_CHECK("cassandra.test.simulator.livenesscheck", "true"),
-    TEST_SIMULATOR_DEBUG("cassandra.test.simulator.debug", "false"),
-    TEST_SIMULATOR_DETERMINISM_CHECK("cassandra.test.simulator.determinismcheck", "none"),
-    TEST_JVM_DTEST_DISABLE_SSL("cassandra.test.disable_ssl", "false"),
-
-    // determinism properties for testing
-    DETERMINISM_SSTABLE_COMPRESSION_DEFAULT("cassandra.sstable_compression_default", "true"),
-    DETERMINISM_CONSISTENT_DIRECTORY_LISTINGS("cassandra.consistent_directory_listings", "false"),
-    DETERMINISM_UNSAFE_UUID_NODE("cassandra.unsafe.deterministicuuidnode", "false"),
-    FAILURE_LOGGING_INTERVAL_SECONDS("cassandra.request_failure_log_interval_seconds", "60"),
-
-    // properties to disable certain behaviours for testing
-    DISABLE_GOSSIP_ENDPOINT_REMOVAL("cassandra.gossip.disable_endpoint_removal"),
-    IGNORE_MISSING_NATIVE_FILE_HINTS("cassandra.require_native_file_hints", "false"),
-    DISABLE_SSTABLE_ACTIVITY_TRACKING("cassandra.sstable_activity_tracking", "true"),
-    TEST_IGNORE_SIGAR("cassandra.test.ignore_sigar", "false"),
-    PAXOS_EXECUTE_ON_SELF("cassandra.paxos.use_self_execution", "true"),
-
-    /** property for the rate of the scheduled task that monitors disk usage */
-    DISK_USAGE_MONITOR_INTERVAL_MS("cassandra.disk_usage.monitor_interval_ms", Long.toString(TimeUnit.SECONDS.toMillis(30))),
-
-    /** property for the interval on which the repeated client warnings and diagnostic events about disk usage are ignored */
-    DISK_USAGE_NOTIFY_INTERVAL_MS("cassandra.disk_usage.notify_interval_ms", Long.toString(TimeUnit.MINUTES.toMillis(30))),
-
-    /** Controls the type of bufffer (heap/direct) used for shared scratch buffers */
-    DATA_OUTPUT_BUFFER_ALLOCATE_TYPE("cassandra.dob.allocate_type"),
-
-    // for specific tests
-    ORG_APACHE_CASSANDRA_CONF_CASSANDRA_RELEVANT_PROPERTIES_TEST("org.apache.cassandra.conf.CassandraRelevantPropertiesTest"),
-    ORG_APACHE_CASSANDRA_DB_VIRTUAL_SYSTEM_PROPERTIES_TABLE_TEST("org.apache.cassandra.db.virtual.SystemPropertiesTableTest"),
-
-    // Loosen the definition of "empty" for gossip state, for use during host replacements if things go awry
-    LOOSE_DEF_OF_EMPTY_ENABLED(Config.PROPERTY_PREFIX + "gossiper.loose_empty_enabled"),
-
-    // Maximum number of rows in system_views.logs table
-    LOGS_VIRTUAL_TABLE_MAX_ROWS("cassandra.virtual.logs.max.rows", Integer.toString(LogMessagesTable.LOGS_VIRTUAL_TABLE_DEFAULT_ROWS)),
-
-    /** Used when running in Client mode and the system and schema keyspaces need to be initialized outside of their normal initialization path **/
-    FORCE_LOAD_LOCAL_KEYSPACES("cassandra.schema.force_load_local_keyspaces"),
-
-    // commit log relevant properties
+    PAXOS_USE_SELF_EXECUTION("cassandra.paxos.use_self_execution", "true"),
+    PRINT_HEAP_HISTOGRAM_ON_OUT_OF_MEMORY_ERROR("cassandra.printHeapHistogramOnOutOfMemoryError"),
+    READS_THRESHOLDS_COORDINATOR_DEFENSIVE_CHECKS_ENABLED("cassandra.reads.thresholds.coordinator.defensive_checks_enabled"),
+    RELEASE_VERSION("cassandra.releaseVersion"),
+    RELOCATED_SHADED_IO_NETTY_TRANSPORT_NONATIVE("relocated.shaded.io.netty.transport.noNative"),
+    REPAIR_CLEANUP_INTERVAL_SECONDS("cassandra.repair_cleanup_interval_seconds", convertToString(Ints.checkedCast(TimeUnit.MINUTES.toSeconds(10)))),
+    REPAIR_DELETE_TIMEOUT_SECONDS("cassandra.repair_delete_timeout_seconds", convertToString(Ints.checkedCast(TimeUnit.DAYS.toSeconds(1)))),
+    REPAIR_FAIL_TIMEOUT_SECONDS("cassandra.repair_fail_timeout_seconds", convertToString(Ints.checkedCast(TimeUnit.DAYS.toSeconds(1)))),
+    REPAIR_MUTATION_REPAIR_ROWS_PER_BATCH("cassandra.repair.mutation_repair_rows_per_batch", "100"),
+    REPAIR_STATUS_CHECK_TIMEOUT_SECONDS("cassandra.repair_status_check_timeout_seconds", convertToString(Ints.checkedCast(TimeUnit.HOURS.toSeconds(1)))),
     /**
-     * Entities to replay mutations for upon commit log replay, property is meant to contain
-     * comma-separated entities which are either names of keyspaces or keyspaces and tables or their mix.
-     * Examples:
-     * just keyspaces
-     * -Dcassandra.replayList=ks1,ks2,ks3
-     * specific tables
-     * -Dcassandra.replayList=ks1.tb1,ks2.tb2
-     * mix of tables and keyspaces
-     * -Dcassandra.replayList=ks1.tb1,ks2
-     *
-     * If only keyspaces are specified, mutations for all tables in such keyspace will be replayed
-     * */
-    COMMIT_LOG_REPLAY_LIST("cassandra.replayList", null),
-
+     * When doing a host replacement its possible that the gossip state is "empty" meaning that the endpoint is known
+     * but the current state isn't known.  If the host replacement is needed to repair this state, this property must
+     * be true.
+     */
+    REPLACEMENT_ALLOW_EMPTY("cassandra.allow_empty_replace_address", "true"),
+    REPLACE_ADDRESS("cassandra.replace_address"),
+    REPLACE_ADDRESS_FIRST_BOOT("cassandra.replace_address_first_boot"),
+    REPLACE_NODE("cassandra.replace_node"),
+    REPLACE_TOKEN("cassandra.replace_token"),
+    /**
+     * Whether we reset any found data from previously run bootstraps.
+     */
+    RESET_BOOTSTRAP_PROGRESS("cassandra.reset_bootstrap_progress"),
+    RING_DELAY("cassandra.ring_delay_ms"),
+    /** Defines how often schema definitions are pulled from the other nodes */
+    SCHEMA_PULL_INTERVAL_MS("cassandra.schema_pull_interval_ms", "60000"),
+    SCHEMA_UPDATE_HANDLER_FACTORY_CLASS("cassandra.schema.update_handler_factory.class"),
+    SEARCH_CONCURRENCY_FACTOR("cassandra.search_concurrency_factor", "1"),
     /**
      * The maximum number of seeds returned by a seed provider before emmitting a warning.
      * A large seed list may impact effectiveness of the third gossip round.
      * The default used in SimpleSeedProvider is 20.
      */
     SEED_COUNT_WARN_THRESHOLD("cassandra.seed_count_warn_threshold"),
-
-
+    SERIALIZATION_EMPTY_TYPE_NONEMPTY_BEHAVIOR("cassandra.serialization.emptytype.nonempty_behavior"),
+    SET_SEP_THREAD_NAME("cassandra.set_sep_thread_name", "true"),
+    SHUTDOWN_ANNOUNCE_DELAY_IN_MS("cassandra.shutdown_announce_in_ms", "2000"),
+    SIZE_RECORDER_INTERVAL("cassandra.size_recorder_interval", "300"),
+    SKIP_PAXOS_REPAIR_ON_TOPOLOGY_CHANGE("cassandra.skip_paxos_repair_on_topology_change"),
+    /** If necessary for operational purposes, permit certain keyspaces to be ignored for paxos topology repairs. */
+    SKIP_PAXOS_REPAIR_ON_TOPOLOGY_CHANGE_KEYSPACES("cassandra.skip_paxos_repair_on_topology_change_keyspaces"),
+    SKIP_PAXOS_REPAIR_VERSION_VALIDATION("cassandra.skip_paxos_repair_version_validation"),
+    SKIP_PAXOS_STATE_REBUILD("cassandra.skip_paxos_state_rebuild"),
+    /** snapshots ttl cleanup initial delay in seconds */
+    SNAPSHOT_CLEANUP_INITIAL_DELAY_SECONDS("cassandra.snapshot.ttl_cleanup_initial_delay_seconds", "5"),
+    /** snapshots ttl cleanup period in seconds */
+    SNAPSHOT_CLEANUP_PERIOD_SECONDS("cassandra.snapshot.ttl_cleanup_period_seconds", "60"),
+    /** minimum allowed TTL for snapshots */
+    SNAPSHOT_MIN_ALLOWED_TTL_SECONDS("cassandra.snapshot.min_allowed_ttl_seconds", "60"),
+    SSL_ENABLE("ssl.enable"),
+    SSL_STORAGE_PORT("cassandra.ssl_storage_port"),
     SSTABLE_FORMAT_DEFAULT("cassandra.sstable.format.default"),
-
-
-    /** When enabled, recursive directory deletion will be executed using a unix command `rm -rf` instead of traversing
-     * and removing individual files. This is now used only tests, but eventually we will make it true by default.*/
-    USE_NIX_RECURSIVE_DELETE("cassandra.use_nix_recursive_delete"),
-
-    /** If set, {@link org.apache.cassandra.net.MessagingService} is shutdown abrtuptly without waiting for anything.
-     * This is an optimization used in unit tests becuase we never restart a node there. The only node is stopoped
-     * when the JVM terminates. Therefore, we can use such optimization and not wait unnecessarily. */
-    NON_GRACEFUL_SHUTDOWN("cassandra.test.messagingService.nonGracefulShutdown"),
-
+    START_GOSSIP("cassandra.start_gossip", "true"),
+    START_NATIVE_TRANSPORT("cassandra.start_native_transport"),
+    STORAGE_DIR("cassandra.storagedir"),
+    STORAGE_HOOK("cassandra.storage_hook"),
+    STORAGE_PORT("cassandra.storage_port"),
+    STREAMING_HISTOGRAM_ROUND_SECONDS("cassandra.streaminghistogram.roundseconds", "60"),
+    STREAMING_SESSION_PARALLELTRANSFERS("cassandra.streaming.session.parallelTransfers"),
+    STREAM_HOOK("cassandra.stream_hook"),
+    /** Platform word size sun.arch.data.model. Examples: "32", "64", "unknown"*/
+    SUN_ARCH_DATA_MODEL("sun.arch.data.model"),
+    SUN_JAVA_COMMAND("sun.java.command", ""),
+    SUN_STDERR_ENCODING("sun.stderr.encoding"),
+    SUN_STDOUT_ENCODING("sun.stdout.encoding"),
+    SUPERUSER_SETUP_DELAY_MS("cassandra.superuser_setup_delay_ms", "10000"),
+    SYSTEM_AUTH_DEFAULT_RF("cassandra.system_auth.default_rf", "1"),
+    SYSTEM_DISTRIBUTED_DEFAULT_RF("cassandra.system_distributed.default_rf", "3"),
+    SYSTEM_TRACES_DEFAULT_RF("cassandra.system_traces.default_rf", "2"),
+    TEST_BBFAILHELPER_ENABLED("test.bbfailhelper.enabled"),
+    TEST_BLOB_SHARED_SEED("cassandra.test.blob.shared.seed"),
+    TEST_BYTEMAN_TRANSFORMATIONS_DEBUG("cassandra.test.byteman.transformations.debug"),
+    TEST_CASSANDRA_KEEPBRIEFBRIEF("cassandra.keepBriefBrief"),
+    TEST_CASSANDRA_RELEVANT_PROPERTIES("org.apache.cassandra.conf.CassandraRelevantPropertiesTest"),
+    /** A property for various mechanisms for syncing files that makes it possible it intercept and skip syncing. */
+    TEST_CASSANDRA_SKIP_SYNC("cassandra.skip_sync"),
+    TEST_CASSANDRA_SUITENAME("suitename", "suitename_IS_UNDEFINED"),
+    TEST_CASSANDRA_TESTTAG("cassandra.testtag", "cassandra.testtag_IS_UNDEFINED"),
+    TEST_COMPRESSION("cassandra.test.compression"),
+    TEST_COMPRESSION_ALGO("cassandra.test.compression.algo", "lz4"),
+    TEST_DEBUG_REF_COUNT("cassandra.debugrefcount"),
+    TEST_DRIVER_CONNECTION_TIMEOUT_MS("cassandra.test.driver.connection_timeout_ms", "5000"),
+    TEST_DRIVER_READ_TIMEOUT_MS("cassandra.test.driver.read_timeout_ms", "12000"),
+    TEST_FAIL_MV_LOCKS_COUNT("cassandra.test.fail_mv_locks_count", "0"),
+    TEST_FAIL_WRITES_KS("cassandra.test.fail_writes_ks", ""),
     /** Flush changes of {@link org.apache.cassandra.schema.SchemaKeyspace} after each schema modification. In production,
      * we always do that. However, tests which do not restart nodes may disable this functionality in order to run
      * faster. Note that this is disabled for unit tests but if an individual test requires schema to be flushed, it
      * can be also done manually for that particular case: {@code flush(SchemaConstants.SCHEMA_KEYSPACE_NAME);}. */
-    FLUSH_LOCAL_SCHEMA_CHANGES("cassandra.test.flush_local_schema_changes", "true"),
+    TEST_FLUSH_LOCAL_SCHEMA_CHANGES("cassandra.test.flush_local_schema_changes", "true"),
+    TEST_IGNORE_SIGAR("cassandra.test.ignore_sigar"),
+    TEST_INVALID_LEGACY_SSTABLE_ROOT("invalid-legacy-sstable-root"),
+    TEST_JVM_DTEST_DISABLE_SSL("cassandra.test.disable_ssl"),
+    TEST_LEGACY_SSTABLE_ROOT("legacy-sstable-root"),
+    TEST_ORG_CAFFINITAS_OHC_SEGMENTCOUNT("org.caffinitas.ohc.segmentCount"),
+    TEST_READ_ITERATION_DELAY_MS("cassandra.test.read_iteration_delay_ms", "0"),
+    TEST_REUSE_PREPARED("cassandra.test.reuse_prepared", "true"),
+    TEST_ROW_CACHE_SIZE("cassandra.test.row_cache_size"),
+    TEST_SERIALIZATION_WRITES("cassandra.test-serialization-writes"),
+    TEST_SIMULATOR_DEBUG("cassandra.test.simulator.debug"),
+    TEST_SIMULATOR_DETERMINISM_CHECK("cassandra.test.simulator.determinismcheck", "none"),
+    TEST_SIMULATOR_LIVENESS_CHECK("cassandra.test.simulator.livenesscheck", "true"),
+    /** properties for debugging simulator ASM output */
+    TEST_SIMULATOR_PRINT_ASM("cassandra.test.simulator.print_asm", "none"),
+    TEST_SIMULATOR_PRINT_ASM_CLASSES("cassandra.test.simulator.print_asm_classes", ""),
+    TEST_SIMULATOR_PRINT_ASM_OPTS("cassandra.test.simulator.print_asm_opts", ""),
+    TEST_SIMULATOR_PRINT_ASM_TYPES("cassandra.test.simulator.print_asm_types", ""),
+    TEST_SSTABLE_FORMAT_DEVELOPMENT("cassandra.test.sstableformatdevelopment"),
+    TEST_STRICT_LCS_CHECKS("cassandra.test.strict_lcs_checks"),
+    /** Turns some warnings into exceptions for testing. */
+    TEST_STRICT_RUNTIME_CHECKS("cassandra.strict.runtime.checks"),
+    /** Not to be used in production, this causes a Netty logging handler to be added to the pipeline, which will throttle a system under any normal load. */
+    TEST_UNSAFE_VERBOSE_DEBUG_CLIENT_PROTOCOL("cassandra.unsafe_verbose_debug_client_protocol"),
+    TEST_USE_PREPARED("cassandra.test.use_prepared", "true"),
+    TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST("org.apache.cassandra.tools.UtilALLOW_TOOL_REINIT_FOR_TEST"),
+    /** Activate write survey mode. The node not becoming an active ring member, and you must use JMX StorageService->joinRing() to finalize the ring joining. */
+    TEST_WRITE_SURVEY("cassandra.write_survey"),
+    TOLERATE_SSTABLE_SIZE("cassandra.tolerate_sstable_size"),
+    TRIGGERS_DIR("cassandra.triggers_dir"),
+    TRUNCATE_BALLOT_METADATA("cassandra.truncate_ballot_metadata"),
+    TYPE_UDT_CONFLICT_BEHAVIOR("cassandra.type.udt.conflict_behavior"),
+    UDF_EXECUTOR_THREAD_KEEPALIVE_MS("cassandra.udf_executor_thread_keepalive_ms", "30000"),
+    UNSAFE_SYSTEM("cassandra.unsafesystem"),
+    /** User's home directory. */
+    USER_HOME("user.home"),
+    /** When enabled, recursive directory deletion will be executed using a unix command `rm -rf` instead of traversing
+     * and removing individual files. This is now used only tests, but eventually we will make it true by default.*/
+    USE_NIX_RECURSIVE_DELETE("cassandra.use_nix_recursive_delete"),
+    /** Gossiper compute expiration timeout. Default value 3 days. */
+    VERY_LONG_TIME_MS("cassandra.very_long_time_ms", "259200000"),
+    WAIT_FOR_TRACING_EVENTS_TIMEOUT_SECS("cassandra.wait_for_tracing_events_timeout_secs", "0");
 
-    TOMBSTONE_HISTOGRAM_TTL_ROUND_SECONDS("cassandra.streaminghistogram.roundseconds", "60"),
-    ;
+    static
+    {
+        CassandraRelevantProperties[] values = CassandraRelevantProperties.values();
+        Set<String> visited = new HashSet<>(values.length);
+        CassandraRelevantProperties prev = null;
+        for (CassandraRelevantProperties next : values)
+        {
+            if (!visited.add(next.getKey()))
+                throw new IllegalStateException("System properties have duplicate key: " + next.getKey());
+            if (prev != null && next.name().compareTo(prev.name()) < 0)
+                throw new IllegalStateException("Enum constants are not in alphabetical order: " + prev.name() + " should come before " + next.name());
+            else
+                prev = next;
+        }
+    }
 
     CassandraRelevantProperties(String key, String defaultVal)
     {
@@ -436,13 +580,32 @@ public enum CassandraRelevantProperties
         return converter.convert(value);
     }
 
+    public static String convertToString(@Nullable Object value)
+    {
+        if (value == null)
+            return null;
+        if (value instanceof String)
+            return (String) value;
+        if (value instanceof Boolean)
+            return Boolean.toString((Boolean) value);
+        if (value instanceof Long)
+            return Long.toString((Long) value);
+        if (value instanceof Integer)
+            return Integer.toString((Integer) value);
+        if (value instanceof Double)
+            return Double.toString((Double) value);
+        if (value instanceof Float)
+            return Float.toString((Float) value);
+        throw new IllegalArgumentException("Unknown type " + value.getClass());
+    }
+
     /**
      * Sets the value into system properties.
      * @param value to set
      */
-    public void setString(String value)
+    public String setString(String value)
     {
-        System.setProperty(key, value);
+        return System.setProperty(key, value);
     }
 
     /**
@@ -472,10 +635,12 @@ public enum CassandraRelevantProperties
     /**
      * Sets the value into system properties.
      * @param value to set
+     * @return Previous value if it exists.
      */
-    public void setBoolean(boolean value)
+    public Boolean setBoolean(boolean value)
     {
-        System.setProperty(key, Boolean.toString(value));
+        String prev = System.setProperty(key, convertToString(value));
+        return prev == null ? null : BOOLEAN_CONVERTER.convert(prev);
     }
 
     /**
@@ -488,28 +653,43 @@ public enum CassandraRelevantProperties
 
     /**
      * Gets the value of a system property as a int.
-     * @return system property int value if it exists, defaultValue otherwise.
+     * @return System property value if it exists, defaultValue otherwise. Throws an exception if no default value is set.
      */
     public int getInt()
     {
         String value = System.getProperty(key);
-
+        if (value == null && defaultVal == null)
+            throw new ConfigurationException("Missing property value or default value is not set: " + key);
         return INTEGER_CONVERTER.convert(value == null ? defaultVal : value);
     }
 
     /**
-     * Gets the value of a system property as a int.
-     * @return system property int value if it exists, defaultValue otherwise.
+     * Gets the value of a system property as a long.
+     * @return System property value if it exists, defaultValue otherwise. Throws an exception if no default value is set.
      */
     public long getLong()
     {
         String value = System.getProperty(key);
-
+        if (value == null && defaultVal == null)
+            throw new ConfigurationException("Missing property value or default value is not set: " + key);
         return LONG_CONVERTER.convert(value == null ? defaultVal : value);
     }
 
     /**
-     * Gets the value of a system property as a int.
+     * Gets the value of a system property as a long.
+     * @return system property long value if it exists, defaultValue otherwise.
+     */
+    public long getLong(long overrideDefaultValue)
+    {
+        String value = System.getProperty(key);
+        if (value == null)
+            return overrideDefaultValue;
+
+        return LONG_CONVERTER.convert(value);
+    }
+
+    /**
+     * Gets the value of a system property as an int.
      * @return system property int value if it exists, overrideDefaultValue otherwise.
      */
     public int getInt(int overrideDefaultValue)
@@ -524,19 +704,23 @@ public enum CassandraRelevantProperties
     /**
      * Sets the value into system properties.
      * @param value to set
+     * @return Previous value or null if it did not have one.
      */
-    public void setInt(int value)
+    public Integer setInt(int value)
     {
-        System.setProperty(key, Integer.toString(value));
+        String prev = System.setProperty(key, convertToString(value));
+        return prev == null ? null : INTEGER_CONVERTER.convert(prev);
     }
 
     /**
      * Sets the value into system properties.
      * @param value to set
+     * @return Previous value or null if it did not have one.
      */
-    public void setLong(long value)
+    public Long setLong(long value)
     {
-        System.setProperty(key, Long.toString(value));
+        String prev = System.setProperty(key, convertToString(value));
+        return prev == null ? null : LONG_CONVERTER.convert(prev);
     }
 
     /**
@@ -546,7 +730,8 @@ public enum CassandraRelevantProperties
      * @param <T> type
      * @return enum value
      */
-    public <T extends Enum<T>> T getEnum(T defaultValue) {
+    public <T extends Enum<T>> T getEnum(T defaultValue)
+    {
         return getEnum(true, defaultValue);
     }
 
@@ -558,7 +743,8 @@ public enum CassandraRelevantProperties
      * @param <T> type
      * @return enum value
      */
-    public <T extends Enum<T>> T getEnum(boolean toUppercase, T defaultValue) {
+    public <T extends Enum<T>> T getEnum(boolean toUppercase, T defaultValue)
+    {
         String value = System.getProperty(key);
         if (value == null)
             return defaultValue;
@@ -584,7 +770,8 @@ public enum CassandraRelevantProperties
      * Sets the value into system properties.
      * @param value to set
      */
-    public void setEnum(Enum<?> value) {
+    public void setEnum(Enum<?> value)
+    {
         System.setProperty(key, value.name());
     }
 
@@ -619,7 +806,7 @@ public enum CassandraRelevantProperties
         catch (NumberFormatException e)
         {
             throw new ConfigurationException(String.format("Invalid value for system property: " +
-                                                           "expected integer value but got '%s'", value));
+                                                           "expected long value but got '%s'", value));
         }
     };
 
diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java
index 3dac595041..e07ab98631 100644
--- a/src/java/org/apache/cassandra/config/Config.java
+++ b/src/java/org/apache/cassandra/config/Config.java
@@ -44,6 +44,11 @@ import org.apache.cassandra.fql.FullQueryLoggerOptions;
 import org.apache.cassandra.io.sstable.format.big.BigFormat;
 import org.apache.cassandra.service.StartupChecks.StartupCheckType;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.AUTOCOMPACTION_ON_STARTUP_ENABLED;
+import static org.apache.cassandra.config.CassandraRelevantProperties.FILE_CACHE_ENABLED;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SKIP_PAXOS_REPAIR_ON_TOPOLOGY_CHANGE;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SKIP_PAXOS_REPAIR_ON_TOPOLOGY_CHANGE_KEYSPACES;
+
 /**
  * A class that contains configuration properties for the cassandra node it runs within.
  *
@@ -487,7 +492,7 @@ public class Config
     @Replaces(oldName = "file_cache_size_in_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_INT, deprecated = true)
     public DataStorageSpec.IntMebibytesBound file_cache_size;
 
-    public boolean file_cache_enabled = Boolean.getBoolean("cassandra.file_cache_enabled");
+    public boolean file_cache_enabled = FILE_CACHE_ENABLED.getBoolean();
 
     /**
      * Because of the current {@link org.apache.cassandra.utils.memory.BufferPool} slab sizes of 64 KiB, we
@@ -803,7 +808,7 @@ public class Config
     public volatile boolean check_for_duplicate_rows_during_reads = true;
     public volatile boolean check_for_duplicate_rows_during_compaction = true;
 
-    public boolean autocompaction_on_startup_enabled = Boolean.parseBoolean(System.getProperty("cassandra.autocompaction_on_startup_enabled", "true"));
+    public boolean autocompaction_on_startup_enabled = AUTOCOMPACTION_ON_STARTUP_ENABLED.getBoolean();
 
     // see CASSANDRA-3200 / CASSANDRA-16274
     public volatile boolean auto_optimise_inc_repair_streams = false;
@@ -989,7 +994,7 @@ public class Config
      * rare operation circumstances e.g. where for some reason the repair is impossible to perform (e.g. too few replicas)
      * and an unsafe topology change must be made
      */
-    public volatile boolean skip_paxos_repair_on_topology_change = Boolean.getBoolean("cassandra.skip_paxos_repair_on_topology_change");
+    public volatile boolean skip_paxos_repair_on_topology_change = SKIP_PAXOS_REPAIR_ON_TOPOLOGY_CHANGE.getBoolean();
 
     /**
      * A safety margin when purging paxos state information that has been safely replicated to a quorum.
@@ -1050,7 +1055,7 @@ public class Config
     /**
      * If necessary for operational purposes, permit certain keyspaces to be ignored for paxos topology repairs
      */
-    public volatile Set<String> skip_paxos_repair_on_topology_change_keyspaces = splitCommaDelimited(System.getProperty("cassandra.skip_paxos_repair_on_topology_change_keyspaces"));
+    public volatile Set<String> skip_paxos_repair_on_topology_change_keyspaces = splitCommaDelimited(SKIP_PAXOS_REPAIR_ON_TOPOLOGY_CHANGE_KEYSPACES.getString());
 
     /**
      * See {@link org.apache.cassandra.service.paxos.ContentionStrategy}
diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
index 5dd79a5679..f6f59d0f40 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -101,9 +101,29 @@ import org.apache.cassandra.service.CacheService.CacheType;
 import org.apache.cassandra.service.paxos.Paxos;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.ALLOCATE_TOKENS_FOR_KEYSPACE;
+import static org.apache.cassandra.config.CassandraRelevantProperties.ALLOW_UNLIMITED_CONCURRENT_VALIDATIONS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.AUTO_BOOTSTRAP;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CONFIG_LOADER;
+import static org.apache.cassandra.config.CassandraRelevantProperties.DISABLE_STCS_IN_L0;
+import static org.apache.cassandra.config.CassandraRelevantProperties.INITIAL_TOKEN;
+import static org.apache.cassandra.config.CassandraRelevantProperties.IO_NETTY_TRANSPORT_ESTIMATE_SIZE_ON_SUBMIT;
+import static org.apache.cassandra.config.CassandraRelevantProperties.NATIVE_TRANSPORT_PORT;
 import static org.apache.cassandra.config.CassandraRelevantProperties.OS_ARCH;
+import static org.apache.cassandra.config.CassandraRelevantProperties.PARTITIONER;
+import static org.apache.cassandra.config.CassandraRelevantProperties.REPLACE_ADDRESS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.REPLACE_ADDRESS_FIRST_BOOT;
+import static org.apache.cassandra.config.CassandraRelevantProperties.REPLACE_NODE;
+import static org.apache.cassandra.config.CassandraRelevantProperties.REPLACE_TOKEN;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SEARCH_CONCURRENCY_FACTOR;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SSL_STORAGE_PORT;
+import static org.apache.cassandra.config.CassandraRelevantProperties.STORAGE_DIR;
+import static org.apache.cassandra.config.CassandraRelevantProperties.STORAGE_PORT;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_STRICT_RUNTIME_CHECKS;
 import static org.apache.cassandra.config.CassandraRelevantProperties.SUN_ARCH_DATA_MODEL;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_FAIL_MV_LOCKS_COUNT;
 import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_JVM_DTEST_DISABLE_SSL;
+import static org.apache.cassandra.config.CassandraRelevantProperties.UNSAFE_SYSTEM;
 import static org.apache.cassandra.config.DataRateSpec.DataRateUnit.BYTES_PER_SECOND;
 import static org.apache.cassandra.config.DataRateSpec.DataRateUnit.MEBIBYTES_PER_SECOND;
 import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.MEBIBYTES;
@@ -117,7 +137,7 @@ public class DatabaseDescriptor
     {
         // This static block covers most usages
         FBUtilities.preventIllegalAccessWarnings();
-        System.setProperty("io.netty.transport.estimateSizeOnSubmit", "false");
+        IO_NETTY_TRANSPORT_ESTIMATE_SIZE_ON_SUBMIT.setBoolean(false);
     }
 
     private static final Logger logger = LoggerFactory.getLogger(DatabaseDescriptor.class);
@@ -175,16 +195,16 @@ public class DatabaseDescriptor
     private static boolean toolInitialized;
     private static boolean daemonInitialized;
 
-    private static final int searchConcurrencyFactor = Integer.parseInt(System.getProperty(Config.PROPERTY_PREFIX + "search_concurrency_factor", "1"));
+    private static final int searchConcurrencyFactor = SEARCH_CONCURRENCY_FACTOR.getInt();
     private static DurationSpec.IntSecondsBound autoSnapshoTtl;
 
-    private static volatile boolean disableSTCSInL0 = Boolean.getBoolean(Config.PROPERTY_PREFIX + "disable_stcs_in_l0");
-    private static final boolean unsafeSystem = Boolean.getBoolean(Config.PROPERTY_PREFIX + "unsafesystem");
+    private static volatile boolean disableSTCSInL0 = DISABLE_STCS_IN_L0.getBoolean();
+    private static final boolean unsafeSystem = UNSAFE_SYSTEM.getBoolean();
 
     // turns some warnings into exceptions for testing
-    private static final boolean strictRuntimeChecks = Boolean.getBoolean("cassandra.strict.runtime.checks");
+    private static final boolean strictRuntimeChecks = TEST_STRICT_RUNTIME_CHECKS.getBoolean();
 
-    public static volatile boolean allowUnlimitedConcurrentValidations = Boolean.getBoolean("cassandra.allow_unlimited_concurrent_validations");
+    public static volatile boolean allowUnlimitedConcurrentValidations = ALLOW_UNLIMITED_CONCURRENT_VALIDATIONS.getBoolean();
 
     /** The configuration for guardrails. */
     private static GuardrailsOptions guardrails;
@@ -344,7 +364,7 @@ public class DatabaseDescriptor
         if (Config.getOverrideLoadConfig() != null)
             return Config.getOverrideLoadConfig().get();
 
-        String loaderClass = System.getProperty(Config.PROPERTY_PREFIX + "config.loader");
+        String loaderClass = CONFIG_LOADER.getString();
         ConfigurationLoader loader = loaderClass == null
                                      ? new YamlConfigurationLoader()
                                      : FBUtilities.construct(loaderClass, "configuration loading");
@@ -509,7 +529,7 @@ public class DatabaseDescriptor
             throw new ConfigurationException("concurrent_reads must be at least 2, but was " + conf.concurrent_reads, false);
         }
 
-        if (conf.concurrent_writes < 2 && System.getProperty("cassandra.test.fail_mv_locks_count", "").isEmpty())
+        if (conf.concurrent_writes < 2 && TEST_FAIL_MV_LOCKS_COUNT.getString("").isEmpty())
         {
             throw new ConfigurationException("concurrent_writes must be at least 2, but was " + conf.concurrent_writes, false);
         }
@@ -981,7 +1001,7 @@ public class DatabaseDescriptor
         else if (config.concurrent_validations > config.concurrent_compactors && !allowUnlimitedConcurrentValidations)
         {
             throw new ConfigurationException("To set concurrent_validations > concurrent_compactors, " +
-                                             "set the system property cassandra.allow_unlimited_concurrent_validations=true");
+                                             "set the system property -D" + ALLOW_UNLIMITED_CONCURRENT_VALIDATIONS.getKey() + "=true");
         }
     }
 
@@ -1042,9 +1062,9 @@ public class DatabaseDescriptor
 
     private static String storagedir(String errMsgType)
     {
-        String storagedir = System.getProperty(Config.PROPERTY_PREFIX + "storagedir", null);
+        String storagedir = STORAGE_DIR.getString();
         if (storagedir == null)
-            throw new ConfigurationException(errMsgType + " is missing and -Dcassandra.storagedir is not set", false);
+            throw new ConfigurationException(errMsgType + " is missing and " + STORAGE_DIR.getKey() + " system property is not set", false);
         return storagedir;
     }
 
@@ -1339,7 +1359,7 @@ public class DatabaseDescriptor
         String name = conf.partitioner;
         try
         {
-            name = System.getProperty(Config.PROPERTY_PREFIX + "partitioner", conf.partitioner);
+            name = PARTITIONER.getString(conf.partitioner);
             partitioner = FBUtilities.newPartitioner(name);
         }
         catch (Exception e)
@@ -1805,12 +1825,12 @@ public class DatabaseDescriptor
 
     public static Collection<String> getInitialTokens()
     {
-        return tokensFromString(System.getProperty(Config.PROPERTY_PREFIX + "initial_token", conf.initial_token));
+        return tokensFromString(INITIAL_TOKEN.getString(conf.initial_token));
     }
 
     public static String getAllocateTokensForKeyspace()
     {
-        return System.getProperty(Config.PROPERTY_PREFIX + "allocate_tokens_for_keyspace", conf.allocate_tokens_for_keyspace);
+        return ALLOCATE_TOKENS_FOR_KEYSPACE.getString(conf.allocate_tokens_for_keyspace);
     }
 
     public static Integer getAllocateTokensForLocalRf()
@@ -1836,10 +1856,14 @@ public class DatabaseDescriptor
     {
         try
         {
-            if (System.getProperty(Config.PROPERTY_PREFIX + "replace_address", null) != null)
-                return InetAddressAndPort.getByName(System.getProperty(Config.PROPERTY_PREFIX + "replace_address", null));
-            else if (System.getProperty(Config.PROPERTY_PREFIX + "replace_address_first_boot", null) != null)
-                return InetAddressAndPort.getByName(System.getProperty(Config.PROPERTY_PREFIX + "replace_address_first_boot", null));
+            String replaceAddress = REPLACE_ADDRESS.getString();
+            if (replaceAddress != null)
+                return InetAddressAndPort.getByName(replaceAddress);
+
+            String replaceAddressFirsstBoot = REPLACE_ADDRESS_FIRST_BOOT.getString();
+            if (replaceAddressFirsstBoot != null)
+                return InetAddressAndPort.getByName(replaceAddressFirsstBoot);
+
             return null;
         }
         catch (UnknownHostException e)
@@ -1850,14 +1874,14 @@ public class DatabaseDescriptor
 
     public static Collection<String> getReplaceTokens()
     {
-        return tokensFromString(System.getProperty(Config.PROPERTY_PREFIX + "replace_token", null));
+        return tokensFromString(REPLACE_TOKEN.getString());
     }
 
     public static UUID getReplaceNode()
     {
         try
         {
-            return UUID.fromString(System.getProperty(Config.PROPERTY_PREFIX + "replace_node", null));
+            return UUID.fromString(REPLACE_NODE.getString());
         } catch (NullPointerException e)
         {
             return null;
@@ -1871,12 +1895,12 @@ public class DatabaseDescriptor
 
     public static int getStoragePort()
     {
-        return Integer.parseInt(System.getProperty(Config.PROPERTY_PREFIX + "storage_port", Integer.toString(conf.storage_port)));
+        return STORAGE_PORT.getInt(conf.storage_port);
     }
 
     public static int getSSLStoragePort()
     {
-        return Integer.parseInt(System.getProperty(Config.PROPERTY_PREFIX + "ssl_storage_port", Integer.toString(conf.ssl_storage_port)));
+        return SSL_STORAGE_PORT.getInt(conf.ssl_storage_port);
     }
 
     public static long nativeTransportIdleTimeout()
@@ -2683,7 +2707,7 @@ public class DatabaseDescriptor
      */
     public static int getNativeTransportPort()
     {
-        return Integer.parseInt(System.getProperty(Config.PROPERTY_PREFIX + "native_transport_port", Integer.toString(conf.native_transport_port)));
+        return NATIVE_TRANSPORT_PORT.getInt(conf.native_transport_port);
     }
 
     @VisibleForTesting
@@ -3086,7 +3110,7 @@ public class DatabaseDescriptor
 
     public static boolean isAutoBootstrap()
     {
-        return Boolean.parseBoolean(System.getProperty(Config.PROPERTY_PREFIX + "auto_bootstrap", Boolean.toString(conf.auto_bootstrap)));
+        return AUTO_BOOTSTRAP.getBoolean(conf.auto_bootstrap);
     }
 
     public static void setHintedHandoffEnabled(boolean hintedHandoffEnabled)
diff --git a/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java b/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java
index 528accdb74..cf5e52f5dc 100644
--- a/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java
+++ b/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java
@@ -29,7 +29,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
-
 import javax.annotation.Nullable;
 
 import com.google.common.annotations.VisibleForTesting;
@@ -46,8 +45,8 @@ import org.yaml.snakeyaml.LoaderOptions;
 import org.yaml.snakeyaml.TypeDescription;
 import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.composer.Composer;
-import org.yaml.snakeyaml.constructor.SafeConstructor;
 import org.yaml.snakeyaml.constructor.CustomClassLoaderConstructor;
+import org.yaml.snakeyaml.constructor.SafeConstructor;
 import org.yaml.snakeyaml.error.YAMLException;
 import org.yaml.snakeyaml.introspector.MissingProperty;
 import org.yaml.snakeyaml.introspector.Property;
@@ -56,13 +55,13 @@ import org.yaml.snakeyaml.nodes.Node;
 
 import static org.apache.cassandra.config.CassandraRelevantProperties.ALLOW_DUPLICATE_CONFIG_KEYS;
 import static org.apache.cassandra.config.CassandraRelevantProperties.ALLOW_NEW_OLD_CONFIG_KEYS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_CONFIG;
 import static org.apache.cassandra.config.Replacements.getNameReplacements;
 
 public class YamlConfigurationLoader implements ConfigurationLoader
 {
     private static final Logger logger = LoggerFactory.getLogger(YamlConfigurationLoader.class);
 
-    private final static String DEFAULT_CONFIGURATION = "cassandra.yaml";
     /**
      * This is related to {@link Config#PROPERTY_PREFIX} but is different to make sure Config properties updated via
      * system properties do not conflict with other system properties; the name "settings" matches system_views.settings.
@@ -74,9 +73,7 @@ public class YamlConfigurationLoader implements ConfigurationLoader
      */
     private static URL getStorageConfigURL() throws ConfigurationException
     {
-        String configUrl = System.getProperty("cassandra.config");
-        if (configUrl == null)
-            configUrl = DEFAULT_CONFIGURATION;
+        String configUrl = CASSANDRA_CONFIG.getString();
 
         URL url;
         try
diff --git a/src/java/org/apache/cassandra/cql3/CustomPayloadMirroringQueryHandler.java b/src/java/org/apache/cassandra/cql3/CustomPayloadMirroringQueryHandler.java
index 13aa7f5149..af765d02c5 100644
--- a/src/java/org/apache/cassandra/cql3/CustomPayloadMirroringQueryHandler.java
+++ b/src/java/org/apache/cassandra/cql3/CustomPayloadMirroringQueryHandler.java
@@ -20,6 +20,7 @@ package org.apache.cassandra.cql3;
 import java.nio.ByteBuffer;
 import java.util.Map;
 
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.cql3.statements.BatchStatement;
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.QueryState;
@@ -29,7 +30,7 @@ import org.apache.cassandra.utils.MD5Digest;
 /**
  * Custom QueryHandler that sends custom request payloads back with the result.
  * Used to facilitate testing.
- * Enabled with system property cassandra.custom_query_handler_class.
+ * Enabled with system property {@link CassandraRelevantProperties#CUSTOM_QUERY_HANDLER_CLASS}.
  */
 public class CustomPayloadMirroringQueryHandler implements QueryHandler
 {
diff --git a/src/java/org/apache/cassandra/cql3/functions/UDFExecutorService.java b/src/java/org/apache/cassandra/cql3/functions/UDFExecutorService.java
index 3b7631faab..19705451b7 100644
--- a/src/java/org/apache/cassandra/cql3/functions/UDFExecutorService.java
+++ b/src/java/org/apache/cassandra/cql3/functions/UDFExecutorService.java
@@ -22,6 +22,7 @@ import org.apache.cassandra.concurrent.NamedThreadFactory;
 import org.apache.cassandra.concurrent.ThreadPoolExecutorBase;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.UDF_EXECUTOR_THREAD_KEEPALIVE_MS;
 import static org.apache.cassandra.utils.FBUtilities.getAvailableProcessors;
 import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQueue;
 
@@ -33,7 +34,7 @@ import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQu
  */
 final class UDFExecutorService extends ThreadPoolExecutorBase
 {
-    private static final int KEEPALIVE = Integer.getInteger("cassandra.udf_executor_thread_keepalive_ms", 30000);
+    private static final int KEEPALIVE = UDF_EXECUTOR_THREAD_KEEPALIVE_MS.getInt();
 
     public UDFExecutorService(NamedThreadFactory threadFactory, String jmxPath)
     {
diff --git a/src/java/org/apache/cassandra/cql3/statements/schema/AlterKeyspaceStatement.java b/src/java/org/apache/cassandra/cql3/statements/schema/AlterKeyspaceStatement.java
index dec0655e74..b8a27af3ba 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/AlterKeyspaceStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/AlterKeyspaceStatement.java
@@ -26,7 +26,6 @@ import java.util.stream.Stream;
 import org.apache.cassandra.audit.AuditLogContext;
 import org.apache.cassandra.audit.AuditLogEntryType;
 import org.apache.cassandra.auth.Permission;
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CQLStatement;
 import org.apache.cassandra.db.ColumnFamilyStore;
@@ -48,10 +47,13 @@ import org.apache.cassandra.transport.Event.SchemaChange;
 import org.apache.cassandra.transport.Event.SchemaChange.Change;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.ALLOW_ALTER_RF_DURING_RANGE_MOVEMENT;
+import static org.apache.cassandra.config.CassandraRelevantProperties.ALLOW_UNSAFE_TRANSIENT_CHANGES;
+
 public final class AlterKeyspaceStatement extends AlterSchemaStatement
 {
-    private static final boolean allow_alter_rf_during_range_movement = Boolean.getBoolean(Config.PROPERTY_PREFIX + "allow_alter_rf_during_range_movement");
-    private static final boolean allow_unsafe_transient_changes = Boolean.getBoolean(Config.PROPERTY_PREFIX + "allow_unsafe_transient_changes");
+    private static final boolean allow_alter_rf_during_range_movement = ALLOW_ALTER_RF_DURING_RANGE_MOVEMENT.getBoolean();
+    private static final boolean allow_unsafe_transient_changes = ALLOW_UNSAFE_TRANSIENT_CHANGES.getBoolean();
     private final HashSet<String> clientWarnings = new HashSet<>();
 
     private final KeyspaceAttributes attrs;
diff --git a/src/java/org/apache/cassandra/cql3/statements/schema/CreateViewStatement.java b/src/java/org/apache/cassandra/cql3/statements/schema/CreateViewStatement.java
index 7a2586a95e..ed7a9a1190 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/CreateViewStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/CreateViewStatement.java
@@ -50,6 +50,7 @@ import static java.lang.String.join;
 import static com.google.common.collect.Iterables.concat;
 import static com.google.common.collect.Iterables.filter;
 import static com.google.common.collect.Iterables.transform;
+import static org.apache.cassandra.config.CassandraRelevantProperties.MV_ALLOW_FILTERING_NONKEY_COLUMNS_UNSAFE;
 
 public final class CreateViewStatement extends AlterSchemaStatement
 {
@@ -294,7 +295,7 @@ public final class CreateViewStatement extends AlterSchemaStatement
 
         // See CASSANDRA-13798
         Set<ColumnMetadata> restrictedNonPrimaryKeyColumns = restrictions.nonPKRestrictedColumns(false);
-        if (!restrictedNonPrimaryKeyColumns.isEmpty() && !Boolean.getBoolean("cassandra.mv.allow_filtering_nonkey_columns_unsafe"))
+        if (!restrictedNonPrimaryKeyColumns.isEmpty() && !MV_ALLOW_FILTERING_NONKEY_COLUMNS_UNSAFE.getBoolean())
         {
             throw ire("Non-primary key columns can only be restricted with 'IS NOT NULL' (got: %s restricted illegally)",
                       join(",", transform(restrictedNonPrimaryKeyColumns, ColumnMetadata::toString)));
diff --git a/src/java/org/apache/cassandra/db/ExpirationDateOverflowHandling.java b/src/java/org/apache/cassandra/db/ExpirationDateOverflowHandling.java
index 7f81b5c413..f9207cea4b 100644
--- a/src/java/org/apache/cassandra/db/ExpirationDateOverflowHandling.java
+++ b/src/java/org/apache/cassandra/db/ExpirationDateOverflowHandling.java
@@ -25,6 +25,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.helpers.MessageFormatter;
 
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.db.rows.BufferCell;
 import org.apache.cassandra.db.rows.Cell;
 import org.apache.cassandra.exceptions.InvalidRequestException;
@@ -32,13 +33,14 @@ import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.ClientWarn;
 import org.apache.cassandra.utils.NoSpamLogger;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.EXPIRATION_DATE_OVERFLOW_POLICY;
 import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 public class ExpirationDateOverflowHandling
 {
     private static final Logger logger = LoggerFactory.getLogger(ExpirationDateOverflowHandling.class);
 
-    private static final int EXPIRATION_OVERFLOW_WARNING_INTERVAL_MINUTES = Integer.getInteger("cassandra.expiration_overflow_warning_interval_minutes", 5);
+    private static final int EXPIRATION_OVERFLOW_WARNING_INTERVAL_MINUTES = CassandraRelevantProperties.EXPIRATION_OVERFLOW_WARNING_INTERVAL_MINUTES.getInt();
 
     public enum ExpirationDateOverflowPolicy
     {
@@ -49,14 +51,13 @@ public class ExpirationDateOverflowHandling
     public static ExpirationDateOverflowPolicy policy;
 
     static {
-        String policyAsString = System.getProperty("cassandra.expiration_date_overflow_policy", ExpirationDateOverflowPolicy.REJECT.name());
         try
         {
-            policy = ExpirationDateOverflowPolicy.valueOf(policyAsString.toUpperCase());
+            policy = EXPIRATION_DATE_OVERFLOW_POLICY.getEnum(ExpirationDateOverflowPolicy.REJECT);
         }
         catch (RuntimeException e)
         {
-            logger.warn("Invalid expiration date overflow policy: {}. Using default: {}", policyAsString, ExpirationDateOverflowPolicy.REJECT.name());
+            logger.warn("Invalid expiration date overflow policy. Using default: {}", ExpirationDateOverflowPolicy.REJECT.name());
             policy = ExpirationDateOverflowPolicy.REJECT;
         }
     }
diff --git a/src/java/org/apache/cassandra/db/Keyspace.java b/src/java/org/apache/cassandra/db/Keyspace.java
index 9dc4d4c189..22721bdcf1 100644
--- a/src/java/org/apache/cassandra/db/Keyspace.java
+++ b/src/java/org/apache/cassandra/db/Keyspace.java
@@ -40,6 +40,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.concurrent.Stage;
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.DurationSpec;
 import org.apache.cassandra.db.lifecycle.SSTableSet;
@@ -87,9 +88,9 @@ public class Keyspace
 {
     private static final Logger logger = LoggerFactory.getLogger(Keyspace.class);
 
-    private static final String TEST_FAIL_WRITES_KS = System.getProperty("cassandra.test.fail_writes_ks", "");
+    private static final String TEST_FAIL_WRITES_KS = CassandraRelevantProperties.TEST_FAIL_WRITES_KS.getString();
     private static final boolean TEST_FAIL_WRITES = !TEST_FAIL_WRITES_KS.isEmpty();
-    private static int TEST_FAIL_MV_LOCKS_COUNT = Integer.getInteger("cassandra.test.fail_mv_locks_count", 0);
+    private static int TEST_FAIL_MV_LOCKS_COUNT = CassandraRelevantProperties.TEST_FAIL_MV_LOCKS_COUNT.getInt();
 
     public final KeyspaceMetrics metric;
 
diff --git a/src/java/org/apache/cassandra/db/ReadCommand.java b/src/java/org/apache/cassandra/db/ReadCommand.java
index 0978b8ef05..9cfcb3a3d3 100644
--- a/src/java/org/apache/cassandra/db/ReadCommand.java
+++ b/src/java/org/apache/cassandra/db/ReadCommand.java
@@ -85,7 +85,7 @@ import static org.apache.cassandra.db.partitions.UnfilteredPartitionIterators.Me
  */
 public abstract class ReadCommand extends AbstractReadQuery
 {
-    private static final int TEST_ITERATION_DELAY_MILLIS = Integer.parseInt(System.getProperty("cassandra.test.read_iteration_delay_ms", "0"));
+    private static final int TEST_ITERATION_DELAY_MILLIS = CassandraRelevantProperties.TEST_READ_ITERATION_DELAY_MS.getInt();
 
     protected static final Logger logger = LoggerFactory.getLogger(ReadCommand.class);
     public static final IVersionedSerializer<ReadCommand> serializer = new Serializer();
diff --git a/src/java/org/apache/cassandra/db/StorageHook.java b/src/java/org/apache/cassandra/db/StorageHook.java
index 7014ae4d8b..f5fdec6a56 100644
--- a/src/java/org/apache/cassandra/db/StorageHook.java
+++ b/src/java/org/apache/cassandra/db/StorageHook.java
@@ -28,6 +28,8 @@ import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.STORAGE_HOOK;
+
 public interface StorageHook
 {
     public static final StorageHook instance = createHook();
@@ -50,7 +52,7 @@ public interface StorageHook
 
     static StorageHook createHook()
     {
-        String className =  System.getProperty("cassandra.storage_hook");
+        String className = STORAGE_HOOK.getString();
         if (className != null)
         {
             return FBUtilities.construct(className, StorageHook.class.getSimpleName());
diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogReplayer.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogReplayer.java
index b9421e357f..a50273caaa 100644
--- a/src/java/org/apache/cassandra/db/commitlog/CommitLogReplayer.java
+++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogReplayer.java
@@ -38,7 +38,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.concurrent.Stage;
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
@@ -56,17 +55,19 @@ import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.WrappedRunnable;
 
 import static java.lang.String.format;
+import static org.apache.cassandra.config.CassandraRelevantProperties.COMMITLOG_IGNORE_REPLAY_ERRORS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.COMMITLOG_MAX_OUTSTANDING_REPLAY_BYTES;
+import static org.apache.cassandra.config.CassandraRelevantProperties.COMMITLOG_MAX_OUTSTANDING_REPLAY_COUNT;
 import static org.apache.cassandra.config.CassandraRelevantProperties.COMMIT_LOG_REPLAY_LIST;
 
 public class CommitLogReplayer implements CommitLogReadHandler
 {
     @VisibleForTesting
-    public static long MAX_OUTSTANDING_REPLAY_BYTES = Long.getLong("cassandra.commitlog_max_outstanding_replay_bytes", 1024 * 1024 * 64);
+    public static long MAX_OUTSTANDING_REPLAY_BYTES = COMMITLOG_MAX_OUTSTANDING_REPLAY_BYTES.getLong();
     @VisibleForTesting
     public static MutationInitiator mutationInitiator = new MutationInitiator();
-    static final String IGNORE_REPLAY_ERRORS_PROPERTY = Config.PROPERTY_PREFIX + "commitlog.ignorereplayerrors";
     private static final Logger logger = LoggerFactory.getLogger(CommitLogReplayer.class);
-    private static final int MAX_OUTSTANDING_REPLAY_COUNT = Integer.getInteger(Config.PROPERTY_PREFIX + "commitlog_max_outstanding_replay_count", 1024);
+    private static final int MAX_OUTSTANDING_REPLAY_COUNT = COMMITLOG_MAX_OUTSTANDING_REPLAY_COUNT.getInt();
 
     private final Set<Keyspace> keyspacesReplayed;
     private final Queue<Future<Integer>> futures;
@@ -525,13 +526,13 @@ public class CommitLogReplayer implements CommitLogReadHandler
     {
         if (exception.permissible)
             logger.error("Ignoring commit log replay error likely due to incomplete flush to disk", exception);
-        else if (Boolean.getBoolean(IGNORE_REPLAY_ERRORS_PROPERTY))
+        else if (COMMITLOG_IGNORE_REPLAY_ERRORS.getBoolean())
             logger.error("Ignoring commit log replay error", exception);
         else if (!CommitLog.handleCommitError("Failed commit log replay", exception))
         {
             logger.error("Replay stopped. If you wish to override this error and continue starting the node ignoring " +
-                         "commit log replay problems, specify -D" + IGNORE_REPLAY_ERRORS_PROPERTY + "=true " +
-                         "on the command line");
+                         "commit log replay problems, specify -D{}=true on the command line",
+                         COMMITLOG_IGNORE_REPLAY_ERRORS.getKey());
             throw new CommitLogReplayException(exception.getMessage(), exception);
         }
         return false;
diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentReader.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentReader.java
index 33e70c10ae..964fe49754 100644
--- a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentReader.java
+++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentReader.java
@@ -29,7 +29,6 @@ import com.google.common.collect.AbstractIterator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.db.commitlog.EncryptedFileSegmentInputStream.ChunkProvider;
 import org.apache.cassandra.db.commitlog.CommitLogReadHandler.*;
 import org.apache.cassandra.io.FSReadError;
@@ -42,6 +41,7 @@ import org.apache.cassandra.security.EncryptionUtils;
 import org.apache.cassandra.security.EncryptionContext;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.COMMITLOG_ALLOW_IGNORE_SYNC_CRC;
 import static org.apache.cassandra.db.commitlog.CommitLogSegment.SYNC_MARKER_SIZE;
 import static org.apache.cassandra.utils.FBUtilities.updateChecksumInt;
 
@@ -50,8 +50,7 @@ import static org.apache.cassandra.utils.FBUtilities.updateChecksumInt;
  */
 public class CommitLogSegmentReader implements Iterable<CommitLogSegmentReader.SyncSegment>
 {
-    public static final String ALLOW_IGNORE_SYNC_CRC = Config.PROPERTY_PREFIX + "commitlog.allow_ignore_sync_crc";
-    private static volatile boolean allowSkipSyncMarkerCrc = Boolean.getBoolean(ALLOW_IGNORE_SYNC_CRC);
+    private static volatile boolean allowSkipSyncMarkerCrc = COMMITLOG_ALLOW_IGNORE_SYNC_CRC.getBoolean();
 
     private static final Logger logger = LoggerFactory.getLogger(CommitLogSegmentReader.class);
     
diff --git a/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java
index 5fbece5210..2eb119dad3 100644
--- a/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java
+++ b/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java
@@ -399,7 +399,7 @@ public abstract class AbstractCompactionStrategy
      */
     protected boolean worthDroppingTombstones(SSTableReader sstable, int gcBefore)
     {
-        if (disableTombstoneCompactions || CompactionController.NEVER_PURGE_TOMBSTONES || cfs.getNeverPurgeTombstones())
+        if (disableTombstoneCompactions || CompactionController.NEVER_PURGE_TOMBSTONES_PROPERTY_VALUE || cfs.getNeverPurgeTombstones())
             return false;
         // since we use estimations to calculate, there is a chance that compaction will not drop tombstones actually.
         // if that happens we will end up in infinite compaction loop, so first we check enough if enough time has
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionController.java b/src/java/org/apache/cassandra/db/compaction/CompactionController.java
index e289e71b6d..3038222849 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionController.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionController.java
@@ -33,7 +33,6 @@ import com.google.common.util.concurrent.RateLimiter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.db.AbstractCompactionController;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.DecoratedKey;
@@ -47,6 +46,7 @@ import org.apache.cassandra.schema.CompactionParams.TombstoneOption;
 import org.apache.cassandra.utils.OverlapIterator;
 import org.apache.cassandra.utils.concurrent.Refs;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.NEVER_PURGE_TOMBSTONES;
 import static org.apache.cassandra.db.lifecycle.SSTableIntervalTree.buildIntervals;
 
 /**
@@ -55,8 +55,7 @@ import static org.apache.cassandra.db.lifecycle.SSTableIntervalTree.buildInterva
 public class CompactionController extends AbstractCompactionController
 {
     private static final Logger logger = LoggerFactory.getLogger(CompactionController.class);
-    private static final String NEVER_PURGE_TOMBSTONES_PROPERTY = Config.PROPERTY_PREFIX + "never_purge_tombstones";
-    static final boolean NEVER_PURGE_TOMBSTONES = Boolean.getBoolean(NEVER_PURGE_TOMBSTONES_PROPERTY);
+    static final boolean NEVER_PURGE_TOMBSTONES_PROPERTY_VALUE = NEVER_PURGE_TOMBSTONES.getBoolean();
 
     private final boolean compactingRepaired;
     // note that overlapIterator and overlappingSSTables will be null if NEVER_PURGE_TOMBSTONES is set - this is a
@@ -90,16 +89,15 @@ public class CompactionController extends AbstractCompactionController
                           ? compacting.stream().mapToLong(SSTableReader::getMinTimestamp).min().getAsLong()
                           : 0;
         refreshOverlaps();
-        if (NEVER_PURGE_TOMBSTONES)
-            logger.warn("You are running with -Dcassandra.never_purge_tombstones=true, this is dangerous!");
+        if (NEVER_PURGE_TOMBSTONES_PROPERTY_VALUE)
+            logger.warn("You are running with -D{}=true, this is dangerous!", NEVER_PURGE_TOMBSTONES.getKey());
     }
 
     public void maybeRefreshOverlaps()
     {
-        if (NEVER_PURGE_TOMBSTONES)
+        if (NEVER_PURGE_TOMBSTONES_PROPERTY_VALUE)
         {
-            logger.debug("not refreshing overlaps - running with -D{}=true",
-                    NEVER_PURGE_TOMBSTONES_PROPERTY);
+            logger.debug("not refreshing overlaps - running with -D{}=true", NEVER_PURGE_TOMBSTONES.getKey());
             return;
         }
 
@@ -121,7 +119,7 @@ public class CompactionController extends AbstractCompactionController
 
     private void refreshOverlaps()
     {
-        if (NEVER_PURGE_TOMBSTONES || cfs.getNeverPurgeTombstones())
+        if (NEVER_PURGE_TOMBSTONES_PROPERTY_VALUE || cfs.getNeverPurgeTombstones())
             return;
 
         if (this.overlappingSSTables != null)
@@ -164,7 +162,7 @@ public class CompactionController extends AbstractCompactionController
     {
         logger.trace("Checking droppable sstables in {}", cfStore);
 
-        if (NEVER_PURGE_TOMBSTONES || compacting == null || cfStore.getNeverPurgeTombstones() || overlapping == null)
+        if (NEVER_PURGE_TOMBSTONES_PROPERTY_VALUE || compacting == null || cfStore.getNeverPurgeTombstones() || overlapping == null)
             return Collections.emptySet();
 
         if (cfStore.getCompactionStrategyManager().onlyPurgeRepairedTombstones() && !Iterables.all(compacting, SSTableReader::isRepaired))
@@ -250,7 +248,7 @@ public class CompactionController extends AbstractCompactionController
     @Override
     public LongPredicate getPurgeEvaluator(DecoratedKey key)
     {
-        if (NEVER_PURGE_TOMBSTONES || !compactingRepaired() || cfs.getNeverPurgeTombstones() || overlapIterator == null)
+        if (NEVER_PURGE_TOMBSTONES_PROPERTY_VALUE || !compactingRepaired() || cfs.getNeverPurgeTombstones() || overlapIterator == null)
             return time -> false;
 
         overlapIterator.update(key);
@@ -311,7 +309,7 @@ public class CompactionController extends AbstractCompactionController
     // caller must close iterators
     public Iterable<UnfilteredRowIterator> shadowSources(DecoratedKey key, boolean tombstoneOnly)
     {
-        if (!provideTombstoneSources() || !compactingRepaired() || NEVER_PURGE_TOMBSTONES || cfs.getNeverPurgeTombstones())
+        if (!provideTombstoneSources() || !compactingRepaired() || NEVER_PURGE_TOMBSTONES_PROPERTY_VALUE || cfs.getNeverPurgeTombstones())
             return null;
         overlapIterator.update(key);
         return Iterables.filter(Iterables.transform(overlapIterator.overlaps(),
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionLogger.java b/src/java/org/apache/cassandra/db/compaction/CompactionLogger.java
index 9bf063b726..8d02da9d4a 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionLogger.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionLogger.java
@@ -49,6 +49,7 @@ import org.apache.cassandra.utils.ExecutorUtils;
 import org.apache.cassandra.utils.NoSpamLogger;
 
 import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.config.CassandraRelevantProperties.LOG_DIR;
 import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 public class CompactionLogger
@@ -300,7 +301,7 @@ public class CompactionLogger
 
     private static class CompactionLogSerializer implements Writer
     {
-        private static final String logDirectory = System.getProperty("cassandra.logdir", ".");
+        private static final String logDirectory = LOG_DIR.getString();
         private final ExecutorPlus loggerService = executorFactory().sequential("CompactionLogger");
         // This is only accessed on the logger service thread, so it does not need to be thread safe
         private final Set<Object> rolled = new HashSet<>();
diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java
index e4b2cff296..bbdd13cb07 100644
--- a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java
+++ b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java
@@ -33,7 +33,6 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.cassandra.io.sstable.metadata.StatsMetadata;
 import org.apache.cassandra.schema.CompactionParams;
 import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
 import org.apache.cassandra.db.rows.UnfilteredRowIterator;
@@ -43,11 +42,13 @@ import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.io.sstable.ISSTableScanner;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TOLERATE_SSTABLE_SIZE;
+
 public class LeveledCompactionStrategy extends AbstractCompactionStrategy
 {
     private static final Logger logger = LoggerFactory.getLogger(LeveledCompactionStrategy.class);
     private static final String SSTABLE_SIZE_OPTION = "sstable_size_in_mb";
-    private static final boolean tolerateSstableSize = Boolean.getBoolean(Config.PROPERTY_PREFIX + "tolerate_sstable_size");
+    private static final boolean tolerateSstableSize = TOLERATE_SSTABLE_SIZE.getBoolean();
     private static final String LEVEL_FANOUT_SIZE_OPTION = "fanout_size";
     private static final String SINGLE_SSTABLE_UPLEVEL_OPTION = "single_sstable_uplevel";
     public static final int DEFAULT_LEVEL_FANOUT_SIZE = 10;
diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledGenerations.java b/src/java/org/apache/cassandra/db/compaction/LeveledGenerations.java
index 36b56003d5..08cda89c85 100644
--- a/src/java/org/apache/cassandra/db/compaction/LeveledGenerations.java
+++ b/src/java/org/apache/cassandra/db/compaction/LeveledGenerations.java
@@ -37,11 +37,11 @@ import com.google.common.collect.PeekingIterator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.io.sstable.SSTableIdFactory;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_STRICT_LCS_CHECKS;
 import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 /**
@@ -52,7 +52,7 @@ import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 class LeveledGenerations
 {
     private static final Logger logger = LoggerFactory.getLogger(LeveledGenerations.class);
-    private final boolean strictLCSChecksTest = Boolean.getBoolean(Config.PROPERTY_PREFIX + "test.strict_lcs_checks");
+    private final boolean strictLCSChecksTest = TEST_STRICT_LCS_CHECKS.getBoolean();
     // It includes L0, i.e. we support [L0 - L8] levels
     static final int MAX_LEVEL_COUNT = 9;
 
diff --git a/src/java/org/apache/cassandra/db/compaction/TimeWindowCompactionStrategyOptions.java b/src/java/org/apache/cassandra/db/compaction/TimeWindowCompactionStrategyOptions.java
index cdb89528c7..b9312a02f1 100644
--- a/src/java/org/apache/cassandra/db/compaction/TimeWindowCompactionStrategyOptions.java
+++ b/src/java/org/apache/cassandra/db/compaction/TimeWindowCompactionStrategyOptions.java
@@ -26,9 +26,10 @@ import java.util.concurrent.TimeUnit;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.exceptions.ConfigurationException;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.ALLOW_UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION;
+
 public final class TimeWindowCompactionStrategyOptions
 {
     private static final Logger logger = LoggerFactory.getLogger(TimeWindowCompactionStrategyOptions.class);
@@ -45,7 +46,7 @@ public final class TimeWindowCompactionStrategyOptions
     public static final String EXPIRED_SSTABLE_CHECK_FREQUENCY_SECONDS_KEY = "expired_sstable_check_frequency_seconds";
     public static final String UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION_KEY = "unsafe_aggressive_sstable_expiration";
 
-    static final String UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION_PROPERTY = Config.PROPERTY_PREFIX + "allow_unsafe_aggressive_sstable_expiration";
+    static final boolean UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION_ENABLED = ALLOW_UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION.getBoolean();
 
     protected final int sstableWindowSize;
     protected final TimeUnit sstableWindowUnit;
@@ -75,7 +76,7 @@ public final class TimeWindowCompactionStrategyOptions
         expiredSSTableCheckFrequency = TimeUnit.MILLISECONDS.convert(optionValue == null ? DEFAULT_EXPIRED_SSTABLE_CHECK_FREQUENCY_SECONDS : Long.parseLong(optionValue), TimeUnit.SECONDS);
 
         optionValue = options.get(UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION_KEY);
-        ignoreOverlaps = optionValue == null ? DEFAULT_UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION : (Boolean.getBoolean(UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION_PROPERTY) && Boolean.parseBoolean(optionValue));
+        ignoreOverlaps = optionValue == null ? DEFAULT_UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION : (UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION_ENABLED && Boolean.parseBoolean(optionValue));
 
         stcsOptions = new SizeTieredCompactionStrategyOptions(options);
     }
@@ -153,8 +154,9 @@ public final class TimeWindowCompactionStrategyOptions
             if (!(optionValue.equalsIgnoreCase("true") || optionValue.equalsIgnoreCase("false")))
                 throw new ConfigurationException(String.format("%s is not 'true' or 'false' (%s)", UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION_KEY, optionValue));
 
-            if(optionValue.equalsIgnoreCase("true") && !Boolean.getBoolean(UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION_PROPERTY))
-                throw new ConfigurationException(String.format("%s is requested but not allowed, restart cassandra with -D%s=true to allow it", UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION_KEY, UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION_PROPERTY));
+            if (optionValue.equalsIgnoreCase("true") && !UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION_ENABLED)
+                throw new ConfigurationException(String.format("%s is requested but not allowed, restart cassandra with -D%s=true to allow it",
+                                                               UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION_KEY, ALLOW_UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION.getKey()));
         }
 
         uncheckedOptions.remove(COMPACTION_WINDOW_SIZE_KEY);
diff --git a/src/java/org/apache/cassandra/db/guardrails/GuardrailsConfigProvider.java b/src/java/org/apache/cassandra/db/guardrails/GuardrailsConfigProvider.java
index 6128764b18..280467e8c8 100644
--- a/src/java/org/apache/cassandra/db/guardrails/GuardrailsConfigProvider.java
+++ b/src/java/org/apache/cassandra/db/guardrails/GuardrailsConfigProvider.java
@@ -24,6 +24,8 @@ import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CUSTOM_GUARDRAILS_CONFIG_PROVIDER_CLASS;
+
 /**
  * Provider of {@link GuardrailsConfig}s for a {@link ClientState}.
  * <p>
@@ -37,11 +39,14 @@ import org.apache.cassandra.utils.FBUtilities;
  */
 public interface GuardrailsConfigProvider
 {
-    public static final String CUSTOM_IMPLEMENTATION_PROPERTY = "cassandra.custom_guardrails_config_provider_class";
+    /**
+     * @deprecated CUSTOM_GUARDRAILS_CONFIG_PROVIDER_CLASS.getKey() must be used instead.
+     */
+    @Deprecated
+    public static final String CUSTOM_IMPLEMENTATION_PROPERTY = CUSTOM_GUARDRAILS_CONFIG_PROVIDER_CLASS.getKey();
 
-    static final GuardrailsConfigProvider instance = System.getProperty(CUSTOM_IMPLEMENTATION_PROPERTY) == null
-                                                     ? new Default()
-                                                     : build(System.getProperty(CUSTOM_IMPLEMENTATION_PROPERTY));
+    GuardrailsConfigProvider instance = CUSTOM_GUARDRAILS_CONFIG_PROVIDER_CLASS.getString() == null ?
+                                        new Default() : build(CUSTOM_GUARDRAILS_CONFIG_PROVIDER_CLASS.getString());
 
     /**
      * Returns the {@link GuardrailsConfig} to be used for the specified {@link ClientState}.
diff --git a/src/java/org/apache/cassandra/db/marshal/EmptyType.java b/src/java/org/apache/cassandra/db/marshal/EmptyType.java
index 8064f22977..33c45240a3 100644
--- a/src/java/org/apache/cassandra/db/marshal/EmptyType.java
+++ b/src/java/org/apache/cassandra/db/marshal/EmptyType.java
@@ -37,6 +37,8 @@ import org.apache.cassandra.utils.bytecomparable.ByteComparable;
 import org.apache.cassandra.utils.bytecomparable.ByteSource;
 import org.apache.cassandra.utils.NoSpamLogger;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.SERIALIZATION_EMPTY_TYPE_NONEMPTY_BEHAVIOR;
+
 /**
  * A type that only accept empty data.
  * It is only useful as a value validation type, not as a comparator since column names can't be empty.
@@ -46,13 +48,12 @@ public class EmptyType extends AbstractType<Void>
     private enum NonEmptyWriteBehavior { FAIL, LOG_DATA_LOSS, SILENT_DATA_LOSS }
 
     private static final Logger logger = LoggerFactory.getLogger(EmptyType.class);
-    private static final String KEY_EMPTYTYPE_NONEMPTY_BEHAVIOR = "cassandra.serialization.emptytype.nonempty_behavior";
     private static final NoSpamLogger NON_EMPTY_WRITE_LOGGER = NoSpamLogger.getLogger(logger, 1, TimeUnit.MINUTES);
     private static final NonEmptyWriteBehavior NON_EMPTY_WRITE_BEHAVIOR = parseNonEmptyWriteBehavior();
 
     private static NonEmptyWriteBehavior parseNonEmptyWriteBehavior()
     {
-        String value = System.getProperty(KEY_EMPTYTYPE_NONEMPTY_BEHAVIOR);
+        String value = SERIALIZATION_EMPTY_TYPE_NONEMPTY_BEHAVIOR.getString();
         if (value == null)
             return NonEmptyWriteBehavior.FAIL;
         try
@@ -61,7 +62,7 @@ public class EmptyType extends AbstractType<Void>
         }
         catch (Exception e)
         {
-            logger.warn("Unable to parse property " + KEY_EMPTYTYPE_NONEMPTY_BEHAVIOR + ", falling back to FAIL", e);
+            logger.warn("Unable to parse property " + SERIALIZATION_EMPTY_TYPE_NONEMPTY_BEHAVIOR.getKey() + ", falling back to FAIL", e);
             return NonEmptyWriteBehavior.FAIL;
         }
     }
diff --git a/src/java/org/apache/cassandra/db/marshal/UserType.java b/src/java/org/apache/cassandra/db/marshal/UserType.java
index d380f60b60..8f57dbb83d 100644
--- a/src/java/org/apache/cassandra/db/marshal/UserType.java
+++ b/src/java/org/apache/cassandra/db/marshal/UserType.java
@@ -41,6 +41,7 @@ import org.apache.cassandra.utils.Pair;
 
 import static com.google.common.collect.Iterables.any;
 import static com.google.common.collect.Iterables.transform;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TYPE_UDT_CONFLICT_BEHAVIOR;
 import static org.apache.cassandra.cql3.ColumnIdentifier.maybeQuote;
 
 /**
@@ -523,18 +524,16 @@ public class UserType extends TupleType implements SchemaElement
             {
 
                 throw new AssertionError(String.format("Duplicate names found in UDT %s.%s for column %s; " +
-                                                       "to resolve set -D" + UDT_CONFLICT_BEHAVIOR + "=LOG on startup and remove the type",
-                                                       maybeQuote(keyspace), maybeQuote(name), maybeQuote(fieldName)));
+                                                       "to resolve set -D%s=LOG on startup and remove the type",
+                                                       maybeQuote(keyspace), maybeQuote(name), maybeQuote(fieldName), TYPE_UDT_CONFLICT_BEHAVIOR.getKey()));
             }
         };
 
-        private static final String UDT_CONFLICT_BEHAVIOR = "cassandra.type.udt.conflict_behavior";
-
         abstract void onConflict(String keyspace, String name, String fieldName);
 
         static ConflictBehavior get()
         {
-            String value = System.getProperty(UDT_CONFLICT_BEHAVIOR, REJECT.name());
+            String value = TYPE_UDT_CONFLICT_BEHAVIOR.getString(REJECT.name());
             return ConflictBehavior.valueOf(value);
         }
     }
diff --git a/src/java/org/apache/cassandra/db/memtable/AbstractShardedMemtable.java b/src/java/org/apache/cassandra/db/memtable/AbstractShardedMemtable.java
index f4948f089f..081570188b 100644
--- a/src/java/org/apache/cassandra/db/memtable/AbstractShardedMemtable.java
+++ b/src/java/org/apache/cassandra/db/memtable/AbstractShardedMemtable.java
@@ -20,8 +20,6 @@ package org.apache.cassandra.db.memtable;
 
 import java.util.concurrent.atomic.AtomicReference;
 
-import com.google.common.annotations.VisibleForTesting;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -31,14 +29,13 @@ import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.MBeanWrapper;
 import org.github.jamm.Unmetered;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.MEMTABLE_SHARD_COUNT;
+
 public abstract class AbstractShardedMemtable extends AbstractAllocatorMemtable
 {
     private static final Logger logger = LoggerFactory.getLogger(AbstractShardedMemtable.class);
 
     public static final String SHARDS_OPTION = "shards";
-    @VisibleForTesting
-    public static final String DEFAULT_SHARD_COUNT_PROPERTY = "cassandra.memtable.shard.count";
-
     public static final String SHARDED_MEMTABLE_CONFIG_OBJECT_NAME = "org.apache.cassandra.db:type=ShardedMemtableConfig";
     static
     {
@@ -46,7 +43,7 @@ public abstract class AbstractShardedMemtable extends AbstractAllocatorMemtable
     }
 
     // default shard count, used when a specific number of shards is not specified in the options
-    private static volatile int defaultShardCount = Integer.getInteger(DEFAULT_SHARD_COUNT_PROPERTY, FBUtilities.getAvailableProcessors());
+    private static volatile int defaultShardCount = MEMTABLE_SHARD_COUNT.getInt(FBUtilities.getAvailableProcessors());
 
     // The boundaries for the keyspace as they were calculated when the memtable is created.
     // The boundaries will be NONE for system keyspaces or if StorageService is not yet initialized.
diff --git a/src/java/org/apache/cassandra/db/monitoring/MonitoringTask.java b/src/java/org/apache/cassandra/db/monitoring/MonitoringTask.java
index d681e4b415..243569910b 100644
--- a/src/java/org/apache/cassandra/db/monitoring/MonitoringTask.java
+++ b/src/java/org/apache/cassandra/db/monitoring/MonitoringTask.java
@@ -33,11 +33,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.concurrent.ScheduledExecutors;
-import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.utils.NoSpamLogger;
 
-import static java.lang.System.getProperty;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.MONITORING_MAX_OPERATIONS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.MONITORING_REPORT_INTERVAL_MS;
 import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQueue;
 
@@ -48,20 +49,20 @@ import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQu
  */
 class MonitoringTask
 {
-    private static final String LINE_SEPARATOR = getProperty("line.separator");
+    private static final String LINE_SEPARATOR = CassandraRelevantProperties.LINE_SEPARATOR.getString();
     private static final Logger logger = LoggerFactory.getLogger(MonitoringTask.class);
     private static final NoSpamLogger noSpamLogger = NoSpamLogger.getLogger(logger, 5L, TimeUnit.MINUTES);
 
     /**
      * Defines the interval for reporting any operations that have timed out.
      */
-    private static final int REPORT_INTERVAL_MS = Math.max(0, Integer.parseInt(System.getProperty(Config.PROPERTY_PREFIX + "monitoring_report_interval_ms", "5000")));
+    private static final int REPORT_INTERVAL_MS = Math.max(0, MONITORING_REPORT_INTERVAL_MS.getInt());
 
     /**
      * Defines the maximum number of unique timed out queries that will be reported in the logs.
      * Use a negative number to remove any limit.
      */
-    private static final int MAX_OPERATIONS = Integer.parseInt(System.getProperty(Config.PROPERTY_PREFIX + "monitoring_max_operations", "50"));
+    private static final int MAX_OPERATIONS = MONITORING_MAX_OPERATIONS.getInt();
 
     @VisibleForTesting
     static MonitoringTask instance = make(REPORT_INTERVAL_MS, MAX_OPERATIONS);
diff --git a/src/java/org/apache/cassandra/db/repair/PendingAntiCompaction.java b/src/java/org/apache/cassandra/db/repair/PendingAntiCompaction.java
index a993bac5ee..55138e8277 100644
--- a/src/java/org/apache/cassandra/db/repair/PendingAntiCompaction.java
+++ b/src/java/org/apache/cassandra/db/repair/PendingAntiCompaction.java
@@ -35,6 +35,7 @@ import com.google.common.collect.Iterables;
 import com.google.common.util.concurrent.Uninterruptibles;
 
 import org.apache.cassandra.concurrent.FutureTask;
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.concurrent.Future;
 import org.apache.cassandra.utils.concurrent.FutureCombiner;
@@ -67,8 +68,8 @@ import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 public class PendingAntiCompaction
 {
     private static final Logger logger = LoggerFactory.getLogger(PendingAntiCompaction.class);
-    private static final int ACQUIRE_SLEEP_MS = Integer.getInteger("cassandra.acquire_sleep_ms", 1000);
-    private static final int ACQUIRE_RETRY_SECONDS = Integer.getInteger("cassandra.acquire_retry_seconds", 60);
+    private static final int ACQUIRE_SLEEP_MS = CassandraRelevantProperties.ACQUIRE_SLEEP_MS.getInt();
+    private static final int ACQUIRE_RETRY_SECONDS = CassandraRelevantProperties.ACQUIRE_RETRY_SECONDS.getInt();
 
     public static class AcquireResult
     {
diff --git a/src/java/org/apache/cassandra/db/streaming/CassandraStreamReceiver.java b/src/java/org/apache/cassandra/db/streaming/CassandraStreamReceiver.java
index b5963978c0..518d537095 100644
--- a/src/java/org/apache/cassandra/db/streaming/CassandraStreamReceiver.java
+++ b/src/java/org/apache/cassandra/db/streaming/CassandraStreamReceiver.java
@@ -53,11 +53,13 @@ import org.apache.cassandra.utils.CloseableIterator;
 import org.apache.cassandra.utils.Throwables;
 import org.apache.cassandra.utils.concurrent.Refs;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.REPAIR_MUTATION_REPAIR_ROWS_PER_BATCH;
+
 public class CassandraStreamReceiver implements StreamReceiver
 {
     private static final Logger logger = LoggerFactory.getLogger(CassandraStreamReceiver.class);
 
-    private static final int MAX_ROWS_PER_BATCH = Integer.getInteger("cassandra.repair.mutation_repair_rows_per_batch", 100);
+    private static final int MAX_ROWS_PER_BATCH = REPAIR_MUTATION_REPAIR_ROWS_PER_BATCH.getInt();
 
     private final ColumnFamilyStore cfs;
     private final StreamSession session;
diff --git a/src/java/org/apache/cassandra/db/view/ViewManager.java b/src/java/org/apache/cassandra/db/view/ViewManager.java
index 111f96aa9e..106a15fdd9 100644
--- a/src/java/org/apache/cassandra/db/view/ViewManager.java
+++ b/src/java/org/apache/cassandra/db/view/ViewManager.java
@@ -36,6 +36,8 @@ import org.apache.cassandra.schema.SystemDistributedKeyspace;
 import org.apache.cassandra.schema.Views;
 import org.apache.cassandra.service.StorageService;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.MV_ENABLE_COORDINATOR_BATCHLOG;
+
 /**
  * Manages {@link View}'s for a single {@link ColumnFamilyStore}. All of the views for that table are created when this
  * manager is initialized.
@@ -57,7 +59,7 @@ public class ViewManager
 
     private static final Striped<Lock> LOCKS = Striped.lazyWeakLock(DatabaseDescriptor.getConcurrentViewWriters() * 1024);
 
-    private static final boolean enableCoordinatorBatchlog = Boolean.getBoolean("cassandra.mv_enable_coordinator_batchlog");
+    private static final boolean enableCoordinatorBatchlog = MV_ENABLE_COORDINATOR_BATCHLOG.getBoolean();
 
     private final ConcurrentMap<String, View> viewsByName = new ConcurrentHashMap<>();
     private final ConcurrentMap<TableId, TableViews> viewsByBaseTable = new ConcurrentHashMap<>();
diff --git a/src/java/org/apache/cassandra/db/virtual/SystemPropertiesTable.java b/src/java/org/apache/cassandra/db/virtual/SystemPropertiesTable.java
index d08d61468d..f1d0d7c43d 100644
--- a/src/java/org/apache/cassandra/db/virtual/SystemPropertiesTable.java
+++ b/src/java/org/apache/cassandra/db/virtual/SystemPropertiesTable.java
@@ -47,15 +47,15 @@ final class SystemPropertiesTable extends AbstractVirtualTable
     {
         SimpleDataSet result = new SimpleDataSet(metadata());
 
-        System.getenv().keySet()
+        System.getenv().keySet() // checkstyle: suppress nearby 'blockSystemPropertyUsage'
               .stream()
               .filter(SystemPropertiesTable::isCassandraRelevant)
-              .forEach(name -> addRow(result, name, System.getenv(name)));
+              .forEach(name -> addRow(result, name, System.getenv(name))); // checkstyle: suppress nearby 'blockSystemPropertyUsage'
 
         System.getProperties().stringPropertyNames()
               .stream()
               .filter(SystemPropertiesTable::isCassandraRelevant)
-              .forEach(name -> addRow(result, name, System.getProperty(name)));
+              .forEach(name -> addRow(result, name, System.getProperty(name))); // checkstyle: suppress nearby 'blockSystemPropertyUsage'
 
         return result;
     }
@@ -66,7 +66,7 @@ final class SystemPropertiesTable extends AbstractVirtualTable
         SimpleDataSet result = new SimpleDataSet(metadata());
         String name = UTF8Type.instance.compose(partitionKey.getKey());
         if (isCassandraRelevant(name))
-            addRow(result, name, System.getProperty(name, System.getenv(name)));
+            addRow(result, name, System.getProperty(name, System.getenv(name))); // checkstyle: suppress nearby 'blockSystemPropertyUsage'
 
         return result;
     }
diff --git a/src/java/org/apache/cassandra/gms/FailureDetector.java b/src/java/org/apache/cassandra/gms/FailureDetector.java
index 5177154df9..9cf7ad0392 100644
--- a/src/java/org/apache/cassandra/gms/FailureDetector.java
+++ b/src/java/org/apache/cassandra/gms/FailureDetector.java
@@ -17,29 +17,46 @@
  */
 package org.apache.cassandra.gms;
 
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.UnknownHostException;
 import java.nio.file.Files;
-import java.nio.file.StandardOpenOption;
 import java.nio.file.Path;
-import java.io.*;
-import java.net.UnknownHostException;
-import java.util.*;
+import java.nio.file.StandardOpenOption;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Predicate;
-import javax.management.openmbean.*;
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.OpenDataException;
+import javax.management.openmbean.OpenType;
+import javax.management.openmbean.SimpleType;
+import javax.management.openmbean.TabularData;
+import javax.management.openmbean.TabularDataSupport;
+import javax.management.openmbean.TabularType;
 
-import org.apache.cassandra.locator.Replica;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.io.FSWriteError;
 import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.locator.Replica;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.MBeanWrapper;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.FD_INITIAL_VALUE_MS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.FD_MAX_INTERVAL_MS;
 import static org.apache.cassandra.config.CassandraRelevantProperties.LINE_SEPARATOR;
+import static org.apache.cassandra.config.CassandraRelevantProperties.MAX_LOCAL_PAUSE_IN_MS;
 import static org.apache.cassandra.config.DatabaseDescriptor.newFailureDetector;
 import static org.apache.cassandra.utils.MonotonicClock.Global.preciseTime;
 
@@ -55,21 +72,19 @@ public class FailureDetector implements IFailureDetector, FailureDetectorMBean
     private static final int SAMPLE_SIZE = 1000;
     protected static final long INITIAL_VALUE_NANOS = TimeUnit.NANOSECONDS.convert(getInitialValue(), TimeUnit.MILLISECONDS);
     private static final int DEBUG_PERCENTAGE = 80; // if the phi is larger than this percentage of the max, log a debug message
-    private static final long DEFAULT_MAX_PAUSE = 5000L * 1000000L; // 5 seconds
     private static final long MAX_LOCAL_PAUSE_IN_NANOS = getMaxLocalPause();
     private long lastInterpret = preciseTime.now();
     private long lastPause = 0L;
 
     private static long getMaxLocalPause()
     {
-        if (System.getProperty("cassandra.max_local_pause_in_ms") != null)
-        {
-            long pause = Long.parseLong(System.getProperty("cassandra.max_local_pause_in_ms"));
-            logger.warn("Overriding max local pause time to {}ms", pause);
-            return pause * 1000000L;
-        }
-        else
-            return DEFAULT_MAX_PAUSE;
+        long pause = MAX_LOCAL_PAUSE_IN_MS.getLong();
+
+        if (!String.valueOf(pause).equals(MAX_LOCAL_PAUSE_IN_MS.getDefaultValue()))
+            logger.warn("Overriding {} max local pause time from {}ms to {}ms",
+                        MAX_LOCAL_PAUSE_IN_MS.getKey(), MAX_LOCAL_PAUSE_IN_MS.getDefaultValue(), pause);
+
+        return pause * 1000000L;
     }
 
     public static final IFailureDetector instance = newFailureDetector();
@@ -93,16 +108,12 @@ public class FailureDetector implements IFailureDetector, FailureDetectorMBean
 
     private static long getInitialValue()
     {
-        String newvalue = System.getProperty("cassandra.fd_initial_value_ms");
-        if (newvalue == null)
-        {
-            return Gossiper.intervalInMillis * 2;
-        }
-        else
-        {
-            logger.info("Overriding FD INITIAL_VALUE to {}ms", newvalue);
-            return Integer.parseInt(newvalue);
-        }
+        long newValue = FD_INITIAL_VALUE_MS.getLong(Gossiper.intervalInMillis * 2L);
+
+        if (newValue != Gossiper.intervalInMillis * 2)
+            logger.info("Overriding {} from {}ms to {}ms", FD_INITIAL_VALUE_MS.getKey(), Gossiper.intervalInMillis * 2, newValue);
+
+        return newValue;
     }
 
     public String getAllEndpointStates()
@@ -476,16 +487,10 @@ class ArrivalWindow
 
     private static long getMaxInterval()
     {
-        String newvalue = System.getProperty("cassandra.fd_max_interval_ms");
-        if (newvalue == null)
-        {
-            return FailureDetector.INITIAL_VALUE_NANOS;
-        }
-        else
-        {
-            logger.info("Overriding FD MAX_INTERVAL to {}ms", newvalue);
-            return TimeUnit.NANOSECONDS.convert(Integer.parseInt(newvalue), TimeUnit.MILLISECONDS);
-        }
+        long newValue = FD_MAX_INTERVAL_MS.getLong(FailureDetector.INITIAL_VALUE_NANOS);
+        if (newValue != FailureDetector.INITIAL_VALUE_NANOS)
+            logger.info("Overriding {} from {}ms to {}ms", FD_MAX_INTERVAL_MS.getKey(), FailureDetector.INITIAL_VALUE_NANOS, newValue);
+        return TimeUnit.NANOSECONDS.convert(newValue, TimeUnit.MILLISECONDS);
     }
 
     synchronized void add(long value, InetAddressAndPort ep)
diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java b/src/java/org/apache/cassandra/gms/Gossiper.java
index 0f13f6ae48..75f2e3c1df 100644
--- a/src/java/org/apache/cassandra/gms/Gossiper.java
+++ b/src/java/org/apache/cassandra/gms/Gossiper.java
@@ -18,8 +18,21 @@
 package org.apache.cassandra.gms;
 
 import java.net.UnknownHostException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Random;
+import java.util.Set;
+import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ConcurrentSkipListSet;
@@ -32,60 +45,60 @@ import java.util.concurrent.locks.ReentrantLock;
 import java.util.function.BooleanSupplier;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
-
 import javax.annotation.Nullable;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.Uninterruptibles;
-
-import org.apache.cassandra.concurrent.*;
-import org.apache.cassandra.concurrent.FutureTask;
-import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.net.NoPayload;
-import org.apache.cassandra.net.Verb;
-import org.apache.cassandra.utils.CassandraVersion;
-import org.apache.cassandra.utils.ExecutorUtils;
-import org.apache.cassandra.utils.ExpiringMemoizingSupplier;
-import org.apache.cassandra.utils.MBeanWrapper;
-import org.apache.cassandra.utils.NoSpamLogger;
-import org.apache.cassandra.utils.Pair;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.cassandra.concurrent.FutureTask;
+import org.apache.cassandra.concurrent.ScheduledExecutorPlus;
 import org.apache.cassandra.concurrent.Stage;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.SystemKeyspace;
 import org.apache.cassandra.dht.Token;
-import org.apache.cassandra.net.RequestCallback;
+import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.net.NoPayload;
+import org.apache.cassandra.net.RequestCallback;
+import org.apache.cassandra.net.Verb;
 import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.CassandraVersion;
+import org.apache.cassandra.utils.ExecutorUtils;
+import org.apache.cassandra.utils.ExpiringMemoizingSupplier;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JVMStabilityInspector;
+import org.apache.cassandra.utils.MBeanWrapper;
+import org.apache.cassandra.utils.NoSpamLogger;
+import org.apache.cassandra.utils.Pair;
 import org.apache.cassandra.utils.RecomputingSupplier;
-import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 import org.apache.cassandra.utils.concurrent.NotScheduledFuture;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
 import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 import static org.apache.cassandra.config.CassandraRelevantProperties.DISABLE_GOSSIP_ENDPOINT_REMOVAL;
 import static org.apache.cassandra.config.CassandraRelevantProperties.GOSSIPER_QUARANTINE_DELAY;
 import static org.apache.cassandra.config.CassandraRelevantProperties.GOSSIPER_SKIP_WAITING_TO_SETTLE;
+import static org.apache.cassandra.config.CassandraRelevantProperties.GOSSIP_DISABLE_THREAD_VALIDATION;
 import static org.apache.cassandra.config.CassandraRelevantProperties.SHUTDOWN_ANNOUNCE_DELAY_IN_MS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.VERY_LONG_TIME_MS;
 import static org.apache.cassandra.config.DatabaseDescriptor.getClusterName;
 import static org.apache.cassandra.config.DatabaseDescriptor.getPartitionerName;
+import static org.apache.cassandra.gms.VersionedValue.BOOTSTRAPPING_STATUS;
 import static org.apache.cassandra.net.NoPayload.noPayload;
 import static org.apache.cassandra.net.Verb.ECHO_REQ;
 import static org.apache.cassandra.net.Verb.GOSSIP_DIGEST_SYN;
-import static org.apache.cassandra.utils.FBUtilities.getBroadcastAddressAndPort;
 import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 import static org.apache.cassandra.utils.Clock.Global.nanoTime;
-import static org.apache.cassandra.gms.VersionedValue.BOOTSTRAPPING_STATUS;
+import static org.apache.cassandra.utils.FBUtilities.getBroadcastAddressAndPort;
 
 /**
  * This module is responsible for Gossiping information for the local endpoint. This abstraction
@@ -106,11 +119,6 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean
 {
     public static final String MBEAN_NAME = "org.apache.cassandra.net:type=Gossiper";
 
-    public static class Props
-    {
-        public static final String DISABLE_THREAD_VALIDATION = "cassandra.gossip.disable_thread_validation";
-    }
-
     private static final ScheduledExecutorPlus executor = executorFactory().scheduled("GossipTasks");
 
     static final ApplicationState[] STATES = ApplicationState.values();
@@ -257,18 +265,18 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean
         ((ExpiringMemoizingSupplier<CassandraVersion>) upgradeFromVersionMemoized).expire();
     }
 
-    private static final boolean disableThreadValidation = Boolean.getBoolean(Props.DISABLE_THREAD_VALIDATION);
+    private static final boolean disableThreadValidation = GOSSIP_DISABLE_THREAD_VALIDATION.getBoolean();
     private static volatile boolean disableEndpointRemoval = DISABLE_GOSSIP_ENDPOINT_REMOVAL.getBoolean();
 
     private static long getVeryLongTime()
     {
-        String newVLT =  System.getProperty("cassandra.very_long_time_ms");
-        if (newVLT != null)
-        {
-            logger.info("Overriding aVeryLongTime to {}ms", newVLT);
-            return Long.parseLong(newVLT);
-        }
-        return 259200 * 1000; // 3 days
+        long time = VERY_LONG_TIME_MS.getLong();
+        String defaultValue = VERY_LONG_TIME_MS.getDefaultValue();
+
+        if (!String.valueOf(time).equals(defaultValue))
+            logger.info("Overriding {} from {} to {}ms", VERY_LONG_TIME_MS.getKey(), defaultValue, time);
+
+        return time;
     }
 
     private static boolean isInGossipStage()
diff --git a/src/java/org/apache/cassandra/hints/Hint.java b/src/java/org/apache/cassandra/hints/Hint.java
index b710658c7e..c68c26640f 100644
--- a/src/java/org/apache/cassandra/hints/Hint.java
+++ b/src/java/org/apache/cassandra/hints/Hint.java
@@ -37,6 +37,7 @@ import org.apache.cassandra.utils.concurrent.ImmediateFuture;
 import org.apache.cassandra.utils.vint.VIntCoding;
 import org.assertj.core.util.VisibleForTesting;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_MAX_HINT_TTL;
 import static org.apache.cassandra.db.TypeSizes.sizeof;
 import static org.apache.cassandra.db.TypeSizes.sizeofUnsignedVInt;
 import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
@@ -59,7 +60,7 @@ import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 public final class Hint
 {
     public static final Serializer serializer = new Serializer();
-    static final int maxHintTTL = Integer.getInteger("cassandra.maxHintTTL", Integer.MAX_VALUE);
+    static final int maxHintTTL = CASSANDRA_MAX_HINT_TTL.getInt();
 
     final Mutation mutation;
     final long creationTime;  // time of hint creation (in milliseconds)
diff --git a/src/java/org/apache/cassandra/hints/HintsBufferPool.java b/src/java/org/apache/cassandra/hints/HintsBufferPool.java
index 78f07dd302..dd5829d84c 100644
--- a/src/java/org/apache/cassandra/hints/HintsBufferPool.java
+++ b/src/java/org/apache/cassandra/hints/HintsBufferPool.java
@@ -22,10 +22,10 @@ import java.util.Iterator;
 import java.util.UUID;
 import java.util.concurrent.BlockingQueue;
 
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.MAX_HINT_BUFFERS;
 import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQueue;
 
 /**
@@ -39,7 +39,7 @@ final class HintsBufferPool implements Closeable
         void flush(HintsBuffer buffer, HintsBufferPool pool);
     }
 
-    static final int MAX_ALLOCATED_BUFFERS = Integer.getInteger(Config.PROPERTY_PREFIX + "MAX_HINT_BUFFERS", 3);
+    static final int MAX_ALLOCATED_BUFFERS = MAX_HINT_BUFFERS.getInt();
     private volatile HintsBuffer currentBuffer;
     private final BlockingQueue<HintsBuffer> reserveBuffers;
     private final int bufferSize;
diff --git a/src/java/org/apache/cassandra/index/SecondaryIndexManager.java b/src/java/org/apache/cassandra/index/SecondaryIndexManager.java
index 93ecd595b5..4c412a2887 100644
--- a/src/java/org/apache/cassandra/index/SecondaryIndexManager.java
+++ b/src/java/org/apache/cassandra/index/SecondaryIndexManager.java
@@ -73,6 +73,7 @@ import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.concurrent.*;
 
 import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.config.CassandraRelevantProperties.FORCE_DEFAULT_INDEXING_PAGE_SIZE;
 import static org.apache.cassandra.utils.ExecutorUtils.awaitTermination;
 import static org.apache.cassandra.utils.ExecutorUtils.shutdown;
 
@@ -991,7 +992,7 @@ public class SecondaryIndexManager implements IndexRegistry, INotificationConsum
      */
     public int calculateIndexingPageSize()
     {
-        if (Boolean.getBoolean("cassandra.force_default_indexing_page_size"))
+        if (FORCE_DEFAULT_INDEXING_PAGE_SIZE.getBoolean())
             return DEFAULT_PAGE_SIZE;
 
         double targetPageSizeInBytes = 32 * 1024 * 1024;
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTable.java b/src/java/org/apache/cassandra/io/sstable/SSTable.java
index 25ac7d9477..dd296e3fab 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTable.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTable.java
@@ -69,7 +69,7 @@ public abstract class SSTable
 
     public static final int TOMBSTONE_HISTOGRAM_BIN_SIZE = 100;
     public static final int TOMBSTONE_HISTOGRAM_SPOOL_SIZE = 100000;
-    public static final int TOMBSTONE_HISTOGRAM_TTL_ROUND_SECONDS = CassandraRelevantProperties.TOMBSTONE_HISTOGRAM_TTL_ROUND_SECONDS.getInt();
+    public static final int TOMBSTONE_HISTOGRAM_TTL_ROUND_SECONDS = CassandraRelevantProperties.STREAMING_HISTOGRAM_ROUND_SECONDS.getInt();
 
     public final Descriptor descriptor;
     protected final Set<Component> components;
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableHeaderFix.java b/src/java/org/apache/cassandra/io/sstable/SSTableHeaderFix.java
index d0a4486b33..e785196c74 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTableHeaderFix.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableHeaderFix.java
@@ -68,15 +68,15 @@ import org.apache.cassandra.utils.CassandraVersion;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.Pair;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_SKIP_AUTOMATIC_UDT_FIX;
+
 /**
  * Validates and fixes type issues in the serialization-header of sstables.
  */
 public abstract class SSTableHeaderFix
 {
     // C* 3.0 upgrade code
-
-    private static final String SKIPAUTOMATICUDTFIX = "cassandra.skipautomaticudtfix";
-    private static final boolean SKIP_AUTOMATIC_FIX_ON_UPGRADE = Boolean.getBoolean(SKIPAUTOMATICUDTFIX);
+    private static final boolean SKIP_AUTOMATIC_FIX_ON_UPGRADE = CASSANDRA_SKIP_AUTOMATIC_UDT_FIX.getBoolean();
 
     public static void fixNonFrozenUDTIfUpgradeFrom30()
     {
@@ -96,7 +96,7 @@ public abstract class SSTableHeaderFix
                         "sstable metadata serialization-headers",
                         previousVersionString,
                         FBUtilities.getReleaseVersionString(),
-                        SKIPAUTOMATICUDTFIX);
+                        CASSANDRA_SKIP_AUTOMATIC_UDT_FIX.getKey());
             return;
         }
 
diff --git a/src/java/org/apache/cassandra/io/sstable/indexsummary/IndexSummaryBuilder.java b/src/java/org/apache/cassandra/io/sstable/indexsummary/IndexSummaryBuilder.java
index 19c5b5b42a..5f38fc91f8 100644
--- a/src/java/org/apache/cassandra/io/sstable/indexsummary/IndexSummaryBuilder.java
+++ b/src/java/org/apache/cassandra/io/sstable/indexsummary/IndexSummaryBuilder.java
@@ -25,7 +25,6 @@ import java.util.TreeMap;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.dht.IPartitioner;
@@ -33,14 +32,14 @@ import org.apache.cassandra.io.sstable.Downsampling;
 import org.apache.cassandra.io.util.Memory;
 import org.apache.cassandra.io.util.SafeMemoryWriter;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.INDEX_SUMMARY_EXPECTED_KEY_SIZE;
 import static org.apache.cassandra.io.sstable.Downsampling.BASE_SAMPLING_LEVEL;
 
 public class IndexSummaryBuilder implements AutoCloseable
 {
     private static final Logger logger = LoggerFactory.getLogger(IndexSummaryBuilder.class);
 
-    static final String defaultExpectedKeySizeName = Config.PROPERTY_PREFIX + "index_summary_expected_key_size";
-    static long defaultExpectedKeySize = Long.valueOf(System.getProperty(defaultExpectedKeySizeName, "64"));
+    static long defaultExpectedKeySize = INDEX_SUMMARY_EXPECTED_KEY_SIZE.getLong();
 
     // the offset in the keys memory region to look for a given summary boundary
     private final SafeMemoryWriter offsets;
diff --git a/src/java/org/apache/cassandra/io/util/BufferedDataOutputStreamPlus.java b/src/java/org/apache/cassandra/io/util/BufferedDataOutputStreamPlus.java
index 96257511aa..59470a8341 100644
--- a/src/java/org/apache/cassandra/io/util/BufferedDataOutputStreamPlus.java
+++ b/src/java/org/apache/cassandra/io/util/BufferedDataOutputStreamPlus.java
@@ -26,9 +26,10 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 
 import net.nicoulaj.compilecommand.annotations.DontInline;
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.utils.FastByteOperations;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.NIO_DATA_OUTPUT_STREAM_PLUS_BUFFER_SIZE;
+
 /**
  * An implementation of the DataOutputStreamPlus interface using a ByteBuffer to stage writes
  * before flushing them to an underlying channel.
@@ -37,7 +38,7 @@ import org.apache.cassandra.utils.FastByteOperations;
  */
 public class BufferedDataOutputStreamPlus extends DataOutputStreamPlus
 {
-    private static final int DEFAULT_BUFFER_SIZE = Integer.getInteger(Config.PROPERTY_PREFIX + "nio_data_output_stream_plus_buffer_size", 1024 * 32);
+    private static final int DEFAULT_BUFFER_SIZE = NIO_DATA_OUTPUT_STREAM_PLUS_BUFFER_SIZE.getInt();
 
     protected ByteBuffer buffer;
 
diff --git a/src/java/org/apache/cassandra/io/util/DataOutputBuffer.java b/src/java/org/apache/cassandra/io/util/DataOutputBuffer.java
index ee669fa5a6..d27a93555b 100644
--- a/src/java/org/apache/cassandra/io/util/DataOutputBuffer.java
+++ b/src/java/org/apache/cassandra/io/util/DataOutputBuffer.java
@@ -26,9 +26,10 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 
 import io.netty.util.concurrent.FastThreadLocal;
-import org.apache.cassandra.config.Config;
 
 import static org.apache.cassandra.config.CassandraRelevantProperties.DATA_OUTPUT_BUFFER_ALLOCATE_TYPE;
+import static org.apache.cassandra.config.CassandraRelevantProperties.DOB_DOUBLING_THRESHOLD_MB;
+import static org.apache.cassandra.config.CassandraRelevantProperties.DOB_MAX_RECYCLE_BYTES;
 
 /**
  * An implementation of the DataOutputStream interface using a FastByteArrayOutputStream and exposing
@@ -41,12 +42,12 @@ public class DataOutputBuffer extends BufferedDataOutputStreamPlus
     /*
      * Threshold at which resizing transitions from doubling to increasing by 50%
      */
-    static final long DOUBLING_THRESHOLD = Long.getLong(Config.PROPERTY_PREFIX + "DOB_DOUBLING_THRESHOLD_MB", 64);
+    static final long DOUBLING_THRESHOLD = DOB_DOUBLING_THRESHOLD_MB.getLong();
 
     /*
      * Only recycle OutputBuffers up to 1Mb. Larger buffers will be trimmed back to this size.
      */
-    private static final int MAX_RECYCLE_BUFFER_SIZE = Integer.getInteger(Config.PROPERTY_PREFIX + "dob_max_recycle_bytes", 1024 * 1024);
+    private static final int MAX_RECYCLE_BUFFER_SIZE = DOB_MAX_RECYCLE_BYTES.getInt();
     private enum AllocationType { DIRECT, ONHEAP }
     private static final AllocationType ALLOCATION_TYPE = DATA_OUTPUT_BUFFER_ALLOCATE_TYPE.getEnum(AllocationType.DIRECT);
 
diff --git a/src/java/org/apache/cassandra/io/util/DataOutputStreamPlus.java b/src/java/org/apache/cassandra/io/util/DataOutputStreamPlus.java
index e931899c07..7dd2341bba 100644
--- a/src/java/org/apache/cassandra/io/util/DataOutputStreamPlus.java
+++ b/src/java/org/apache/cassandra/io/util/DataOutputStreamPlus.java
@@ -23,9 +23,10 @@ import java.nio.ByteBuffer;
 import java.nio.channels.WritableByteChannel;
 
 import io.netty.util.concurrent.FastThreadLocal;
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.DATA_OUTPUT_STREAM_PLUS_TEMP_BUFFER_SIZE;
+
 /**
  * Abstract base class for DataOutputStreams that accept writes from ByteBuffer or Memory and also provide
  * access to the underlying WritableByteChannel associated with their output stream.
@@ -47,8 +48,7 @@ public abstract class DataOutputStreamPlus extends OutputStream implements DataO
         this.channel = channel;
     }
 
-    private static int MAX_BUFFER_SIZE =
-            Integer.getInteger(Config.PROPERTY_PREFIX + "data_output_stream_plus_temp_buffer_size", 8192);
+    private static final int MAX_BUFFER_SIZE = DATA_OUTPUT_STREAM_PLUS_TEMP_BUFFER_SIZE.getInt();
 
     /*
      * Factored out into separate method to create more flexibility around inlining
diff --git a/src/java/org/apache/cassandra/io/util/PathUtils.java b/src/java/org/apache/cassandra/io/util/PathUtils.java
index 4b3efdb559..027742f48f 100644
--- a/src/java/org/apache/cassandra/io/util/PathUtils.java
+++ b/src/java/org/apache/cassandra/io/util/PathUtils.java
@@ -58,7 +58,7 @@ import static org.apache.cassandra.utils.Throwables.merge;
  */
 public final class PathUtils
 {
-    private static final boolean consistentDirectoryListings = CassandraRelevantProperties.DETERMINISM_CONSISTENT_DIRECTORY_LISTINGS.getBoolean();
+    private static final boolean consistentDirectoryListings = CassandraRelevantProperties.CONSISTENT_DIRECTORY_LISTINGS.getBoolean();
 
     private static final Set<StandardOpenOption> READ_OPTIONS = unmodifiableSet(EnumSet.of(READ));
     private static final Set<StandardOpenOption> WRITE_OPTIONS = unmodifiableSet(EnumSet.of(WRITE, CREATE, TRUNCATE_EXISTING));
diff --git a/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java b/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java
index 84c627312e..77e04e6887 100644
--- a/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java
+++ b/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java
@@ -43,12 +43,14 @@ import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.MBeanWrapper;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.IGNORE_DYNAMIC_SNITCH_SEVERITY;
+
 /**
  * A dynamic snitch that sorts endpoints by latency with an adapted phi failure detector
  */
 public class DynamicEndpointSnitch extends AbstractEndpointSnitch implements LatencySubscribers.Subscriber, DynamicEndpointSnitchMBean
 {
-    private static final boolean USE_SEVERITY = !Boolean.getBoolean("cassandra.ignore_dynamic_snitch_severity");
+    private static final boolean USE_SEVERITY = !IGNORE_DYNAMIC_SNITCH_SEVERITY.getBoolean();
 
     private static final double ALPHA = 0.75; // set to 0.75 to make EDS more biased to towards the newer values
     private static final int WINDOW_SIZE = 100;
diff --git a/src/java/org/apache/cassandra/locator/SnitchProperties.java b/src/java/org/apache/cassandra/locator/SnitchProperties.java
index afb680430d..b0bfe4c2ef 100644
--- a/src/java/org/apache/cassandra/locator/SnitchProperties.java
+++ b/src/java/org/apache/cassandra/locator/SnitchProperties.java
@@ -25,10 +25,12 @@ import org.apache.cassandra.io.util.FileUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_RACKDC_PROPERTIES;
+
 public class SnitchProperties
 {
     private static final Logger logger = LoggerFactory.getLogger(SnitchProperties.class);
-    public static final String RACKDC_PROPERTY_FILENAME = "cassandra-rackdc.properties";
+    public static final String RACKDC_PROPERTY_FILENAME = CASSANDRA_RACKDC_PROPERTIES.getKey();
 
     private final Properties properties;
 
@@ -36,7 +38,7 @@ public class SnitchProperties
     {
         properties = new Properties();
         InputStream stream = null;
-        String configURL = System.getProperty(RACKDC_PROPERTY_FILENAME);
+        String configURL = CASSANDRA_RACKDC_PROPERTIES.getString();
         try
         {
             URL url;
diff --git a/src/java/org/apache/cassandra/metrics/DecayingEstimatedHistogramReservoir.java b/src/java/org/apache/cassandra/metrics/DecayingEstimatedHistogramReservoir.java
index 308023e699..565e33f1b5 100644
--- a/src/java/org/apache/cassandra/metrics/DecayingEstimatedHistogramReservoir.java
+++ b/src/java/org/apache/cassandra/metrics/DecayingEstimatedHistogramReservoir.java
@@ -42,6 +42,7 @@ import org.apache.cassandra.utils.NoSpamLogger;
 
 import static java.lang.Math.max;
 import static java.lang.Math.min;
+import static org.apache.cassandra.config.CassandraRelevantProperties.DECAYING_ESTIMATED_HISTOGRAM_RESERVOIR_STRIPE_COUNT;
 
 /**
  * A decaying histogram reservoir where values collected during each minute will be twice as significant as the values
@@ -91,7 +92,7 @@ public class DecayingEstimatedHistogramReservoir implements SnapshottingReservoi
      */
     public static final int DEFAULT_BUCKET_COUNT = 164;
     public static final int LOW_BUCKET_COUNT = 127;
-    public static final int DEFAULT_STRIPE_COUNT = Integer.parseInt(System.getProperty("cassandra.dehr_stripe_count", "2"));
+    public static final int DEFAULT_STRIPE_COUNT = DECAYING_ESTIMATED_HISTOGRAM_RESERVOIR_STRIPE_COUNT.getInt();
     public static final int MAX_BUCKET_COUNT = 237;
     public static final boolean DEFAULT_ZERO_CONSIDERATION = false;
 
diff --git a/src/java/org/apache/cassandra/net/OutboundConnectionSettings.java b/src/java/org/apache/cassandra/net/OutboundConnectionSettings.java
index 332987ad2b..6a2543f783 100644
--- a/src/java/org/apache/cassandra/net/OutboundConnectionSettings.java
+++ b/src/java/org/apache/cassandra/net/OutboundConnectionSettings.java
@@ -23,6 +23,7 @@ import com.google.common.base.Preconditions;
 
 import io.netty.channel.WriteBufferWaterMark;
 import org.apache.cassandra.auth.IInternodeAuthenticator;
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions;
@@ -42,11 +43,10 @@ import static org.apache.cassandra.utils.FBUtilities.getBroadcastAddressAndPort;
 @SuppressWarnings({ "WeakerAccess", "unused" })
 public class OutboundConnectionSettings
 {
-    private static final String INTRADC_TCP_NODELAY_PROPERTY = Config.PROPERTY_PREFIX + "otc_intradc_tcp_nodelay";
     /**
      * Enabled/disable TCP_NODELAY for intradc connections. Defaults to enabled.
      */
-    private static final boolean INTRADC_TCP_NODELAY = Boolean.parseBoolean(System.getProperty(INTRADC_TCP_NODELAY_PROPERTY, "true"));
+    private static final boolean INTRADC_TCP_NODELAY = CassandraRelevantProperties.OTC_INTRADC_TCP_NODELAY.getBoolean();
 
     public enum Framing
     {
diff --git a/src/java/org/apache/cassandra/net/OutboundConnections.java b/src/java/org/apache/cassandra/net/OutboundConnections.java
index ad87ec588c..0729194a19 100644
--- a/src/java/org/apache/cassandra/net/OutboundConnections.java
+++ b/src/java/org/apache/cassandra/net/OutboundConnections.java
@@ -39,9 +39,8 @@ import org.apache.cassandra.metrics.InternodeOutboundMetrics;
 import org.apache.cassandra.utils.NoSpamLogger;
 import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
-import static java.lang.Integer.getInteger;
 import static java.lang.Math.max;
-import static org.apache.cassandra.config.Config.PROPERTY_PREFIX;
+import static org.apache.cassandra.config.CassandraRelevantProperties.OTCP_LARGE_MESSAGE_THRESHOLD;
 import static org.apache.cassandra.gms.Gossiper.instance;
 import static org.apache.cassandra.net.FrameEncoderCrc.HEADER_AND_TRAILER_LENGTH;
 import static org.apache.cassandra.net.LegacyLZ4Constants.HEADER_LENGTH;
@@ -62,7 +61,7 @@ public class OutboundConnections
     private static final Logger logger = LoggerFactory.getLogger(OutboundConnections.class);
 
     @VisibleForTesting
-    public static final int LARGE_MESSAGE_THRESHOLD = getInteger(PROPERTY_PREFIX + "otcp_large_message_threshold", 1024 * 64)
+    public static final int LARGE_MESSAGE_THRESHOLD = OTCP_LARGE_MESSAGE_THRESHOLD.getInt()
     - max(max(HEADER_LENGTH, HEADER_AND_TRAILER_LENGTH), FrameEncoderLZ4.HEADER_AND_TRAILER_LENGTH);
 
     private final Condition metricsReady = newOneTimeCondition();
diff --git a/src/java/org/apache/cassandra/net/SocketFactory.java b/src/java/org/apache/cassandra/net/SocketFactory.java
index b135ed5107..78256267ac 100644
--- a/src/java/org/apache/cassandra/net/SocketFactory.java
+++ b/src/java/org/apache/cassandra/net/SocketFactory.java
@@ -61,7 +61,6 @@ import io.netty.util.concurrent.ThreadPerTaskExecutor;
 import io.netty.util.internal.logging.InternalLoggerFactory;
 import io.netty.util.internal.logging.Slf4JLoggerFactory;
 import org.apache.cassandra.concurrent.NamedThreadFactory;
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.EncryptionOptions;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.security.SSLFactory;
@@ -73,6 +72,7 @@ import static io.netty.channel.unix.Errors.ERRNO_ECONNRESET_NEGATIVE;
 import static io.netty.channel.unix.Errors.ERROR_ECONNREFUSED_NEGATIVE;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.config.CassandraRelevantProperties.INTERNODE_EVENT_THREADS;
 import static org.apache.cassandra.utils.Throwables.isCausedBy;
 
 /**
@@ -83,7 +83,7 @@ public final class SocketFactory
 {
     private static final Logger logger = LoggerFactory.getLogger(SocketFactory.class);
 
-    private static final int EVENT_THREADS = Integer.getInteger(Config.PROPERTY_PREFIX + "internode-event-threads", FBUtilities.getAvailableProcessors());
+    private static final int EVENT_THREADS = INTERNODE_EVENT_THREADS.getInt(FBUtilities.getAvailableProcessors());
 
     /**
      * The default task queue used by {@code NioEventLoop} and {@code EpollEventLoop} is {@code MpscUnboundedArrayQueue},
diff --git a/src/java/org/apache/cassandra/repair/consistent/LocalSessions.java b/src/java/org/apache/cassandra/repair/consistent/LocalSessions.java
index ed2bf0bc0b..ed1e37ae75 100644
--- a/src/java/org/apache/cassandra/repair/consistent/LocalSessions.java
+++ b/src/java/org/apache/cassandra/repair/consistent/LocalSessions.java
@@ -98,6 +98,10 @@ import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.concurrent.Future;
 
 import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.config.CassandraRelevantProperties.REPAIR_CLEANUP_INTERVAL_SECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.REPAIR_DELETE_TIMEOUT_SECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.REPAIR_FAIL_TIMEOUT_SECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.REPAIR_STATUS_CHECK_TIMEOUT_SECONDS;
 import static org.apache.cassandra.net.Verb.FAILED_SESSION_MSG;
 import static org.apache.cassandra.net.Verb.FINALIZE_PROMISE_MSG;
 import static org.apache.cassandra.net.Verb.PREPARE_CONSISTENT_RSP;
@@ -121,26 +125,22 @@ public class LocalSessions
      * Amount of time a session can go without any activity before we start checking the status of other
      * participants to see if we've missed a message
      */
-    static final int CHECK_STATUS_TIMEOUT = Integer.getInteger("cassandra.repair_status_check_timeout_seconds",
-                                                               Ints.checkedCast(TimeUnit.HOURS.toSeconds(1)));
+    static final int CHECK_STATUS_TIMEOUT = REPAIR_STATUS_CHECK_TIMEOUT_SECONDS.getInt();
 
     /**
      * Amount of time a session can go without any activity before being automatically set to FAILED
      */
-    static final int AUTO_FAIL_TIMEOUT = Integer.getInteger("cassandra.repair_fail_timeout_seconds",
-                                                            Ints.checkedCast(TimeUnit.DAYS.toSeconds(1)));
+    static final int AUTO_FAIL_TIMEOUT = REPAIR_FAIL_TIMEOUT_SECONDS.getInt();
 
     /**
      * Amount of time a completed session is kept around after completion before being deleted, this gives
      * compaction plenty of time to move sstables from successful sessions into the repaired bucket
      */
-    static final int AUTO_DELETE_TIMEOUT = Integer.getInteger("cassandra.repair_delete_timeout_seconds",
-                                                              Ints.checkedCast(TimeUnit.DAYS.toSeconds(1)));
+    static final int AUTO_DELETE_TIMEOUT = REPAIR_DELETE_TIMEOUT_SECONDS.getInt();
     /**
      * How often LocalSessions.cleanup is run
      */
-    public static final int CLEANUP_INTERVAL = Integer.getInteger("cassandra.repair_cleanup_interval_seconds",
-                                                                  Ints.checkedCast(TimeUnit.MINUTES.toSeconds(10)));
+    public static final int CLEANUP_INTERVAL = REPAIR_CLEANUP_INTERVAL_SECONDS.getInt();
 
     private static Set<TableId> uuidToTableId(Set<UUID> src)
     {
diff --git a/src/java/org/apache/cassandra/schema/CompactionParams.java b/src/java/org/apache/cassandra/schema/CompactionParams.java
index 485946820e..eff634f429 100644
--- a/src/java/org/apache/cassandra/schema/CompactionParams.java
+++ b/src/java/org/apache/cassandra/schema/CompactionParams.java
@@ -38,6 +38,7 @@ import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.utils.FBUtilities;
 
 import static java.lang.String.format;
+import static org.apache.cassandra.config.CassandraRelevantProperties.DEFAULT_PROVIDE_OVERLAPPING_TOMBSTONES;
 
 public final class CompactionParams
 {
@@ -76,15 +77,15 @@ public final class CompactionParams
     public static final int DEFAULT_MAX_THRESHOLD = 32;
 
     public static final boolean DEFAULT_ENABLED = true;
-    public static final TombstoneOption DEFAULT_PROVIDE_OVERLAPPING_TOMBSTONES =
-            TombstoneOption.valueOf(System.getProperty("default.provide.overlapping.tombstones", TombstoneOption.NONE.toString()).toUpperCase());
+    public static final TombstoneOption DEFAULT_PROVIDE_OVERLAPPING_TOMBSTONES_PROPERTY_VALUE =
+        DEFAULT_PROVIDE_OVERLAPPING_TOMBSTONES.getEnum(TombstoneOption.NONE);
 
     public static final Map<String, String> DEFAULT_THRESHOLDS =
         ImmutableMap.of(Option.MIN_THRESHOLD.toString(), Integer.toString(DEFAULT_MIN_THRESHOLD),
                         Option.MAX_THRESHOLD.toString(), Integer.toString(DEFAULT_MAX_THRESHOLD));
 
     public static final CompactionParams DEFAULT =
-        new CompactionParams(SizeTieredCompactionStrategy.class, DEFAULT_THRESHOLDS, DEFAULT_ENABLED, DEFAULT_PROVIDE_OVERLAPPING_TOMBSTONES);
+        new CompactionParams(SizeTieredCompactionStrategy.class, DEFAULT_THRESHOLDS, DEFAULT_ENABLED, DEFAULT_PROVIDE_OVERLAPPING_TOMBSTONES_PROPERTY_VALUE);
 
     private final Class<? extends AbstractCompactionStrategy> klass;
     private final ImmutableMap<String, String> options;
@@ -105,7 +106,7 @@ public final class CompactionParams
                           ? Boolean.parseBoolean(options.get(Option.ENABLED.toString()))
                           : DEFAULT_ENABLED;
         String overlappingTombstoneParm = options.getOrDefault(Option.PROVIDE_OVERLAPPING_TOMBSTONES.toString(),
-                                                               DEFAULT_PROVIDE_OVERLAPPING_TOMBSTONES.toString()).toUpperCase();
+                                                               DEFAULT_PROVIDE_OVERLAPPING_TOMBSTONES_PROPERTY_VALUE.toString()).toUpperCase();
         Optional<TombstoneOption> tombstoneOptional = TombstoneOption.forName(overlappingTombstoneParm);
         if (!tombstoneOptional.isPresent())
         {
diff --git a/src/java/org/apache/cassandra/schema/DefaultSchemaUpdateHandler.java b/src/java/org/apache/cassandra/schema/DefaultSchemaUpdateHandler.java
index 0f0c3e9cf5..0bea57712d 100644
--- a/src/java/org/apache/cassandra/schema/DefaultSchemaUpdateHandler.java
+++ b/src/java/org/apache/cassandra/schema/DefaultSchemaUpdateHandler.java
@@ -129,7 +129,7 @@ public class DefaultSchemaUpdateHandler implements SchemaUpdateHandler, IEndpoin
             return true;
 
         logger.warn("There are nodes in the cluster with a different schema version than us, from which we did not merge schemas: " +
-                    "our version: ({}), outstanding versions -> endpoints: {}. Use -D{}}=true to ignore this, " +
+                    "our version: ({}), outstanding versions -> endpoints: {}. Use -D{}=true to ignore this, " +
                     "-D{}=<ep1[,epN]> to skip specific endpoints, or -D{}=<ver1[,verN]> to skip specific schema versions",
                     Schema.instance.getVersion(),
                     migrationCoordinator.outstandingVersions(),
diff --git a/src/java/org/apache/cassandra/schema/MigrationCoordinator.java b/src/java/org/apache/cassandra/schema/MigrationCoordinator.java
index a1af1c0445..562489966a 100644
--- a/src/java/org/apache/cassandra/schema/MigrationCoordinator.java
+++ b/src/java/org/apache/cassandra/schema/MigrationCoordinator.java
@@ -254,10 +254,11 @@ public class MigrationCoordinator
 
     void start()
     {
-        logger.info("Starting migration coordinator and scheduling pulling schema versions every {}", Duration.ofMillis(SCHEMA_PULL_INTERVAL_MS.getLong()));
+        long interval = SCHEMA_PULL_INTERVAL_MS.getLong();
+        logger.info("Starting migration coordinator and scheduling pulling schema versions every {}", Duration.ofMillis(interval));
         announce(schemaVersion.get());
         periodicPullTask.updateAndGet(curTask -> curTask == null
-                                                 ? periodicCheckExecutor.scheduleWithFixedDelay(this::pullUnreceivedSchemaVersions, SCHEMA_PULL_INTERVAL_MS.getLong(), SCHEMA_PULL_INTERVAL_MS.getLong(), TimeUnit.MILLISECONDS)
+                                                 ? periodicCheckExecutor.scheduleWithFixedDelay(this::pullUnreceivedSchemaVersions, interval, interval, TimeUnit.MILLISECONDS)
                                                  : curTask);
     }
 
diff --git a/src/java/org/apache/cassandra/schema/SchemaKeyspace.java b/src/java/org/apache/cassandra/schema/SchemaKeyspace.java
index 4a21704c9f..d11f8705f9 100644
--- a/src/java/org/apache/cassandra/schema/SchemaKeyspace.java
+++ b/src/java/org/apache/cassandra/schema/SchemaKeyspace.java
@@ -57,6 +57,8 @@ import static java.lang.String.format;
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toSet;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.IGNORE_CORRUPTED_SCHEMA_TABLES;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_FLUSH_LOCAL_SCHEMA_CHANGES;
 import static org.apache.cassandra.cql3.QueryProcessor.executeInternal;
 import static org.apache.cassandra.cql3.QueryProcessor.executeOnceInternal;
 import static org.apache.cassandra.schema.SchemaKeyspaceTables.*;
@@ -77,8 +79,8 @@ public final class SchemaKeyspace
 
     private static final Logger logger = LoggerFactory.getLogger(SchemaKeyspace.class);
 
-    private static final boolean FLUSH_SCHEMA_TABLES = CassandraRelevantProperties.FLUSH_LOCAL_SCHEMA_CHANGES.getBoolean();
-    private static final boolean IGNORE_CORRUPTED_SCHEMA_TABLES = Boolean.parseBoolean(System.getProperty("cassandra.ignore_corrupted_schema_tables", "false"));
+    private static final boolean FLUSH_SCHEMA_TABLES = TEST_FLUSH_LOCAL_SCHEMA_CHANGES.getBoolean();
+    private static final boolean IGNORE_CORRUPTED_SCHEMA_TABLES_PROPERTY_VALUE = IGNORE_CORRUPTED_SCHEMA_TABLES.getBoolean();
 
     /**
      * The tables to which we added the cdc column. This is used in {@link #makeUpdateForSchema} below to make sure we skip that
@@ -1002,13 +1004,13 @@ public final class SchemaKeyspace
                                                 SchemaConstants.SCHEMA_KEYSPACE_NAME, COLUMNS, keyspaceName, tableName,
                                                 SchemaConstants.SCHEMA_KEYSPACE_NAME, COLUMNS);
 
-                if (IGNORE_CORRUPTED_SCHEMA_TABLES)
+                if (IGNORE_CORRUPTED_SCHEMA_TABLES_PROPERTY_VALUE)
                 {
                     logger.error(errorMsg, "", exc);
                 }
                 else
                 {
-                    logger.error(errorMsg, "restart cassandra with -Dcassandra.ignore_corrupted_schema_tables=true and ");
+                    logger.error(errorMsg, "restart cassandra with -D{}=true and ", IGNORE_CORRUPTED_SCHEMA_TABLES.getKey());
                     throw exc;
                 }
             }
diff --git a/src/java/org/apache/cassandra/schema/SchemaUpdateHandlerFactoryProvider.java b/src/java/org/apache/cassandra/schema/SchemaUpdateHandlerFactoryProvider.java
index 9411a9285c..63d170a781 100644
--- a/src/java/org/apache/cassandra/schema/SchemaUpdateHandlerFactoryProvider.java
+++ b/src/java/org/apache/cassandra/schema/SchemaUpdateHandlerFactoryProvider.java
@@ -25,12 +25,17 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.SCHEMA_UPDATE_HANDLER_FACTORY_CLASS;
+
 /**
- * Provides the instance of SchemaUpdateHandler factory pointed by {@link #SUH_FACTORY_CLASS_PROPERTY} system property.
+ * Provides the instance of SchemaUpdateHandler factory pointed by
+ * {@link org.apache.cassandra.config.CassandraRelevantProperties#SCHEMA_UPDATE_HANDLER_FACTORY_CLASS} system property.
  * If the property is not defined, the default factory {@link DefaultSchemaUpdateHandler} instance is returned.
  */
 public class SchemaUpdateHandlerFactoryProvider implements Provider<SchemaUpdateHandlerFactory>
 {
+    /** @deprecated Use CassandraRelevantProperties.SCHEMA_UPDATE_HANDLER_FACTORY_CLASS instead. */
+    @Deprecated
     public static final String SUH_FACTORY_CLASS_PROPERTY = "cassandra.schema.update_handler_factory.class";
 
     public final static SchemaUpdateHandlerFactoryProvider instance = new SchemaUpdateHandlerFactoryProvider();
@@ -38,7 +43,7 @@ public class SchemaUpdateHandlerFactoryProvider implements Provider<SchemaUpdate
     @Override
     public SchemaUpdateHandlerFactory get()
     {
-        String suhFactoryClassName = StringUtils.trimToNull(System.getProperty(SUH_FACTORY_CLASS_PROPERTY));
+        String suhFactoryClassName = StringUtils.trimToNull(SCHEMA_UPDATE_HANDLER_FACTORY_CLASS.getString());
         if (suhFactoryClassName == null)
         {
             return DefaultSchemaUpdateHandlerFactory.instance;
@@ -53,7 +58,7 @@ public class SchemaUpdateHandlerFactoryProvider implements Provider<SchemaUpdate
             catch (InstantiationException | IllegalAccessException ex)
             {
                 throw new ConfigurationException(String.format("Failed to initialize schema update handler factory class %s defined in %s system property.",
-                                                               suhFactoryClassName, SUH_FACTORY_CLASS_PROPERTY), ex);
+                                                               suhFactoryClassName, SCHEMA_UPDATE_HANDLER_FACTORY_CLASS.getKey()), ex);
             }
         }
     }
diff --git a/src/java/org/apache/cassandra/security/AbstractSslContextFactory.java b/src/java/org/apache/cassandra/security/AbstractSslContextFactory.java
index e4f868f9b1..406c4720f2 100644
--- a/src/java/org/apache/cassandra/security/AbstractSslContextFactory.java
+++ b/src/java/org/apache/cassandra/security/AbstractSslContextFactory.java
@@ -35,7 +35,8 @@ import io.netty.handler.ssl.OpenSsl;
 import io.netty.handler.ssl.SslContext;
 import io.netty.handler.ssl.SslContextBuilder;
 import io.netty.handler.ssl.SslProvider;
-import org.apache.cassandra.config.Config;
+
+import static org.apache.cassandra.config.CassandraRelevantProperties.DISABLE_TCACTIVE_OPENSSL;
 
 /**
  * Abstract class implementing {@code ISslContextFacotry} to provide most of the functionality that any
@@ -109,12 +110,13 @@ abstract public class AbstractSslContextFactory implements ISslContextFactory
 
     /**
      * Dervies if {@code OpenSSL} is available. It allows in-jvm dtests to disable tcnative openssl support by
-     * setting {@code cassandra.disable_tcactive_openssl} system property as {@code true}. Otherwise, it creates a
-     * circular reference that prevents the instance class loader from being garbage collected.
+     * setting {@link  org.apache.cassandra.config.CassandraRelevantProperties#DISABLE_TCACTIVE_OPENSSL}
+     * system property as {@code true}. Otherwise, it creates a circular reference that prevents the instance
+     * class loader from being garbage collected.
      */
     protected void deriveIfOpenSslAvailable()
     {
-        if (Boolean.getBoolean(Config.PROPERTY_PREFIX + "disable_tcactive_openssl"))
+        if (DISABLE_TCACTIVE_OPENSSL.getBoolean())
             openSslIsAvailable = false;
         else
             openSslIsAvailable = OpenSsl.isAvailable();
diff --git a/src/java/org/apache/cassandra/security/SSLFactory.java b/src/java/org/apache/cassandra/security/SSLFactory.java
index e06da1f0cb..e6da577202 100644
--- a/src/java/org/apache/cassandra/security/SSLFactory.java
+++ b/src/java/org/apache/cassandra/security/SSLFactory.java
@@ -41,11 +41,12 @@ import io.netty.handler.ssl.OpenSsl;
 import io.netty.handler.ssl.SslContext;
 import io.netty.util.ReferenceCountUtil;
 import org.apache.cassandra.concurrent.ScheduledExecutors;
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.EncryptionOptions;
 import org.apache.cassandra.security.ISslContextFactory.SocketType;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.DISABLE_TCACTIVE_OPENSSL;
+
 /**
  * A Factory for providing and setting up client {@link SSLSocket}s. Also provides
  * methods for creating both JSSE {@link SSLContext} instances as well as netty {@link SslContext} instances.
@@ -64,7 +65,7 @@ public final class SSLFactory
     static private final boolean openSslIsAvailable;
     static
     {
-        if (Boolean.getBoolean(Config.PROPERTY_PREFIX + "disable_tcactive_openssl"))
+        if (DISABLE_TCACTIVE_OPENSSL.getBoolean())
         {
             openSslIsAvailable = false;
         }
diff --git a/src/java/org/apache/cassandra/service/ActiveRepairService.java b/src/java/org/apache/cassandra/service/ActiveRepairService.java
index eaba5d944e..5d69507656 100644
--- a/src/java/org/apache/cassandra/service/ActiveRepairService.java
+++ b/src/java/org/apache/cassandra/service/ActiveRepairService.java
@@ -119,6 +119,11 @@ import static com.google.common.collect.Iterables.transform;
 import static java.util.Collections.synchronizedSet;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.config.CassandraRelevantProperties.PARENT_REPAIR_STATUS_CACHE_SIZE;
+import static org.apache.cassandra.config.CassandraRelevantProperties.PARENT_REPAIR_STATUS_EXPIRY_SECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.PAXOS_REPAIR_ALLOW_MULTIPLE_PENDING_UNSAFE;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SKIP_PAXOS_REPAIR_ON_TOPOLOGY_CHANGE;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SKIP_PAXOS_REPAIR_ON_TOPOLOGY_CHANGE_KEYSPACES;
 import static org.apache.cassandra.config.Config.RepairCommandPoolFullStrategy.reject;
 import static org.apache.cassandra.config.DatabaseDescriptor.*;
 import static org.apache.cassandra.net.Message.out;
@@ -221,13 +226,11 @@ public class ActiveRepairService implements IEndpointStateChangeSubscriber, IFai
         this.failureDetector = failureDetector;
         this.gossiper = gossiper;
         this.repairStatusByCmd = CacheBuilder.newBuilder()
-                                             .expireAfterWrite(
-                                             Long.getLong("cassandra.parent_repair_status_expiry_seconds",
-                                                          TimeUnit.SECONDS.convert(1, TimeUnit.DAYS)), TimeUnit.SECONDS)
+                                             .expireAfterWrite(PARENT_REPAIR_STATUS_EXPIRY_SECONDS.getLong(), TimeUnit.SECONDS)
                                              // using weight wouldn't work so well, since it doesn't reflect mutation of cached data
                                              // see https://github.com/google/guava/wiki/CachesExplained
                                              // We assume each entry is unlikely to be much more than 100 bytes, so bounding the size should be sufficient.
-                                             .maximumSize(Long.getLong("cassandra.parent_repair_status_cache_size", 100_000))
+                                             .maximumSize(PARENT_REPAIR_STATUS_CACHE_SIZE.getLong())
                                              .build();
 
         DurationSpec.LongNanosecondsBound duration = getRepairStateExpires();
@@ -1055,21 +1058,21 @@ public class ActiveRepairService implements IEndpointStateChangeSubscriber, IFai
                     throw new RuntimeException(String.format("Insufficient live nodes to repair paxos for %s in %s for %s.\n" +
                                                              "There must be enough live nodes to satisfy EACH_QUORUM, but the following nodes are down: %s\n" +
                                                              "This check can be skipped by setting either the yaml property skip_paxos_repair_on_topology_change or " +
-                                                             "the system property cassandra.skip_paxos_repair_on_topology_change to false. The jmx property " +
+                                                             "the system property %s to false. The jmx property " +
                                                              "StorageService.SkipPaxosRepairOnTopologyChange can also be set to false to temporarily disable without " +
                                                              "restarting the node\n" +
                                                              "Individual keyspaces can be skipped with the yaml property skip_paxos_repair_on_topology_change_keyspaces, the" +
-                                                             "system property cassandra.skip_paxos_repair_on_topology_change_keyspaces, or temporarily with the jmx" +
+                                                             "system property %s, or temporarily with the jmx" +
                                                              "property StorageService.SkipPaxosRepairOnTopologyChangeKeyspaces\n" +
                                                              "Skipping this check can lead to paxos correctness issues",
-                                                             range, ksName, reason, downEndpoints));
+                                                             range, ksName, reason, downEndpoints, SKIP_PAXOS_REPAIR_ON_TOPOLOGY_CHANGE.getKey(), SKIP_PAXOS_REPAIR_ON_TOPOLOGY_CHANGE_KEYSPACES.getKey()));
                 }
                 EndpointsForToken pending = StorageService.instance.getTokenMetadata().pendingEndpointsForToken(range.right, ksName);
-                if (pending.size() > 1 && !Boolean.getBoolean("cassandra.paxos_repair_allow_multiple_pending_unsafe"))
+                if (pending.size() > 1 && !PAXOS_REPAIR_ALLOW_MULTIPLE_PENDING_UNSAFE.getBoolean())
                 {
                     throw new RuntimeException(String.format("Cannot begin paxos auto repair for %s in %s.%s, multiple pending endpoints exist for range (%s). " +
-                                                             "Set -Dcassandra.paxos_repair_allow_multiple_pending_unsafe=true to skip this check",
-                                                             range, table.keyspace, table.name, pending));
+                                                             "Set -D%s=true to skip this check",
+                                                             range, table.keyspace, table.name, pending, PAXOS_REPAIR_ALLOW_MULTIPLE_PENDING_UNSAFE.getKey()));
 
                 }
                 Future<Void> future = PaxosCleanup.cleanup(endpoints, table, Collections.singleton(range), false, repairCommandExecutor());
diff --git a/src/java/org/apache/cassandra/service/CassandraDaemon.java b/src/java/org/apache/cassandra/service/CassandraDaemon.java
index c08701cbb7..84fc5b1e89 100644
--- a/src/java/org/apache/cassandra/service/CassandraDaemon.java
+++ b/src/java/org/apache/cassandra/service/CassandraDaemon.java
@@ -92,12 +92,17 @@ import org.apache.cassandra.utils.logging.VirtualTableAppender;
 
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_FOREGROUND;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_JMX_LOCAL_PORT;
 import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_JMX_REMOTE_PORT;
 import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_PID_FILE;
 import static org.apache.cassandra.config.CassandraRelevantProperties.COM_SUN_MANAGEMENT_JMXREMOTE_PORT;
 import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_CLASS_PATH;
+import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_RMI_SERVER_RANDOM_ID;
 import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_VERSION;
 import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_VM_NAME;
+import static org.apache.cassandra.config.CassandraRelevantProperties.METRICS_REPORTER_CONFIG_FILE;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SIZE_RECORDER_INTERVAL;
+import static org.apache.cassandra.config.CassandraRelevantProperties.START_NATIVE_TRANSPORT;
 
 /**
  * The <code>CassandraDaemon</code> is an abstraction for a Cassandra daemon
@@ -151,7 +156,7 @@ public class CassandraDaemon
             return;
         }
 
-        System.setProperty("java.rmi.server.randomIDs", "true");
+        JAVA_RMI_SERVER_RANDOM_ID.setBoolean(true);
 
         // If a remote port has been specified then use that to set up a JMX
         // connector server which can be accessed remotely. Otherwise, look
@@ -167,7 +172,7 @@ public class CassandraDaemon
         if (jmxPort == null)
         {
             localOnly = true;
-            jmxPort = System.getProperty("cassandra.jmx.local.port");
+            jmxPort = CASSANDRA_JMX_LOCAL_PORT.getString();
         }
 
         if (jmxPort == null)
@@ -368,7 +373,7 @@ public class CassandraDaemon
 
         // schedule periodic dumps of table size estimates into SystemKeyspace.SIZE_ESTIMATES_CF
         // set cassandra.size_recorder_interval to 0 to disable
-        int sizeRecorderInterval = Integer.getInteger("cassandra.size_recorder_interval", 5 * 60);
+        int sizeRecorderInterval = SIZE_RECORDER_INTERVAL.getInt();
         if (sizeRecorderInterval > 0)
             ScheduledExecutors.optionalTasks.scheduleWithFixedDelay(SizeEstimatesRecorder.instance, 30, sizeRecorderInterval, TimeUnit.SECONDS);
 
@@ -379,7 +384,7 @@ public class CassandraDaemon
         QueryProcessor.instance.preloadPreparedStatements();
 
         // Metrics
-        String metricsReporterConfigFile = System.getProperty("cassandra.metricsReporterConfigFile");
+        String metricsReporterConfigFile = METRICS_REPORTER_CONFIG_FILE.getString();
         if (metricsReporterConfigFile != null)
         {
             logger.info("Trying to load metrics-reporter-config from file: {}", metricsReporterConfigFile);
@@ -698,8 +703,8 @@ public class CassandraDaemon
 
     private void startClientTransports()
     {
-        String nativeFlag = System.getProperty("cassandra.start_native_transport");
-        if ((nativeFlag != null && Boolean.parseBoolean(nativeFlag)) || (nativeFlag == null && DatabaseDescriptor.startNativeTransport()))
+        String nativeFlag = START_NATIVE_TRANSPORT.getString();
+        if (START_NATIVE_TRANSPORT.getBoolean() || (nativeFlag == null && DatabaseDescriptor.startNativeTransport()))
         {
             startNativeTransport();
             StorageService.instance.setRpcReady(true);
diff --git a/src/java/org/apache/cassandra/service/ClientState.java b/src/java/org/apache/cassandra/service/ClientState.java
index 1e1a1db9f0..f03a9712e8 100644
--- a/src/java/org/apache/cassandra/service/ClientState.java
+++ b/src/java/org/apache/cassandra/service/ClientState.java
@@ -58,6 +58,7 @@ import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.MD5Digest;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CUSTOM_QUERY_HANDLER_CLASS;
 import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 /**
@@ -101,13 +102,14 @@ public class ClientState
     static
     {
         QueryHandler handler = QueryProcessor.instance;
-        String customHandlerClass = System.getProperty("cassandra.custom_query_handler_class");
+        String customHandlerClass = CUSTOM_QUERY_HANDLER_CLASS.getString();
         if (customHandlerClass != null)
         {
             try
             {
                 handler = FBUtilities.construct(customHandlerClass, "QueryHandler");
-                logger.info("Using {} as query handler for native protocol queries (as requested with -Dcassandra.custom_query_handler_class)", customHandlerClass);
+                logger.info("Using {} as a query handler for native protocol queries (as requested by the {} system property)",
+                            customHandlerClass, CUSTOM_QUERY_HANDLER_CLASS.getKey());
             }
             catch (Exception e)
             {
diff --git a/src/java/org/apache/cassandra/service/LoadBroadcaster.java b/src/java/org/apache/cassandra/service/LoadBroadcaster.java
index ebda3cdb3e..da93ebd8db 100644
--- a/src/java/org/apache/cassandra/service/LoadBroadcaster.java
+++ b/src/java/org/apache/cassandra/service/LoadBroadcaster.java
@@ -30,9 +30,11 @@ import org.slf4j.LoggerFactory;
 import org.apache.cassandra.concurrent.ScheduledExecutors;
 import org.apache.cassandra.gms.*;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.BROADCAST_INTERVAL_MS;
+
 public class LoadBroadcaster implements IEndpointStateChangeSubscriber
 {
-    static final int BROADCAST_INTERVAL = Integer.getInteger("cassandra.broadcast_interval_ms", 60 * 1000);
+    static final int BROADCAST_INTERVAL = BROADCAST_INTERVAL_MS.getInt();
 
     public static final LoadBroadcaster instance = new LoadBroadcaster();
 
diff --git a/src/java/org/apache/cassandra/service/NativeTransportService.java b/src/java/org/apache/cassandra/service/NativeTransportService.java
index f131d74616..cc6ee37d49 100644
--- a/src/java/org/apache/cassandra/service/NativeTransportService.java
+++ b/src/java/org/apache/cassandra/service/NativeTransportService.java
@@ -40,6 +40,8 @@ import org.apache.cassandra.transport.Dispatcher;
 import org.apache.cassandra.transport.Server;
 import org.apache.cassandra.utils.NativeLibrary;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.NATIVE_EPOLL_ENABLED;
+
 /**
  * Handles native transport server lifecycle and associated resources. Lazily initialized.
  */
@@ -160,7 +162,7 @@ public class NativeTransportService
      */
     public static boolean useEpoll()
     {
-        final boolean enableEpoll = Boolean.parseBoolean(System.getProperty("cassandra.native.epoll.enabled", "true"));
+        final boolean enableEpoll = NATIVE_EPOLL_ENABLED.getBoolean();
 
         if (enableEpoll && !Epoll.isAvailable() && NativeLibrary.osType == NativeLibrary.OSType.LINUX)
             logger.warn("epoll not available", Epoll.unavailabilityCause());
diff --git a/src/java/org/apache/cassandra/service/StartupChecks.java b/src/java/org/apache/cassandra/service/StartupChecks.java
index dca6251568..d04d559a3b 100644
--- a/src/java/org/apache/cassandra/service/StartupChecks.java
+++ b/src/java/org/apache/cassandra/service/StartupChecks.java
@@ -73,6 +73,7 @@ import org.apache.cassandra.utils.JavaUtils;
 import org.apache.cassandra.utils.NativeLibrary;
 import org.apache.cassandra.utils.SigarLibrary;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_JMX_LOCAL_PORT;
 import static org.apache.cassandra.config.CassandraRelevantProperties.COM_SUN_MANAGEMENT_JMXREMOTE_PORT;
 import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_VERSION;
 import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_VM_NAME;
@@ -257,7 +258,7 @@ public class StartupChecks
                 logger.warn("JMX is not enabled to receive remote connections. Please see cassandra-env.sh for more info.");
                 jmxPort = CassandraRelevantProperties.CASSANDRA_JMX_LOCAL_PORT.toString();
                 if (jmxPort == null)
-                    logger.error("cassandra.jmx.local.port missing from cassandra-env.sh, unable to start local JMX service.");
+                    logger.error(CASSANDRA_JMX_LOCAL_PORT.getKey() + " missing from cassandra-env.sh, unable to start local JMX service.");
             }
             else
             {
@@ -681,7 +682,7 @@ public class StartupChecks
                 logger.warn(String.format("Cassandra system property flag %s is deprecated and you should " +
                                           "use startup check configuration in cassandra.yaml",
                                           CassandraRelevantProperties.IGNORE_DC.getKey()));
-                enabled = !Boolean.getBoolean(CassandraRelevantProperties.IGNORE_DC.getKey());
+                enabled = !CassandraRelevantProperties.IGNORE_DC.getBoolean();
             }
             if (enabled)
             {
@@ -718,7 +719,7 @@ public class StartupChecks
                 logger.warn(String.format("Cassandra system property flag %s is deprecated and you should " +
                                           "use startup check configuration in cassandra.yaml",
                                           CassandraRelevantProperties.IGNORE_RACK.getKey()));
-                enabled = !Boolean.getBoolean(CassandraRelevantProperties.IGNORE_RACK.getKey());
+                enabled = !CassandraRelevantProperties.IGNORE_RACK.getBoolean();
             }
             if (enabled)
             {
diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java
index 929cf0cccd..e8275740a4 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -240,10 +240,24 @@ import static java.util.concurrent.TimeUnit.NANOSECONDS;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toMap;
+import static org.apache.cassandra.config.CassandraRelevantProperties.ALLOW_UNSAFE_JOIN;
+import static org.apache.cassandra.config.CassandraRelevantProperties.ALLOW_UNSAFE_REPLACE;
 import static org.apache.cassandra.config.CassandraRelevantProperties.BOOTSTRAP_SCHEMA_DELAY_MS;
 import static org.apache.cassandra.config.CassandraRelevantProperties.BOOTSTRAP_SKIP_SCHEMA_CHECK;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CONSISTENT_RANGE_MOVEMENT;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CONSISTENT_SIMULTANEOUS_MOVES_ALLOW;
 import static org.apache.cassandra.config.CassandraRelevantProperties.DRAIN_EXECUTOR_TIMEOUT_MS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.JOIN_RING;
+import static org.apache.cassandra.config.CassandraRelevantProperties.LOAD_RING_STATE;
+import static org.apache.cassandra.config.CassandraRelevantProperties.OVERRIDE_DECOMMISSION;
+import static org.apache.cassandra.config.CassandraRelevantProperties.PAXOS_REPAIR_ON_TOPOLOGY_CHANGE_RETRIES;
+import static org.apache.cassandra.config.CassandraRelevantProperties.PAXOS_REPAIR_ON_TOPOLOGY_CHANGE_RETRY_DELAY_SECONDS;
 import static org.apache.cassandra.config.CassandraRelevantProperties.REPLACEMENT_ALLOW_EMPTY;
+import static org.apache.cassandra.config.CassandraRelevantProperties.REPLACE_ADDRESS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.REPLACE_ADDRESS_FIRST_BOOT;
+import static org.apache.cassandra.config.CassandraRelevantProperties.RESET_BOOTSTRAP_PROGRESS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.START_GOSSIP;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_WRITE_SURVEY;
 import static org.apache.cassandra.index.SecondaryIndexManager.getIndexName;
 import static org.apache.cassandra.index.SecondaryIndexManager.isIndexColumnFamily;
 import static org.apache.cassandra.net.NoPayload.noPayload;
@@ -387,8 +401,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
     private volatile boolean isBootstrapMode;
 
     /* we bootstrap but do NOT join the ring unless told to do so */
-    private boolean isSurveyMode = Boolean.parseBoolean(System.getProperty
-            ("cassandra.write_survey", "false"));
+    private boolean isSurveyMode = TEST_WRITE_SURVEY.getBoolean(false);
     /* true if node is rebuilding and receiving data */
     private final AtomicBoolean isRebuilding = new AtomicBoolean();
     private final AtomicBoolean isDecommissioning = new AtomicBoolean();
@@ -417,9 +430,9 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
     private Collection<Token> bootstrapTokens = null;
 
     // true when keeping strict consistency while bootstrapping
-    public static final boolean useStrictConsistency = Boolean.parseBoolean(System.getProperty("cassandra.consistent.rangemovement", "true"));
-    private static final boolean allowSimultaneousMoves = Boolean.parseBoolean(System.getProperty("cassandra.consistent.simultaneousmoves.allow","false"));
-    private static final boolean joinRing = Boolean.parseBoolean(System.getProperty("cassandra.join_ring", "true"));
+    public static final boolean useStrictConsistency = CONSISTENT_RANGE_MOVEMENT.getBoolean();
+    private static final boolean allowSimultaneousMoves = CONSISTENT_SIMULTANEOUS_MOVES_ALLOW.getBoolean();
+    private static final boolean joinRing = JOIN_RING.getBoolean();
     private boolean replacing;
 
     private final StreamStateStore streamStateStore = new StreamStateStore();
@@ -662,11 +675,11 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
         if (!joinRing)
             throw new ConfigurationException("Cannot set both join_ring=false and attempt to replace a node");
 
-        if (!shouldBootstrap() && !Boolean.getBoolean("cassandra.allow_unsafe_replace"))
+        if (!shouldBootstrap() && !ALLOW_UNSAFE_REPLACE.getBoolean())
             throw new RuntimeException("Replacing a node without bootstrapping risks invalidating consistency " +
                                        "guarantees as the expected data may not be present until repair is run. " +
                                        "To perform this operation, please restart with " +
-                                       "-Dcassandra.allow_unsafe_replace=true");
+                                       "-D" + ALLOW_UNSAFE_REPLACE.getKey() + "=true");
 
         InetAddressAndPort replaceAddress = DatabaseDescriptor.getReplaceAddress();
         logger.info("Gathering node replacement information for {}", replaceAddress);
@@ -782,9 +795,9 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
 
     public synchronized void checkForEndpointCollision(UUID localHostId, Set<InetAddressAndPort> peers) throws ConfigurationException
     {
-        if (Boolean.getBoolean("cassandra.allow_unsafe_join"))
+        if (ALLOW_UNSAFE_JOIN.getBoolean())
         {
-            logger.warn("Skipping endpoint collision check as cassandra.allow_unsafe_join=true");
+            logger.warn("Skipping endpoint collision check as " + ALLOW_UNSAFE_JOIN.getKey() + "=true");
             return;
         }
 
@@ -801,8 +814,8 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
         if (!Gossiper.instance.isSafeForStartup(FBUtilities.getBroadcastAddressAndPort(), localHostId, shouldBootstrap(), epStates))
         {
             throw new RuntimeException(String.format("A node with address %s already exists, cancelling join. " +
-                                                     "Use cassandra.replace_address if you want to replace this node.",
-                                                     FBUtilities.getBroadcastAddressAndPort()));
+                                                     "Use %s if you want to replace this node.",
+                                                     FBUtilities.getBroadcastAddressAndPort(), REPLACE_ADDRESS.getKey()));
         }
 
         validateEndpointSnitch(epStates.values().iterator());
@@ -825,7 +838,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
                 assert (pieces.length > 0);
                 String state = pieces[0];
                 if (state.equals(VersionedValue.STATUS_BOOTSTRAPPING) || state.equals(VersionedValue.STATUS_LEAVING) || state.equals(VersionedValue.STATUS_MOVING))
-                    throw new UnsupportedOperationException("Other bootstrapping/leaving/moving nodes detected, cannot bootstrap while cassandra.consistent.rangemovement is true");
+                    throw new UnsupportedOperationException("Other bootstrapping/leaving/moving nodes detected, cannot bootstrap while " + CONSISTENT_RANGE_MOVEMENT.getKey() + " is true");
             }
         }
     }
@@ -898,7 +911,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
             throw new AssertionError(e);
         }
 
-        if (Boolean.parseBoolean(System.getProperty("cassandra.load_ring_state", "true")))
+        if (LOAD_RING_STATE.getBoolean())
         {
             logger.info("Loading persisted ring state");
             populatePeerTokenMetadata();
@@ -931,7 +944,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
 
         replacing = isReplacing();
 
-        if (!Boolean.parseBoolean(System.getProperty("cassandra.start_gossip", "true")))
+        if (!START_GOSSIP.getBoolean())
         {
             logger.info("Not starting gossip as requested.");
             completeInitialization();
@@ -984,7 +997,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
 
     public void populateTokenMetadata()
     {
-        if (Boolean.parseBoolean(System.getProperty("cassandra.load_ring_state", "true")))
+        if (LOAD_RING_STATE.getBoolean())
         {
             populatePeerTokenMetadata();
             // if we have not completed bootstrapping, we should not add ourselves as a normal token
@@ -1021,9 +1034,9 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
         if (replacing)
             return true;
 
-        if (System.getProperty("cassandra.replace_address_first_boot", null) != null && SystemKeyspace.bootstrapComplete())
+        if (REPLACE_ADDRESS_FIRST_BOOT.getString() != null && SystemKeyspace.bootstrapComplete())
         {
-            logger.info("Replace address on first boot requested; this node is already bootstrapped");
+            logger.info("Replace address on the first boot requested; this node is already bootstrapped");
             return false;
         }
 
@@ -1059,17 +1072,20 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
 
             if (SystemKeyspace.wasDecommissioned())
             {
-                if (Boolean.getBoolean("cassandra.override_decommission"))
+                if (OVERRIDE_DECOMMISSION.getBoolean())
                 {
                     logger.warn("This node was decommissioned, but overriding by operator request.");
                     SystemKeyspace.setBootstrapState(SystemKeyspace.BootstrapState.COMPLETED);
                 }
                 else
-                    throw new ConfigurationException("This node was decommissioned and will not rejoin the ring unless cassandra.override_decommission=true has been set, or all existing data is removed and the node is bootstrapped again");
+                {
+                    throw new ConfigurationException("This node was decommissioned and will not rejoin the ring unless -D" + OVERRIDE_DECOMMISSION.getKey() +
+                                                     "=true has been set, or all existing data is removed and the node is bootstrapped again");
+                }
             }
 
             if (DatabaseDescriptor.getReplaceTokens().size() > 0 || DatabaseDescriptor.getReplaceNode() != null)
-                throw new RuntimeException("Replace method removed; use cassandra.replace_address instead");
+                throw new RuntimeException("Replace method removed; use " + REPLACE_ADDRESS.getKey() + " system property instead.");
 
             MessagingService.instance().listen();
 
@@ -1945,7 +1961,8 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
             String bootstrapTokens = StringUtils.join(tokenMetadata.getBootstrapTokens().valueSet(), ',');
             String leavingTokens = StringUtils.join(tokenMetadata.getLeavingEndpoints(), ',');
             String movingTokens = StringUtils.join(tokenMetadata.getMovingEndpoints().stream().map(e -> e.right).toArray(), ',');
-            throw new UnsupportedOperationException(String.format("Other bootstrapping/leaving/moving nodes detected, cannot bootstrap while cassandra.consistent.rangemovement is true. Nodes detected, bootstrapping: %s; leaving: %s; moving: %s;", bootstrapTokens, leavingTokens, movingTokens));
+            throw new UnsupportedOperationException(String.format("Other bootstrapping/leaving/moving nodes detected, cannot bootstrap while %s is true. Nodes detected, bootstrapping: %s; leaving: %s; moving: %s;",
+                                                                  CONSISTENT_RANGE_MOVEMENT.getKey(), bootstrapTokens, leavingTokens, movingTokens));
         }
 
         // get bootstrap tokens
@@ -2063,7 +2080,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
         if (!Gossiper.instance.seenAnySeed())
             throw new IllegalStateException("Unable to contact any seeds: " + Gossiper.instance.getSeeds());
 
-        if (Boolean.getBoolean("cassandra.reset_bootstrap_progress"))
+        if (RESET_BOOTSTRAP_PROGRESS.getBoolean())
         {
             logger.info("Resetting bootstrap progress to start fresh");
             SystemKeyspace.resetAvailableStreamedRanges();
@@ -4703,8 +4720,8 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
         logger.info("repairing paxos for {}", reason);
 
         int retries = 0;
-        int maxRetries = Integer.getInteger("cassandra.paxos_repair_on_topology_change_retries", 10);
-        int delaySec = Integer.getInteger("cassandra.paxos_repair_on_topology_change_retry_delay_seconds", 10);
+        int maxRetries = PAXOS_REPAIR_ON_TOPOLOGY_CHANGE_RETRIES.getInt();
+        int delaySec = PAXOS_REPAIR_ON_TOPOLOGY_CHANGE_RETRY_DELAY_SECONDS.getInt();
 
         boolean completed = false;
         while (!completed)
diff --git a/src/java/org/apache/cassandra/service/paxos/Paxos.java b/src/java/org/apache/cassandra/service/paxos/Paxos.java
index 784974e874..acc6267161 100644
--- a/src/java/org/apache/cassandra/service/paxos/Paxos.java
+++ b/src/java/org/apache/cassandra/service/paxos/Paxos.java
@@ -100,6 +100,8 @@ import org.apache.cassandra.utils.NoSpamLogger;
 import static java.util.Collections.emptyMap;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.PAXOS_LOG_TTL_LINEARIZABILITY_VIOLATIONS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.PAXOS_MODERN_RELEASE;
 import static org.apache.cassandra.config.Config.PaxosVariant.v2_without_linearizable_reads_or_rejected_writes;
 import static org.apache.cassandra.db.Keyspace.openAndGetStore;
 import static org.apache.cassandra.exceptions.RequestFailureReason.TIMEOUT;
@@ -214,8 +216,8 @@ public class Paxos
     private static final Logger logger = LoggerFactory.getLogger(Paxos.class);
 
     private static volatile Config.PaxosVariant PAXOS_VARIANT = DatabaseDescriptor.getPaxosVariant();
-    private static final CassandraVersion MODERN_PAXOS_RELEASE = new CassandraVersion(System.getProperty("cassandra.paxos.modern_release", "4.1"));
-    static final boolean LOG_TTL_LINEARIZABILITY_VIOLATIONS = Boolean.parseBoolean(System.getProperty("cassandra.paxos.log_ttl_linearizability_violations", "true"));
+    private static final CassandraVersion MODERN_PAXOS_RELEASE = new CassandraVersion(PAXOS_MODERN_RELEASE.getString());
+    static final boolean LOG_TTL_LINEARIZABILITY_VIOLATIONS = PAXOS_LOG_TTL_LINEARIZABILITY_VIOLATIONS.getBoolean();
 
     static class Electorate implements Iterable<InetAddressAndPort>
     {
diff --git a/src/java/org/apache/cassandra/service/paxos/PaxosCommit.java b/src/java/org/apache/cassandra/service/paxos/PaxosCommit.java
index 4321fc918f..43f9dd1eba 100644
--- a/src/java/org/apache/cassandra/service/paxos/PaxosCommit.java
+++ b/src/java/org/apache/cassandra/service/paxos/PaxosCommit.java
@@ -25,6 +25,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.db.Mutation;
@@ -57,7 +58,7 @@ public class PaxosCommit<OnDone extends Consumer<? super PaxosCommit.Status>> ex
     public static final RequestHandler requestHandler = new RequestHandler();
     private static final Logger logger = LoggerFactory.getLogger(PaxosCommit.class);
 
-    private static volatile boolean ENABLE_DC_LOCAL_COMMIT = Boolean.parseBoolean(System.getProperty("cassandra.enable_dc_local_commit", "true"));
+    private static volatile boolean ENABLE_DC_LOCAL_COMMIT = CassandraRelevantProperties.ENABLE_DC_LOCAL_COMMIT.getBoolean();
 
     public static boolean getEnableDcLocalCommit()
     {
diff --git a/src/java/org/apache/cassandra/service/paxos/PaxosRepair.java b/src/java/org/apache/cassandra/service/paxos/PaxosRepair.java
index d88323cbcf..8ae8ebd910 100644
--- a/src/java/org/apache/cassandra/service/paxos/PaxosRepair.java
+++ b/src/java/org/apache/cassandra/service/paxos/PaxosRepair.java
@@ -65,6 +65,7 @@ import org.apache.cassandra.utils.MonotonicClock;
 
 import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 import static org.apache.cassandra.config.CassandraRelevantProperties.PAXOS_REPAIR_RETRY_TIMEOUT_IN_MS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SKIP_PAXOS_REPAIR_VERSION_VALIDATION;
 import static org.apache.cassandra.exceptions.RequestFailureReason.UNKNOWN;
 import static org.apache.cassandra.net.Verb.PAXOS2_REPAIR_REQ;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
@@ -634,7 +635,7 @@ public class PaxosRepair extends AbstractPaxosRepair
         }
     }
 
-    private static volatile boolean SKIP_VERSION_VALIDATION = Boolean.getBoolean("cassandra.skip_paxos_repair_version_validation");
+    private static volatile boolean SKIP_VERSION_VALIDATION = SKIP_PAXOS_REPAIR_VERSION_VALIDATION.getBoolean();
 
     public static void setSkipPaxosRepairCompatibilityCheck(boolean v)
     {
diff --git a/src/java/org/apache/cassandra/service/paxos/PaxosRequestCallback.java b/src/java/org/apache/cassandra/service/paxos/PaxosRequestCallback.java
index 282aeb2dc1..aad32ace05 100644
--- a/src/java/org/apache/cassandra/service/paxos/PaxosRequestCallback.java
+++ b/src/java/org/apache/cassandra/service/paxos/PaxosRequestCallback.java
@@ -37,7 +37,7 @@ import static org.apache.cassandra.utils.FBUtilities.getBroadcastAddressAndPort;
 public abstract class PaxosRequestCallback<T> extends FailureRecordingCallback<T>
 {
     private static final Logger logger = LoggerFactory.getLogger(PaxosRequestCallback.class);
-    private static final boolean USE_SELF_EXECUTION = CassandraRelevantProperties.PAXOS_EXECUTE_ON_SELF.getBoolean();
+    private static final boolean USE_SELF_EXECUTION = CassandraRelevantProperties.PAXOS_USE_SELF_EXECUTION.getBoolean();
 
     protected abstract void onResponse(T response, InetAddressAndPort from);
 
diff --git a/src/java/org/apache/cassandra/service/paxos/PaxosState.java b/src/java/org/apache/cassandra/service/paxos/PaxosState.java
index e802cd070f..22f064dbb7 100644
--- a/src/java/org/apache/cassandra/service/paxos/PaxosState.java
+++ b/src/java/org/apache/cassandra/service/paxos/PaxosState.java
@@ -50,6 +50,7 @@ import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.Nemesis;
 
 import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.PAXOS_DISABLE_COORDINATOR_LOCKING;
 import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.apache.cassandra.config.Config.PaxosStatePurging.gc_grace;
 import static org.apache.cassandra.config.Config.PaxosStatePurging.legacy;
@@ -66,7 +67,7 @@ import static org.apache.cassandra.service.paxos.Commit.isAfter;
  */
 public class PaxosState implements PaxosOperationLock
 {
-    private static volatile boolean DISABLE_COORDINATOR_LOCKING = Boolean.getBoolean("cassandra.paxos.disable_coordinator_locking");
+    private static volatile boolean DISABLE_COORDINATOR_LOCKING = PAXOS_DISABLE_COORDINATOR_LOCKING.getBoolean();
     public static final ConcurrentHashMap<Key, PaxosState> ACTIVE = new ConcurrentHashMap<>();
     public static final Map<Key, Snapshot> RECENT = Caffeine.newBuilder()
                                                             .maximumWeight(DatabaseDescriptor.getPaxosCacheSizeInMiB() << 20)
diff --git a/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupSession.java b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupSession.java
index 3d765eaada..5f1eea6b68 100644
--- a/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupSession.java
+++ b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupSession.java
@@ -43,6 +43,7 @@ import org.apache.cassandra.net.RequestCallbackWithFailure;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.utils.concurrent.AsyncFuture;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.PAXOS_CLEANUP_SESSION_TIMEOUT_SECONDS;
 import static org.apache.cassandra.net.Verb.PAXOS2_CLEANUP_REQ;
 import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
@@ -56,7 +57,7 @@ public class PaxosCleanupSession extends AsyncFuture<Void> implements Runnable,
     static final long TIMEOUT_NANOS;
     static
     {
-        long timeoutSeconds = Integer.getInteger("cassandra.paxos_cleanup_session_timeout_seconds", (int) TimeUnit.HOURS.toSeconds(2));
+        long timeoutSeconds = PAXOS_CLEANUP_SESSION_TIMEOUT_SECONDS.getLong();
         TIMEOUT_NANOS = TimeUnit.SECONDS.toNanos(timeoutSeconds);
     }
 
diff --git a/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosStateTracker.java b/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosStateTracker.java
index c869249350..514ce15a34 100644
--- a/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosStateTracker.java
+++ b/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosStateTracker.java
@@ -53,6 +53,9 @@ import org.apache.cassandra.service.paxos.PaxosRepairHistory;
 import org.apache.cassandra.utils.CloseableIterator;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.FORCE_PAXOS_STATE_REBUILD;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SKIP_PAXOS_STATE_REBUILD;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TRUNCATE_BALLOT_METADATA;
 import static org.apache.cassandra.db.SystemKeyspace.PAXOS_REPAIR_HISTORY;
 import static org.apache.cassandra.schema.SchemaConstants.SYSTEM_KEYSPACE_NAME;
 
@@ -63,24 +66,20 @@ public class PaxosStateTracker
 {
     private static final Logger logger = LoggerFactory.getLogger(PaxosStateTracker.class);
 
-    // when starting with no data, skip rebuilding uncommitted data from the paxos table
-    static final String SKIP_REBUILD_PROP = "cassandra.skip_paxos_state_rebuild";
-    static final String FORCE_REBUILD_PROP = "cassandra.force_paxos_state_rebuild";
-    static final String TRUNCATE_BALLOT_METADATA_PROP = "cassandra.truncate_ballot_metadata";
-
+    /** when starting with no data, skip rebuilding uncommitted data from the paxos table. */
     private static boolean skipRebuild()
     {
-        return Boolean.getBoolean(SKIP_REBUILD_PROP);
+        return SKIP_PAXOS_STATE_REBUILD.getBoolean();
     }
 
     private static boolean forceRebuild()
     {
-        return Boolean.getBoolean(FORCE_REBUILD_PROP);
+        return FORCE_PAXOS_STATE_REBUILD.getBoolean();
     }
 
     private static boolean truncateBallotMetadata()
     {
-        return Boolean.getBoolean(TRUNCATE_BALLOT_METADATA_PROP);
+        return TRUNCATE_BALLOT_METADATA.getBoolean();
     }
 
     private static final String DIRECTORY = "system/" + SystemKeyspace.PAXOS_REPAIR_STATE;
@@ -130,8 +129,8 @@ public class PaxosStateTracker
         boolean rebuildNeeded = !hasExistingData || forceRebuild();
 
         if (truncateBallotMetadata() && !rebuildNeeded)
-            logger.warn("{} was set, but {} was not and no rebuild is required. Ballot data will not be truncated",
-                        TRUNCATE_BALLOT_METADATA_PROP, FORCE_REBUILD_PROP);
+            logger.warn("{} was set to true, but {} was not and no rebuild is required. Ballot data will not be truncated",
+                        TRUNCATE_BALLOT_METADATA.getKey(), FORCE_PAXOS_STATE_REBUILD.getKey());
 
         if (rebuildNeeded)
         {
@@ -164,7 +163,7 @@ public class PaxosStateTracker
     @SuppressWarnings("resource")
     private void rebuildUncommittedData() throws IOException
     {
-        logger.info("Beginning uncommitted paxos data rebuild. Set -Dcassandra.skip_paxos_state_rebuild=true and restart to skip");
+        logger.info("Beginning uncommitted paxos data rebuild. Set -D{}=true and restart to skip", SKIP_PAXOS_STATE_REBUILD.getKey());
 
         String queryStr = "SELECT * FROM " + SYSTEM_KEYSPACE_NAME + '.' + SystemKeyspace.PAXOS;
         SelectStatement stmt = (SelectStatement) QueryProcessor.parseStatement(queryStr).prepare(ClientState.forInternalCalls());
diff --git a/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedTracker.java b/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedTracker.java
index 7712c79e3e..ae4662f3d2 100644
--- a/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedTracker.java
+++ b/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedTracker.java
@@ -49,6 +49,9 @@ import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.service.paxos.cleanup.PaxosTableRepairs;
 import org.apache.cassandra.utils.CloseableIterator;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.AUTO_REPAIR_FREQUENCY_SECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.DISABLE_PAXOS_AUTO_REPAIRS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.DISABLE_PAXOS_STATE_FLUSH;
 import static org.apache.cassandra.config.DatabaseDescriptor.paxosRepairEnabled;
 import static org.apache.cassandra.service.paxos.uncommitted.PaxosKeyState.mergeUncommitted;
 
@@ -69,8 +72,8 @@ public class PaxosUncommittedTracker
 
     private static volatile UpdateSupplier updateSupplier;
 
-    private volatile boolean autoRepairsEnabled = !Boolean.getBoolean("cassandra.disable_paxos_auto_repairs");
-    private volatile boolean stateFlushEnabled = !Boolean.getBoolean("cassandra.disable_paxos_state_flush");
+    private volatile boolean autoRepairsEnabled = !DISABLE_PAXOS_AUTO_REPAIRS.getBoolean();
+    private volatile boolean stateFlushEnabled = !DISABLE_PAXOS_STATE_FLUSH.getBoolean();
 
     private boolean started = false;
     private boolean autoRepairStarted = false;
@@ -327,7 +330,7 @@ public class PaxosUncommittedTracker
     {
         if (autoRepairStarted)
             return;
-        int seconds = Integer.getInteger("cassandra.auto_repair_frequency_seconds", (int) TimeUnit.MINUTES.toSeconds(5));
+        int seconds = AUTO_REPAIR_FREQUENCY_SECONDS.getInt();
         ScheduledExecutors.scheduledTasks.scheduleAtFixedRate(this::maintenance, seconds, seconds, TimeUnit.SECONDS);
         autoRepairStarted = true;
     }
diff --git a/src/java/org/apache/cassandra/service/reads/range/RangeCommands.java b/src/java/org/apache/cassandra/service/reads/range/RangeCommands.java
index 5b656d7377..1c5ce7f147 100644
--- a/src/java/org/apache/cassandra/service/reads/range/RangeCommands.java
+++ b/src/java/org/apache/cassandra/service/reads/range/RangeCommands.java
@@ -21,6 +21,7 @@ package org.apache.cassandra.service.reads.range;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.ConsistencyLevel;
@@ -49,8 +50,7 @@ public class RangeCommands
      * don't want a burst of range requests that will back up, hurting all other queries. At the same time,
      * we want to give range queries a chance to run if resources are available.
      */
-    private static final int MAX_CONCURRENT_RANGE_REQUESTS = Math.max(1, Integer.getInteger("cassandra.max_concurrent_range_requests",
-                                                                                            FBUtilities.getAvailableProcessors() * 10));
+    private static final int MAX_CONCURRENT_RANGE_REQUESTS = Math.max(1, CassandraRelevantProperties.MAX_CONCURRENT_RANGE_REQUESTS.getInt(FBUtilities.getAvailableProcessors() * 10));
 
     @SuppressWarnings("resource") // created iterators will be closed in CQL layer through the chain of transformations
     public static PartitionIterator partitions(PartitionRangeReadCommand command,
diff --git a/src/java/org/apache/cassandra/service/reads/repair/BlockingReadRepairs.java b/src/java/org/apache/cassandra/service/reads/repair/BlockingReadRepairs.java
index 7a4882bcd0..de49f5a563 100644
--- a/src/java/org/apache/cassandra/service/reads/repair/BlockingReadRepairs.java
+++ b/src/java/org/apache/cassandra/service/reads/repair/BlockingReadRepairs.java
@@ -33,14 +33,14 @@ import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.tracing.Tracing;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.DROP_OVERSIZED_READ_REPAIR_MUTATIONS;
 import static org.apache.cassandra.db.IMutation.MAX_MUTATION_SIZE;
 
 public class BlockingReadRepairs
 {
     private static final Logger logger = LoggerFactory.getLogger(BlockingReadRepairs.class);
 
-    private static final boolean DROP_OVERSIZED_READ_REPAIR_MUTATIONS =
-        Boolean.getBoolean("cassandra.drop_oversized_readrepair_mutations");
+    private static final boolean SHOULD_DROP_OVERSIZED_READ_REPAIR_MUTATIONS = DROP_OVERSIZED_READ_REPAIR_MUTATIONS.getBoolean();
 
     /**
      * Create a read repair mutation from the given update, if the mutation is not larger than the maximum
@@ -65,7 +65,7 @@ public class BlockingReadRepairs
             Keyspace keyspace = Keyspace.open(mutation.getKeyspaceName());
             TableMetadata metadata = update.metadata();
 
-            if (DROP_OVERSIZED_READ_REPAIR_MUTATIONS)
+            if (SHOULD_DROP_OVERSIZED_READ_REPAIR_MUTATIONS)
             {
                 logger.debug("Encountered an oversized ({}/{}) read repair mutation for table {}, key {}, node {}",
                              e.mutationSize,
diff --git a/src/java/org/apache/cassandra/service/reads/thresholds/CoordinatorWarnings.java b/src/java/org/apache/cassandra/service/reads/thresholds/CoordinatorWarnings.java
index ff5bd78fa2..1b317dba58 100644
--- a/src/java/org/apache/cassandra/service/reads/thresholds/CoordinatorWarnings.java
+++ b/src/java/org/apache/cassandra/service/reads/thresholds/CoordinatorWarnings.java
@@ -33,10 +33,12 @@ import org.apache.cassandra.metrics.TableMetrics;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.service.ClientWarn;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.READS_THRESHOLDS_COORDINATOR_DEFENSIVE_CHECKS_ENABLED;
+
 public class CoordinatorWarnings
 {
     private static final Logger logger = LoggerFactory.getLogger(CoordinatorWarnings.class);
-    private static final boolean ENABLE_DEFENSIVE_CHECKS = Boolean.getBoolean("cassandra.reads.thresholds.coordinator.defensive_checks_enabled");
+    private static final boolean ENABLE_DEFENSIVE_CHECKS = READS_THRESHOLDS_COORDINATOR_DEFENSIVE_CHECKS_ENABLED.getBoolean();
 
     // when .init() is called set the STATE to be INIT; this is to lazy allocate the map only when warnings are generated
     private static final Map<ReadCommand, WarningsSnapshot> INIT = Collections.emptyMap();
diff --git a/src/java/org/apache/cassandra/streaming/StreamHook.java b/src/java/org/apache/cassandra/streaming/StreamHook.java
index 86b5182c89..84db420f04 100644
--- a/src/java/org/apache/cassandra/streaming/StreamHook.java
+++ b/src/java/org/apache/cassandra/streaming/StreamHook.java
@@ -22,6 +22,8 @@ import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.streaming.messages.OutgoingStreamMessage;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.STREAM_HOOK;
+
 public interface StreamHook
 {
     public static final StreamHook instance = createHook();
@@ -32,7 +34,7 @@ public interface StreamHook
 
     static StreamHook createHook()
     {
-        String className =  System.getProperty("cassandra.stream_hook");
+        String className = STREAM_HOOK.getString();
         if (className != null)
         {
             return FBUtilities.construct(className, StreamHook.class.getSimpleName());
diff --git a/src/java/org/apache/cassandra/streaming/StreamSession.java b/src/java/org/apache/cassandra/streaming/StreamSession.java
index a0e9b2d079..e170ca60ef 100644
--- a/src/java/org/apache/cassandra/streaming/StreamSession.java
+++ b/src/java/org/apache/cassandra/streaming/StreamSession.java
@@ -75,6 +75,7 @@ import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.concurrent.FutureCombiner;
 
 import static com.google.common.collect.Iterables.all;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_STREAMING_DEBUG_STACKTRACE_LIMIT;
 import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.apache.cassandra.locator.InetAddressAndPort.hostAddressAndPort;
 import static org.apache.cassandra.utils.FBUtilities.getBroadcastAddressAndPort;
@@ -157,7 +158,7 @@ import static org.apache.cassandra.utils.FBUtilities.getBroadcastAddressAndPort;
 public class StreamSession
 {
     private static final Logger logger = LoggerFactory.getLogger(StreamSession.class);
-    private static final int DEBUG_STACKTRACE_LIMIT = Integer.parseInt(System.getProperty("cassandra.streaming.debug_stacktrace_limit", "2"));
+    private static final int DEBUG_STACKTRACE_LIMIT = CASSANDRA_STREAMING_DEBUG_STACKTRACE_LIMIT.getInt();
 
     public enum PrepareDirection { SEND, ACK }
 
diff --git a/src/java/org/apache/cassandra/streaming/async/StreamingMultiplexedChannel.java b/src/java/org/apache/cassandra/streaming/async/StreamingMultiplexedChannel.java
index 560fee9ad2..4ebb3913cd 100644
--- a/src/java/org/apache/cassandra/streaming/async/StreamingMultiplexedChannel.java
+++ b/src/java/org/apache/cassandra/streaming/async/StreamingMultiplexedChannel.java
@@ -53,14 +53,12 @@ import org.apache.cassandra.utils.concurrent.Semaphore;
 import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
 import static com.google.common.base.Throwables.getRootCause;
-import static java.lang.Integer.parseInt;
 import static java.lang.String.format;
-import static java.lang.System.getProperty;
 import static java.lang.Thread.currentThread;
 import static java.util.concurrent.TimeUnit.*;
 
 import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
-import static org.apache.cassandra.config.Config.PROPERTY_PREFIX;
+import static org.apache.cassandra.config.CassandraRelevantProperties.STREAMING_SESSION_PARALLELTRANSFERS;
 import static org.apache.cassandra.streaming.StreamSession.createLogTag;
 import static org.apache.cassandra.streaming.messages.StreamMessage.serialize;
 import static org.apache.cassandra.streaming.messages.StreamMessage.serializedSize;
@@ -91,7 +89,7 @@ public class StreamingMultiplexedChannel
     private static final Logger logger = LoggerFactory.getLogger(StreamingMultiplexedChannel.class);
 
     private static final int DEFAULT_MAX_PARALLEL_TRANSFERS = getAvailableProcessors();
-    private static final int MAX_PARALLEL_TRANSFERS = parseInt(getProperty(PROPERTY_PREFIX + "streaming.session.parallelTransfers", Integer.toString(DEFAULT_MAX_PARALLEL_TRANSFERS)));
+    private static final int MAX_PARALLEL_TRANSFERS = STREAMING_SESSION_PARALLELTRANSFERS.getInt(DEFAULT_MAX_PARALLEL_TRANSFERS);
 
     // a simple mechansim for allowing a degree of fairness across multiple sessions
     private static final Semaphore fileTransferSemaphore = newFairSemaphore(DEFAULT_MAX_PARALLEL_TRANSFERS);
diff --git a/src/java/org/apache/cassandra/tools/HashPassword.java b/src/java/org/apache/cassandra/tools/HashPassword.java
index ddc0a722f2..f229858c5c 100644
--- a/src/java/org/apache/cassandra/tools/HashPassword.java
+++ b/src/java/org/apache/cassandra/tools/HashPassword.java
@@ -57,7 +57,7 @@ public class HashPassword
             String password = null;
             if (cmd.hasOption(ENV_VAR))
             {
-                password = System.getenv(cmd.getOptionValue(ENV_VAR));
+                password = System.getenv(cmd.getOptionValue(ENV_VAR)); // checkstyle: suppress nearby 'blockSystemPropertyUsage'
                 if (password == null)
                 {
                     System.err.println(String.format("Environment variable '%s' is undefined.", cmd.getOptionValue(ENV_VAR)));
diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java b/src/java/org/apache/cassandra/tools/NodeProbe.java
index e983e2fbef..8e7fc0f132 100644
--- a/src/java/org/apache/cassandra/tools/NodeProbe.java
+++ b/src/java/org/apache/cassandra/tools/NodeProbe.java
@@ -115,6 +115,9 @@ import com.google.common.util.concurrent.Uninterruptibles;
 import org.apache.cassandra.tools.nodetool.GetTimeout;
 import org.apache.cassandra.utils.NativeLibrary;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.NODETOOL_JMX_NOTIFICATION_POLL_INTERVAL_SECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SSL_ENABLE;
+
 /**
  * JMX client operations for Cassandra.
  */
@@ -124,7 +127,7 @@ public class NodeProbe implements AutoCloseable
     private static final String ssObjName = "org.apache.cassandra.db:type=StorageService";
     private static final int defaultPort = 7199;
 
-    static long JMX_NOTIFICATION_POLL_INTERVAL_SECONDS = Long.getLong("cassandra.nodetool.jmx_notification_poll_interval_seconds", TimeUnit.SECONDS.convert(5, TimeUnit.MINUTES));
+    static long JMX_NOTIFICATION_POLL_INTERVAL_SECONDS = NODETOOL_JMX_NOTIFICATION_POLL_INTERVAL_SECONDS.getLong();
 
     final String host;
     final int port;
@@ -293,7 +296,7 @@ public class NodeProbe implements AutoCloseable
 
     private RMIClientSocketFactory getRMIClientSocketFactory()
     {
-        if (Boolean.parseBoolean(System.getProperty("ssl.enable")))
+        if (SSL_ENABLE.getBoolean())
             return new SslRMIClientSocketFactory();
         else
             return RMISocketFactory.getDefaultSocketFactory();
diff --git a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java
index 7a458683bf..26cc363263 100644
--- a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java
+++ b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java
@@ -56,6 +56,7 @@ import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.OutputHandler;
 import org.apache.cassandra.utils.Pair;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST;
 import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 public class StandaloneScrubber
@@ -80,7 +81,7 @@ public class StandaloneScrubber
     {
         Options options = Options.parseArgs(args);
 
-        if (Boolean.getBoolean(Util.ALLOW_TOOL_REINIT_FOR_TEST))
+        if (TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST.getBoolean())
             DatabaseDescriptor.toolInitialization(false); //Necessary for testing
         else
             Util.initDatabaseDescriptor();
diff --git a/src/java/org/apache/cassandra/tools/StandaloneSplitter.java b/src/java/org/apache/cassandra/tools/StandaloneSplitter.java
index 5229c7764a..f9f248a7b8 100644
--- a/src/java/org/apache/cassandra/tools/StandaloneSplitter.java
+++ b/src/java/org/apache/cassandra/tools/StandaloneSplitter.java
@@ -49,6 +49,7 @@ import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST;
 import static org.apache.cassandra.tools.BulkLoader.CmdLineOptions;
 import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
@@ -65,7 +66,7 @@ public class StandaloneSplitter
     public static void main(String[] args)
     {
         Options options = Options.parseArgs(args);
-        if (Boolean.getBoolean(Util.ALLOW_TOOL_REINIT_FOR_TEST))
+        if (TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST.getBoolean())
             DatabaseDescriptor.toolInitialization(false); //Necessary for testing
         else
             Util.initDatabaseDescriptor();
diff --git a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java b/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java
index a7a9dcdbb4..8458009422 100644
--- a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java
+++ b/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java
@@ -45,6 +45,7 @@ import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.OutputHandler;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST;
 import static org.apache.cassandra.tools.BulkLoader.CmdLineOptions;
 
 public class StandaloneUpgrader
@@ -57,7 +58,7 @@ public class StandaloneUpgrader
     public static void main(String args[])
     {
         Options options = Options.parseArgs(args);
-        if (Boolean.getBoolean(Util.ALLOW_TOOL_REINIT_FOR_TEST))
+        if (TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST.getBoolean())
             DatabaseDescriptor.toolInitialization(false); //Necessary for testing
         else
             Util.initDatabaseDescriptor();
diff --git a/src/java/org/apache/cassandra/tools/StandaloneVerifier.java b/src/java/org/apache/cassandra/tools/StandaloneVerifier.java
index b32d81bb13..547a1e05f2 100644
--- a/src/java/org/apache/cassandra/tools/StandaloneVerifier.java
+++ b/src/java/org/apache/cassandra/tools/StandaloneVerifier.java
@@ -51,6 +51,7 @@ import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.OutputHandler;
 import org.apache.cassandra.utils.Throwables;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST;
 import static org.apache.cassandra.tools.BulkLoader.CmdLineOptions;
 
 public class StandaloneVerifier
@@ -167,7 +168,7 @@ public class StandaloneVerifier
     }
 
     private static void initDatabaseDescriptorForTool() {
-        if (Boolean.getBoolean(Util.ALLOW_TOOL_REINIT_FOR_TEST))
+        if (TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST.getBoolean())
             DatabaseDescriptor.toolInitialization(false); //Necessary for testing
         else
             Util.initDatabaseDescriptor();
diff --git a/src/java/org/apache/cassandra/tools/Util.java b/src/java/org/apache/cassandra/tools/Util.java
index 414d04ad4c..6147b99648 100644
--- a/src/java/org/apache/cassandra/tools/Util.java
+++ b/src/java/org/apache/cassandra/tools/Util.java
@@ -53,7 +53,6 @@ import static java.lang.String.format;
 @SuppressWarnings("serial")
 public final class Util
 {
-    public static final String ALLOW_TOOL_REINIT_FOR_TEST = Util.class.getName() + "ALLOW_TOOL_REINIT_FOR_TEST"; // Necessary for testing
     static final String RESET = "\u001B[0m";
     static final String BLUE = "\u001B[34m";
     static final String CYAN = "\u001B[36m";
diff --git a/src/java/org/apache/cassandra/tracing/TraceStateImpl.java b/src/java/org/apache/cassandra/tracing/TraceStateImpl.java
index f8691eee5d..113420dd36 100644
--- a/src/java/org/apache/cassandra/tracing/TraceStateImpl.java
+++ b/src/java/org/apache/cassandra/tracing/TraceStateImpl.java
@@ -28,6 +28,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.concurrent.Stage;
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.exceptions.OverloadedException;
 import org.apache.cassandra.locator.InetAddressAndPort;
@@ -50,8 +51,7 @@ public class TraceStateImpl extends TraceState
     private static final Logger logger = LoggerFactory.getLogger(TraceStateImpl.class);
 
     @VisibleForTesting
-    public static int WAIT_FOR_PENDING_EVENTS_TIMEOUT_SECS =
-      Integer.parseInt(System.getProperty("cassandra.wait_for_tracing_events_timeout_secs", "0"));
+    public static int WAIT_FOR_PENDING_EVENTS_TIMEOUT_SECS = CassandraRelevantProperties.WAIT_FOR_TRACING_EVENTS_TIMEOUT_SECS.getInt();
 
     private final Set<Future<?>> pendingFutures = ConcurrentHashMap.newKeySet();
 
diff --git a/src/java/org/apache/cassandra/tracing/Tracing.java b/src/java/org/apache/cassandra/tracing/Tracing.java
index 5c820db01d..73cf2ebb0c 100644
--- a/src/java/org/apache/cassandra/tracing/Tracing.java
+++ b/src/java/org/apache/cassandra/tracing/Tracing.java
@@ -42,6 +42,7 @@ import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.TimeUUID;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CUSTOM_TRACING_CLASS;
 import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 /**
@@ -110,13 +111,14 @@ public abstract class Tracing extends ExecutorLocals.Impl
     static
     {
         Tracing tracing = null;
-        String customTracingClass = System.getProperty("cassandra.custom_tracing_class");
+        String customTracingClass = CUSTOM_TRACING_CLASS.getString();
         if (null != customTracingClass)
         {
             try
             {
                 tracing = FBUtilities.construct(customTracingClass, "Tracing");
-                logger.info("Using {} as tracing queries (as requested with -Dcassandra.custom_tracing_class)", customTracingClass);
+                logger.info("Using the {} class to trace queries (as requested by the {} system property)",
+                            customTracingClass, CUSTOM_TRACING_CLASS.getKey());
             }
             catch (Exception e)
             {
diff --git a/src/java/org/apache/cassandra/transport/CBUtil.java b/src/java/org/apache/cassandra/transport/CBUtil.java
index bdb1a909ad..d47f0ceb2c 100644
--- a/src/java/org/apache/cassandra/transport/CBUtil.java
+++ b/src/java/org/apache/cassandra/transport/CBUtil.java
@@ -38,7 +38,6 @@ import io.netty.buffer.ByteBufUtil;
 import io.netty.buffer.PooledByteBufAllocator;
 import io.netty.buffer.UnpooledByteBufAllocator;
 import io.netty.util.concurrent.FastThreadLocal;
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.utils.ByteBufferUtil;
@@ -47,6 +46,8 @@ import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.UUIDGen;
 import org.apache.cassandra.utils.memory.MemoryUtil;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_NETTY_USE_HEAP_ALLOCATOR;
+
 /**
  * ByteBuf utility methods.
  * Note that contrarily to ByteBufferUtil, these method do "read" the
@@ -56,7 +57,7 @@ import org.apache.cassandra.utils.memory.MemoryUtil;
  */
 public abstract class CBUtil
 {
-    public static final boolean USE_HEAP_ALLOCATOR = Boolean.getBoolean(Config.PROPERTY_PREFIX + "netty_use_heap_allocator");
+    public static final boolean USE_HEAP_ALLOCATOR = CASSANDRA_NETTY_USE_HEAP_ALLOCATOR.getBoolean();
     public static final ByteBufAllocator allocator = USE_HEAP_ALLOCATOR ? new UnpooledByteBufAllocator(false) : new PooledByteBufAllocator(true);
     private static final int UUID_SIZE = 16;
 
diff --git a/src/java/org/apache/cassandra/transport/PipelineConfigurator.java b/src/java/org/apache/cassandra/transport/PipelineConfigurator.java
index bf48eea334..ff524785dc 100644
--- a/src/java/org/apache/cassandra/transport/PipelineConfigurator.java
+++ b/src/java/org/apache/cassandra/transport/PipelineConfigurator.java
@@ -48,6 +48,7 @@ import org.apache.cassandra.security.ISslContextFactory;
 import org.apache.cassandra.security.SSLFactory;
 import org.apache.cassandra.transport.messages.StartupMessage;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_UNSAFE_VERBOSE_DEBUG_CLIENT_PROTOCOL;
 import static org.apache.cassandra.net.SocketFactory.newSslHandler;
 
 /**
@@ -63,7 +64,7 @@ public class PipelineConfigurator
 
     // Not to be used in production, this causes a Netty logging handler to be added to the pipeline,
     // which will throttle a system under any normal load.
-    private static final boolean DEBUG = Boolean.getBoolean("cassandra.unsafe_verbose_debug_client_protocol");
+    private static final boolean DEBUG = TEST_UNSAFE_VERBOSE_DEBUG_CLIENT_PROTOCOL.getBoolean();
 
     // Stateless handlers
     private static final ConnectionLimitHandler connectionLimitHandler = new ConnectionLimitHandler();
diff --git a/src/java/org/apache/cassandra/utils/DiagnosticSnapshotService.java b/src/java/org/apache/cassandra/utils/DiagnosticSnapshotService.java
index 29a9e5c2ba..168285da5f 100644
--- a/src/java/org/apache/cassandra/utils/DiagnosticSnapshotService.java
+++ b/src/java/org/apache/cassandra/utils/DiagnosticSnapshotService.java
@@ -41,6 +41,7 @@ import org.apache.cassandra.net.Verb;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableMetadata;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.DIAGNOSTIC_SNAPSHOT_INTERVAL_NANOS;
 import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 import static org.apache.cassandra.net.ParamType.SNAPSHOT_RANGES;
@@ -83,11 +84,6 @@ public class DiagnosticSnapshotService
         this.executor = executor;
     }
 
-    // Issue at most 1 snapshot request per minute for any given table.
-    // Replicas will only create one snapshot per day, but this stops us
-    // from swamping the network.
-    // Overridable via system property for testing.
-    private static final long SNAPSHOT_INTERVAL_NANOS = TimeUnit.MINUTES.toNanos(1);
     private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.BASIC_ISO_DATE;
     private final ConcurrentHashMap<TableId, AtomicLong> lastSnapshotTimes = new ConcurrentHashMap<>();
 
@@ -139,7 +135,7 @@ public class DiagnosticSnapshotService
         long now = nanoTime();
         AtomicLong cached = lastSnapshotTimes.computeIfAbsent(metadata.id, u -> new AtomicLong(0));
         long last = cached.get();
-        long interval = Long.getLong("cassandra.diagnostic_snapshot_interval_nanos", SNAPSHOT_INTERVAL_NANOS);
+        long interval = DIAGNOSTIC_SNAPSHOT_INTERVAL_NANOS.getLong();
         if (now - last > interval && cached.compareAndSet(last, now))
         {
             Message<SnapshotCommand> msg = Message.out(Verb.SNAPSHOT_REQ,
diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java b/src/java/org/apache/cassandra/utils/FBUtilities.java
index 6e2d4cc555..9086d6bb1f 100644
--- a/src/java/org/apache/cassandra/utils/FBUtilities.java
+++ b/src/java/org/apache/cassandra/utils/FBUtilities.java
@@ -90,7 +90,12 @@ import org.apache.cassandra.utils.concurrent.FutureCombiner;
 import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 import org.objectweb.asm.Opcodes;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_AVAILABLE_PROCESSORS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.GIT_SHA;
 import static org.apache.cassandra.config.CassandraRelevantProperties.LINE_SEPARATOR;
+import static org.apache.cassandra.config.CassandraRelevantProperties.OS_NAME;
+import static org.apache.cassandra.config.CassandraRelevantProperties.RELEASE_VERSION;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TRIGGERS_DIR;
 import static org.apache.cassandra.config.CassandraRelevantProperties.USER_HOME;
 import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 import static org.apache.cassandra.utils.Clock.Global.nanoTime;
@@ -109,7 +114,7 @@ public class FBUtilities
     public static final BigInteger TWO = new BigInteger("2");
     private static final String DEFAULT_TRIGGER_DIR = "triggers";
 
-    private static final String OPERATING_SYSTEM = System.getProperty("os.name").toLowerCase();
+    private static final String OPERATING_SYSTEM = OS_NAME.getString().toLowerCase();
     public static final boolean isLinux = OPERATING_SYSTEM.contains("linux");
 
     private static volatile InetAddress localInetAddress;
@@ -121,7 +126,7 @@ public class FBUtilities
 
     private static volatile String previousReleaseVersionString;
 
-    private static int availableProcessors = Integer.getInteger("cassandra.available_processors", DatabaseDescriptor.getAvailableProcessors());
+    private static int availableProcessors = CASSANDRA_AVAILABLE_PROCESSORS.getInt(DatabaseDescriptor.getAvailableProcessors());
 
     public static void setAvailableProcessors(int value)
     {
@@ -393,9 +398,9 @@ public class FBUtilities
     public static File cassandraTriggerDir()
     {
         File triggerDir = null;
-        if (System.getProperty("cassandra.triggers_dir") != null)
+        if (TRIGGERS_DIR.getString() != null)
         {
-            triggerDir = new File(System.getProperty("cassandra.triggers_dir"));
+            triggerDir = new File(TRIGGERS_DIR.getString());
         }
         else
         {
@@ -445,7 +450,7 @@ public class FBUtilities
     {
         Properties props = getVersionProperties();
         if (props == null)
-            return System.getProperty("cassandra.releaseVersion", UNKNOWN_RELEASE_VERSION);
+            return RELEASE_VERSION.getString(UNKNOWN_RELEASE_VERSION);
         return props.getProperty("CassandraVersion");
     }
 
@@ -453,7 +458,7 @@ public class FBUtilities
     {
         Properties props = getVersionProperties();
         if (props == null)
-            return System.getProperty("cassandra.gitSHA", UNKNOWN_GIT_SHA);
+            return GIT_SHA.getString(UNKNOWN_GIT_SHA);
         return props.getProperty("GitSHA", UNKNOWN_GIT_SHA);
     }
 
diff --git a/src/java/org/apache/cassandra/utils/GuidGenerator.java b/src/java/org/apache/cassandra/utils/GuidGenerator.java
index 46843b4e4f..e06270fa1d 100644
--- a/src/java/org/apache/cassandra/utils/GuidGenerator.java
+++ b/src/java/org/apache/cassandra/utils/GuidGenerator.java
@@ -34,7 +34,7 @@ public class GuidGenerator
     {
         if (!JAVA_SECURITY_EGD.isPresent())
         {
-            System.setProperty("java.security.egd", "file:/dev/urandom");
+            JAVA_SECURITY_EGD.setString("file:/dev/urandom");
         }
         mySecureRand = new SecureRandom();
         long secureInitializer = mySecureRand.nextLong();
diff --git a/src/java/org/apache/cassandra/utils/JMXServerUtils.java b/src/java/org/apache/cassandra/utils/JMXServerUtils.java
index 5557fda345..ba9c704800 100644
--- a/src/java/org/apache/cassandra/utils/JMXServerUtils.java
+++ b/src/java/org/apache/cassandra/utils/JMXServerUtils.java
@@ -54,6 +54,8 @@ import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.auth.jmx.AuthenticationProxy;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_JMX_AUTHORIZER;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_JMX_REMOTE_LOGIN_CONFIG;
 import static org.apache.cassandra.config.CassandraRelevantProperties.COM_SUN_MANAGEMENT_JMXREMOTE_ACCESS_FILE;
 import static org.apache.cassandra.config.CassandraRelevantProperties.COM_SUN_MANAGEMENT_JMXREMOTE_AUTHENTICATE;
 import static org.apache.cassandra.config.CassandraRelevantProperties.COM_SUN_MANAGEMENT_JMXREMOTE_PASSWORD_FILE;
@@ -62,6 +64,9 @@ import static org.apache.cassandra.config.CassandraRelevantProperties.COM_SUN_MA
 import static org.apache.cassandra.config.CassandraRelevantProperties.COM_SUN_MANAGEMENT_JMXREMOTE_SSL_ENABLED_CIPHER_SUITES;
 import static org.apache.cassandra.config.CassandraRelevantProperties.COM_SUN_MANAGEMENT_JMXREMOTE_SSL_ENABLED_PROTOCOLS;
 import static org.apache.cassandra.config.CassandraRelevantProperties.COM_SUN_MANAGEMENT_JMXREMOTE_SSL_NEED_CLIENT_AUTH;
+import static org.apache.cassandra.config.CassandraRelevantProperties.JAVAX_RMI_SSL_CLIENT_ENABLED_CIPHER_SUITES;
+import static org.apache.cassandra.config.CassandraRelevantProperties.JAVAX_RMI_SSL_CLIENT_ENABLED_PROTOCOLS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_RMI_SERVER_HOSTNAME;
 
 public class JMXServerUtils
 {
@@ -82,7 +87,7 @@ public class JMXServerUtils
         if (local)
         {
             serverAddress = InetAddress.getLoopbackAddress();
-            System.setProperty("java.rmi.server.hostname", serverAddress.getHostAddress());
+            JAVA_RMI_SERVER_HOSTNAME.setString(serverAddress.getHostAddress());
         }
 
         // Configure the RMI client & server socket factories, including SSL config.
@@ -166,7 +171,7 @@ public class JMXServerUtils
         // before creating the authenticator. If no password file has been
         // explicitly set, it's read from the default location
         // $JAVA_HOME/lib/management/jmxremote.password
-        String configEntry = System.getProperty("cassandra.jmx.remote.login.config");
+        String configEntry = CASSANDRA_JMX_REMOTE_LOGIN_CONFIG.getString();
         if (configEntry != null)
         {
             env.put(JMXConnectorServer.AUTHENTICATOR, new AuthenticationProxy(configEntry));
@@ -194,7 +199,7 @@ public class JMXServerUtils
         // can be set as the JMXConnectorServer's MBeanServerForwarder.
         // If no custom proxy is supplied, check system properties for the location of the
         // standard access file & stash it in env
-        String authzProxyClass = System.getProperty("cassandra.jmx.authorizer");
+        String authzProxyClass = CASSANDRA_JMX_AUTHORIZER.getString();
         if (authzProxyClass != null)
         {
             final InvocationHandler handler = FBUtilities.construct(authzProxyClass, "JMX authz proxy");
@@ -224,7 +229,7 @@ public class JMXServerUtils
             String protocolList = COM_SUN_MANAGEMENT_JMXREMOTE_SSL_ENABLED_PROTOCOLS.getString();
             if (protocolList != null)
             {
-                System.setProperty("javax.rmi.ssl.client.enabledProtocols", protocolList);
+                JAVAX_RMI_SSL_CLIENT_ENABLED_PROTOCOLS.setString(protocolList);
                 protocols = StringUtils.split(protocolList, ',');
             }
 
@@ -232,7 +237,7 @@ public class JMXServerUtils
             String cipherList = COM_SUN_MANAGEMENT_JMXREMOTE_SSL_ENABLED_CIPHER_SUITES.getString();
             if (cipherList != null)
             {
-                System.setProperty("javax.rmi.ssl.client.enabledCipherSuites", cipherList);
+                JAVAX_RMI_SSL_CLIENT_ENABLED_CIPHER_SUITES.setString(cipherList);
                 ciphers = StringUtils.split(cipherList, ',');
             }
 
diff --git a/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java b/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java
index ff86396af9..a396ef9947 100644
--- a/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java
+++ b/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java
@@ -46,6 +46,8 @@ import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.PRINT_HEAP_HISTOGRAM_ON_OUT_OF_MEMORY_ERROR;
+
 /**
  * Responsible for deciding whether to kill the JVM if it gets in an "unstable" state (think OOM).
  */
@@ -105,7 +107,7 @@ public final class JVMStabilityInspector
         boolean isUnstable = false;
         if (t instanceof OutOfMemoryError)
         {
-            if (Boolean.getBoolean("cassandra.printHeapHistogramOnOutOfMemoryError"))
+            if (PRINT_HEAP_HISTOGRAM_ON_OUT_OF_MEMORY_ERROR.getBoolean())
             {
                 // We want to avoid printing multiple time the heap histogram if multiple OOM errors happen in a short
                 // time span.
diff --git a/src/java/org/apache/cassandra/utils/MBeanWrapper.java b/src/java/org/apache/cassandra/utils/MBeanWrapper.java
index f8bc439d7b..f003e1a392 100644
--- a/src/java/org/apache/cassandra/utils/MBeanWrapper.java
+++ b/src/java/org/apache/cassandra/utils/MBeanWrapper.java
@@ -27,7 +27,7 @@ import javax.management.ObjectName;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.cassandra.config.CassandraRelevantProperties.IS_DISABLED_MBEAN_REGISTRATION;
+import static org.apache.cassandra.config.CassandraRelevantProperties.ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION;
 import static org.apache.cassandra.config.CassandraRelevantProperties.MBEAN_REGISTRATION_CLASS;
 
 /**
@@ -42,7 +42,7 @@ public interface MBeanWrapper
 
     static MBeanWrapper create()
     {
-        if (IS_DISABLED_MBEAN_REGISTRATION.getBoolean())
+        if (ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION.getBoolean())
             return new NoOpMBeanWrapper();
 
         String klass = MBEAN_REGISTRATION_CLASS.getString();
diff --git a/src/java/org/apache/cassandra/utils/MonotonicClock.java b/src/java/org/apache/cassandra/utils/MonotonicClock.java
index ad9ee81ca4..7be54c008b 100644
--- a/src/java/org/apache/cassandra/utils/MonotonicClock.java
+++ b/src/java/org/apache/cassandra/utils/MonotonicClock.java
@@ -27,11 +27,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.concurrent.ScheduledExecutors;
-import org.apache.cassandra.config.Config;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.APPROXIMATE_TIME_PRECISION_MS;
 import static org.apache.cassandra.config.CassandraRelevantProperties.CLOCK_MONOTONIC_APPROX;
 import static org.apache.cassandra.config.CassandraRelevantProperties.CLOCK_MONOTONIC_PRECISE;
+import static org.apache.cassandra.config.CassandraRelevantProperties.NANOTIMETOMILLIS_TIMESTAMP_UPDATE_INTERVAL;
 import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
 
@@ -139,8 +140,7 @@ public interface MonotonicClock
     static abstract class AbstractEpochSamplingClock implements MonotonicClock
     {
         private static final Logger logger = LoggerFactory.getLogger(AbstractEpochSamplingClock.class);
-        private static final String UPDATE_INTERVAL_PROPERTY = Config.PROPERTY_PREFIX + "NANOTIMETOMILLIS_TIMESTAMP_UPDATE_INTERVAL";
-        private static final long UPDATE_INTERVAL_MS = Long.getLong(UPDATE_INTERVAL_PROPERTY, 10000);
+        private static final long UPDATE_INTERVAL_MS = NANOTIMETOMILLIS_TIMESTAMP_UPDATE_INTERVAL.getLong();
 
         @VisibleForTesting
         public static class AlmostSameTime implements MonotonicClockTranslation
@@ -281,7 +281,7 @@ public interface MonotonicClock
     public static class SampledClock implements MonotonicClock
     {
         private static final Logger logger = LoggerFactory.getLogger(SampledClock.class);
-        private static final int UPDATE_INTERVAL_MS = Math.max(1, Integer.parseInt(System.getProperty(Config.PROPERTY_PREFIX + "approximate_time_precision_ms", "2")));
+        private static final int UPDATE_INTERVAL_MS = Math.max(1, APPROXIMATE_TIME_PRECISION_MS.getInt());
         private static final long ERROR_NANOS = MILLISECONDS.toNanos(UPDATE_INTERVAL_MS);
 
         private final MonotonicClock precise;
diff --git a/src/java/org/apache/cassandra/utils/SyncUtil.java b/src/java/org/apache/cassandra/utils/SyncUtil.java
index 081a5f1e16..1adc4fc657 100644
--- a/src/java/org/apache/cassandra/utils/SyncUtil.java
+++ b/src/java/org/apache/cassandra/utils/SyncUtil.java
@@ -27,9 +27,10 @@ import java.nio.channels.ClosedChannelException;
 import java.nio.channels.FileChannel;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.cassandra.config.Config;
-
 import com.google.common.base.Preconditions;
+
+import org.apache.cassandra.config.CassandraRelevantEnv;
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.utils.memory.MemoryUtil;
 
@@ -89,8 +90,8 @@ public class SyncUtil
         fdUseCountField = fdUseCountTemp;
 
         //If skipping syncing is requested by any means then skip them.
-        boolean skipSyncProperty = Boolean.getBoolean(Config.PROPERTY_PREFIX + "skip_sync");
-        boolean skipSyncEnv = Boolean.valueOf(System.getenv().getOrDefault("CASSANDRA_SKIP_SYNC", "false"));
+        boolean skipSyncProperty = CassandraRelevantProperties.TEST_CASSANDRA_SKIP_SYNC.getBoolean();
+        boolean skipSyncEnv = CassandraRelevantEnv.CASSANDRA_SKIP_SYNC.getBoolean();
         SKIP_SYNC = skipSyncProperty || skipSyncEnv;
         if (SKIP_SYNC)
         {
diff --git a/src/java/org/apache/cassandra/utils/TimeUUID.java b/src/java/org/apache/cassandra/utils/TimeUUID.java
index b944d843d4..d993f171af 100644
--- a/src/java/org/apache/cassandra/utils/TimeUUID.java
+++ b/src/java/org/apache/cassandra/utils/TimeUUID.java
@@ -53,6 +53,7 @@ import org.apache.cassandra.serializers.MarshalException;
 import org.apache.cassandra.serializers.TypeSerializer;
 
 import static java.util.concurrent.TimeUnit.MICROSECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_UNSAFE_TIME_UUID_NODE;
 import static org.apache.cassandra.config.CassandraRelevantProperties.DETERMINISM_UNSAFE_UUID_NODE;
 import static org.apache.cassandra.utils.ByteBufferUtil.EMPTY_BYTE_BUFFER;
 import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
@@ -439,9 +440,8 @@ public class TimeUUID implements Serializable, Comparable<TimeUUID>
             if (DETERMINISM_UNSAFE_UUID_NODE.getBoolean())
                 return FBUtilities.getBroadcastAddressAndPort().addressBytes[3];
 
-            Long specified = Long.getLong("cassandra.unsafe.timeuuidnode");
-            if (specified != null)
-                return specified
+            if (CASSANDRA_UNSAFE_TIME_UUID_NODE.isPresent())
+                return CASSANDRA_UNSAFE_TIME_UUID_NODE.getLong()
                        ^ FBUtilities.getBroadcastAddressAndPort().addressBytes[3]
                        ^ (FBUtilities.getBroadcastAddressAndPort().addressBytes[2] << 8);
 
diff --git a/src/java/org/apache/cassandra/utils/binlog/BinLog.java b/src/java/org/apache/cassandra/utils/binlog/BinLog.java
index ee8ce55ad6..8b0e025700 100644
--- a/src/java/org/apache/cassandra/utils/binlog/BinLog.java
+++ b/src/java/org/apache/cassandra/utils/binlog/BinLog.java
@@ -53,6 +53,7 @@ import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 import org.apache.cassandra.utils.concurrent.WeightedQueue;
 
 import static java.lang.String.format;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CHRONICLE_ANNOUNCER_DISABLE;
 
 /**
  * Bin log is a is quick and dirty binary log that is kind of a NIH version of binary logging with a traditional logging
@@ -81,7 +82,7 @@ public class BinLog implements Runnable
     {
         // Avoid the chronicle announcement which is commercial advertisement, and debug info we already print at startup
         // https://github.com/OpenHFT/Chronicle-Core/blob/chronicle-core-2.23.36/src/main/java/net/openhft/chronicle/core/announcer/Announcer.java#L32-L33
-        System.setProperty("chronicle.announcer.disable", "true");
+        CHRONICLE_ANNOUNCER_DISABLE.setBoolean(true);
     }
 
     private ChronicleQueue queue;
diff --git a/src/java/org/apache/cassandra/utils/btree/BTree.java b/src/java/org/apache/cassandra/utils/btree/BTree.java
index a629a5f869..2d8fefb5f2 100644
--- a/src/java/org/apache/cassandra/utils/btree/BTree.java
+++ b/src/java/org/apache/cassandra/utils/btree/BTree.java
@@ -37,6 +37,7 @@ import org.apache.cassandra.utils.caching.TinyThreadLocalPool;
 
 import static java.lang.Math.max;
 import static java.lang.Math.min;
+import static org.apache.cassandra.config.CassandraRelevantProperties.BTREE_BRANCH_SHIFT;
 
 public class BTree
 {
@@ -62,7 +63,7 @@ public class BTree
      * subtrees when modifying the tree, since the modified tree would need new parent references).
      * Instead, we store these references in a Path as needed when navigating the tree.
      */
-    public static final int BRANCH_SHIFT = Integer.getInteger("cassandra.btree.branchshift", 5);
+    public static final int BRANCH_SHIFT = BTREE_BRANCH_SHIFT.getInt();
 
     private static final int BRANCH_FACTOR = 1 << BRANCH_SHIFT;
     public static final int MIN_KEYS = BRANCH_FACTOR / 2 - 1;
diff --git a/src/java/org/apache/cassandra/utils/concurrent/Ref.java b/src/java/org/apache/cassandra/utils/concurrent/Ref.java
index 90650cf49d..1e27dc79c2 100644
--- a/src/java/org/apache/cassandra/utils/concurrent/Ref.java
+++ b/src/java/org/apache/cassandra/utils/concurrent/Ref.java
@@ -55,6 +55,7 @@ import static java.util.Collections.emptyList;
 
 import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 import static org.apache.cassandra.concurrent.InfiniteLoopExecutor.SimulatorSafe.UNSAFE;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_DEBUG_REF_COUNT;
 import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
 import static org.apache.cassandra.utils.Throwables.maybeFail;
 import static org.apache.cassandra.utils.Throwables.merge;
@@ -93,7 +94,7 @@ import static org.apache.cassandra.utils.Throwables.merge;
 public final class Ref<T> implements RefCounted<T>
 {
     static final Logger logger = LoggerFactory.getLogger(Ref.class);
-    public static final boolean DEBUG_ENABLED = System.getProperty("cassandra.debugrefcount", "false").equalsIgnoreCase("true");
+    public static final boolean DEBUG_ENABLED = TEST_DEBUG_REF_COUNT.getBoolean();
     static OnLeak ON_LEAK;
 
     @Shared(scope = SIMULATION)
diff --git a/test/burn/org/apache/cassandra/utils/LongBTreeTest.java b/test/burn/org/apache/cassandra/utils/LongBTreeTest.java
index c9507f5873..9aa13f9467 100644
--- a/test/burn/org/apache/cassandra/utils/LongBTreeTest.java
+++ b/test/burn/org/apache/cassandra/utils/LongBTreeTest.java
@@ -52,6 +52,7 @@ import static com.google.common.collect.Iterables.filter;
 import static com.google.common.collect.Iterables.transform;
 import static java.util.Comparator.naturalOrder;
 import static java.util.Comparator.reverseOrder;
+import static org.apache.cassandra.config.CassandraRelevantProperties.BTREE_FAN_FACTOR;
 import static org.apache.cassandra.utils.btree.BTree.iterable;
 import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 import static org.junit.Assert.assertEquals;
@@ -1135,7 +1136,7 @@ public class LongBTreeTest
         for (String arg : args)
         {
             if (arg.startsWith("fan="))
-                System.setProperty("cassandra.btree.fanfactor", arg.substring(4));
+                BTREE_FAN_FACTOR.setString(arg.substring(4));
             else if (arg.startsWith("min="))
                 minTreeSize = Integer.parseInt(arg.substring(4));
             else if (arg.startsWith("max="))
diff --git a/test/distributed/org/apache/cassandra/distributed/action/GossipHelper.java b/test/distributed/org/apache/cassandra/distributed/action/GossipHelper.java
index 5b23b8654e..b3acccaa2d 100644
--- a/test/distributed/org/apache/cassandra/distributed/action/GossipHelper.java
+++ b/test/distributed/org/apache/cassandra/distributed/action/GossipHelper.java
@@ -32,6 +32,7 @@ import java.util.UUID;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.distributed.api.IInstance;
@@ -467,25 +468,24 @@ public class GossipHelper
         return netVersion;
     }
 
-    public static void withProperty(String prop, boolean value, Runnable r)
+    public static void withProperty(CassandraRelevantProperties prop, boolean value, Runnable r)
     {
         withProperty(prop, Boolean.toString(value), r);
     }
 
-    public static void withProperty(String prop, String value, Runnable r)
+    public static void withProperty(CassandraRelevantProperties prop, String value, Runnable r)
     {
-        String before = System.getProperty(prop);
+        String prev = prop.setString(value);
         try
         {
-            System.setProperty(prop, value);
             r.run();
         }
         finally
         {
-            if (before == null)
-                System.clearProperty(prop);
+            if (prev == null)
+                prop.clearValue();
             else
-                System.setProperty(prop, before);
+                prop.setString(prev);
         }
     }
 }
diff --git a/test/distributed/org/apache/cassandra/distributed/fuzz/HarryHelper.java b/test/distributed/org/apache/cassandra/distributed/fuzz/HarryHelper.java
index 2997fa654a..66178f230d 100644
--- a/test/distributed/org/apache/cassandra/distributed/fuzz/HarryHelper.java
+++ b/test/distributed/org/apache/cassandra/distributed/fuzz/HarryHelper.java
@@ -26,19 +26,28 @@ import harry.model.OpSelectors;
 import harry.model.clock.OffsetClock;
 import harry.model.sut.PrintlnSut;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_ALLOW_SIMPLE_STRATEGY;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_MINIMUM_REPLICATION_FACTOR;
+import static org.apache.cassandra.config.CassandraRelevantProperties.DISABLE_TCACTIVE_OPENSSL;
+import static org.apache.cassandra.config.CassandraRelevantProperties.LOG4J2_DISABLE_JMX;
+import static org.apache.cassandra.config.CassandraRelevantProperties.LOG4J2_DISABLE_JMX_LEGACY;
+import static org.apache.cassandra.config.CassandraRelevantProperties.LOG4J_SHUTDOWN_HOOK_ENABLED;
+import static org.apache.cassandra.config.CassandraRelevantProperties.ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION;
+import static org.apache.cassandra.config.CassandraRelevantProperties.RELOCATED_SHADED_IO_NETTY_TRANSPORT_NONATIVE;
+
 public class HarryHelper
 {
     public static void init()
     {
-        System.setProperty("log4j2.disableJmx", "true"); // setting both ways as changes between versions
-        System.setProperty("log4j2.disable.jmx", "true");
-        System.setProperty("log4j.shutdownHookEnabled", "false");
-        System.setProperty("cassandra.allow_simplestrategy", "true"); // makes easier to share OSS tests without RF limits
-        System.setProperty("cassandra.minimum_replication_factor", "0"); // makes easier to share OSS tests without RF limits
-
-        System.setProperty("cassandra.disable_tcactive_openssl", "true");
-        System.setProperty("relocated.shaded.io.netty.transport.noNative", "true");
-        System.setProperty("org.apache.cassandra.disable_mbean_registration", "true");
+        // setting both ways as changes between versions
+        LOG4J2_DISABLE_JMX.setBoolean(true);
+        LOG4J2_DISABLE_JMX_LEGACY.setBoolean(true);
+        LOG4J_SHUTDOWN_HOOK_ENABLED.setBoolean(false);
+        CASSANDRA_ALLOW_SIMPLE_STRATEGY.setBoolean(true); // makes easier to share OSS tests without RF limits
+        CASSANDRA_MINIMUM_REPLICATION_FACTOR.setInt(0); // makes easier to share OSS tests without RF limits
+        DISABLE_TCACTIVE_OPENSSL.setBoolean(true);
+        RELOCATED_SHADED_IO_NETTY_TRANSPORT_NONATIVE.setBoolean(true);
+        ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION.setBoolean(true);
 
         InJvmSut.init();
         QueryingNoOpChecker.init();
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/AbstractCluster.java b/test/distributed/org/apache/cassandra/distributed/impl/AbstractCluster.java
index 8e6a9bdef7..78b14d2c56 100644
--- a/test/distributed/org/apache/cassandra/distributed/impl/AbstractCluster.java
+++ b/test/distributed/org/apache/cassandra/distributed/impl/AbstractCluster.java
@@ -187,7 +187,7 @@ public abstract class AbstractCluster<I extends IInstance> implements ICluster<I
 
         {
             // those properties may be set for unit-test optimizations; those should not be used when running dtests
-            CassandraRelevantProperties.FLUSH_LOCAL_SCHEMA_CHANGES.reset();
+            CassandraRelevantProperties.TEST_FLUSH_LOCAL_SCHEMA_CHANGES.reset();
             CassandraRelevantProperties.NON_GRACEFUL_SHUTDOWN.reset();
         }
 
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/Instance.java b/test/distributed/org/apache/cassandra/distributed/impl/Instance.java
index 296695cf26..435de65d7a 100644
--- a/test/distributed/org/apache/cassandra/distributed/impl/Instance.java
+++ b/test/distributed/org/apache/cassandra/distributed/impl/Instance.java
@@ -153,6 +153,11 @@ import org.apache.cassandra.utils.progress.jmx.JMXBroadcastExecutor;
 
 import static java.util.concurrent.TimeUnit.MINUTES;
 import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CONSISTENT_RANGE_MOVEMENT;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CONSISTENT_SIMULTANEOUS_MOVES_ALLOW;
+import static org.apache.cassandra.config.CassandraRelevantProperties.RING_DELAY;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_CASSANDRA_SUITENAME;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_CASSANDRA_TESTTAG;
 import static org.apache.cassandra.distributed.api.Feature.BLANK_GOSSIP;
 import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
 import static org.apache.cassandra.distributed.api.Feature.NATIVE_PROTOCOL;
@@ -218,8 +223,8 @@ public class Instance extends IsolatedExecutor implements IInvokableInstance
     {
         // the path used is defined by test/conf/logback-dtest.xml and looks like the following
         // ./build/test/logs/${cassandra.testtag}/${suitename}/${cluster_id}/${instance_id}/system.log
-        String tag = System.getProperty("cassandra.testtag", "cassandra.testtag_IS_UNDEFINED");
-        String suite = System.getProperty("suitename", "suitename_IS_UNDEFINED");
+        String tag = TEST_CASSANDRA_TESTTAG.getString();
+        String suite = TEST_CASSANDRA_SUITENAME.getString();
         String clusterId = ClusterIDDefiner.getId();
         String instanceId = InstanceIDDefiner.getInstanceId();
         File f = new File(FileSystems.getDefault(), String.format("build/test/logs/%s/%s/%s/%s/system.log", tag, suite, clusterId, instanceId));
@@ -587,9 +592,9 @@ public class Instance extends IsolatedExecutor implements IInvokableInstance
                 if (config.has(GOSSIP))
                 {
                     // TODO: hacky
-                    System.setProperty("cassandra.ring_delay_ms", "15000");
-                    System.setProperty("cassandra.consistent.rangemovement", "false");
-                    System.setProperty("cassandra.consistent.simultaneousmoves.allow", "true");
+                    RING_DELAY.setLong(15000);
+                    CONSISTENT_RANGE_MOVEMENT.setBoolean(false);
+                    CONSISTENT_SIMULTANEOUS_MOVES_ALLOW.setBoolean(true);
                 }
 
                 mkdirs();
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/TracingUtil.java b/test/distributed/org/apache/cassandra/distributed/impl/TracingUtil.java
index 06fdabb419..9c347e07a2 100644
--- a/test/distributed/org/apache/cassandra/distributed/impl/TracingUtil.java
+++ b/test/distributed/org/apache/cassandra/distributed/impl/TracingUtil.java
@@ -27,7 +27,6 @@ import java.util.UUID;
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.utils.TimeUUID;
 
-
 /**
  * Utilities for accessing the system_traces table from in-JVM dtests
  */
@@ -104,14 +103,4 @@ public class TracingUtil
         }
         return traces;
     }
-
-    // Set up the wait for tracing time system property, returning the previous value.
-    // Handles being called again to reset with the original value, replacing the null
-    // with the default value.
-    public static String setWaitForTracingEventTimeoutSecs(String timeoutInSeconds)
-    {
-        return System.setProperty("cassandra.wait_for_tracing_events_timeout_secs",
-                                  timeoutInSeconds == null ? "0" : timeoutInSeconds);
-
-    }
 }
diff --git a/test/distributed/org/apache/cassandra/distributed/shared/Byteman.java b/test/distributed/org/apache/cassandra/distributed/shared/Byteman.java
index b4dd10c3f4..c5c76e3ea2 100644
--- a/test/distributed/org/apache/cassandra/distributed/shared/Byteman.java
+++ b/test/distributed/org/apache/cassandra/distributed/shared/Byteman.java
@@ -47,11 +47,13 @@ import org.slf4j.LoggerFactory;
 
 import org.jboss.byteman.agent.Transformer;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_BYTEMAN_TRANSFORMATIONS_DEBUG;
+
 public final class Byteman
 {
     private static final Logger logger = LoggerFactory.getLogger(Byteman.class);
 
-    private static final boolean DEBUG_TRANSFORMATIONS = Boolean.getBoolean("cassandra.test.byteman.transformations.debug");
+    private static final boolean DEBUG_TRANSFORMATIONS = TEST_BYTEMAN_TRANSFORMATIONS_DEBUG.getBoolean();
     private static final Method METHOD;
     private static final URL BYTEMAN;
 
diff --git a/test/distributed/org/apache/cassandra/distributed/shared/ClusterUtils.java b/test/distributed/org/apache/cassandra/distributed/shared/ClusterUtils.java
index c046a8a48d..c3138217e8 100644
--- a/test/distributed/org/apache/cassandra/distributed/shared/ClusterUtils.java
+++ b/test/distributed/org/apache/cassandra/distributed/shared/ClusterUtils.java
@@ -63,6 +63,9 @@ import org.apache.cassandra.utils.Isolated;
 
 import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly;
 import static org.apache.cassandra.config.CassandraRelevantProperties.BOOTSTRAP_SCHEMA_DELAY_MS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.BROADCAST_INTERVAL_MS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.REPLACE_ADDRESS_FIRST_BOOT;
+import static org.apache.cassandra.config.CassandraRelevantProperties.RING_DELAY;
 import static org.assertj.core.api.Assertions.assertThat;
 
 /**
@@ -255,13 +258,13 @@ public class ClusterUtils
 
         return start(inst, properties -> {
             // lower this so the replacement waits less time
-            properties.setProperty("cassandra.broadcast_interval_ms", Long.toString(TimeUnit.SECONDS.toMillis(30)));
+            properties.set(BROADCAST_INTERVAL_MS, Long.toString(TimeUnit.SECONDS.toMillis(30)));
             // default is 30s, lowering as it should be faster
-            properties.setProperty("cassandra.ring_delay_ms", Long.toString(TimeUnit.SECONDS.toMillis(10)));
+            properties.set(RING_DELAY, Long.toString(TimeUnit.SECONDS.toMillis(10)));
             properties.set(BOOTSTRAP_SCHEMA_DELAY_MS, TimeUnit.SECONDS.toMillis(10));
 
             // state which node to replace
-            properties.setProperty("cassandra.replace_address_first_boot", toReplace.config().broadcastAddress().getAddress().getHostAddress());
+            properties.set(REPLACE_ADDRESS_FIRST_BOOT, toReplace.config().broadcastAddress().getAddress().getHostAddress());
 
             fn.accept(inst, properties);
         });
diff --git a/test/distributed/org/apache/cassandra/distributed/shared/WithProperties.java b/test/distributed/org/apache/cassandra/distributed/shared/WithProperties.java
index 88987c2393..d17d3e6f3a 100644
--- a/test/distributed/org/apache/cassandra/distributed/shared/WithProperties.java
+++ b/test/distributed/org/apache/cassandra/distributed/shared/WithProperties.java
@@ -23,92 +23,73 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Supplier;
 
 import com.google.common.base.Joiner;
 
 import org.apache.cassandra.config.CassandraRelevantProperties;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.convertToString;
+
 public final class WithProperties implements AutoCloseable
 {
-    private final List<Property> properties = new ArrayList<>();
+    private final List<Runnable> rollback = new ArrayList<>();
 
     public WithProperties()
     {
     }
 
-    public WithProperties(String... kvs)
-    {
-        with(kvs);
-    }
-
-    public void with(String... kvs)
+    public WithProperties with(String... kvs)
     {
         assert kvs.length % 2 == 0 : "Input must have an even amount of inputs but given " + kvs.length;
         for (int i = 0; i <= kvs.length - 2; i = i + 2)
-        {
             with(kvs[i], kvs[i + 1]);
-        }
+        return this;
     }
 
-    public void setProperty(String key, String value)
+    public WithProperties set(CassandraRelevantProperties prop, String value)
     {
-        with(key, value);
+        return set(prop, () -> prop.setString(value));
     }
 
-    public void set(CassandraRelevantProperties prop, String value)
+    public WithProperties set(CassandraRelevantProperties prop, String... values)
     {
-        with(prop.getKey(), value);
+        return set(prop, Arrays.asList(values));
     }
 
-    public void set(CassandraRelevantProperties prop, String... values)
+    public WithProperties set(CassandraRelevantProperties prop, Collection<String> values)
     {
-        set(prop, Arrays.asList(values));
+        return set(prop, Joiner.on(",").join(values));
     }
 
-    public void set(CassandraRelevantProperties prop, Collection<String> values)
+    public WithProperties set(CassandraRelevantProperties prop, boolean value)
     {
-        set(prop, Joiner.on(",").join(values));
+        return set(prop, () -> prop.setBoolean(value));
     }
 
-    public void set(CassandraRelevantProperties prop, boolean value)
+    public WithProperties set(CassandraRelevantProperties prop, long value)
     {
-        set(prop, Boolean.toString(value));
+        return set(prop, () -> prop.setLong(value));
     }
 
-    public void set(CassandraRelevantProperties prop, long value)
+    private void with(String key, String value)
     {
-        set(prop, Long.toString(value));
+        String previous = System.setProperty(key, value); // checkstyle: suppress nearby 'blockSystemPropertyUsage'
+        rollback.add(previous == null ? () -> System.clearProperty(key) : () -> System.setProperty(key, previous)); // checkstyle: suppress nearby 'blockSystemPropertyUsage'
     }
 
-    public void with(String key, String value)
+    private WithProperties set(CassandraRelevantProperties prop, Supplier<Object> prev)
     {
-        String previous = System.setProperty(key, value);
-        properties.add(new Property(key, previous));
+        String previous = convertToString(prev.get());
+        rollback.add(previous == null ? prop::clearValue : () -> prop.setString(previous));
+        return this;
     }
 
-
     @Override
     public void close()
     {
-        Collections.reverse(properties);
-        properties.forEach(s -> {
-            if (s.value == null)
-                System.getProperties().remove(s.key);
-            else
-                System.setProperty(s.key, s.value);
-        });
-        properties.clear();
-    }
-
-    private static final class Property
-    {
-        private final String key;
-        private final String value;
-
-        private Property(String key, String value)
-        {
-            this.key = key;
-            this.value = value;
-        }
+        Collections.reverse(rollback);
+        rollback.forEach(Runnable::run);
+        rollback.clear();
     }
 }
diff --git a/test/distributed/org/apache/cassandra/distributed/test/AlterTest.java b/test/distributed/org/apache/cassandra/distributed/test/AlterTest.java
index 907ba5e218..bc7159b928 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/AlterTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/AlterTest.java
@@ -41,6 +41,7 @@ import org.apache.cassandra.distributed.shared.ClusterUtils;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.Throwables;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.JOIN_RING;
 import static org.apache.cassandra.distributed.action.GossipHelper.withProperty;
 import static org.apache.cassandra.distributed.api.ConsistencyLevel.ONE;
 import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
@@ -98,7 +99,7 @@ public class AlterTest extends TestBaseImpl
         {
             IInstanceConfig config = cluster.newInstanceConfig();
             IInvokableInstance gossippingOnlyMember = cluster.bootstrap(config);
-            withProperty("cassandra.join_ring", Boolean.toString(false), () -> gossippingOnlyMember.startup(cluster));
+            withProperty(JOIN_RING, false, () -> gossippingOnlyMember.startup(cluster));
 
             int attempts = 0;
             // it takes some time the underlying structure is populated otherwise the test is flaky
diff --git a/test/distributed/org/apache/cassandra/distributed/test/BootstrapBinaryDisabledTest.java b/test/distributed/org/apache/cassandra/distributed/test/BootstrapBinaryDisabledTest.java
index 60bc60c9c4..1706c13b4f 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/BootstrapBinaryDisabledTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/BootstrapBinaryDisabledTest.java
@@ -41,20 +41,21 @@ import org.apache.cassandra.distributed.shared.NetworkTopology;
 import org.apache.cassandra.utils.Shared;
 
 import static org.apache.cassandra.config.CassandraRelevantProperties.RESET_BOOTSTRAP_PROGRESS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.RING_DELAY;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_WRITE_SURVEY;
 
 /**
  * Replaces python dtest bootstrap_test.py::TestBootstrap::test_bootstrap_binary_disabled
  */
 public class BootstrapBinaryDisabledTest extends TestBaseImpl
 {
-    static String originalResetBootstrapProgress = null;
+    static Boolean originalResetBootstrapProgress = null;
 
     @BeforeClass
     public static void beforeClass() throws Throwable
     {
         TestBaseImpl.beforeClass();
-        originalResetBootstrapProgress = RESET_BOOTSTRAP_PROGRESS.getString();
-        RESET_BOOTSTRAP_PROGRESS.setBoolean(false);
+        originalResetBootstrapProgress = RESET_BOOTSTRAP_PROGRESS.setBoolean(false);
     }
 
     @AfterClass
@@ -63,7 +64,7 @@ public class BootstrapBinaryDisabledTest extends TestBaseImpl
         if (originalResetBootstrapProgress == null)
             RESET_BOOTSTRAP_PROGRESS.clearValue();
         else
-            RESET_BOOTSTRAP_PROGRESS.setString(originalResetBootstrapProgress);
+            RESET_BOOTSTRAP_PROGRESS.setBoolean(originalResetBootstrapProgress);
     }
 
     @Test
@@ -115,9 +116,9 @@ public class BootstrapBinaryDisabledTest extends TestBaseImpl
         config.forEach(nodeConfig::set);
 
         //TODO can we make this more isolated?
-        System.setProperty("cassandra.ring_delay_ms", "5000");
+        RING_DELAY.setLong(5000);
         if (isWriteSurvey)
-            System.setProperty("cassandra.write_survey", "true");
+            TEST_WRITE_SURVEY.setBoolean(true);
 
         RewriteEnabled.enable();
         cluster.bootstrap(nodeConfig).startup();
diff --git a/test/distributed/org/apache/cassandra/distributed/test/CASContentionTest.java b/test/distributed/org/apache/cassandra/distributed/test/CASContentionTest.java
index aafbc45277..60e8db0cb1 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/CASContentionTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/CASContentionTest.java
@@ -35,6 +35,7 @@ import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.PAXOS_USE_SELF_EXECUTION;
 import static org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM;
 import static org.apache.cassandra.net.Verb.PAXOS2_PREPARE_REQ;
 
@@ -45,7 +46,7 @@ public class CASContentionTest extends CASTestBase
     @BeforeClass
     public static void beforeClass() throws Throwable
     {
-        System.setProperty("cassandra.paxos.use_self_execution", "false");
+        PAXOS_USE_SELF_EXECUTION.setBoolean(false);
         TestBaseImpl.beforeClass();
         Consumer<IInstanceConfig> conf = config -> config
                 .set("paxos_variant", "v2")
diff --git a/test/distributed/org/apache/cassandra/distributed/test/CASTest.java b/test/distributed/org/apache/cassandra/distributed/test/CASTest.java
index 8e2b8ac901..dc792564ff 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/CASTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/CASTest.java
@@ -39,6 +39,7 @@ import org.apache.cassandra.exceptions.CasWriteTimeoutException;
 
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.PAXOS_USE_SELF_EXECUTION;
 import static org.apache.cassandra.distributed.api.ConsistencyLevel.ANY;
 import static org.apache.cassandra.distributed.api.ConsistencyLevel.ONE;
 import static org.apache.cassandra.distributed.api.ConsistencyLevel.LOCAL_QUORUM;
@@ -76,7 +77,7 @@ public class CASTest extends CASCommonTestCases
     @BeforeClass
     public static void beforeClass() throws Throwable
     {
-        System.setProperty("cassandra.paxos.use_self_execution", "false");
+        PAXOS_USE_SELF_EXECUTION.setBoolean(false);
         TestBaseImpl.beforeClass();
         Consumer<IInstanceConfig> conf = config -> config
                                                    .set("paxos_variant", "v2")
diff --git a/test/distributed/org/apache/cassandra/distributed/test/DataResurrectionCheckTest.java b/test/distributed/org/apache/cassandra/distributed/test/DataResurrectionCheckTest.java
index 1b297da46f..b1a3d208f5 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/DataResurrectionCheckTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/DataResurrectionCheckTest.java
@@ -25,7 +25,6 @@ import java.util.concurrent.atomic.AtomicReference;
 
 import org.junit.Test;
 
-import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.config.StartupChecksOptions;
 import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.distributed.api.IInvokableInstance;
@@ -40,6 +39,7 @@ import org.apache.cassandra.utils.Clock.Global;
 import static java.lang.String.format;
 import static java.util.concurrent.TimeUnit.MINUTES;
 import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CHECK_DATA_RESURRECTION_HEARTBEAT_PERIOD;
 import static org.apache.cassandra.config.StartupChecksOptions.ENABLED_PROPERTY;
 import static org.apache.cassandra.distributed.Cluster.build;
 import static org.apache.cassandra.distributed.api.Feature.NATIVE_PROTOCOL;
@@ -62,7 +62,7 @@ public class DataResurrectionCheckTest extends TestBaseImpl
         try
         {
             // set it to 1 hour so check will be not updated after it is written, for test purposes
-            System.setProperty(CassandraRelevantProperties.CHECK_DATA_RESURRECTION_HEARTBEAT_PERIOD.getKey(), "3600000");
+            CHECK_DATA_RESURRECTION_HEARTBEAT_PERIOD.setInt(3600000);
 
             // start the node with the check enabled, it will just pass fine as there are not any user tables yet
             // and system tables are young enough
@@ -131,7 +131,7 @@ public class DataResurrectionCheckTest extends TestBaseImpl
         }
         finally
         {
-            System.clearProperty(CassandraRelevantProperties.CHECK_DATA_RESURRECTION_HEARTBEAT_PERIOD.getKey());
+            CHECK_DATA_RESURRECTION_HEARTBEAT_PERIOD.clearValue();
         }
     }
 
diff --git a/test/distributed/org/apache/cassandra/distributed/test/FailingResponseDoesNotLogTest.java b/test/distributed/org/apache/cassandra/distributed/test/FailingResponseDoesNotLogTest.java
index 1071938a5e..8a710241bd 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/FailingResponseDoesNotLogTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/FailingResponseDoesNotLogTest.java
@@ -49,6 +49,8 @@ import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.cassandra.utils.MD5Digest;
 import org.assertj.core.api.Assertions;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CUSTOM_QUERY_HANDLER_CLASS;
+
 /**
  * This class is rather impelemntation specific.  It is possible that changes made will cause this tests to fail,
  * so updating to the latest logic is fine.
@@ -68,7 +70,7 @@ public class FailingResponseDoesNotLogTest extends TestBaseImpl
     @Test
     public void dispatcherErrorDoesNotLock() throws IOException
     {
-        System.setProperty("cassandra.custom_query_handler_class", AlwaysRejectErrorQueryHandler.class.getName());
+        CUSTOM_QUERY_HANDLER_CLASS.setString(AlwaysRejectErrorQueryHandler.class.getName());
         try (Cluster cluster = Cluster.build(1)
                                       .withConfig(c -> c.with(Feature.NATIVE_PROTOCOL, Feature.GOSSIP)
                                                         .set("client_error_reporting_exclusions", ImmutableMap.of("subnets", Collections.singletonList("127.0.0.1")))
@@ -94,7 +96,7 @@ public class FailingResponseDoesNotLogTest extends TestBaseImpl
         }
         finally
         {
-            System.clearProperty("cassandra.custom_query_handler_class");
+            CUSTOM_QUERY_HANDLER_CLASS.clearValue();
         }
     }
 
diff --git a/test/distributed/org/apache/cassandra/distributed/test/FailingTruncationTest.java b/test/distributed/org/apache/cassandra/distributed/test/FailingTruncationTest.java
index dd419dbf2b..9ce2bf339d 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/FailingTruncationTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/FailingTruncationTest.java
@@ -30,13 +30,12 @@ import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
 
 import static net.bytebuddy.matcher.ElementMatchers.named;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_BBFAILHELPER_ENABLED;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 public class FailingTruncationTest extends TestBaseImpl
 {
-    private static final String BB_FAIL_HELPER_PROP = "test.bbfailhelper.enabled";
-
     @Test
     public void testFailingTruncation() throws IOException
     {
@@ -45,7 +44,7 @@ public class FailingTruncationTest extends TestBaseImpl
                                            .start()))
         {
             cluster.setUncaughtExceptionsFilter(t -> "truncateBlocking".equals(t.getMessage()));
-            System.setProperty(BB_FAIL_HELPER_PROP, "true");
+            TEST_BBFAILHELPER_ENABLED.setBoolean(true);
             cluster.schemaChange("create table " + KEYSPACE + ".tbl (id int primary key, t int)");
             try
             {
@@ -76,7 +75,7 @@ public class FailingTruncationTest extends TestBaseImpl
 
         public static void truncateBlocking()
         {
-            if (Boolean.getBoolean(BB_FAIL_HELPER_PROP))
+            if (TEST_BBFAILHELPER_ENABLED.getBoolean())
                 throw new RuntimeException("truncateBlocking");
         }
     }
diff --git a/test/distributed/org/apache/cassandra/distributed/test/GossipTest.java b/test/distributed/org/apache/cassandra/distributed/test/GossipTest.java
index c5f2a07e13..39054118aa 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/GossipTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/GossipTest.java
@@ -51,6 +51,7 @@ import org.assertj.core.api.Assertions;
 
 import static net.bytebuddy.matcher.ElementMatchers.named;
 import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
+import static org.apache.cassandra.config.CassandraRelevantProperties.JOIN_RING;
 import static org.apache.cassandra.distributed.action.GossipHelper.withProperty;
 import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
 import static org.apache.cassandra.distributed.api.Feature.NETWORK;
@@ -299,7 +300,7 @@ public class GossipTest extends TestBaseImpl
         {
             IInstanceConfig config = cluster.newInstanceConfig();
             IInvokableInstance gossippingOnlyMember = cluster.bootstrap(config);
-            withProperty("cassandra.join_ring", Boolean.toString(false), () -> gossippingOnlyMember.startup(cluster));
+            withProperty(JOIN_RING, false, () -> gossippingOnlyMember.startup(cluster));
 
             assertTrue(gossippingOnlyMember.callOnInstance((IIsolatedExecutor.SerializableCallable<Boolean>)
                                                            () -> StorageService.instance.isGossipRunning()));
diff --git a/test/distributed/org/apache/cassandra/distributed/test/IPMembershipTest.java b/test/distributed/org/apache/cassandra/distributed/test/IPMembershipTest.java
index b9d770f68a..16a97b005b 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/IPMembershipTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/IPMembershipTest.java
@@ -36,6 +36,7 @@ import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.tools.ToolRunner;
 import org.assertj.core.api.Assertions;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.REPLACE_ADDRESS;
 import static org.apache.cassandra.distributed.shared.ClusterUtils.assertRingIs;
 import static org.apache.cassandra.distributed.shared.ClusterUtils.getDirectories;
 import static org.apache.cassandra.distributed.shared.ClusterUtils.stopUnchecked;
@@ -69,7 +70,8 @@ public class IPMembershipTest extends TestBaseImpl
                 ((InstanceConfig) nodeToReplace.config()).setHostId(UUID.randomUUID());
 
                 Assertions.assertThatThrownBy(() -> nodeToReplace.startup())
-                          .hasMessage("A node with address /127.0.0.3:7012 already exists, cancelling join. Use cassandra.replace_address if you want to replace this node.");
+                          .hasMessage("A node with address /127.0.0.3:7012 already exists, cancelling join. Use " +
+                                      REPLACE_ADDRESS.getKey() + " if you want to replace this node.");
             }
         }
     }
diff --git a/test/distributed/org/apache/cassandra/distributed/test/MessageForwardingTest.java b/test/distributed/org/apache/cassandra/distributed/test/MessageForwardingTest.java
index a4dd8e6442..7969c77c24 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/MessageForwardingTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/MessageForwardingTest.java
@@ -41,6 +41,7 @@ import org.apache.cassandra.distributed.impl.IsolatedExecutor;
 import org.apache.cassandra.distributed.impl.TracingUtil;
 import org.apache.cassandra.utils.TimeUUID;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.WAIT_FOR_TRACING_EVENTS_TIMEOUT_SECS;
 import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 public class MessageForwardingTest extends TestBaseImpl
@@ -48,7 +49,10 @@ public class MessageForwardingTest extends TestBaseImpl
     @Test
     public void mutationsForwardedToAllReplicasTest()
     {
-        String originalTraceTimeout = TracingUtil.setWaitForTracingEventTimeoutSecs("1");
+        // Set up the wait for tracing time system property, returning the previous value.
+        // Handles being called again to reset with the original value, replacing the null
+        // with the default value.
+        Integer originalTraceTimeout = WAIT_FOR_TRACING_EVENTS_TIMEOUT_SECS.setInt(1);
         final int numInserts = 100;
         Map<InetAddress, Integer> forwardFromCounts = new HashMap<>();
         Map<InetAddress, Integer> commitCounts = new HashMap<>();
@@ -117,7 +121,10 @@ public class MessageForwardingTest extends TestBaseImpl
         }
         finally
         {
-            TracingUtil.setWaitForTracingEventTimeoutSecs(originalTraceTimeout);
+            if (originalTraceTimeout == null)
+                WAIT_FOR_TRACING_EVENTS_TIMEOUT_SECS.clearValue();
+            else
+                WAIT_FOR_TRACING_EVENTS_TIMEOUT_SECS.setInt(originalTraceTimeout);
         }
     }
 }
diff --git a/test/distributed/org/apache/cassandra/distributed/test/MigrationCoordinatorTest.java b/test/distributed/org/apache/cassandra/distributed/test/MigrationCoordinatorTest.java
index ca89b43d0c..9478c75b01 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/MigrationCoordinatorTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/MigrationCoordinatorTest.java
@@ -30,8 +30,10 @@ import org.apache.cassandra.distributed.api.TokenSupplier;
 import org.apache.cassandra.distributed.shared.NetworkTopology;
 import org.apache.cassandra.schema.Schema;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CONSISTENT_RANGE_MOVEMENT;
 import static org.apache.cassandra.config.CassandraRelevantProperties.IGNORED_SCHEMA_CHECK_ENDPOINTS;
 import static org.apache.cassandra.config.CassandraRelevantProperties.IGNORED_SCHEMA_CHECK_VERSIONS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.REPLACE_ADDRESS;
 import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
 import static org.apache.cassandra.distributed.api.Feature.NETWORK;
 
@@ -41,11 +43,9 @@ public class MigrationCoordinatorTest extends TestBaseImpl
     @Before
     public void setUp()
     {
-        System.clearProperty("cassandra.replace_address");
-        System.clearProperty("cassandra.consistent.rangemovement");
-
-        System.clearProperty(IGNORED_SCHEMA_CHECK_VERSIONS.getKey());
-        System.clearProperty(IGNORED_SCHEMA_CHECK_VERSIONS.getKey());
+        REPLACE_ADDRESS.clearValue();
+        CONSISTENT_RANGE_MOVEMENT.clearValue();
+        IGNORED_SCHEMA_CHECK_VERSIONS.clearValue();
     }
     /**
      * We shouldn't wait on versions only available from a node being replaced
@@ -67,7 +67,7 @@ public class MigrationCoordinatorTest extends TestBaseImpl
 
             IInstanceConfig config = cluster.newInstanceConfig();
             config.set("auto_bootstrap", true);
-            System.setProperty("cassandra.replace_address", replacementAddress.getHostAddress());
+            REPLACE_ADDRESS.setString(replacementAddress.getHostAddress());
             cluster.bootstrap(config).startup();
         }
     }
@@ -89,7 +89,7 @@ public class MigrationCoordinatorTest extends TestBaseImpl
             IInstanceConfig config = cluster.newInstanceConfig();
             config.set("auto_bootstrap", true);
             IGNORED_SCHEMA_CHECK_ENDPOINTS.setString(ignoredEndpoint.getHostAddress());
-            System.setProperty("cassandra.consistent.rangemovement", "false");
+            CONSISTENT_RANGE_MOVEMENT.setBoolean(false);
             cluster.bootstrap(config).startup();
         }
     }
@@ -116,7 +116,7 @@ public class MigrationCoordinatorTest extends TestBaseImpl
             IInstanceConfig config = cluster.newInstanceConfig();
             config.set("auto_bootstrap", true);
             IGNORED_SCHEMA_CHECK_VERSIONS.setString(initialVersion.toString() + ',' + oldVersion);
-            System.setProperty("cassandra.consistent.rangemovement", "false");
+            CONSISTENT_RANGE_MOVEMENT.setBoolean(false);
             cluster.bootstrap(config).startup();
         }
     }
diff --git a/test/distributed/org/apache/cassandra/distributed/test/MoveTest.java b/test/distributed/org/apache/cassandra/distributed/test/MoveTest.java
index fc1bca32d1..cdbe1cd59b 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/MoveTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/MoveTest.java
@@ -31,6 +31,7 @@ import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.distributed.api.NodeToolResult;
 import org.apache.cassandra.service.StorageService;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.RING_DELAY;
 import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
 import static org.apache.cassandra.distributed.api.Feature.NETWORK;
 
@@ -42,7 +43,7 @@ public class MoveTest extends TestBaseImpl
 
     static
     {
-        System.setProperty("cassandra.ring_delay_ms", "5000"); // down from 30s default
+        RING_DELAY.setLong(5000);
     }
 
     private void move(boolean forwards) throws Throwable
diff --git a/test/distributed/org/apache/cassandra/distributed/test/NativeMixedVersionTest.java b/test/distributed/org/apache/cassandra/distributed/test/NativeMixedVersionTest.java
index 26d0186504..bdabf55789 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/NativeMixedVersionTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/NativeMixedVersionTest.java
@@ -32,6 +32,8 @@ import org.apache.cassandra.distributed.api.Feature;
 import org.apache.cassandra.distributed.api.IInvokableInstance;
 import org.assertj.core.api.Assertions;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.IO_NETTY_EVENTLOOP_THREADS;
+
 public class NativeMixedVersionTest extends TestBaseImpl
 {
     @Test
@@ -39,7 +41,7 @@ public class NativeMixedVersionTest extends TestBaseImpl
     {
         // make sure to limit the netty thread pool to size 1, this will make the test determanistic as all work
         // will happen on the single thread.
-        System.setProperty("io.netty.eventLoopThreads", "1");
+        IO_NETTY_EVENTLOOP_THREADS.setInt(1);
         try (Cluster cluster = Cluster.build(1)
                                       .withConfig(c ->
                                                   c.with(Feature.values())
@@ -80,7 +82,7 @@ public class NativeMixedVersionTest extends TestBaseImpl
         }
         finally
         {
-            System.clearProperty("io.netty.eventLoopThreads");
+            IO_NETTY_EVENTLOOP_THREADS.clearValue();
         }
     }
 }
diff --git a/test/distributed/org/apache/cassandra/distributed/test/NativeProtocolTest.java b/test/distributed/org/apache/cassandra/distributed/test/NativeProtocolTest.java
index f965572d80..11ba9946cb 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/NativeProtocolTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/NativeProtocolTest.java
@@ -34,6 +34,7 @@ import com.datastax.driver.core.Statement;
 import org.apache.cassandra.distributed.api.ICluster;
 import org.apache.cassandra.distributed.impl.RowUtil;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.JOIN_RING;
 import static org.apache.cassandra.distributed.action.GossipHelper.withProperty;
 import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
 import static org.apache.cassandra.distributed.api.Feature.NATIVE_PROTOCOL;
@@ -103,7 +104,7 @@ public class NativeProtocolTest extends TestBaseImpl
         {
             IInstanceConfig config = cluster.newInstanceConfig();
             IInvokableInstance gossippingOnlyMember = cluster.bootstrap(config);
-            withProperty("cassandra.join_ring", Boolean.toString(false), () -> gossippingOnlyMember.startup(cluster));
+            withProperty(JOIN_RING, false, () -> gossippingOnlyMember.startup(cluster));
 
             assertTrue(gossippingOnlyMember.callOnInstance((IIsolatedExecutor.SerializableCallable<Boolean>)
                                                            () -> StorageService.instance.isNativeTransportRunning()));
diff --git a/test/distributed/org/apache/cassandra/distributed/test/PartitionDenylistTest.java b/test/distributed/org/apache/cassandra/distributed/test/PartitionDenylistTest.java
index 382981f903..d8e63784ed 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/PartitionDenylistTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/PartitionDenylistTest.java
@@ -34,6 +34,9 @@ import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.service.StorageProxy;
 import org.apache.cassandra.service.StorageService;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CONSISTENT_RANGE_MOVEMENT;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CONSISTENT_SIMULTANEOUS_MOVES_ALLOW;
+import static org.apache.cassandra.config.CassandraRelevantProperties.RING_DELAY;
 import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
 import static org.apache.cassandra.distributed.api.Feature.NETWORK;
 import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
@@ -58,9 +61,9 @@ public class PartitionDenylistTest extends TestBaseImpl
     public void checkStartupWithoutTriggeringUnavailable() throws IOException, InterruptedException, ExecutionException, TimeoutException
     {
         int nodeCount = 4;
-        System.setProperty("cassandra.ring_delay_ms", "5000"); // down from 30s default
-        System.setProperty("cassandra.consistent.rangemovement", "false");
-        System.setProperty("cassandra.consistent.simultaneousmoves.allow", "true");
+        RING_DELAY.setLong(5000); // down from 30s default
+        CONSISTENT_RANGE_MOVEMENT.setBoolean(false);
+        CONSISTENT_SIMULTANEOUS_MOVES_ALLOW.setBoolean(true);
         try (Cluster cluster = Cluster.build(nodeCount)
                                       .withConfig(config -> config
                                       .with(NETWORK)
diff --git a/test/distributed/org/apache/cassandra/distributed/test/PaxosRepair2Test.java b/test/distributed/org/apache/cassandra/distributed/test/PaxosRepair2Test.java
index 804353028b..13405162c3 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/PaxosRepair2Test.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/PaxosRepair2Test.java
@@ -92,6 +92,8 @@ import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.Pair;
 
 import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.AUTO_REPAIR_FREQUENCY_SECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.DISABLE_PAXOS_AUTO_REPAIRS;
 import static org.apache.cassandra.schema.SchemaConstants.SYSTEM_KEYSPACE_NAME;
 import static org.apache.cassandra.service.paxos.Ballot.Flag.GLOBAL;
 import static org.apache.cassandra.service.paxos.BallotGenerator.Global.staleBallot;
@@ -107,7 +109,7 @@ public class PaxosRepair2Test extends TestBaseImpl
 
     static
     {
-        CassandraRelevantProperties.PAXOS_EXECUTE_ON_SELF.setBoolean(false);
+        CassandraRelevantProperties.PAXOS_USE_SELF_EXECUTION.setBoolean(false);
         DatabaseDescriptor.daemonInitialization();
     }
 
@@ -331,8 +333,8 @@ public class PaxosRepair2Test extends TestBaseImpl
     @Test
     public void paxosAutoRepair() throws Throwable
     {
-        System.setProperty("cassandra.auto_repair_frequency_seconds", "1");
-        System.setProperty("cassandra.disable_paxos_auto_repairs", "true");
+        AUTO_REPAIR_FREQUENCY_SECONDS.setInt(1);
+        DISABLE_PAXOS_AUTO_REPAIRS.setBoolean(true);
         try (Cluster cluster = init(Cluster.create(3, cfg -> cfg
                                                              .set("paxos_variant", "v2")
                                                              .set("paxos_repair_enabled", true)
@@ -341,8 +343,8 @@ public class PaxosRepair2Test extends TestBaseImpl
         {
             cluster.forEach(i -> {
                 Assert.assertFalse(CassandraRelevantProperties.CLOCK_GLOBAL.isPresent());
-                Assert.assertEquals("1", System.getProperty("cassandra.auto_repair_frequency_seconds"));
-                Assert.assertEquals("true", System.getProperty("cassandra.disable_paxos_auto_repairs"));
+                Assert.assertEquals(1, CassandraRelevantProperties.AUTO_REPAIR_FREQUENCY_SECONDS.getInt());
+                Assert.assertTrue(CassandraRelevantProperties.DISABLE_PAXOS_AUTO_REPAIRS.getBoolean());
             });
             cluster.schemaChange("CREATE TABLE " + KEYSPACE + '.' + TABLE + " (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
             ClusterUtils.stopUnchecked(cluster.get(3));
@@ -380,8 +382,8 @@ public class PaxosRepair2Test extends TestBaseImpl
         }
         finally
         {
-            System.clearProperty("cassandra.auto_repair_frequency_seconds");
-            System.clearProperty("cassandra.disable_paxos_auto_repairs");
+            AUTO_REPAIR_FREQUENCY_SECONDS.clearValue();
+            DISABLE_PAXOS_AUTO_REPAIRS.clearValue();
         }
     }
 
diff --git a/test/distributed/org/apache/cassandra/distributed/test/PaxosRepairTest.java b/test/distributed/org/apache/cassandra/distributed/test/PaxosRepairTest.java
index bfd4e9534e..3251f84ee5 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/PaxosRepairTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/PaxosRepairTest.java
@@ -96,7 +96,7 @@ public class PaxosRepairTest extends TestBaseImpl
 
     static
     {
-        CassandraRelevantProperties.PAXOS_EXECUTE_ON_SELF.setBoolean(false);
+        CassandraRelevantProperties.PAXOS_USE_SELF_EXECUTION.setBoolean(false);
         DatabaseDescriptor.daemonInitialization();
     }
 
diff --git a/test/distributed/org/apache/cassandra/distributed/test/ReadRepairTest.java b/test/distributed/org/apache/cassandra/distributed/test/ReadRepairTest.java
index 9a70e897fe..83c2806079 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/ReadRepairTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/ReadRepairTest.java
@@ -34,7 +34,6 @@ import net.bytebuddy.ByteBuddy;
 import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
 import net.bytebuddy.implementation.MethodDelegation;
 import net.bytebuddy.implementation.bind.annotation.SuperCall;
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.Mutation;
@@ -59,6 +58,7 @@ import org.apache.cassandra.service.reads.repair.ReadRepairStrategy;
 
 import static net.bytebuddy.matcher.ElementMatchers.named;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.ALLOW_ALTER_RF_DURING_RANGE_MOVEMENT;
 import static org.apache.cassandra.db.Keyspace.open;
 import static org.apache.cassandra.distributed.api.ConsistencyLevel.ALL;
 import static org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM;
@@ -253,7 +253,7 @@ public class ReadRepairTest extends TestBaseImpl
             assertRows(cluster.get(2).executeInternal(query));
 
             // alter RF
-            System.setProperty(Config.PROPERTY_PREFIX + "allow_alter_rf_during_range_movement", "true");
+            ALLOW_ALTER_RF_DURING_RANGE_MOVEMENT.setBoolean(true);
             cluster.schemaChange(withKeyspace("ALTER KEYSPACE %s WITH replication = " +
                                               "{'class': 'SimpleStrategy', 'replication_factor': 2}"));
 
diff --git a/test/distributed/org/apache/cassandra/distributed/test/RepairCoordinatorBase.java b/test/distributed/org/apache/cassandra/distributed/test/RepairCoordinatorBase.java
index f1266fafaf..0fc2554b01 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/RepairCoordinatorBase.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/RepairCoordinatorBase.java
@@ -34,6 +34,8 @@ import org.apache.cassandra.distributed.api.NodeToolResult;
 import org.apache.cassandra.distributed.test.DistributedRepairUtils.RepairParallelism;
 import org.apache.cassandra.distributed.test.DistributedRepairUtils.RepairType;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.NODETOOL_JMX_NOTIFICATION_POLL_INTERVAL_SECONDS;
+
 public class RepairCoordinatorBase extends TestBaseImpl
 {
     protected static Cluster CLUSTER;
@@ -67,7 +69,7 @@ public class RepairCoordinatorBase extends TestBaseImpl
         // This only works because the way CI works
         // In CI a new JVM is spun up for each test file, so this doesn't have to worry about another test file
         // getting this set first
-        System.setProperty("cassandra.nodetool.jmx_notification_poll_interval_seconds", "1");
+        NODETOOL_JMX_NOTIFICATION_POLL_INTERVAL_SECONDS.setLong(1);
     }
 
     @BeforeClass
diff --git a/test/distributed/org/apache/cassandra/distributed/test/TestBaseImpl.java b/test/distributed/org/apache/cassandra/distributed/test/TestBaseImpl.java
index 0173c55334..35c59046ea 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/TestBaseImpl.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/TestBaseImpl.java
@@ -44,6 +44,7 @@ import org.apache.cassandra.distributed.api.IInvokableInstance;
 import org.apache.cassandra.distributed.shared.DistributedTestBase;
 
 import static org.apache.cassandra.config.CassandraRelevantProperties.BOOTSTRAP_SCHEMA_DELAY_MS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.JOIN_RING;
 import static org.apache.cassandra.distributed.action.GossipHelper.withProperty;
 
 public class TestBaseImpl extends DistributedTestBase
@@ -121,8 +122,8 @@ public class TestBaseImpl extends DistributedTestBase
         IInstanceConfig config = cluster.newInstanceConfig();
         config.set("auto_bootstrap", true);
         IInvokableInstance newInstance = cluster.bootstrap(config);
-        withProperty(BOOTSTRAP_SCHEMA_DELAY_MS.getKey(), Integer.toString(90 * 1000),
-                     () -> withProperty("cassandra.join_ring", false, () -> newInstance.startup(cluster)));
+        withProperty(BOOTSTRAP_SCHEMA_DELAY_MS, Integer.toString(90 * 1000),
+                     () -> withProperty(JOIN_RING, false, () -> newInstance.startup(cluster)));
         newInstance.nodetoolResult("join").asserts().success();
     }
 
diff --git a/test/distributed/org/apache/cassandra/distributed/test/TimeoutAbortTest.java b/test/distributed/org/apache/cassandra/distributed/test/TimeoutAbortTest.java
index 8adf30777f..f496530b29 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/TimeoutAbortTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/TimeoutAbortTest.java
@@ -26,6 +26,7 @@ import org.junit.Test;
 import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_READ_ITERATION_DELAY_MS;
 import static org.junit.Assert.assertFalse;
 import static org.psjava.util.AssertStatus.assertTrue;
 
@@ -34,7 +35,7 @@ public class TimeoutAbortTest extends TestBaseImpl
     @Test
     public void timeoutTest() throws IOException, InterruptedException
     {
-        System.setProperty("cassandra.test.read_iteration_delay_ms", "5000");
+        TEST_READ_ITERATION_DELAY_MS.setInt(5000);
         try (Cluster cluster = init(Cluster.build(1).start()))
         {
             cluster.schemaChange(withKeyspace("create table %s.tbl (id int, ck1 int, ck2 int, d int, primary key (id, ck1, ck2))"));
diff --git a/test/distributed/org/apache/cassandra/distributed/test/UpdateSystemAuthAfterDCExpansionTest.java b/test/distributed/org/apache/cassandra/distributed/test/UpdateSystemAuthAfterDCExpansionTest.java
index 87650670ab..5313ceefbc 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/UpdateSystemAuthAfterDCExpansionTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/UpdateSystemAuthAfterDCExpansionTest.java
@@ -22,6 +22,7 @@ import java.util.Collections;
 import java.util.UUID;
 
 import com.google.common.collect.ImmutableList;
+
 import org.apache.cassandra.utils.concurrent.Condition;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -44,6 +45,7 @@ import org.apache.cassandra.utils.progress.ProgressEventType;
 
 import static java.util.concurrent.TimeUnit.MINUTES;
 import static org.apache.cassandra.auth.AuthKeyspace.ROLES;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SUPERUSER_SETUP_DELAY_MS;
 import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
 import static org.apache.cassandra.distributed.api.Feature.NETWORK;
 import static org.apache.cassandra.distributed.shared.AssertUtils.assertRows;
@@ -113,7 +115,7 @@ public class UpdateSystemAuthAfterDCExpansionTest extends TestBaseImpl
     {
         // reduce the time from 10s to prevent "Cannot process role related query as the role manager isn't yet setup."
         // exception from CassandraRoleManager
-        System.setProperty("cassandra.superuser_setup_delay_ms", "0");
+        SUPERUSER_SETUP_DELAY_MS.setLong(0);
         TestBaseImpl.beforeClass();
     }
 
diff --git a/test/distributed/org/apache/cassandra/distributed/test/VirtualTableLogsTest.java b/test/distributed/org/apache/cassandra/distributed/test/VirtualTableLogsTest.java
index 17cd994256..b0062ce3e5 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/VirtualTableLogsTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/VirtualTableLogsTest.java
@@ -33,6 +33,7 @@ import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.utils.logging.VirtualTableAppender;
 
 import static java.lang.String.format;
+import static org.apache.cassandra.config.CassandraRelevantProperties.LOGBACK_CONFIGURATION_FILE;
 import static org.apache.cassandra.db.virtual.LogMessagesTable.LEVEL_COLUMN_NAME;
 import static org.apache.cassandra.db.virtual.LogMessagesTable.LOGGER_COLUMN_NAME;
 import static org.apache.cassandra.db.virtual.LogMessagesTable.MESSAGE_COLUMN_NAME;
@@ -49,7 +50,7 @@ public class VirtualTableLogsTest extends TestBaseImpl
     @Test
     public void testVTableOutput() throws Throwable
     {
-        System.setProperty("logback.configurationFile", "test/conf/logback-dtest_with_vtable_appender.xml");
+        LOGBACK_CONFIGURATION_FILE.setString("test/conf/logback-dtest_with_vtable_appender.xml");
 
         try (Cluster cluster = Cluster.build(1)
                                       .withConfig(c -> c.with(Feature.values()))
@@ -62,14 +63,14 @@ public class VirtualTableLogsTest extends TestBaseImpl
         }
         finally
         {
-            System.clearProperty("logback.configurationFile");
+            LOGBACK_CONFIGURATION_FILE.clearValue();
         }
     }
 
     @Test
     public void testMultipleAppendersFailToStartNode() throws Throwable
     {
-        System.setProperty("logback.configurationFile", "test/conf/logback-dtest_with_vtable_appender_invalid.xml");
+        LOGBACK_CONFIGURATION_FILE.setString("test/conf/logback-dtest_with_vtable_appender_invalid.xml");
 
         try (Cluster ignored = Cluster.build(1)
                                       .withConfig(c -> c.with(Feature.values()))
@@ -86,7 +87,7 @@ public class VirtualTableLogsTest extends TestBaseImpl
         }
         finally
         {
-            System.clearProperty("logback.configurationFile");
+            LOGBACK_CONFIGURATION_FILE.clearValue();
         }
     }
 
diff --git a/test/distributed/org/apache/cassandra/distributed/test/hostreplacement/FailedBootstrapTest.java b/test/distributed/org/apache/cassandra/distributed/test/hostreplacement/FailedBootstrapTest.java
index 56de092844..7a8e42186a 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/hostreplacement/FailedBootstrapTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/hostreplacement/FailedBootstrapTest.java
@@ -50,6 +50,7 @@ import org.assertj.core.api.Assertions;
 import org.awaitility.Awaitility;
 
 import static net.bytebuddy.matcher.ElementMatchers.named;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SUPERUSER_SETUP_DELAY_MS;
 import static org.apache.cassandra.distributed.shared.ClusterUtils.replaceHostAndStart;
 import static org.apache.cassandra.distributed.shared.ClusterUtils.stopUnchecked;
 import static org.apache.cassandra.distributed.test.hostreplacement.HostReplacementTest.setupCluster;
@@ -78,7 +79,7 @@ public class FailedBootstrapTest extends TestBaseImpl
             stopUnchecked(nodeToRemove);
 
             // should fail to join, but should start up!
-            IInvokableInstance added = replaceHostAndStart(cluster, nodeToRemove, p -> p.setProperty("cassandra.superuser_setup_delay_ms", "1"));
+            IInvokableInstance added = replaceHostAndStart(cluster, nodeToRemove, p -> p.set(SUPERUSER_SETUP_DELAY_MS, "1"));
             // log gossip for debugging
             alive.forEach(i -> {
                 NodeToolResult result = i.nodetoolResult("gossipinfo");
diff --git a/test/distributed/org/apache/cassandra/distributed/test/jmx/JMXGetterCheckTest.java b/test/distributed/org/apache/cassandra/distributed/test/jmx/JMXGetterCheckTest.java
index ef0f1ecae0..b935e24701 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/jmx/JMXGetterCheckTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/jmx/JMXGetterCheckTest.java
@@ -42,7 +42,7 @@ import org.apache.cassandra.distributed.api.Feature;
 import org.apache.cassandra.distributed.test.TestBaseImpl;
 import org.apache.cassandra.utils.JMXServerUtils;
 
-import static org.apache.cassandra.config.CassandraRelevantProperties.IS_DISABLED_MBEAN_REGISTRATION;
+import static org.apache.cassandra.config.CassandraRelevantProperties.ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION;
 import static org.apache.cassandra.cql3.CQLTester.getAutomaticallyAllocatedPort;
 
 public class JMXGetterCheckTest extends TestBaseImpl
@@ -68,7 +68,7 @@ public class JMXGetterCheckTest extends TestBaseImpl
         jmxServer.start();
         String url = "service:jmx:rmi:///jndi/rmi://" + jmxHost + ":" + jmxPort + "/jmxrmi";
 
-        IS_DISABLED_MBEAN_REGISTRATION.setBoolean(false);
+        ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION.setBoolean(false);
         try (Cluster cluster = Cluster.build(1).withConfig(c -> c.with(Feature.values())).start())
         {
             List<Named> errors = new ArrayList<>();
diff --git a/test/distributed/org/apache/cassandra/distributed/test/metric/TableMetricTest.java b/test/distributed/org/apache/cassandra/distributed/test/metric/TableMetricTest.java
index 08c9324649..a8ddfe037b 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/metric/TableMetricTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/metric/TableMetricTest.java
@@ -47,7 +47,7 @@ import org.apache.cassandra.schema.SchemaKeyspace;
 import org.apache.cassandra.tracing.TraceKeyspace;
 import org.apache.cassandra.utils.MBeanWrapper;
 
-import static org.apache.cassandra.config.CassandraRelevantProperties.IS_DISABLED_MBEAN_REGISTRATION;
+import static org.apache.cassandra.config.CassandraRelevantProperties.ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION;
 import static org.apache.cassandra.config.CassandraRelevantProperties.MBEAN_REGISTRATION_CLASS;
 
 public class TableMetricTest extends TestBaseImpl
@@ -55,7 +55,7 @@ public class TableMetricTest extends TestBaseImpl
     static
     {
         MBEAN_REGISTRATION_CLASS.setString(MapMBeanWrapper.class.getName());
-        IS_DISABLED_MBEAN_REGISTRATION.setBoolean(false);
+        ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION.setBoolean(false);
     }
 
     private static volatile Map<String, Collection<String>> SYSTEM_TABLES = null;
diff --git a/test/distributed/org/apache/cassandra/distributed/test/ring/BootstrapTest.java b/test/distributed/org/apache/cassandra/distributed/test/ring/BootstrapTest.java
index 3d1c5a648e..c4245eeab8 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/ring/BootstrapTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/ring/BootstrapTest.java
@@ -49,6 +49,7 @@ import org.apache.cassandra.distributed.test.TestBaseImpl;
 import org.apache.cassandra.schema.SchemaConstants;
 
 import static java.util.Arrays.asList;
+import static org.apache.cassandra.config.CassandraRelevantProperties.JOIN_RING;
 import static org.apache.cassandra.config.CassandraRelevantProperties.RESET_BOOTSTRAP_PROGRESS;
 import static org.apache.cassandra.distributed.action.GossipHelper.bootstrap;
 import static org.apache.cassandra.distributed.action.GossipHelper.pullSchemaFrom;
@@ -61,7 +62,7 @@ public class BootstrapTest extends TestBaseImpl
 {
     private long savedMigrationDelay;
 
-    static String originalResetBootstrapProgress = null;
+    static Boolean originalResetBootstrapProgress = null;
 
     @Before
     public void beforeTest()
@@ -75,7 +76,7 @@ public class BootstrapTest extends TestBaseImpl
         savedMigrationDelay = CassandraRelevantProperties.MIGRATION_DELAY.getLong();
         CassandraRelevantProperties.MIGRATION_DELAY.setLong(ManagementFactory.getRuntimeMXBean().getUptime() + savedMigrationDelay);
 
-        originalResetBootstrapProgress = RESET_BOOTSTRAP_PROGRESS.getString();
+        originalResetBootstrapProgress = RESET_BOOTSTRAP_PROGRESS.getBoolean();
     }
 
     @After
@@ -85,7 +86,7 @@ public class BootstrapTest extends TestBaseImpl
         if (originalResetBootstrapProgress == null)
             RESET_BOOTSTRAP_PROGRESS.clearValue();
         else
-            RESET_BOOTSTRAP_PROGRESS.setString(originalResetBootstrapProgress);
+            RESET_BOOTSTRAP_PROGRESS.setBoolean(originalResetBootstrapProgress);
     }
 
     @Test
@@ -146,7 +147,7 @@ public class BootstrapTest extends TestBaseImpl
 
             IInstanceConfig config = cluster.newInstanceConfig();
             IInvokableInstance newInstance = cluster.bootstrap(config);
-                withProperty("cassandra.join_ring", false, () -> newInstance.startup(cluster));
+                withProperty(JOIN_RING, false, () -> newInstance.startup(cluster));
 
             cluster.forEach(statusToBootstrap(newInstance));
 
@@ -226,7 +227,7 @@ public class BootstrapTest extends TestBaseImpl
 
             IInstanceConfig config = cluster.newInstanceConfig();
             IInvokableInstance newInstance = cluster.bootstrap(config);
-            withProperty("cassandra.join_ring", false,
+            withProperty(JOIN_RING, false,
                          () -> newInstance.startup(cluster));
 
             cluster.forEach(statusToBootstrap(newInstance));
@@ -256,7 +257,7 @@ public class BootstrapTest extends TestBaseImpl
         {
             IInstanceConfig config = cluster.newInstanceConfig();
             IInvokableInstance newInstance = cluster.bootstrap(config);
-            withProperty("cassandra.join_ring", false,
+            withProperty(JOIN_RING, false,
                          () -> newInstance.startup(cluster));
 
             cluster.forEach(statusToBootstrap(newInstance));
diff --git a/test/distributed/org/apache/cassandra/distributed/test/ring/CleanupFailureTest.java b/test/distributed/org/apache/cassandra/distributed/test/ring/CleanupFailureTest.java
index 9c8f71fde9..8ec3630983 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/ring/CleanupFailureTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/ring/CleanupFailureTest.java
@@ -28,6 +28,7 @@ import org.apache.cassandra.distributed.api.NodeToolResult;
 import org.apache.cassandra.distributed.shared.NetworkTopology;
 import org.apache.cassandra.distributed.test.TestBaseImpl;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.JOIN_RING;
 import static org.junit.Assert.assertEquals;
 import static org.apache.cassandra.distributed.action.GossipHelper.statusToBootstrap;
 import static org.apache.cassandra.distributed.action.GossipHelper.statusToDecommission;
@@ -86,7 +87,7 @@ public class CleanupFailureTest extends TestBaseImpl
         {
             IInstanceConfig config = cluster.newInstanceConfig();
             IInvokableInstance bootstrappingNode = cluster.bootstrap(config);
-            withProperty("cassandra.join_ring", false,
+            withProperty(JOIN_RING, false,
                          () -> bootstrappingNode.startup(cluster));
 
             // Start decomission on bootstrappingNode
diff --git a/test/distributed/org/apache/cassandra/distributed/test/ring/PendingWritesTest.java b/test/distributed/org/apache/cassandra/distributed/test/ring/PendingWritesTest.java
index 2e702b219b..0e0cf7616a 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/ring/PendingWritesTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/ring/PendingWritesTest.java
@@ -41,6 +41,7 @@ import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.service.PendingRangeCalculatorService;
 import org.apache.cassandra.service.StorageService;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.JOIN_RING;
 import static org.apache.cassandra.distributed.action.GossipHelper.bootstrap;
 import static org.apache.cassandra.distributed.action.GossipHelper.disseminateGossipState;
 import static org.apache.cassandra.distributed.action.GossipHelper.statusToBootstrap;
@@ -65,8 +66,7 @@ public class PendingWritesTest extends TestBaseImpl
             BootstrapTest.populate(cluster, 0, 100);
             IInstanceConfig config = cluster.newInstanceConfig();
             IInvokableInstance newInstance = cluster.bootstrap(config);
-            withProperty("cassandra.join_ring", false,
-                         () -> newInstance.startup(cluster));
+            withProperty(JOIN_RING, false, () -> newInstance.startup(cluster));
 
             cluster.forEach(statusToBootstrap(newInstance));
             cluster.run(bootstrap(false, Duration.ofSeconds(60), Duration.ofSeconds(60)), newInstance.config().num());
diff --git a/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyCQLTest.java b/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyCQLTest.java
index 1df7e7c95a..ad18d9fd46 100644
--- a/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyCQLTest.java
+++ b/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyCQLTest.java
@@ -29,13 +29,13 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import com.google.common.util.concurrent.Uninterruptibles;
 import org.junit.Test;
 
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.Hex;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_STRICT_LCS_CHECKS;
 import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 public class LongLeveledCompactionStrategyCQLTest extends CQLTester
@@ -44,7 +44,7 @@ public class LongLeveledCompactionStrategyCQLTest extends CQLTester
     @Test
     public void stressTestCompactionStrategyManager() throws ExecutionException, InterruptedException
     {
-        System.setProperty(Config.PROPERTY_PREFIX + "test.strict_lcs_checks", "true");
+        TEST_STRICT_LCS_CHECKS.setBoolean(true);
         // flush/compact tons of sstables, invalidate token metadata in a loop to make CSM reload the strategies
         createTable("create table %s (id int primary key, i text) with compaction = {'class':'LeveledCompactionStrategy', 'sstable_size_in_mb':1}");
         ExecutorService es = Executors.newSingleThreadExecutor();
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/InterceptAgent.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/InterceptAgent.java
index ffa9b180e5..c4beaf9c2b 100644
--- a/test/simulator/asm/org/apache/cassandra/simulator/asm/InterceptAgent.java
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/InterceptAgent.java
@@ -54,6 +54,8 @@ import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL;
 import static org.objectweb.asm.Opcodes.IRETURN;
 import static org.objectweb.asm.Opcodes.RETURN;
 
+// checkstyle: suppress below 'blockSystemPropertyUsage'
+
 /**
  * A mechanism for weaving classes loaded by the bootstrap classloader that we cannot override.
  * The design supports weaving of the internals of these classes, and in future we may want to
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/MethodLogger.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/MethodLogger.java
index 1e6a844772..7e6a6891f4 100644
--- a/test/simulator/asm/org/apache/cassandra/simulator/asm/MethodLogger.java
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/MethodLogger.java
@@ -37,6 +37,8 @@ import static java.util.Arrays.stream;
 import static org.apache.cassandra.simulator.asm.MethodLogger.Level.NONE;
 import static org.apache.cassandra.simulator.asm.MethodLogger.Level.valueOf;
 
+// checkstyle: suppress below 'blockSystemPropertyUsage'
+
 // TODO (config): support logging only for packages/classes matching a pattern
 interface MethodLogger
 {
diff --git a/test/simulator/main/org/apache/cassandra/simulator/ActionSchedule.java b/test/simulator/main/org/apache/cassandra/simulator/ActionSchedule.java
index 18fc877824..6119e4706f 100644
--- a/test/simulator/main/org/apache/cassandra/simulator/ActionSchedule.java
+++ b/test/simulator/main/org/apache/cassandra/simulator/ActionSchedule.java
@@ -43,6 +43,7 @@ import org.apache.cassandra.simulator.utils.SafeCollections;
 import org.apache.cassandra.utils.CloseableIterator;
 import org.apache.cassandra.utils.Throwables;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_SIMULATOR_DEBUG;
 import static org.apache.cassandra.simulator.Action.Modifier.DAEMON;
 import static org.apache.cassandra.simulator.Action.Modifier.STREAM;
 import static org.apache.cassandra.simulator.Action.Phase.CONSEQUENCE;
@@ -300,7 +301,7 @@ public class ActionSchedule implements CloseableIterator<Object>, LongConsumer
             }
             else
             {
-                logger.error("Simulation failed to make progress. Run with -Dcassandra.test.simulator.debug=true to see the blocked task graph. Blocked tasks:");
+                logger.error("Simulation failed to make progress. Run with -D{}=true to see the blocked task graph. Blocked tasks:", TEST_SIMULATOR_DEBUG.getKey());
                 actions = sequences.values()
                                    .stream()
                                    .filter(s -> s.on instanceof OrderOnId)
diff --git a/test/simulator/main/org/apache/cassandra/simulator/SimulationRunner.java b/test/simulator/main/org/apache/cassandra/simulator/SimulationRunner.java
index 6f1eb12f30..32888f4a11 100644
--- a/test/simulator/main/org/apache/cassandra/simulator/SimulationRunner.java
+++ b/test/simulator/main/org/apache/cassandra/simulator/SimulationRunner.java
@@ -54,18 +54,21 @@ import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
 import static java.util.Arrays.stream;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.ALLOW_ALTER_RF_DURING_RANGE_MOVEMENT;
 import static org.apache.cassandra.config.CassandraRelevantProperties.BATCH_COMMIT_LOG_SYNC_INTERVAL;
 import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_JMX_REMOTE_PORT;
 import static org.apache.cassandra.config.CassandraRelevantProperties.CLOCK_GLOBAL;
 import static org.apache.cassandra.config.CassandraRelevantProperties.CLOCK_MONOTONIC_APPROX;
 import static org.apache.cassandra.config.CassandraRelevantProperties.CLOCK_MONOTONIC_PRECISE;
-import static org.apache.cassandra.config.CassandraRelevantProperties.DETERMINISM_CONSISTENT_DIRECTORY_LISTINGS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CONSISTENT_DIRECTORY_LISTINGS;
 import static org.apache.cassandra.config.CassandraRelevantProperties.DETERMINISM_UNSAFE_UUID_NODE;
 import static org.apache.cassandra.config.CassandraRelevantProperties.DISABLE_SSTABLE_ACTIVITY_TRACKING;
 import static org.apache.cassandra.config.CassandraRelevantProperties.DETERMINISM_SSTABLE_COMPRESSION_DEFAULT;
+import static org.apache.cassandra.config.CassandraRelevantProperties.DTEST_API_LOG_TOPOLOGY;
 import static org.apache.cassandra.config.CassandraRelevantProperties.GOSSIPER_SKIP_WAITING_TO_SETTLE;
 import static org.apache.cassandra.config.CassandraRelevantProperties.IGNORE_MISSING_NATIVE_FILE_HINTS;
-import static org.apache.cassandra.config.CassandraRelevantProperties.IS_DISABLED_MBEAN_REGISTRATION;
+import static org.apache.cassandra.config.CassandraRelevantProperties.ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION;
+import static org.apache.cassandra.config.CassandraRelevantProperties.LIBJEMALLOC;
 import static org.apache.cassandra.config.CassandraRelevantProperties.MEMTABLE_OVERHEAD_SIZE;
 import static org.apache.cassandra.config.CassandraRelevantProperties.MIGRATION_DELAY;
 import static org.apache.cassandra.config.CassandraRelevantProperties.PAXOS_REPAIR_RETRY_TIMEOUT_IN_MS;
@@ -99,12 +102,12 @@ public class SimulationRunner
         try { Clock.Global.nanoTime(); } catch (IllegalStateException e) {} // make sure static initializer gets called
 
         // TODO (cleanup): disable unnecessary things like compaction logger threads etc
-        System.setProperty("cassandra.libjemalloc", "-");
-        System.setProperty("cassandra.dtest.api.log.topology", "false");
+        LIBJEMALLOC.setString("-");
+        DTEST_API_LOG_TOPOLOGY.setBoolean(false);
 
         // this property is used to allow non-members of the ring to exist in gossip without breaking RF changes
         // it would be nice not to rely on this, but hopefully we'll have consistent range movements before it matters
-        System.setProperty("cassandra.allow_alter_rf_during_range_movement", "true");
+        ALLOW_ALTER_RF_DURING_RANGE_MOVEMENT.setBoolean(true);
 
         for (CassandraRelevantProperties property : Arrays.asList(CLOCK_GLOBAL, CLOCK_MONOTONIC_APPROX, CLOCK_MONOTONIC_PRECISE))
             property.setString("org.apache.cassandra.simulator.systems.SimulatedTime$Global");
@@ -118,14 +121,14 @@ public class SimulationRunner
         BATCH_COMMIT_LOG_SYNC_INTERVAL.setInt(-1);
         DISABLE_SSTABLE_ACTIVITY_TRACKING.setBoolean(false);
         DETERMINISM_SSTABLE_COMPRESSION_DEFAULT.setBoolean(false); // compression causes variation in file size for e.g. UUIDs, IP addresses, random file paths
-        DETERMINISM_CONSISTENT_DIRECTORY_LISTINGS.setBoolean(true);
+        CONSISTENT_DIRECTORY_LISTINGS.setBoolean(true);
         TEST_IGNORE_SIGAR.setBoolean(true);
         SYSTEM_AUTH_DEFAULT_RF.setInt(3);
         MIGRATION_DELAY.setInt(Integer.MAX_VALUE);
         DISABLE_GOSSIP_ENDPOINT_REMOVAL.setBoolean(true);
         MEMTABLE_OVERHEAD_SIZE.setInt(100);
         IGNORE_MISSING_NATIVE_FILE_HINTS.setBoolean(true);
-        IS_DISABLED_MBEAN_REGISTRATION.setBoolean(true);
+        ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION.setBoolean(true);
         TEST_JVM_DTEST_DISABLE_SSL.setBoolean(true); // to support easily running without netty from dtest-jar
 
         if (Thread.currentThread() instanceof InterceptibleThread); // load InterceptibleThread class to avoid infinite loop in InterceptorOfGlobalMethods
diff --git a/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosSimulation.java b/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosSimulation.java
index d54cc36851..a6fbc44465 100644
--- a/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosSimulation.java
+++ b/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosSimulation.java
@@ -26,17 +26,14 @@ import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.BiConsumer;
 import java.util.function.LongSupplier;
-
 import javax.annotation.Nullable;
 
 import com.google.common.base.Throwables;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.concurrent.ExecutorFactory;
 import org.apache.cassandra.concurrent.ScheduledExecutorPlus;
-import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.distributed.api.IInvokableInstance;
@@ -55,8 +52,9 @@ import org.apache.cassandra.utils.CloseableIterator;
 import org.apache.cassandra.utils.concurrent.Threads;
 import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
-import static org.apache.cassandra.simulator.Action.Modifiers.NONE;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_SIMULATOR_LIVENESS_CHECK;
 import static org.apache.cassandra.simulator.Action.Modifiers.DISPLAY_ORIGIN;
+import static org.apache.cassandra.simulator.Action.Modifiers.NONE;
 import static org.apache.cassandra.simulator.SimulatorUtils.failWithOOM;
 import static org.apache.cassandra.simulator.paxos.HistoryChecker.causedBy;
 
@@ -133,7 +131,7 @@ public abstract class PaxosSimulation implements Simulation, ClusterActionListen
         AtomicLong counter = new AtomicLong();
         ScheduledExecutorPlus livenessChecker = null;
         ScheduledFuture<?> liveness = null;
-        if (CassandraRelevantProperties.TEST_SIMULATOR_LIVENESS_CHECK.getBoolean())
+        if (TEST_SIMULATOR_LIVENESS_CHECK.getBoolean())
         {
             livenessChecker = ExecutorFactory.Global.executorFactory().scheduled("SimulationLiveness");
             liveness = livenessChecker.scheduleWithFixedDelay(new Runnable()
@@ -170,7 +168,7 @@ public abstract class PaxosSimulation implements Simulation, ClusterActionListen
                         long cur = counter.get();
                         if (cur == prev)
                         {
-                            logger.error("Simulation appears to have stalled; terminating. To disable set -Dcassandra.test.simulator.livenesscheck=false");
+                            logger.error("Simulation appears to have stalled; terminating. To disable set -D{}=false", TEST_SIMULATOR_LIVENESS_CHECK.getKey());
                             shutdown.set(1);
                             throw failWithOOM();
                         }
diff --git a/test/unit/org/apache/cassandra/AbstractSerializationsTester.java b/test/unit/org/apache/cassandra/AbstractSerializationsTester.java
index d79521b196..ebb74a7989 100644
--- a/test/unit/org/apache/cassandra/AbstractSerializationsTester.java
+++ b/test/unit/org/apache/cassandra/AbstractSerializationsTester.java
@@ -27,16 +27,19 @@ import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_VERSION;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_SERIALIZATION_WRITES;
+
 public class AbstractSerializationsTester
 {
-    protected static final String CUR_VER = System.getProperty("cassandra.version", "4.0");
+    protected static final String CUR_VER = CASSANDRA_VERSION.getString("4.0");
     protected static final Map<String, Integer> VERSION_MAP = new HashMap<String, Integer> ()
     {{
         put("3.0", MessagingService.VERSION_30);
         put("4.0", MessagingService.VERSION_40);
     }};
 
-    protected static final boolean EXECUTE_WRITES = Boolean.getBoolean("cassandra.test-serialization-writes");
+    protected static final boolean EXECUTE_WRITES = TEST_SERIALIZATION_WRITES.getBoolean();
 
     protected static int getVersion()
     {
diff --git a/test/unit/org/apache/cassandra/CassandraBriefJUnitResultFormatter.java b/test/unit/org/apache/cassandra/CassandraBriefJUnitResultFormatter.java
index 2befb5c631..dc9b8f86b1 100644
--- a/test/unit/org/apache/cassandra/CassandraBriefJUnitResultFormatter.java
+++ b/test/unit/org/apache/cassandra/CassandraBriefJUnitResultFormatter.java
@@ -36,6 +36,9 @@ import org.apache.tools.ant.taskdefs.optional.junit.JUnitVersionHelper;
 import org.apache.tools.ant.util.FileUtils;
 import org.apache.tools.ant.util.StringUtils;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_CASSANDRA_KEEPBRIEFBRIEF;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_CASSANDRA_TESTTAG;
+
 /**
  * Prints plain text output of the test to a specified Writer.
  * Inspired by the PlainJUnitResultFormatter.
@@ -47,9 +50,9 @@ public class CassandraBriefJUnitResultFormatter implements JUnitResultFormatter,
 
     private static final double ONE_SECOND = 1000.0;
 
-    private static final String tag = System.getProperty("cassandra.testtag", "");
+    private static final String tag = TEST_CASSANDRA_TESTTAG.getString();
 
-    private static final Boolean keepBriefBrief = Boolean.getBoolean("cassandra.keepBriefBrief");
+    private static final Boolean keepBriefBrief = TEST_CASSANDRA_KEEPBRIEFBRIEF.getBoolean();
 
     /**
      * Where to write the log to.
diff --git a/test/unit/org/apache/cassandra/CassandraXMLJUnitResultFormatter.java b/test/unit/org/apache/cassandra/CassandraXMLJUnitResultFormatter.java
index de8fb4e5d5..6f821c3d50 100644
--- a/test/unit/org/apache/cassandra/CassandraXMLJUnitResultFormatter.java
+++ b/test/unit/org/apache/cassandra/CassandraXMLJUnitResultFormatter.java
@@ -50,6 +50,9 @@ import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Text;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_CASSANDRA_SUITENAME;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_CASSANDRA_TESTTAG;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SUN_JAVA_COMMAND;
 import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 /**
@@ -73,7 +76,7 @@ public class CassandraXMLJUnitResultFormatter implements JUnitResultFormatter, X
         }
     }
 
-    private static final String tag = System.getProperty("cassandra.testtag", "");
+    private static final String tag = TEST_CASSANDRA_TESTTAG.getString();
 
     /*
      * Set the property for the test suite name so that log configuration can pick it up
@@ -81,9 +84,9 @@ public class CassandraXMLJUnitResultFormatter implements JUnitResultFormatter, X
      */
     static
     {
-        String command = System.getProperty("sun.java.command");
+        String command = SUN_JAVA_COMMAND.getString();
         String args[] = command.split(" ");
-        System.setProperty("suitename", args[1]);
+        TEST_CASSANDRA_SUITENAME.setString(args[1]);
     }
 
     /**
diff --git a/test/unit/org/apache/cassandra/LogbackStatusListener.java b/test/unit/org/apache/cassandra/LogbackStatusListener.java
index 719fada242..834d51fca2 100644
--- a/test/unit/org/apache/cassandra/LogbackStatusListener.java
+++ b/test/unit/org/apache/cassandra/LogbackStatusListener.java
@@ -33,8 +33,12 @@ import ch.qos.logback.classic.LoggerContext;
 import ch.qos.logback.classic.spi.LoggerContextListener;
 import ch.qos.logback.core.status.Status;
 import ch.qos.logback.core.status.StatusListener;
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.distributed.shared.InstanceClassLoader;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.SUN_STDERR_ENCODING;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SUN_STDOUT_ENCODING;
+
 /*
  * Listen for logback readiness and then redirect stdout/stderr to logback
  */
@@ -84,9 +88,9 @@ public class LogbackStatusListener implements StatusListener, LoggerContextListe
         }
     }
 
-    private static PrintStream wrapLogger(Logger logger, PrintStream original, String encodingProperty, boolean error) throws Exception
+    private static PrintStream wrapLogger(Logger logger, PrintStream original, CassandraRelevantProperties encodingProperty, boolean error) throws Exception
     {
-        final String encoding = System.getProperty(encodingProperty);
+        final String encoding = encodingProperty.getString();
         OutputStream os = new ToLoggerOutputStream(logger, encoding, error);
         return encoding != null ? new WrappedPrintStream(os, true, encoding, original)
                                 : new WrappedPrintStream(os, true, original);
@@ -475,9 +479,9 @@ public class LogbackStatusListener implements StatusListener, LoggerContextListe
                 Logger stdoutLogger = LoggerFactory.getLogger("stdout");
                 Logger stderrLogger = LoggerFactory.getLogger("stderr");
 
-                replacementOut = wrapLogger(stdoutLogger, originalOut, "sun.stdout.encoding", false);
+                replacementOut = wrapLogger(stdoutLogger, originalOut, SUN_STDOUT_ENCODING, false);
                 System.setOut(replacementOut);
-                replacementErr = wrapLogger(stderrLogger, originalErr, "sun.stderr.encoding", true);
+                replacementErr = wrapLogger(stderrLogger, originalErr, SUN_STDERR_ENCODING, true);
                 System.setErr(replacementErr);
             }
             catch (Exception e)
diff --git a/test/unit/org/apache/cassandra/SchemaLoader.java b/test/unit/org/apache/cassandra/SchemaLoader.java
index 15d2fb7d2a..f0178d1a2e 100644
--- a/test/unit/org/apache/cassandra/SchemaLoader.java
+++ b/test/unit/org/apache/cassandra/SchemaLoader.java
@@ -50,6 +50,9 @@ import org.apache.cassandra.utils.FBUtilities;
 import org.junit.After;
 import org.junit.BeforeClass;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.ALLOW_UNSAFE_JOIN;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_COMPRESSION;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_COMPRESSION_ALGO;
 import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 public class SchemaLoader
@@ -82,7 +85,7 @@ public class SchemaLoader
     public static void startGossiper()
     {
         // skip shadow round and endpoint collision check in tests
-        System.setProperty("cassandra.allow_unsafe_join", "true");
+        ALLOW_UNSAFE_JOIN.setBoolean(true);
         if (!Gossiper.instance.isEnabled())
             Gossiper.instance.start((int) (currentTimeMillis() / 1000));
     }
@@ -249,7 +252,7 @@ public class SchemaLoader
         for (KeyspaceMetadata ksm : schema)
             SchemaTestUtil.announceNewKeyspace(ksm);
 
-        if (Boolean.parseBoolean(System.getProperty("cassandra.test.compression", "false")))
+        if (TEST_COMPRESSION.getBoolean())
             useCompression(schema, compressionParams(CompressionParams.DEFAULT_CHUNK_LENGTH));
     }
 
@@ -725,7 +728,7 @@ public static TableMetadata.Builder clusteringSASICFMD(String ksName, String cfN
 
     public static CompressionParams getCompressionParameters(Integer chunkSize)
     {
-        if (Boolean.parseBoolean(System.getProperty("cassandra.test.compression", "false")))
+        if (TEST_COMPRESSION.getBoolean())
             return chunkSize != null ? compressionParams(chunkSize) : compressionParams(CompressionParams.DEFAULT_CHUNK_LENGTH);
 
         return CompressionParams.noCompression();
@@ -759,7 +762,7 @@ public static TableMetadata.Builder clusteringSASICFMD(String ksName, String cfN
 
     private static CompressionParams compressionParams(int chunkLength)
     {
-        String algo = System.getProperty("cassandra.test.compression.algo", "lz4").toLowerCase();
+        String algo = TEST_COMPRESSION_ALGO.getString().toLowerCase();
         switch (algo)
         {
             case "deflate":
diff --git a/test/unit/org/apache/cassandra/audit/AuditLoggerAuthTest.java b/test/unit/org/apache/cassandra/audit/AuditLoggerAuthTest.java
index 9a3c605f8e..0ced5a10e7 100644
--- a/test/unit/org/apache/cassandra/audit/AuditLoggerAuthTest.java
+++ b/test/unit/org/apache/cassandra/audit/AuditLoggerAuthTest.java
@@ -42,6 +42,7 @@ import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.service.EmbeddedCassandraService;
 import org.hamcrest.CoreMatchers;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.SUPERUSER_SETUP_DELAY_MS;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
@@ -75,7 +76,7 @@ public class AuditLoggerAuthTest
             config.audit_logging_options.logger = new ParameterizedClass("InMemoryAuditLogger", null);
         });
 
-        System.setProperty("cassandra.superuser_setup_delay_ms", "0");
+        SUPERUSER_SETUP_DELAY_MS.setLong(0);
         embedded = ServerTestUtils.startEmbeddedCassandraService();
 
         executeWithCredentials(
diff --git a/test/unit/org/apache/cassandra/audit/AuditLoggerCleanupTest.java b/test/unit/org/apache/cassandra/audit/AuditLoggerCleanupTest.java
index 891827cd3e..ebc5ead713 100644
--- a/test/unit/org/apache/cassandra/audit/AuditLoggerCleanupTest.java
+++ b/test/unit/org/apache/cassandra/audit/AuditLoggerCleanupTest.java
@@ -41,6 +41,7 @@ import org.apache.cassandra.service.EmbeddedCassandraService;
 import org.apache.cassandra.service.StorageService;
 
 import static java.nio.file.Files.list;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SUPERUSER_SETUP_DELAY_MS;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
@@ -69,7 +70,8 @@ public class AuditLoggerCleanupTest
         emptyCq4File = Files.createFile(auditLogDirRoot.toPath().resolve("20220928-12" + SingleChronicleQueue.SUFFIX)).toFile();
         emptyMetadataFile = Files.createFile(auditLogDirRoot.toPath().resolve("metadata" + SingleTableStore.SUFFIX)).toFile();
 
-        System.setProperty("cassandra.superuser_setup_delay_ms", "0");
+        SUPERUSER_SETUP_DELAY_MS.setLong(0);
+
         embedded = new EmbeddedCassandraService();
         embedded.start();
     }
diff --git a/test/unit/org/apache/cassandra/auth/AuthCacheTest.java b/test/unit/org/apache/cassandra/auth/AuthCacheTest.java
index 0e2234685e..50a0a9c0fc 100644
--- a/test/unit/org/apache/cassandra/auth/AuthCacheTest.java
+++ b/test/unit/org/apache/cassandra/auth/AuthCacheTest.java
@@ -33,6 +33,8 @@ import org.junit.Test;
 import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.exceptions.UnavailableException;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.AUTH_CACHE_WARMING_MAX_RETRIES;
+import static org.apache.cassandra.config.CassandraRelevantProperties.AUTH_CACHE_WARMING_RETRY_INTERVAL_MS;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -264,8 +266,8 @@ public class AuthCacheTest
     @Test
     public void handleProviderErrorDuringWarming()
     {
-        System.setProperty(AuthCache.CACHE_LOAD_RETRIES_PROPERTY, "3");
-        System.setProperty(AuthCache.CACHE_LOAD_RETRY_INTERVAL_PROPERTY, "0");
+        AUTH_CACHE_WARMING_MAX_RETRIES.setInt(3);
+        AUTH_CACHE_WARMING_RETRY_INTERVAL_MS.setLong(0);
         final AtomicInteger attempts = new AtomicInteger(0);
 
         Supplier<Map<String, Integer>> bulkLoader = () -> {
diff --git a/test/unit/org/apache/cassandra/auth/PasswordAuthenticatorTest.java b/test/unit/org/apache/cassandra/auth/PasswordAuthenticatorTest.java
index e1033ff9ab..3349c8c33a 100644
--- a/test/unit/org/apache/cassandra/auth/PasswordAuthenticatorTest.java
+++ b/test/unit/org/apache/cassandra/auth/PasswordAuthenticatorTest.java
@@ -45,14 +45,13 @@ import static org.apache.cassandra.auth.CassandraRoleManager.DEFAULT_SUPERUSER_P
 import static org.apache.cassandra.auth.CassandraRoleManager.getGensaltLogRounds;
 import static org.apache.cassandra.auth.PasswordAuthenticator.SaslNegotiator;
 import static org.apache.cassandra.auth.PasswordAuthenticator.checkpw;
+import static org.apache.cassandra.config.CassandraRelevantProperties.AUTH_BCRYPT_GENSALT_LOG2_ROUNDS;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mindrot.jbcrypt.BCrypt.gensalt;
 import static org.mindrot.jbcrypt.BCrypt.hashpw;
 
-import static org.apache.cassandra.auth.CassandraRoleManager.GENSALT_LOG2_ROUNDS_PROPERTY;
-
 public class PasswordAuthenticatorTest extends CQLTester
 {
     private final static PasswordAuthenticator authenticator = new PasswordAuthenticator();
@@ -119,19 +118,18 @@ public class PasswordAuthenticatorTest extends CQLTester
 
     private void executeSaltRoundsPropertyTest(Integer rounds)
     {
-        String oldProperty = System.getProperty(GENSALT_LOG2_ROUNDS_PROPERTY);
+        Integer oldProperty = AUTH_BCRYPT_GENSALT_LOG2_ROUNDS.setInt(rounds);
         try
         {
-            System.setProperty(GENSALT_LOG2_ROUNDS_PROPERTY, rounds.toString());
             getGensaltLogRounds();
-            Assert.fail("Property " + GENSALT_LOG2_ROUNDS_PROPERTY + " must be in interval [4,30]");
+            Assert.fail("Property " + AUTH_BCRYPT_GENSALT_LOG2_ROUNDS.getKey() + " must be in interval [4,30]");
         }
         finally
         {
             if (oldProperty != null)
-                System.setProperty(GENSALT_LOG2_ROUNDS_PROPERTY, oldProperty);
+                AUTH_BCRYPT_GENSALT_LOG2_ROUNDS.setInt(oldProperty);
             else
-                System.clearProperty(GENSALT_LOG2_ROUNDS_PROPERTY);
+                AUTH_BCRYPT_GENSALT_LOG2_ROUNDS.clearValue();
         }
     }
 
diff --git a/test/unit/org/apache/cassandra/auth/jmx/JMXAuthTest.java b/test/unit/org/apache/cassandra/auth/jmx/JMXAuthTest.java
index 3bc28a9e30..fece405f5f 100644
--- a/test/unit/org/apache/cassandra/auth/jmx/JMXAuthTest.java
+++ b/test/unit/org/apache/cassandra/auth/jmx/JMXAuthTest.java
@@ -43,6 +43,10 @@ import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.db.ColumnFamilyStoreMBean;
 import org.apache.cassandra.utils.JMXServerUtils;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_JMX_AUTHORIZER;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_JMX_REMOTE_LOGIN_CONFIG;
+import static org.apache.cassandra.config.CassandraRelevantProperties.COM_SUN_MANAGEMENT_JMXREMOTE_AUTHENTICATE;
+import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_SECURITY_AUTH_LOGIN_CONFIG;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
@@ -86,10 +90,10 @@ public class JMXAuthTest extends CQLTester
     private static void setupJMXServer() throws Exception
     {
         String config = Paths.get(ClassLoader.getSystemResource("auth/cassandra-test-jaas.conf").toURI()).toString();
-        System.setProperty("com.sun.management.jmxremote.authenticate", "true");
-        System.setProperty("java.security.auth.login.config", config);
-        System.setProperty("cassandra.jmx.remote.login.config", "TestLogin");
-        System.setProperty("cassandra.jmx.authorizer", NoSuperUserAuthorizationProxy.class.getName());
+        COM_SUN_MANAGEMENT_JMXREMOTE_AUTHENTICATE.setBoolean(true);
+        JAVA_SECURITY_AUTH_LOGIN_CONFIG.setString(config);
+        CASSANDRA_JMX_REMOTE_LOGIN_CONFIG.setString("TestLogin");
+        CASSANDRA_JMX_AUTHORIZER.setString(NoSuperUserAuthorizationProxy.class.getName());
         jmxServer = JMXServerUtils.createJMXServer(9999, "localhost", true);
         jmxServer.start();
 
diff --git a/test/unit/org/apache/cassandra/config/CassandraRelevantPropertiesTest.java b/test/unit/org/apache/cassandra/config/CassandraRelevantPropertiesTest.java
index de6e0d21f2..ee8d2cb632 100644
--- a/test/unit/org/apache/cassandra/config/CassandraRelevantPropertiesTest.java
+++ b/test/unit/org/apache/cassandra/config/CassandraRelevantPropertiesTest.java
@@ -18,26 +18,50 @@
 
 package org.apache.cassandra.config;
 
+import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.assertj.core.api.Assertions;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_CASSANDRA_RELEVANT_PROPERTIES;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+// checkstyle: suppress below 'blockSystemPropertyUsage'
+
 public class CassandraRelevantPropertiesTest
 {
-    private static final CassandraRelevantProperties TEST_PROP = CassandraRelevantProperties.ORG_APACHE_CASSANDRA_CONF_CASSANDRA_RELEVANT_PROPERTIES_TEST;
+    @Before
+    public void setup()
+    {
+        System.clearProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey());
+    }
+
+    @Test
+    public void testSystemPropertyisSet() {
+        try
+        {
+            TEST_CASSANDRA_RELEVANT_PROPERTIES.setString("test");
+            Assertions.assertThat(System.getProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey())).isEqualTo("test"); // checkstyle: suppress nearby 'blockSystemPropertyUsage'
+        }
+        finally
+        {
+            TEST_CASSANDRA_RELEVANT_PROPERTIES.clearValue();
+        }
+    }
 
     @Test
     public void testString()
     {
         try
         {
-            System.setProperty(TEST_PROP.getKey(), "some-string");
-            Assertions.assertThat(TEST_PROP.getString()).isEqualTo("some-string");
+            System.setProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey(), "some-string");
+            Assertions.assertThat(TEST_CASSANDRA_RELEVANT_PROPERTIES.getString()).isEqualTo("some-string");
         }
         finally
         {
-            System.clearProperty(TEST_PROP.getKey());
+            System.clearProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey());
         }
     }
 
@@ -46,18 +70,18 @@ public class CassandraRelevantPropertiesTest
     {
         try
         {
-            System.setProperty(TEST_PROP.getKey(), "true");
-            Assertions.assertThat(TEST_PROP.getBoolean()).isEqualTo(true);
-            System.setProperty(TEST_PROP.getKey(), "false");
-            Assertions.assertThat(TEST_PROP.getBoolean()).isEqualTo(false);
-            System.setProperty(TEST_PROP.getKey(), "junk");
-            Assertions.assertThat(TEST_PROP.getBoolean()).isEqualTo(false);
-            System.setProperty(TEST_PROP.getKey(), "");
-            Assertions.assertThat(TEST_PROP.getBoolean()).isEqualTo(false);
+            System.setProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey(), "true");
+            Assertions.assertThat(TEST_CASSANDRA_RELEVANT_PROPERTIES.getBoolean()).isEqualTo(true);
+            System.setProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey(), "false");
+            Assertions.assertThat(TEST_CASSANDRA_RELEVANT_PROPERTIES.getBoolean()).isEqualTo(false);
+            System.setProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey(), "junk");
+            Assertions.assertThat(TEST_CASSANDRA_RELEVANT_PROPERTIES.getBoolean()).isEqualTo(false);
+            System.setProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey(), "");
+            Assertions.assertThat(TEST_CASSANDRA_RELEVANT_PROPERTIES.getBoolean()).isEqualTo(false);
         }
         finally
         {
-            System.clearProperty(TEST_PROP.getKey());
+            System.clearProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey());
         }
     }
 
@@ -66,11 +90,11 @@ public class CassandraRelevantPropertiesTest
     {
         try
         {
-            TEST_PROP.getBoolean();
+            TEST_CASSANDRA_RELEVANT_PROPERTIES.getBoolean();
         }
         finally
         {
-            System.clearProperty(TEST_PROP.getKey());
+            System.clearProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey());
         }
     }
 
@@ -79,12 +103,12 @@ public class CassandraRelevantPropertiesTest
     {
         try
         {
-            System.setProperty(TEST_PROP.getKey(), "123456789");
-            Assertions.assertThat(TEST_PROP.getInt()).isEqualTo(123456789);
+            System.setProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey(), "123456789");
+            Assertions.assertThat(TEST_CASSANDRA_RELEVANT_PROPERTIES.getInt()).isEqualTo(123456789);
         }
         finally
         {
-            System.clearProperty(TEST_PROP.getKey());
+            System.clearProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey());
         }
     }
 
@@ -93,12 +117,12 @@ public class CassandraRelevantPropertiesTest
     {
         try
         {
-            System.setProperty(TEST_PROP.getKey(), "0x1234567a");
-            Assertions.assertThat(TEST_PROP.getInt()).isEqualTo(305419898);
+            System.setProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey(), "0x1234567a");
+            Assertions.assertThat(TEST_CASSANDRA_RELEVANT_PROPERTIES.getInt()).isEqualTo(305419898);
         }
         finally
         {
-            System.clearProperty(TEST_PROP.getKey());
+            System.clearProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey());
         }
     }
 
@@ -107,12 +131,12 @@ public class CassandraRelevantPropertiesTest
     {
         try
         {
-            System.setProperty(TEST_PROP.getKey(), "01234567");
-            Assertions.assertThat(TEST_PROP.getInt()).isEqualTo(342391);
+            System.setProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey(), "01234567");
+            Assertions.assertThat(TEST_CASSANDRA_RELEVANT_PROPERTIES.getInt()).isEqualTo(342391);
         }
         finally
         {
-            System.clearProperty(TEST_PROP.getKey());
+            System.clearProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey());
         }
     }
 
@@ -121,25 +145,35 @@ public class CassandraRelevantPropertiesTest
     {
         try
         {
-            System.setProperty(TEST_PROP.getKey(), "");
-            Assertions.assertThat(TEST_PROP.getInt()).isEqualTo(342391);
+            System.setProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey(), "");
+            Assertions.assertThat(TEST_CASSANDRA_RELEVANT_PROPERTIES.getInt()).isEqualTo(342391);
         }
         finally
         {
-            System.clearProperty(TEST_PROP.getKey());
+            System.clearProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey());
         }
     }
 
-    @Test(expected = NullPointerException.class)
+    @Test(expected = ConfigurationException.class)
     public void testInteger_null()
     {
         try
         {
-            TEST_PROP.getInt();
+            TEST_CASSANDRA_RELEVANT_PROPERTIES.getInt();
         }
         finally
         {
-            System.clearProperty(TEST_PROP.getKey());
+            System.clearProperty(TEST_CASSANDRA_RELEVANT_PROPERTIES.getKey());
         }
     }
+
+    @Test
+    public void testClearProperty()
+    {
+        assertNull(TEST_CASSANDRA_RELEVANT_PROPERTIES.getString());
+        TEST_CASSANDRA_RELEVANT_PROPERTIES.setString("test");
+        assertEquals("test", TEST_CASSANDRA_RELEVANT_PROPERTIES.getString());
+        TEST_CASSANDRA_RELEVANT_PROPERTIES.clearValue();
+        assertNull(TEST_CASSANDRA_RELEVANT_PROPERTIES.getString());
+    }
 }
diff --git a/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java b/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java
index d4a6feb689..e4a44452e6 100644
--- a/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java
+++ b/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java
@@ -37,6 +37,9 @@ import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.assertj.core.api.Assertions;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.ALLOW_UNLIMITED_CONCURRENT_VALIDATIONS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CONFIG_LOADER;
+import static org.apache.cassandra.config.CassandraRelevantProperties.PARTITIONER;
 import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.KIBIBYTES;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -63,7 +66,7 @@ public class DatabaseDescriptorTest
 
         // Now try custom loader
         ConfigurationLoader testLoader = new TestLoader();
-        System.setProperty("cassandra.config.loader", testLoader.getClass().getName());
+        CONFIG_LOADER.setString(testLoader.getClass().getName());
 
         config = DatabaseDescriptor.loadConfig();
         assertEquals("ConfigurationLoader Test", config.cluster_name);
@@ -233,11 +236,9 @@ public class DatabaseDescriptorTest
     @Test
     public void testInvalidPartitionPropertyOverride() throws Exception
     {
-        String key = Config.PROPERTY_PREFIX + "partitioner";
-        String previous = System.getProperty(key);
+        String previous = PARTITIONER.setString("ThisDoesNotExist");
         try
         {
-            System.setProperty(key, "ThisDoesNotExist");
             Config testConfig = DatabaseDescriptor.loadConfig();
             testConfig.partitioner = "Murmur3Partitioner";
 
@@ -259,13 +260,9 @@ public class DatabaseDescriptorTest
         finally
         {
             if (previous == null)
-            {
-                System.getProperties().remove(key);
-            }
+                PARTITIONER.clearValue();
             else
-            {
-                System.setProperty(key, previous);
-            }
+                PARTITIONER.setString(previous);
         }
     }
 
@@ -504,7 +501,7 @@ public class DatabaseDescriptorTest
         catch (ConfigurationException e)
         {
             assertThat(e.getMessage()).isEqualTo("To set concurrent_validations > concurrent_compactors, " +
-                                                 "set the system property cassandra.allow_unlimited_concurrent_validations=true");
+                                                 "set the system property -D" + ALLOW_UNLIMITED_CONCURRENT_VALIDATIONS.getKey() + "=true");
         }
 
         // unless we disable that check (done with a system property at startup or via JMX)
diff --git a/test/unit/org/apache/cassandra/config/LoadOldYAMLBackwardCompatibilityTest.java b/test/unit/org/apache/cassandra/config/LoadOldYAMLBackwardCompatibilityTest.java
index e0ce161fed..8554ed4b20 100644
--- a/test/unit/org/apache/cassandra/config/LoadOldYAMLBackwardCompatibilityTest.java
+++ b/test/unit/org/apache/cassandra/config/LoadOldYAMLBackwardCompatibilityTest.java
@@ -23,6 +23,7 @@ import java.util.concurrent.TimeUnit;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_CONFIG;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
@@ -33,7 +34,7 @@ public class LoadOldYAMLBackwardCompatibilityTest
     @BeforeClass
     public static void setupDatabaseDescriptor()
     {
-        System.setProperty("cassandra.config", "cassandra-old.yaml");
+        CASSANDRA_CONFIG.setString("cassandra-old.yaml");
         DatabaseDescriptor.daemonInitialization();
     }
 
diff --git a/test/unit/org/apache/cassandra/config/OverrideConfigurationLoader.java b/test/unit/org/apache/cassandra/config/OverrideConfigurationLoader.java
index 2ffe91b439..7a8b14ecbd 100644
--- a/test/unit/org/apache/cassandra/config/OverrideConfigurationLoader.java
+++ b/test/unit/org/apache/cassandra/config/OverrideConfigurationLoader.java
@@ -22,6 +22,8 @@ import java.util.function.Consumer;
 
 import org.apache.cassandra.exceptions.ConfigurationException;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CONFIG_LOADER;
+
 /**
  * Helper class for programmatically overriding individual config values before DatabaseDescriptor is bootstrapped.
  */
@@ -40,7 +42,7 @@ public class OverrideConfigurationLoader implements ConfigurationLoader
 
     public static void override(Consumer<Config> modifier)
     {
-        System.setProperty(Config.PROPERTY_PREFIX + "config.loader", OverrideConfigurationLoader.class.getName());
+        CONFIG_LOADER.setString(OverrideConfigurationLoader.class.getName());
         configModifier = modifier;
     }
 }
diff --git a/test/unit/org/apache/cassandra/config/YamlConfigurationLoaderTest.java b/test/unit/org/apache/cassandra/config/YamlConfigurationLoaderTest.java
index 06be1dc209..b46d2ea424 100644
--- a/test/unit/org/apache/cassandra/config/YamlConfigurationLoaderTest.java
+++ b/test/unit/org/apache/cassandra/config/YamlConfigurationLoaderTest.java
@@ -91,21 +91,19 @@ public class YamlConfigurationLoaderTest
         // the reason is that its not a scalar but a complex type (collection type), so the map we use needs to have a collection to match.
         // It is possible that we define a common string representation for these types so they can be written to; this
         // is an issue that SettingsTable may need to worry about.
-        try (WithProperties ignore = new WithProperties(CONFIG_ALLOW_SYSTEM_PROPERTIES.getKey(), "true",
-                                                        SYSTEM_PROPERTY_PREFIX + "storage_port", "123",
-                                                        SYSTEM_PROPERTY_PREFIX + "commitlog_sync", "batch",
-                                                        SYSTEM_PROPERTY_PREFIX + "seed_provider.class_name", "org.apache.cassandra.locator.SimpleSeedProvider",
-//                                                        PROPERTY_PREFIX + "client_encryption_options.cipher_suites", "[\"FakeCipher\"]",
-                                                        SYSTEM_PROPERTY_PREFIX + "client_encryption_options.optional", "false",
-                                                        SYSTEM_PROPERTY_PREFIX + "client_encryption_options.enabled", "true",
-                                                        SYSTEM_PROPERTY_PREFIX + "doesnotexist", "true"
-        ))
+        try (WithProperties ignore = new WithProperties()
+                                     .set(CONFIG_ALLOW_SYSTEM_PROPERTIES, true)
+                                     .with(SYSTEM_PROPERTY_PREFIX + "storage_port", "123",
+                                           SYSTEM_PROPERTY_PREFIX + "commitlog_sync", "batch",
+                                           SYSTEM_PROPERTY_PREFIX + "seed_provider.class_name", "org.apache.cassandra.locator.SimpleSeedProvider",
+                                           SYSTEM_PROPERTY_PREFIX + "client_encryption_options.optional", Boolean.FALSE.toString(),
+                                           SYSTEM_PROPERTY_PREFIX + "client_encryption_options.enabled", Boolean.TRUE.toString(),
+                                           SYSTEM_PROPERTY_PREFIX + "doesnotexist", Boolean.TRUE.toString()))
         {
             Config config = YamlConfigurationLoader.fromMap(Collections.emptyMap(), true, Config.class);
             assertThat(config.storage_port).isEqualTo(123);
             assertThat(config.commitlog_sync).isEqualTo(Config.CommitLogSync.batch);
             assertThat(config.seed_provider.class_name).isEqualTo("org.apache.cassandra.locator.SimpleSeedProvider");
-//            assertThat(config.client_encryption_options.cipher_suites).isEqualTo(Collections.singletonList("FakeCipher"));
             assertThat(config.client_encryption_options.optional).isFalse();
             assertThat(config.client_encryption_options.enabled).isTrue();
         }
diff --git a/test/unit/org/apache/cassandra/cql3/CQLTester.java b/test/unit/org/apache/cassandra/cql3/CQLTester.java
index 7998d4bd56..0eb97d37bc 100644
--- a/test/unit/org/apache/cassandra/cql3/CQLTester.java
+++ b/test/unit/org/apache/cassandra/cql3/CQLTester.java
@@ -26,7 +26,21 @@ import java.net.MalformedURLException;
 import java.net.ServerSocket;
 import java.nio.ByteBuffer;
 import java.rmi.server.RMISocketFactory;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.UUID;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -34,7 +48,6 @@ import java.util.function.Consumer;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
-
 import javax.management.MBeanServerConnection;
 import javax.management.remote.JMXConnector;
 import javax.management.remote.JMXConnectorFactory;
@@ -46,18 +59,27 @@ import com.google.common.base.Objects;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
-
-import org.junit.*;
-
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.codahale.metrics.Gauge;
-import com.datastax.driver.core.*;
+import com.datastax.driver.core.CloseFuture;
+import com.datastax.driver.core.Cluster;
+import com.datastax.driver.core.ColumnDefinitions;
 import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.NettyOptions;
 import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Session;
+import com.datastax.driver.core.SimpleStatement;
+import com.datastax.driver.core.SocketOptions;
+import com.datastax.driver.core.Statement;
 import com.datastax.driver.core.exceptions.UnauthorizedException;
-
 import com.datastax.shaded.netty.channel.EventLoopGroup;
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.ServerTestUtils;
@@ -71,52 +93,84 @@ import org.apache.cassandra.concurrent.ScheduledExecutors;
 import org.apache.cassandra.concurrent.Stage;
 import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.config.DataStorageSpec;
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.EncryptionOptions;
+import org.apache.cassandra.cql3.functions.FunctionName;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.Directories;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.SystemKeyspace;
+import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.db.marshal.BooleanType;
+import org.apache.cassandra.db.marshal.ByteType;
+import org.apache.cassandra.db.marshal.BytesType;
+import org.apache.cassandra.db.marshal.CollectionType;
+import org.apache.cassandra.db.marshal.DecimalType;
+import org.apache.cassandra.db.marshal.DoubleType;
+import org.apache.cassandra.db.marshal.DurationType;
+import org.apache.cassandra.db.marshal.FloatType;
+import org.apache.cassandra.db.marshal.InetAddressType;
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.db.marshal.IntegerType;
+import org.apache.cassandra.db.marshal.ListType;
+import org.apache.cassandra.db.marshal.LongType;
+import org.apache.cassandra.db.marshal.MapType;
+import org.apache.cassandra.db.marshal.SetType;
+import org.apache.cassandra.db.marshal.ShortType;
+import org.apache.cassandra.db.marshal.TimeUUIDType;
+import org.apache.cassandra.db.marshal.TimestampType;
+import org.apache.cassandra.db.marshal.TupleType;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.db.marshal.UUIDType;
 import org.apache.cassandra.db.virtual.VirtualKeyspaceRegistry;
 import org.apache.cassandra.db.virtual.VirtualSchemaKeyspace;
+import org.apache.cassandra.dht.Murmur3Partitioner;
+import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.exceptions.SyntaxException;
 import org.apache.cassandra.index.SecondaryIndexManager;
 import org.apache.cassandra.io.filesystem.ListenableFileSystem;
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileSystems;
+import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.TokenMetadata;
 import org.apache.cassandra.metrics.CassandraMetricsRegistry;
 import org.apache.cassandra.metrics.ClientMetrics;
-import org.apache.cassandra.schema.*;
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.cql3.functions.FunctionName;
-import org.apache.cassandra.db.*;
-import org.apache.cassandra.db.marshal.*;
-import org.apache.cassandra.db.marshal.TupleType;
-import org.apache.cassandra.dht.Murmur3Partitioner;
-import org.apache.cassandra.exceptions.ConfigurationException;
-import org.apache.cassandra.exceptions.SyntaxException;
-import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.schema.IndexMetadata;
 import org.apache.cassandra.schema.KeyspaceMetadata;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.serializers.TypeSerializer;
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.service.StorageService;
-import org.apache.cassandra.transport.*;
+import org.apache.cassandra.transport.Event;
+import org.apache.cassandra.transport.Message;
 import org.apache.cassandra.transport.ProtocolVersion;
+import org.apache.cassandra.transport.Server;
+import org.apache.cassandra.transport.SimpleClient;
 import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JMXServerUtils;
+import org.apache.cassandra.utils.Pair;
 import org.apache.cassandra.utils.TimeUUID;
 import org.assertj.core.api.Assertions;
-import org.apache.cassandra.utils.Pair;
 import org.awaitility.Awaitility;
 
-import static com.datastax.driver.core.SocketOptions.DEFAULT_CONNECT_TIMEOUT_MILLIS;
-import static com.datastax.driver.core.SocketOptions.DEFAULT_READ_TIMEOUT_MILLIS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_JMX_LOCAL_PORT;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_DRIVER_CONNECTION_TIMEOUT_MS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_DRIVER_READ_TIMEOUT_MS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_REUSE_PREPARED;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_ROW_CACHE_SIZE;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_USE_PREPARED;
 import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -134,9 +188,9 @@ public abstract class CQLTester
 
     public static final String KEYSPACE = "cql_test_keyspace";
     public static final String KEYSPACE_PER_TEST = "cql_test_keyspace_alt";
-    protected static final boolean USE_PREPARED_VALUES = Boolean.valueOf(System.getProperty("cassandra.test.use_prepared", "true"));
-    protected static final boolean REUSE_PREPARED = Boolean.valueOf(System.getProperty("cassandra.test.reuse_prepared", "true"));
-    protected static final long ROW_CACHE_SIZE_IN_MIB = new DataStorageSpec.LongMebibytesBound(System.getProperty("cassandra.test.row_cache_size", "0MiB")).toMebibytes();
+    protected static final boolean USE_PREPARED_VALUES = TEST_USE_PREPARED.getBoolean();
+    protected static final boolean REUSE_PREPARED = TEST_REUSE_PREPARED.getBoolean();
+    protected static final long ROW_CACHE_SIZE_IN_MIB = new DataStorageSpec.LongMebibytesBound(TEST_ROW_CACHE_SIZE.getString("0MiB")).toMebibytes();
     private static final AtomicInteger seqNumber = new AtomicInteger();
     protected static final ByteBuffer TOO_BIG = ByteBuffer.allocate(FBUtilities.MAX_UNSIGNED_SHORT + 1024);
     public static final String DATA_CENTER = ServerTestUtils.DATA_CENTER;
@@ -444,7 +498,7 @@ public abstract class CQLTester
 
     public static List<String> buildNodetoolArgs(List<String> args)
     {
-        int port = jmxPort == 0 ? Integer.getInteger("cassandra.jmx.local.port", 7199) : jmxPort;
+        int port = jmxPort == 0 ? CASSANDRA_JMX_LOCAL_PORT.getInt(7199) : jmxPort;
         String host = jmxHost == null ? "127.0.0.1" : jmxHost;
         List<String> allArgs = new ArrayList<>();
         allArgs.add("bin/nodetool");
@@ -577,10 +631,8 @@ public abstract class CQLTester
     private static Cluster initClientCluster(User user, ProtocolVersion version)
     {
         SocketOptions socketOptions =
-                new SocketOptions().setConnectTimeoutMillis(Integer.getInteger("cassandra.test.driver.connection_timeout_ms",
-                                                                               DEFAULT_CONNECT_TIMEOUT_MILLIS)) // default is 5000
-                                   .setReadTimeoutMillis(Integer.getInteger("cassandra.test.driver.read_timeout_ms",
-                                                                            DEFAULT_READ_TIMEOUT_MILLIS)); // default is 12000
+                new SocketOptions().setConnectTimeoutMillis(TEST_DRIVER_CONNECTION_TIMEOUT_MS.getInt()) // default is 5000
+                                   .setReadTimeoutMillis(TEST_DRIVER_READ_TIMEOUT_MS.getInt()); // default is 12000
 
         logger.info("Timeouts: {} / {}", socketOptions.getConnectTimeoutMillis(), socketOptions.getReadTimeoutMillis());
 
diff --git a/test/unit/org/apache/cassandra/cql3/PagingTest.java b/test/unit/org/apache/cassandra/cql3/PagingTest.java
index a3387c4e20..75d73e5d0d 100644
--- a/test/unit/org/apache/cassandra/cql3/PagingTest.java
+++ b/test/unit/org/apache/cassandra/cql3/PagingTest.java
@@ -38,6 +38,7 @@ import org.apache.cassandra.service.EmbeddedCassandraService;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_CONFIG;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertEquals;
 
@@ -57,7 +58,7 @@ public class PagingTest
     @BeforeClass
     public static void setup() throws Exception
     {
-        System.setProperty("cassandra.config", "cassandra-murmur.yaml");
+        CASSANDRA_CONFIG.setString("cassandra-murmur.yaml");
 
         cassandra = ServerTestUtils.startEmbeddedCassandraService();
 
diff --git a/test/unit/org/apache/cassandra/cql3/ViewFiltering1Test.java b/test/unit/org/apache/cassandra/cql3/ViewFiltering1Test.java
index dac730cb16..93b09241ae 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewFiltering1Test.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewFiltering1Test.java
@@ -31,6 +31,8 @@ import org.apache.cassandra.Util;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.MV_ALLOW_FILTERING_NONKEY_COLUMNS_UNSAFE;
+
 /* ViewFilteringTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670, CASSANDRA-17167)
  * Any changes here check if they apply to the other classes
  * - ViewFilteringPKTest
@@ -46,13 +48,13 @@ public class ViewFiltering1Test extends ViewAbstractParameterizedTest
     public static void startup()
     {
         ViewAbstractParameterizedTest.startup();
-        System.setProperty("cassandra.mv.allow_filtering_nonkey_columns_unsafe", "true");
+        MV_ALLOW_FILTERING_NONKEY_COLUMNS_UNSAFE.setBoolean(true);
     }
 
     @AfterClass
     public static void tearDown()
     {
-        System.setProperty("cassandra.mv.allow_filtering_nonkey_columns_unsafe", "false");
+        MV_ALLOW_FILTERING_NONKEY_COLUMNS_UNSAFE.setBoolean(false);
     }
 
     // TODO will revise the non-pk filter condition in MV, see CASSANDRA-11500
diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/UFSecurityTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/UFSecurityTest.java
index 96a0cbc329..fe1ec706e2 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/UFSecurityTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/UFSecurityTest.java
@@ -48,13 +48,13 @@ public class UFSecurityTest extends CQLTester
                                           "RETURNS NULL ON NULL INPUT " +
                                           "RETURNS double " +
                                           "LANGUAGE JAVA\n" +
-                                          "AS 'System.getProperty(\"foo.bar.baz\"); return 0d;';");
+                                          "AS 'System.getProperty(\"foo.bar.baz\"); return 0d;';"); // checkstyle: suppress nearby 'blockSystemPropertyUsage'
             execute("SELECT " + fName + "(dval) FROM %s WHERE key=1");
             Assert.fail();
         }
         catch (FunctionExecutionException e)
         {
-            assertAccessControlException("System.getProperty(\"foo.bar.baz\"); return 0d;", e);
+            assertAccessControlException("System.getProperty(\"foo.bar.baz\"); return 0d;", e); // checkstyle: suppress nearby 'blockSystemPropertyUsage'
         }
 
         String[] cfnSources =
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/TTLTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/TTLTest.java
index 014be9015d..9100a69b6f 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/TTLTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/TTLTest.java
@@ -45,6 +45,7 @@ import org.apache.cassandra.tools.ToolRunner;
 import org.apache.cassandra.tools.ToolRunner.ToolResult;
 import org.assertj.core.api.Assertions;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -403,8 +404,7 @@ public class TTLTest extends CQLTester
         }
         if (runSStableScrub)
         {
-            System.setProperty(org.apache.cassandra.tools.Util.ALLOW_TOOL_REINIT_FOR_TEST, "true"); // Necessary for testing
-
+            TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST.setBoolean(true);
             try
             {
                 ToolResult tool;
@@ -422,7 +422,7 @@ public class TTLTest extends CQLTester
             }
             finally
             {
-                System.clearProperty(org.apache.cassandra.tools.Util.ALLOW_TOOL_REINIT_FOR_TEST);
+                TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST.clearValue();
             }
         }
 
diff --git a/test/unit/org/apache/cassandra/db/RowCacheTest.java b/test/unit/org/apache/cassandra/db/RowCacheTest.java
index 0bf8c5df08..4b37e69414 100644
--- a/test/unit/org/apache/cassandra/db/RowCacheTest.java
+++ b/test/unit/org/apache/cassandra/db/RowCacheTest.java
@@ -54,6 +54,7 @@ import org.apache.cassandra.service.CacheService;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_ORG_CAFFINITAS_OHC_SEGMENTCOUNT;
 import static org.junit.Assert.*;
 
 public class RowCacheTest
@@ -66,7 +67,7 @@ public class RowCacheTest
     @BeforeClass
     public static void defineSchema() throws ConfigurationException
     {
-        System.setProperty("org.caffinitas.ohc.segmentCount", "16");
+        TEST_ORG_CAFFINITAS_OHC_SEGMENTCOUNT.setInt(16);
         SchemaLoader.prepareServer();
         SchemaLoader.createKeyspace(KEYSPACE_CACHED,
                                     KeyspaceParams.simple(1),
diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitLogFailurePolicyTest.java b/test/unit/org/apache/cassandra/db/commitlog/CommitLogFailurePolicyTest.java
index aadd2fda3b..3dc4e5f69e 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/CommitLogFailurePolicyTest.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/CommitLogFailurePolicyTest.java
@@ -32,13 +32,15 @@ import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.KillerForTests;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.COMMITLOG_STOP_ON_ERRORS;
+
 public class CommitLogFailurePolicyTest
 {
     @BeforeClass
     public static void defineSchema() throws ConfigurationException
     {
         SchemaLoader.prepareServer();
-        System.setProperty("cassandra.commitlog.stop_on_errors", "true");
+        COMMITLOG_STOP_ON_ERRORS.setBoolean(true);
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitLogTest.java b/test/unit/org/apache/cassandra/db/commitlog/CommitLogTest.java
index c2dc54ed45..764a497913 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/CommitLogTest.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/CommitLogTest.java
@@ -1,21 +1,21 @@
 /*
-* 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.
-*/
+ * 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.cassandra.db.commitlog;
 
 import org.apache.cassandra.io.util.File;
@@ -41,6 +41,7 @@ import com.google.common.collect.Iterables;
 import com.google.common.io.Files;
 
 import org.apache.cassandra.io.util.FileOutputStreamPlus;
+
 import org.junit.*;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -87,7 +88,7 @@ import org.apache.cassandra.utils.Pair;
 import org.apache.cassandra.utils.vint.VIntCoding;
 
 import static java.lang.String.format;
-import static java.lang.System.setProperty;
+import static org.apache.cassandra.config.CassandraRelevantProperties.COMMITLOG_IGNORE_REPLAY_ERRORS;
 import static org.apache.cassandra.config.CassandraRelevantProperties.COMMIT_LOG_REPLAY_LIST;
 import static org.apache.cassandra.db.commitlog.CommitLogSegment.ENTRY_OVERHEAD_SIZE;
 import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
@@ -130,14 +131,14 @@ public abstract class CommitLogTest
     public static Collection<Object[]> generateData() throws Exception
     {
         return Arrays.asList(new Object[][]
-        {
-            { null, EncryptionContextGenerator.createDisabledContext()}, // No compression, no encryption
-            { null, newEncryptionContext() }, // Encryption
-            { new ParameterizedClass(LZ4Compressor.class.getName(), Collections.emptyMap()), EncryptionContextGenerator.createDisabledContext() },
-            { new ParameterizedClass(SnappyCompressor.class.getName(), Collections.emptyMap()), EncryptionContextGenerator.createDisabledContext()},
-            { new ParameterizedClass(DeflateCompressor.class.getName(), Collections.emptyMap()), EncryptionContextGenerator.createDisabledContext()},
-            { new ParameterizedClass(ZstdCompressor.class.getName(), Collections.emptyMap()), EncryptionContextGenerator.createDisabledContext()}
-        });
+                             {
+                             { null, EncryptionContextGenerator.createDisabledContext() }, // No compression, no encryption
+                             { null, newEncryptionContext() }, // Encryption
+                             { new ParameterizedClass(LZ4Compressor.class.getName(), Collections.emptyMap()), EncryptionContextGenerator.createDisabledContext() },
+                             { new ParameterizedClass(SnappyCompressor.class.getName(), Collections.emptyMap()), EncryptionContextGenerator.createDisabledContext() },
+                             { new ParameterizedClass(DeflateCompressor.class.getName(), Collections.emptyMap()), EncryptionContextGenerator.createDisabledContext() },
+                             { new ParameterizedClass(ZstdCompressor.class.getName(), Collections.emptyMap()), EncryptionContextGenerator.createDisabledContext() }
+                             });
     }
 
     private static EncryptionContext newEncryptionContext() throws Exception
@@ -161,12 +162,12 @@ public abstract class CommitLogTest
         MemtableParams skipListMemtable = MemtableParams.get("skiplist");
 
         TableMetadata.Builder custom =
-            TableMetadata.builder(KEYSPACE1, CUSTOM1)
-                         .addPartitionKeyColumn("k", IntegerType.instance)
-                         .addClusteringColumn("c1", MapType.getInstance(UTF8Type.instance, UTF8Type.instance, false))
-                         .addClusteringColumn("c2", SetType.getInstance(UTF8Type.instance, false))
-                         .addStaticColumn("s", IntegerType.instance)
-                         .memtable(skipListMemtable);
+        TableMetadata.builder(KEYSPACE1, CUSTOM1)
+                     .addPartitionKeyColumn("k", IntegerType.instance)
+                     .addClusteringColumn("c1", MapType.getInstance(UTF8Type.instance, UTF8Type.instance, false))
+                     .addClusteringColumn("c2", SetType.getInstance(UTF8Type.instance, false))
+                     .addStaticColumn("s", IntegerType.instance)
+                     .memtable(skipListMemtable);
 
         SchemaLoader.createKeyspace(KEYSPACE1,
                                     KeyspaceParams.simple(1),
@@ -215,7 +216,7 @@ public abstract class CommitLogTest
     public void afterTest()
     {
         CommitLogSegmentReader.setAllowSkipSyncMarkerCrc(false);
-        System.clearProperty("cassandra.replayList");
+        COMMIT_LOG_REPLAY_LIST.clearValue();
         testKiller.reset();
     }
 
@@ -336,11 +337,14 @@ public abstract class CommitLogTest
     @Test
     public void testRecoveryWithGarbageLog_ignoredByProperty() throws Exception
     {
-        try {
-            System.setProperty(CommitLogReplayer.IGNORE_REPLAY_ERRORS_PROPERTY, "true");
+        try
+        {
+            COMMITLOG_IGNORE_REPLAY_ERRORS.setBoolean(true);
             testRecoveryWithGarbageLog();
-        } finally {
-            System.clearProperty(CommitLogReplayer.IGNORE_REPLAY_ERRORS_PROPERTY);
+        }
+        finally
+        {
+            COMMITLOG_IGNORE_REPLAY_ERRORS.clearValue();
         }
     }
 
@@ -403,10 +407,10 @@ public abstract class CommitLogTest
         ColumnFamilyStore cfs2 = ks.getColumnFamilyStore(STANDARD2);
 
         // Roughly 32 MiB mutation
-         Mutation rm = new RowUpdateBuilder(cfs1.metadata(), 0, "k")
-                  .clustering("bytes")
-                  .add("val", ByteBuffer.allocate((DatabaseDescriptor.getCommitLogSegmentSize()/4) - 1))
-                  .build();
+        Mutation rm = new RowUpdateBuilder(cfs1.metadata(), 0, "k")
+                      .clustering("bytes")
+                      .add("val", ByteBuffer.allocate((DatabaseDescriptor.getCommitLogSegmentSize() / 4) - 1))
+                      .build();
 
         // Adding it twice (won't change segment)
         CommitLog.instance.add(rm);
@@ -524,6 +528,7 @@ public abstract class CommitLogTest
         }
         throw new AssertionError("mutation larger than limit was accepted");
     }
+
     @Test
     public void testExceedRecordLimitWithMultiplePartitions() throws Exception
     {
@@ -558,9 +563,9 @@ public abstract class CommitLogTest
 
             long mutationSize = mutation.serializedSize(MessagingService.current_version) + ENTRY_OVERHEAD_SIZE;
             final String expectedMessagePrefix = format("Rejected an oversized mutation (%d/%d) for keyspace: %s.",
-                                                               mutationSize,
-                                                               DatabaseDescriptor.getMaxMutationSize(),
-                                                               KEYSPACE1);
+                                                        mutationSize,
+                                                        DatabaseDescriptor.getMaxMutationSize(),
+                                                        KEYSPACE1);
             assertTrue(message.startsWith(expectedMessagePrefix));
             assertTrue(message.contains(format("%s.%s and 1 more.", STANDARD1, key)));
         }
@@ -734,7 +739,7 @@ public abstract class CommitLogTest
                           .add("val", ByteBuffer.allocate(DatabaseDescriptor.getCommitLogSegmentSize() / 4))
                           .build();
 
-            for (int i = 0 ; i < 5 ; i++)
+            for (int i = 0; i < 5; i++)
                 CommitLog.instance.add(m2);
 
             assertEquals(2, CommitLog.instance.segmentManager.getActiveSegments().size());
@@ -815,43 +820,22 @@ public abstract class CommitLogTest
     public void testReplayListProperty() throws Throwable
     {
         // only keyspace
-        assertReplay(2, () -> setProperty(COMMIT_LOG_REPLAY_LIST.getKey(), KEYSPACE1_REPLAY));
+        assertReplay(2, () -> COMMIT_LOG_REPLAY_LIST.setString(KEYSPACE1_REPLAY));
 
         // only keyspaces
-        assertReplay(3, () -> setProperty(COMMIT_LOG_REPLAY_LIST.getKey(),
-                                          format("%s,%s", KEYSPACE1_REPLAY, KEYSPACE2_REPLAY)));
+        assertReplay(3, () -> COMMIT_LOG_REPLAY_LIST.setString(format("%s,%s", KEYSPACE1_REPLAY, KEYSPACE2_REPLAY)));
 
         // only table with keyspace
-        assertReplay(1,
-                     () -> setProperty(COMMIT_LOG_REPLAY_LIST.getKey(),
-                                       format("%s.%s",
-                                              KEYSPACE1_REPLAY,
-                                              KEYSPACE1_REPLAY_TABLE1)));
+        assertReplay(1, () -> COMMIT_LOG_REPLAY_LIST.setString(format("%s.%s", KEYSPACE1_REPLAY, KEYSPACE1_REPLAY_TABLE1)));
 
         // mix of keyspace and tables with keyspaces
-        assertReplay(2,
-                     () -> setProperty(COMMIT_LOG_REPLAY_LIST.getKey(),
-                                       format("%s.%s,%s",
-                                              KEYSPACE1_REPLAY,
-                                              KEYSPACE1_REPLAY_TABLE1,
-                                              KEYSPACE2_REPLAY)));
+        assertReplay(2, () -> COMMIT_LOG_REPLAY_LIST.setString(format("%s.%s,%s", KEYSPACE1_REPLAY, KEYSPACE1_REPLAY_TABLE1, KEYSPACE2_REPLAY)));
 
         // only tables with keyspaces
-        assertReplay(2,
-                     () -> setProperty(COMMIT_LOG_REPLAY_LIST.getKey(),
-                                       format("%s.%s,%s.%s",
-                                              KEYSPACE1_REPLAY,
-                                              KEYSPACE1_REPLAY_TABLE1,
-                                              KEYSPACE2_REPLAY,
-                                              KEYSPACE2_REPLAY_TABLE2)));
+        assertReplay(2, () -> COMMIT_LOG_REPLAY_LIST.setString(format("%s.%s,%s.%s", KEYSPACE1_REPLAY, KEYSPACE1_REPLAY_TABLE1, KEYSPACE2_REPLAY, KEYSPACE2_REPLAY_TABLE2)));
 
         // mix of keyspace and tables with keyspaces within same keyspace.
-        assertReplay(2,
-                     () -> setProperty(COMMIT_LOG_REPLAY_LIST.getKey(),
-                                       format("%s.%s,%s",
-                                              KEYSPACE1_REPLAY,
-                                              KEYSPACE1_REPLAY_TABLE1,
-                                              KEYSPACE1_REPLAY)));
+        assertReplay(2, () -> COMMIT_LOG_REPLAY_LIST.setString(format("%s.%s,%s", KEYSPACE1_REPLAY, KEYSPACE1_REPLAY_TABLE1, KEYSPACE1_REPLAY)));
 
         // test for wrong formats
 
@@ -860,7 +844,7 @@ public abstract class CommitLogTest
         try
         {
             assertReplay(2,
-                         () -> setProperty(COMMIT_LOG_REPLAY_LIST.getKey(), invalidFormat));
+                         () -> COMMIT_LOG_REPLAY_LIST.setString(invalidFormat));
             fail(format("replay should fail on -D%s=%s as it is in invalid format",
                         COMMIT_LOG_REPLAY_LIST.getKey(), invalidFormat));
         }
@@ -877,7 +861,7 @@ public abstract class CommitLogTest
         try
         {
             assertReplay(2,
-                         () -> setProperty(COMMIT_LOG_REPLAY_LIST.getKey(), invalidFormat2));
+                         () -> COMMIT_LOG_REPLAY_LIST.setString(invalidFormat2));
             fail(format("replay should fail on -D%s=%s as it is in invalid format",
                         COMMIT_LOG_REPLAY_LIST.getKey(), invalidFormat2));
         }
@@ -923,20 +907,21 @@ public abstract class CommitLogTest
             ColumnFamilyStore ks2tb2 = Keyspace.open(KEYSPACE2_REPLAY).getColumnFamilyStore(KEYSPACE2_REPLAY_TABLE2);
 
             Mutation mutation1 = new RowUpdateBuilder(ks1tb1.metadata(), 0, "key1")
-            .clustering("c1").add("val", ByteBuffer.allocate(100)).build();
+                                 .clustering("c1").add("val", ByteBuffer.allocate(100)).build();
 
             Mutation mutation2 = new RowUpdateBuilder(ks1tb2.metadata(), 0, "key2")
-            .clustering("c2").add("val", ByteBuffer.allocate(100)).build();
+                                 .clustering("c2").add("val", ByteBuffer.allocate(100)).build();
 
             Mutation mutation3 = new RowUpdateBuilder(ks2tb2.metadata(), 0, "key3")
-            .clustering("c3").add("val", ByteBuffer.allocate(100)).build();
+                                 .clustering("c3").add("val", ByteBuffer.allocate(100)).build();
 
             CommitLog.instance.add(mutation1);
             CommitLog.instance.add(mutation2);
             CommitLog.instance.add(mutation3);
             CommitLog.instance.sync(true);
 
-            Map<TableId, IntervalSet<CommitLogPosition>> cfPersisted = new HashMap<TableId, IntervalSet<CommitLogPosition>>() {{
+            Map<TableId, IntervalSet<CommitLogPosition>> cfPersisted = new HashMap<TableId, IntervalSet<CommitLogPosition>>()
+            {{
                 put(ks1tb1.metadata().id, IntervalSet.empty());
                 put(ks1tb2.metadata().id, IntervalSet.empty());
                 put(ks2tb2.metadata().id, IntervalSet.empty());
@@ -1028,7 +1013,7 @@ public abstract class CommitLogTest
     {
         int cellCount = 0;
         int max = 1024;
-        int discardPosition = (int)(max * .8); // an arbitrary number of entries that we'll skip on the replay
+        int discardPosition = (int) (max * .8); // an arbitrary number of entries that we'll skip on the replay
         CommitLogPosition commitLogPosition = null;
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(STANDARD1);
 
@@ -1113,12 +1098,12 @@ public abstract class CommitLogTest
         {
             DatabaseDescriptor.setDiskFailurePolicy(DiskFailurePolicy.ignore);
 
-            for (int i = 0 ; i < 5 ; i++)
+            for (int i = 0; i < 5; i++)
             {
                 new RowUpdateBuilder(cfs.metadata(), 0, "k")
-                    .clustering("c" + i).add("val", ByteBuffer.allocate(100))
-                    .build()
-                    .apply();
+                .clustering("c" + i).add("val", ByteBuffer.allocate(100))
+                .build()
+                .apply();
 
                 if (i == 2)
                 {
@@ -1143,26 +1128,26 @@ public abstract class CommitLogTest
         }
 
         CommitLog.instance.sync(true);
-        System.setProperty("cassandra.replayList", KEYSPACE1 + "." + STANDARD1);
+        COMMIT_LOG_REPLAY_LIST.setString(KEYSPACE1 + '.' + STANDARD1);
         // Currently we don't attempt to re-flush a memtable that failed, thus make sure data is replayed by commitlog.
         // If retries work subsequent flushes should clear up error and this should change to expect 0.
         assertEquals(1, CommitLog.instance.resetUnsafe(false));
-        System.clearProperty("cassandra.replayList");
+        COMMIT_LOG_REPLAY_LIST.clearValue();
     }
 
     public void testOutOfOrderFlushRecovery(BiConsumer<ColumnFamilyStore, Memtable> flushAction, boolean performCompaction)
-            throws ExecutionException, InterruptedException, IOException
+    throws ExecutionException, InterruptedException, IOException
     {
         CommitLog.instance.resetUnsafe(true);
 
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(STANDARD1);
 
-        for (int i = 0 ; i < 5 ; i++)
+        for (int i = 0; i < 5; i++)
         {
             new RowUpdateBuilder(cfs.metadata(), 0, "k")
-                .clustering("c" + i).add("val", ByteBuffer.allocate(100))
-                .build()
-                .apply();
+            .clustering("c" + i).add("val", ByteBuffer.allocate(100))
+            .build()
+            .apply();
 
             Memtable current = cfs.getTracker().getView().getCurrentMemtable();
             if (i == 2)
@@ -1177,7 +1162,7 @@ public abstract class CommitLogTest
             reader.reloadSSTableMetadata();
 
         CommitLog.instance.sync(true);
-        System.setProperty("cassandra.replayList", KEYSPACE1 + "." + STANDARD1);
+        COMMIT_LOG_REPLAY_LIST.setString(KEYSPACE1 + '.' + STANDARD1);
         // In the absence of error, this should be 0 because forceBlockingFlush/forceRecycleAllSegments would have
         // persisted all data in the commit log. Because we know there was an error, there must be something left to
         // replay.
@@ -1256,12 +1241,12 @@ public abstract class CommitLogTest
 
         try
         {
-            System.setProperty(CommitLogReplayer.IGNORE_REPLAY_ERRORS_PROPERTY, "true");
+            COMMITLOG_IGNORE_REPLAY_ERRORS.setBoolean(true);
             replayed = CommitLog.instance.resetUnsafe(false);
         }
         finally
         {
-            System.clearProperty(CommitLogReplayer.IGNORE_REPLAY_ERRORS_PROPERTY);
+            COMMITLOG_IGNORE_REPLAY_ERRORS.clearValue();
         }
 
         assertEquals(replayed, 1);
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionIteratorTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionIteratorTest.java
index d170e49811..330e1c5200 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionIteratorTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionIteratorTest.java
@@ -17,6 +17,7 @@
  */
 package org.apache.cassandra.db.compaction;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.DIAGNOSTIC_SNAPSHOT_INTERVAL_NANOS;
 import static org.apache.cassandra.db.transform.DuplicateRowCheckerTest.assertCommandIssued;
 import static org.apache.cassandra.db.transform.DuplicateRowCheckerTest.makeRow;
 import static org.apache.cassandra.db.transform.DuplicateRowCheckerTest.partition;
@@ -460,7 +461,7 @@ public class CompactionIteratorTest extends CQLTester
     @Test
     public void duplicateRowsTest() throws Throwable
     {
-        System.setProperty("cassandra.diagnostic_snapshot_interval_nanos", "0");
+        DIAGNOSTIC_SNAPSHOT_INTERVAL_NANOS.setLong(0);
         // Create a table and insert some data. The actual rows read in the test will be synthetic
         // but this creates an sstable on disk to be snapshotted.
         createTable("CREATE TABLE %s (pk text, ck1 int, ck2 int, v int, PRIMARY KEY (pk, ck1, ck2))");
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
index 8745b908a5..e4a983f92e 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
@@ -95,7 +95,7 @@ public class CompactionsTest
         compactionOptions.put("tombstone_compaction_interval", "1");
 
         // Disable tombstone histogram rounding for tests
-        CassandraRelevantProperties.TOMBSTONE_HISTOGRAM_TTL_ROUND_SECONDS.setInt(1);
+        CassandraRelevantProperties.STREAMING_HISTOGRAM_ROUND_SECONDS.setInt(1);
 
         SchemaLoader.prepareServer();
 
diff --git a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java
index d6dfcd6c64..49f257b58a 100644
--- a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java
@@ -93,7 +93,7 @@ public class LeveledCompactionStrategyTest
     public static void defineSchema() throws ConfigurationException
     {
         // Disable tombstone histogram rounding for tests
-        CassandraRelevantProperties.TOMBSTONE_HISTOGRAM_TTL_ROUND_SECONDS.setInt(1);
+        CassandraRelevantProperties.STREAMING_HISTOGRAM_ROUND_SECONDS.setInt(1);
 
         SchemaLoader.prepareServer();
 
diff --git a/test/unit/org/apache/cassandra/db/compaction/NeverPurgeTest.java b/test/unit/org/apache/cassandra/db/compaction/NeverPurgeTest.java
index 42537319ff..3f5e4b6f5d 100644
--- a/test/unit/org/apache/cassandra/db/compaction/NeverPurgeTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/NeverPurgeTest.java
@@ -34,6 +34,7 @@ import org.apache.cassandra.db.rows.UnfilteredRowIterator;
 import org.apache.cassandra.io.sstable.ISSTableScanner;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.NEVER_PURGE_TOMBSTONES;
 import static org.junit.Assert.assertEquals;
 
 public class NeverPurgeTest extends CQLTester
@@ -41,7 +42,7 @@ public class NeverPurgeTest extends CQLTester
     @BeforeClass
     public static void setUpClass() // method name must match the @BeforeClass annotated method in CQLTester
     {
-        System.setProperty("cassandra.never_purge_tombstones", "true");
+        NEVER_PURGE_TOMBSTONES.setBoolean(true);
         CQLTester.setUpClass();
     }
 
diff --git a/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java
index da017092f1..dac331e117 100644
--- a/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java
@@ -56,7 +56,7 @@ public class SizeTieredCompactionStrategyTest
     public static void defineSchema() throws ConfigurationException
     {
         // Disable tombstone histogram rounding for tests
-        CassandraRelevantProperties.TOMBSTONE_HISTOGRAM_TTL_ROUND_SECONDS.setInt(1);
+        CassandraRelevantProperties.STREAMING_HISTOGRAM_ROUND_SECONDS.setInt(1);
 
         SchemaLoader.prepareServer();
 
diff --git a/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java b/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java
index 01bb60965c..7c7cdb61b8 100644
--- a/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java
@@ -61,7 +61,7 @@ public class TTLExpiryTest
     public static void defineSchema() throws ConfigurationException
     {
         // Disable tombstone histogram rounding for tests
-        CassandraRelevantProperties.TOMBSTONE_HISTOGRAM_TTL_ROUND_SECONDS.setInt(1);
+        CassandraRelevantProperties.STREAMING_HISTOGRAM_ROUND_SECONDS.setInt(1);
 
         SchemaLoader.prepareServer();
 
diff --git a/test/unit/org/apache/cassandra/db/compaction/TimeWindowCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/TimeWindowCompactionStrategyTest.java
index add3ec0e15..41a4c47578 100644
--- a/test/unit/org/apache/cassandra/db/compaction/TimeWindowCompactionStrategyTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/TimeWindowCompactionStrategyTest.java
@@ -44,6 +44,7 @@ import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.MockSchema;
 import org.apache.cassandra.utils.Pair;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.ALLOW_UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION;
 import static org.apache.cassandra.db.compaction.TimeWindowCompactionStrategy.getWindowBoundsInMillis;
 import static org.apache.cassandra.db.compaction.TimeWindowCompactionStrategy.newestBucket;
 import static org.apache.cassandra.db.compaction.TimeWindowCompactionStrategy.validateOptions;
@@ -65,8 +66,9 @@ public class TimeWindowCompactionStrategyTest extends SchemaLoader
     public static void defineSchema() throws ConfigurationException
     {
         // Disable tombstone histogram rounding for tests
-        CassandraRelevantProperties.TOMBSTONE_HISTOGRAM_TTL_ROUND_SECONDS.setInt(1);
-        System.setProperty(TimeWindowCompactionStrategyOptions.UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION_PROPERTY, "true");
+        CassandraRelevantProperties.STREAMING_HISTOGRAM_ROUND_SECONDS.setInt(1);
+        ALLOW_UNSAFE_AGGRESSIVE_SSTABLE_EXPIRATION.setBoolean(true);
+
 
         SchemaLoader.prepareServer();
 
diff --git a/test/unit/org/apache/cassandra/db/rows/RowsMergingTest.java b/test/unit/org/apache/cassandra/db/rows/RowsMergingTest.java
index 8049af37a8..01e335d8e9 100644
--- a/test/unit/org/apache/cassandra/db/rows/RowsMergingTest.java
+++ b/test/unit/org/apache/cassandra/db/rows/RowsMergingTest.java
@@ -26,12 +26,14 @@ import org.junit.Test;
 
 import com.google.common.base.Joiner;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.BTREE_BRANCH_SHIFT;
+
 public class RowsMergingTest extends CQLTester
 {
     @BeforeClass
     public static void setUpClass()
     {
-        System.setProperty("cassandra.btree.branchshift", "2");
+        BTREE_BRANCH_SHIFT.setInt(2);
         CQLTester.setUpClass();
     }
 
diff --git a/test/unit/org/apache/cassandra/db/transform/DuplicateRowCheckerTest.java b/test/unit/org/apache/cassandra/db/transform/DuplicateRowCheckerTest.java
index 671d36b035..e7f04b1e8e 100644
--- a/test/unit/org/apache/cassandra/db/transform/DuplicateRowCheckerTest.java
+++ b/test/unit/org/apache/cassandra/db/transform/DuplicateRowCheckerTest.java
@@ -38,6 +38,7 @@ import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.utils.DiagnosticSnapshotService;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.DIAGNOSTIC_SNAPSHOT_INTERVAL_NANOS;
 import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -59,7 +60,7 @@ public class DuplicateRowCheckerTest extends CQLTester
     public void setup() throws Throwable
     {
         DatabaseDescriptor.setSnapshotOnDuplicateRowDetection(true);
-        System.setProperty("cassandra.diagnostic_snapshot_interval_nanos", "0");
+        DIAGNOSTIC_SNAPSHOT_INTERVAL_NANOS.setLong(0);
         // Create a table and insert some data. The actual rows read in the test will be synthetic
         // but this creates an sstable on disk to be snapshotted.
         createTable("CREATE TABLE %s (pk text, ck1 int, ck2 int, v int, PRIMARY KEY (pk, ck1, ck2))");
diff --git a/test/unit/org/apache/cassandra/db/virtual/LogMessagesTableTest.java b/test/unit/org/apache/cassandra/db/virtual/LogMessagesTableTest.java
index 2225c4a1dc..f3655a4f40 100644
--- a/test/unit/org/apache/cassandra/db/virtual/LogMessagesTableTest.java
+++ b/test/unit/org/apache/cassandra/db/virtual/LogMessagesTableTest.java
@@ -125,19 +125,19 @@ public class LogMessagesTableTest extends CQLTester
     @Test
     public void testResolvingBufferSize()
     {
-        System.setProperty(LOGS_VIRTUAL_TABLE_MAX_ROWS.getKey(), "-1");
+        LOGS_VIRTUAL_TABLE_MAX_ROWS.setInt(-1);
         assertEquals(LogMessagesTable.LOGS_VIRTUAL_TABLE_DEFAULT_ROWS, LogMessagesTable.resolveBufferSize());
 
-        System.setProperty(LOGS_VIRTUAL_TABLE_MAX_ROWS.getKey(), "0");
+        LOGS_VIRTUAL_TABLE_MAX_ROWS.setInt(0);
         assertEquals(LogMessagesTable.LOGS_VIRTUAL_TABLE_DEFAULT_ROWS, LogMessagesTable.resolveBufferSize());
 
-        System.setProperty(LOGS_VIRTUAL_TABLE_MAX_ROWS.getKey(), "1000001");
+        LOGS_VIRTUAL_TABLE_MAX_ROWS.setInt(1000001);
         assertEquals(LogMessagesTable.LOGS_VIRTUAL_TABLE_DEFAULT_ROWS, LogMessagesTable.resolveBufferSize());
 
-        System.setProperty(LOGS_VIRTUAL_TABLE_MAX_ROWS.getKey(), "999");
+        LOGS_VIRTUAL_TABLE_MAX_ROWS.setInt(999);
         assertEquals(LogMessagesTable.LOGS_VIRTUAL_TABLE_DEFAULT_ROWS, LogMessagesTable.resolveBufferSize());
 
-        System.setProperty(LOGS_VIRTUAL_TABLE_MAX_ROWS.getKey(), "50001");
+        LOGS_VIRTUAL_TABLE_MAX_ROWS.setInt(50001);
         assertEquals(50001, LogMessagesTable.resolveBufferSize());
     }
 
diff --git a/test/unit/org/apache/cassandra/db/virtual/SystemPropertiesTableTest.java b/test/unit/org/apache/cassandra/db/virtual/SystemPropertiesTableTest.java
index 5242d552e6..c8ca9ba8fa 100644
--- a/test/unit/org/apache/cassandra/db/virtual/SystemPropertiesTableTest.java
+++ b/test/unit/org/apache/cassandra/db/virtual/SystemPropertiesTableTest.java
@@ -37,11 +37,13 @@ import org.apache.cassandra.cql3.CQLTester;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
 
+// checkstyle: suppress below 'blockSystemPropertyUsage'
+
 public class SystemPropertiesTableTest extends CQLTester
 {
     private static final String KS_NAME = "vts";
     private static final Map<String, String> ORIGINAL_ENV_MAP = System.getenv();
-    private static final String TEST_PROP = "org.apache.cassandra.db.virtual.SystemPropertiesTableTest";
+    private static final String TEST_PROP = "cassandra.SystemPropertiesTableTest";
 
     private SystemPropertiesTable table;
 
diff --git a/test/unit/org/apache/cassandra/gms/FailureDetectorTest.java b/test/unit/org/apache/cassandra/gms/FailureDetectorTest.java
index 77fabef914..8ec3dae913 100644
--- a/test/unit/org/apache/cassandra/gms/FailureDetectorTest.java
+++ b/test/unit/org/apache/cassandra/gms/FailureDetectorTest.java
@@ -37,6 +37,7 @@ import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.TokenMetadata;
 import org.apache.cassandra.service.StorageService;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.MAX_LOCAL_PAUSE_IN_MS;
 import static org.junit.Assert.assertFalse;
 
 public class FailureDetectorTest
@@ -45,7 +46,7 @@ public class FailureDetectorTest
     public static void setup()
     {
         // slow unit tests can cause problems with FailureDetector's GC pause handling
-        System.setProperty("cassandra.max_local_pause_in_ms", "20000");
+        MAX_LOCAL_PAUSE_IN_MS.setLong(20000);
 
         DatabaseDescriptor.daemonInitialization();
         CommitLog.instance.start();
diff --git a/test/unit/org/apache/cassandra/gms/GossiperTest.java b/test/unit/org/apache/cassandra/gms/GossiperTest.java
index 8921b13c07..461483643a 100644
--- a/test/unit/org/apache/cassandra/gms/GossiperTest.java
+++ b/test/unit/org/apache/cassandra/gms/GossiperTest.java
@@ -56,6 +56,7 @@ import org.assertj.core.api.Assertions;
 import org.quicktheories.core.Gen;
 import org.quicktheories.impl.Constraint;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.GOSSIP_DISABLE_THREAD_VALIDATION;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
@@ -67,7 +68,7 @@ public class GossiperTest
 {
     static
     {
-        System.setProperty(Gossiper.Props.DISABLE_THREAD_VALIDATION, "true");
+        GOSSIP_DISABLE_THREAD_VALIDATION.setBoolean(true);
         DatabaseDescriptor.daemonInitialization();
         CommitLog.instance.start();
     }
diff --git a/test/unit/org/apache/cassandra/gms/PendingRangeCalculatorServiceTest.java b/test/unit/org/apache/cassandra/gms/PendingRangeCalculatorServiceTest.java
index 0d6d1994aa..1f7587668e 100644
--- a/test/unit/org/apache/cassandra/gms/PendingRangeCalculatorServiceTest.java
+++ b/test/unit/org/apache/cassandra/gms/PendingRangeCalculatorServiceTest.java
@@ -39,6 +39,7 @@ import org.apache.cassandra.service.StorageService;
 import org.jboss.byteman.contrib.bmunit.BMRule;
 import org.jboss.byteman.contrib.bmunit.BMUnitRunner;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.GOSSIP_DISABLE_THREAD_VALIDATION;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 
@@ -54,7 +55,7 @@ public class PendingRangeCalculatorServiceTest
     @BeforeClass
     public static void setUp() throws ConfigurationException
     {
-        System.setProperty(Gossiper.Props.DISABLE_THREAD_VALIDATION, "true");
+        GOSSIP_DISABLE_THREAD_VALIDATION.setBoolean(true);
         SchemaLoader.prepareServer();
         StorageService.instance.initServer();
     }
diff --git a/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java b/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java
index 381edb8a7c..b948dd5bbf 100644
--- a/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java
+++ b/test/unit/org/apache/cassandra/gms/ShadowRoundTest.java
@@ -33,7 +33,6 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.SystemKeyspace;
@@ -49,6 +48,8 @@ import org.apache.cassandra.net.Verb;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.AUTO_BOOTSTRAP;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_CONFIG;
 import static org.apache.cassandra.net.MockMessagingService.verb;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -61,7 +62,7 @@ public class ShadowRoundTest
     @BeforeClass
     public static void setUp() throws ConfigurationException
     {
-        System.setProperty("cassandra.config", "cassandra-seeds.yaml");
+        CASSANDRA_CONFIG.setString("cassandra-seeds.yaml");
 
         DatabaseDescriptor.daemonInitialization();
         CommitLog.instance.start();
@@ -171,7 +172,7 @@ public class ShadowRoundTest
                 }, 1);
 
 
-        System.setProperty(Config.PROPERTY_PREFIX + "auto_bootstrap", "false");
+        AUTO_BOOTSTRAP.setBoolean(false);
         try
         {
             StorageService.instance.checkForEndpointCollision(SystemKeyspace.getOrInitializeLocalHostId(), SystemKeyspace.loadHostIds().keySet());
@@ -180,7 +181,10 @@ public class ShadowRoundTest
         {
             assertEquals("Unable to gossip with any peers", e.getMessage());
         }
-        System.clearProperty(Config.PROPERTY_PREFIX + "auto_bootstrap");
+        finally
+        {
+            AUTO_BOOTSTRAP.clearValue();
+        }
     }
 
     @Test
@@ -209,9 +213,15 @@ public class ShadowRoundTest
                 }, 1);
 
 
-        System.setProperty(Config.PROPERTY_PREFIX + "auto_bootstrap", "false");
-        StorageService.instance.checkForEndpointCollision(SystemKeyspace.getOrInitializeLocalHostId(), SystemKeyspace.loadHostIds().keySet());
-        System.clearProperty(Config.PROPERTY_PREFIX + "auto_bootstrap");
+        AUTO_BOOTSTRAP.setBoolean(false);
+        try
+        {
+            StorageService.instance.checkForEndpointCollision(SystemKeyspace.getOrInitializeLocalHostId(), SystemKeyspace.loadHostIds().keySet());
+        }
+        finally
+        {
+            AUTO_BOOTSTRAP.clearValue();
+        }
     }
 
 }
diff --git a/test/unit/org/apache/cassandra/hints/HintWriteTTLTest.java b/test/unit/org/apache/cassandra/hints/HintWriteTTLTest.java
index e24ff76e9a..f814245426 100644
--- a/test/unit/org/apache/cassandra/hints/HintWriteTTLTest.java
+++ b/test/unit/org/apache/cassandra/hints/HintWriteTTLTest.java
@@ -44,6 +44,8 @@ import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_MAX_HINT_TTL;
+
 public class HintWriteTTLTest
 {
     private static int TTL = 500;
@@ -84,7 +86,7 @@ public class HintWriteTTLTest
     @BeforeClass
     public static void setupClass() throws Exception
     {
-        System.setProperty("cassandra.maxHintTTL", Integer.toString(TTL));
+        CASSANDRA_MAX_HINT_TTL.setInt(TTL);
         SchemaLoader.prepareServer();
         TableMetadata tbm = CreateTableStatement.parse("CREATE TABLE tbl (k INT PRIMARY KEY, v INT)", "ks").gcGraceSeconds(GC_GRACE).build();
         SchemaLoader.createKeyspace("ks", KeyspaceParams.simple(1), tbm);
diff --git a/test/unit/org/apache/cassandra/index/sasi/SASIIndexTest.java b/test/unit/org/apache/cassandra/index/sasi/SASIIndexTest.java
index eefb1e3670..c97a367d37 100644
--- a/test/unit/org/apache/cassandra/index/sasi/SASIIndexTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/SASIIndexTest.java
@@ -134,6 +134,7 @@ import org.apache.cassandra.utils.Pair;
 import org.assertj.core.api.Assertions;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_CONFIG;
 import static org.apache.cassandra.db.ColumnFamilyStoreTest.getSnapshotManifestAndSchemaFileSizes;
 
 public class SASIIndexTest
@@ -141,7 +142,7 @@ public class SASIIndexTest
     private static final IPartitioner PARTITIONER;
 
     static {
-        System.setProperty("cassandra.config", "cassandra-murmur.yaml");
+        CASSANDRA_CONFIG.setString("cassandra-murmur.yaml");
         PARTITIONER = Murmur3Partitioner.instance;
     }
 
diff --git a/test/unit/org/apache/cassandra/index/sasi/disk/PerSSTableIndexWriterTest.java b/test/unit/org/apache/cassandra/index/sasi/disk/PerSSTableIndexWriterTest.java
index 2886db4fb7..6707aa592e 100644
--- a/test/unit/org/apache/cassandra/index/sasi/disk/PerSSTableIndexWriterTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/disk/PerSSTableIndexWriterTest.java
@@ -62,6 +62,8 @@ import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.Tables;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_CONFIG;
+
 public class PerSSTableIndexWriterTest extends SchemaLoader
 {
     private static final String KS_NAME = "sasi";
@@ -70,7 +72,7 @@ public class PerSSTableIndexWriterTest extends SchemaLoader
     @BeforeClass
     public static void loadSchema() throws ConfigurationException
     {
-        System.setProperty("cassandra.config", "cassandra-murmur.yaml");
+        CASSANDRA_CONFIG.setString("cassandra-murmur.yaml");
         SchemaLoader.loadSchema();
         SchemaTestUtil.announceNewKeyspace(KeyspaceMetadata.create(KS_NAME,
                                                                    KeyspaceParams.simpleTransient(1),
diff --git a/test/unit/org/apache/cassandra/index/sasi/plan/OperationTest.java b/test/unit/org/apache/cassandra/index/sasi/plan/OperationTest.java
index 8620f5c358..5ffebccc22 100644
--- a/test/unit/org/apache/cassandra/index/sasi/plan/OperationTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/plan/OperationTest.java
@@ -43,6 +43,8 @@ import org.apache.cassandra.utils.FBUtilities;
 
 import org.junit.*;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_CONFIG;
+
 public class OperationTest extends SchemaLoader
 {
     private static final String KS_NAME = "sasi";
@@ -57,7 +59,7 @@ public class OperationTest extends SchemaLoader
     @BeforeClass
     public static void loadSchema() throws ConfigurationException
     {
-        System.setProperty("cassandra.config", "cassandra-murmur.yaml");
+        CASSANDRA_CONFIG.setString("cassandra-murmur.yaml");
         SchemaLoader.loadSchema();
         SchemaLoader.createKeyspace(KS_NAME,
                                     KeyspaceParams.simpleTransient(1),
diff --git a/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java b/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java
index 6c534cd603..2cef163c7c 100644
--- a/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java
@@ -69,6 +69,7 @@ import org.apache.cassandra.utils.OutputHandler;
 import org.apache.cassandra.utils.TimeUUID;
 
 import static java.util.Collections.singleton;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_LEGACY_SSTABLE_ROOT;
 import static org.apache.cassandra.service.ActiveRepairService.NO_PENDING_REPAIR;
 import static org.apache.cassandra.service.ActiveRepairService.UNREPAIRED_SSTABLE;
 import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
@@ -83,8 +84,6 @@ public class LegacySSTableTest
 {
     private static final Logger logger = LoggerFactory.getLogger(LegacySSTableTest.class);
 
-    public static final String LEGACY_SSTABLE_PROP = "legacy-sstable-root";
-
     public static File LEGACY_SSTABLE_ROOT;
 
     /**
@@ -111,8 +110,8 @@ public class LegacySSTableTest
     @BeforeClass
     public static void defineSchema() throws ConfigurationException
     {
-        String scp = System.getProperty(LEGACY_SSTABLE_PROP);
-        Assert.assertNotNull("System property " + LEGACY_SSTABLE_PROP + " not set", scp);
+        String scp = TEST_LEGACY_SSTABLE_ROOT.getString();
+        Assert.assertNotNull("System property " + TEST_LEGACY_SSTABLE_ROOT.getKey() + " not set", scp);
 
         LEGACY_SSTABLE_ROOT = new File(scp).toAbsolute();
         Assert.assertTrue("System property " + LEGACY_SSTABLE_ROOT + " does not specify a directory", LEGACY_SSTABLE_ROOT.isDirectory());
diff --git a/test/unit/org/apache/cassandra/io/sstable/ScrubTest.java b/test/unit/org/apache/cassandra/io/sstable/ScrubTest.java
index ce3b2c2afa..bb024aaa5c 100644
--- a/test/unit/org/apache/cassandra/io/sstable/ScrubTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/ScrubTest.java
@@ -103,6 +103,8 @@ import static org.apache.cassandra.SchemaLoader.createKeyspace;
 import static org.apache.cassandra.SchemaLoader.getCompressionParameters;
 import static org.apache.cassandra.SchemaLoader.loadSchema;
 import static org.apache.cassandra.SchemaLoader.standardCFMD;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_INVALID_LEGACY_SSTABLE_ROOT;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -116,8 +118,6 @@ public class ScrubTest
 {
     private final static Logger logger = LoggerFactory.getLogger(ScrubTest.class);
 
-    public static final String INVALID_LEGACY_SSTABLE_ROOT_PROP = "invalid-legacy-sstable-root";
-
     public static final String CF = "Standard1";
     public static final String COUNTER_CF = "Counter1";
     public static final String CF_UUID = "UUIDKeys";
@@ -160,13 +160,13 @@ public class ScrubTest
         keyspace = Keyspace.open(ksName);
 
         CompactionManager.instance.disableAutoCompaction();
-        System.setProperty(org.apache.cassandra.tools.Util.ALLOW_TOOL_REINIT_FOR_TEST, "true"); // Necessary for testing
+        TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST.setBoolean(true);
     }
 
     @AfterClass
     public static void clearClassEnv()
     {
-        System.clearProperty(org.apache.cassandra.tools.Util.ALLOW_TOOL_REINIT_FOR_TEST);
+        TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST.clearValue();
     }
 
     @Test
@@ -860,7 +860,7 @@ public class ScrubTest
 
             ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("cf_with_duplicates_3_0");
 
-            Path legacySSTableRoot = Paths.get(System.getProperty(INVALID_LEGACY_SSTABLE_ROOT_PROP),
+            Path legacySSTableRoot = Paths.get(TEST_INVALID_LEGACY_SSTABLE_ROOT.getString(),
                                                "Keyspace1",
                                                "cf_with_duplicates_3_0");
 
diff --git a/test/unit/org/apache/cassandra/io/sstable/indexsummary/IndexSummaryTest.java b/test/unit/org/apache/cassandra/io/sstable/indexsummary/IndexSummaryTest.java
index faa14c416d..aea166aa3e 100644
--- a/test/unit/org/apache/cassandra/io/sstable/indexsummary/IndexSummaryTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/indexsummary/IndexSummaryTest.java
@@ -45,6 +45,7 @@ import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.Pair;
 
+import static org.apache.cassandra.config.CassandraRelevantEnv.CIRCLECI;
 import static org.apache.cassandra.io.sstable.Downsampling.BASE_SAMPLING_LEVEL;
 import static org.apache.cassandra.io.sstable.indexsummary.IndexSummaryBuilder.downsample;
 import static org.apache.cassandra.io.sstable.indexsummary.IndexSummaryBuilder.entriesAtSamplingLevel;
@@ -81,7 +82,7 @@ public class IndexSummaryTest
     public void testIndexSummaryKeySizes() throws IOException
     {
         // On Circle CI we normally don't have enough off-heap memory for this test so ignore it
-        Assume.assumeTrue(System.getenv("CIRCLECI") == null);
+        Assume.assumeTrue(CIRCLECI.getString() == null);
 
         testIndexSummaryProperties(32, 100);
         testIndexSummaryProperties(64, 100);
@@ -128,7 +129,7 @@ public class IndexSummaryTest
     public void testLargeIndexSummary() throws IOException
     {
         // On Circle CI we normally don't have enough off-heap memory for this test so ignore it
-        Assume.assumeTrue(System.getenv("CIRCLECI") == null);
+        Assume.assumeTrue(CIRCLECI.getString() == null);
 
         final int numKeys = 1000000;
         final int keySize = 3000;
@@ -162,7 +163,7 @@ public class IndexSummaryTest
     public void testLargeIndexSummaryWithExpectedSizeMatching() throws IOException
     {
         // On Circle CI we normally don't have enough off-heap memory for this test so ignore it
-        Assume.assumeTrue(System.getenv("CIRCLECI") == null);
+        Assume.assumeTrue(CIRCLECI.getString() == null);
 
         final int numKeys = 1000000;
         final int keySize = 3000;
diff --git a/test/unit/org/apache/cassandra/locator/AlibabaCloudSnitchTest.java b/test/unit/org/apache/cassandra/locator/AlibabaCloudSnitchTest.java
index 04540cfdc5..82108f29c6 100644
--- a/test/unit/org/apache/cassandra/locator/AlibabaCloudSnitchTest.java
+++ b/test/unit/org/apache/cassandra/locator/AlibabaCloudSnitchTest.java
@@ -36,6 +36,7 @@ import org.apache.cassandra.service.StorageService;
 
 import static org.apache.cassandra.ServerTestUtils.cleanup;
 import static org.apache.cassandra.ServerTestUtils.mkdirs;
+import static org.apache.cassandra.config.CassandraRelevantProperties.GOSSIP_DISABLE_THREAD_VALIDATION;
 import static org.junit.Assert.assertEquals;
 
 public class AlibabaCloudSnitchTest 
@@ -45,7 +46,7 @@ public class AlibabaCloudSnitchTest
     @BeforeClass
     public static void setup() throws Exception
     {
-        System.setProperty(Gossiper.Props.DISABLE_THREAD_VALIDATION, "true");
+        GOSSIP_DISABLE_THREAD_VALIDATION.setBoolean(true);
         DatabaseDescriptor.daemonInitialization();
         CommitLog.instance.start();
         CommitLog.instance.segmentManager.awaitManagementTasksCompletion();
diff --git a/test/unit/org/apache/cassandra/locator/CloudstackSnitchTest.java b/test/unit/org/apache/cassandra/locator/CloudstackSnitchTest.java
index 51e8371882..e167e99ce1 100644
--- a/test/unit/org/apache/cassandra/locator/CloudstackSnitchTest.java
+++ b/test/unit/org/apache/cassandra/locator/CloudstackSnitchTest.java
@@ -37,6 +37,7 @@ import org.apache.cassandra.service.StorageService;
 
 import static org.apache.cassandra.ServerTestUtils.cleanup;
 import static org.apache.cassandra.ServerTestUtils.mkdirs;
+import static org.apache.cassandra.config.CassandraRelevantProperties.GOSSIP_DISABLE_THREAD_VALIDATION;
 import static org.junit.Assert.assertEquals;
 
 public class CloudstackSnitchTest
@@ -46,7 +47,7 @@ public class CloudstackSnitchTest
     @BeforeClass
     public static void setup() throws Exception
     {
-        System.setProperty(Gossiper.Props.DISABLE_THREAD_VALIDATION, "true");
+        GOSSIP_DISABLE_THREAD_VALIDATION.setBoolean(true);
         DatabaseDescriptor.daemonInitialization();
         CommitLog.instance.start();
         CommitLog.instance.segmentManager.awaitManagementTasksCompletion();
diff --git a/test/unit/org/apache/cassandra/locator/EC2SnitchTest.java b/test/unit/org/apache/cassandra/locator/EC2SnitchTest.java
index 69c1287918..78c5d40dfc 100644
--- a/test/unit/org/apache/cassandra/locator/EC2SnitchTest.java
+++ b/test/unit/org/apache/cassandra/locator/EC2SnitchTest.java
@@ -42,6 +42,7 @@ import org.apache.cassandra.service.StorageService;
 
 import static org.apache.cassandra.ServerTestUtils.cleanup;
 import static org.apache.cassandra.ServerTestUtils.mkdirs;
+import static org.apache.cassandra.config.CassandraRelevantProperties.GOSSIP_DISABLE_THREAD_VALIDATION;
 import static org.apache.cassandra.locator.Ec2Snitch.EC2_NAMING_LEGACY;
 import static org.junit.Assert.assertEquals;
 
@@ -60,7 +61,7 @@ public class EC2SnitchTest
     @BeforeClass
     public static void setup() throws Exception
     {
-        System.setProperty(Gossiper.Props.DISABLE_THREAD_VALIDATION, "true");
+        GOSSIP_DISABLE_THREAD_VALIDATION.setBoolean(true);
         DatabaseDescriptor.daemonInitialization();
         CommitLog.instance.start();
         CommitLog.instance.segmentManager.awaitManagementTasksCompletion();
diff --git a/test/unit/org/apache/cassandra/locator/GoogleCloudSnitchTest.java b/test/unit/org/apache/cassandra/locator/GoogleCloudSnitchTest.java
index 67192bdfa5..1fdfd1cb62 100644
--- a/test/unit/org/apache/cassandra/locator/GoogleCloudSnitchTest.java
+++ b/test/unit/org/apache/cassandra/locator/GoogleCloudSnitchTest.java
@@ -38,6 +38,7 @@ import org.apache.cassandra.service.StorageService;
 
 import static org.apache.cassandra.ServerTestUtils.cleanup;
 import static org.apache.cassandra.ServerTestUtils.mkdirs;
+import static org.apache.cassandra.config.CassandraRelevantProperties.GOSSIP_DISABLE_THREAD_VALIDATION;
 import static org.junit.Assert.assertEquals;
 
 public class GoogleCloudSnitchTest
@@ -47,7 +48,7 @@ public class GoogleCloudSnitchTest
     @BeforeClass
     public static void setup() throws Exception
     {
-        System.setProperty(Gossiper.Props.DISABLE_THREAD_VALIDATION, "true");
+        GOSSIP_DISABLE_THREAD_VALIDATION.setBoolean(true);
         DatabaseDescriptor.daemonInitialization();
         CommitLog.instance.start();
         CommitLog.instance.segmentManager.awaitManagementTasksCompletion();
diff --git a/test/unit/org/apache/cassandra/locator/PropertyFileSnitchTest.java b/test/unit/org/apache/cassandra/locator/PropertyFileSnitchTest.java
index 23bcf1bd8a..af9e9704cf 100644
--- a/test/unit/org/apache/cassandra/locator/PropertyFileSnitchTest.java
+++ b/test/unit/org/apache/cassandra/locator/PropertyFileSnitchTest.java
@@ -49,6 +49,7 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.GOSSIP_DISABLE_THREAD_VALIDATION;
 import static org.junit.Assert.*;
 
 /**
@@ -71,7 +72,7 @@ public class PropertyFileSnitchTest
     @Before
     public void setup() throws ConfigurationException, IOException
     {
-        System.setProperty(Gossiper.Props.DISABLE_THREAD_VALIDATION, "true");
+        GOSSIP_DISABLE_THREAD_VALIDATION.setBoolean(true);
         String confFile = FBUtilities.resourceToFile(PropertyFileSnitch.SNITCH_PROPERTIES_FILENAME);
         effectiveFile = Paths.get(confFile);
         backupFile = Paths.get(confFile + ".bak");
diff --git a/test/unit/org/apache/cassandra/metrics/TrieMemtableMetricsTest.java b/test/unit/org/apache/cassandra/metrics/TrieMemtableMetricsTest.java
index b2018498ec..62d8f7c754 100644
--- a/test/unit/org/apache/cassandra/metrics/TrieMemtableMetricsTest.java
+++ b/test/unit/org/apache/cassandra/metrics/TrieMemtableMetricsTest.java
@@ -39,7 +39,6 @@ import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.OverrideConfigurationLoader;
 import org.apache.cassandra.db.ColumnFamilyStore;
-import org.apache.cassandra.db.memtable.AbstractShardedMemtable;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.service.EmbeddedCassandraService;
 import org.apache.cassandra.service.StorageService;
@@ -47,6 +46,7 @@ import org.jboss.byteman.contrib.bmunit.BMRule;
 import org.jboss.byteman.contrib.bmunit.BMRules;
 import org.jboss.byteman.contrib.bmunit.BMUnitRunner;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.MEMTABLE_SHARD_COUNT;
 import static org.hamcrest.Matchers.*;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
@@ -76,7 +76,7 @@ public class TrieMemtableMetricsTest extends SchemaLoader
         OverrideConfigurationLoader.override((config) -> {
             config.partitioner = "Murmur3Partitioner";
         });
-        System.setProperty(AbstractShardedMemtable.DEFAULT_SHARD_COUNT_PROPERTY, "" + NUM_SHARDS);
+        MEMTABLE_SHARD_COUNT.setInt(NUM_SHARDS);
 
         SchemaLoader.loadSchema();
 
diff --git a/test/unit/org/apache/cassandra/net/ConnectionTest.java b/test/unit/org/apache/cassandra/net/ConnectionTest.java
index ec447aad83..a0bd2a56e1 100644
--- a/test/unit/org/apache/cassandra/net/ConnectionTest.java
+++ b/test/unit/org/apache/cassandra/net/ConnectionTest.java
@@ -55,7 +55,6 @@ import io.netty.buffer.ByteBuf;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelOutboundHandlerAdapter;
 import io.netty.channel.ChannelPromise;
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.EncryptionOptions;
 import org.apache.cassandra.db.commitlog.CommitLog;
@@ -71,6 +70,7 @@ import org.apache.cassandra.utils.FBUtilities;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.MINUTES;
 import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SSL_STORAGE_PORT;
 import static org.apache.cassandra.net.MessagingService.VERSION_30;
 import static org.apache.cassandra.net.MessagingService.VERSION_3014;
 import static org.apache.cassandra.net.MessagingService.VERSION_40;
@@ -573,8 +573,7 @@ public class ConnectionTest
     @Test
     public void testPendingOutboundConnectionUpdatesMessageVersionOnReconnectAttempt() throws Throwable
     {
-        final String storagePortProperty = Config.PROPERTY_PREFIX + "ssl_storage_port";
-        final String originalStoragePort = System.getProperty(storagePortProperty);
+        final Integer originalStoragePort = SSL_STORAGE_PORT.setInt(7011);
         try
         {
             // Set up an inbound connection listening *only* on the SSL storage port to
@@ -586,7 +585,6 @@ public class ConnectionTest
             MessagingService.instance().versions.set(FBUtilities.getBroadcastAddressAndPort(),
                                                      MessagingService.VERSION_40);
 
-            System.setProperty(storagePortProperty, "7011");
             final InetAddressAndPort legacySSLAddrsAndPort = endpoint.withPort(DatabaseDescriptor.getSSLStoragePort());
             InboundConnectionSettings inboundSettings = settings.inbound.apply(new InboundConnectionSettings().withEncryption(encryptionOptions))
                                                                         .withBindAddress(legacySSLAddrsAndPort)
@@ -654,9 +652,9 @@ public class ConnectionTest
             MessagingService.instance().versions.set(FBUtilities.getBroadcastAddressAndPort(),
                                                      current_version);
             if (originalStoragePort != null)
-                System.setProperty(storagePortProperty, originalStoragePort);
+                SSL_STORAGE_PORT.setInt(originalStoragePort);
             else
-                System.clearProperty(storagePortProperty);
+                SSL_STORAGE_PORT.clearValue();
         }
     }
 
diff --git a/test/unit/org/apache/cassandra/net/MessageSerializationPropertyTest.java b/test/unit/org/apache/cassandra/net/MessageSerializationPropertyTest.java
index 5a73cbd22c..4391d241c2 100644
--- a/test/unit/org/apache/cassandra/net/MessageSerializationPropertyTest.java
+++ b/test/unit/org/apache/cassandra/net/MessageSerializationPropertyTest.java
@@ -40,6 +40,9 @@ import org.apache.cassandra.utils.FixedMonotonicClock;
 import org.assertj.core.api.Assertions;
 import org.mockito.Mockito;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CLOCK_MONOTONIC_APPROX;
+import static org.apache.cassandra.config.CassandraRelevantProperties.CLOCK_MONOTONIC_PRECISE;
+import static org.apache.cassandra.config.CassandraRelevantProperties.ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION;
 import static org.apache.cassandra.net.Message.serializer;
 import static org.apache.cassandra.utils.CassandraGenerators.MESSAGE_GEN;
 import static org.apache.cassandra.utils.FailingConsumer.orFail;
@@ -50,10 +53,10 @@ public class MessageSerializationPropertyTest implements Serializable
     @BeforeClass
     public static void beforeClass()
     {
-        System.setProperty("org.apache.cassandra.disable_mbean_registration", "true");
+        ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION.setBoolean(true);
         // message serialization uses the MonotonicClock class for precise and approx timestamps, so mock it out
-        System.setProperty("cassandra.monotonic_clock.precise", FixedMonotonicClock.class.getName());
-        System.setProperty("cassandra.monotonic_clock.approx", FixedMonotonicClock.class.getName());
+        CLOCK_MONOTONIC_PRECISE.setString(FixedMonotonicClock.class.getName());
+        CLOCK_MONOTONIC_APPROX.setString(FixedMonotonicClock.class.getName());
 
         DatabaseDescriptor.daemonInitialization();
     }
diff --git a/test/unit/org/apache/cassandra/schema/RemoveWithoutDroppingTest.java b/test/unit/org/apache/cassandra/schema/RemoveWithoutDroppingTest.java
index fb9a3e13cf..683e52f40f 100644
--- a/test/unit/org/apache/cassandra/schema/RemoveWithoutDroppingTest.java
+++ b/test/unit/org/apache/cassandra/schema/RemoveWithoutDroppingTest.java
@@ -35,6 +35,7 @@ import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.SchemaTransformation.SchemaTransformationResult;
 import org.mockito.Mockito;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.SCHEMA_UPDATE_HANDLER_FACTORY_CLASS;
 import static org.apache.cassandra.cql3.QueryProcessor.executeInternal;
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -49,7 +50,7 @@ public class RemoveWithoutDroppingTest
     {
         ServerTestUtils.daemonInitialization();
 
-        System.setProperty(SchemaUpdateHandlerFactoryProvider.SUH_FACTORY_CLASS_PROPERTY, TestSchemaUpdateHandlerFactory.class.getName());
+        SCHEMA_UPDATE_HANDLER_FACTORY_CLASS.setString(TestSchemaUpdateHandlerFactory.class.getName());
         CQLTester.prepareServer();
         Schema.instance.registerListener(listener);
     }
diff --git a/test/unit/org/apache/cassandra/security/CustomSslContextFactoryConfigTest.java b/test/unit/org/apache/cassandra/security/CustomSslContextFactoryConfigTest.java
index c1ab4a4a52..f7c391a402 100644
--- a/test/unit/org/apache/cassandra/security/CustomSslContextFactoryConfigTest.java
+++ b/test/unit/org/apache/cassandra/security/CustomSslContextFactoryConfigTest.java
@@ -27,17 +27,19 @@ import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.exceptions.ConfigurationException;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_CONFIG;
+
 public class CustomSslContextFactoryConfigTest
 {
     @BeforeClass
     public static void setupDatabaseDescriptor()
     {
-        System.setProperty("cassandra.config", "cassandra-sslcontextfactory.yaml");
+        CASSANDRA_CONFIG.setString("cassandra-sslcontextfactory.yaml");
     }
 
     @AfterClass
     public static void tearDownDatabaseDescriptor() {
-        System.clearProperty("cassandra.config");
+        CASSANDRA_CONFIG.clearValue();
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/security/CustomSslContextFactoryInvalidConfigTest.java b/test/unit/org/apache/cassandra/security/CustomSslContextFactoryInvalidConfigTest.java
index 79e7d52536..4e99e40fd1 100644
--- a/test/unit/org/apache/cassandra/security/CustomSslContextFactoryInvalidConfigTest.java
+++ b/test/unit/org/apache/cassandra/security/CustomSslContextFactoryInvalidConfigTest.java
@@ -25,17 +25,19 @@ import org.junit.Test;
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_CONFIG;
+
 public class CustomSslContextFactoryInvalidConfigTest
 {
     @BeforeClass
     public static void setupDatabaseDescriptor()
     {
-        System.setProperty("cassandra.config", "cassandra-sslcontextfactory-invalidconfiguration.yaml");
+        CASSANDRA_CONFIG.setString("cassandra-sslcontextfactory-invalidconfiguration.yaml");
     }
 
     @AfterClass
     public static void tearDownDatabaseDescriptor() {
-        System.clearProperty("cassandra.config");
+        CASSANDRA_CONFIG.clearValue();
     }
 
     @Test(expected = IllegalArgumentException.class)
diff --git a/test/unit/org/apache/cassandra/security/DefaultSslContextFactoryTest.java b/test/unit/org/apache/cassandra/security/DefaultSslContextFactoryTest.java
index 90eab980e4..d6bd258942 100644
--- a/test/unit/org/apache/cassandra/security/DefaultSslContextFactoryTest.java
+++ b/test/unit/org/apache/cassandra/security/DefaultSslContextFactoryTest.java
@@ -34,6 +34,8 @@ import io.netty.handler.ssl.SslContext;
 import io.netty.handler.ssl.SslProvider;
 import org.apache.cassandra.config.EncryptionOptions;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.DISABLE_TCACTIVE_OPENSSL;
+
 public class DefaultSslContextFactoryTest
 {
     private Map<String,Object> commonConfig = new HashMap<>();
@@ -218,12 +220,12 @@ public class DefaultSslContextFactoryTest
     public void testDisableOpenSslForInJvmDtests() {
         // The configuration name below is hard-coded intentionally to make sure we don't break the contract without
         // changing the documentation appropriately
-        System.setProperty("cassandra.disable_tcactive_openssl","true");
+        DISABLE_TCACTIVE_OPENSSL.setBoolean(true);
         Map<String,Object> config = new HashMap<>();
         config.putAll(commonConfig);
 
         DefaultSslContextFactory defaultSslContextFactoryImpl = new DefaultSslContextFactory(config);
         Assert.assertEquals(SslProvider.JDK, defaultSslContextFactoryImpl.getSslProvider());
-        System.clearProperty("cassandra.disable_tcactive_openssl");
+        DISABLE_TCACTIVE_OPENSSL.clearValue();
     }
 }
diff --git a/test/unit/org/apache/cassandra/security/FileBasedSslContextFactoryTest.java b/test/unit/org/apache/cassandra/security/FileBasedSslContextFactoryTest.java
index 74811e66b2..5641a17b0a 100644
--- a/test/unit/org/apache/cassandra/security/FileBasedSslContextFactoryTest.java
+++ b/test/unit/org/apache/cassandra/security/FileBasedSslContextFactoryTest.java
@@ -33,6 +33,8 @@ import org.slf4j.LoggerFactory;
 import org.apache.cassandra.config.EncryptionOptions;
 import org.apache.cassandra.config.ParameterizedClass;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_CONFIG;
+
 public class FileBasedSslContextFactoryTest
 {
     private static final Logger logger = LoggerFactory.getLogger(FileBasedSslContextFactoryTest.class);
@@ -42,13 +44,13 @@ public class FileBasedSslContextFactoryTest
     @BeforeClass
     public static void setupDatabaseDescriptor()
     {
-        System.setProperty("cassandra.config", "cassandra.yaml");
+        CASSANDRA_CONFIG.reset();
     }
 
     @AfterClass
     public static void tearDownDatabaseDescriptor()
     {
-        System.clearProperty("cassandra.config");
+        CASSANDRA_CONFIG.clearValue();
     }
 
     @Before
diff --git a/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigTest.java b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigTest.java
index ab6b00a982..206908dfc6 100644
--- a/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigTest.java
+++ b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigTest.java
@@ -28,18 +28,20 @@ import org.junit.Test;
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_CONFIG;
+
 public class PEMBasedSslContextFactoryConfigTest
 {
     @BeforeClass
     public static void setupDatabaseDescriptor()
     {
-        System.setProperty("cassandra.config", "cassandra-pem-sslcontextfactory.yaml");
+        CASSANDRA_CONFIG.setString("cassandra-pem-sslcontextfactory.yaml");
     }
 
     @AfterClass
     public static void tearDownDatabaseDescriptor()
     {
-        System.clearProperty("cassandra.config");
+        CASSANDRA_CONFIG.clearValue();
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigWithMismatchingPasswordsTest.java b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigWithMismatchingPasswordsTest.java
index c1e2dbe217..7eadba5a35 100644
--- a/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigWithMismatchingPasswordsTest.java
+++ b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigWithMismatchingPasswordsTest.java
@@ -29,18 +29,20 @@ import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.exceptions.ConfigurationException;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_CONFIG;
+
 public class PEMBasedSslContextFactoryConfigWithMismatchingPasswordsTest
 {
     @BeforeClass
     public static void setupDatabaseDescriptor()
     {
-        System.setProperty("cassandra.config", "cassandra-pem-sslcontextfactory-mismatching-passwords.yaml");
+        CASSANDRA_CONFIG.setString("cassandra-pem-sslcontextfactory-mismatching-passwords.yaml");
     }
 
     @AfterClass
     public static void tearDownDatabaseDescriptor()
     {
-        System.clearProperty("cassandra.config");
+        CASSANDRA_CONFIG.clearValue();
     }
 
     @Test(expected = ConfigurationException.class)
diff --git a/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigWithUnencryptedKeysTest.java b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigWithUnencryptedKeysTest.java
index 066de8fea5..2d816ca51b 100644
--- a/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigWithUnencryptedKeysTest.java
+++ b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigWithUnencryptedKeysTest.java
@@ -28,19 +28,23 @@ import org.junit.Test;
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_CONFIG;
+import static org.apache.cassandra.config.CassandraRelevantProperties.DISABLE_TCACTIVE_OPENSSL;
+
 public class PEMBasedSslContextFactoryConfigWithUnencryptedKeysTest
 {
     @BeforeClass
     public static void setupDatabaseDescriptor()
     {
-        System.setProperty("cassandra.config", "cassandra-pem-sslcontextfactory-unencryptedkeys.yaml");
-        System.setProperty("cassandra.disable_tcactive_openssl", "true");
+        CASSANDRA_CONFIG.setString("cassandra-pem-sslcontextfactory-unencryptedkeys.yaml");
+        DISABLE_TCACTIVE_OPENSSL.setBoolean(true);
     }
 
     @AfterClass
     public static void tearDownDatabaseDescriptor()
     {
-        System.clearProperty("cassandra.config");
+        CASSANDRA_CONFIG.clearValue();
+        DISABLE_TCACTIVE_OPENSSL.clearValue();
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryInvalidConfigTest.java b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryInvalidConfigTest.java
index 2281137a92..cd3040b35c 100644
--- a/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryInvalidConfigTest.java
+++ b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryInvalidConfigTest.java
@@ -29,18 +29,20 @@ import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.exceptions.ConfigurationException;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_CONFIG;
+
 public class PEMBasedSslContextFactoryInvalidConfigTest
 {
     @BeforeClass
     public static void setupDatabaseDescriptor()
     {
-        System.setProperty("cassandra.config", "cassandra-pem-sslcontextfactory-invalidconfiguration.yaml");
+        CASSANDRA_CONFIG.setString("cassandra-pem-sslcontextfactory-invalidconfiguration.yaml");
     }
 
     @AfterClass
     public static void tearDownDatabaseDescriptor()
     {
-        System.clearProperty("cassandra.config");
+        CASSANDRA_CONFIG.clearValue();
     }
 
     @Test(expected = ConfigurationException.class)
diff --git a/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryTest.java b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryTest.java
index f919a1994e..a0be3918d6 100644
--- a/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryTest.java
+++ b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryTest.java
@@ -36,6 +36,7 @@ import io.netty.handler.ssl.SslProvider;
 import org.apache.cassandra.config.EncryptionOptions;
 import org.apache.cassandra.config.ParameterizedClass;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.DISABLE_TCACTIVE_OPENSSL;
 import static org.apache.cassandra.security.PEMBasedSslContextFactory.ConfigKey.ENCODED_CERTIFICATES;
 import static org.apache.cassandra.security.PEMBasedSslContextFactory.ConfigKey.ENCODED_KEY;
 import static org.apache.cassandra.security.PEMBasedSslContextFactory.ConfigKey.KEY_PASSWORD;
@@ -413,13 +414,13 @@ public class PEMBasedSslContextFactoryTest
     {
         // The configuration name below is hard-coded intentionally to make sure we don't break the contract without
         // changing the documentation appropriately
-        System.setProperty("cassandra.disable_tcactive_openssl", "true");
+        DISABLE_TCACTIVE_OPENSSL.setBoolean(true);
         Map<String, Object> config = new HashMap<>();
         config.putAll(commonConfig);
 
         PEMBasedSslContextFactory sslContextFactory = new PEMBasedSslContextFactory(config);
         Assert.assertEquals(SslProvider.JDK, sslContextFactory.getSslProvider());
-        System.clearProperty("cassandra.disable_tcactive_openssl");
+        DISABLE_TCACTIVE_OPENSSL.clearValue();
     }
 
     @Test(expected = IllegalArgumentException.class)
diff --git a/test/unit/org/apache/cassandra/security/PEMJKSSslContextFactoryConfigTest.java b/test/unit/org/apache/cassandra/security/PEMJKSSslContextFactoryConfigTest.java
index 8efd3e4dee..834fe44b77 100644
--- a/test/unit/org/apache/cassandra/security/PEMJKSSslContextFactoryConfigTest.java
+++ b/test/unit/org/apache/cassandra/security/PEMJKSSslContextFactoryConfigTest.java
@@ -28,17 +28,19 @@ import org.junit.Test;
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_CONFIG;
+
 public class PEMJKSSslContextFactoryConfigTest
 {
     @BeforeClass
     public static void setupDatabaseDescriptor()
     {
-        System.setProperty("cassandra.config", "cassandra-pem-jks-sslcontextfactory.yaml");
+        CASSANDRA_CONFIG.setString("cassandra-pem-jks-sslcontextfactory.yaml");
     }
 
     @AfterClass
     public static void tearDownDatabaseDescriptor() {
-        System.clearProperty("cassandra.config");
+        CASSANDRA_CONFIG.clearValue();
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/service/AbstractFilesystemOwnershipCheckTest.java b/test/unit/org/apache/cassandra/service/AbstractFilesystemOwnershipCheckTest.java
index 0fc8559985..607dbd0b61 100644
--- a/test/unit/org/apache/cassandra/service/AbstractFilesystemOwnershipCheckTest.java
+++ b/test/unit/org/apache/cassandra/service/AbstractFilesystemOwnershipCheckTest.java
@@ -205,14 +205,14 @@ public abstract class AbstractFilesystemOwnershipCheckTest
     {
         // no exceptions thrown from the supplier because the check is skipped
         options.enable(check_filesystem_ownership);
-        System.setProperty(CassandraRelevantProperties.FILE_SYSTEM_CHECK_ENABLE.getKey(), "false");
+        CassandraRelevantProperties.FILE_SYSTEM_CHECK_ENABLE.setBoolean(false);
         AbstractFilesystemOwnershipCheckTest.checker(() -> { throw new RuntimeException("FAIL"); }).execute(options);
     }
 
     @Test
     public void checkEnabledButClusterPropertyIsEmpty()
     {
-        System.setProperty(CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN.getKey(), "");
+        CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN.setString("");
         AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(tempDir), options, MISSING_PROPERTY, CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN.getKey());
     }
 
@@ -220,7 +220,7 @@ public abstract class AbstractFilesystemOwnershipCheckTest
     public void checkEnabledButClusterPropertyIsUnset()
     {
         Assume.assumeFalse(options.getConfig(check_filesystem_ownership).containsKey("ownership_token"));
-        System.clearProperty(CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN.getKey());
+        CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN.clearValue();
         AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(tempDir), options, MISSING_PROPERTY, CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN.getKey());
     }
 
@@ -356,7 +356,7 @@ public abstract class AbstractFilesystemOwnershipCheckTest
         File leafDir = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "cassandra/data");
         writeFile(leafDir.parent(), "other_file", AbstractFilesystemOwnershipCheckTest.makeProperties(1, 1, token));
         AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(leafDir), options, NO_OWNERSHIP_FILE, quote(leafDir.absolutePath()));
-        System.setProperty(CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_FILENAME.getKey(), "other_file");
+        CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_FILENAME.setString("other_file");
         AbstractFilesystemOwnershipCheckTest.checker(leafDir).execute(options);
     }
 
diff --git a/test/unit/org/apache/cassandra/service/ClientStateTest.java b/test/unit/org/apache/cassandra/service/ClientStateTest.java
index 56d0893356..6e8cfd799c 100644
--- a/test/unit/org/apache/cassandra/service/ClientStateTest.java
+++ b/test/unit/org/apache/cassandra/service/ClientStateTest.java
@@ -40,6 +40,7 @@ import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.schema.TableMetadata;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
@@ -48,7 +49,7 @@ public class ClientStateTest
     @BeforeClass
     public static void beforeClass()
     {
-        System.setProperty("org.apache.cassandra.disable_mbean_registration", "true");
+        ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION.setBoolean(true);
         SchemaLoader.prepareServer();
         DatabaseDescriptor.setAuthFromRoot(true);
         // create the system_auth keyspace so the IRoleManager can function as normal
@@ -62,7 +63,7 @@ public class ClientStateTest
     @AfterClass
     public static void afterClass()
     {
-        System.clearProperty("org.apache.cassandra.disable_mbean_registration");
+        ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION.clearValue();
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/service/StartupChecksTest.java b/test/unit/org/apache/cassandra/service/StartupChecksTest.java
index 77c72530c4..6502e7d68d 100644
--- a/test/unit/org/apache/cassandra/service/StartupChecksTest.java
+++ b/test/unit/org/apache/cassandra/service/StartupChecksTest.java
@@ -37,6 +37,7 @@ import org.apache.cassandra.service.DataResurrectionCheck.Heartbeat;
 import org.apache.cassandra.utils.Clock;
 
 import static java.util.Collections.singletonList;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_INVALID_LEGACY_SSTABLE_ROOT;
 import static org.apache.cassandra.io.util.FileUtils.createTempFile;
 import static org.apache.cassandra.service.DataResurrectionCheck.HEARTBEAT_FILE_CONFIG_PROPERTY;
 import static org.apache.cassandra.service.StartupChecks.StartupCheckType.check_data_resurrection;
@@ -46,7 +47,6 @@ import static org.junit.Assert.fail;
 
 public class StartupChecksTest
 {
-    public static final String INVALID_LEGACY_SSTABLE_ROOT_PROP = "invalid-legacy-sstable-root";
     StartupChecks startupChecks;
     Path sstableDir;
     static File heartbeatFile;
@@ -168,9 +168,9 @@ public class StartupChecksTest
     private void copyLegacyNonSSTableFiles(Path targetDir) throws IOException
     {
 
-        Path legacySSTableRoot = Paths.get(System.getProperty(INVALID_LEGACY_SSTABLE_ROOT_PROP),
-                                          "Keyspace1",
-                                          "Standard1");
+        Path legacySSTableRoot = Paths.get(TEST_INVALID_LEGACY_SSTABLE_ROOT.getString(),
+                                           "Keyspace1",
+                                           "Standard1");
         for (String filename : new String[]{"Keyspace1-Standard1-ic-0-TOC.txt",
                                             "Keyspace1-Standard1-ic-0-Digest.sha1",
                                             "legacyleveled.json"})
@@ -206,9 +206,9 @@ public class StartupChecksTest
 
     private void copyInvalidLegacySSTables(Path targetDir) throws IOException
     {
-        File legacySSTableRoot = new File(Paths.get(System.getProperty(INVALID_LEGACY_SSTABLE_ROOT_PROP),
-                                           "Keyspace1",
-                                           "Standard1"));
+        File legacySSTableRoot = new File(Paths.get(TEST_INVALID_LEGACY_SSTABLE_ROOT.getString(),
+                                                    "Keyspace1",
+                                                    "Standard1"));
         for (File f : legacySSTableRoot.tryList())
             Files.copy(f.toPath(), targetDir.resolve(f.name()));
 
diff --git a/test/unit/org/apache/cassandra/service/StorageServiceServerM3PTest.java b/test/unit/org/apache/cassandra/service/StorageServiceServerM3PTest.java
index bb78c83e86..8c4ab9b869 100644
--- a/test/unit/org/apache/cassandra/service/StorageServiceServerM3PTest.java
+++ b/test/unit/org/apache/cassandra/service/StorageServiceServerM3PTest.java
@@ -26,13 +26,13 @@ import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.commitlog.CommitLog;
 import org.apache.cassandra.exceptions.ConfigurationException;
-import org.apache.cassandra.gms.Gossiper;
 import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.locator.IEndpointSnitch;
 import org.apache.cassandra.locator.PropertyFileSnitch;
 
 import static org.apache.cassandra.ServerTestUtils.cleanup;
 import static org.apache.cassandra.ServerTestUtils.mkdirs;
+import static org.apache.cassandra.config.CassandraRelevantProperties.GOSSIP_DISABLE_THREAD_VALIDATION;
 import static org.junit.Assert.assertTrue;
 
 public class StorageServiceServerM3PTest
@@ -40,7 +40,7 @@ public class StorageServiceServerM3PTest
     @BeforeClass
     public static void setUp() throws ConfigurationException
     {
-        System.setProperty(Gossiper.Props.DISABLE_THREAD_VALIDATION, "true");
+        GOSSIP_DISABLE_THREAD_VALIDATION.setBoolean(true);
         DatabaseDescriptor.daemonInitialization();
         CommitLog.instance.start();
         IEndpointSnitch snitch = new PropertyFileSnitch();
diff --git a/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java b/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java
index 119b8104d4..39f3216303 100644
--- a/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java
+++ b/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java
@@ -55,6 +55,8 @@ import org.assertj.core.api.Assertions;
 
 import static org.apache.cassandra.ServerTestUtils.cleanup;
 import static org.apache.cassandra.ServerTestUtils.mkdirs;
+import static org.apache.cassandra.config.CassandraRelevantProperties.GOSSIP_DISABLE_THREAD_VALIDATION;
+import static org.apache.cassandra.config.CassandraRelevantProperties.REPLACE_ADDRESS;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -63,7 +65,7 @@ public class StorageServiceServerTest
     @BeforeClass
     public static void setUp() throws ConfigurationException
     {
-        System.setProperty(Gossiper.Props.DISABLE_THREAD_VALIDATION, "true");
+        GOSSIP_DISABLE_THREAD_VALIDATION.setBoolean(true);
         DatabaseDescriptor.daemonInitialization();
         CommitLog.instance.start();
         IEndpointSnitch snitch = new PropertyFileSnitch();
@@ -643,20 +645,20 @@ public class StorageServiceServerTest
             Gossiper.instance.initializeNodeUnsafe(FBUtilities.getBroadcastAddressAndPort(), localHostId, 1);
 
             // Check detects replacing the same host address with the same hostid
-            System.setProperty("cassandra.replace_address", hostAddress);
+            REPLACE_ADDRESS.setString(hostAddress);
             Assert.assertTrue(StorageService.instance.isReplacingSameHostAddressAndHostId(localHostId));
 
             // Check detects replacing the same host address with a different host id
-            System.setProperty("cassandra.replace_address", hostAddress);
+            REPLACE_ADDRESS.setString(hostAddress);
             Assert.assertFalse(StorageService.instance.isReplacingSameHostAddressAndHostId(differentHostId));
 
             // Check tolerates the DNS entry going away for the replace_address
-            System.setProperty("cassandra.replace_address", "unresolvable.host.local.");
+            REPLACE_ADDRESS.setString("unresolvable.host.local.");
             Assert.assertFalse(StorageService.instance.isReplacingSameHostAddressAndHostId(differentHostId));
         }
         finally
         {
-            System.clearProperty("cassandra.replace_address");
+            REPLACE_ADDRESS.clearValue();
         }
     }
 }
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/service/SystemPropertiesBasedFileSystemOwnershipCheckTest.java b/test/unit/org/apache/cassandra/service/SystemPropertiesBasedFileSystemOwnershipCheckTest.java
index cb54f813c0..5101fc9d54 100644
--- a/test/unit/org/apache/cassandra/service/SystemPropertiesBasedFileSystemOwnershipCheckTest.java
+++ b/test/unit/org/apache/cassandra/service/SystemPropertiesBasedFileSystemOwnershipCheckTest.java
@@ -28,7 +28,7 @@ public class SystemPropertiesBasedFileSystemOwnershipCheckTest extends AbstractF
     public void setup()
     {
         super.setup();
-        System.setProperty(CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN.getKey(), token);
-        System.setProperty(CassandraRelevantProperties.FILE_SYSTEM_CHECK_ENABLE.getKey(), "true");
+        CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN.setString(token);
+        CassandraRelevantProperties.FILE_SYSTEM_CHECK_ENABLE.setBoolean(true);
     }
 }
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/service/paxos/PaxosRepairHistoryTest.java b/test/unit/org/apache/cassandra/service/paxos/PaxosRepairHistoryTest.java
index 387ec653ce..bcd97143d1 100644
--- a/test/unit/org/apache/cassandra/service/paxos/PaxosRepairHistoryTest.java
+++ b/test/unit/org/apache/cassandra/service/paxos/PaxosRepairHistoryTest.java
@@ -48,6 +48,7 @@ import org.apache.cassandra.dht.Token;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.PARTITIONER;
 import static org.apache.cassandra.dht.Range.deoverlap;
 import static org.apache.cassandra.service.paxos.Ballot.Flag.NONE;
 import static org.apache.cassandra.service.paxos.Ballot.none;
@@ -62,7 +63,7 @@ public class PaxosRepairHistoryTest
     private static final AtomicInteger tableNum = new AtomicInteger();
     static
     {
-        System.setProperty("cassandra.partitioner", Murmur3Partitioner.class.getName());
+        PARTITIONER.setString(Murmur3Partitioner.class.getName());
         DatabaseDescriptor.daemonInitialization();
         assert DatabaseDescriptor.getPartitioner() instanceof Murmur3Partitioner;
     }
diff --git a/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosStateTrackerTest.java b/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosStateTrackerTest.java
index ee0878cef9..2e8668db87 100644
--- a/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosStateTrackerTest.java
+++ b/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosStateTrackerTest.java
@@ -42,6 +42,7 @@ import org.apache.cassandra.db.rows.Row;
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.distributed.shared.WithProperties;
 import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.schema.ColumnMetadata;
@@ -52,6 +53,7 @@ import org.apache.cassandra.service.paxos.Commit;
 import org.apache.cassandra.service.paxos.PaxosRepairHistory;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.FORCE_PAXOS_STATE_REBUILD;
 import static org.apache.cassandra.service.paxos.uncommitted.PaxosStateTracker.stateDirectory;
 import static org.apache.cassandra.service.paxos.uncommitted.PaxosUncommittedTests.*;
 import static org.apache.cassandra.service.paxos.uncommitted.UncommittedTableDataTest.assertIteratorContents;
@@ -94,38 +96,6 @@ public class PaxosStateTrackerTest
         directories = new File[]{directory1, directory2};
     }
 
-    private static class SystemProp implements AutoCloseable
-    {
-        private final String prop;
-        private final String prev;
-
-        public SystemProp(String prop, String prev)
-        {
-            this.prop = prop;
-            this.prev = prev;
-        }
-
-        public void close()
-        {
-            if (prev == null)
-                System.clearProperty(prop);
-            else
-                System.setProperty(prop, prev);
-        }
-
-        public static SystemProp set(String prop, String val)
-        {
-            String prev = System.getProperty(prop);
-            System.setProperty(prop, val);
-            return new SystemProp(prop, prev);
-        }
-
-        public static SystemProp set(String prop, boolean val)
-        {
-            return set(prop, Boolean.toString(val));
-        }
-    }
-
     private static PartitionUpdate update(TableMetadata cfm, int k, Ballot ballot)
     {
         ColumnMetadata col = cfm.getColumn(new ColumnIdentifier("v", false));
@@ -206,7 +176,7 @@ public class PaxosStateTrackerTest
         SystemKeyspace.savePaxosWritePromise(dk(0), cfm1, ballots[2]);
         SystemKeyspace.savePaxosProposal(commit(cfm1, 2, ballots[3]));
 
-        try (SystemProp forceRebuild = SystemProp.set(PaxosStateTracker.FORCE_REBUILD_PROP, true))
+        try (WithProperties with = new WithProperties().set(FORCE_PAXOS_STATE_REBUILD, true))
         {
             PaxosStateTracker tracker = PaxosStateTracker.create(directories);
             Assert.assertTrue(tracker.isRebuildNeeded());
diff --git a/test/unit/org/apache/cassandra/service/reads/range/RangeCommandsTest.java b/test/unit/org/apache/cassandra/service/reads/range/RangeCommandsTest.java
index 259a65f195..2b15ebe5cf 100644
--- a/test/unit/org/apache/cassandra/service/reads/range/RangeCommandsTest.java
+++ b/test/unit/org/apache/cassandra/service/reads/range/RangeCommandsTest.java
@@ -38,6 +38,7 @@ import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.index.StubIndex;
 import org.apache.cassandra.schema.IndexMetadata;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.MAX_CONCURRENT_RANGE_REQUESTS;
 import static org.apache.cassandra.db.ConsistencyLevel.ONE;
 import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
@@ -52,13 +53,13 @@ public class RangeCommandsTest extends CQLTester
     @BeforeClass
     public static void defineSchema() throws ConfigurationException
     {
-        System.setProperty("cassandra.max_concurrent_range_requests", String.valueOf(MAX_CONCURRENCY_FACTOR));
+        MAX_CONCURRENT_RANGE_REQUESTS.setInt(MAX_CONCURRENCY_FACTOR);
     }
 
     @AfterClass
     public static void cleanup()
     {
-        System.clearProperty("cassandra.max_concurrent_range_requests");
+        MAX_CONCURRENT_RANGE_REQUESTS.clearValue();
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/tools/OfflineToolUtils.java b/test/unit/org/apache/cassandra/tools/OfflineToolUtils.java
index 355e48a28c..9a5ae8e8b8 100644
--- a/test/unit/org/apache/cassandra/tools/OfflineToolUtils.java
+++ b/test/unit/org/apache/cassandra/tools/OfflineToolUtils.java
@@ -34,6 +34,7 @@ import java.util.stream.StreamSupport;
 
 import com.google.common.collect.Iterables;
 
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.io.util.File;
 import org.apache.commons.io.FileUtils;
@@ -195,7 +196,7 @@ public abstract class OfflineToolUtils
     @BeforeClass
     public static void setupTester()
     {
-        System.setProperty("cassandra.partitioner", "org.apache.cassandra.dht.Murmur3Partitioner");
+        CassandraRelevantProperties.PARTITIONER.setString("org.apache.cassandra.dht.Murmur3Partitioner");
 
         // may start an async appender
         LoggerFactory.getLogger(OfflineToolUtils.class);
diff --git a/test/unit/org/apache/cassandra/tools/StandaloneSplitterTest.java b/test/unit/org/apache/cassandra/tools/StandaloneSplitterTest.java
index d28558fb63..05e7b34c97 100644
--- a/test/unit/org/apache/cassandra/tools/StandaloneSplitterTest.java
+++ b/test/unit/org/apache/cassandra/tools/StandaloneSplitterTest.java
@@ -25,6 +25,7 @@ import org.apache.commons.lang3.tuple.Pair;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.tools.ToolRunner.ToolResult;
 import org.assertj.core.api.Assertions;
 import org.hamcrest.CoreMatchers;
@@ -42,7 +43,7 @@ public class StandaloneSplitterTest extends OfflineToolUtils
         // the legacy tables use a different partitioner :(
         // (Don't use ByteOrderedPartitioner.class.getName() as that would initialize the class and work
         // against the goal of this test to check classes and threads initialized by the tool.)
-        System.setProperty("cassandra.partitioner", "org.apache.cassandra.dht.ByteOrderedPartitioner");
+        CassandraRelevantProperties.PARTITIONER.setString("org.apache.cassandra.dht.ByteOrderedPartitioner");
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/tools/StandaloneSplitterWithCQLTesterTest.java b/test/unit/org/apache/cassandra/tools/StandaloneSplitterWithCQLTesterTest.java
index 944b8dece7..40f075aa2d 100644
--- a/test/unit/org/apache/cassandra/tools/StandaloneSplitterWithCQLTesterTest.java
+++ b/test/unit/org/apache/cassandra/tools/StandaloneSplitterWithCQLTesterTest.java
@@ -35,6 +35,7 @@ import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.tools.ToolRunner.ToolResult;
 import org.assertj.core.api.Assertions;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -124,6 +125,6 @@ public class StandaloneSplitterWithCQLTesterTest extends CQLTester
         assertTrue("Generated sstable must be at least 1MiB", (new File(sstableFileName)).length() > 1024*1024);
         sstablesDir = new File(sstableFileName).parent();
         origSstables = Arrays.asList(sstablesDir.tryList());
-        System.setProperty(Util.ALLOW_TOOL_REINIT_FOR_TEST, "true"); // Necessary for testing
+        TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST.setBoolean(true);
     }
 }
diff --git a/test/unit/org/apache/cassandra/tools/StandaloneUpgraderOnSStablesTest.java b/test/unit/org/apache/cassandra/tools/StandaloneUpgraderOnSStablesTest.java
index 180e0239be..709b404d2b 100644
--- a/test/unit/org/apache/cassandra/tools/StandaloneUpgraderOnSStablesTest.java
+++ b/test/unit/org/apache/cassandra/tools/StandaloneUpgraderOnSStablesTest.java
@@ -37,6 +37,7 @@ import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.tools.ToolRunner.ToolResult;
 import org.assertj.core.api.Assertions;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST;
 import static org.junit.Assert.assertEquals;
 
 /*
@@ -53,13 +54,13 @@ public class StandaloneUpgraderOnSStablesTest
     public static void defineSchema() throws ConfigurationException
     {
         LegacySSTableTest.defineSchema();
-        System.setProperty(Util.ALLOW_TOOL_REINIT_FOR_TEST, "true"); // Necessary for testing
+        TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST.setBoolean(true);
     }
 
     @AfterClass
     public static void clearClassEnv()
     {
-        System.clearProperty(Util.ALLOW_TOOL_REINIT_FOR_TEST);
+        TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST.clearValue();
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/tools/StandaloneVerifierOnSSTablesTest.java b/test/unit/org/apache/cassandra/tools/StandaloneVerifierOnSSTablesTest.java
index 8512abf76c..009f450fc4 100644
--- a/test/unit/org/apache/cassandra/tools/StandaloneVerifierOnSSTablesTest.java
+++ b/test/unit/org/apache/cassandra/tools/StandaloneVerifierOnSSTablesTest.java
@@ -29,6 +29,7 @@ import org.junit.Test;
 
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.UpdateBuilder;
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.PartitionPosition;
@@ -44,6 +45,7 @@ import org.apache.cassandra.utils.ByteBufferUtil;
 import org.assertj.core.api.Assertions;
 
 import static org.apache.cassandra.SchemaLoader.standardCFMD;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST;
 import static org.junit.Assert.assertEquals;
 
 /**
@@ -64,8 +66,8 @@ public class StandaloneVerifierOnSSTablesTest extends OfflineToolUtils
     {
         // since legacy tables test data uses ByteOrderedPartitioner that's what we need
         // for the check version to work
-        System.setProperty("cassandra.partitioner", "org.apache.cassandra.dht.ByteOrderedPartitioner");
-        System.setProperty(Util.ALLOW_TOOL_REINIT_FOR_TEST, "true"); // Necessary for testing`
+        CassandraRelevantProperties.PARTITIONER.setString("org.apache.cassandra.dht.ByteOrderedPartitioner");
+        TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST.setBoolean(true);
         SchemaLoader.loadSchema();
         StorageService.instance.initServer();
     }
@@ -74,7 +76,7 @@ public class StandaloneVerifierOnSSTablesTest extends OfflineToolUtils
     public static void teardown() throws Exception
     {
         SchemaLoader.cleanupAndLeaveDirs();
-        System.clearProperty(Util.ALLOW_TOOL_REINIT_FOR_TEST);
+        TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST.clearValue();
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/ClientStatsTest.java b/test/unit/org/apache/cassandra/tools/nodetool/ClientStatsTest.java
index 5975f66b03..d39fc63694 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/ClientStatsTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/ClientStatsTest.java
@@ -42,6 +42,7 @@ import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.tools.ToolRunner;
 import org.assertj.core.groups.Tuple;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_JMX_LOCAL_PORT;
 import static org.assertj.core.api.Assertions.assertThat;
 
 public class ClientStatsTest
@@ -56,7 +57,7 @@ public class ClientStatsTest
     {
         // Since we run EmbeddedCassandraServer, we need to manually associate JMX address; otherwise it won't start
         int jmxPort = CQLTester.getAutomaticallyAllocatedPort(InetAddress.getLoopbackAddress());
-        System.setProperty("cassandra.jmx.local.port", String.valueOf(jmxPort));
+        CASSANDRA_JMX_LOCAL_PORT.setInt(jmxPort);
 
         cassandra = ServerTestUtils.startEmbeddedCassandraService();
         cluster = Cluster.builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/ScrubToolTest.java b/test/unit/org/apache/cassandra/tools/nodetool/ScrubToolTest.java
index 7c69839d5f..a007ce711c 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/ScrubToolTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/ScrubToolTest.java
@@ -49,6 +49,7 @@ import static org.apache.cassandra.SchemaLoader.createKeyspace;
 import static org.apache.cassandra.SchemaLoader.getCompressionParameters;
 import static org.apache.cassandra.SchemaLoader.loadSchema;
 import static org.apache.cassandra.SchemaLoader.standardCFMD;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST;
 import static org.apache.cassandra.io.sstable.ScrubTest.CF_INDEX1;
 import static org.apache.cassandra.io.sstable.ScrubTest.CF_INDEX1_BYTEORDERED;
 import static org.apache.cassandra.io.sstable.ScrubTest.CF_INDEX2;
@@ -92,7 +93,7 @@ public class ScrubToolTest
         keyspace = Keyspace.open(ksName);
 
         CompactionManager.instance.disableAutoCompaction();
-        System.setProperty(org.apache.cassandra.tools.Util.ALLOW_TOOL_REINIT_FOR_TEST, "true"); // Necessary for testing
+        TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST.setBoolean(true);
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/transport/CQLUserAuditTest.java b/test/unit/org/apache/cassandra/transport/CQLUserAuditTest.java
index 120de2a336..8bc9f28dd2 100644
--- a/test/unit/org/apache/cassandra/transport/CQLUserAuditTest.java
+++ b/test/unit/org/apache/cassandra/transport/CQLUserAuditTest.java
@@ -49,6 +49,7 @@ import org.apache.cassandra.diag.DiagnosticEventService;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.service.EmbeddedCassandraService;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.SUPERUSER_SETUP_DELAY_MS;
 import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQueue;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -70,7 +71,7 @@ public class CQLUserAuditTest
             config.audit_logging_options.logger = new ParameterizedClass("DiagnosticEventAuditLogger", null);
         });
 
-        System.setProperty("cassandra.superuser_setup_delay_ms", "0");
+        SUPERUSER_SETUP_DELAY_MS.setLong(0);
 
         embedded = ServerTestUtils.startEmbeddedCassandraService();
 
diff --git a/test/unit/org/apache/cassandra/utils/Generators.java b/test/unit/org/apache/cassandra/utils/Generators.java
index e25f9c0fe3..1baa16e32c 100644
--- a/test/unit/org/apache/cassandra/utils/Generators.java
+++ b/test/unit/org/apache/cassandra/utils/Generators.java
@@ -39,6 +39,8 @@ import org.quicktheories.core.RandomnessSource;
 import org.quicktheories.generators.SourceDSL;
 import org.quicktheories.impl.Constraint;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_BLOB_SHARED_SEED;
+
 public final class Generators
 {
     private static final Logger logger = LoggerFactory.getLogger(Generators.class);
@@ -379,7 +381,7 @@ public final class Generators
 
         static
         {
-            long blobSeed = Long.parseLong(System.getProperty("cassandra.test.blob.shared.seed", Long.toString(System.currentTimeMillis())));
+            long blobSeed = TEST_BLOB_SHARED_SEED.getLong(System.currentTimeMillis());
             logger.info("Shared blob Gen used seed {}", blobSeed);
 
             Random random = new Random(blobSeed);
diff --git a/test/unit/org/apache/cassandra/utils/btree/BTreeRemovalTest.java b/test/unit/org/apache/cassandra/utils/btree/BTreeRemovalTest.java
index 76e7098d86..e764b3f9a1 100644
--- a/test/unit/org/apache/cassandra/utils/btree/BTreeRemovalTest.java
+++ b/test/unit/org/apache/cassandra/utils/btree/BTreeRemovalTest.java
@@ -17,6 +17,7 @@
  */
 package org.apache.cassandra.utils.btree;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.BTREE_BRANCH_SHIFT;
 import static org.apache.cassandra.utils.btree.BTreeRemoval.remove;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
@@ -37,7 +38,7 @@ public class BTreeRemovalTest
 {
     static
     {
-        System.setProperty("cassandra.btree.branchshift", "3");
+        BTREE_BRANCH_SHIFT.setInt(3);
     }
 
     private static final Comparator<Integer> CMP = new Comparator<Integer>()
diff --git a/test/unit/org/apache/cassandra/utils/btree/BTreeTest.java b/test/unit/org/apache/cassandra/utils/btree/BTreeTest.java
index eba2adc921..004dfe073d 100644
--- a/test/unit/org/apache/cassandra/utils/btree/BTreeTest.java
+++ b/test/unit/org/apache/cassandra/utils/btree/BTreeTest.java
@@ -25,6 +25,7 @@ import org.junit.Test;
 
 import org.junit.Assert;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.BTREE_BRANCH_SHIFT;
 import static org.junit.Assert.*;
 
 public class BTreeTest
@@ -32,7 +33,7 @@ public class BTreeTest
     static Integer[] ints = new Integer[20];
     static
     {
-        System.setProperty("cassandra.btree.branchshift", "2");
+        BTREE_BRANCH_SHIFT.setInt(2);
         for (int i = 0 ; i < ints.length ; i++)
             ints[i] = Integer.valueOf(i);
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org